@@ -4939,6 +4939,9 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
49394939
49404940 if (opcode == ZEND_MOD) {
49414941 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+ }
49424945 } else if (Z_MODE(res_addr) == IS_REG) {
49434946 if ((opline->opcode == ZEND_SL || opline->opcode == ZEND_SR)
49444947 && opline->op2_type != IS_CONST) {
@@ -5043,18 +5046,23 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
50435046 if (op2_lval == 0) {
50445047 | SET_EX_OPLINE opline, r0
50455048 | jmp ->mod_by_zero
5046- } else if (op2_lval == -1) {
5047- | xor Ra(result_reg), Ra(result_reg)
50485049 } else {
50495050 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+ }
50585066 }
50595067 } else {
50605068 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,
51055113 } else if (Z_MODE(op2_addr) == IS_REG) {
51065114 | idiv Ra(Z_REG(op2_addr))
51075115 }
5116+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) {
5117+ | mov r0, aword T1 // restore
5118+ }
51085119 }
51095120 } else if (same_ops) {
51105121 | GET_ZVAL_LVAL result_reg, op1_addr
0 commit comments