]> granicus.if.org Git - php/commitdiff
JIT for FE_FETCH_R
authorDmitry Stogov <dmitry@zend.com>
Thu, 3 Sep 2020 09:06:06 +0000 (12:06 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 3 Sep 2020 09:06:06 +0000 (12:06 +0300)
ext/opcache/jit/zend_jit.c
ext/opcache/jit/zend_jit_trace.c
ext/opcache/jit/zend_jit_x86.dasc

index 56260c9105feedaa34f7ab43b4d0bfde45c1ef47..7900130bb6e803461e0e03252150c162f8f89577 100644 (file)
@@ -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;
index 7d3c7be1aa53d40d2c81d4dc5c842c30d606baa4..5834cbe0e55a6709191fd5bb4043491245487849 100644 (file)
@@ -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;
index a863fed69e8854949c628c692f9025b6cea15e4d..74449877ac5fb86921e3117c87c7210cc49a27a8 100644 (file)
@@ -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 {