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

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

Issue 2473003004: [compiler] Generalize context load/store operations in code-stub-assembler. (Closed)
Patch Set: Remove tests. 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/code-stub-assembler.cc ('k') | src/interpreter/interpreter-assembler.h » ('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 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 DoStaGlobal(ic, assembler); 534 DoStaGlobal(ic, assembler);
535 } 535 }
536 536
537 compiler::Node* Interpreter::BuildLoadContextSlot( 537 compiler::Node* Interpreter::BuildLoadContextSlot(
538 InterpreterAssembler* assembler) { 538 InterpreterAssembler* assembler) {
539 Node* reg_index = __ BytecodeOperandReg(0); 539 Node* reg_index = __ BytecodeOperandReg(0);
540 Node* context = __ LoadRegister(reg_index); 540 Node* context = __ LoadRegister(reg_index);
541 Node* slot_index = __ BytecodeOperandIdx(1); 541 Node* slot_index = __ BytecodeOperandIdx(1);
542 Node* depth = __ BytecodeOperandUImm(2); 542 Node* depth = __ BytecodeOperandUImm(2);
543 Node* slot_context = __ GetContextAtDepth(context, depth); 543 Node* slot_context = __ GetContextAtDepth(context, depth);
544 return __ LoadContextSlot(slot_context, slot_index); 544 return __ LoadContextElement(slot_context, slot_index);
545 } 545 }
546 546
547 compiler::Node* Interpreter::BuildLoadCurrentContextSlot( 547 compiler::Node* Interpreter::BuildLoadCurrentContextSlot(
548 InterpreterAssembler* assembler) { 548 InterpreterAssembler* assembler) {
549 Node* slot_index = __ BytecodeOperandIdx(0); 549 Node* slot_index = __ BytecodeOperandIdx(0);
550 Node* slot_context = __ GetContext(); 550 Node* slot_context = __ GetContext();
551 return __ LoadContextSlot(slot_context, slot_index); 551 return __ LoadContextElement(slot_context, slot_index);
552 } 552 }
553 553
554 // LdaContextSlot <context> <slot_index> <depth> 554 // LdaContextSlot <context> <slot_index> <depth>
555 // 555 //
556 // Load the object in |slot_index| of the context at |depth| in the context 556 // Load the object in |slot_index| of the context at |depth| in the context
557 // chain starting at |context| into the accumulator. 557 // chain starting at |context| into the accumulator.
558 void Interpreter::DoLdaContextSlot(InterpreterAssembler* assembler) { 558 void Interpreter::DoLdaContextSlot(InterpreterAssembler* assembler) {
559 Node* result = BuildLoadContextSlot(assembler); 559 Node* result = BuildLoadContextSlot(assembler);
560 __ SetAccumulator(result); 560 __ SetAccumulator(result);
561 __ Dispatch(); 561 __ Dispatch();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 // 595 //
596 // Stores the object in the accumulator into |slot_index| of the context at 596 // Stores the object in the accumulator into |slot_index| of the context at
597 // |depth| in the context chain starting at |context|. 597 // |depth| in the context chain starting at |context|.
598 void Interpreter::DoStaContextSlot(InterpreterAssembler* assembler) { 598 void Interpreter::DoStaContextSlot(InterpreterAssembler* assembler) {
599 Node* value = __ GetAccumulator(); 599 Node* value = __ GetAccumulator();
600 Node* reg_index = __ BytecodeOperandReg(0); 600 Node* reg_index = __ BytecodeOperandReg(0);
601 Node* context = __ LoadRegister(reg_index); 601 Node* context = __ LoadRegister(reg_index);
602 Node* slot_index = __ BytecodeOperandIdx(1); 602 Node* slot_index = __ BytecodeOperandIdx(1);
603 Node* depth = __ BytecodeOperandUImm(2); 603 Node* depth = __ BytecodeOperandUImm(2);
604 Node* slot_context = __ GetContextAtDepth(context, depth); 604 Node* slot_context = __ GetContextAtDepth(context, depth);
605 __ StoreContextSlot(slot_context, slot_index, value); 605 __ StoreContextElement(slot_context, slot_index, value);
606 __ Dispatch(); 606 __ Dispatch();
607 } 607 }
608 608
609 // StaCurrentContextSlot <slot_index> 609 // StaCurrentContextSlot <slot_index>
610 // 610 //
611 // Stores the object in the accumulator into |slot_index| of the current 611 // Stores the object in the accumulator into |slot_index| of the current
612 // context. 612 // context.
613 void Interpreter::DoStaCurrentContextSlot(InterpreterAssembler* assembler) { 613 void Interpreter::DoStaCurrentContextSlot(InterpreterAssembler* assembler) {
614 Node* value = __ GetAccumulator(); 614 Node* value = __ GetAccumulator();
615 Node* slot_index = __ BytecodeOperandIdx(0); 615 Node* slot_index = __ BytecodeOperandIdx(0);
616 Node* slot_context = __ GetContext(); 616 Node* slot_context = __ GetContext();
617 __ StoreContextSlot(slot_context, slot_index, value); 617 __ StoreContextElement(slot_context, slot_index, value);
618 __ Dispatch(); 618 __ Dispatch();
619 } 619 }
620 620
621 void Interpreter::DoLdaLookupSlot(Runtime::FunctionId function_id, 621 void Interpreter::DoLdaLookupSlot(Runtime::FunctionId function_id,
622 InterpreterAssembler* assembler) { 622 InterpreterAssembler* assembler) {
623 Node* name_index = __ BytecodeOperandIdx(0); 623 Node* name_index = __ BytecodeOperandIdx(0);
624 Node* name = __ LoadConstantPoolEntry(name_index); 624 Node* name = __ LoadConstantPoolEntry(name_index);
625 Node* context = __ GetContext(); 625 Node* context = __ GetContext();
626 Node* result = __ CallRuntime(function_id, context, name); 626 Node* result = __ CallRuntime(function_id, context, name);
627 __ SetAccumulator(result); 627 __ SetAccumulator(result);
(...skipping 24 matching lines...) Expand all
652 Node* depth = __ BytecodeOperandUImm(2); 652 Node* depth = __ BytecodeOperandUImm(2);
653 653
654 Label slowpath(assembler, Label::kDeferred); 654 Label slowpath(assembler, Label::kDeferred);
655 655
656 // Check for context extensions to allow the fast path. 656 // Check for context extensions to allow the fast path.
657 __ GotoIfHasContextExtensionUpToDepth(context, depth, &slowpath); 657 __ GotoIfHasContextExtensionUpToDepth(context, depth, &slowpath);
658 658
659 // Fast path does a normal load context. 659 // Fast path does a normal load context.
660 { 660 {
661 Node* slot_context = __ GetContextAtDepth(context, depth); 661 Node* slot_context = __ GetContextAtDepth(context, depth);
662 Node* result = __ LoadContextSlot(slot_context, slot_index); 662 Node* result = __ LoadContextElement(slot_context, slot_index);
663 __ SetAccumulator(result); 663 __ SetAccumulator(result);
664 __ Dispatch(); 664 __ Dispatch();
665 } 665 }
666 666
667 // Slow path when we have to call out to the runtime. 667 // Slow path when we have to call out to the runtime.
668 __ Bind(&slowpath); 668 __ Bind(&slowpath);
669 { 669 {
670 Node* name = __ LoadConstantPoolEntry(name_index); 670 Node* name = __ LoadConstantPoolEntry(name_index);
671 Node* result = __ CallRuntime(function_id, context, name); 671 Node* result = __ CallRuntime(function_id, context, name);
672 __ SetAccumulator(result); 672 __ SetAccumulator(result);
(...skipping 1078 matching lines...) Expand 10 before | Expand all | Expand 10 after
1751 Node* context_index = __ BytecodeOperandIdx(0); 1751 Node* context_index = __ BytecodeOperandIdx(0);
1752 Node* receiver_reg = __ BytecodeOperandReg(1); 1752 Node* receiver_reg = __ BytecodeOperandReg(1);
1753 Node* first_arg = __ RegisterLocation(receiver_reg); 1753 Node* first_arg = __ RegisterLocation(receiver_reg);
1754 Node* receiver_args_count = __ BytecodeOperandCount(2); 1754 Node* receiver_args_count = __ BytecodeOperandCount(2);
1755 Node* receiver_count = __ Int32Constant(1); 1755 Node* receiver_count = __ Int32Constant(1);
1756 Node* args_count = __ Int32Sub(receiver_args_count, receiver_count); 1756 Node* args_count = __ Int32Sub(receiver_args_count, receiver_count);
1757 1757
1758 // Get the function to call from the native context. 1758 // Get the function to call from the native context.
1759 Node* context = __ GetContext(); 1759 Node* context = __ GetContext();
1760 Node* native_context = __ LoadNativeContext(context); 1760 Node* native_context = __ LoadNativeContext(context);
1761 Node* function = __ LoadContextSlot(native_context, context_index); 1761 Node* function = __ LoadContextElement(native_context, context_index);
1762 1762
1763 // Call the function. 1763 // Call the function.
1764 Node* result = __ CallJS(function, context, first_arg, args_count, 1764 Node* result = __ CallJS(function, context, first_arg, args_count,
1765 TailCallMode::kDisallow); 1765 TailCallMode::kDisallow);
1766 __ SetAccumulator(result); 1766 __ SetAccumulator(result);
1767 __ Dispatch(); 1767 __ Dispatch();
1768 } 1768 }
1769 1769
1770 // New <constructor> <first_arg> <arg_count> 1770 // New <constructor> <first_arg> <arg_count>
1771 // 1771 //
(...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after
2694 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, 2694 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset,
2695 __ SmiTag(new_state)); 2695 __ SmiTag(new_state));
2696 __ SetAccumulator(old_state); 2696 __ SetAccumulator(old_state);
2697 2697
2698 __ Dispatch(); 2698 __ Dispatch();
2699 } 2699 }
2700 2700
2701 } // namespace interpreter 2701 } // namespace interpreter
2702 } // namespace internal 2702 } // namespace internal
2703 } // namespace v8 2703 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stub-assembler.cc ('k') | src/interpreter/interpreter-assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698