static int zend_jit_trace_op_len(const zend_op *opline);
static int zend_jit_trace_may_exit(const zend_op_array *op_array, const zend_op *opline);
-static uint32_t zend_jit_trace_get_exit_point(const zend_op *from_opline, const zend_op *to_opline, zend_jit_trace_rec *trace, uint32_t flags);
+static uint32_t zend_jit_trace_get_exit_point(const zend_op *to_opline, uint32_t flags);
static const void *zend_jit_trace_get_exit_addr(uint32_t n);
static void zend_jit_trace_add_code(const void *start, uint32_t size);
|| op_array->opcodes[ssa->cfg.blocks[b].start - 1].opcode == ZEND_SWITCH_LONG
|| op_array->opcodes[ssa->cfg.blocks[b].start - 1].opcode == ZEND_SWITCH_STRING
|| op_array->opcodes[ssa->cfg.blocks[b].start - 1].opcode == ZEND_MATCH)) {
- if (!zend_jit_reset_opline(&dasm_state, op_array->opcodes + ssa->cfg.blocks[b].start)
- || !zend_jit_set_valid_ip(&dasm_state, op_array->opcodes + ssa->cfg.blocks[b].start)) {
+ zend_jit_reset_opline();
+ if (!zend_jit_set_valid_ip(&dasm_state, op_array->opcodes + ssa->cfg.blocks[b].start)) {
goto jit_failure;
}
} else {
- if (!zend_jit_set_opline(&dasm_state, op_array->opcodes + ssa->cfg.blocks[b].start)) {
- goto jit_failure;
- }
+ zend_jit_set_opline(op_array->opcodes + ssa->cfg.blocks[b].start);
}
} else if (ssa->cfg.blocks[b].flags & ZEND_BB_TARGET) {
- if (!zend_jit_reset_opline(&dasm_state, op_array->opcodes + ssa->cfg.blocks[b].start)) {
- goto jit_failure;
- }
+ zend_jit_reset_opline();
} else if (ssa->cfg.blocks[b].flags & (ZEND_BB_START|ZEND_BB_RECV_ENTRY|ZEND_BB_ENTRY)) {
- if (!zend_jit_set_opline(&dasm_state, op_array->opcodes + ssa->cfg.blocks[b].start)) {
- goto jit_failure;
- }
+ zend_jit_set_opline(op_array->opcodes + ssa->cfg.blocks[b].start);
}
if (ssa->cfg.blocks[b].flags & ZEND_BB_LOOP_HEADER) {
if (!zend_jit_check_timeout(&dasm_state, op_array->opcodes + ssa->cfg.blocks[b].start, NULL)) {
res_addr = 0;
}
op1_def_info = OP1_DEF_INFO();
- if (!zend_jit_inc_dec(&dasm_state, opline, op_array,
+ if (!zend_jit_inc_dec(&dasm_state, opline,
op1_info, OP1_REG_ADDR(),
op1_def_info, OP1_DEF_REG_ADDR(),
res_use_info, res_info,
res_use_info = RES_USE_INFO();
res_addr = RES_REG_ADDR();
}
- if (!zend_jit_long_math(&dasm_state, opline, op_array,
+ if (!zend_jit_long_math(&dasm_state, opline,
op1_info, OP1_RANGE(), OP1_REG_ADDR(),
op2_info, OP2_RANGE(), OP2_REG_ADDR(),
res_use_info, RES_INFO(), res_addr,
if (opline->opcode == ZEND_ADD &&
(op1_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_ARRAY &&
(op2_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_ARRAY) {
- if (!zend_jit_add_arrays(&dasm_state, opline, op_array, op1_info, op2_info)) {
+ if (!zend_jit_add_arrays(&dasm_state, opline, op1_info, op2_info)) {
goto jit_failure;
}
goto done;
res_addr = RES_REG_ADDR();
}
res_info = RES_INFO();
- if (!zend_jit_math(&dasm_state, opline, op_array,
+ if (!zend_jit_math(&dasm_state, opline,
op1_info, OP1_REG_ADDR(),
op2_info, OP2_REG_ADDR(),
res_use_info, res_info, res_addr,
} else {
send_result = 0;
}
- if (!zend_jit_concat(&dasm_state, opline, op_array,
- op1_info, op2_info, RES_INFO(), send_result,
+ if (!zend_jit_concat(&dasm_state, opline,
+ op1_info, op2_info, send_result,
zend_may_throw(opline, ssa_op, op_array, ssa))) {
goto jit_failure;
}
}
}
op1_def_info = OP1_DEF_INFO();
- if (!zend_jit_assign_op(&dasm_state, opline, op_array,
+ if (!zend_jit_assign_op(&dasm_state, opline,
op1_info, op1_def_info, OP1_RANGE(),
op2_info, OP2_RANGE(),
(op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_LONG) && (op1_def_info & MAY_BE_DOUBLE) && zend_may_overflow(opline, op_array, ssa),
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
break;
}
- if (!zend_jit_assign_dim_op(&dasm_state, opline, op_array,
+ if (!zend_jit_assign_dim_op(&dasm_state, opline,
OP1_INFO(), OP1_DEF_INFO(), OP1_REG_ADDR(), OP2_INFO(),
OP1_DATA_INFO(), OP1_DATA_RANGE(),
zend_may_throw(opline, ssa_op, op_array, ssa))) {
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
break;
}
- if (!zend_jit_assign_dim(&dasm_state, opline, op_array,
+ if (!zend_jit_assign_dim(&dasm_state, opline,
OP1_INFO(), OP1_REG_ADDR(), OP2_INFO(), OP1_DATA_INFO(),
zend_may_throw(opline, ssa_op, op_array, ssa))) {
goto jit_failure;
} else {
op2_def_addr = op2_addr;
}
- if (!zend_jit_assign(&dasm_state, opline, op_array,
+ if (!zend_jit_assign(&dasm_state, opline,
OP1_INFO(), OP1_REG_ADDR(),
OP1_DEF_INFO(), OP1_DEF_REG_ADDR(),
OP2_INFO(), op2_addr, op2_def_addr,
} else {
op1_def_addr = op1_addr;
}
- if (!zend_jit_qm_assign(&dasm_state, opline, op_array,
+ if (!zend_jit_qm_assign(&dasm_state, opline,
OP1_INFO(), op1_addr, op1_def_addr,
RES_INFO(), RES_REG_ADDR())) {
goto jit_failure;
&& opline->op2.num > MAX_ARG_FLAG_NUM) {
break;
}
- if (!zend_jit_send_val(&dasm_state, opline, op_array,
+ if (!zend_jit_send_val(&dasm_state, opline,
OP1_INFO(), OP1_REG_ADDR())) {
goto jit_failure;
}
if (opline->op2.num > MAX_ARG_FLAG_NUM) {
break;
}
- if (!zend_jit_check_func_arg(&dasm_state, opline, op_array)) {
+ if (!zend_jit_check_func_arg(&dasm_state, opline)) {
goto jit_failure;
}
goto done;
smart_branch_opcode = 0;
target_label = target_label2 = (uint32_t)-1;
}
- if (!zend_jit_cmp(&dasm_state, opline, op_array,
+ if (!zend_jit_cmp(&dasm_state, opline,
OP1_INFO(), OP1_REG_ADDR(),
OP2_INFO(), OP2_REG_ADDR(),
res_addr,
smart_branch_opcode = 0;
target_label = target_label2 = (uint32_t)-1;
}
- if (!zend_jit_identical(&dasm_state, opline, op_array,
+ if (!zend_jit_identical(&dasm_state, opline,
OP1_INFO(), OP1_REG_ADDR(),
OP2_INFO(), OP2_REG_ADDR(),
RES_REG_ADDR(),
smart_branch_opcode = 0;
target_label = target_label2 = (uint32_t)-1;
}
- if (!zend_jit_defined(&dasm_state, opline, op_array, smart_branch_opcode, target_label, target_label2, NULL)) {
+ if (!zend_jit_defined(&dasm_state, opline, smart_branch_opcode, target_label, target_label2, NULL)) {
goto jit_failure;
}
goto done;
smart_branch_opcode = 0;
target_label = target_label2 = (uint32_t)-1;
}
- if (!zend_jit_type_check(&dasm_state, opline, op_array, OP1_INFO(), smart_branch_opcode, target_label, target_label2, NULL)) {
+ if (!zend_jit_type_check(&dasm_state, opline, OP1_INFO(), smart_branch_opcode, target_label, target_label2, NULL)) {
goto jit_failure;
}
goto done;
goto jit_failure;
}
for (j = 0 ; j < op_array->last_var; j++) {
- uint32_t info = zend_ssa_cv_info(opline, op_array, ssa, j);
+ uint32_t info = zend_ssa_cv_info(op_array, ssa, j);
if (info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) {
- if (!zend_jit_free_cv(&dasm_state, opline, op_array, info, j)) {
+ if (!zend_jit_free_cv(&dasm_state, info, j)) {
goto jit_failure;
}
}
}
- if (!zend_jit_leave_func(&dasm_state, opline, op_array, NULL, NULL, 1)) {
+ if (!zend_jit_leave_func(&dasm_state, op_array, NULL, NULL, 1)) {
goto jit_failure;
}
}
goto done;
case ZEND_BOOL:
case ZEND_BOOL_NOT:
- if (!zend_jit_bool_jmpznz(&dasm_state, opline, op_array,
+ if (!zend_jit_bool_jmpznz(&dasm_state, opline,
OP1_INFO(), OP1_REG_ADDR(), RES_REG_ADDR(),
-1, -1,
zend_may_throw(opline, ssa_op, op_array, ssa),
} else {
res_addr = RES_REG_ADDR();
}
- if (!zend_jit_bool_jmpznz(&dasm_state, opline, op_array,
+ if (!zend_jit_bool_jmpznz(&dasm_state, opline,
OP1_INFO(), OP1_REG_ADDR(), res_addr,
ssa->cfg.blocks[b].successors[0], ssa->cfg.blocks[b].successors[1],
zend_may_throw(opline, ssa_op, op_array, ssa),
smart_branch_opcode = 0;
target_label = target_label2 = (uint32_t)-1;
}
- if (!zend_jit_isset_isempty_cv(&dasm_state, opline, op_array,
+ if (!zend_jit_isset_isempty_cv(&dasm_state, opline,
OP1_INFO(), OP1_REG_ADDR(),
smart_branch_opcode, target_label, target_label2,
NULL)) {
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
break;
}
- if (!zend_jit_fetch_dim_read(&dasm_state, opline, op_array, ssa, ssa_op,
+ if (!zend_jit_fetch_dim_read(&dasm_state, opline, ssa, ssa_op,
OP1_INFO(), OP1_REG_ADDR(), OP2_INFO(), RES_INFO(), RES_REG_ADDR(),
zend_may_throw(opline, ssa_op, op_array, ssa))) {
goto jit_failure;
smart_branch_opcode = 0;
target_label = target_label2 = (uint32_t)-1;
}
- if (!zend_jit_isset_isempty_dim(&dasm_state, opline, op_array,
+ if (!zend_jit_isset_isempty_dim(&dasm_state, opline,
OP1_INFO(), OP1_REG_ADDR(), OP2_INFO(),
zend_may_throw(opline, ssa_op, op_array, ssa),
smart_branch_opcode, target_label, target_label2,
} else {
op1_info = OP1_INFO();
}
- if (!zend_jit_bind_global(&dasm_state, opline, op_array, op1_info)) {
+ if (!zend_jit_bind_global(&dasm_state, opline, op1_info)) {
goto jit_failure;
}
goto done;
goto done;
case ZEND_FREE:
case ZEND_FE_FREE:
- if (!zend_jit_free(&dasm_state, opline, op_array, OP1_INFO(),
+ if (!zend_jit_free(&dasm_state, opline, OP1_INFO(),
zend_may_throw(opline, ssa_op, op_array, ssa))) {
goto jit_failure;
}
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_STRING) {
break;
}
- if (!zend_jit_echo(&dasm_state, opline, op_array, op1_info)) {
+ if (!zend_jit_echo(&dasm_state, opline, op1_info)) {
goto jit_failure;
}
goto done;
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_STRING) {
break;
}
- if (!zend_jit_strlen(&dasm_state, opline, op_array, op1_info)) {
+ if (!zend_jit_strlen(&dasm_state, opline, op1_info)) {
goto jit_failure;
}
goto done;
goto jit_failure;
}
}
- zend_jit_set_opline(&dasm_state, opline+1);
+ zend_jit_set_opline(opline+1);
break;
case ZEND_NOP:
case ZEND_OP_DATA:
((n % ZEND_JIT_EXIT_POINTS_PER_GROUP) * ZEND_JIT_EXIT_POINTS_SPACING));
}
-static uint32_t zend_jit_trace_get_exit_point(const zend_op *from_opline, const zend_op *to_opline, zend_jit_trace_rec *trace, uint32_t flags)
+static uint32_t zend_jit_trace_get_exit_point(const zend_op *to_opline, uint32_t flags)
{
zend_jit_trace_info *t = &zend_jit_traces[ZEND_JIT_TRACE_NUM];
uint32_t exit_point;
parent_trace ? &zend_jit_traces[parent_trace] : NULL, exit_num);
if (!parent_trace) {
- zend_jit_set_opline(&dasm_state, opline);
+ zend_jit_set_opline(opline);
} else {
if (zend_jit_traces[parent_trace].exit_info[exit_num].opline == NULL) {
zend_jit_trace_opline_guard(&dasm_state, opline);
- zend_jit_set_opline(&dasm_state, opline);
+ zend_jit_set_opline(opline);
} else {
- zend_jit_reset_opline(&dasm_state, opline);
+ zend_jit_reset_opline();
}
}
if (trace_buffer->stop != ZEND_JIT_TRACE_STOP_RECURSIVE_RET) {
if (ra && zend_jit_trace_stack_needs_deoptimization(stack, op_array->last_var + op_array->T)) {
- uint32_t exit_point = zend_jit_trace_get_exit_point(NULL, NULL, NULL, ZEND_JIT_EXIT_TO_VM);
+ uint32_t exit_point = zend_jit_trace_get_exit_point(NULL, ZEND_JIT_EXIT_TO_VM);
timeout_exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!timeout_exit_addr) {
res_addr = 0;
}
op1_def_info = OP1_DEF_INFO();
- if (!zend_jit_inc_dec(&dasm_state, opline, op_array,
+ if (!zend_jit_inc_dec(&dasm_state, opline,
op1_info, OP1_REG_ADDR(),
op1_def_info, OP1_DEF_REG_ADDR(),
res_use_info, res_info,
res_addr = RES_REG_ADDR();
}
res_info = RES_INFO();
- if (!zend_jit_long_math(&dasm_state, opline, op_array,
+ if (!zend_jit_long_math(&dasm_state, opline,
op1_info, OP1_RANGE(), OP1_REG_ADDR(),
op2_info, OP2_RANGE(), OP2_REG_ADDR(),
res_use_info, res_info, res_addr,
if (opline->opcode == ZEND_ADD &&
(op1_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_ARRAY &&
(op2_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_ARRAY) {
- if (!zend_jit_add_arrays(&dasm_state, opline, op_array, op1_info, op2_info)) {
+ if (!zend_jit_add_arrays(&dasm_state, opline, op1_info, op2_info)) {
goto jit_failure;
}
goto done;
res_addr = RES_REG_ADDR();
}
res_info = RES_INFO();
- if (!zend_jit_math(&dasm_state, opline, op_array,
+ if (!zend_jit_math(&dasm_state, opline,
op1_info, OP1_REG_ADDR(),
op2_info, OP2_REG_ADDR(),
res_use_info, res_info, res_addr,
} else {
send_result = 0;
}
- res_info = RES_INFO();
- if (!zend_jit_concat(&dasm_state, opline, op_array,
- op1_info, op2_info, res_info, send_result,
+ if (!zend_jit_concat(&dasm_state, opline,
+ op1_info, op2_info, send_result,
zend_may_throw(opline, ssa_op, op_array, ssa))) {
goto jit_failure;
}
}
}
op1_def_info = OP1_DEF_INFO();
- if (!zend_jit_assign_op(&dasm_state, opline, op_array,
+ if (!zend_jit_assign_op(&dasm_state, opline,
op1_info, op1_def_info, OP1_RANGE(),
op2_info, OP2_RANGE(),
(op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_LONG) && (op1_def_info & (MAY_BE_DOUBLE|MAY_BE_GUARD)) && zend_may_overflow_ex(opline, ssa_op, op_array, ssa),
op1_data_info = OP1_DATA_INFO();
CHECK_OP1_DATA_TRACE_TYPE();
op1_def_info = OP1_DEF_INFO();
- if (!zend_jit_assign_dim_op(&dasm_state, opline, op_array,
+ if (!zend_jit_assign_dim_op(&dasm_state, opline,
op1_info, op1_def_info, op1_addr, op2_info,
op1_data_info, OP1_DATA_RANGE(),
zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) {
CHECK_OP2_TRACE_TYPE();
op1_data_info = OP1_DATA_INFO();
CHECK_OP1_DATA_TRACE_TYPE();
- if (!zend_jit_assign_dim(&dasm_state, opline, op_array,
+ if (!zend_jit_assign_dim(&dasm_state, opline,
op1_info, op1_addr, op2_info, op1_data_info,
zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) {
goto jit_failure;
if (!zend_jit_fetch_reference(&dasm_state, opline, orig_op1_type, &op1_info, &op1_addr, 0)) {
goto jit_failure;
}
- if (!zend_jit_assign_to_typed_ref(&dasm_state, opline, op_array, opline->op2_type, op2_addr, 1)) {
+ if (!zend_jit_assign_to_typed_ref(&dasm_state, opline, opline->op2_type, op2_addr, 1)) {
goto jit_failure;
}
op1_def_addr = op1_addr;
op1_def_info &= ~MAY_BE_REF;
}
}
- if (!zend_jit_assign(&dasm_state, opline, op_array,
+ if (!zend_jit_assign(&dasm_state, opline,
op1_info, op1_addr,
op1_def_info, op1_def_addr,
op2_info, op2_addr, op2_def_addr,
op1_info = OP1_INFO();
CHECK_OP1_TRACE_TYPE();
res_info = RES_INFO();
- if (!zend_jit_qm_assign(&dasm_state, opline, op_array,
+ if (!zend_jit_qm_assign(&dasm_state, opline,
op1_info, op1_addr, op1_def_addr,
res_info, RES_REG_ADDR())) {
goto jit_failure;
}
op1_info = OP1_INFO();
CHECK_OP1_TRACE_TYPE();
- if (!zend_jit_send_val(&dasm_state, opline, op_array,
+ if (!zend_jit_send_val(&dasm_state, opline,
op1_info, OP1_REG_ADDR())) {
goto jit_failure;
}
|| !JIT_G(current_frame)->call->func)) {
break;
}
- if (!zend_jit_check_func_arg(&dasm_state, opline, op_array)) {
+ if (!zend_jit_check_func_arg(&dasm_state, opline)) {
goto jit_failure;
}
goto done;
if (ra) {
zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra);
}
- exit_point = zend_jit_trace_get_exit_point(opline, exit_opline, p + 1, 0);
+ exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
goto jit_failure;
smart_branch_opcode = 0;
exit_addr = NULL;
}
- if (!zend_jit_cmp(&dasm_state, opline, op_array,
+ if (!zend_jit_cmp(&dasm_state, opline,
op1_info, OP1_REG_ADDR(),
op2_info, OP2_REG_ADDR(),
RES_REG_ADDR(),
if (ra) {
zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra);
}
- exit_point = zend_jit_trace_get_exit_point(opline, exit_opline, p + 1, 0);
+ exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
goto jit_failure;
smart_branch_opcode = 0;
exit_addr = NULL;
}
- if (!zend_jit_identical(&dasm_state, opline, op_array,
+ if (!zend_jit_identical(&dasm_state, opline,
op1_info, OP1_REG_ADDR(),
op2_info, OP2_REG_ADDR(),
RES_REG_ADDR(),
if ((opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
zend_bool exit_if_true = 0;
const zend_op *exit_opline = zend_jit_trace_get_exit_opline(p + 1, opline + 1, &exit_if_true);
- uint32_t exit_point = zend_jit_trace_get_exit_point(opline, exit_opline, p + 1, 0);
+ uint32_t exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
smart_branch_opcode = 0;
exit_addr = NULL;
}
- if (!zend_jit_defined(&dasm_state, opline, op_array, smart_branch_opcode, -1, -1, exit_addr)) {
+ if (!zend_jit_defined(&dasm_state, opline, smart_branch_opcode, -1, -1, exit_addr)) {
goto jit_failure;
}
goto done;
if (ra) {
zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra);
}
- exit_point = zend_jit_trace_get_exit_point(opline, exit_opline, p + 1, 0);
+ exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
goto jit_failure;
smart_branch_opcode = 0;
exit_addr = NULL;
}
- if (!zend_jit_type_check(&dasm_state, opline, op_array, op1_info, smart_branch_opcode, -1, -1, exit_addr)) {
+ if (!zend_jit_type_check(&dasm_state, opline, op1_info, smart_branch_opcode, -1, -1, exit_addr)) {
goto jit_failure;
}
goto done;
&& TRACE_FRAME_IS_RETURN_VALUE_USED(JIT_G(current_frame))) {
continue;
}
- info = zend_ssa_cv_info(opline, op_array, op_array_ssa, j);
+ info = zend_ssa_cv_info(op_array, op_array_ssa, j);
type = STACK_TYPE(stack, j);
info = zend_jit_trace_type_to_info_ex(type, info);
if (info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) {
- if (!zend_jit_free_cv(&dasm_state, opline, op_array, info, j)) {
+ if (!zend_jit_free_cv(&dasm_state, info, j)) {
goto jit_failure;
}
if (info & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_RESOURCE)) {
}
}
}
- if (!zend_jit_leave_func(&dasm_state, opline, op_array, p + 1, &zend_jit_traces[ZEND_JIT_TRACE_NUM], may_throw)) {
+ if (!zend_jit_leave_func(&dasm_state, op_array, p + 1, &zend_jit_traces[ZEND_JIT_TRACE_NUM], may_throw)) {
goto jit_failure;
}
}
case ZEND_BOOL_NOT:
op1_info = OP1_INFO();
CHECK_OP1_TRACE_TYPE();
- if (!zend_jit_bool_jmpznz(&dasm_state, opline, op_array,
+ if (!zend_jit_bool_jmpznz(&dasm_state, opline,
op1_info, OP1_REG_ADDR(), RES_REG_ADDR(),
-1, -1,
zend_may_throw(opline, ssa_op, op_array, ssa),
uint32_t old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN);
- exit_point = zend_jit_trace_get_exit_point(opline, exit_opline, p+1, 0);
+ exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_info);
} else {
- exit_point = zend_jit_trace_get_exit_point(opline, exit_opline, p+1, 0);
+ exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
}
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
}
op1_info = OP1_INFO();
CHECK_OP1_TRACE_TYPE();
- if (!zend_jit_bool_jmpznz(&dasm_state, opline, op_array,
+ if (!zend_jit_bool_jmpznz(&dasm_state, opline,
op1_info, OP1_REG_ADDR(), res_addr,
-1, -1,
zend_may_throw(opline, ssa_op, op_array, ssa),
if ((opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
zend_bool exit_if_true = 0;
const zend_op *exit_opline = zend_jit_trace_get_exit_opline(p + 1, opline + 1, &exit_if_true);
- uint32_t exit_point = zend_jit_trace_get_exit_point(opline, exit_opline, p + 1, 0);
+ uint32_t exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
smart_branch_opcode = 0;
exit_addr = NULL;
}
- if (!zend_jit_isset_isempty_cv(&dasm_state, opline, op_array,
+ if (!zend_jit_isset_isempty_cv(&dasm_state, opline,
op1_info, op1_addr,
smart_branch_opcode, -1, -1, exit_addr)) {
goto jit_failure;
op2_info = OP2_INFO();
CHECK_OP2_TRACE_TYPE();
res_info = RES_INFO();
- if (!zend_jit_fetch_dim_read(&dasm_state, opline, op_array, ssa, ssa_op,
+ if (!zend_jit_fetch_dim_read(&dasm_state, opline, ssa, ssa_op,
op1_info, op1_addr, op2_info, res_info, RES_REG_ADDR(),
(
(op1_info & MAY_BE_ANY) != MAY_BE_ARRAY ||
uint32_t old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var));
SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->op1.var), ZREG_NONE);
- exit_point = zend_jit_trace_get_exit_point(opline, exit_opline, p + 1, 0);
+ exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var), old_info);
} else {
- exit_point = zend_jit_trace_get_exit_point(opline, exit_opline, p + 1, 0);
+ exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
}
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
smart_branch_opcode = 0;
exit_addr = NULL;
}
- if (!zend_jit_isset_isempty_dim(&dasm_state, opline, op_array,
+ if (!zend_jit_isset_isempty_dim(&dasm_state, opline,
op1_info, op1_addr, op2_info,
zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info),
smart_branch_opcode, -1, -1,
} else {
op1_info = OP1_INFO();
}
- if (!zend_jit_bind_global(&dasm_state, opline, op_array, op1_info)) {
+ if (!zend_jit_bind_global(&dasm_state, opline, op1_info)) {
goto jit_failure;
}
if ((opline+1)->opcode == ZEND_BIND_GLOBAL) {
case ZEND_FREE:
case ZEND_FE_FREE:
op1_info = OP1_INFO();
- if (!zend_jit_free(&dasm_state, opline, op_array, op1_info,
+ if (!zend_jit_free(&dasm_state, opline, op1_info,
zend_may_throw(opline, ssa_op, op_array, ssa))) {
goto jit_failure;
}
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_STRING) {
break;
}
- if (!zend_jit_echo(&dasm_state, opline, op_array, op1_info)) {
+ if (!zend_jit_echo(&dasm_state, opline, op1_info)) {
goto jit_failure;
}
goto done;
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_STRING) {
break;
}
- if (!zend_jit_strlen(&dasm_state, opline, op_array, op1_info)) {
+ if (!zend_jit_strlen(&dasm_state, opline, op1_info)) {
goto jit_failure;
}
goto done;
goto jit_failure;
}
if ((p+1)->op == ZEND_JIT_TRACE_INIT_CALL && (p+1)->func) {
- if (!zend_jit_init_fcall_guard(&dasm_state, opline, (p+1)->func, opline+1)) {
+ if (!zend_jit_init_fcall_guard(&dasm_state, (p+1)->func, opline+1)) {
goto jit_failure;
}
}
if ((opline->op1_type != IS_CONST
|| opline->op2_type != IS_CONST)
&& (p+1)->op == ZEND_JIT_TRACE_INIT_CALL && (p+1)->func) {
- if (!zend_jit_init_fcall_guard(&dasm_state, opline, (p+1)->func, opline+1)) {
+ if (!zend_jit_init_fcall_guard(&dasm_state, (p+1)->func, opline+1)) {
goto jit_failure;
}
}
}
if (opline->op2_type != IS_CONST
&& (p+1)->op == ZEND_JIT_TRACE_INIT_CALL && (p+1)->func) {
- if (!zend_jit_init_fcall_guard(&dasm_state, opline, (p+1)->func, opline+1)) {
+ if (!zend_jit_init_fcall_guard(&dasm_state, (p+1)->func, opline+1)) {
goto jit_failure;
}
}
if (opline->op1_type != IS_CONST
&& (p+1)->op == ZEND_JIT_TRACE_INIT_CALL && (p+1)->func) {
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_OBJECT);
- if (!zend_jit_init_fcall_guard(&dasm_state, opline, (p+1)->func, opline+1)) {
+ if (!zend_jit_init_fcall_guard(&dasm_state, (p+1)->func, opline+1)) {
goto jit_failure;
}
}
if ((p+1)->op == ZEND_JIT_TRACE_END) {
p++;
- zend_jit_set_opline(&dasm_state, p->opline);
+ zend_jit_set_opline(p->opline);
break;
}
op_array = (zend_op_array*)p->op_array;
}
}
}
- zend_jit_set_opline(&dasm_state, (p+1)->opline);
+ zend_jit_set_opline((p+1)->opline);
} else if (p->op == ZEND_JIT_TRACE_BACK) {
op_array = (zend_op_array*)p->op_array;
jit_extension =
opline = q->opline;
ZEND_ASSERT(opline != NULL);
}
- if (!zend_jit_init_fcall_guard(&dasm_state, NULL, p->func, opline)) {
+ if (!zend_jit_init_fcall_guard(&dasm_state, p->func, opline)) {
goto jit_failure;
}
}
|| }
|.endmacro
-|.macro FREE_OP, op_type, op, op_info, cold, op_array, opline
+|.macro FREE_OP, op_type, op, op_info, cold, opline
|| if (op_type & (IS_VAR|IS_TMP_VAR)) {
| ZVAL_PTR_DTOR ZEND_ADDR_MEM_ZVAL(ZREG_FP, op.var), op_info, 0, cold, opline
|| }
static int zend_jit_trace_opline_guard(dasm_State **Dst, const zend_op *opline)
{
- uint32_t exit_point = zend_jit_trace_get_exit_point(NULL, NULL, NULL, 0);
+ uint32_t exit_point = zend_jit_trace_get_exit_point(NULL, 0);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
static int zend_jit_type_guard(dasm_State **Dst, const zend_op *opline, uint32_t var, uint8_t type)
{
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, 0);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN);
}
- exit_point = zend_jit_trace_get_exit_point(opline, exit_opline, trace, 0);
+ exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (opline->result_type == IS_VAR || opline->result_type == IS_TMP_VAR) {
return 1;
}
-static int zend_jit_set_opline(dasm_State **Dst, const zend_op *target_opline)
+static void zend_jit_set_opline(const zend_op *target_opline)
{
if (!reuse_ip) {
last_valid_opline = target_opline;
}
- return 1;
}
-static int zend_jit_reset_opline(dasm_State **Dst, const zend_op *target_opline)
+static void zend_jit_reset_opline(void)
{
last_valid_opline = NULL;
- return 1;
}
static void zend_jit_start_reuse_ip(void) {
return 1;
}
-static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op1_def_info, zend_jit_addr op1_def_addr, uint32_t res_use_info, uint32_t res_info, zend_jit_addr res_addr, int may_overflow, int may_throw)
+static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op1_def_info, zend_jit_addr op1_def_addr, uint32_t res_use_info, uint32_t res_info, zend_jit_addr res_addr, int may_overflow, int may_throw)
{
if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)-MAY_BE_LONG)) {
| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >2
}
}
- exit_point = zend_jit_trace_get_exit_point(opline, opline + 1, NULL, 0);
+ exit_point = zend_jit_trace_get_exit_point(opline + 1, 0);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
| jo &exit_addr
}
static int zend_jit_math_long_long(dasm_State **Dst,
- const zend_op_array *op_array,
const zend_op *opline,
zend_uchar opcode,
zend_jit_addr op1_addr,
}
if (may_overflow) {
if (res_info & MAY_BE_GUARD) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, 0);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
| jo &exit_addr
} else {
static int zend_jit_math_helper(dasm_State **Dst,
const zend_op *opline,
zend_uchar opcode,
- const zend_op_array *op_array,
zend_uchar op1_type,
znode_op op1,
zend_jit_addr op1_addr,
| IF_NOT_ZVAL_TYPE op2_addr, IS_LONG, >6
}
}
- if (!zend_jit_math_long_long(Dst, op_array, opline, opcode, op1_addr, op2_addr, res_addr, res_info, res_use_info, may_overflow)) {
+ if (!zend_jit_math_long_long(Dst, opline, opcode, op1_addr, op2_addr, res_addr, res_info, res_use_info, may_overflow)) {
return 0;
}
if (op1_info & MAY_BE_DOUBLE) {
|.if not(X64)
| add r4, 12
|.endif
- | FREE_OP op1_type, op1, op1_info, 0, op_array, opline
- | FREE_OP op2_type, op2, op2_info, 0, op_array, opline
+ | FREE_OP op1_type, op1, op1_info, 0, opline
+ | FREE_OP op2_type, op2, op2_info, 0, opline
if (may_throw) {
zend_jit_check_exception(Dst);
}
return 1;
}
-static int zend_jit_math(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, zend_jit_addr op2_addr, uint32_t res_use_info, uint32_t res_info, zend_jit_addr res_addr, zend_bool send_result, int may_overflow, int may_throw)
+static int zend_jit_math(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, uint32_t res_use_info, uint32_t res_info, zend_jit_addr res_addr, zend_bool send_result, int may_overflow, int may_throw)
{
ZEND_ASSERT(!(op1_info & MAY_BE_UNDEF) && !(op2_info & MAY_BE_UNDEF));
ZEND_ASSERT((op1_info & (MAY_BE_LONG|MAY_BE_DOUBLE)) &&
res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_RX, (opline+1)->result.var);
}
- if (!zend_jit_math_helper(Dst, opline, opline->opcode, op_array, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, opline->result.var, res_addr, res_info, res_use_info, may_overflow, may_throw)) {
+ if (!zend_jit_math_helper(Dst, opline, opline->opcode, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, opline->result.var, res_addr, res_info, res_use_info, may_overflow, may_throw)) {
return 0;
}
if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, res_info)) {
return 1;
}
-static int zend_jit_add_arrays(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, uint32_t op2_info)
+static int zend_jit_add_arrays(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, uint32_t op2_info)
{
zend_jit_addr op1_addr = OP1_ADDR();
zend_jit_addr op2_addr = OP2_ADDR();
| EXT_CALL zend_jit_add_arrays_helper, r0
| SET_ZVAL_PTR res_addr, r0
| SET_ZVAL_TYPE_INFO res_addr, IS_ARRAY_EX
- | FREE_OP opline->op1_type, opline->op1, op1_info, 0, op_array, opline
- | FREE_OP opline->op2_type, opline->op2, op2_info, 0, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline
+ | FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline
return 1;
}
static int zend_jit_long_math_helper(dasm_State **Dst,
const zend_op *opline,
zend_uchar opcode,
- const zend_op_array *op_array,
zend_uchar op1_type,
znode_op op1,
zend_jit_addr op1_addr,
|.if not(X64)
| add r4, 12
|.endif
- | FREE_OP op1_type, op1, op1_info, 0, op_array, opline
- | FREE_OP op2_type, op2, op2_info, 0, op_array, opline
+ | FREE_OP op1_type, op1, op1_info, 0, opline
+ | FREE_OP op2_type, op2, op2_info, 0, opline
if (may_throw) {
zend_jit_check_exception(Dst);
}
return 1;
}
-static int zend_jit_long_math(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_ssa_range *op1_range, zend_jit_addr op1_addr, uint32_t op2_info, zend_ssa_range *op2_range, zend_jit_addr op2_addr, uint32_t res_use_info, uint32_t res_info, zend_jit_addr res_addr, zend_bool send_result, int may_throw)
+static int zend_jit_long_math(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_ssa_range *op1_range, zend_jit_addr op1_addr, uint32_t op2_info, zend_ssa_range *op2_range, zend_jit_addr op2_addr, uint32_t res_use_info, uint32_t res_info, zend_jit_addr res_addr, zend_bool send_result, int may_throw)
{
ZEND_ASSERT(!(op1_info & MAY_BE_UNDEF) && !(op2_info & MAY_BE_UNDEF));
ZEND_ASSERT((op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_LONG));
res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_RX, (opline+1)->result.var);
}
- if (!zend_jit_long_math_helper(Dst, opline, opline->opcode, op_array,
+ if (!zend_jit_long_math_helper(Dst, opline, opline->opcode,
opline->op1_type, opline->op1, op1_addr, op1_info, op1_range,
opline->op2_type, opline->op2, op2_addr, op2_info, op2_range,
opline->result.var, res_addr, res_info, res_use_info, may_throw)) {
static int zend_jit_concat_helper(dasm_State **Dst,
const zend_op *opline,
- const zend_op_array *op_array,
zend_uchar op1_type,
znode_op op1,
zend_jit_addr op1_addr,
zend_jit_addr op2_addr,
uint32_t op2_info,
zend_jit_addr res_addr,
- uint32_t res_info,
int may_throw)
{
#if 1
| add r4, 12
|.endif
}
- | FREE_OP op1_type, op1, op1_info, 0, op_array, opline
- | FREE_OP op2_type, op2, op2_info, 0, op_array, opline
+ | FREE_OP op1_type, op1, op1_info, 0, opline
+ | FREE_OP op2_type, op2, op2_info, 0, opline
|5:
}
if ((op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF) - MAY_BE_STRING)) ||
|.if not(X64)
| add r4, 12
|.endif
- | FREE_OP op1_type, op1, op1_info, 0, op_array, opline
- | FREE_OP op2_type, op2, op2_info, 0, op_array, opline
+ | FREE_OP op1_type, op1, op1_info, 0, opline
+ | FREE_OP op2_type, op2, op2_info, 0, opline
if (may_throw) {
zend_jit_check_exception(Dst);
}
return 1;
}
-static int zend_jit_concat(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, uint32_t op2_info, uint32_t res_info, zend_bool send_result, int may_throw)
+static int zend_jit_concat(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, uint32_t op2_info, zend_bool send_result, int may_throw)
{
zend_jit_addr op1_addr, op2_addr, res_addr;
} else {
res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
}
- return zend_jit_concat_helper(Dst, opline, op_array, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, res_addr, res_info, may_throw);
+ return zend_jit_concat_helper(Dst, opline, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, res_addr, may_throw);
}
-static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_op *opline, uint32_t type, uint32_t op1_info, uint32_t op2_info, uint32_t found, uint32_t not_found, const void *found_exit_addr, const void *not_found_exit_addr, const void *exit_addr)
+static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_op *opline, uint32_t type, uint32_t op1_info, uint32_t op2_info, const void *found_exit_addr, const void *not_found_exit_addr, const void *exit_addr)
/* Labels: 1,2,3,4,5 */
{
zend_jit_addr op2_addr = OP2_ADDR();
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE
&& type == BP_VAR_R
&& !exit_addr) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
return 0;
static int zend_jit_simple_assign(dasm_State **Dst,
const zend_op *opline,
- const zend_op_array *op_array,
zend_jit_addr var_addr,
uint32_t var_info,
uint32_t var_def_info,
static int zend_jit_assign_to_typed_ref(dasm_State **Dst,
const zend_op *opline,
- const zend_op_array *op_array,
zend_uchar val_type,
zend_jit_addr val_addr,
zend_bool check_exception)
static int zend_jit_assign_to_variable(dasm_State **Dst,
const zend_op *opline,
- const zend_op_array *op_array,
zend_jit_addr var_use_addr,
zend_jit_addr var_addr,
uint32_t var_info,
| IF_NOT_Z_TYPE, FCARG1a, IS_REFERENCE, >1
| // if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) {
| GET_Z_PTR FCARG1a, FCARG1a
- if (!zend_jit_assign_to_typed_ref(Dst, opline, op_array, val_type, val_addr, check_exception)) {
+ if (!zend_jit_assign_to_typed_ref(Dst, opline, val_type, val_addr, check_exception)) {
return 0;
}
| add FCARG1a, offsetof(zend_reference, val)
if (Z_REG(var_use_addr) == ZREG_FCARG1a) {
| GET_ZVAL_PTR r0, var_use_addr
| mov aword T1, r0 // save
- if (!zend_jit_simple_assign(Dst, opline, op_array, var_addr, var_info, var_def_info, val_type, val, val_addr, val_info, res_addr, in_cold, 0)) {
+ if (!zend_jit_simple_assign(Dst, opline, var_addr, var_info, var_def_info, val_type, val, val_addr, val_info, res_addr, in_cold, 0)) {
return 0;
}
if (Z_REG(var_use_addr) == ZREG_FCARG1a) {
}
} else {
| GET_ZVAL_PTR FCARG1a, var_use_addr
- if (!zend_jit_simple_assign(Dst, opline, op_array, var_addr, var_info, var_def_info, val_type, val, val_addr, val_info, res_addr, in_cold, 1)) {
+ if (!zend_jit_simple_assign(Dst, opline, var_addr, var_info, var_def_info, val_type, val, val_addr, val_info, res_addr, in_cold, 1)) {
return 0;
}
}
}
}
- if (!done && !zend_jit_simple_assign(Dst, opline, op_array, var_addr, var_info, var_def_info, val_type, val, val_addr, val_info, res_addr, 0, 0)) {
+ if (!done && !zend_jit_simple_assign(Dst, opline, var_addr, var_info, var_def_info, val_type, val, val_addr, val_info, res_addr, 0, 0)) {
return 0;
}
return 1;
}
-static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t val_info, int may_throw)
+static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t val_info, int may_throw)
{
zend_jit_addr op2_addr, op3_addr, res_addr;
|.code
| mov FCARG1a, r0
- if (!zend_jit_simple_assign(Dst, opline, op_array, var_addr, var_info, -1, (opline+1)->op1_type, (opline+1)->op1, op3_addr, val_info, res_addr, 0, 0)) {
+ if (!zend_jit_simple_assign(Dst, opline, var_addr, var_info, -1, (opline+1)->op1_type, (opline+1)->op1, op3_addr, val_info, res_addr, 0, 0)) {
return 0;
}
} else {
uint32_t var_info = zend_array_element_type(op1_info, opline->op1_type, 0, 0);
zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0);
- if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_VAR_W, op1_info, op2_info, 8, 8, NULL, NULL, NULL)) {
+ if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_VAR_W, op1_info, op2_info, NULL, NULL, NULL)) {
return 0;
}
var_info |= MAY_BE_RC1;
}
| // value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE);
- if (!zend_jit_assign_to_variable(Dst, opline, op_array, var_addr, var_addr, var_info, -1, (opline+1)->op1_type, (opline+1)->op1, op3_addr, val_info, res_addr, 0)) {
+ if (!zend_jit_assign_to_variable(Dst, opline, var_addr, var_addr, var_info, -1, (opline+1)->op1_type, (opline+1)->op1, op3_addr, val_info, res_addr, 0)) {
return 0;
}
}
}
#endif
- | FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, op_array, opline
+ | FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, opline
}
if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) {
#endif
|9:
- | FREE_OP opline->op2_type, opline->op2, op2_info, 0, op_array, opline
+ | FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline
if (may_throw) {
zend_jit_check_exception(Dst);
return 1;
}
-static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, uint32_t op1_def_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t op1_data_info, zend_ssa_range *op1_data_range, int may_throw)
+static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, uint32_t op1_def_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t op1_data_info, zend_ssa_range *op1_data_range, int may_throw)
{
zend_jit_addr op2_addr, op3_addr, var_addr;
var_info |= MAY_BE_RC1;
}
- if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_VAR_RW, op1_info, op2_info, 8, 8, NULL, NULL, NULL)) {
+ if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_VAR_RW, op1_info, op2_info, NULL, NULL, NULL)) {
return 0;
}
case ZEND_SUB:
case ZEND_MUL:
case ZEND_DIV:
- if (!zend_jit_math_helper(Dst, opline, opline->extended_value, op_array, IS_CV, opline->op1, var_addr, var_info, (opline+1)->op1_type, (opline+1)->op1, op3_addr, op1_data_info, 0, var_addr, var_def_info, var_info,
+ if (!zend_jit_math_helper(Dst, opline, opline->extended_value, IS_CV, opline->op1, var_addr, var_info, (opline+1)->op1_type, (opline+1)->op1, op3_addr, op1_data_info, 0, var_addr, var_def_info, var_info,
1 /* may overflow */, may_throw)) {
return 0;
}
case ZEND_SL:
case ZEND_SR:
case ZEND_MOD:
- if (!zend_jit_long_math_helper(Dst, opline, opline->extended_value, op_array,
+ if (!zend_jit_long_math_helper(Dst, opline, opline->extended_value,
IS_CV, opline->op1, var_addr, var_info, NULL,
(opline+1)->op1_type, (opline+1)->op1, op3_addr, op1_data_info,
op1_data_range,
}
break;
case ZEND_CONCAT:
- if (!zend_jit_concat_helper(Dst, opline, op_array, IS_CV, opline->op1, var_addr, var_info, (opline+1)->op1_type, (opline+1)->op1, op3_addr, op1_data_info, var_addr, op1_def_info,
+ if (!zend_jit_concat_helper(Dst, opline, IS_CV, opline->op1, var_addr, var_info, (opline+1)->op1_type, (opline+1)->op1, op3_addr, op1_data_info, var_addr,
may_throw)) {
return 0;
}
return 1;
}
-static int zend_jit_assign_op(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, uint32_t op1_def_info, zend_ssa_range *op1_range, uint32_t op2_info, zend_ssa_range *op2_range, int may_overflow, int may_throw)
+static int zend_jit_assign_op(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, uint32_t op1_def_info, zend_ssa_range *op1_range, uint32_t op2_info, zend_ssa_range *op2_range, int may_overflow, int may_throw)
{
zend_jit_addr op1_addr, op2_addr;
case ZEND_SUB:
case ZEND_MUL:
case ZEND_DIV:
- result = zend_jit_math_helper(Dst, opline, opline->extended_value, op_array, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, opline->op1.var, op1_addr, op1_def_info, op1_info, may_overflow, may_throw);
+ result = zend_jit_math_helper(Dst, opline, opline->extended_value, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, opline->op1.var, op1_addr, op1_def_info, op1_info, may_overflow, may_throw);
break;
case ZEND_BW_OR:
case ZEND_BW_AND:
case ZEND_SL:
case ZEND_SR:
case ZEND_MOD:
- result = zend_jit_long_math_helper(Dst, opline, opline->extended_value, op_array,
+ result = zend_jit_long_math_helper(Dst, opline, opline->extended_value,
opline->op1_type, opline->op1, op1_addr, op1_info, op1_range,
opline->op2_type, opline->op2, op2_addr, op2_info, op2_range,
opline->op1.var, op1_addr, op1_def_info, op1_info, may_throw);
break;
case ZEND_CONCAT:
- result = zend_jit_concat_helper(Dst, opline, op_array, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, op1_addr, op1_def_info, may_throw);
+ result = zend_jit_concat_helper(Dst, opline, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, op1_addr, may_throw);
break;
default:
ZEND_UNREACHABLE();
return 1;
}
-static int zend_jit_cmp(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, zend_jit_addr op2_addr, zend_jit_addr res_addr, int may_throw, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
+static int zend_jit_cmp(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, int may_throw, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
{
zend_bool same_ops = (opline->op1_type == opline->op2_type) && (opline->op1.var == opline->op2.var);
zend_bool has_slow;
| add r4, 12
|.endif
if (opline->opcode != ZEND_CASE) {
- | FREE_OP opline->op1_type, opline->op1, op1_info, 0, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline
}
- | FREE_OP opline->op2_type, opline->op2, op2_info, 0, op_array, opline
+ | FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline
if (may_throw) {
zend_jit_check_exception_undef_result(Dst, opline);
}
return 1;
}
-static int zend_jit_identical(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, zend_jit_addr op2_addr, zend_jit_addr res_addr, int may_throw, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
+static int zend_jit_identical(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, int may_throw, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
{
uint32_t identical_label = (uint32_t)-1;
uint32_t not_identical_label = (uint32_t)-1;
((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, 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
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline
+ | FREE_OP opline->op2_type, opline->op2, op2_info, 1, opline
}
if (smart_branch_opcode) {
zend_jit_check_exception_undef_result(Dst, opline);
if (opline->op2_type == IS_VAR && (op2_info & MAY_BE_REF)) {
| jne >8
| SAVE_VALID_OPLINE opline, r0
- | FREE_OP opline->op2_type, opline->op2, op2_info, 1, op_array, opline
+ | FREE_OP opline->op2_type, opline->op2, op2_info, 1, opline
zend_jit_check_exception_undef_result(Dst, opline);
if (exit_addr && smart_branch_opcode == ZEND_JMPNZ) {
| jmp &exit_addr
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, r0
- | FREE_OP opline->op2_type, opline->op2, op2_info, 1, op_array, opline
+ | FREE_OP opline->op2_type, opline->op2, op2_info, 1, opline
zend_jit_check_exception_undef_result(Dst, opline);
}
if (exit_addr) {
if (opline->op1_type == IS_VAR && (op1_info & MAY_BE_REF)) {
| jne >8
| SAVE_VALID_OPLINE opline, r0
- | FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline
zend_jit_check_exception_undef_result(Dst, opline);
if (exit_addr && smart_branch_opcode == ZEND_JMPNZ) {
| jmp &exit_addr
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, r0
- | FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline
zend_jit_check_exception_undef_result(Dst, opline);
}
if (smart_branch_opcode) {
(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, 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
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline
+ | FREE_OP opline->op2_type, opline->op2, op2_info, 1, opline
zend_jit_check_exception_undef_result(Dst, opline);
| mov r0, aword T1 // restore
}
return 1;
}
-static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_addr, zend_jit_addr res_addr, uint32_t target_label, uint32_t target_label2, int may_throw, zend_uchar branch_opcode, const void *exit_addr)
+static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, zend_jit_addr res_addr, uint32_t target_label, uint32_t target_label2, int may_throw, zend_uchar branch_opcode, const void *exit_addr)
{
uint32_t true_label = -1;
uint32_t false_label = -1;
return 1;
}
-static int zend_jit_qm_assign(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_addr, zend_jit_addr op1_def_addr, uint32_t res_info, zend_jit_addr res_addr)
+static int zend_jit_qm_assign(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, zend_jit_addr op1_def_addr, uint32_t res_info, zend_jit_addr res_addr)
{
if (op1_addr != op1_def_addr) {
if (!zend_jit_update_regs(Dst, op1_addr, op1_def_addr, op1_info)) {
}
}
- if (!zend_jit_simple_assign(Dst, opline, op_array, res_addr, -1, -1, opline->op1_type, opline->op1, op1_addr, op1_info, 0, 0, 0)) {
+ if (!zend_jit_simple_assign(Dst, opline, res_addr, -1, -1, opline->op1_type, opline->op1, op1_addr, op1_info, 0, 0, 0)) {
return 0;
}
if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, res_info)) {
return 1;
}
-static int zend_jit_assign(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_use_addr, uint32_t op1_def_info, zend_jit_addr op1_addr, uint32_t op2_info, zend_jit_addr op2_addr, zend_jit_addr op2_def_addr, uint32_t res_info, zend_jit_addr res_addr, int may_throw)
+static int zend_jit_assign(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_use_addr, uint32_t op1_def_info, zend_jit_addr op1_addr, uint32_t op2_info, zend_jit_addr op2_addr, zend_jit_addr op2_def_addr, uint32_t res_info, zend_jit_addr res_addr, int may_throw)
{
ZEND_ASSERT(opline->op1_type == IS_CV);
/* Force type update */
op1_info |= MAY_BE_UNDEF;
}
- if (!zend_jit_assign_to_variable(Dst, opline, op_array, op1_use_addr, op1_addr, op1_info, op1_def_info, opline->op2_type, opline->op2, op2_addr, op2_info, res_addr,
+ if (!zend_jit_assign_to_variable(Dst, opline, op1_use_addr, op1_addr, op1_info, op1_def_info, opline->op2_type, opline->op2, op2_addr, op2_info, res_addr,
may_throw)) {
return 0;
}
return 1;
}
-static int zend_jit_push_call_frame(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_function *func)
+static int zend_jit_push_call_frame(dasm_State **Dst, const zend_op *opline, zend_function *func)
{
uint32_t used_stack;
}
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
}
}
-static int zend_jit_init_fcall_guard(dasm_State **Dst, const zend_op *opline, const zend_function *func, const zend_op *to_opline)
+static int zend_jit_init_fcall_guard(dasm_State **Dst, const zend_function *func, const zend_op *to_opline)
{
int32_t exit_point;
const void *exit_addr;
return 0;
}
- exit_point = zend_jit_trace_get_exit_point(opline, to_opline, NULL, ZEND_JIT_EXIT_POLYMORPHISM);
+ exit_point = zend_jit_trace_get_exit_point(to_opline, ZEND_JIT_EXIT_POLYMORPHISM);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
return 0;
| mov r1, EX->run_time_cache
| mov aword [r1 + opline->result.num], r0
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, 0);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
|3:
}
- if (!zend_jit_push_call_frame(Dst, opline, op_array, func)) {
+ if (!zend_jit_push_call_frame(Dst, opline, func)) {
return 0;
}
if (opline->opcode == ZEND_DO_FCALL) {
if (!func) {
if (trace) {
- uint32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ uint32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
if (opline->opcode == ZEND_DO_FCALL_BY_NAME) {
if (!func) {
if (trace) {
- uint32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ uint32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
| // EG(current_execute_data) = execute_data;
| MEM_OP2_1_ZTS mov, aword, executor_globals, current_execute_data, RX, r1
- zend_jit_reset_opline(Dst, NULL);
+ zend_jit_reset_opline();
| // fbc->internal_function.handler(call, ret);
| mov FCARG1a, RX
// TODO: Can we avoid checking for interrupts after each call ???
if (trace && last_valid_opline != opline) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline + 1, NULL, ZEND_JIT_EXIT_TO_VM);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline + 1, ZEND_JIT_EXIT_TO_VM);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
return 1;
}
-static int zend_jit_send_val(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_addr)
+static int zend_jit_send_val(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr)
{
uint32_t arg_num = opline->op2.num;
zend_jit_addr arg_addr;
return 0;
}
} else if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
return 0;
}
|6:
- | FREE_OP opline->op1_type, opline->op1, op1_info, !cold, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, !cold, opline
|7:
return 1;
/* Don't generate code that always throws exception */
return 0;
} else {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
return 0;
| test dword [r0 + offsetof(zend_function, quick_arg_flags)], mask
| jnz >7
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
return 0;
| je >7
}
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
return 0;
return 1;
}
-static int zend_jit_check_func_arg(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array)
+static int zend_jit_check_func_arg(dasm_State **Dst, const zend_op *opline)
{
uint32_t arg_num = opline->op2.num;
return 1;
}
-static int zend_jit_defined(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
+static int zend_jit_defined(dasm_State **Dst, const zend_op *opline, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
{
uint32_t defined_label = (uint32_t)-1;
uint32_t undefined_label = (uint32_t)-1;
return 1;
}
-static int zend_jit_type_check(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
+static int zend_jit_type_check(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
{
uint32_t mask;
zend_uchar type;
}
if (!(op1_info & MAY_BE_GUARD) && !(op1_info & (MAY_BE_ANY - mask))) {
- | FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline
if (exit_addr) {
if (smart_branch_opcode == ZEND_JMPNZ) {
| jmp &exit_addr
return 0;
}
} else if (!(op1_info & MAY_BE_GUARD) && !(op1_info & mask)) {
- | FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline
if (exit_addr) {
if (smart_branch_opcode == ZEND_JMPZ) {
| jmp &exit_addr
| movzx eax, al
| add eax, 2
| SET_ZVAL_TYPE_INFO res_addr, eax
- | FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline
}
} else {
if (smart_branch_opcode &&
| movzx eax, al
| add eax, 2
| SET_ZVAL_TYPE_INFO res_addr, eax
- | FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline
}
}
}
return 1;
}
-static uint32_t zend_ssa_cv_info(const zend_op *opline, const zend_op_array *op_array, zend_ssa *ssa, uint32_t var)
+static uint32_t zend_ssa_cv_info(const zend_op_array *op_array, zend_ssa *ssa, uint32_t var)
{
uint32_t j, info;
return 1;
}
-static int zend_jit_free_cv(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t info, uint32_t var)
+static int zend_jit_free_cv(dasm_State **Dst, uint32_t info, uint32_t var)
{
if (info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) {
uint32_t offset = EX_NUM_TO_VAR(var);
return 1;
}
-static int zend_jit_free_op(dasm_State **Dst, const zend_op *opline, /*const zend_op_array *op_array, */uint32_t info, uint32_t var_offset)
+static int zend_jit_free_op(dasm_State **Dst, const zend_op *opline, uint32_t info, uint32_t var_offset)
{
if (info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) {
| ZVAL_PTR_DTOR ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset), info, 0, 1, opline
return 1;
}
-static int zend_jit_leave_func(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_jit_trace_rec *trace, zend_jit_trace_info *trace_info, int may_throw)
+static int zend_jit_leave_func(dasm_State **Dst, const zend_op_array *op_array, zend_jit_trace_rec *trace, zend_jit_trace_info *trace_info, int may_throw)
{
/* ZEND_CALL_FAKE_CLOSURE handled on slow path to eliminate check for ZEND_CALL_CLOSURE on fast path */
| mov FCARG1d, dword [FP + offsetof(zend_execute_data, This.u1.type_info)]
if (trace) {
if (trace->op != ZEND_JIT_TRACE_END
&& (JIT_G(current_frame) && !TRACE_FRAME_IS_UNKNOWN_RETURN(JIT_G(current_frame)))) {
- zend_jit_reset_opline(Dst, NULL);
+ zend_jit_reset_opline();
} else {
| LOAD_OPLINE
| ADD_IP sizeof(zend_op)
ZEND_ASSERT(next_opline != NULL);
current_frame = JIT_G(current_frame);
JIT_G(current_frame) = NULL;
- exit_point = zend_jit_trace_get_exit_point(opline, NULL, trace, 0);
+ exit_point = zend_jit_trace_get_exit_point(NULL, 0);
JIT_G(current_frame) = current_frame;
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
return 0;
}
-static int zend_jit_fetch_dim_read(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_ssa *ssa, const zend_ssa_op *ssa_op, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t res_info, zend_jit_addr res_addr, int may_throw)
+static int zend_jit_fetch_dim_read(dasm_State **Dst, const zend_op *opline, zend_ssa *ssa, const zend_ssa_op *ssa_op, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t res_info, zend_jit_addr res_addr, int may_throw)
{
zend_jit_addr orig_op1_addr, op2_addr;
const void *exit_addr = NULL;
if (opline->opcode != ZEND_FETCH_DIM_IS
&& JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
return 0;
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN);
SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_ZVAL_COPY_R0);
- exit_point = zend_jit_trace_get_exit_point(opline, opline+1, NULL, flags);
+ exit_point = zend_jit_trace_get_exit_point(opline+1, flags);
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_info);
res_exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!res_exit_addr) {
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_NULL);
SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_NULL);
- exit_point = zend_jit_trace_get_exit_point(opline, opline+1, NULL, flags);
+ exit_point = zend_jit_trace_get_exit_point(opline+1, flags);
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_info);
not_found_exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!not_found_exit_addr) {
}
}
| GET_ZVAL_LVAL ZREG_FCARG1a, op1_addr
- if (!zend_jit_fetch_dimension_address_inner(Dst, opline, (opline->opcode != ZEND_FETCH_DIM_IS) ? BP_VAR_R : BP_VAR_IS, op1_info, op2_info, 8, 9, NULL, not_found_exit_addr, exit_addr)) {
+ if (!zend_jit_fetch_dimension_address_inner(Dst, opline, (opline->opcode != ZEND_FETCH_DIM_IS) ? BP_VAR_R : BP_VAR_IS, op1_info, op2_info, NULL, not_found_exit_addr, exit_addr)) {
return 0;
}
}
}
#endif
- | FREE_OP opline->op2_type, opline->op2, op2_info, 0, op_array, opline
+ | FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline
if (!(op1_info & AVOID_REFCOUNTING)) {
- | FREE_OP opline->op1_type, opline->op1, op1_info, 0, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline
}
if (may_throw) {
return 1;
}
-static int zend_jit_isset_isempty_dim(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, int may_throw, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
+static int zend_jit_isset_isempty_dim(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, int may_throw, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
{
zend_jit_addr op2_addr, res_addr;
not_found_exit_addr = exit_addr;
}
}
- if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_JIT_IS, op1_info, op2_info, 8, 9, found_exit_addr, not_found_exit_addr, NULL)) {
+ if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_JIT_IS, op1_info, op2_info, found_exit_addr, not_found_exit_addr, NULL)) {
return 0;
}
#endif
|8:
- | FREE_OP opline->op2_type, opline->op2, op2_info, 0, op_array, opline
+ | FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline
if (!(op1_info & AVOID_REFCOUNTING)) {
- | FREE_OP opline->op1_type, opline->op1, op1_info, 0, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline
}
if (may_throw) {
if (!zend_jit_check_exception_undef_result(Dst, opline)) {
}
|9: // not found
- | FREE_OP opline->op2_type, opline->op2, op2_info, 0, op_array, opline
+ | FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline
if (!(op1_info & AVOID_REFCOUNTING)) {
- | FREE_OP opline->op1_type, opline->op1, op1_info, 0, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline
}
if (may_throw) {
if (!zend_jit_check_exception_undef_result(Dst, opline)) {
return 1;
}
-static int zend_jit_bind_global(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info)
+static int zend_jit_bind_global(dasm_State **Dst, const zend_op *opline, uint32_t op1_info)
{
zend_jit_addr op1_addr = OP1_ADDR();
zend_string *varname = Z_STR_P(RT_CONSTANT(opline, opline->op2));
if (arg_info || (opline+1)->opcode != ZEND_RECV) {
| cmp dword EX->This.u2.num_args, arg_num
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
static int zend_jit_class_guard(dasm_State **Dst, const zend_op *opline, zend_class_entry *ce)
{
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, 0);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
}
if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)- MAY_BE_OBJECT)) {
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, prop_info->offset);
| mov edx, dword [FCARG1a + prop_info->offset + 8]
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN);
SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_ZVAL_COPY_R0);
- exit_point = zend_jit_trace_get_exit_point(opline, opline+1, NULL, flags);
+ exit_point = zend_jit_trace_get_exit_point(opline+1, flags);
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_info);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
| EXT_CALL zend_jit_extract_helper, r0
|1:
} else if (!(op1_info & AVOID_REFCOUNTING)) {
- | FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline
}
}
return 1;
}
-static int zend_jit_free(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, int may_throw)
+static int zend_jit_free(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, int may_throw)
{
zend_jit_addr op1_addr = OP1_ADDR();
return 1;
}
-static int zend_jit_echo(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info)
+static int zend_jit_echo(dasm_State **Dst, const zend_op *opline, uint32_t op1_info)
{
if (opline->op1_type == IS_CONST) {
zval *zv;
return 1;
}
-static int zend_jit_strlen(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info)
+static int zend_jit_strlen(dasm_State **Dst, const zend_op *opline, uint32_t op1_info)
{
zend_jit_addr res_addr = RES_ADDR();
if (!JIT_G(current_frame) ||
!TRACE_FRAME_IS_THIS_CHECKED(JIT_G(current_frame))) {
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
| cmp byte EX->This.u1.v.type, IS_OBJECT
if (next_opline) {
if (next_opline != opline + 1) {
- exit_point = zend_jit_trace_get_exit_point(opline, opline + 1, NULL, 0);
+ exit_point = zend_jit_trace_get_exit_point(opline + 1, 0);
fallback_label = zend_jit_trace_get_exit_addr(exit_point);
}
if (next_opline != default_opline) {
- exit_point = zend_jit_trace_get_exit_point(opline, default_opline, NULL, 0);
+ exit_point = zend_jit_trace_get_exit_point(default_opline, 0);
default_label = zend_jit_trace_get_exit_addr(exit_point);
}
}
} else if (next_opline == target) {
| .aword >3
} else {
- exit_point = zend_jit_trace_get_exit_point(opline, target, NULL, 0);
+ exit_point = zend_jit_trace_get_exit_point(target, 0);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
| .aword &exit_addr
}
} else if (next_opline == target) {
| .aword >3
} else {
- exit_point = zend_jit_trace_get_exit_point(opline, target, NULL, 0);
+ exit_point = zend_jit_trace_get_exit_point(target, 0);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
| .aword &exit_addr
}
} else if (next_opline == target) {
| .aword >3
} else {
- exit_point = zend_jit_trace_get_exit_point(opline, target, NULL, 0);
+ exit_point = zend_jit_trace_get_exit_point(target, 0);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
| .aword &exit_addr
}
return 1;
}
-static int zend_jit_isset_isempty_cv(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_addr, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
+static int zend_jit_isset_isempty_cv(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
{
zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
static zend_bool zend_jit_noref_guard(dasm_State **Dst, const zend_op *opline, zend_jit_addr var_addr)
{
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, 0);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
{
zend_jit_addr var_addr = *var_addr_ptr;
uint32_t var_info = *var_info_ptr;
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, 0);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
{
zend_jit_addr var_addr = *var_addr_ptr;
uint32_t var_info = *var_info_ptr;
- int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, 0);
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {
if (!(var_type & IS_TRACE_REFERENCE)
&& var_type != IS_UNKNOWN
&& (var_info & (MAY_BE_ANY|MAY_BE_UNDEF)) != (1 << var_type)) {
- exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, 0);
+ exit_point = zend_jit_trace_get_exit_point(opline, 0);
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
if (!exit_addr) {