Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Side by Side Diff: src/interpreter/interpreter.cc

Issue 2547043002: [Interpreter] Optimize equality check with null/undefined with a check on the map. (Closed)
Patch Set: Address comments from Ross. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/interpreter/bytecodes.h ('k') | src/interpreter/mkpeephole.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/interpreter/interpreter.h" 5 #include "src/interpreter/interpreter.h"
6 6
7 #include <fstream> 7 #include <fstream>
8 #include <memory> 8 #include <memory>
9 9
10 #include "src/ast/prettyprinter.h" 10 #include "src/ast/prettyprinter.h"
(...skipping 1919 matching lines...) Expand 10 before | Expand all | Expand 10 after
1930 } 1930 }
1931 1931
1932 // TestInstanceOf <src> 1932 // TestInstanceOf <src>
1933 // 1933 //
1934 // Test if the object referenced by the <src> register is an an instance of type 1934 // Test if the object referenced by the <src> register is an an instance of type
1935 // referenced by the accumulator. 1935 // referenced by the accumulator.
1936 void Interpreter::DoTestInstanceOf(InterpreterAssembler* assembler) { 1936 void Interpreter::DoTestInstanceOf(InterpreterAssembler* assembler) {
1937 DoCompareOp(Token::INSTANCEOF, assembler); 1937 DoCompareOp(Token::INSTANCEOF, assembler);
1938 } 1938 }
1939 1939
1940 // TestUndetectable <src>
1941 //
1942 // Test if the value in the <src> register equals to Null/Undefined. This is
1943 // done by checking undetectable bit on the map of the object.
1944 void Interpreter::DoTestUndetectable(InterpreterAssembler* assembler) {
1945 Node* reg_index = __ BytecodeOperandReg(0);
1946 Node* object = __ LoadRegister(reg_index);
1947
1948 Label not_equal(assembler), end(assembler);
1949 // If the object is an Smi then return false.
1950 __ GotoIf(__ TaggedIsSmi(object), &not_equal);
1951
1952 // If it is a HeapObject, load the map and check for undetectable bit.
1953 Node* map = __ LoadMap(object);
1954 Node* map_bitfield = __ LoadMapBitField(map);
1955 Node* map_undetectable =
1956 __ Word32And(map_bitfield, __ Int32Constant(1 << Map::kIsUndetectable));
1957 __ GotoIf(__ Word32Equal(map_undetectable, __ Int32Constant(0)), &not_equal);
1958
1959 __ SetAccumulator(__ BooleanConstant(true));
1960 __ Goto(&end);
1961
1962 __ Bind(&not_equal);
1963 {
1964 __ SetAccumulator(__ BooleanConstant(false));
1965 __ Goto(&end);
1966 }
1967
1968 __ Bind(&end);
1969 __ Dispatch();
1970 }
1971
1940 // Jump <imm> 1972 // Jump <imm>
1941 // 1973 //
1942 // Jump by number of bytes represented by the immediate operand |imm|. 1974 // Jump by number of bytes represented by the immediate operand |imm|.
1943 void Interpreter::DoJump(InterpreterAssembler* assembler) { 1975 void Interpreter::DoJump(InterpreterAssembler* assembler) {
1944 Node* relative_jump = __ BytecodeOperandImm(0); 1976 Node* relative_jump = __ BytecodeOperandImm(0);
1945 __ Jump(relative_jump); 1977 __ Jump(relative_jump);
1946 } 1978 }
1947 1979
1948 // JumpConstant <idx> 1980 // JumpConstant <idx>
1949 // 1981 //
(...skipping 840 matching lines...) Expand 10 before | Expand all | Expand 10 after
2790 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, 2822 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset,
2791 __ SmiTag(new_state)); 2823 __ SmiTag(new_state));
2792 __ SetAccumulator(old_state); 2824 __ SetAccumulator(old_state);
2793 2825
2794 __ Dispatch(); 2826 __ Dispatch();
2795 } 2827 }
2796 2828
2797 } // namespace interpreter 2829 } // namespace interpreter
2798 } // namespace internal 2830 } // namespace internal
2799 } // namespace v8 2831 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/bytecodes.h ('k') | src/interpreter/mkpeephole.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698