Skip to content

Commit 7309d5a

Browse files
shqkingdstogov
authored andcommitted
Support failed JIT test case: send_var_ex_001.phpt
Opcodes for function $evaluate are: BB0: 0000 ASSIGN_OBJ THIS string("evalParameters") 0001 OP_DATA array(...) 0002 INIT_NS_FCALL_BY_NAME 2 string("A\extract") 0003 CHECK_FUNC_ARG 1 0004 V1 = FETCH_OBJ_FUNC_ARG (ref) THIS string("evalParameters") 0005 SEND_FUNC_ARG V1 1 0006 T1 = FETCH_CONSTANT (unqualified-in-namespace) ... 0007 SEND_VAL_EX T1 2 0008 DO_FCALL_BY_NAME ... Major changes are made in function zend_jit_fetch_constant() to support FETCH_CONSTANT opcode. Besdies, cold code is touched in functions zend_jit_check_func_arg() and zend_jit_send_var() for opcodes CHECK_FUNC_ARG and SEND_FUNC_ARG respectively.
1 parent 4c872ba commit 7309d5a

File tree

1 file changed

+53
-3
lines changed

1 file changed

+53
-3
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6853,7 +6853,6 @@ static int zend_jit_send_var(dasm_State **Dst, const zend_op *opline, const zend
68536853
| bne >1
68546854
|.cold_code
68556855
|1:
6856-
| brk #0 // TODO
68576856
if (!zend_jit_send_ref(Dst, opline, op_array, op1_info, 1)) {
68586857
return 0;
68596858
}
@@ -6954,7 +6953,6 @@ static int zend_jit_check_func_arg(dasm_State **Dst, const zend_op *opline)
69546953
| bne >1
69556954
|.cold_code
69566955
|1:
6957-
| brk #0 // TODO
69586956
| // ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
69596957
| ldr TMP1w, [RX, #offsetof(zend_execute_data, This.u1.type_info)]
69606958
| LOAD_32BIT_VAL TMP2w, ZEND_CALL_SEND_ARG_BY_REF
@@ -8907,7 +8905,59 @@ static int zend_jit_fetch_constant(dasm_State **Dst,
89078905
zend_jit_addr const_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG0, 0);
89088906
uint32_t res_info = RES_INFO();
89098907

8910-
| brk #0 // TODO
8908+
| // c = CACHED_PTR(opline->extended_value);
8909+
| ldr FCARG1x, EX->run_time_cache
8910+
| LOAD_32BIT_VAL TMP1w, opline->extended_value
8911+
| ldr REG0, [FCARG1x, TMP1]
8912+
| // if (c != NULL)
8913+
| cbz REG0, >9
8914+
| brk #0 // TODO
8915+
| // if (!IS_SPECIAL_CACHE_VAL(c))
8916+
| tst REG0, #CACHE_SPECIAL
8917+
| bne >9
8918+
|8:
8919+
8920+
if ((res_info & MAY_BE_GUARD) && JIT_G(current_frame)) {
8921+
zend_jit_trace_stack *stack = JIT_G(current_frame)->stack;
8922+
uint32_t old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
8923+
int32_t exit_point;
8924+
const void *exit_addr = NULL;
8925+
8926+
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN, 1);
8927+
SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_ZVAL_COPY_GPR0);
8928+
exit_point = zend_jit_trace_get_exit_point(opline+1, 0);
8929+
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_info);
8930+
exit_addr = zend_jit_trace_get_exit_addr(exit_point);
8931+
if (!exit_addr) {
8932+
return 0;
8933+
}
8934+
res_info &= ~MAY_BE_GUARD;
8935+
ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD;
8936+
8937+
zend_uchar type = concrete_type(res_info);
8938+
8939+
| brk #0 // TODO
8940+
} else {
8941+
| ZVAL_COPY_VALUE res_addr, MAY_BE_ANY, const_addr, MAY_BE_ANY, ZREG_REG0, ZREG_REG1, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
8942+
| lsr REG0w, REG0w, #8
8943+
| and REG0w, REG0w, #0xff
8944+
| TRY_ADDREF MAY_BE_ANY, REG0w, REG1, TMP1
8945+
}
8946+
8947+
|.cold_code
8948+
|9:
8949+
| // SAVE_OPLINE();
8950+
| SET_EX_OPLINE opline, REG0
8951+
| // zend_quick_get_constant(RT_CONSTANT(opline, opline->op2) + 1, opline->op1.num OPLINE_CC EXECUTE_DATA_CC);
8952+
| LOAD_ADDR FCARG1x, zv
8953+
| LOAD_32BIT_VAL FCARG2x, opline->op1.num
8954+
| EXT_CALL zend_jit_get_constant, REG0
8955+
| mov REG0, RETVALx
8956+
| // ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
8957+
| cbnz REG0, <8
8958+
| brk #0 // TODO
8959+
| b ->exception_handler
8960+
|.code
89118961
return 1;
89128962
}
89138963

0 commit comments

Comments
 (0)