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

Side by Side Diff: src/full-codegen.h

Issue 1161623002: VectorICs: allocating slots for store ics in ast nodes. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Code comments. Created 5 years, 6 months 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/ast-numbering.cc ('k') | src/ia32/full-codegen-ia32.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #ifndef V8_FULL_CODEGEN_H_ 5 #ifndef V8_FULL_CODEGEN_H_
6 #define V8_FULL_CODEGEN_H_ 6 #define V8_FULL_CODEGEN_H_
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/allocation.h" 10 #include "src/allocation.h"
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 void EmitResolvePossiblyDirectEval(int arg_count); 584 void EmitResolvePossiblyDirectEval(int arg_count);
585 585
586 // Platform-specific support for allocating a new closure based on 586 // Platform-specific support for allocating a new closure based on
587 // the given function info. 587 // the given function info.
588 void EmitNewClosure(Handle<SharedFunctionInfo> info, bool pretenure); 588 void EmitNewClosure(Handle<SharedFunctionInfo> info, bool pretenure);
589 589
590 // Re-usable portions of CallRuntime 590 // Re-usable portions of CallRuntime
591 void EmitLoadJSRuntimeFunction(CallRuntime* expr); 591 void EmitLoadJSRuntimeFunction(CallRuntime* expr);
592 void EmitCallJSRuntimeFunction(CallRuntime* expr); 592 void EmitCallJSRuntimeFunction(CallRuntime* expr);
593 593
594 // Platform-specific support for compiling assignments.
595
596 // Left-hand side can only be a property, a global or a (parameter or local)
597 // slot.
598 enum LhsKind {
599 VARIABLE,
600 NAMED_PROPERTY,
601 KEYED_PROPERTY,
602 NAMED_SUPER_PROPERTY,
603 KEYED_SUPER_PROPERTY
604 };
605
606 static LhsKind GetAssignType(Property* property) {
607 if (property == NULL) return VARIABLE;
608 bool super_access = property->IsSuperAccess();
609 return (property->key()->IsPropertyName())
610 ? (super_access ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY)
611 : (super_access ? KEYED_SUPER_PROPERTY : KEYED_PROPERTY);
612 }
613
614 // Load a value from a named property. 594 // Load a value from a named property.
615 // The receiver is left on the stack by the IC. 595 // The receiver is left on the stack by the IC.
616 void EmitNamedPropertyLoad(Property* expr); 596 void EmitNamedPropertyLoad(Property* expr);
617 597
618 // Load a value from super.named property. 598 // Load a value from super.named property.
619 // Expect receiver ('this' value) and home_object on the stack. 599 // Expect receiver ('this' value) and home_object on the stack.
620 void EmitNamedSuperPropertyLoad(Property* expr); 600 void EmitNamedSuperPropertyLoad(Property* expr);
621 601
622 // Load a value from super[keyed] property. 602 // Load a value from super[keyed] property.
623 // Expect receiver ('this' value), home_object and key on the stack. 603 // Expect receiver ('this' value), home_object and key on the stack.
(...skipping 16 matching lines...) Expand all
640 void EmitBinaryOp(BinaryOperation* expr, Token::Value op); 620 void EmitBinaryOp(BinaryOperation* expr, Token::Value op);
641 621
642 // Helper functions for generating inlined smi code for certain 622 // Helper functions for generating inlined smi code for certain
643 // binary operations. 623 // binary operations.
644 void EmitInlineSmiBinaryOp(BinaryOperation* expr, 624 void EmitInlineSmiBinaryOp(BinaryOperation* expr,
645 Token::Value op, 625 Token::Value op,
646 Expression* left, 626 Expression* left,
647 Expression* right); 627 Expression* right);
648 628
649 // Assign to the given expression as if via '='. The right-hand-side value 629 // Assign to the given expression as if via '='. The right-hand-side value
650 // is expected in the accumulator. 630 // is expected in the accumulator. slot is only used if FLAG_vector_stores
651 void EmitAssignment(Expression* expr); 631 // is true.
632 void EmitAssignment(Expression* expr, FeedbackVectorICSlot slot =
633 FeedbackVectorICSlot::Invalid());
652 634
653 // Complete a variable assignment. The right-hand-side value is expected 635 // Complete a variable assignment. The right-hand-side value is expected
654 // in the accumulator. 636 // in the accumulator.
655 void EmitVariableAssignment(Variable* var, 637 void EmitVariableAssignment(
656 Token::Value op); 638 Variable* var, Token::Value op,
639 FeedbackVectorICSlot slot = FeedbackVectorICSlot::Invalid());
657 640
658 // Helper functions to EmitVariableAssignment 641 // Helper functions to EmitVariableAssignment
659 void EmitStoreToStackLocalOrContextSlot(Variable* var, 642 void EmitStoreToStackLocalOrContextSlot(Variable* var,
660 MemOperand location); 643 MemOperand location);
661 644
662 // Complete a named property assignment. The receiver is expected on top 645 // Complete a named property assignment. The receiver is expected on top
663 // of the stack and the right-hand-side value in the accumulator. 646 // of the stack and the right-hand-side value in the accumulator.
664 void EmitNamedPropertyAssignment(Assignment* expr); 647 void EmitNamedPropertyAssignment(Assignment* expr);
665 648
666 // Complete a super named property assignment. The right-hand-side value 649 // Complete a super named property assignment. The right-hand-side value
(...skipping 11 matching lines...) Expand all
678 661
679 void EmitLoadHomeObject(SuperReference* expr); 662 void EmitLoadHomeObject(SuperReference* expr);
680 663
681 static bool NeedsHomeObject(Expression* expr) { 664 static bool NeedsHomeObject(Expression* expr) {
682 return FunctionLiteral::NeedsHomeObject(expr); 665 return FunctionLiteral::NeedsHomeObject(expr);
683 } 666 }
684 667
685 // Adds the [[HomeObject]] to |initializer| if it is a FunctionLiteral. 668 // Adds the [[HomeObject]] to |initializer| if it is a FunctionLiteral.
686 // The value of the initializer is expected to be at the top of the stack. 669 // The value of the initializer is expected to be at the top of the stack.
687 // |offset| is the offset in the stack where the home object can be found. 670 // |offset| is the offset in the stack where the home object can be found.
688 void EmitSetHomeObjectIfNeeded(Expression* initializer, int offset); 671 void EmitSetHomeObjectIfNeeded(
672 Expression* initializer, int offset,
673 FeedbackVectorICSlot slot = FeedbackVectorICSlot::Invalid());
689 674
690 void EmitLoadSuperConstructor(); 675 void EmitLoadSuperConstructor();
691 void EmitInitializeThisAfterSuper(SuperReference* super_ref); 676 void EmitInitializeThisAfterSuper(
677 SuperReference* super_ref,
678 FeedbackVectorICSlot slot = FeedbackVectorICSlot::Invalid());
692 679
693 void CallIC(Handle<Code> code, 680 void CallIC(Handle<Code> code,
694 TypeFeedbackId id = TypeFeedbackId::None()); 681 TypeFeedbackId id = TypeFeedbackId::None());
695 682
696 void CallLoadIC(ContextualMode mode, 683 void CallLoadIC(ContextualMode mode,
697 TypeFeedbackId id = TypeFeedbackId::None()); 684 TypeFeedbackId id = TypeFeedbackId::None());
698 void CallGlobalLoadIC(Handle<String> name); 685 void CallGlobalLoadIC(Handle<String> name);
699 void CallStoreIC(TypeFeedbackId id = TypeFeedbackId::None()); 686 void CallStoreIC(TypeFeedbackId id = TypeFeedbackId::None());
700 687
701 void SetFunctionPosition(FunctionLiteral* fun); 688 void SetFunctionPosition(FunctionLiteral* fun);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 746
760 void VisitForTypeofValue(Expression* expr); 747 void VisitForTypeofValue(Expression* expr);
761 748
762 void Generate(); 749 void Generate();
763 void PopulateDeoptimizationData(Handle<Code> code); 750 void PopulateDeoptimizationData(Handle<Code> code);
764 void PopulateTypeFeedbackInfo(Handle<Code> code); 751 void PopulateTypeFeedbackInfo(Handle<Code> code);
765 752
766 bool MustCreateObjectLiteralWithRuntime(ObjectLiteral* expr) const; 753 bool MustCreateObjectLiteralWithRuntime(ObjectLiteral* expr) const;
767 bool MustCreateArrayLiteralWithRuntime(ArrayLiteral* expr) const; 754 bool MustCreateArrayLiteralWithRuntime(ArrayLiteral* expr) const;
768 755
756 void EmitLoadStoreICSlot(FeedbackVectorICSlot slot);
757
769 Handle<HandlerTable> handler_table() { return handler_table_; } 758 Handle<HandlerTable> handler_table() { return handler_table_; }
770 759
771 struct BailoutEntry { 760 struct BailoutEntry {
772 BailoutId id; 761 BailoutId id;
773 unsigned pc_and_state; 762 unsigned pc_and_state;
774 }; 763 };
775 764
776 struct BackEdgeEntry { 765 struct BackEdgeEntry {
777 BailoutId id; 766 BailoutId id;
778 unsigned pc; 767 unsigned pc;
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 1085
1097 Address start_; 1086 Address start_;
1098 Address instruction_start_; 1087 Address instruction_start_;
1099 uint32_t length_; 1088 uint32_t length_;
1100 }; 1089 };
1101 1090
1102 1091
1103 } } // namespace v8::internal 1092 } } // namespace v8::internal
1104 1093
1105 #endif // V8_FULL_CODEGEN_H_ 1094 #endif // V8_FULL_CODEGEN_H_
OLDNEW
« no previous file with comments | « src/ast-numbering.cc ('k') | src/ia32/full-codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698