mirror of
https://github.com/php/php-src.git
synced 2026-04-03 14:12:38 +02:00
JIT: Eliminate load of op_array->run_time_cache__ptr and use immediate value for immutable op_arrays if it's known at compile time
This commit is contained in:
@@ -9031,26 +9031,32 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
|
||||
if (func) {
|
||||
| ldr REG0, EX:RX->func
|
||||
}
|
||||
| ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)]
|
||||
// Always defined as ZEND_MAP_PTR_KIND_PTR_OR_OFFSET. See Zend/zend_map_ptr.h.
|
||||
#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
|
||||
| ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)]
|
||||
| ldr REG2, [REG2]
|
||||
#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
|
||||
if (func && !(func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
|
||||
if (ZEND_MAP_PTR_IS_OFFSET(func->op_array.run_time_cache)) {
|
||||
| MEM_LOAD_OP_ZTS add, ldr, REG2, compiler_globals, map_ptr_base, REG1, TMP1
|
||||
| MEM_LOAD_64_ZTS ldr, REG2, compiler_globals, map_ptr_base, TMP1
|
||||
| ADD_SUB_64_WITH_CONST add, REG2, REG2, (uintptr_t)ZEND_MAP_PTR(func->op_array.run_time_cache), TMP1
|
||||
| ldr REG2, [REG2]
|
||||
} else if ((func->op_array.fn_flags & ZEND_ACC_IMMUTABLE)
|
||||
&& (!func->op_array.scope || (func->op_array.scope->ce_flags & ZEND_ACC_LINKED))) {
|
||||
| ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)]
|
||||
| MEM_LOAD_OP_ZTS add, ldr, REG2, compiler_globals, map_ptr_base, REG1, TMP1
|
||||
| ldr REG2, [REG2]
|
||||
} else {
|
||||
/* the called op_array may be not persisted yet */
|
||||
| ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)]
|
||||
| TST_64_WITH_ONE REG2
|
||||
| beq >1
|
||||
| MEM_LOAD_OP_ZTS add, ldr, REG2, compiler_globals, map_ptr_base, REG1, TMP1
|
||||
|1:
|
||||
| ldr REG2, [REG2]
|
||||
}
|
||||
| ldr REG2, [REG2]
|
||||
} else {
|
||||
| ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)]
|
||||
| TST_64_WITH_ONE REG2
|
||||
| beq >1
|
||||
| MEM_LOAD_OP_ZTS add, ldr, REG2, compiler_globals, map_ptr_base, REG1, TMP1
|
||||
|
||||
@@ -9655,25 +9655,30 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
|
||||
if (func) {
|
||||
| mov r0, EX:RX->func
|
||||
}
|
||||
| mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)]
|
||||
#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
|
||||
| mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)]
|
||||
| mov r2, aword [r2]
|
||||
#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
|
||||
if (func && !(func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
|
||||
if (ZEND_MAP_PTR_IS_OFFSET(func->op_array.run_time_cache)) {
|
||||
| MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
|
||||
| MEM_LOAD_ZTS r2, aword, compiler_globals, map_ptr_base, r1
|
||||
| mov r2, aword [r2 + (uintptr_t)ZEND_MAP_PTR(func->op_array.run_time_cache)]
|
||||
} else if ((func->op_array.fn_flags & ZEND_ACC_IMMUTABLE)
|
||||
&& (!func->op_array.scope || (func->op_array.scope->ce_flags & ZEND_ACC_LINKED))) {
|
||||
| mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)]
|
||||
| MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
|
||||
| mov r2, aword [r2]
|
||||
} else {
|
||||
/* the called op_array may be not persisted yet */
|
||||
| mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)]
|
||||
| test r2, 1
|
||||
| jz >1
|
||||
| MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
|
||||
|1:
|
||||
| mov r2, aword [r2]
|
||||
}
|
||||
| mov r2, aword [r2]
|
||||
} else {
|
||||
| mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)]
|
||||
| test r2, 1
|
||||
| jz >1
|
||||
| MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
|
||||
|
||||
Reference in New Issue
Block a user