|| }
|.endmacro
-|.macro SAVE_VALID_OPLINE, op
+|.macro SAVE_VALID_OPLINE, op, tmp_reg
|| if (op == last_valid_opline) {
| SAVE_OPLINE
|| } else {
-| ADDR_OP2_2 mov, aword EX->opline, op, r0
+| ADDR_OP2_2 mov, aword EX->opline, op, tmp_reg
|| }
|.endmacro
|| break;
|| } else if (type == IS_ARRAY) {
|| if (opline) {
-| SAVE_VALID_OPLINE opline
+| SAVE_VALID_OPLINE opline, r0
|| }
| EXT_CALL zend_array_destroy, r0
|| break;
|| } else if (type == IS_OBJECT) {
|| if (opline) {
-| SAVE_VALID_OPLINE opline
+| SAVE_VALID_OPLINE opline, r0
|| }
| EXT_CALL zend_objects_store_del, r0
|| break;
|| }
|| }
|| if (opline) {
-| SAVE_VALID_OPLINE opline
+| SAVE_VALID_OPLINE opline, r0
|| }
| EXT_CALL rc_dtor_func, r0
|| } while(0);
|| if (opline == last_valid_opline) {
| call ->undefined_offset_ex
|| } else {
-| SAVE_VALID_OPLINE, opline
+| SAVE_VALID_OPLINE opline, r0
| call ->undefined_offset
|| }
|.endmacro
|| if (opline == last_valid_opline) {
| call ->undefined_index_ex
|| } else {
-| SAVE_VALID_OPLINE, opline
+| SAVE_VALID_OPLINE opline, r0
| call ->undefined_index
|| }
|.endmacro
|| if (opline == last_valid_opline) {
| call ->cannot_add_element_ex
|| } else {
-| SAVE_VALID_OPLINE, opline
+| SAVE_VALID_OPLINE opline, r0
| call ->cannot_add_element
|| }
|.endmacro
|.cold_code
|2:
if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE))) {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (op1_info & MAY_BE_UNDEF) {
| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >2
| // zend_error(E_WARNING, "Undefined variable: %s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var))));
|.cold_code
}
|6:
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (Z_MODE(res_addr) == IS_REG) {
zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, res_var);
| LOAD_ZVAL_ADDR FCARG1a, real_addr
if (EXPECTED(op2_lval > 0)) {
| xor Ra(result_reg), Ra(result_reg)
} else {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| jmp ->negative_shift
}
} else {
| cmp r1, 0
| mov Ra(result_reg), 0
| jg >1
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| jmp ->negative_shift
|.code
}
if (EXPECTED(op2_lval > 0)) {
| sar Ra(result_reg), (SIZEOF_ZEND_LONG * 8) - 1
} else {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| jmp ->negative_shift
}
} else {
| cmp r1, 0
| mov r1, (SIZEOF_ZEND_LONG * 8) - 1
| jg >1
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| jmp ->negative_shift
|.code
}
zend_long op2_lval = Z_LVAL_P(Z_ZV(op2_addr));
if (op2_lval == 0) {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| jmp ->mod_by_zero
} else if (op2_lval == -1) {
| xor Ra(result_reg), Ra(result_reg)
| jz >1
|.cold_code
|1:
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| jmp ->mod_by_zero
|.code
}
|.cold_code
}
|6:
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (Z_MODE(res_addr) == IS_REG) {
zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, res_var);
| LOAD_ZVAL_ADDR FCARG1a, real_addr
|6:
}
#endif
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (Z_REG(res_addr) != ZREG_FCARG1a || Z_OFFSET(res_addr) != 0) {
| LOAD_ZVAL_ADDR FCARG1a, res_addr
}
case BP_VAR_RW:
|2:
if (zend_jit_trigger != ZEND_JIT_ON_HOT_TRACE) {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| // zend_error(E_NOTICE,"Undefined offset: " ZEND_LONG_FMT, hval);
| //retval = zend_hash_index_update(ht, hval, &EG(uninitialized_zval));
| EXT_CALL zend_jit_fetch_dimension_rw_long_helper, r0
| jmp >8
}
|4:
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| EXT_CALL zend_jit_hash_index_lookup_rw, r0
}
break;
|.code
break;
case BP_VAR_RW:
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (opline->op2_type != IS_CONST) {
| EXT_CALL zend_jit_symtable_lookup_rw, r0
} else {
|.cold_code
|3:
}
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| LOAD_ZVAL_ADDR FCARG2a, op2_addr
switch (type) {
case BP_VAR_R:
if (Z_REG(var_addr) != ZREG_FP) {
| mov aword T1, Ra(Z_REG(var_addr)) // save
}
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| mov FCARG1d, val.var
| EXT_CALL zend_jit_undefined_op_helper, r0
if (Z_REG(var_addr) != ZREG_FP) {
|.cold_code
|2:
| LOAD_ZVAL_ADDR FCARG2a, val_addr
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (val_type == IS_CONST) {
| EXT_CALL zend_jit_assign_const_to_typed_ref, r0
} else if (val_type == IS_TMP_VAR) {
| jmp >3
|.cold_code
|2:
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| EXT_CALL zend_jit_prepare_assign_dim_ref, r0
| test r0, r0
| jz ->exception_handler_undef
}
if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (Z_REG(op1_addr) != ZREG_FCARG1a) {
| LOAD_ZVAL_ADDR FCARG1a, op1_addr
}
| jmp >3
|.cold_code
|2:
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| EXT_CALL zend_jit_prepare_assign_dim_ref, r0
| test r0, r0
| jz ->exception_handler_undef
if (op1_info & (MAY_BE_NULL|MAY_BE_FALSE)) {
| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1
}
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| mov FCARG1a, opline->op1.var
| EXT_CALL zend_jit_undefined_op_helper, r0
|1:
| sub r4, 12
| PUSH_ADDR binary_op, r0
|.endif
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| EXT_CALL zend_jit_assign_op_to_typed_ref, r0
|.if not(X64)
| add r4, 12
|7:
}
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (Z_REG(op1_addr) != ZREG_FCARG1a) {
| LOAD_ZVAL_ADDR FCARG1a, op1_addr
}
| sub r4, 12
| PUSH_ADDR binary_op, r0
|.endif
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| EXT_CALL zend_jit_assign_op_to_typed_ref, r0
|.if not(X64)
| add r4, 12
|.cold_code
|9:
}
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (Z_MODE(op1_addr) == IS_REG) {
zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var);
if (!zend_jit_spill_store(Dst, op1_addr, real_addr, op1_info, 1)) {
|.cold_code
|1:
| // zend_error(E_WARNING, "Undefined variable: %s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var))));
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| mov FCARG1d, opline->op1.var
| EXT_CALL zend_jit_undefined_op_helper, r0
if (may_throw) {
|.cold_code
|1:
| // zend_error(E_WARNING, "Undefined variable: %s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var))));
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| mov aword T1, FCARG1a // save
| mov FCARG1d, opline->op2.var
| EXT_CALL zend_jit_undefined_op_helper, r0
|.cold_code
|1:
| // zend_error(E_WARNING, "Undefined variable: %s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var))));
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| mov FCARG1d, opline->op1.var
| EXT_CALL zend_jit_undefined_op_helper, r0
if (may_throw) {
|.cold_code
|1:
| // zend_error(E_WARNING, "Undefined variable: %s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var))));
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| mov FCARG1d, opline->op2.var
| EXT_CALL zend_jit_undefined_op_helper, r0
if (may_throw) {
(op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) ||
((opline->op2_type & (IS_VAR|IS_TMP_VAR)) &&
(op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)))) {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline
| FREE_OP opline->op2_type, opline->op2, op2_info, 1, op_array, opline
}
if (smart_branch_opcode) {
if (opline->op2_type == IS_VAR && (op2_info & MAY_BE_REF)) {
| jne >8
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| FREE_OP opline->op2_type, opline->op2, op2_info, 1, op_array, opline
zend_jit_check_exception_undef_result(Dst, opline);
if (exit_addr && smart_branch_opcode == ZEND_JMPNZ) {
}
if ((opline->op2_type & (IS_VAR|IS_TMP_VAR)) &&
(op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| FREE_OP opline->op2_type, opline->op2, op2_info, 1, op_array, opline
zend_jit_check_exception_undef_result(Dst, opline);
}
if (smart_branch_opcode) {
if (opline->op1_type == IS_VAR && (op1_info & MAY_BE_REF)) {
| jne >8
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline
zend_jit_check_exception_undef_result(Dst, opline);
if (exit_addr && smart_branch_opcode == ZEND_JMPNZ) {
}
if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) &&
(op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline
zend_jit_check_exception_undef_result(Dst, opline);
}
((opline->op2_type & (IS_VAR|IS_TMP_VAR)) &&
(op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)))) {
| mov aword T1, r0 // save
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline
| FREE_OP opline->op2_type, opline->op2, op2_info, 1, op_array, opline
zend_jit_check_exception_undef_result(Dst, opline);
|1:
}
| mov FCARG1d, opline->op1.var
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| EXT_CALL zend_jit_undefined_op_helper, r0
if (may_throw) {
if (Z_REG(op1_addr) != ZREG_FCARG1a) {
| LOAD_ZVAL_ADDR FCARG1a, op1_addr
}
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| EXT_CALL zend_is_true, r0
if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) &&
| // EG(vm_stack_top) = (zval*)((char*)call + used_stack);
|.cold_code
|1:
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (func) {
| mov FCARG1d, used_stack
}
| jmp &exit_addr
} else {
| // SAVE_OPLINE();
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| jmp ->undefined_function
}
}
| // fbc = call->func;
| // mov r2, EX:RX->func ???
| // SAVE_OPLINE();
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (!delayed_call_chain) {
if (call_level == 1) {
| jnz >1
|.cold_code
|1:
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| jmp ->throw_cannot_pass_by_ref
|.code
}
| jmp &exit_addr
} else {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| LOAD_ZVAL_ADDR FCARG1a, arg_addr
| EXT_CALL zend_jit_only_vars_by_reference, r0
if (!zend_jit_check_exception(Dst)) {
|1:
}
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| mov FCARG1d, opline->op1.var
| EXT_CALL zend_jit_undefined_op_helper, r0
| SET_ZVAL_TYPE_INFO arg_addr, IS_NULL
}
| jmp &exit_addr
} else {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| LOAD_ZVAL_ADDR FCARG1a, arg_addr
| EXT_CALL zend_jit_only_vars_by_reference, r0
if (!zend_jit_check_exception(Dst)) {
| jz >2
}
|1:
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| LOAD_ADDR FCARG1a, zv
| EXT_CALL zend_jit_check_constant, r0
| test r0, r0
|.cold_code
|1:
}
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| mov FCARG1d, opline->op1.var
| EXT_CALL zend_jit_undefined_op_helper, r0
zend_jit_check_exception_undef_result(Dst, opline);
if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_ARRAY|MAY_BE_STRING))) {
| IF_NOT_ZVAL_TYPE op1_addr, IS_STRING, >6
}
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (Z_REG(op1_addr) != ZREG_FCARG1a) {
| LOAD_ZVAL_ADDR FCARG1a, op1_addr
}
if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_ARRAY|MAY_BE_STRING|MAY_BE_OBJECT))) {
| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, >6
}
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (Z_REG(op1_addr) != ZREG_FCARG1a) {
| LOAD_ZVAL_ADDR FCARG1a, op1_addr
}
}
if ((opline->opcode != ZEND_FETCH_DIM_IS && (op1_info & MAY_BE_UNDEF)) || (op2_info & MAY_BE_UNDEF)) {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (opline->opcode != ZEND_FETCH_DIM_IS && (op1_info & MAY_BE_UNDEF)) {
| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1
| // zend_error(E_WARNING, "Undefined variable: %s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var))));
if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_ARRAY|MAY_BE_STRING|MAY_BE_OBJECT))) {
if (opline->opcode != ZEND_FETCH_DIM_IS) {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| LOAD_ZVAL_ADDR FCARG1a, orig_op1_addr
| EXT_CALL zend_jit_invalid_array_access, r0
}
|7:
}
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (Z_REG(op1_addr) != ZREG_FCARG1a) {
| LOAD_ZVAL_ADDR FCARG1a, op1_addr
}
| jb >1
|.cold_code
|1:
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| mov FCARG1a, FP
| EXT_CALL zend_missing_arg_error, r0
| jmp ->exception_handler
|.cold_code
|8:
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| mov FCARG1a, r0
| mov r0, EX->run_time_cache
| add r0, opline->extended_value
}
if (Z_CONSTANT_P(zv)) {
has_slow = 1;
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
|.if X64
| LOAD_ZVAL_ADDR CARG1, res_addr
| mov r0, EX->func
| mov CARG3, arg_num
| LOAD_ADDR CARG4, (ptrdiff_t)arg_info
| mov aword A5, r0
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| EXT_CALL zend_jit_verify_arg_slow, r0
|.elif X64
| mov CARG3, arg_num
| LOAD_ADDR CARG4, (ptrdiff_t)arg_info
| mov CARG5, r0
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| EXT_CALL zend_jit_verify_arg_slow, r0
|.else
| sub r4, 4
| push r0
| push (ptrdiff_t)arg_info
| push arg_num
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| EXT_CALL zend_jit_verify_arg_slow, r0
| add r4, 4
|.endif
| push (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS)
| PUSH_ZVAL_ADDR res_addr, r0
|.endif
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (opline->opcode == ZEND_FETCH_OBJ_R) {
| EXT_CALL zend_jit_fetch_obj_r_slow, r0
} else if (opline->opcode == ZEND_FETCH_OBJ_IS) {
if ((op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)- MAY_BE_OBJECT)) && zend_jit_trigger != ZEND_JIT_ON_HOT_TRACE) {
|7:
if (opline->opcode == ZEND_FETCH_OBJ_R) {
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (op1_info & MAY_BE_UNDEF) {
if (op1_info & MAY_BE_ANY) {
| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1
| PUSH_ZVAL_ADDR res_addr, r0
| PUSH_ADDR member, r0
|.endif
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
if (opline->opcode == ZEND_FETCH_OBJ_R) {
| EXT_CALL zend_jit_fetch_obj_r_dynamic, r0
} else if (opline->opcode == ZEND_FETCH_OBJ_IS) {
if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) {
if (may_throw) {
- | SAVE_VALID_OPLINE, opline
+ | SAVE_VALID_OPLINE opline, r0
}
if (opline->opcode == ZEND_FE_FREE && (op1_info & (MAY_BE_OBJECT|MAY_BE_REF))) {
if (op1_info & MAY_BE_ARRAY) {
if (len > 0) {
const char *str = Z_STRVAL_P(zv);
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
|.if X64
| LOAD_ADDR CARG1, str
| LOAD_ADDR CARG2, len
|.if X64
| LOAD_ADDR CARG3, (ptrdiff_t)arg_info
| mov CARG4, r0
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| EXT_CALL zend_jit_verify_return_slow, r0
|.else
| sub r4, 8
| push r0
| push (ptrdiff_t)arg_info
- | SAVE_VALID_OPLINE opline
+ | SAVE_VALID_OPLINE opline, r0
| EXT_CALL zend_jit_verify_return_slow, r0
| add r4, 8
|.endif