Skip to content

Commit 029d069

Browse files
committed
JIT/AArch64: Use only reserved TMP registers for EG(jit_trace_num) assignment.
This eliminates a need for checking CPU registers used at the entry to a side trace.
1 parent 67440dd commit 029d069

File tree

1 file changed

+2
-43
lines changed

1 file changed

+2
-43
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 2 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2911,53 +2911,12 @@ static int zend_jit_check_exception_undef_result(dasm_State **Dst, const zend_op
29112911

29122912
static int zend_jit_trace_begin(dasm_State **Dst, uint32_t trace_num, zend_jit_trace_info *parent, uint32_t exit_num)
29132913
{
2914-
zend_regset regset = ZEND_REGSET_SCRATCH;
2915-
2916-
// In the x86 implementation, this clause would be conducted if ZTS is enabled or the addressing mode is 64-bit.
2917-
{
2918-
/* assignment to EG(jit_trace_num) shouldn't clober CPU register used by deoptimizer */
2919-
if (parent) {
2920-
int i;
2921-
int parent_vars_count = parent->exit_info[exit_num].stack_size;
2922-
zend_jit_trace_stack *parent_stack =
2923-
parent->stack_map +
2924-
parent->exit_info[exit_num].stack_offset;
2925-
2926-
for (i = 0; i < parent_vars_count; i++) {
2927-
if (STACK_REG(parent_stack, i) != ZREG_NONE) {
2928-
if (STACK_REG(parent_stack, i) < ZREG_NUM) {
2929-
ZEND_REGSET_EXCL(regset, STACK_REG(parent_stack, i));
2930-
} else if (STACK_REG(parent_stack, i) == ZREG_ZVAL_COPY_GPR0) {
2931-
ZEND_REGSET_EXCL(regset, ZREG_REG0);
2932-
}
2933-
}
2934-
}
2935-
}
2936-
}
2937-
2938-
if (parent && parent->exit_info[exit_num].flags & ZEND_JIT_EXIT_METHOD_CALL) {
2939-
ZEND_REGSET_EXCL(regset, ZREG_REG0);
2940-
}
29412914

29422915
current_trace_num = trace_num;
29432916

29442917
| // EG(jit_trace_num) = trace_num;
2945-
if (regset == ZEND_REGSET_EMPTY || ZEND_REGSET_IS_SINGLETON(regset)) {
2946-
| sub sp, sp, #16
2947-
| stp TMP1, TMP2, [sp] // save TMP1 and TMP2
2948-
| LOAD_32BIT_VAL TMP1w, trace_num
2949-
| MEM_STORE_32_ZTS str, TMP1w, executor_globals, jit_trace_num, TMP2
2950-
| ldp TMP1, TMP2, [sp] // retore TMP1 and TMP2
2951-
| add sp, sp, #16
2952-
} else {
2953-
zend_reg tmp1 = ZEND_REGSET_FIRST(regset);
2954-
zend_reg tmp2 = ZEND_REGSET_FIRST(ZEND_REGSET_EXCL(regset, tmp1));
2955-
2956-
| LOAD_32BIT_VAL Rw(tmp1), trace_num
2957-
| MEM_STORE_32_ZTS str, Rw(tmp1), executor_globals, jit_trace_num, Rx(tmp2)
2958-
(void)tmp1;
2959-
(void)tmp2;
2960-
}
2918+
| LOAD_32BIT_VAL TMP1w, trace_num
2919+
| MEM_STORE_32_ZTS str, TMP1w, executor_globals, jit_trace_num, TMP2
29612920

29622921
return 1;
29632922
}

0 commit comments

Comments
 (0)