@@ -772,17 +772,12 @@ static void* dasm_labels[zend_lb_MAX];
772
772
|| }
773
773
|.endmacro
774
774
775
- |.macro LONG_OP, long_ins, reg, addr
775
+ |.macro LONG_OP, long_ins, reg, addr, tmp_reg
776
776
|| if (Z_MODE(addr) == IS_CONST_ZVAL) {
777
777
| .if X64
778
778
|| if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(addr)))) {
779
- || if (reg != ZREG_R0) {
780
- | mov64 r0, Z_LVAL_P(Z_ZV(addr))
781
- | long_ins Ra(reg), r0
782
- || } else {
783
- | mov64 r1, Z_LVAL_P(Z_ZV(addr))
784
- | long_ins Ra(reg), r1
785
- || }
779
+ | mov64 tmp_reg, Z_LVAL_P(Z_ZV(addr))
780
+ | long_ins Ra(reg), tmp_reg
786
781
|| } else {
787
782
| long_ins Ra(reg), Z_LVAL_P(Z_ZV(addr))
788
783
|| }
@@ -862,25 +857,25 @@ static void* dasm_labels[zend_lb_MAX];
862
857
|| }
863
858
|.endmacro
864
859
865
- |.macro LONG_MATH, opcode, reg, addr
860
+ |.macro LONG_MATH, opcode, reg, addr, tmp_reg
866
861
|| switch (opcode) {
867
862
|| case ZEND_ADD:
868
- | LONG_OP add, reg, addr
863
+ | LONG_OP add, reg, addr, Ra(tmp_reg)
869
864
|| break;
870
865
|| case ZEND_SUB:
871
- | LONG_OP sub, reg, addr
866
+ | LONG_OP sub, reg, addr, Ra(tmp_reg)
872
867
|| break;
873
868
|| case ZEND_MUL:
874
- | LONG_OP imul, reg, addr
869
+ | LONG_OP imul, reg, addr, Ra(tmp_reg)
875
870
|| break;
876
871
|| case ZEND_BW_OR:
877
- | LONG_OP or, reg, addr
872
+ | LONG_OP or, reg, addr, Ra(tmp_reg)
878
873
|| break;
879
874
|| case ZEND_BW_AND:
880
- | LONG_OP and, reg, addr
875
+ | LONG_OP and, reg, addr, Ra(tmp_reg)
881
876
|| break;
882
877
|| case ZEND_BW_XOR:
883
- | LONG_OP xor, reg, addr
878
+ | LONG_OP xor, reg, addr, Ra(tmp_reg)
884
879
|| break;
885
880
|| default:
886
881
|| ZEND_UNREACHABLE();
@@ -4390,7 +4385,16 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4390
4385
} else if (same_ops && opcode != ZEND_DIV) {
4391
4386
| LONG_MATH_REG opcode, Ra(result_reg), Ra(result_reg)
4392
4387
} else {
4393
- | LONG_MATH opcode, result_reg, op2_addr
4388
+ zend_reg tmp_reg;
4389
+
4390
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4391
+ tmp_reg = ZREG_R1;
4392
+ } else if (result_reg != ZREG_R0) {
4393
+ tmp_reg = ZREG_R0;
4394
+ } else {
4395
+ tmp_reg = ZREG_R1;
4396
+ }
4397
+ | LONG_MATH opcode, result_reg, op2_addr, tmp_reg
4394
4398
}
4395
4399
}
4396
4400
if (may_overflow) {
@@ -5117,12 +5121,20 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
5117
5121
} else if (zend_long_is_power_of_two(op2_lval) && op1_range && op1_range->min >= 0) {
5118
5122
zval tmp;
5119
5123
zend_jit_addr tmp_addr;
5124
+ zend_reg tmp_reg;
5120
5125
5121
5126
/* Optimisation for mod of power of 2 */
5122
5127
ZVAL_LONG(&tmp, op2_lval - 1);
5123
5128
tmp_addr = ZEND_ADDR_CONST_ZVAL(&tmp);
5129
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
5130
+ tmp_reg = ZREG_R1;
5131
+ } else if (result_reg != ZREG_R0) {
5132
+ tmp_reg = ZREG_R0;
5133
+ } else {
5134
+ tmp_reg = ZREG_R1;
5135
+ }
5124
5136
| GET_ZVAL_LVAL result_reg, op1_addr
5125
- | LONG_MATH ZEND_BW_AND, result_reg, tmp_addr
5137
+ | LONG_MATH ZEND_BW_AND, result_reg, tmp_addr, tmp_reg
5126
5138
} else {
5127
5139
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) {
5128
5140
| mov aword T1, r0 // save
@@ -5210,8 +5222,17 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
5210
5222
| GET_ZVAL_LVAL result_reg, op1_addr
5211
5223
| LONG_MATH_REG opcode, Ra(result_reg), Ra(result_reg)
5212
5224
} else {
5225
+ zend_reg tmp_reg;
5226
+
5227
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
5228
+ tmp_reg = ZREG_R1;
5229
+ } else if (result_reg != ZREG_R0) {
5230
+ tmp_reg = ZREG_R0;
5231
+ } else {
5232
+ tmp_reg = ZREG_R1;
5233
+ }
5213
5234
| GET_ZVAL_LVAL result_reg, op1_addr
5214
- | LONG_MATH opcode, result_reg, op2_addr
5235
+ | LONG_MATH opcode, result_reg, op2_addr, tmp_reg
5215
5236
}
5216
5237
5217
5238
if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != result_reg) {
@@ -7025,13 +7046,13 @@ static int zend_jit_cmp_long_long(dasm_State **Dst,
7025
7046
if (Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 0) {
7026
7047
| test Ra(Z_REG(op1_addr)), Ra(Z_REG(op1_addr))
7027
7048
} else {
7028
- | LONG_OP cmp, Z_REG(op1_addr), op2_addr
7049
+ | LONG_OP cmp, Z_REG(op1_addr), op2_addr, r0
7029
7050
}
7030
7051
} else if (Z_MODE(op2_addr) == IS_REG) {
7031
7052
if (Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op1_addr)) == 0) {
7032
7053
| test Ra(Z_REG(op2_addr)), Ra(Z_REG(op2_addr))
7033
7054
} else {
7034
- | LONG_OP cmp, Z_REG(op2_addr), op1_addr
7055
+ | LONG_OP cmp, Z_REG(op2_addr), op1_addr, r0
7035
7056
}
7036
7057
swap = 1;
7037
7058
} else if (Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_MODE(op2_addr) != IS_CONST_ZVAL) {
@@ -7044,7 +7065,7 @@ static int zend_jit_cmp_long_long(dasm_State **Dst,
7044
7065
if (Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 0) {
7045
7066
| test r0, r0
7046
7067
} else {
7047
- | LONG_OP cmp, ZREG_R0, op2_addr
7068
+ | LONG_OP cmp, ZREG_R0, op2_addr, r0
7048
7069
}
7049
7070
}
7050
7071
0 commit comments