@@ -763,17 +763,12 @@ static size_t tsrm_tls_offset;
763
763
|| }
764
764
|.endmacro
765
765
766
- |.macro LONG_OP, long_ins, reg, addr
766
+ |.macro LONG_OP, long_ins, reg, addr, tmp_reg
767
767
|| if (Z_MODE(addr) == IS_CONST_ZVAL) {
768
768
| .if X64
769
769
|| if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(addr)))) {
770
- || if (reg != ZREG_R0) {
771
- | mov64 r0, Z_LVAL_P(Z_ZV(addr))
772
- | long_ins Ra(reg), r0
773
- || } else {
774
- | mov64 r1, Z_LVAL_P(Z_ZV(addr))
775
- | long_ins Ra(reg), r1
776
- || }
770
+ | mov64 tmp_reg, Z_LVAL_P(Z_ZV(addr))
771
+ | long_ins Ra(reg), tmp_reg
777
772
|| } else {
778
773
| long_ins Ra(reg), Z_LVAL_P(Z_ZV(addr))
779
774
|| }
@@ -853,25 +848,25 @@ static size_t tsrm_tls_offset;
853
848
|| }
854
849
|.endmacro
855
850
856
- |.macro LONG_MATH, opcode, reg, addr
851
+ |.macro LONG_MATH, opcode, reg, addr, tmp_reg
857
852
|| switch (opcode) {
858
853
|| case ZEND_ADD:
859
- | LONG_OP add, reg, addr
854
+ | LONG_OP add, reg, addr, Ra(tmp_reg)
860
855
|| break;
861
856
|| case ZEND_SUB:
862
- | LONG_OP sub, reg, addr
857
+ | LONG_OP sub, reg, addr, Ra(tmp_reg)
863
858
|| break;
864
859
|| case ZEND_MUL:
865
- | LONG_OP imul, reg, addr
860
+ | LONG_OP imul, reg, addr, Ra(tmp_reg)
866
861
|| break;
867
862
|| case ZEND_BW_OR:
868
- | LONG_OP or, reg, addr
863
+ | LONG_OP or, reg, addr, Ra(tmp_reg)
869
864
|| break;
870
865
|| case ZEND_BW_AND:
871
- | LONG_OP and, reg, addr
866
+ | LONG_OP and, reg, addr, Ra(tmp_reg)
872
867
|| break;
873
868
|| case ZEND_BW_XOR:
874
- | LONG_OP xor, reg, addr
869
+ | LONG_OP xor, reg, addr, Ra(tmp_reg)
875
870
|| break;
876
871
|| default:
877
872
|| ZEND_UNREACHABLE();
@@ -4423,7 +4418,16 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4423
4418
} else if (same_ops && opcode != ZEND_DIV) {
4424
4419
| LONG_MATH_REG opcode, Ra(result_reg), Ra(result_reg)
4425
4420
} else {
4426
- | LONG_MATH opcode, result_reg, op2_addr
4421
+ zend_reg tmp_reg;
4422
+
4423
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4424
+ tmp_reg = ZREG_R1;
4425
+ } else if (result_reg != ZREG_R0) {
4426
+ tmp_reg = ZREG_R0;
4427
+ } else {
4428
+ tmp_reg = ZREG_R1;
4429
+ }
4430
+ | LONG_MATH opcode, result_reg, op2_addr, tmp_reg
4427
4431
}
4428
4432
}
4429
4433
if (may_overflow) {
@@ -5174,12 +5178,20 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
5174
5178
} else if (zend_long_is_power_of_two(op2_lval) && op1_range && op1_range->min >= 0) {
5175
5179
zval tmp;
5176
5180
zend_jit_addr tmp_addr;
5181
+ zend_reg tmp_reg;
5177
5182
5178
5183
/* Optimisation for mod of power of 2 */
5179
5184
ZVAL_LONG(&tmp, op2_lval - 1);
5180
5185
tmp_addr = ZEND_ADDR_CONST_ZVAL(&tmp);
5186
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
5187
+ tmp_reg = ZREG_R1;
5188
+ } else if (result_reg != ZREG_R0) {
5189
+ tmp_reg = ZREG_R0;
5190
+ } else {
5191
+ tmp_reg = ZREG_R1;
5192
+ }
5181
5193
| GET_ZVAL_LVAL result_reg, op1_addr
5182
- | LONG_MATH ZEND_BW_AND, result_reg, tmp_addr
5194
+ | LONG_MATH ZEND_BW_AND, result_reg, tmp_addr, tmp_reg
5183
5195
} else {
5184
5196
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) {
5185
5197
| mov aword T1, r0 // save
@@ -5267,8 +5279,17 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
5267
5279
| GET_ZVAL_LVAL result_reg, op1_addr
5268
5280
| LONG_MATH_REG opcode, Ra(result_reg), Ra(result_reg)
5269
5281
} else {
5282
+ zend_reg tmp_reg;
5283
+
5284
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
5285
+ tmp_reg = ZREG_R1;
5286
+ } else if (result_reg != ZREG_R0) {
5287
+ tmp_reg = ZREG_R0;
5288
+ } else {
5289
+ tmp_reg = ZREG_R1;
5290
+ }
5270
5291
| GET_ZVAL_LVAL result_reg, op1_addr
5271
- | LONG_MATH opcode, result_reg, op2_addr
5292
+ | LONG_MATH opcode, result_reg, op2_addr, tmp_reg
5272
5293
}
5273
5294
5274
5295
if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != result_reg) {
@@ -7047,13 +7068,13 @@ static int zend_jit_cmp_long_long(dasm_State **Dst,
7047
7068
if (Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 0) {
7048
7069
| test Ra(Z_REG(op1_addr)), Ra(Z_REG(op1_addr))
7049
7070
} else {
7050
- | LONG_OP cmp, Z_REG(op1_addr), op2_addr
7071
+ | LONG_OP cmp, Z_REG(op1_addr), op2_addr, r0
7051
7072
}
7052
7073
} else if (Z_MODE(op2_addr) == IS_REG) {
7053
7074
if (Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op1_addr)) == 0) {
7054
7075
| test Ra(Z_REG(op2_addr)), Ra(Z_REG(op2_addr))
7055
7076
} else {
7056
- | LONG_OP cmp, Z_REG(op2_addr), op1_addr
7077
+ | LONG_OP cmp, Z_REG(op2_addr), op1_addr, r0
7057
7078
}
7058
7079
swap = 1;
7059
7080
} else if (Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_MODE(op2_addr) != IS_CONST_ZVAL) {
@@ -7066,7 +7087,7 @@ static int zend_jit_cmp_long_long(dasm_State **Dst,
7066
7087
if (Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 0) {
7067
7088
| test r0, r0
7068
7089
} else {
7069
- | LONG_OP cmp, ZREG_R0, op2_addr
7090
+ | LONG_OP cmp, ZREG_R0, op2_addr, r0
7070
7091
}
7071
7092
}
7072
7093
0 commit comments