]> granicus.if.org Git - php/commitdiff
Inline few small opcode handlers into hybrid executor
authorDmitry Stogov <dmitry@zend.com>
Thu, 7 Jun 2018 13:30:53 +0000 (16:30 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 7 Jun 2018 13:30:53 +0000 (16:30 +0300)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
Zend/zend_vm_gen.php
Zend/zend_vm_handlers.h
Zend/zend_vm_opcodes.c

index 838daea88f2685457b37192a0a74da5ac2bf91fd..468da331211083d1f540eeac923938c963d3e46a 100644 (file)
@@ -2664,7 +2664,7 @@ ZEND_VM_HANDLER(70, ZEND_FREE, TMPVAR, ANY)
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
-ZEND_VM_HANDLER(127, ZEND_FE_FREE, TMPVAR, ANY)
+ZEND_VM_HOT_HANDLER(127, ZEND_FE_FREE, TMPVAR, ANY)
 {
        zval *var;
        USE_OPLINE
@@ -6761,14 +6761,14 @@ ZEND_VM_C_LABEL(try_instanceof):
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
-ZEND_VM_HANDLER(104, ZEND_EXT_NOP, ANY, ANY)
+ZEND_VM_HOT_HANDLER(104, ZEND_EXT_NOP, ANY, ANY)
 {
        USE_OPLINE
 
        ZEND_VM_NEXT_OPCODE();
 }
 
-ZEND_VM_HANDLER(0, ZEND_NOP, ANY, ANY)
+ZEND_VM_HOT_HANDLER(0, ZEND_NOP, ANY, ANY)
 {
        USE_OPLINE
 
@@ -7508,7 +7508,7 @@ ZEND_VM_COLD_CONST_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
-ZEND_VM_COLD_CONST_HANDLER(123, ZEND_TYPE_CHECK, CONST|TMP|VAR|CV, ANY, TYPE_MASK)
+ZEND_VM_HOT_NOCONST_HANDLER(123, ZEND_TYPE_CHECK, CONST|TMPVAR|CV, ANY, TYPE_MASK)
 {
        USE_OPLINE
        zval *value;
index 5ab8a863519a549ff972ae873b46b9d0566929b5..55d2ac063f46f356cef8c8d379355a5999d64625 100644 (file)
@@ -1642,14 +1642,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TICKS_SPEC_HANDLER(ZEND_OPCODE
        ZEND_VM_NEXT_OPCODE();
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
        ZEND_VM_NEXT_OPCODE();
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
@@ -2588,7 +2588,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_O
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
@@ -2619,7 +2619,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_O
        ZEND_VM_JMP(opline);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
@@ -2650,7 +2650,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_
        ZEND_VM_JMP(opline);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
@@ -12425,7 +12425,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FREE_SPEC_TMPVAR_HANDLER(ZEND_
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        zval *var;
        USE_OPLINE
@@ -12704,6 +12704,46 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEN
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *value;
+       int result = 0;
+       zend_free_op free_op1;
+
+       value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+       if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
+type_check_resource:
+               if (EXPECTED(Z_TYPE_P(value) != IS_RESOURCE)
+                || EXPECTED(NULL != zend_rsrc_list_get_rsrc_type(Z_RES_P(value)))) {
+                       result = 1;
+               }
+       } else if (((IS_TMP_VAR|IS_VAR) & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) {
+               value = Z_REFVAL_P(value);
+               if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
+                       goto type_check_resource;
+               }
+       } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
+               result = ((1 << IS_NULL) & opline->extended_value) != 0;
+               SAVE_OPLINE();
+               GET_OP1_UNDEF_CV(value, BP_VAR_R);
+               ZEND_VM_SMART_BRANCH(result, 1);
+               ZVAL_BOOL(EX_VAR(opline->result.var), result);
+               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       }
+       if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+               SAVE_OPLINE();
+               zval_ptr_dtor_nogc(free_op1);
+               ZEND_VM_SMART_BRANCH(result, 1);
+               ZVAL_BOOL(EX_VAR(opline->result.var), result);
+               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       } else {
+               ZEND_VM_SMART_BRANCH(result, 0);
+               ZVAL_BOOL(EX_VAR(opline->result.var), result);
+               ZEND_VM_NEXT_OPCODE();
+       }
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -18335,46 +18375,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE
        ZEND_VM_RETURN();
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
-       USE_OPLINE
-       zval *value;
-       int result = 0;
-       zend_free_op free_op1;
-
-       value = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-       if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
-type_check_resource:
-               if (EXPECTED(Z_TYPE_P(value) != IS_RESOURCE)
-                || EXPECTED(NULL != zend_rsrc_list_get_rsrc_type(Z_RES_P(value)))) {
-                       result = 1;
-               }
-       } else if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) {
-               value = Z_REFVAL_P(value);
-               if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
-                       goto type_check_resource;
-               }
-       } else if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
-               result = ((1 << IS_NULL) & opline->extended_value) != 0;
-               SAVE_OPLINE();
-               GET_OP1_UNDEF_CV(value, BP_VAR_R);
-               ZEND_VM_SMART_BRANCH(result, 1);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-       }
-       if (IS_TMP_VAR & (IS_TMP_VAR|IS_VAR)) {
-               SAVE_OPLINE();
-               zval_ptr_dtor_nogc(free_op1);
-               ZEND_VM_SMART_BRANCH(result, 1);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-       } else {
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       }
-}
-
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -21726,46 +21726,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE
        ZEND_VM_RETURN();
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
-       USE_OPLINE
-       zval *value;
-       int result = 0;
-       zend_free_op free_op1;
-
-       value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-       if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
-type_check_resource:
-               if (EXPECTED(Z_TYPE_P(value) != IS_RESOURCE)
-                || EXPECTED(NULL != zend_rsrc_list_get_rsrc_type(Z_RES_P(value)))) {
-                       result = 1;
-               }
-       } else if ((IS_VAR & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) {
-               value = Z_REFVAL_P(value);
-               if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
-                       goto type_check_resource;
-               }
-       } else if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
-               result = ((1 << IS_NULL) & opline->extended_value) != 0;
-               SAVE_OPLINE();
-               GET_OP1_UNDEF_CV(value, BP_VAR_R);
-               ZEND_VM_SMART_BRANCH(result, 1);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-       }
-       if (IS_VAR & (IS_TMP_VAR|IS_VAR)) {
-               SAVE_OPLINE();
-               zval_ptr_dtor_nogc(free_op1);
-               ZEND_VM_SMART_BRANCH(result, 1);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-       } else {
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       }
-}
-
 static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SIMPLE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -37601,7 +37561,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CV_HANDLER(ZEND_OP
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zval *value;
@@ -52575,8 +52535,8 @@ ZEND_API void execute_ex(zend_execute_data *ex)
                        (void*)&&ZEND_STRLEN_SPEC_CV_LABEL,
                        (void*)&&ZEND_DEFINED_SPEC_CONST_LABEL,
                        (void*)&&ZEND_TYPE_CHECK_SPEC_CONST_LABEL,
-                       (void*)&&ZEND_TYPE_CHECK_SPEC_TMP_LABEL,
-                       (void*)&&ZEND_TYPE_CHECK_SPEC_VAR_LABEL,
+                       (void*)&&ZEND_TYPE_CHECK_SPEC_TMPVAR_LABEL,
+                       (void*)&&ZEND_TYPE_CHECK_SPEC_TMPVAR_LABEL,
                        (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_TYPE_CHECK_SPEC_CV_LABEL,
                        (void*)&&ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED_LABEL,
@@ -55934,6 +55894,10 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_STRLEN_SPEC_TMPVAR)
                                ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_TYPE_CHECK_SPEC_TMPVAR):
+                               VM_TRACE(ZEND_TYPE_CHECK_SPEC_TMPVAR)
+                               ZEND_TYPE_CHECK_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_ADD_SPEC_TMPVAR_CONST):
                                VM_TRACE(ZEND_ADD_SPEC_TMPVAR_CONST)
                                ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -56500,10 +56464,6 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_YIELD_FROM_SPEC_TMP)
                                ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
-                       HYBRID_CASE(ZEND_TYPE_CHECK_SPEC_TMP):
-                               VM_TRACE(ZEND_TYPE_CHECK_SPEC_TMP)
-                               ZEND_TYPE_CHECK_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
-                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_TMP_CONST):
                                VM_TRACE(ZEND_IS_IDENTICAL_SPEC_TMP_CONST)
                                ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -56822,10 +56782,6 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_YIELD_FROM_SPEC_VAR)
                                ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
-                       HYBRID_CASE(ZEND_TYPE_CHECK_SPEC_VAR):
-                               VM_TRACE(ZEND_TYPE_CHECK_SPEC_VAR)
-                               ZEND_TYPE_CHECK_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
-                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_SEND_VAR_SIMPLE_SPEC_VAR):
                                VM_TRACE(ZEND_SEND_VAR_SIMPLE_SPEC_VAR)
                                ZEND_SEND_VAR_SIMPLE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -62104,8 +62060,8 @@ void zend_vm_init(void)
                ZEND_STRLEN_SPEC_CV_HANDLER,
                ZEND_DEFINED_SPEC_CONST_HANDLER,
                ZEND_TYPE_CHECK_SPEC_CONST_HANDLER,
-               ZEND_TYPE_CHECK_SPEC_TMP_HANDLER,
-               ZEND_TYPE_CHECK_SPEC_VAR_HANDLER,
+               ZEND_TYPE_CHECK_SPEC_TMPVAR_HANDLER,
+               ZEND_TYPE_CHECK_SPEC_TMPVAR_HANDLER,
                ZEND_NULL_HANDLER,
                ZEND_TYPE_CHECK_SPEC_CV_HANDLER,
                ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED_HANDLER,
index 20672c66c5a72434b28438d1b9fc1e57603df3a9..51bbfa3926dc51d34133691defb09ec1f90dae94 100644 (file)
@@ -1088,6 +1088,8 @@ function is_cold_handler($hot, $op1, $op2, $extra_spec) {
                return ($op1 === 'CONST' && $op2 === 'CONST');
        } else if ($hot === 'HOT_OBJ_') {
                return ($op1 === 'CONST');
+       } else if ($hot === 'HOT_NOCONST_') {
+               return ($op1 === 'CONST');
        } else {
                return false;
        }
index 6f0aaae320cc93e7701eac0a165e7f53d07985b6..c9eb031687f6914b4a5182bb249b9eb462afcfe7 100644 (file)
        _(2147, ZEND_STRLEN_SPEC_CV) \
        _(2148, ZEND_DEFINED_SPEC_CONST) \
        _(2149, ZEND_TYPE_CHECK_SPEC_CONST) \
-       _(2150, ZEND_TYPE_CHECK_SPEC_TMP) \
-       _(2151, ZEND_TYPE_CHECK_SPEC_VAR) \
+       _(2150, ZEND_TYPE_CHECK_SPEC_TMPVAR) \
+       _(2151, ZEND_TYPE_CHECK_SPEC_TMPVAR) \
        _(2153, ZEND_TYPE_CHECK_SPEC_CV) \
        _(2154, ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED) \
        _(2155, ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED) \
index f37b769da3cfca1f12030b1c4e815f109926727f..f09efd50d6170867546e4b74cc3f1eec1c582314 100644 (file)
@@ -348,7 +348,7 @@ static uint32_t zend_vm_opcodes_flags[199] = {
        0x00001003,
        0x00000007,
        0x00040003,
-       0x09000003,
+       0x09000007,
        0x0000a103,
        0x00002003,
        0x03000001,