goto jit_failure;
}
goto done;
+ case ZEND_FE_RESET_R:
+ op1_info = OP1_INFO();
+ if ((op1_info & (MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_ARRAY) {
+ break;
+ }
+ if (!zend_jit_fe_reset(&dasm_state, opline, op1_info)) {
+ goto jit_failure;
+ }
+ goto done;
case ZEND_FE_FETCH_R:
op1_info = OP1_INFO();
if ((op1_info & MAY_BE_ANY) != MAY_BE_ARRAY) {
break;
}
- if (!zend_jit_fe_fetch(&dasm_state, opline, op_array, ssa, ssa_op,
- op1_info, ssa->cfg.blocks[b].successors[0], opline->opcode, NULL)) {
+ if (!zend_jit_fe_fetch(&dasm_state, opline, op1_info, OP2_INFO(),
+ ssa->cfg.blocks[b].successors[0], opline->opcode, NULL)) {
goto jit_failure;
}
goto done;
case ZEND_ECHO:
case ZEND_STRLEN:
case ZEND_QM_ASSIGN:
+ case ZEND_FE_RESET_R:
case ZEND_FE_FETCH_R:
ADD_OP1_TRACE_GUARD();
break;
goto jit_failure;
}
goto done;
+ case ZEND_FE_RESET_R:
+ op1_info = OP1_INFO();
+ CHECK_OP1_TRACE_TYPE();
+ if ((op1_info & (MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_ARRAY) {
+ break;
+ }
+ if (!zend_jit_fe_reset(&dasm_state, opline, op1_info)) {
+ goto jit_failure;
+ }
+ goto done;
case ZEND_FE_FETCH_R:
op1_info = OP1_INFO();
CHECK_OP1_TRACE_TYPE();
} else {
ZEND_UNREACHABLE();
}
- if (!zend_jit_fe_fetch(&dasm_state, opline, op_array, ssa, ssa_op,
- op1_info, -1, smart_branch_opcode, exit_addr)) {
+ if (!zend_jit_fe_fetch(&dasm_state, opline, op1_info, OP2_INFO(),
+ -1, smart_branch_opcode, exit_addr)) {
goto jit_failure;
}
goto done;
return 1;
}
-static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, const zend_ssa *ssa, const zend_ssa_op *ssa_op, uint32_t op1_info, unsigned int target_label, zend_uchar exit_opcode, const void *exit_addr)
+static int zend_jit_fe_reset(dasm_State **Dst, const zend_op *opline, uint32_t op1_info)
{
- zend_jit_addr op1_addr = OP1_ADDR();
+ zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
+
+ if (opline->op1_type == IS_CONST) {
+ zval *zv = RT_CONSTANT(opline, opline->op1);
+
+ | ZVAL_COPY_CONST res_addr, MAY_BE_ANY, MAY_BE_ANY, zv, ZREG_R0
+ if (Z_REFCOUNTED_P(zv)) {
+ | ADDREF_CONST zv, r0
+ }
+ } else {
+ zend_jit_addr op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var);
+
+ | // ZVAL_COPY(res, value);
+ | ZVAL_COPY_VALUE res_addr, -1, op1_addr, op1_info, ZREG_R0, ZREG_FCARG1a
+ if (opline->op1_type == IS_CV) {
+ | TRY_ADDREF op1_info, ah, FCARG1a
+ }
+ }
+ | // Z_FE_POS_P(res) = 0;
+ | mov dword [FP + opline->result.var + offsetof(zval, u2.fe_pos)], 0
+
+ return 1;
+}
+
+static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, uint32_t op2_info, unsigned int target_label, zend_uchar exit_opcode, const void *exit_addr)
+{
+ zend_jit_addr op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var);
| // array = EX_VAR(opline->op1.var);
| // fe_ht = Z_ARRVAL_P(array);
if (!exit_addr || exit_opcode == ZEND_JMP) {
zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG2a, 0);
- zend_jit_addr var_addr = OP2_ADDR();
+ zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var);
uint32_t val_info;
| mov FCARG2a, r0
if (opline->op2_type == IS_CV) {
| // zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
- if (!zend_jit_assign_to_variable(Dst, opline, var_addr, var_addr, OP2_INFO(), -1, IS_CV, opline->op2, val_addr, val_info, 0, 1)) {
+ if (!zend_jit_assign_to_variable(Dst, opline, var_addr, var_addr, op2_info, -1, IS_CV, opline->op2, val_addr, val_info, 0, 1)) {
return 0;
}
} else {