From: Dmitry Stogov Date: Thu, 3 Sep 2020 09:06:06 +0000 (+0300) Subject: JIT for FE_FETCH_R X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=67e9b3be396a861d3c0a00881ae6092dc8a349bd;p=php JIT for FE_FETCH_R --- diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 56260c9105..7900130bb6 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -2972,13 +2972,22 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op 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; diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 7d3c7be1aa..5834cbe0e5 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -1445,6 +1445,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin 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; @@ -4541,6 +4542,16 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par 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(); @@ -4569,8 +4580,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } 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; diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index a863fed69e..74449877ac 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -12530,9 +12530,35 @@ static int zend_jit_isset_isempty_cv(dasm_State **Dst, const zend_op *opline, ui 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); @@ -12589,7 +12615,7 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, const zend 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 @@ -12645,7 +12671,7 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, const zend 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 {