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

Side by Side Diff: src/hydrogen-instructions.h

Issue 1124443004: New hydrogen instruction to reduce cost of growing an array on keyed stores. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE. Created 5 years, 7 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/hydrogen.cc ('k') | src/hydrogen-instructions.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_HYDROGEN_INSTRUCTIONS_H_ 5 #ifndef V8_HYDROGEN_INSTRUCTIONS_H_
6 #define V8_HYDROGEN_INSTRUCTIONS_H_ 6 #define V8_HYDROGEN_INSTRUCTIONS_H_
7 7
8 #include <cstring> 8 #include <cstring>
9 #include <iosfwd> 9 #include <iosfwd>
10 10
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 V(LoadFunctionPrototype) \ 120 V(LoadFunctionPrototype) \
121 V(LoadGlobalGeneric) \ 121 V(LoadGlobalGeneric) \
122 V(LoadKeyed) \ 122 V(LoadKeyed) \
123 V(LoadKeyedGeneric) \ 123 V(LoadKeyedGeneric) \
124 V(LoadNamedField) \ 124 V(LoadNamedField) \
125 V(LoadNamedGeneric) \ 125 V(LoadNamedGeneric) \
126 V(LoadRoot) \ 126 V(LoadRoot) \
127 V(MapEnumLength) \ 127 V(MapEnumLength) \
128 V(MathFloorOfDiv) \ 128 V(MathFloorOfDiv) \
129 V(MathMinMax) \ 129 V(MathMinMax) \
130 V(MaybeGrowElements) \
130 V(Mod) \ 131 V(Mod) \
131 V(Mul) \ 132 V(Mul) \
132 V(OsrEntry) \ 133 V(OsrEntry) \
133 V(Parameter) \ 134 V(Parameter) \
134 V(Power) \ 135 V(Power) \
135 V(PushArguments) \ 136 V(PushArguments) \
136 V(RegExpLiteral) \ 137 V(RegExpLiteral) \
137 V(Return) \ 138 V(Return) \
138 V(Ror) \ 139 V(Ror) \
139 V(Sar) \ 140 V(Sar) \
(...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after
958 P3 p3, P4 p4) { \ 959 P3 p3, P4 p4) { \
959 return new (zone) I(context, p1, p2, p3, p4); \ 960 return new (zone) I(context, p1, p2, p3, p4); \
960 } 961 }
961 962
962 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P5(I, P1, P2, P3, P4, P5) \ 963 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P5(I, P1, P2, P3, P4, P5) \
963 static I* New(Isolate* isolate, Zone* zone, HValue* context, P1 p1, P2 p2, \ 964 static I* New(Isolate* isolate, Zone* zone, HValue* context, P1 p1, P2 p2, \
964 P3 p3, P4 p4, P5 p5) { \ 965 P3 p3, P4 p4, P5 p5) { \
965 return new (zone) I(context, p1, p2, p3, p4, p5); \ 966 return new (zone) I(context, p1, p2, p3, p4, p5); \
966 } 967 }
967 968
969 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P6(I, P1, P2, P3, P4, P5, P6) \
970 static I* New(Isolate* isolate, Zone* zone, HValue* context, P1 p1, P2 p2, \
971 P3 p3, P4 p4, P5 p5, P6 p6) { \
972 return new (zone) I(context, p1, p2, p3, p4, p5, p6); \
973 }
974
968 975
969 // A helper class to represent per-operand position information attached to 976 // A helper class to represent per-operand position information attached to
970 // the HInstruction in the compact form. Uses tagging to distinguish between 977 // the HInstruction in the compact form. Uses tagging to distinguish between
971 // case when only instruction's position is available and case when operands' 978 // case when only instruction's position is available and case when operands'
972 // positions are also available. 979 // positions are also available.
973 // In the first case it contains intruction's position as a tagged value. 980 // In the first case it contains intruction's position as a tagged value.
974 // In the second case it points to an array which contains instruction's 981 // In the second case it points to an array which contains instruction's
975 // position and operands' positions. 982 // position and operands' positions.
976 class HPositionInfo { 983 class HPositionInfo {
977 public: 984 public:
(...skipping 6573 matching lines...) Expand 10 before | Expand all | Expand 10 after
7551 7558
7552 DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento) 7559 DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento)
7553 7560
7554 private: 7561 private:
7555 explicit HTrapAllocationMemento(HValue* obj) { 7562 explicit HTrapAllocationMemento(HValue* obj) {
7556 SetOperandAt(0, obj); 7563 SetOperandAt(0, obj);
7557 } 7564 }
7558 }; 7565 };
7559 7566
7560 7567
7568 class HMaybeGrowElements final : public HTemplateInstruction<5> {
7569 public:
7570 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P6(HMaybeGrowElements, HValue*,
7571 HValue*, HValue*, HValue*, bool,
7572 ElementsKind);
7573
7574 Representation RequiredInputRepresentation(int index) override {
7575 if (index < 3) {
7576 return Representation::Tagged();
7577 }
7578 DCHECK(index == 3 || index == 4);
7579 return Representation::Integer32();
7580 }
7581
7582 HValue* context() const { return OperandAt(0); }
7583 HValue* object() const { return OperandAt(1); }
7584 HValue* elements() const { return OperandAt(2); }
7585 HValue* key() const { return OperandAt(3); }
7586 HValue* current_capacity() const { return OperandAt(4); }
7587
7588 bool is_js_array() const { return is_js_array_; }
7589 ElementsKind kind() const { return kind_; }
7590
7591 DECLARE_CONCRETE_INSTRUCTION(MaybeGrowElements)
7592
7593 protected:
7594 bool DataEquals(HValue* other) override { return true; }
7595
7596 private:
7597 explicit HMaybeGrowElements(HValue* context, HValue* object, HValue* elements,
7598 HValue* key, HValue* current_capacity,
7599 bool is_js_array, ElementsKind kind) {
7600 is_js_array_ = is_js_array;
7601 kind_ = kind;
7602
7603 SetOperandAt(0, context);
7604 SetOperandAt(1, object);
7605 SetOperandAt(2, elements);
7606 SetOperandAt(3, key);
7607 SetOperandAt(4, current_capacity);
7608
7609 SetFlag(kUseGVN);
7610 SetChangesFlag(kElementsPointer);
7611 SetChangesFlag(kNewSpacePromotion);
7612 set_representation(Representation::Tagged());
7613 }
7614
7615 bool is_js_array_;
7616 ElementsKind kind_;
7617 };
7618
7619
7561 class HToFastProperties final : public HUnaryOperation { 7620 class HToFastProperties final : public HUnaryOperation {
7562 public: 7621 public:
7563 DECLARE_INSTRUCTION_FACTORY_P1(HToFastProperties, HValue*); 7622 DECLARE_INSTRUCTION_FACTORY_P1(HToFastProperties, HValue*);
7564 7623
7565 Representation RequiredInputRepresentation(int index) override { 7624 Representation RequiredInputRepresentation(int index) override {
7566 return Representation::Tagged(); 7625 return Representation::Tagged();
7567 } 7626 }
7568 7627
7569 DECLARE_CONCRETE_INSTRUCTION(ToFastProperties) 7628 DECLARE_CONCRETE_INSTRUCTION(ToFastProperties)
7570 7629
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
7886 }; 7945 };
7887 7946
7888 7947
7889 7948
7890 #undef DECLARE_INSTRUCTION 7949 #undef DECLARE_INSTRUCTION
7891 #undef DECLARE_CONCRETE_INSTRUCTION 7950 #undef DECLARE_CONCRETE_INSTRUCTION
7892 7951
7893 } } // namespace v8::internal 7952 } } // namespace v8::internal
7894 7953
7895 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 7954 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« no previous file with comments | « src/hydrogen.cc ('k') | src/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698