From: Dmitry Stogov Date: Mon, 1 Jul 2019 13:57:25 +0000 (+0300) Subject: Micro-optimization X-Git-Tag: php-7.4.0alpha3~93 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f2b6b2eee89385e5b7733203b21794d026abf2b7;p=php Micro-optimization --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9996d7c82f..b428a08a3a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -3490,9 +3490,6 @@ static zend_always_inline void i_init_func_execute_data(zend_op_array *op_array, EX(run_time_cache) = RUN_TIME_CACHE(op_array); EG(current_execute_data) = execute_data; -#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)) - EX(opline) = opline; -#endif } /* }}} */ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index bf799f5684..15482c8f39 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -3844,7 +3844,7 @@ ZEND_VM_HOT_HANDLER(130, ZEND_DO_UCALL, ANY, ANY, SPEC(RETVAL)) call->prev_execute_data = execute_data; execute_data = call; i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC); - LOAD_OPLINE(); + LOAD_OPLINE_EX(); ZEND_VM_ENTER_EX(); } @@ -3868,7 +3868,7 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL)) call->prev_execute_data = execute_data; execute_data = call; i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC); - LOAD_OPLINE(); + LOAD_OPLINE_EX(); ZEND_VM_ENTER_EX(); } else { @@ -3957,9 +3957,10 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL)) i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC); if (EXPECTED(zend_execute_ex == execute_ex)) { - LOAD_OPLINE(); + LOAD_OPLINE_EX(); ZEND_VM_ENTER_EX(); } else { + SAVE_OPLINE_EX(); execute_data = EX(prev_execute_data); LOAD_OPLINE(); ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP); @@ -8006,9 +8007,10 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY) execute_data = call; i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC); if (EXPECTED(zend_execute_ex == execute_ex)) { - LOAD_OPLINE(); + LOAD_OPLINE_EX(); ZEND_VM_ENTER_EX(); } else { + SAVE_OPLINE_EX(); execute_data = EX(prev_execute_data); LOAD_OPLINE(); ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 468cf4fc5c..8aa61d23a1 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -398,19 +398,24 @@ typedef ZEND_OPCODE_HANDLER_RET (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_H #undef LOAD_OPLINE #undef LOAD_OPLINE_EX #undef SAVE_OPLINE +#undef SAVE_OPLINE_EX #define DCL_OPLINE #ifdef ZEND_VM_IP_GLOBAL_REG # define OPLINE opline # define USE_OPLINE # define LOAD_OPLINE() opline = EX(opline) +# define LOAD_OPLINE_EX() # define LOAD_NEXT_OPLINE() opline = EX(opline) + 1 # define SAVE_OPLINE() EX(opline) = opline +# define SAVE_OPLINE_EX() SAVE_OPLINE() #else # define OPLINE EX(opline) # define USE_OPLINE const zend_op *opline = EX(opline); # define LOAD_OPLINE() +# define LOAD_OPLINE_EX() # define LOAD_NEXT_OPLINE() ZEND_VM_INC_OPCODE() # define SAVE_OPLINE() +# define SAVE_OPLINE_EX() #endif #undef HANDLE_EXCEPTION #undef HANDLE_EXCEPTION_LEAVE @@ -1064,7 +1069,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETV call->prev_execute_data = execute_data; execute_data = call; i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC); - LOAD_OPLINE(); + LOAD_OPLINE_EX(); ZEND_VM_ENTER_EX(); } @@ -1087,7 +1092,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETV call->prev_execute_data = execute_data; execute_data = call; i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC); - LOAD_OPLINE(); + LOAD_OPLINE_EX(); ZEND_VM_ENTER_EX(); } @@ -1111,7 +1116,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S call->prev_execute_data = execute_data; execute_data = call; i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC); - LOAD_OPLINE(); + LOAD_OPLINE_EX(); ZEND_VM_ENTER_EX(); } else { @@ -1187,7 +1192,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S call->prev_execute_data = execute_data; execute_data = call; i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC); - LOAD_OPLINE(); + LOAD_OPLINE_EX(); ZEND_VM_ENTER_EX(); } else { @@ -1276,9 +1281,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC); if (EXPECTED(zend_execute_ex == execute_ex)) { - LOAD_OPLINE(); + LOAD_OPLINE_EX(); ZEND_VM_ENTER_EX(); } else { + SAVE_OPLINE_EX(); execute_data = EX(prev_execute_data); LOAD_OPLINE(); ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP); @@ -1386,9 +1392,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC); if (EXPECTED(zend_execute_ex == execute_ex)) { - LOAD_OPLINE(); + LOAD_OPLINE_EX(); ZEND_VM_ENTER_EX(); } else { + SAVE_OPLINE_EX(); execute_data = EX(prev_execute_data); LOAD_OPLINE(); ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP); @@ -2429,9 +2436,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z execute_data = call; i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC); if (EXPECTED(zend_execute_ex == execute_ex)) { - LOAD_OPLINE(); + LOAD_OPLINE_EX(); ZEND_VM_ENTER_EX(); } else { + SAVE_OPLINE_EX(); execute_data = EX(prev_execute_data); LOAD_OPLINE(); ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP); diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index d5a27e3371..2e0ad0b2c1 100755 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -1947,19 +1947,24 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f,"#undef LOAD_OPLINE\n"); out($f,"#undef LOAD_OPLINE_EX\n"); out($f,"#undef SAVE_OPLINE\n"); + out($f,"#undef SAVE_OPLINE_EX\n"); out($f,"#define DCL_OPLINE\n"); out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n"); out($f,"# define OPLINE opline\n"); out($f,"# define USE_OPLINE\n"); out($f,"# define LOAD_OPLINE() opline = EX(opline)\n"); + out($f,"# define LOAD_OPLINE_EX()\n"); out($f,"# define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n"); out($f,"# define SAVE_OPLINE() EX(opline) = opline\n"); + out($f,"# define SAVE_OPLINE_EX() SAVE_OPLINE()\n"); out($f,"#else\n"); out($f,"# define OPLINE EX(opline)\n"); out($f,"# define USE_OPLINE const zend_op *opline = EX(opline);\n"); out($f,"# define LOAD_OPLINE()\n"); + out($f,"# define LOAD_OPLINE_EX()\n"); out($f,"# define LOAD_NEXT_OPLINE() ZEND_VM_INC_OPCODE()\n"); out($f,"# define SAVE_OPLINE()\n"); + out($f,"# define SAVE_OPLINE_EX()\n"); out($f,"#endif\n"); out($f,"#undef HANDLE_EXCEPTION\n"); out($f,"#undef HANDLE_EXCEPTION_LEAVE\n"); @@ -1996,8 +2001,10 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f,"#undef DCL_OPLINE\n"); out($f,"#undef USE_OPLINE\n"); out($f,"#undef LOAD_OPLINE\n"); + out($f,"#undef LOAD_OPLINE_EX\n"); out($f,"#undef LOAD_NEXT_OPLINE\n"); out($f,"#undef SAVE_OPLINE\n"); + out($f,"#undef SAVE_OPLINE_EX\n"); out($f,"#define OPLINE opline\n"); out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n"); out($f,"# define DCL_OPLINE register const zend_op *opline __asm__(ZEND_VM_IP_GLOBAL_REG);\n"); @@ -2006,8 +2013,10 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f,"#endif\n"); out($f,"#define USE_OPLINE\n"); out($f,"#define LOAD_OPLINE() opline = EX(opline)\n"); + out($f,"# define LOAD_OPLINE_EX() LOAD_OPLINE()\n"); out($f,"#define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n"); out($f,"#define SAVE_OPLINE() EX(opline) = opline\n"); + out($f,"#define SAVE_OPLINE_EX()\n"); out($f,"#undef HANDLE_EXCEPTION\n"); out($f,"#undef HANDLE_EXCEPTION_LEAVE\n"); out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n"); @@ -2028,8 +2037,10 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f,"#undef DCL_OPLINE\n"); out($f,"#undef USE_OPLINE\n"); out($f,"#undef LOAD_OPLINE\n"); + out($f,"#undef LOAD_OPLINE_EX\n"); out($f,"#undef LOAD_NEXT_OPLINE\n"); out($f,"#undef SAVE_OPLINE\n"); + out($f,"#undef SAVE_OPLINE_EX\n"); out($f,"#define OPLINE opline\n"); out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n"); out($f,"# define DCL_OPLINE register const zend_op *opline __asm__(ZEND_VM_IP_GLOBAL_REG);\n"); @@ -2038,8 +2049,10 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f,"#endif\n"); out($f,"#define USE_OPLINE\n"); out($f,"#define LOAD_OPLINE() opline = EX(opline)\n"); + out($f,"#define LOAD_OPLINE_EX() LOAD_OPLINE()\n"); out($f,"#define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n"); out($f,"#define SAVE_OPLINE() EX(opline) = opline\n"); + out($f,"#define SAVE_OPLINE_EX()\n"); out($f,"#undef HANDLE_EXCEPTION\n"); out($f,"#undef HANDLE_EXCEPTION_LEAVE\n"); if (ZEND_VM_SPEC) { @@ -3059,14 +3072,18 @@ function gen_vm($def, $skel) { out($f,"#undef DCL_OPLINE\n"); out($f,"#undef USE_OPLINE\n"); out($f,"#undef LOAD_OPLINE\n"); + out($f,"#undef LOAD_OPLINE_EX\n"); out($f,"#undef LOAD_NEXT_OPLINE\n"); out($f,"#undef SAVE_OPLINE\n"); + out($f,"#undef SAVE_OPLINE_EX\n"); out($f,"#define OPLINE EX(opline)\n"); out($f,"#define DCL_OPLINE\n"); out($f,"#define USE_OPLINE const zend_op *opline = EX(opline);\n"); out($f,"#define LOAD_OPLINE()\n"); + out($f,"#define LOAD_OPLINE_EX()\n"); out($f,"#define LOAD_NEXT_OPLINE() ZEND_VM_INC_OPCODE()\n"); out($f,"#define SAVE_OPLINE()\n"); + out($f,"#define SAVE_OPLINE_EX()\n"); out($f,"#undef HANDLE_EXCEPTION\n"); out($f,"#undef HANDLE_EXCEPTION_LEAVE\n"); out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");