@@ -599,7 +599,7 @@ static void* dasm_labels[zend_lb_MAX];
599
599
|| }
600
600
|.endmacro
601
601
602
- |.macro SSE_GET_LONG, reg, lval
602
+ |.macro SSE_GET_LONG, reg, lval, tmp_reg
603
603
|| if (lval == 0) {
604
604
|| if (CAN_USE_AVX()) {
605
605
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
@@ -609,26 +609,26 @@ static void* dasm_labels[zend_lb_MAX];
609
609
|| } else {
610
610
|.if X64
611
611
|| if (!IS_SIGNED_32BIT(lval)) {
612
- | mov64 r0 , lval
612
+ | mov64 Ra(tmp_reg) , lval
613
613
|| } else {
614
- | mov r0 , lval
614
+ | mov Ra(tmp_reg) , lval
615
615
|| }
616
616
|.else
617
- | mov r0 , lval
617
+ | mov Ra(tmp_reg) , lval
618
618
|.endif
619
619
|| if (CAN_USE_AVX()) {
620
620
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
621
- | vcvtsi2sd, xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), r0
621
+ | vcvtsi2sd, xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), Ra(tmp_reg)
622
622
|| } else {
623
623
| xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
624
- | cvtsi2sd, xmm(reg-ZREG_XMM0), r0
624
+ | cvtsi2sd, xmm(reg-ZREG_XMM0), Ra(tmp_reg)
625
625
|| }
626
626
|| }
627
627
|.endmacro
628
628
629
- |.macro SSE_GET_ZVAL_LVAL, reg, addr
629
+ |.macro SSE_GET_ZVAL_LVAL, reg, addr, tmp_reg
630
630
|| if (Z_MODE(addr) == IS_CONST_ZVAL) {
631
- | SSE_GET_LONG reg, Z_LVAL_P(Z_ZV(addr))
631
+ | SSE_GET_LONG reg, Z_LVAL_P(Z_ZV(addr)), tmp_reg
632
632
|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) {
633
633
|| if (CAN_USE_AVX()) {
634
634
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
@@ -934,7 +934,7 @@ static void* dasm_labels[zend_lb_MAX];
934
934
| SSE_SET_ZVAL_DVAL dst_addr, dst_reg
935
935
|| } else if (Z_TYPE_P(zv) == IS_LONG && dst_def_info == MAY_BE_DOUBLE) {
936
936
|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ? Z_REG(dst_addr) : ZREG_XMM0;
937
- | SSE_GET_LONG dst_reg, Z_LVAL_P(zv)
937
+ | SSE_GET_LONG dst_reg, Z_LVAL_P(zv), ZREG_R0
938
938
| SSE_SET_ZVAL_DVAL dst_addr, dst_reg
939
939
|| } else if (Z_LVAL_P(zv) == 0 && Z_MODE(dst_addr) == IS_REG) {
940
940
| xor Ra(Z_REG(dst_addr)), Ra(Z_REG(dst_addr))
@@ -989,13 +989,13 @@ static void* dasm_labels[zend_lb_MAX];
989
989
| SSE_SET_ZVAL_DVAL res_addr, ZREG_XMM0
990
990
|| } else if (Z_TYPE_P(zv) == IS_LONG && dst_def_info == MAY_BE_DOUBLE) {
991
991
|| if (Z_MODE(dst_addr) == IS_REG) {
992
- | SSE_GET_LONG Z_REG(dst_addr), Z_LVAL_P(zv)
992
+ | SSE_GET_LONG Z_REG(dst_addr), Z_LVAL_P(zv), ZREG_R0
993
993
| SSE_SET_ZVAL_DVAL res_addr, Z_REG(dst_addr)
994
994
|| } else if (Z_MODE(res_addr) == IS_REG) {
995
- | SSE_GET_LONG Z_REG(res_addr), Z_LVAL_P(zv)
995
+ | SSE_GET_LONG Z_REG(res_addr), Z_LVAL_P(zv), ZREG_R0
996
996
| SSE_SET_ZVAL_DVAL dst_addr, Z_REG(res_addr)
997
997
|| } else {
998
- | SSE_GET_LONG ZREG_XMM0, Z_LVAL_P(zv)
998
+ | SSE_GET_LONG ZREG_XMM0, Z_LVAL_P(zv), ZREG_R0
999
999
| SSE_SET_ZVAL_DVAL dst_addr, ZREG_XMM0
1000
1000
| SSE_SET_ZVAL_DVAL res_addr, ZREG_XMM0
1001
1001
|| }
@@ -4208,6 +4208,7 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4208
4208
{
4209
4209
zend_bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
4210
4210
zend_reg result_reg;
4211
+ zend_reg tmp_reg = ZREG_R0;
4211
4212
4212
4213
if (Z_MODE(res_addr) == IS_REG && (res_info & MAY_BE_LONG)) {
4213
4214
if (may_overflow && (res_info & MAY_BE_GUARD)
@@ -4224,6 +4225,7 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4224
4225
} else {
4225
4226
/* ASSIGN_DIM_OP */
4226
4227
result_reg = ZREG_FCARG1a;
4228
+ tmp_reg = ZREG_FCARG1a;
4227
4229
}
4228
4230
4229
4231
if (opcode == ZEND_MUL &&
@@ -4346,8 +4348,8 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4346
4348
}
4347
4349
}
4348
4350
4349
- | SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr
4350
- | SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr
4351
+ | SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr, tmp_reg
4352
+ | SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr, tmp_reg
4351
4353
if (CAN_USE_AVX()) {
4352
4354
| AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2
4353
4355
} else {
@@ -4379,8 +4381,16 @@ static int zend_jit_math_long_double(dasm_State **Dst,
4379
4381
{
4380
4382
zend_reg result_reg =
4381
4383
(Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0;
4384
+ zend_reg tmp_reg;
4385
+
4386
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4387
+ /* ASSIGN_DIM_OP */
4388
+ tmp_reg = ZREG_R1;
4389
+ } else {
4390
+ tmp_reg = ZREG_R0;
4391
+ }
4382
4392
4383
- | SSE_GET_ZVAL_LVAL result_reg, op1_addr
4393
+ | SSE_GET_ZVAL_LVAL result_reg, op1_addr, tmp_reg
4384
4394
4385
4395
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4386
4396
/* ASSIGN_DIM_OP */
@@ -4414,7 +4424,7 @@ static int zend_jit_math_double_long(dasm_State **Dst,
4414
4424
zend_jit_addr res_addr,
4415
4425
uint32_t res_use_info)
4416
4426
{
4417
- zend_reg result_reg;
4427
+ zend_reg result_reg, tmp_reg ;
4418
4428
4419
4429
if (zend_is_commutative(opcode)
4420
4430
&& (Z_MODE(res_addr) != IS_REG || Z_MODE(op1_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_addr))) {
@@ -4423,7 +4433,13 @@ static int zend_jit_math_double_long(dasm_State **Dst,
4423
4433
} else {
4424
4434
result_reg = ZREG_XMM0;
4425
4435
}
4426
- | SSE_GET_ZVAL_LVAL result_reg, op2_addr
4436
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4437
+ /* ASSIGN_DIM_OP */
4438
+ tmp_reg = ZREG_R1;
4439
+ } else {
4440
+ tmp_reg = ZREG_R0;
4441
+ }
4442
+ | SSE_GET_ZVAL_LVAL result_reg, op2_addr, tmp_reg
4427
4443
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4428
4444
/* ASSIGN_DIM_OP */
4429
4445
if (CAN_USE_AVX()) {
@@ -4465,7 +4481,7 @@ static int zend_jit_math_double_long(dasm_State **Dst,
4465
4481
&& Z_LVAL_P(Z_ZV(op2_addr)) == 0) {
4466
4482
/* +/- 0 */
4467
4483
} else {
4468
- | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
4484
+ | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr, ZREG_R0
4469
4485
| AVX_MATH_REG opcode, result_reg, op1_reg, tmp_reg
4470
4486
}
4471
4487
} else {
@@ -4475,7 +4491,7 @@ static int zend_jit_math_double_long(dasm_State **Dst,
4475
4491
&& Z_LVAL_P(Z_ZV(op2_addr)) == 0) {
4476
4492
/* +/- 0 */
4477
4493
} else {
4478
- | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
4494
+ | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr, ZREG_R0
4479
4495
| SSE_MATH_REG opcode, result_reg, tmp_reg
4480
4496
}
4481
4497
}
@@ -7354,7 +7370,7 @@ static int zend_jit_cmp_long_double(dasm_State **Dst, const zend_op *opline, zen
7354
7370
{
7355
7371
zend_reg tmp_reg = ZREG_XMM0;
7356
7372
7357
- | SSE_GET_ZVAL_LVAL tmp_reg, op1_addr
7373
+ | SSE_GET_ZVAL_LVAL tmp_reg, op1_addr, ZREG_R0
7358
7374
| SSE_AVX_OP ucomisd, vucomisd, tmp_reg, op2_addr
7359
7375
7360
7376
return zend_jit_cmp_double_common(Dst, opline, res_addr, 0, smart_branch_opcode, target_label, target_label2, exit_addr);
@@ -7364,7 +7380,7 @@ static int zend_jit_cmp_double_long(dasm_State **Dst, const zend_op *opline, zen
7364
7380
{
7365
7381
zend_reg tmp_reg = ZREG_XMM0;
7366
7382
7367
- | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
7383
+ | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr, ZREG_R0
7368
7384
| SSE_AVX_OP ucomisd, vucomisd, tmp_reg, op1_addr
7369
7385
7370
7386
return zend_jit_cmp_double_common(Dst, opline, res_addr, /* swap */ 1, smart_branch_opcode, target_label, target_label2, exit_addr);
0 commit comments