@@ -551,9 +551,9 @@ static void* dasm_labels[zend_lb_MAX];
551
551
|| }
552
552
|.endmacro
553
553
554
- |.macro SSE_OP, sse_ins, reg, addr
554
+ |.macro SSE_OP, sse_ins, reg, addr, tmp_reg
555
555
|| if (Z_MODE(addr) == IS_CONST_ZVAL) {
556
- | MEM_OP2_2 sse_ins, xmm(reg-ZREG_XMM0), qword, Z_ZV(addr), r0
556
+ | MEM_OP2_2 sse_ins, xmm(reg-ZREG_XMM0), qword, Z_ZV(addr), tmp_reg
557
557
|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) {
558
558
| sse_ins xmm(reg-ZREG_XMM0), qword [Ra(Z_REG(addr))+Z_OFFSET(addr)]
559
559
|| } else if (Z_MODE(addr) == IS_REG) {
@@ -658,19 +658,19 @@ static void* dasm_labels[zend_lb_MAX];
658
658
|| }
659
659
|.endmacro
660
660
661
- |.macro SSE_MATH, opcode, reg, addr
661
+ |.macro SSE_MATH, opcode, reg, addr, tmp_reg
662
662
|| switch (opcode) {
663
663
|| case ZEND_ADD:
664
- | SSE_OP addsd, reg, addr
664
+ | SSE_OP addsd, reg, addr, tmp_reg
665
665
|| break;
666
666
|| case ZEND_SUB:
667
- | SSE_OP subsd, reg, addr
667
+ | SSE_OP subsd, reg, addr, tmp_reg
668
668
|| break;
669
669
|| case ZEND_MUL:
670
- | SSE_OP mulsd, reg, addr
670
+ | SSE_OP mulsd, reg, addr, tmp_reg
671
671
|| break;
672
672
|| case ZEND_DIV:
673
- | SSE_OP divsd, reg, addr
673
+ | SSE_OP divsd, reg, addr, tmp_reg
674
674
|| break;
675
675
|| }
676
676
|.endmacro
@@ -703,9 +703,9 @@ static void* dasm_labels[zend_lb_MAX];
703
703
|| }
704
704
|.endmacro
705
705
706
- |.macro AVX_OP, avx_ins, reg, op1_reg, addr
706
+ |.macro AVX_OP, avx_ins, reg, op1_reg, addr, tmp_reg
707
707
|| if (Z_MODE(addr) == IS_CONST_ZVAL) {
708
- | MEM_OP3_3 avx_ins, xmm(reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), qword, Z_ZV(addr), r0
708
+ | MEM_OP3_3 avx_ins, xmm(reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), qword, Z_ZV(addr), tmp_reg
709
709
|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) {
710
710
| avx_ins xmm(reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), qword [Ra(Z_REG(addr))+Z_OFFSET(addr)]
711
711
|| } else if (Z_MODE(addr) == IS_REG) {
@@ -715,19 +715,19 @@ static void* dasm_labels[zend_lb_MAX];
715
715
|| }
716
716
|.endmacro
717
717
718
- |.macro AVX_MATH, opcode, reg, op1_reg, addr
718
+ |.macro AVX_MATH, opcode, reg, op1_reg, addr, tmp_reg
719
719
|| switch (opcode) {
720
720
|| case ZEND_ADD:
721
- | AVX_OP vaddsd, reg, op1_reg, addr
721
+ | AVX_OP vaddsd, reg, op1_reg, addr, tmp_reg
722
722
|| break;
723
723
|| case ZEND_SUB:
724
- | AVX_OP vsubsd, reg, op1_reg, addr
724
+ | AVX_OP vsubsd, reg, op1_reg, addr, tmp_reg
725
725
|| break;
726
726
|| case ZEND_MUL:
727
- | AVX_OP vmulsd, reg, op1_reg, addr
727
+ | AVX_OP vmulsd, reg, op1_reg, addr, tmp_reg
728
728
|| break;
729
729
|| case ZEND_DIV:
730
- | AVX_OP vdivsd, reg, op1_reg, addr
730
+ | AVX_OP vdivsd, reg, op1_reg, addr, tmp_reg
731
731
|| break;
732
732
|| }
733
733
|.endmacro
@@ -4323,10 +4323,20 @@ static int zend_jit_math_long_double(dasm_State **Dst,
4323
4323
(Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0;
4324
4324
4325
4325
| SSE_GET_ZVAL_LVAL result_reg, op1_addr
4326
- if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4327
- | AVX_MATH opcode, result_reg, result_reg, op2_addr
4326
+
4327
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4328
+ /* ASSIGN_DIM_OP */
4329
+ if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4330
+ | AVX_MATH opcode, result_reg, result_reg, op2_addr, r1
4331
+ } else {
4332
+ | SSE_MATH opcode, result_reg, op2_addr, r1
4333
+ }
4328
4334
} else {
4329
- | SSE_MATH opcode, result_reg, op2_addr
4335
+ if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4336
+ | AVX_MATH opcode, result_reg, result_reg, op2_addr, r0
4337
+ } else {
4338
+ | SSE_MATH opcode, result_reg, op2_addr, r0
4339
+ }
4330
4340
}
4331
4341
| SSE_SET_ZVAL_DVAL res_addr, result_reg
4332
4342
@@ -4356,10 +4366,19 @@ static int zend_jit_math_double_long(dasm_State **Dst,
4356
4366
result_reg = ZREG_XMM0;
4357
4367
}
4358
4368
| SSE_GET_ZVAL_LVAL result_reg, op2_addr
4359
- if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4360
- | AVX_MATH opcode, result_reg, result_reg, op1_addr
4369
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4370
+ /* ASSIGN_DIM_OP */
4371
+ if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4372
+ | AVX_MATH opcode, result_reg, result_reg, op1_addr, r1
4373
+ } else {
4374
+ | SSE_MATH opcode, result_reg, op1_addr, r1
4375
+ }
4361
4376
} else {
4362
- | SSE_MATH opcode, result_reg, op1_addr
4377
+ if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4378
+ | AVX_MATH opcode, result_reg, result_reg, op1_addr, r0
4379
+ } else {
4380
+ | SSE_MATH opcode, result_reg, op1_addr, r0
4381
+ }
4363
4382
}
4364
4383
} else {
4365
4384
zend_reg tmp_reg;
@@ -4454,8 +4473,11 @@ static int zend_jit_math_double_double(dasm_State **Dst,
4454
4473
if ((opcode == ZEND_MUL) &&
4455
4474
Z_MODE(val_addr) == IS_CONST_ZVAL && Z_DVAL_P(Z_ZV(val_addr)) == 2.0) {
4456
4475
| AVX_MATH_REG ZEND_ADD, result_reg, op1_reg, op1_reg
4476
+ } else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4477
+ /* ASSIGN_DIM_OP */
4478
+ | AVX_MATH opcode, result_reg, op1_reg, val_addr, r1
4457
4479
} else {
4458
- | AVX_MATH opcode, result_reg, op1_reg, val_addr
4480
+ | AVX_MATH opcode, result_reg, op1_reg, val_addr, r0
4459
4481
}
4460
4482
} else {
4461
4483
zend_jit_addr val_addr;
@@ -4472,8 +4494,11 @@ static int zend_jit_math_double_double(dasm_State **Dst,
4472
4494
} else if ((opcode == ZEND_MUL) &&
4473
4495
Z_MODE(val_addr) == IS_CONST_ZVAL && Z_DVAL_P(Z_ZV(val_addr)) == 2.0) {
4474
4496
| SSE_MATH_REG ZEND_ADD, result_reg, result_reg
4497
+ } else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4498
+ /* ASSIGN_DIM_OP */
4499
+ | SSE_MATH opcode, result_reg, val_addr, r1
4475
4500
} else {
4476
- | SSE_MATH opcode, result_reg, val_addr
4501
+ | SSE_MATH opcode, result_reg, val_addr, r0
4477
4502
}
4478
4503
}
4479
4504
| SSE_SET_ZVAL_DVAL res_addr, result_reg
0 commit comments