Skip to content

Commit 67e9b3b

Browse files
committed
JIT for FE_FETCH_R
1 parent 7769ae1 commit 67e9b3b

File tree

3 files changed

+54
-8
lines changed

3 files changed

+54
-8
lines changed

ext/opcache/jit/zend_jit.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2972,13 +2972,22 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
29722972
goto jit_failure;
29732973
}
29742974
goto done;
2975+
case ZEND_FE_RESET_R:
2976+
op1_info = OP1_INFO();
2977+
if ((op1_info & (MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_ARRAY) {
2978+
break;
2979+
}
2980+
if (!zend_jit_fe_reset(&dasm_state, opline, op1_info)) {
2981+
goto jit_failure;
2982+
}
2983+
goto done;
29752984
case ZEND_FE_FETCH_R:
29762985
op1_info = OP1_INFO();
29772986
if ((op1_info & MAY_BE_ANY) != MAY_BE_ARRAY) {
29782987
break;
29792988
}
2980-
if (!zend_jit_fe_fetch(&dasm_state, opline, op_array, ssa, ssa_op,
2981-
op1_info, ssa->cfg.blocks[b].successors[0], opline->opcode, NULL)) {
2989+
if (!zend_jit_fe_fetch(&dasm_state, opline, op1_info, OP2_INFO(),
2990+
ssa->cfg.blocks[b].successors[0], opline->opcode, NULL)) {
29822991
goto jit_failure;
29832992
}
29842993
goto done;

ext/opcache/jit/zend_jit_trace.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1445,6 +1445,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
14451445
case ZEND_ECHO:
14461446
case ZEND_STRLEN:
14471447
case ZEND_QM_ASSIGN:
1448+
case ZEND_FE_RESET_R:
14481449
case ZEND_FE_FETCH_R:
14491450
ADD_OP1_TRACE_GUARD();
14501451
break;
@@ -4541,6 +4542,16 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
45414542
goto jit_failure;
45424543
}
45434544
goto done;
4545+
case ZEND_FE_RESET_R:
4546+
op1_info = OP1_INFO();
4547+
CHECK_OP1_TRACE_TYPE();
4548+
if ((op1_info & (MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_ARRAY) {
4549+
break;
4550+
}
4551+
if (!zend_jit_fe_reset(&dasm_state, opline, op1_info)) {
4552+
goto jit_failure;
4553+
}
4554+
goto done;
45444555
case ZEND_FE_FETCH_R:
45454556
op1_info = OP1_INFO();
45464557
CHECK_OP1_TRACE_TYPE();
@@ -4569,8 +4580,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
45694580
} else {
45704581
ZEND_UNREACHABLE();
45714582
}
4572-
if (!zend_jit_fe_fetch(&dasm_state, opline, op_array, ssa, ssa_op,
4573-
op1_info, -1, smart_branch_opcode, exit_addr)) {
4583+
if (!zend_jit_fe_fetch(&dasm_state, opline, op1_info, OP2_INFO(),
4584+
-1, smart_branch_opcode, exit_addr)) {
45744585
goto jit_failure;
45754586
}
45764587
goto done;

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12530,9 +12530,35 @@ static int zend_jit_isset_isempty_cv(dasm_State **Dst, const zend_op *opline, ui
1253012530
return 1;
1253112531
}
1253212532

12533-
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)
12533+
static int zend_jit_fe_reset(dasm_State **Dst, const zend_op *opline, uint32_t op1_info)
1253412534
{
12535-
zend_jit_addr op1_addr = OP1_ADDR();
12535+
zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
12536+
12537+
if (opline->op1_type == IS_CONST) {
12538+
zval *zv = RT_CONSTANT(opline, opline->op1);
12539+
12540+
| ZVAL_COPY_CONST res_addr, MAY_BE_ANY, MAY_BE_ANY, zv, ZREG_R0
12541+
if (Z_REFCOUNTED_P(zv)) {
12542+
| ADDREF_CONST zv, r0
12543+
}
12544+
} else {
12545+
zend_jit_addr op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var);
12546+
12547+
| // ZVAL_COPY(res, value);
12548+
| ZVAL_COPY_VALUE res_addr, -1, op1_addr, op1_info, ZREG_R0, ZREG_FCARG1a
12549+
if (opline->op1_type == IS_CV) {
12550+
| TRY_ADDREF op1_info, ah, FCARG1a
12551+
}
12552+
}
12553+
| // Z_FE_POS_P(res) = 0;
12554+
| mov dword [FP + opline->result.var + offsetof(zval, u2.fe_pos)], 0
12555+
12556+
return 1;
12557+
}
12558+
12559+
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)
12560+
{
12561+
zend_jit_addr op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var);
1253612562

1253712563
| // array = EX_VAR(opline->op1.var);
1253812564
| // fe_ht = Z_ARRVAL_P(array);
@@ -12589,7 +12615,7 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, const zend
1258912615

1259012616
if (!exit_addr || exit_opcode == ZEND_JMP) {
1259112617
zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG2a, 0);
12592-
zend_jit_addr var_addr = OP2_ADDR();
12618+
zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var);
1259312619
uint32_t val_info;
1259412620

1259512621
| mov FCARG2a, r0
@@ -12645,7 +12671,7 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, const zend
1264512671

1264612672
if (opline->op2_type == IS_CV) {
1264712673
| // zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
12648-
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)) {
12674+
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)) {
1264912675
return 0;
1265012676
}
1265112677
} else {

0 commit comments

Comments
 (0)