Skip to content

Commit a0bea10

Browse files
committed
JIT: Fixed register clobbering
1 parent 3991483 commit a0bea10

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4472,8 +4472,17 @@ static int zend_jit_math(dasm_State **Dst, const zend_op *opline, uint32_t op1_i
44724472

44734473
static int zend_jit_add_arrays(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, zend_jit_addr op2_addr, zend_jit_addr res_addr)
44744474
{
4475-
| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr, TMP1
4476-
| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr, TMP1
4475+
if (Z_MODE(op2_addr) != IS_MEM_ZVAL || Z_REG(op2_addr) != ZREG_FCARG1) {
4476+
| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr, TMP1
4477+
| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr, TMP1
4478+
} else if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != ZREG_FCARG1) {
4479+
| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr, TMP1
4480+
| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr, TMP1
4481+
} else {
4482+
| GET_ZVAL_LVAL ZREG_REG0, op2_addr, TMP1
4483+
| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr, TMP1
4484+
| mov FCARG2x, REG0
4485+
}
44774486
| EXT_CALL zend_jit_add_arrays_helper, REG0
44784487
| SET_ZVAL_PTR res_addr, RETVALx, TMP1
44794488
| SET_ZVAL_TYPE_INFO res_addr, IS_ARRAY_EX, TMP1w, TMP2

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4893,8 +4893,17 @@ static int zend_jit_math(dasm_State **Dst, const zend_op *opline, uint32_t op1_i
48934893

48944894
static int zend_jit_add_arrays(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, zend_jit_addr op2_addr, zend_jit_addr res_addr)
48954895
{
4896-
| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr
4897-
| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr
4896+
if (Z_MODE(op2_addr) != IS_MEM_ZVAL || Z_REG(op2_addr) != ZREG_FCARG1) {
4897+
| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr
4898+
| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr
4899+
} else if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != ZREG_FCARG2) {
4900+
| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr
4901+
| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr
4902+
} else {
4903+
| GET_ZVAL_LVAL ZREG_R0, op2_addr
4904+
| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr
4905+
| mov FCARG1a, r0
4906+
}
48984907
| EXT_CALL zend_jit_add_arrays_helper, r0
48994908
| SET_ZVAL_PTR res_addr, r0
49004909
| SET_ZVAL_TYPE_INFO res_addr, IS_ARRAY_EX

0 commit comments

Comments
 (0)