]> granicus.if.org Git - php/commitdiff
Added abiliy to mark object specific handlers with most often used operand types...
authorDmitry Stogov <dmitry@zend.com>
Wed, 10 Jan 2018 16:00:38 +0000 (19:00 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 10 Jan 2018 16:00:38 +0000 (19:00 +0300)
Zend/zend_vm_gen.php

index 6a4b09528c8e7453ab805dec85f8f6919864bb27..a5eb616ea465339d071a3d9d55e2a0a4984a9739 100644 (file)
@@ -1010,6 +1010,16 @@ function skip_extra_spec_function($op1, $op2, $extra_spec) {
        return false;
 }
 
+function is_hot_handler($hot, $op1, $op2) {
+       if ($hot === 'HOT_') {
+               return true;
+       } else if ($hot === 'HOT_OBJ_') {
+               return (($op1 === 'UNUSED') || ($op1 === 'CV')) && ($op2 === 'CONST');
+       } else {
+               return false;
+       }
+}
+
 // Generates opcode handler
 function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno, $opcode, $extra_spec = null, &$switch_labels = array()) {
        global $definition_file, $prefix, $opnames;
@@ -1031,7 +1041,7 @@ function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno,
                        out($f,"\t\t\t\tHYBRID_BREAK();\n");
                        return;
                case ZEND_VM_KIND_CALL:
-                       if ($opcode["hot"] && ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) {
+                       if ($opcode["hot"] && ZEND_VM_KIND == ZEND_VM_KIND_HYBRID && is_hot_handler($opcode["hot"], $op1, $op2)) {
                                out($f,"static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
                        } else {
                                out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
@@ -2113,15 +2123,16 @@ function gen_vm($def, $skel) {
        foreach ($in as $line) {
                ++$lineno;
                if (strpos($line,"ZEND_VM_HANDLER(") === 0 ||
-                   strpos($line,"ZEND_VM_HOT_HANDLER(") === 0) {
+                   strpos($line,"ZEND_VM_HOT_HANDLER(") === 0 ||
+                   strpos($line,"ZEND_VM_HOT_OBJ_HANDLER(") === 0) {
                  // Parsing opcode handler's definition
                        if (preg_match(
-                                       "/^ZEND_VM_(HOT_)?HANDLER\(\s*([0-9]+)\s*,\s*([A-Z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
+                                       "/^ZEND_VM_(HOT_|HOT_OBJ_)?HANDLER\(\s*([0-9]+)\s*,\s*([A-Z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
                                        $line,
                                        $m) == 0) {
                                die("ERROR ($def:$lineno): Invalid ZEND_VM_HANDLER definition.\n");
                        }
-                       $hot = !empty($m[1]);
+                       $hot = !empty($m[1]) ? $m[1] : false;
                        $code = (int)$m[2];
                        $op   = $m[3];
                        $len  = strlen($op);
@@ -2159,15 +2170,16 @@ function gen_vm($def, $skel) {
                        $helper = null;
                        $list[$lineno] = array("handler"=>$handler);
                } else if (strpos($line,"ZEND_VM_TYPE_SPEC_HANDLER(") === 0 ||
-                          strpos($line,"ZEND_VM_HOT_TYPE_SPEC_HANDLER(") === 0) {
+                          strpos($line,"ZEND_VM_HOT_TYPE_SPEC_HANDLER(") === 0 ||
+                          strpos($line,"ZEND_VM_HOT_OBJ_TYPE_SPEC_HANDLER(") === 0) {
                  // Parsing opcode handler's definition
                        if (preg_match(
-                                       "/^ZEND_VM_(HOT_)?TYPE_SPEC_HANDLER\(\s*([A-Z_]+)\s*,\s*((?:[^(,]|\([^()]*|(?R)*\))*),\s*([A-Za-z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
+                                       "/^ZEND_VM_(HOT_|HOT_OBJ_)?TYPE_SPEC_HANDLER\(\s*([A-Z_]+)\s*,\s*((?:[^(,]|\([^()]*|(?R)*\))*),\s*([A-Za-z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
                                        $line,
                                        $m) == 0) {
                                die("ERROR ($def:$lineno): Invalid ZEND_VM_TYPE_HANDLER_HANDLER definition.\n");
                        }
-                       $hot = !empty($m[1]);
+                       $hot = !empty($m[1]) ? $m[1] : false;
                        $orig_op = $m[2];
                        if (!isset($opnames[$orig_op])) {
                                die("ERROR ($def:$lineno): Opcode with name '$orig_op' is not defined.\n");