@@ -4939,6 +4939,9 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
4939
4939
4940
4940
if (opcode == ZEND_MOD) {
4941
4941
result_reg = ZREG_RAX;
4942
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) {
4943
+ | mov aword T1, r0 // save
4944
+ }
4942
4945
} else if (Z_MODE(res_addr) == IS_REG) {
4943
4946
if ((opline->opcode == ZEND_SL || opline->opcode == ZEND_SR)
4944
4947
&& opline->op2_type != IS_CONST) {
@@ -5043,18 +5046,23 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
5043
5046
if (op2_lval == 0) {
5044
5047
| SET_EX_OPLINE opline, r0
5045
5048
| jmp ->mod_by_zero
5046
- } else if (op2_lval == -1) {
5047
- | xor Ra(result_reg), Ra(result_reg)
5048
5049
} else {
5049
5050
result_reg = ZREG_RDX;
5050
- | GET_ZVAL_LVAL ZREG_RAX, op1_addr
5051
- | GET_ZVAL_LVAL ZREG_RCX, op2_addr
5052
- |.if X64
5053
- | cqo
5054
- |.else
5055
- | cdq
5056
- |.endif
5057
- | idiv Ra(ZREG_RCX)
5051
+ if (op2_lval == -1) {
5052
+ | xor Ra(result_reg), Ra(result_reg)
5053
+ } else {
5054
+ | GET_ZVAL_LVAL ZREG_RAX, op1_addr
5055
+ | GET_ZVAL_LVAL ZREG_RCX, op2_addr
5056
+ |.if X64
5057
+ | cqo
5058
+ |.else
5059
+ | cdq
5060
+ |.endif
5061
+ | idiv Ra(ZREG_RCX)
5062
+ }
5063
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) {
5064
+ | mov r0, aword T1 // restore
5065
+ }
5058
5066
}
5059
5067
} else {
5060
5068
if (!op2_range || (op2_range->min <= 0 && op2_range->max >= 0)) {
@@ -5105,6 +5113,9 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
5105
5113
} else if (Z_MODE(op2_addr) == IS_REG) {
5106
5114
| idiv Ra(Z_REG(op2_addr))
5107
5115
}
5116
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) {
5117
+ | mov r0, aword T1 // restore
5118
+ }
5108
5119
}
5109
5120
} else if (same_ops) {
5110
5121
| GET_ZVAL_LVAL result_reg, op1_addr
0 commit comments