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

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

Issue 2485383002: [Interpreter] Remove Ldr[Named/Keyed]Property bytecodes and use Star Lookahead instead. (Closed)
Patch Set: Created 4 years, 1 month 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/interpreter.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 753 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 } 764 }
765 765
766 // StaLookupSlotStrict <name_index> 766 // StaLookupSlotStrict <name_index>
767 // 767 //
768 // Store the object in accumulator to the object with the name in constant 768 // Store the object in accumulator to the object with the name in constant
769 // pool entry |name_index| in strict mode. 769 // pool entry |name_index| in strict mode.
770 void Interpreter::DoStaLookupSlotStrict(InterpreterAssembler* assembler) { 770 void Interpreter::DoStaLookupSlotStrict(InterpreterAssembler* assembler) {
771 DoStaLookupSlot(LanguageMode::STRICT, assembler); 771 DoStaLookupSlot(LanguageMode::STRICT, assembler);
772 } 772 }
773 773
774 Node* Interpreter::BuildLoadNamedProperty(Callable ic, 774 // LdaNamedProperty <object> <name_index> <slot>
775 InterpreterAssembler* assembler) { 775 //
776 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at
777 // constant pool entry <name_index>.
778 void Interpreter::DoLdaNamedProperty(InterpreterAssembler* assembler) {
776 typedef LoadWithVectorDescriptor Descriptor; 779 typedef LoadWithVectorDescriptor Descriptor;
780 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_);
777 Node* code_target = __ HeapConstant(ic.code()); 781 Node* code_target = __ HeapConstant(ic.code());
778 Node* register_index = __ BytecodeOperandReg(0); 782 Node* register_index = __ BytecodeOperandReg(0);
779 Node* object = __ LoadRegister(register_index); 783 Node* object = __ LoadRegister(register_index);
780 Node* constant_index = __ BytecodeOperandIdx(1); 784 Node* constant_index = __ BytecodeOperandIdx(1);
781 Node* name = __ LoadConstantPoolEntry(constant_index); 785 Node* name = __ LoadConstantPoolEntry(constant_index);
782 Node* raw_slot = __ BytecodeOperandIdx(2); 786 Node* raw_slot = __ BytecodeOperandIdx(2);
783 Node* smi_slot = __ SmiTag(raw_slot); 787 Node* smi_slot = __ SmiTag(raw_slot);
784 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); 788 Node* type_feedback_vector = __ LoadTypeFeedbackVector();
785 Node* context = __ GetContext(); 789 Node* context = __ GetContext();
786 return __ CallStub( 790 Node* result = __ CallStub(
787 ic.descriptor(), code_target, context, Arg(Descriptor::kReceiver, object), 791 ic.descriptor(), code_target, context, Arg(Descriptor::kReceiver, object),
788 Arg(Descriptor::kName, name), Arg(Descriptor::kSlot, smi_slot), 792 Arg(Descriptor::kName, name), Arg(Descriptor::kSlot, smi_slot),
789 Arg(Descriptor::kVector, type_feedback_vector)); 793 Arg(Descriptor::kVector, type_feedback_vector));
790 }
791
792 // LdaNamedProperty <object> <name_index> <slot>
793 //
794 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at
795 // constant pool entry <name_index>.
796 void Interpreter::DoLdaNamedProperty(InterpreterAssembler* assembler) {
797 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_);
798 Node* result = BuildLoadNamedProperty(ic, assembler);
799 __ SetAccumulator(result); 794 __ SetAccumulator(result);
800 __ Dispatch(); 795 __ Dispatch();
801 } 796 }
802 797
803 // LdrNamedProperty <object> <name_index> <slot> <reg> 798 // KeyedLoadIC <object> <slot>
804 // 799 //
805 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at 800 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key
806 // constant pool entry <name_index> and puts the result into register <reg>. 801 // in the accumulator.
807 void Interpreter::DoLdrNamedProperty(InterpreterAssembler* assembler) { 802 void Interpreter::DoLdaKeyedProperty(InterpreterAssembler* assembler) {
808 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_);
809 Node* result = BuildLoadNamedProperty(ic, assembler);
810 Node* destination = __ BytecodeOperandReg(3);
811 __ StoreRegister(result, destination);
812 __ Dispatch();
813 }
814
815 Node* Interpreter::BuildLoadKeyedProperty(Callable ic,
816 InterpreterAssembler* assembler) {
817 typedef LoadWithVectorDescriptor Descriptor; 803 typedef LoadWithVectorDescriptor Descriptor;
804 Callable ic = CodeFactory::KeyedLoadICInOptimizedCode(isolate_);
818 Node* code_target = __ HeapConstant(ic.code()); 805 Node* code_target = __ HeapConstant(ic.code());
819 Node* reg_index = __ BytecodeOperandReg(0); 806 Node* reg_index = __ BytecodeOperandReg(0);
820 Node* object = __ LoadRegister(reg_index); 807 Node* object = __ LoadRegister(reg_index);
821 Node* name = __ GetAccumulator(); 808 Node* name = __ GetAccumulator();
822 Node* raw_slot = __ BytecodeOperandIdx(1); 809 Node* raw_slot = __ BytecodeOperandIdx(1);
823 Node* smi_slot = __ SmiTag(raw_slot); 810 Node* smi_slot = __ SmiTag(raw_slot);
824 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); 811 Node* type_feedback_vector = __ LoadTypeFeedbackVector();
825 Node* context = __ GetContext(); 812 Node* context = __ GetContext();
826 return __ CallStub( 813 Node* result = __ CallStub(
827 ic.descriptor(), code_target, context, Arg(Descriptor::kReceiver, object), 814 ic.descriptor(), code_target, context, Arg(Descriptor::kReceiver, object),
828 Arg(Descriptor::kName, name), Arg(Descriptor::kSlot, smi_slot), 815 Arg(Descriptor::kName, name), Arg(Descriptor::kSlot, smi_slot),
829 Arg(Descriptor::kVector, type_feedback_vector)); 816 Arg(Descriptor::kVector, type_feedback_vector));
830 }
831
832 // KeyedLoadIC <object> <slot>
833 //
834 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key
835 // in the accumulator.
836 void Interpreter::DoLdaKeyedProperty(InterpreterAssembler* assembler) {
837 Callable ic = CodeFactory::KeyedLoadICInOptimizedCode(isolate_);
838 Node* result = BuildLoadKeyedProperty(ic, assembler);
839 __ SetAccumulator(result); 817 __ SetAccumulator(result);
840 __ Dispatch(); 818 __ Dispatch();
841 } 819 }
842 820
843 // LdrKeyedProperty <object> <slot> <reg>
844 //
845 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key
846 // in the accumulator and puts the result in register <reg>.
847 void Interpreter::DoLdrKeyedProperty(InterpreterAssembler* assembler) {
848 Callable ic = CodeFactory::KeyedLoadICInOptimizedCode(isolate_);
849 Node* result = BuildLoadKeyedProperty(ic, assembler);
850 Node* destination = __ BytecodeOperandReg(2);
851 __ StoreRegister(result, destination);
852 __ Dispatch();
853 }
854
855 void Interpreter::DoStoreIC(Callable ic, InterpreterAssembler* assembler) { 821 void Interpreter::DoStoreIC(Callable ic, InterpreterAssembler* assembler) {
856 typedef StoreWithVectorDescriptor Descriptor; 822 typedef StoreWithVectorDescriptor Descriptor;
857 Node* code_target = __ HeapConstant(ic.code()); 823 Node* code_target = __ HeapConstant(ic.code());
858 Node* object_reg_index = __ BytecodeOperandReg(0); 824 Node* object_reg_index = __ BytecodeOperandReg(0);
859 Node* object = __ LoadRegister(object_reg_index); 825 Node* object = __ LoadRegister(object_reg_index);
860 Node* constant_index = __ BytecodeOperandIdx(1); 826 Node* constant_index = __ BytecodeOperandIdx(1);
861 Node* name = __ LoadConstantPoolEntry(constant_index); 827 Node* name = __ LoadConstantPoolEntry(constant_index);
862 Node* value = __ GetAccumulator(); 828 Node* value = __ GetAccumulator();
863 Node* raw_slot = __ BytecodeOperandIdx(2); 829 Node* raw_slot = __ BytecodeOperandIdx(2);
864 Node* smi_slot = __ SmiTag(raw_slot); 830 Node* smi_slot = __ SmiTag(raw_slot);
(...skipping 1911 matching lines...) Expand 10 before | Expand all | Expand 10 after
2776 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, 2742 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset,
2777 __ SmiTag(new_state)); 2743 __ SmiTag(new_state));
2778 __ SetAccumulator(old_state); 2744 __ SetAccumulator(old_state);
2779 2745
2780 __ Dispatch(); 2746 __ Dispatch();
2781 } 2747 }
2782 2748
2783 } // namespace interpreter 2749 } // namespace interpreter
2784 } // namespace internal 2750 } // namespace internal
2785 } // namespace v8 2751 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/interpreter.h ('k') | src/interpreter/mkpeephole.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698