JIT/x86: Merge load and test of EX_CALL_INFO() into single instruction

This commit is contained in:
Dmitry Stogov 2021-08-25 14:36:06 +03:00
parent 36e88a0066
commit 1c9f8eb7b9
4 changed files with 13 additions and 6 deletions

View File

@ -10399,7 +10399,7 @@ static int zend_jit_leave_func(dasm_State **Dst,
|.cold_code
|1:
if (!GCC_GLOBAL_REGS) {
| mov FCARG2x, FP
| mov FCARG1x, FP
}
| EXT_CALL zend_jit_leave_func_helper, REG0

View File

@ -319,7 +319,7 @@ typedef ZEND_OPCODE_HANDLER_RET (ZEND_FASTCALL *zend_vm_opcode_handler_t)(ZEND_O
/* VM helpers */
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_nested_func_helper(uint32_t call_info EXECUTE_DATA_DC);
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_top_func_helper(uint32_t call_info EXECUTE_DATA_DC);
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_func_helper(uint32_t call_info EXECUTE_DATA_DC);
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_func_helper(EXECUTE_DATA_D);
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_profile_helper(ZEND_OPCODE_HANDLER_ARGS);

View File

@ -114,8 +114,10 @@ ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_top_func_helper(uint32_t ca
#endif
}
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_func_helper(uint32_t call_info EXECUTE_DATA_DC)
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_func_helper(EXECUTE_DATA_D)
{
uint32_t call_info = EX_CALL_INFO();
if (call_info & ZEND_CALL_TOP) {
ZEND_OPCODE_TAIL_CALL_EX(zend_jit_leave_top_func_helper, call_info);
} else {

View File

@ -1777,6 +1777,7 @@ static int zend_jit_exception_handler_undef_stub(dasm_State **Dst)
static int zend_jit_leave_function_stub(dasm_State **Dst)
{
|->leave_function_handler:
| mov FCARG1d, dword [FP + offsetof(zend_execute_data, This.u1.type_info)]
if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) {
| test FCARG1d, ZEND_CALL_TOP
| jnz >1
@ -10989,7 +10990,7 @@ static int zend_jit_leave_func(dasm_State **Dst,
!JIT_G(current_frame) ||
!TRACE_FRAME_NO_NEED_RELEASE_THIS(JIT_G(current_frame)));
if (may_need_call_helper || may_need_release_this) {
if (may_need_release_this) {
| mov FCARG1d, dword [FP + offsetof(zend_execute_data, This.u1.type_info)]
}
if (may_need_call_helper) {
@ -11000,13 +11001,17 @@ static int zend_jit_leave_func(dasm_State **Dst,
}
}
/* ZEND_CALL_FAKE_CLOSURE handled on slow path to eliminate check for ZEND_CALL_CLOSURE on fast path */
if (may_need_release_this) {
| test FCARG1d, (ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_FAKE_CLOSURE)
} else {
| test dword [FP + offsetof(zend_execute_data, This.u1.type_info)], (ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_FAKE_CLOSURE)
}
if (trace && trace->op != ZEND_JIT_TRACE_END) {
| jnz >1
|.cold_code
|1:
if (!GCC_GLOBAL_REGS) {
| mov FCARG2a, FP
| mov FCARG1a, FP
}
| EXT_CALL zend_jit_leave_func_helper, r0