From: Dmitry Stogov Date: Wed, 10 Jan 2018 16:00:38 +0000 (+0300) Subject: Added abiliy to mark object specific handlers with most often used operand types... X-Git-Tag: php-7.3.0alpha1~667 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c73a42ccec2faa6cea7c8c2281404681a2aa12f6;p=php Added abiliy to mark object specific handlers with most often used operand types as HOT. (UNUSED+CONST and CV+CONST) --- diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index 6a4b09528c..a5eb616ea4 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -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");