@@ -2943,20 +2943,6 @@ static int zend_jit_trace_begin(dasm_State **Dst, uint32_t trace_num, zend_jit_t
2943
2943
return 1;
2944
2944
}
2945
2945
2946
- static int zend_jit_trace_opline_guard(dasm_State **Dst, const zend_op *opline)
2947
- {
2948
- uint32_t exit_point = zend_jit_trace_get_exit_point(NULL, 0);
2949
- const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
2950
-
2951
- if (!exit_addr) {
2952
- return 0;
2953
- }
2954
- | CMP_IP opline
2955
- | jne &exit_addr
2956
-
2957
- return 1;
2958
- }
2959
-
2960
2946
/* This taken from LuaJIT. Thanks to Mike Pall. */
2961
2947
static uint32_t _asm_x86_inslen(const uint8_t* p)
2962
2948
{
@@ -3496,6 +3482,22 @@ static void zend_jit_stop_reuse_ip(void) {
3496
3482
reuse_ip = 0;
3497
3483
}
3498
3484
3485
+ static int zend_jit_trace_opline_guard(dasm_State **Dst, const zend_op *opline)
3486
+ {
3487
+ uint32_t exit_point = zend_jit_trace_get_exit_point(NULL, 0);
3488
+ const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
3489
+
3490
+ if (!exit_addr) {
3491
+ return 0;
3492
+ }
3493
+ | CMP_IP opline
3494
+ | jne &exit_addr
3495
+
3496
+ zend_jit_set_opline(opline);
3497
+
3498
+ return 1;
3499
+ }
3500
+
3499
3501
static int zend_jit_jmp(dasm_State **Dst, unsigned int target_label)
3500
3502
{
3501
3503
| jmp =>target_label
@@ -8864,15 +8866,6 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
8864
8866
| mov aword EX:RX->return_value, 0
8865
8867
}
8866
8868
8867
- if (func
8868
- && !unknown_num_args
8869
- && call_num_args <= func->op_array.num_args) {
8870
- for (i = call_num_args; i < func->op_array.last_var; i++) {
8871
- uint32_t n = EX_NUM_TO_VAR(i);
8872
- | SET_Z_TYPE_INFO RX + n, IS_UNDEF
8873
- }
8874
- }
8875
-
8876
8869
//EX_LOAD_RUN_TIME_CACHE(op_array);
8877
8870
if (!func || func->op_array.cache_size) {
8878
8871
if (func && op_array == &func->op_array) {
@@ -8919,74 +8912,78 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
8919
8912
| mov FP, RX
8920
8913
8921
8914
| // opline = op_array->opcodes;
8922
- if (func
8923
- && !unknown_num_args
8924
- && call_num_args <= func->op_array.num_args) {
8925
- uint32_t num_args;
8915
+ if (func && !unknown_num_args) {
8926
8916
8927
- if ((func->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0) {
8928
- if (trace) {
8929
- num_args = 0;
8930
- } else if (call_info) {
8931
- num_args = skip_valid_arguments(op_array, ssa, call_info);
8932
- } else {
8933
- num_args = call_num_args;
8934
- }
8935
- } else {
8936
- num_args = call_num_args;
8917
+ for (i = call_num_args; i < func->op_array.last_var; i++) {
8918
+ uint32_t n = EX_NUM_TO_VAR(i);
8919
+ | SET_Z_TYPE_INFO RX + n, IS_UNDEF
8937
8920
}
8938
- if (func && zend_accel_in_shm(func->op_array.opcodes)) {
8939
- | LOAD_IP_ADDR (func->op_array.opcodes + num_args)
8940
- } else {
8941
- if (func) {
8942
- | mov r0, EX->func
8943
- }
8944
- if (GCC_GLOBAL_REGS) {
8945
- | mov IP, aword [r0 + offsetof(zend_op_array, opcodes)]
8946
- if (num_args) {
8947
- | add IP, (num_args * sizeof(zend_op))
8921
+
8922
+ if (call_num_args <= func->op_array.num_args) {
8923
+ if (!trace || (trace->op == ZEND_JIT_TRACE_END
8924
+ && trace->stop == ZEND_JIT_TRACE_STOP_INTERPRETER)) {
8925
+ uint32_t num_args;
8926
+
8927
+ if ((func->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0) {
8928
+ if (trace) {
8929
+ num_args = 0;
8930
+ } else if (call_info) {
8931
+ num_args = skip_valid_arguments(op_array, ssa, call_info);
8932
+ } else {
8933
+ num_args = call_num_args;
8934
+ }
8935
+ } else {
8936
+ num_args = call_num_args;
8948
8937
}
8949
- } else {
8950
- | mov FCARG1a, aword [r0 + offsetof(zend_op_array, opcodes)]
8951
- if (num_args) {
8952
- | add FCARG1a, (num_args * sizeof(zend_op))
8938
+ if (zend_accel_in_shm(func->op_array.opcodes)) {
8939
+ | LOAD_IP_ADDR (func->op_array.opcodes + num_args)
8940
+ } else {
8941
+ | mov r0, EX->func
8942
+ if (GCC_GLOBAL_REGS) {
8943
+ | mov IP, aword [r0 + offsetof(zend_op_array, opcodes)]
8944
+ if (num_args) {
8945
+ | add IP, (num_args * sizeof(zend_op))
8946
+ }
8947
+ } else {
8948
+ | mov FCARG1a, aword [r0 + offsetof(zend_op_array, opcodes)]
8949
+ if (num_args) {
8950
+ | add FCARG1a, (num_args * sizeof(zend_op))
8951
+ }
8952
+ | mov aword EX->opline, FCARG1a
8953
+ }
8953
8954
}
8954
- | mov aword EX->opline, FCARG1a
8955
- }
8956
- }
8957
8955
8958
- if (!trace && op_array == &func->op_array) {
8959
- /* recursive call */
8956
+ if (!trace && op_array == &func->op_array) {
8957
+ /* recursive call */
8960
8958
#ifdef CONTEXT_THREADED_JIT
8961
- | call >1
8962
- |.cold_code
8963
- |1:
8964
- | pop r0
8965
- | jmp =>num_args
8966
- |.code
8959
+ | call >1
8960
+ |.cold_code
8961
+ |1:
8962
+ | pop r0
8963
+ | jmp =>num_args
8964
+ |.code
8967
8965
#else
8968
- | jmp =>num_args
8966
+ | jmp =>num_args
8969
8967
#endif
8970
- return 1;
8971
- }
8972
- } else if (func
8973
- && !unknown_num_args
8974
- && call_num_args > func->op_array.num_args) {
8975
- if (func && zend_accel_in_shm(func->op_array.opcodes)) {
8976
- | LOAD_IP_ADDR (func->op_array.opcodes)
8977
- } else if (GCC_GLOBAL_REGS) {
8978
- | mov IP, aword [r0 + offsetof(zend_op_array, opcodes)]
8968
+ return 1;
8969
+ }
8970
+ }
8979
8971
} else {
8980
- | mov FCARG1a, aword [r0 + offsetof(zend_op_array, opcodes)]
8981
- | mov aword EX->opline, FCARG1a
8982
- }
8983
- if (!GCC_GLOBAL_REGS) {
8984
- | mov FCARG1a, FP
8985
- }
8986
- | EXT_CALL zend_jit_copy_extra_args_helper, r0
8987
- for (i = call_num_args; i < func->op_array.last_var; i++) {
8988
- uint32_t n = EX_NUM_TO_VAR(i);
8989
- | SET_Z_TYPE_INFO FP + n, IS_UNDEF
8972
+ if (!trace || (trace->op == ZEND_JIT_TRACE_END
8973
+ && trace->stop == ZEND_JIT_TRACE_STOP_INTERPRETER)) {
8974
+ if (func && zend_accel_in_shm(func->op_array.opcodes)) {
8975
+ | LOAD_IP_ADDR (func->op_array.opcodes)
8976
+ } else if (GCC_GLOBAL_REGS) {
8977
+ | mov IP, aword [r0 + offsetof(zend_op_array, opcodes)]
8978
+ } else {
8979
+ | mov FCARG1a, aword [r0 + offsetof(zend_op_array, opcodes)]
8980
+ | mov aword EX->opline, FCARG1a
8981
+ }
8982
+ }
8983
+ if (!GCC_GLOBAL_REGS) {
8984
+ | mov FCARG1a, FP
8985
+ }
8986
+ | EXT_CALL zend_jit_copy_extra_args_helper, r0
8990
8987
}
8991
8988
} else {
8992
8989
| // opline = op_array->opcodes
0 commit comments