OLD | NEW |
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 "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/allocation.h" | 10 #include "src/allocation.h" |
11 #include "src/code-stubs.h" | 11 #include "src/code-stubs.h" |
12 #include "src/conversions.h" | 12 #include "src/conversions.h" |
13 #include "src/data-flow.h" | 13 #include "src/data-flow.h" |
14 #include "src/deoptimizer.h" | 14 #include "src/deoptimizer.h" |
15 #include "src/hydrogen-types.h" | 15 #include "src/hydrogen-types.h" |
| 16 #include "src/ostreams.h" |
16 #include "src/small-pointer-list.h" | 17 #include "src/small-pointer-list.h" |
17 #include "src/string-stream.h" | |
18 #include "src/unique.h" | 18 #include "src/unique.h" |
19 #include "src/utils.h" | 19 #include "src/utils.h" |
20 #include "src/zone.h" | 20 #include "src/zone.h" |
21 | 21 |
22 namespace v8 { | 22 namespace v8 { |
23 namespace internal { | 23 namespace internal { |
24 | 24 |
25 // Forward declarations. | 25 // Forward declarations. |
| 26 class ChangesOf; |
26 class HBasicBlock; | 27 class HBasicBlock; |
27 class HDiv; | 28 class HDiv; |
28 class HEnvironment; | 29 class HEnvironment; |
29 class HInferRepresentationPhase; | 30 class HInferRepresentationPhase; |
30 class HInstruction; | 31 class HInstruction; |
31 class HLoopInformation; | 32 class HLoopInformation; |
32 class HStoreNamedField; | 33 class HStoreNamedField; |
33 class HValue; | 34 class HValue; |
34 class LInstruction; | 35 class LInstruction; |
35 class LChunkBuilder; | 36 class LChunkBuilder; |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 | 439 |
439 int inlining_id() const { return InliningIdField::decode(value_); } | 440 int inlining_id() const { return InliningIdField::decode(value_); } |
440 void set_inlining_id(int inlining_id) { | 441 void set_inlining_id(int inlining_id) { |
441 if (FLAG_hydrogen_track_positions) { | 442 if (FLAG_hydrogen_track_positions) { |
442 value_ = static_cast<int>(InliningIdField::update(value_, inlining_id)); | 443 value_ = static_cast<int>(InliningIdField::update(value_, inlining_id)); |
443 } | 444 } |
444 } | 445 } |
445 | 446 |
446 int raw() const { return value_; } | 447 int raw() const { return value_; } |
447 | 448 |
448 void PrintTo(FILE* f); | |
449 | |
450 private: | 449 private: |
451 typedef BitField<int, 0, 9> InliningIdField; | 450 typedef BitField<int, 0, 9> InliningIdField; |
452 | 451 |
453 // Offset from the start of the inlined function. | 452 // Offset from the start of the inlined function. |
454 typedef BitField<int, 9, 22> PositionField; | 453 typedef BitField<int, 9, 22> PositionField; |
455 | 454 |
456 // On HPositionInfo can use this constructor. | 455 // On HPositionInfo can use this constructor. |
457 explicit HSourcePosition(int value) : value_(value) { } | 456 explicit HSourcePosition(int value) : value_(value) { } |
458 | 457 |
459 friend class HPositionInfo; | 458 friend class HPositionInfo; |
460 | 459 |
461 // If FLAG_hydrogen_track_positions is set contains bitfields InliningIdField | 460 // If FLAG_hydrogen_track_positions is set contains bitfields InliningIdField |
462 // and PositionField. | 461 // and PositionField. |
463 // Otherwise contains absolute offset from the script start. | 462 // Otherwise contains absolute offset from the script start. |
464 int value_; | 463 int value_; |
465 }; | 464 }; |
466 | 465 |
467 | 466 |
| 467 OStream& operator<<(OStream& os, const HSourcePosition& p); |
| 468 |
| 469 |
468 class HValue : public ZoneObject { | 470 class HValue : public ZoneObject { |
469 public: | 471 public: |
470 static const int kNoNumber = -1; | 472 static const int kNoNumber = -1; |
471 | 473 |
472 enum Flag { | 474 enum Flag { |
473 kFlexibleRepresentation, | 475 kFlexibleRepresentation, |
474 kCannotBeTagged, | 476 kCannotBeTagged, |
475 // Participate in Global Value Numbering, i.e. elimination of | 477 // Participate in Global Value Numbering, i.e. elimination of |
476 // unnecessary recomputations. If an instruction sets this flag, it must | 478 // unnecessary recomputations. If an instruction sets this flag, it must |
477 // implement DataEquals(), which will be used to determine if other | 479 // implement DataEquals(), which will be used to determine if other |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 return value; | 651 return value; |
650 } | 652 } |
651 | 653 |
652 bool IsInteger32Constant(); | 654 bool IsInteger32Constant(); |
653 int32_t GetInteger32Constant(); | 655 int32_t GetInteger32Constant(); |
654 bool EqualsInteger32Constant(int32_t value); | 656 bool EqualsInteger32Constant(int32_t value); |
655 | 657 |
656 bool IsDefinedAfter(HBasicBlock* other) const; | 658 bool IsDefinedAfter(HBasicBlock* other) const; |
657 | 659 |
658 // Operands. | 660 // Operands. |
659 virtual int OperandCount() = 0; | 661 virtual int OperandCount() const = 0; |
660 virtual HValue* OperandAt(int index) const = 0; | 662 virtual HValue* OperandAt(int index) const = 0; |
661 void SetOperandAt(int index, HValue* value); | 663 void SetOperandAt(int index, HValue* value); |
662 | 664 |
663 void DeleteAndReplaceWith(HValue* other); | 665 void DeleteAndReplaceWith(HValue* other); |
664 void ReplaceAllUsesWith(HValue* other); | 666 void ReplaceAllUsesWith(HValue* other); |
665 bool HasNoUses() const { return use_list_ == NULL; } | 667 bool HasNoUses() const { return use_list_ == NULL; } |
666 bool HasOneUse() const { | 668 bool HasOneUse() const { |
667 return use_list_ != NULL && use_list_->tail() == NULL; | 669 return use_list_ != NULL && use_list_->tail() == NULL; |
668 } | 670 } |
669 bool HasMultipleUses() const { | 671 bool HasMultipleUses() const { |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
758 // then return it. Return NULL to have the instruction deleted. | 760 // then return it. Return NULL to have the instruction deleted. |
759 virtual HValue* Canonicalize() { return this; } | 761 virtual HValue* Canonicalize() { return this; } |
760 | 762 |
761 bool Equals(HValue* other); | 763 bool Equals(HValue* other); |
762 virtual intptr_t Hashcode(); | 764 virtual intptr_t Hashcode(); |
763 | 765 |
764 // Compute unique ids upfront that is safe wrt GC and concurrent compilation. | 766 // Compute unique ids upfront that is safe wrt GC and concurrent compilation. |
765 virtual void FinalizeUniqueness() { } | 767 virtual void FinalizeUniqueness() { } |
766 | 768 |
767 // Printing support. | 769 // Printing support. |
768 virtual void PrintTo(StringStream* stream) = 0; | 770 virtual OStream& PrintTo(OStream& os) const = 0; // NOLINT |
769 void PrintNameTo(StringStream* stream); | |
770 void PrintTypeTo(StringStream* stream); | |
771 void PrintChangesTo(StringStream* stream); | |
772 | 771 |
773 const char* Mnemonic() const; | 772 const char* Mnemonic() const; |
774 | 773 |
775 // Type information helpers. | 774 // Type information helpers. |
776 bool HasMonomorphicJSObjectType(); | 775 bool HasMonomorphicJSObjectType(); |
777 | 776 |
778 // TODO(mstarzinger): For now instructions can override this function to | 777 // TODO(mstarzinger): For now instructions can override this function to |
779 // specify statically known types, once HType can convey more information | 778 // specify statically known types, once HType can convey more information |
780 // it should be based on the HType. | 779 // it should be based on the HType. |
781 virtual Handle<Map> GetMonomorphicJSObjectMap() { return Handle<Map>(); } | 780 virtual Handle<Map> GetMonomorphicJSObjectMap() { return Handle<Map>(); } |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
878 #undef ADD_FLAG | 877 #undef ADD_FLAG |
879 return result; | 878 return result; |
880 } | 879 } |
881 | 880 |
882 // A flag mask to mark an instruction as having arbitrary side effects. | 881 // A flag mask to mark an instruction as having arbitrary side effects. |
883 static GVNFlagSet AllSideEffectsFlagSet() { | 882 static GVNFlagSet AllSideEffectsFlagSet() { |
884 GVNFlagSet result = AllFlagSet(); | 883 GVNFlagSet result = AllFlagSet(); |
885 result.Remove(kOsrEntries); | 884 result.Remove(kOsrEntries); |
886 return result; | 885 return result; |
887 } | 886 } |
| 887 friend OStream& operator<<(OStream& os, const ChangesOf& v); |
888 | 888 |
889 // A flag mask of all side effects that can make observable changes in | 889 // A flag mask of all side effects that can make observable changes in |
890 // an executing program (i.e. are not safe to repeat, move or remove); | 890 // an executing program (i.e. are not safe to repeat, move or remove); |
891 static GVNFlagSet AllObservableSideEffectsFlagSet() { | 891 static GVNFlagSet AllObservableSideEffectsFlagSet() { |
892 GVNFlagSet result = AllFlagSet(); | 892 GVNFlagSet result = AllFlagSet(); |
893 result.Remove(kNewSpacePromotion); | 893 result.Remove(kNewSpacePromotion); |
894 result.Remove(kElementsKind); | 894 result.Remove(kElementsKind); |
895 result.Remove(kElementsPointer); | 895 result.Remove(kElementsPointer); |
896 result.Remove(kMaps); | 896 result.Remove(kMaps); |
897 return result; | 897 return result; |
(...skipping 21 matching lines...) Expand all Loading... |
919 int flags_; | 919 int flags_; |
920 GVNFlagSet changes_flags_; | 920 GVNFlagSet changes_flags_; |
921 GVNFlagSet depends_on_flags_; | 921 GVNFlagSet depends_on_flags_; |
922 | 922 |
923 private: | 923 private: |
924 virtual bool IsDeletable() const { return false; } | 924 virtual bool IsDeletable() const { return false; } |
925 | 925 |
926 DISALLOW_COPY_AND_ASSIGN(HValue); | 926 DISALLOW_COPY_AND_ASSIGN(HValue); |
927 }; | 927 }; |
928 | 928 |
| 929 // Support for printing various aspects of an HValue. |
| 930 struct NameOf { |
| 931 explicit NameOf(const HValue* const v) : value(v) {} |
| 932 const HValue* value; |
| 933 }; |
| 934 |
| 935 |
| 936 struct TypeOf { |
| 937 explicit TypeOf(const HValue* const v) : value(v) {} |
| 938 const HValue* value; |
| 939 }; |
| 940 |
| 941 |
| 942 struct ChangesOf { |
| 943 explicit ChangesOf(const HValue* const v) : value(v) {} |
| 944 const HValue* value; |
| 945 }; |
| 946 |
929 | 947 |
930 OStream& operator<<(OStream& os, const HValue& v); | 948 OStream& operator<<(OStream& os, const HValue& v); |
| 949 OStream& operator<<(OStream& os, const NameOf& v); |
| 950 OStream& operator<<(OStream& os, const TypeOf& v); |
| 951 OStream& operator<<(OStream& os, const ChangesOf& v); |
931 | 952 |
932 | 953 |
933 #define DECLARE_INSTRUCTION_FACTORY_P0(I) \ | 954 #define DECLARE_INSTRUCTION_FACTORY_P0(I) \ |
934 static I* New(Zone* zone, HValue* context) { \ | 955 static I* New(Zone* zone, HValue* context) { \ |
935 return new(zone) I(); \ | 956 return new(zone) I(); \ |
936 } | 957 } |
937 | 958 |
938 #define DECLARE_INSTRUCTION_FACTORY_P1(I, P1) \ | 959 #define DECLARE_INSTRUCTION_FACTORY_P1(I, P1) \ |
939 static I* New(Zone* zone, HValue* context, P1 p1) { \ | 960 static I* New(Zone* zone, HValue* context, P1 p1) { \ |
940 return new(zone) I(p1); \ | 961 return new(zone) I(p1); \ |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1116 | 1137 |
1117 intptr_t data_; | 1138 intptr_t data_; |
1118 }; | 1139 }; |
1119 | 1140 |
1120 | 1141 |
1121 class HInstruction : public HValue { | 1142 class HInstruction : public HValue { |
1122 public: | 1143 public: |
1123 HInstruction* next() const { return next_; } | 1144 HInstruction* next() const { return next_; } |
1124 HInstruction* previous() const { return previous_; } | 1145 HInstruction* previous() const { return previous_; } |
1125 | 1146 |
1126 virtual void PrintTo(StringStream* stream) V8_OVERRIDE; | 1147 virtual OStream& PrintTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1127 virtual void PrintDataTo(StringStream* stream); | 1148 virtual OStream& PrintDataTo(OStream& os) const; // NOLINT |
1128 | 1149 |
1129 bool IsLinked() const { return block() != NULL; } | 1150 bool IsLinked() const { return block() != NULL; } |
1130 void Unlink(); | 1151 void Unlink(); |
1131 | 1152 |
1132 void InsertBefore(HInstruction* next); | 1153 void InsertBefore(HInstruction* next); |
1133 | 1154 |
1134 template<class T> T* Prepend(T* instr) { | 1155 template<class T> T* Prepend(T* instr) { |
1135 instr->InsertBefore(this); | 1156 instr->InsertBefore(this); |
1136 return instr; | 1157 return instr; |
1137 } | 1158 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1192 } | 1213 } |
1193 | 1214 |
1194 virtual void DeleteFromGraph() V8_OVERRIDE { Unlink(); } | 1215 virtual void DeleteFromGraph() V8_OVERRIDE { Unlink(); } |
1195 | 1216 |
1196 private: | 1217 private: |
1197 void InitializeAsFirst(HBasicBlock* block) { | 1218 void InitializeAsFirst(HBasicBlock* block) { |
1198 ASSERT(!IsLinked()); | 1219 ASSERT(!IsLinked()); |
1199 SetBlock(block); | 1220 SetBlock(block); |
1200 } | 1221 } |
1201 | 1222 |
1202 void PrintMnemonicTo(StringStream* stream); | |
1203 | |
1204 HInstruction* next_; | 1223 HInstruction* next_; |
1205 HInstruction* previous_; | 1224 HInstruction* previous_; |
1206 HPositionInfo position_; | 1225 HPositionInfo position_; |
1207 | 1226 |
1208 friend class HBasicBlock; | 1227 friend class HBasicBlock; |
1209 }; | 1228 }; |
1210 | 1229 |
1211 | 1230 |
1212 template<int V> | 1231 template<int V> |
1213 class HTemplateInstruction : public HInstruction { | 1232 class HTemplateInstruction : public HInstruction { |
1214 public: | 1233 public: |
1215 virtual int OperandCount() V8_FINAL V8_OVERRIDE { return V; } | 1234 virtual int OperandCount() const V8_FINAL V8_OVERRIDE { return V; } |
1216 virtual HValue* OperandAt(int i) const V8_FINAL V8_OVERRIDE { | 1235 virtual HValue* OperandAt(int i) const V8_FINAL V8_OVERRIDE { |
1217 return inputs_[i]; | 1236 return inputs_[i]; |
1218 } | 1237 } |
1219 | 1238 |
1220 protected: | 1239 protected: |
1221 HTemplateInstruction(HType type = HType::Tagged()) : HInstruction(type) {} | 1240 HTemplateInstruction(HType type = HType::Tagged()) : HInstruction(type) {} |
1222 | 1241 |
1223 virtual void InternalSetOperandAt(int i, HValue* value) V8_FINAL V8_OVERRIDE { | 1242 virtual void InternalSetOperandAt(int i, HValue* value) V8_FINAL V8_OVERRIDE { |
1224 inputs_[i] = value; | 1243 inputs_[i] = value; |
1225 } | 1244 } |
1226 | 1245 |
1227 private: | 1246 private: |
1228 EmbeddedContainer<HValue*, V> inputs_; | 1247 EmbeddedContainer<HValue*, V> inputs_; |
1229 }; | 1248 }; |
1230 | 1249 |
1231 | 1250 |
1232 class HControlInstruction : public HInstruction { | 1251 class HControlInstruction : public HInstruction { |
1233 public: | 1252 public: |
1234 virtual HBasicBlock* SuccessorAt(int i) = 0; | 1253 virtual HBasicBlock* SuccessorAt(int i) const = 0; |
1235 virtual int SuccessorCount() = 0; | 1254 virtual int SuccessorCount() const = 0; |
1236 virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0; | 1255 virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0; |
1237 | 1256 |
1238 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1257 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1239 | 1258 |
1240 virtual bool KnownSuccessorBlock(HBasicBlock** block) { | 1259 virtual bool KnownSuccessorBlock(HBasicBlock** block) { |
1241 *block = NULL; | 1260 *block = NULL; |
1242 return false; | 1261 return false; |
1243 } | 1262 } |
1244 | 1263 |
1245 HBasicBlock* FirstSuccessor() { | 1264 HBasicBlock* FirstSuccessor() { |
1246 return SuccessorCount() > 0 ? SuccessorAt(0) : NULL; | 1265 return SuccessorCount() > 0 ? SuccessorAt(0) : NULL; |
1247 } | 1266 } |
1248 HBasicBlock* SecondSuccessor() { | 1267 HBasicBlock* SecondSuccessor() { |
1249 return SuccessorCount() > 1 ? SuccessorAt(1) : NULL; | 1268 return SuccessorCount() > 1 ? SuccessorAt(1) : NULL; |
1250 } | 1269 } |
1251 | 1270 |
1252 void Not() { | 1271 void Not() { |
1253 HBasicBlock* swap = SuccessorAt(0); | 1272 HBasicBlock* swap = SuccessorAt(0); |
1254 SetSuccessorAt(0, SuccessorAt(1)); | 1273 SetSuccessorAt(0, SuccessorAt(1)); |
1255 SetSuccessorAt(1, swap); | 1274 SetSuccessorAt(1, swap); |
1256 } | 1275 } |
1257 | 1276 |
1258 DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction) | 1277 DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction) |
1259 }; | 1278 }; |
1260 | 1279 |
1261 | 1280 |
1262 class HSuccessorIterator V8_FINAL BASE_EMBEDDED { | 1281 class HSuccessorIterator V8_FINAL BASE_EMBEDDED { |
1263 public: | 1282 public: |
1264 explicit HSuccessorIterator(HControlInstruction* instr) | 1283 explicit HSuccessorIterator(const HControlInstruction* instr) |
1265 : instr_(instr), current_(0) { } | 1284 : instr_(instr), current_(0) {} |
1266 | 1285 |
1267 bool Done() { return current_ >= instr_->SuccessorCount(); } | 1286 bool Done() { return current_ >= instr_->SuccessorCount(); } |
1268 HBasicBlock* Current() { return instr_->SuccessorAt(current_); } | 1287 HBasicBlock* Current() { return instr_->SuccessorAt(current_); } |
1269 void Advance() { current_++; } | 1288 void Advance() { current_++; } |
1270 | 1289 |
1271 private: | 1290 private: |
1272 HControlInstruction* instr_; | 1291 const HControlInstruction* instr_; |
1273 int current_; | 1292 int current_; |
1274 }; | 1293 }; |
1275 | 1294 |
1276 | 1295 |
1277 template<int S, int V> | 1296 template<int S, int V> |
1278 class HTemplateControlInstruction : public HControlInstruction { | 1297 class HTemplateControlInstruction : public HControlInstruction { |
1279 public: | 1298 public: |
1280 int SuccessorCount() V8_OVERRIDE { return S; } | 1299 int SuccessorCount() const V8_OVERRIDE { return S; } |
1281 HBasicBlock* SuccessorAt(int i) V8_OVERRIDE { return successors_[i]; } | 1300 HBasicBlock* SuccessorAt(int i) const V8_OVERRIDE { return successors_[i]; } |
1282 void SetSuccessorAt(int i, HBasicBlock* block) V8_OVERRIDE { | 1301 void SetSuccessorAt(int i, HBasicBlock* block) V8_OVERRIDE { |
1283 successors_[i] = block; | 1302 successors_[i] = block; |
1284 } | 1303 } |
1285 | 1304 |
1286 int OperandCount() V8_OVERRIDE { return V; } | 1305 int OperandCount() const V8_OVERRIDE { return V; } |
1287 HValue* OperandAt(int i) const V8_OVERRIDE { return inputs_[i]; } | 1306 HValue* OperandAt(int i) const V8_OVERRIDE { return inputs_[i]; } |
1288 | 1307 |
1289 | 1308 |
1290 protected: | 1309 protected: |
1291 void InternalSetOperandAt(int i, HValue* value) V8_OVERRIDE { | 1310 void InternalSetOperandAt(int i, HValue* value) V8_OVERRIDE { |
1292 inputs_[i] = value; | 1311 inputs_[i] = value; |
1293 } | 1312 } |
1294 | 1313 |
1295 private: | 1314 private: |
1296 EmbeddedContainer<HBasicBlock*, S> successors_; | 1315 EmbeddedContainer<HBasicBlock*, S> successors_; |
(...skipping 14 matching lines...) Expand all Loading... |
1311 class HDummyUse V8_FINAL : public HTemplateInstruction<1> { | 1330 class HDummyUse V8_FINAL : public HTemplateInstruction<1> { |
1312 public: | 1331 public: |
1313 explicit HDummyUse(HValue* value) | 1332 explicit HDummyUse(HValue* value) |
1314 : HTemplateInstruction<1>(HType::Smi()) { | 1333 : HTemplateInstruction<1>(HType::Smi()) { |
1315 SetOperandAt(0, value); | 1334 SetOperandAt(0, value); |
1316 // Pretend to be a Smi so that the HChange instructions inserted | 1335 // Pretend to be a Smi so that the HChange instructions inserted |
1317 // before any use generate as little code as possible. | 1336 // before any use generate as little code as possible. |
1318 set_representation(Representation::Tagged()); | 1337 set_representation(Representation::Tagged()); |
1319 } | 1338 } |
1320 | 1339 |
1321 HValue* value() { return OperandAt(0); } | 1340 HValue* value() const { return OperandAt(0); } |
1322 | 1341 |
1323 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } | 1342 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } |
1324 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1343 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
1325 return Representation::None(); | 1344 return Representation::None(); |
1326 } | 1345 } |
1327 | 1346 |
1328 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1347 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1329 | 1348 |
1330 DECLARE_CONCRETE_INSTRUCTION(DummyUse); | 1349 DECLARE_CONCRETE_INSTRUCTION(DummyUse); |
1331 }; | 1350 }; |
1332 | 1351 |
1333 | 1352 |
1334 // Inserts an int3/stop break instruction for debugging purposes. | 1353 // Inserts an int3/stop break instruction for debugging purposes. |
1335 class HDebugBreak V8_FINAL : public HTemplateInstruction<0> { | 1354 class HDebugBreak V8_FINAL : public HTemplateInstruction<0> { |
1336 public: | 1355 public: |
1337 DECLARE_INSTRUCTION_FACTORY_P0(HDebugBreak); | 1356 DECLARE_INSTRUCTION_FACTORY_P0(HDebugBreak); |
1338 | 1357 |
(...skipping 13 matching lines...) Expand all Loading... |
1352 | 1371 |
1353 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE { | 1372 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE { |
1354 *block = FirstSuccessor(); | 1373 *block = FirstSuccessor(); |
1355 return true; | 1374 return true; |
1356 } | 1375 } |
1357 | 1376 |
1358 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1377 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
1359 return Representation::None(); | 1378 return Representation::None(); |
1360 } | 1379 } |
1361 | 1380 |
1362 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1381 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1363 | 1382 |
1364 DECLARE_CONCRETE_INSTRUCTION(Goto) | 1383 DECLARE_CONCRETE_INSTRUCTION(Goto) |
1365 }; | 1384 }; |
1366 | 1385 |
1367 | 1386 |
1368 class HDeoptimize V8_FINAL : public HTemplateControlInstruction<1, 0> { | 1387 class HDeoptimize V8_FINAL : public HTemplateControlInstruction<1, 0> { |
1369 public: | 1388 public: |
1370 static HDeoptimize* New(Zone* zone, | 1389 static HDeoptimize* New(Zone* zone, |
1371 HValue* context, | 1390 HValue* context, |
1372 const char* reason, | 1391 const char* reason, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1405 class HUnaryControlInstruction : public HTemplateControlInstruction<2, 1> { | 1424 class HUnaryControlInstruction : public HTemplateControlInstruction<2, 1> { |
1406 public: | 1425 public: |
1407 HUnaryControlInstruction(HValue* value, | 1426 HUnaryControlInstruction(HValue* value, |
1408 HBasicBlock* true_target, | 1427 HBasicBlock* true_target, |
1409 HBasicBlock* false_target) { | 1428 HBasicBlock* false_target) { |
1410 SetOperandAt(0, value); | 1429 SetOperandAt(0, value); |
1411 SetSuccessorAt(0, true_target); | 1430 SetSuccessorAt(0, true_target); |
1412 SetSuccessorAt(1, false_target); | 1431 SetSuccessorAt(1, false_target); |
1413 } | 1432 } |
1414 | 1433 |
1415 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1434 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1416 | 1435 |
1417 HValue* value() { return OperandAt(0); } | 1436 HValue* value() const { return OperandAt(0); } |
1418 }; | 1437 }; |
1419 | 1438 |
1420 | 1439 |
1421 class HBranch V8_FINAL : public HUnaryControlInstruction { | 1440 class HBranch V8_FINAL : public HUnaryControlInstruction { |
1422 public: | 1441 public: |
1423 DECLARE_INSTRUCTION_FACTORY_P1(HBranch, HValue*); | 1442 DECLARE_INSTRUCTION_FACTORY_P1(HBranch, HValue*); |
1424 DECLARE_INSTRUCTION_FACTORY_P2(HBranch, HValue*, | 1443 DECLARE_INSTRUCTION_FACTORY_P2(HBranch, HValue*, |
1425 ToBooleanStub::Types); | 1444 ToBooleanStub::Types); |
1426 DECLARE_INSTRUCTION_FACTORY_P4(HBranch, HValue*, | 1445 DECLARE_INSTRUCTION_FACTORY_P4(HBranch, HValue*, |
1427 ToBooleanStub::Types, | 1446 ToBooleanStub::Types, |
1428 HBasicBlock*, HBasicBlock*); | 1447 HBasicBlock*, HBasicBlock*); |
1429 | 1448 |
1430 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1449 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
1431 return Representation::None(); | 1450 return Representation::None(); |
1432 } | 1451 } |
1433 virtual Representation observed_input_representation(int index) V8_OVERRIDE; | 1452 virtual Representation observed_input_representation(int index) V8_OVERRIDE; |
1434 | 1453 |
1435 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 1454 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
1436 | 1455 |
1437 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1456 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1438 | 1457 |
1439 ToBooleanStub::Types expected_input_types() const { | 1458 ToBooleanStub::Types expected_input_types() const { |
1440 return expected_input_types_; | 1459 return expected_input_types_; |
1441 } | 1460 } |
1442 | 1461 |
1443 DECLARE_CONCRETE_INSTRUCTION(Branch) | 1462 DECLARE_CONCRETE_INSTRUCTION(Branch) |
1444 | 1463 |
1445 private: | 1464 private: |
1446 HBranch(HValue* value, | 1465 HBranch(HValue* value, |
1447 ToBooleanStub::Types expected_input_types = ToBooleanStub::Types(), | 1466 ToBooleanStub::Types expected_input_types = ToBooleanStub::Types(), |
(...skipping 16 matching lines...) Expand all Loading... |
1464 | 1483 |
1465 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE { | 1484 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE { |
1466 if (known_successor_index() != kNoKnownSuccessorIndex) { | 1485 if (known_successor_index() != kNoKnownSuccessorIndex) { |
1467 *block = SuccessorAt(known_successor_index()); | 1486 *block = SuccessorAt(known_successor_index()); |
1468 return true; | 1487 return true; |
1469 } | 1488 } |
1470 *block = NULL; | 1489 *block = NULL; |
1471 return false; | 1490 return false; |
1472 } | 1491 } |
1473 | 1492 |
1474 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1493 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1475 | 1494 |
1476 static const int kNoKnownSuccessorIndex = -1; | 1495 static const int kNoKnownSuccessorIndex = -1; |
1477 int known_successor_index() const { return known_successor_index_; } | 1496 int known_successor_index() const { return known_successor_index_; } |
1478 void set_known_successor_index(int known_successor_index) { | 1497 void set_known_successor_index(int known_successor_index) { |
1479 known_successor_index_ = known_successor_index; | 1498 known_successor_index_ = known_successor_index; |
1480 } | 1499 } |
1481 | 1500 |
1482 Unique<Map> map() const { return map_; } | 1501 Unique<Map> map() const { return map_; } |
1483 bool map_is_stable() const { return map_is_stable_; } | 1502 bool map_is_stable() const { return map_is_stable_; } |
1484 | 1503 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1538 public: | 1557 public: |
1539 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HReturn, HValue*, HValue*); | 1558 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HReturn, HValue*, HValue*); |
1540 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HReturn, HValue*); | 1559 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HReturn, HValue*); |
1541 | 1560 |
1542 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1561 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
1543 // TODO(titzer): require an Int32 input for faster returns. | 1562 // TODO(titzer): require an Int32 input for faster returns. |
1544 if (index == 2) return Representation::Smi(); | 1563 if (index == 2) return Representation::Smi(); |
1545 return Representation::Tagged(); | 1564 return Representation::Tagged(); |
1546 } | 1565 } |
1547 | 1566 |
1548 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1567 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1549 | 1568 |
1550 HValue* value() { return OperandAt(0); } | 1569 HValue* value() const { return OperandAt(0); } |
1551 HValue* context() { return OperandAt(1); } | 1570 HValue* context() const { return OperandAt(1); } |
1552 HValue* parameter_count() { return OperandAt(2); } | 1571 HValue* parameter_count() const { return OperandAt(2); } |
1553 | 1572 |
1554 DECLARE_CONCRETE_INSTRUCTION(Return) | 1573 DECLARE_CONCRETE_INSTRUCTION(Return) |
1555 | 1574 |
1556 private: | 1575 private: |
1557 HReturn(HValue* context, HValue* value, HValue* parameter_count = 0) { | 1576 HReturn(HValue* context, HValue* value, HValue* parameter_count = 0) { |
1558 SetOperandAt(0, value); | 1577 SetOperandAt(0, value); |
1559 SetOperandAt(1, context); | 1578 SetOperandAt(1, context); |
1560 SetOperandAt(2, parameter_count); | 1579 SetOperandAt(2, parameter_count); |
1561 } | 1580 } |
1562 }; | 1581 }; |
(...skipping 18 matching lines...) Expand all Loading... |
1581 HUnaryOperation(HValue* value, HType type = HType::Tagged()) | 1600 HUnaryOperation(HValue* value, HType type = HType::Tagged()) |
1582 : HTemplateInstruction<1>(type) { | 1601 : HTemplateInstruction<1>(type) { |
1583 SetOperandAt(0, value); | 1602 SetOperandAt(0, value); |
1584 } | 1603 } |
1585 | 1604 |
1586 static HUnaryOperation* cast(HValue* value) { | 1605 static HUnaryOperation* cast(HValue* value) { |
1587 return reinterpret_cast<HUnaryOperation*>(value); | 1606 return reinterpret_cast<HUnaryOperation*>(value); |
1588 } | 1607 } |
1589 | 1608 |
1590 HValue* value() const { return OperandAt(0); } | 1609 HValue* value() const { return OperandAt(0); } |
1591 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1610 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1592 }; | 1611 }; |
1593 | 1612 |
1594 | 1613 |
1595 class HUseConst V8_FINAL : public HUnaryOperation { | 1614 class HUseConst V8_FINAL : public HUnaryOperation { |
1596 public: | 1615 public: |
1597 DECLARE_INSTRUCTION_FACTORY_P1(HUseConst, HValue*); | 1616 DECLARE_INSTRUCTION_FACTORY_P1(HUseConst, HValue*); |
1598 | 1617 |
1599 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1618 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
1600 return Representation::None(); | 1619 return Representation::None(); |
1601 } | 1620 } |
1602 | 1621 |
1603 DECLARE_CONCRETE_INSTRUCTION(UseConst) | 1622 DECLARE_CONCRETE_INSTRUCTION(UseConst) |
1604 | 1623 |
1605 private: | 1624 private: |
1606 explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { } | 1625 explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { } |
1607 }; | 1626 }; |
1608 | 1627 |
1609 | 1628 |
1610 class HForceRepresentation V8_FINAL : public HTemplateInstruction<1> { | 1629 class HForceRepresentation V8_FINAL : public HTemplateInstruction<1> { |
1611 public: | 1630 public: |
1612 static HInstruction* New(Zone* zone, HValue* context, HValue* value, | 1631 static HInstruction* New(Zone* zone, HValue* context, HValue* value, |
1613 Representation required_representation); | 1632 Representation required_representation); |
1614 | 1633 |
1615 HValue* value() { return OperandAt(0); } | 1634 HValue* value() const { return OperandAt(0); } |
1616 | 1635 |
1617 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1636 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
1618 return representation(); // Same as the output representation. | 1637 return representation(); // Same as the output representation. |
1619 } | 1638 } |
1620 | 1639 |
1621 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1640 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1622 | 1641 |
1623 DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation) | 1642 DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation) |
1624 | 1643 |
1625 private: | 1644 private: |
1626 HForceRepresentation(HValue* value, Representation required_representation) { | 1645 HForceRepresentation(HValue* value, Representation required_representation) { |
1627 SetOperandAt(0, value); | 1646 SetOperandAt(0, value); |
1628 set_representation(required_representation); | 1647 set_representation(required_representation); |
1629 } | 1648 } |
1630 }; | 1649 }; |
1631 | 1650 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1667 Representation to() const { return representation(); } | 1686 Representation to() const { return representation(); } |
1668 bool deoptimize_on_minus_zero() const { | 1687 bool deoptimize_on_minus_zero() const { |
1669 return CheckFlag(kBailoutOnMinusZero); | 1688 return CheckFlag(kBailoutOnMinusZero); |
1670 } | 1689 } |
1671 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1690 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
1672 return from(); | 1691 return from(); |
1673 } | 1692 } |
1674 | 1693 |
1675 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 1694 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; |
1676 | 1695 |
1677 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1696 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1678 | 1697 |
1679 DECLARE_CONCRETE_INSTRUCTION(Change) | 1698 DECLARE_CONCRETE_INSTRUCTION(Change) |
1680 | 1699 |
1681 protected: | 1700 protected: |
1682 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 1701 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } |
1683 | 1702 |
1684 private: | 1703 private: |
1685 virtual bool IsDeletable() const V8_OVERRIDE { | 1704 virtual bool IsDeletable() const V8_OVERRIDE { |
1686 return !from().IsTagged() || value()->type().IsSmi(); | 1705 return !from().IsTagged() || value()->type().IsSmi(); |
1687 } | 1706 } |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1786 RemovableSimulate removable) | 1805 RemovableSimulate removable) |
1787 : ast_id_(ast_id), | 1806 : ast_id_(ast_id), |
1788 pop_count_(pop_count), | 1807 pop_count_(pop_count), |
1789 values_(2, zone), | 1808 values_(2, zone), |
1790 assigned_indexes_(2, zone), | 1809 assigned_indexes_(2, zone), |
1791 zone_(zone), | 1810 zone_(zone), |
1792 removable_(removable), | 1811 removable_(removable), |
1793 done_with_replay_(false) {} | 1812 done_with_replay_(false) {} |
1794 ~HSimulate() {} | 1813 ~HSimulate() {} |
1795 | 1814 |
1796 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1815 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1797 | 1816 |
1798 bool HasAstId() const { return !ast_id_.IsNone(); } | 1817 bool HasAstId() const { return !ast_id_.IsNone(); } |
1799 BailoutId ast_id() const { return ast_id_; } | 1818 BailoutId ast_id() const { return ast_id_; } |
1800 void set_ast_id(BailoutId id) { | 1819 void set_ast_id(BailoutId id) { |
1801 ASSERT(!HasAstId()); | 1820 ASSERT(!HasAstId()); |
1802 ast_id_ = id; | 1821 ast_id_ = id; |
1803 } | 1822 } |
1804 | 1823 |
1805 int pop_count() const { return pop_count_; } | 1824 int pop_count() const { return pop_count_; } |
1806 const ZoneList<HValue*>* values() const { return &values_; } | 1825 const ZoneList<HValue*>* values() const { return &values_; } |
1807 int GetAssignedIndexAt(int index) const { | 1826 int GetAssignedIndexAt(int index) const { |
1808 ASSERT(HasAssignedIndexAt(index)); | 1827 ASSERT(HasAssignedIndexAt(index)); |
1809 return assigned_indexes_[index]; | 1828 return assigned_indexes_[index]; |
1810 } | 1829 } |
1811 bool HasAssignedIndexAt(int index) const { | 1830 bool HasAssignedIndexAt(int index) const { |
1812 return assigned_indexes_[index] != kNoIndex; | 1831 return assigned_indexes_[index] != kNoIndex; |
1813 } | 1832 } |
1814 void AddAssignedValue(int index, HValue* value) { | 1833 void AddAssignedValue(int index, HValue* value) { |
1815 AddValue(index, value); | 1834 AddValue(index, value); |
1816 } | 1835 } |
1817 void AddPushedValue(HValue* value) { | 1836 void AddPushedValue(HValue* value) { |
1818 AddValue(kNoIndex, value); | 1837 AddValue(kNoIndex, value); |
1819 } | 1838 } |
1820 int ToOperandIndex(int environment_index) { | 1839 int ToOperandIndex(int environment_index) { |
1821 for (int i = 0; i < assigned_indexes_.length(); ++i) { | 1840 for (int i = 0; i < assigned_indexes_.length(); ++i) { |
1822 if (assigned_indexes_[i] == environment_index) return i; | 1841 if (assigned_indexes_[i] == environment_index) return i; |
1823 } | 1842 } |
1824 return -1; | 1843 return -1; |
1825 } | 1844 } |
1826 virtual int OperandCount() V8_OVERRIDE { return values_.length(); } | 1845 virtual int OperandCount() const V8_OVERRIDE { return values_.length(); } |
1827 virtual HValue* OperandAt(int index) const V8_OVERRIDE { | 1846 virtual HValue* OperandAt(int index) const V8_OVERRIDE { |
1828 return values_[index]; | 1847 return values_[index]; |
1829 } | 1848 } |
1830 | 1849 |
1831 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } | 1850 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } |
1832 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1851 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
1833 return Representation::None(); | 1852 return Representation::None(); |
1834 } | 1853 } |
1835 | 1854 |
1836 void MergeWith(ZoneList<HSimulate*>* list); | 1855 void MergeWith(ZoneList<HSimulate*>* list); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1881 #endif | 1900 #endif |
1882 }; | 1901 }; |
1883 | 1902 |
1884 | 1903 |
1885 class HEnvironmentMarker V8_FINAL : public HTemplateInstruction<1> { | 1904 class HEnvironmentMarker V8_FINAL : public HTemplateInstruction<1> { |
1886 public: | 1905 public: |
1887 enum Kind { BIND, LOOKUP }; | 1906 enum Kind { BIND, LOOKUP }; |
1888 | 1907 |
1889 DECLARE_INSTRUCTION_FACTORY_P2(HEnvironmentMarker, Kind, int); | 1908 DECLARE_INSTRUCTION_FACTORY_P2(HEnvironmentMarker, Kind, int); |
1890 | 1909 |
1891 Kind kind() { return kind_; } | 1910 Kind kind() const { return kind_; } |
1892 int index() { return index_; } | 1911 int index() const { return index_; } |
1893 HSimulate* next_simulate() { return next_simulate_; } | 1912 HSimulate* next_simulate() { return next_simulate_; } |
1894 void set_next_simulate(HSimulate* simulate) { | 1913 void set_next_simulate(HSimulate* simulate) { |
1895 next_simulate_ = simulate; | 1914 next_simulate_ = simulate; |
1896 } | 1915 } |
1897 | 1916 |
1898 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1917 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
1899 return Representation::None(); | 1918 return Representation::None(); |
1900 } | 1919 } |
1901 | 1920 |
1902 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1921 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1903 | 1922 |
1904 #ifdef DEBUG | 1923 #ifdef DEBUG |
1905 void set_closure(Handle<JSFunction> closure) { | 1924 void set_closure(Handle<JSFunction> closure) { |
1906 ASSERT(closure_.is_null()); | 1925 ASSERT(closure_.is_null()); |
1907 ASSERT(!closure.is_null()); | 1926 ASSERT(!closure.is_null()); |
1908 closure_ = closure; | 1927 closure_ = closure; |
1909 } | 1928 } |
1910 Handle<JSFunction> closure() const { return closure_; } | 1929 Handle<JSFunction> closure() const { return closure_; } |
1911 #endif | 1930 #endif |
1912 | 1931 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1987 Variable* arguments_var, | 2006 Variable* arguments_var, |
1988 HArgumentsObject* arguments_object) { | 2007 HArgumentsObject* arguments_object) { |
1989 return new(zone) HEnterInlined(return_id, closure, arguments_count, | 2008 return new(zone) HEnterInlined(return_id, closure, arguments_count, |
1990 function, inlining_kind, arguments_var, | 2009 function, inlining_kind, arguments_var, |
1991 arguments_object, zone); | 2010 arguments_object, zone); |
1992 } | 2011 } |
1993 | 2012 |
1994 void RegisterReturnTarget(HBasicBlock* return_target, Zone* zone); | 2013 void RegisterReturnTarget(HBasicBlock* return_target, Zone* zone); |
1995 ZoneList<HBasicBlock*>* return_targets() { return &return_targets_; } | 2014 ZoneList<HBasicBlock*>* return_targets() { return &return_targets_; } |
1996 | 2015 |
1997 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 2016 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
1998 | 2017 |
1999 Handle<JSFunction> closure() const { return closure_; } | 2018 Handle<JSFunction> closure() const { return closure_; } |
2000 int arguments_count() const { return arguments_count_; } | 2019 int arguments_count() const { return arguments_count_; } |
2001 bool arguments_pushed() const { return arguments_pushed_; } | 2020 bool arguments_pushed() const { return arguments_pushed_; } |
2002 void set_arguments_pushed() { arguments_pushed_ = true; } | 2021 void set_arguments_pushed() { arguments_pushed_ = true; } |
2003 FunctionLiteral* function() const { return function_; } | 2022 FunctionLiteral* function() const { return function_; } |
2004 InliningKind inlining_kind() const { return inlining_kind_; } | 2023 InliningKind inlining_kind() const { return inlining_kind_; } |
2005 BailoutId ReturnId() const { return return_id_; } | 2024 BailoutId ReturnId() const { return return_id_; } |
2006 | 2025 |
2007 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2026 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2103 return instr; | 2122 return instr; |
2104 } | 2123 } |
2105 | 2124 |
2106 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2125 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
2107 return Representation::Tagged(); | 2126 return Representation::Tagged(); |
2108 } | 2127 } |
2109 | 2128 |
2110 virtual int argument_delta() const V8_OVERRIDE { return inputs_.length(); } | 2129 virtual int argument_delta() const V8_OVERRIDE { return inputs_.length(); } |
2111 HValue* argument(int i) { return OperandAt(i); } | 2130 HValue* argument(int i) { return OperandAt(i); } |
2112 | 2131 |
2113 virtual int OperandCount() V8_FINAL V8_OVERRIDE { return inputs_.length(); } | 2132 virtual int OperandCount() const V8_FINAL V8_OVERRIDE { |
| 2133 return inputs_.length(); |
| 2134 } |
2114 virtual HValue* OperandAt(int i) const V8_FINAL V8_OVERRIDE { | 2135 virtual HValue* OperandAt(int i) const V8_FINAL V8_OVERRIDE { |
2115 return inputs_[i]; | 2136 return inputs_[i]; |
2116 } | 2137 } |
2117 | 2138 |
2118 void AddInput(HValue* value); | 2139 void AddInput(HValue* value); |
2119 | 2140 |
2120 DECLARE_CONCRETE_INSTRUCTION(PushArguments) | 2141 DECLARE_CONCRETE_INSTRUCTION(PushArguments) |
2121 | 2142 |
2122 protected: | 2143 protected: |
2123 virtual void InternalSetOperandAt(int i, HValue* value) V8_FINAL V8_OVERRIDE { | 2144 virtual void InternalSetOperandAt(int i, HValue* value) V8_FINAL V8_OVERRIDE { |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2220 HUnaryCall(HValue* value, int argument_count) | 2241 HUnaryCall(HValue* value, int argument_count) |
2221 : HCall<1>(argument_count) { | 2242 : HCall<1>(argument_count) { |
2222 SetOperandAt(0, value); | 2243 SetOperandAt(0, value); |
2223 } | 2244 } |
2224 | 2245 |
2225 virtual Representation RequiredInputRepresentation( | 2246 virtual Representation RequiredInputRepresentation( |
2226 int index) V8_FINAL V8_OVERRIDE { | 2247 int index) V8_FINAL V8_OVERRIDE { |
2227 return Representation::Tagged(); | 2248 return Representation::Tagged(); |
2228 } | 2249 } |
2229 | 2250 |
2230 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 2251 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
2231 | 2252 |
2232 HValue* value() { return OperandAt(0); } | 2253 HValue* value() const { return OperandAt(0); } |
2233 }; | 2254 }; |
2234 | 2255 |
2235 | 2256 |
2236 class HBinaryCall : public HCall<2> { | 2257 class HBinaryCall : public HCall<2> { |
2237 public: | 2258 public: |
2238 HBinaryCall(HValue* first, HValue* second, int argument_count) | 2259 HBinaryCall(HValue* first, HValue* second, int argument_count) |
2239 : HCall<2>(argument_count) { | 2260 : HCall<2>(argument_count) { |
2240 SetOperandAt(0, first); | 2261 SetOperandAt(0, first); |
2241 SetOperandAt(1, second); | 2262 SetOperandAt(1, second); |
2242 } | 2263 } |
2243 | 2264 |
2244 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 2265 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
2245 | 2266 |
2246 virtual Representation RequiredInputRepresentation( | 2267 virtual Representation RequiredInputRepresentation( |
2247 int index) V8_FINAL V8_OVERRIDE { | 2268 int index) V8_FINAL V8_OVERRIDE { |
2248 return Representation::Tagged(); | 2269 return Representation::Tagged(); |
2249 } | 2270 } |
2250 | 2271 |
2251 HValue* first() { return OperandAt(0); } | 2272 HValue* first() const { return OperandAt(0); } |
2252 HValue* second() { return OperandAt(1); } | 2273 HValue* second() const { return OperandAt(1); } |
2253 }; | 2274 }; |
2254 | 2275 |
2255 | 2276 |
2256 class HCallJSFunction V8_FINAL : public HCall<1> { | 2277 class HCallJSFunction V8_FINAL : public HCall<1> { |
2257 public: | 2278 public: |
2258 static HCallJSFunction* New(Zone* zone, | 2279 static HCallJSFunction* New(Zone* zone, |
2259 HValue* context, | 2280 HValue* context, |
2260 HValue* function, | 2281 HValue* function, |
2261 int argument_count, | 2282 int argument_count, |
2262 bool pass_argument_count); | 2283 bool pass_argument_count); |
2263 | 2284 |
2264 HValue* function() { return OperandAt(0); } | 2285 HValue* function() const { return OperandAt(0); } |
2265 | 2286 |
2266 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 2287 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
2267 | 2288 |
2268 virtual Representation RequiredInputRepresentation( | 2289 virtual Representation RequiredInputRepresentation( |
2269 int index) V8_FINAL V8_OVERRIDE { | 2290 int index) V8_FINAL V8_OVERRIDE { |
2270 ASSERT(index == 0); | 2291 ASSERT(index == 0); |
2271 return Representation::Tagged(); | 2292 return Representation::Tagged(); |
2272 } | 2293 } |
2273 | 2294 |
2274 bool pass_argument_count() const { return pass_argument_count_; } | 2295 bool pass_argument_count() const { return pass_argument_count_; } |
2275 | 2296 |
2276 virtual bool HasStackCheck() V8_FINAL V8_OVERRIDE { | 2297 virtual bool HasStackCheck() V8_FINAL V8_OVERRIDE { |
(...skipping 26 matching lines...) Expand all Loading... |
2303 int argument_count, | 2324 int argument_count, |
2304 const CallInterfaceDescriptor* descriptor, | 2325 const CallInterfaceDescriptor* descriptor, |
2305 const Vector<HValue*>& operands) { | 2326 const Vector<HValue*>& operands) { |
2306 ASSERT(operands.length() == descriptor->environment_length()); | 2327 ASSERT(operands.length() == descriptor->environment_length()); |
2307 HCallWithDescriptor* res = | 2328 HCallWithDescriptor* res = |
2308 new(zone) HCallWithDescriptor(target, argument_count, | 2329 new(zone) HCallWithDescriptor(target, argument_count, |
2309 descriptor, operands, zone); | 2330 descriptor, operands, zone); |
2310 return res; | 2331 return res; |
2311 } | 2332 } |
2312 | 2333 |
2313 virtual int OperandCount() V8_FINAL V8_OVERRIDE { return values_.length(); } | 2334 virtual int OperandCount() const V8_FINAL V8_OVERRIDE { |
| 2335 return values_.length(); |
| 2336 } |
2314 virtual HValue* OperandAt(int index) const V8_FINAL V8_OVERRIDE { | 2337 virtual HValue* OperandAt(int index) const V8_FINAL V8_OVERRIDE { |
2315 return values_[index]; | 2338 return values_[index]; |
2316 } | 2339 } |
2317 | 2340 |
2318 virtual Representation RequiredInputRepresentation( | 2341 virtual Representation RequiredInputRepresentation( |
2319 int index) V8_FINAL V8_OVERRIDE { | 2342 int index) V8_FINAL V8_OVERRIDE { |
2320 if (index == 0) { | 2343 if (index == 0) { |
2321 return Representation::Tagged(); | 2344 return Representation::Tagged(); |
2322 } else { | 2345 } else { |
2323 int par_index = index - 1; | 2346 int par_index = index - 1; |
(...skipping 17 matching lines...) Expand all Loading... |
2341 } | 2364 } |
2342 | 2365 |
2343 const CallInterfaceDescriptor* descriptor() const { | 2366 const CallInterfaceDescriptor* descriptor() const { |
2344 return descriptor_; | 2367 return descriptor_; |
2345 } | 2368 } |
2346 | 2369 |
2347 HValue* target() { | 2370 HValue* target() { |
2348 return OperandAt(0); | 2371 return OperandAt(0); |
2349 } | 2372 } |
2350 | 2373 |
2351 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 2374 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
2352 | 2375 |
2353 private: | 2376 private: |
2354 // The argument count includes the receiver. | 2377 // The argument count includes the receiver. |
2355 HCallWithDescriptor(HValue* target, | 2378 HCallWithDescriptor(HValue* target, |
2356 int argument_count, | 2379 int argument_count, |
2357 const CallInterfaceDescriptor* descriptor, | 2380 const CallInterfaceDescriptor* descriptor, |
2358 const Vector<HValue*>& operands, | 2381 const Vector<HValue*>& operands, |
2359 Zone* zone) | 2382 Zone* zone) |
2360 : descriptor_(descriptor), | 2383 : descriptor_(descriptor), |
2361 values_(descriptor->environment_length() + 1, zone) { | 2384 values_(descriptor->environment_length() + 1, zone) { |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2476 class HCallNewArray V8_FINAL : public HBinaryCall { | 2499 class HCallNewArray V8_FINAL : public HBinaryCall { |
2477 public: | 2500 public: |
2478 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCallNewArray, | 2501 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCallNewArray, |
2479 HValue*, | 2502 HValue*, |
2480 int, | 2503 int, |
2481 ElementsKind); | 2504 ElementsKind); |
2482 | 2505 |
2483 HValue* context() { return first(); } | 2506 HValue* context() { return first(); } |
2484 HValue* constructor() { return second(); } | 2507 HValue* constructor() { return second(); } |
2485 | 2508 |
2486 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 2509 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
2487 | 2510 |
2488 ElementsKind elements_kind() const { return elements_kind_; } | 2511 ElementsKind elements_kind() const { return elements_kind_; } |
2489 | 2512 |
2490 DECLARE_CONCRETE_INSTRUCTION(CallNewArray) | 2513 DECLARE_CONCRETE_INSTRUCTION(CallNewArray) |
2491 | 2514 |
2492 private: | 2515 private: |
2493 HCallNewArray(HValue* context, HValue* constructor, int argument_count, | 2516 HCallNewArray(HValue* context, HValue* constructor, int argument_count, |
2494 ElementsKind elements_kind) | 2517 ElementsKind elements_kind) |
2495 : HBinaryCall(context, constructor, argument_count), | 2518 : HBinaryCall(context, constructor, argument_count), |
2496 elements_kind_(elements_kind) {} | 2519 elements_kind_(elements_kind) {} |
2497 | 2520 |
2498 ElementsKind elements_kind_; | 2521 ElementsKind elements_kind_; |
2499 }; | 2522 }; |
2500 | 2523 |
2501 | 2524 |
2502 class HCallRuntime V8_FINAL : public HCall<1> { | 2525 class HCallRuntime V8_FINAL : public HCall<1> { |
2503 public: | 2526 public: |
2504 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCallRuntime, | 2527 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCallRuntime, |
2505 Handle<String>, | 2528 Handle<String>, |
2506 const Runtime::Function*, | 2529 const Runtime::Function*, |
2507 int); | 2530 int); |
2508 | 2531 |
2509 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 2532 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
2510 | 2533 |
2511 HValue* context() { return OperandAt(0); } | 2534 HValue* context() { return OperandAt(0); } |
2512 const Runtime::Function* function() const { return c_function_; } | 2535 const Runtime::Function* function() const { return c_function_; } |
2513 Handle<String> name() const { return name_; } | 2536 Handle<String> name() const { return name_; } |
2514 SaveFPRegsMode save_doubles() const { return save_doubles_; } | 2537 SaveFPRegsMode save_doubles() const { return save_doubles_; } |
2515 void set_save_doubles(SaveFPRegsMode save_doubles) { | 2538 void set_save_doubles(SaveFPRegsMode save_doubles) { |
2516 save_doubles_ = save_doubles; | 2539 save_doubles_ = save_doubles; |
2517 } | 2540 } |
2518 | 2541 |
2519 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2542 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2563 }; | 2586 }; |
2564 | 2587 |
2565 | 2588 |
2566 class HUnaryMathOperation V8_FINAL : public HTemplateInstruction<2> { | 2589 class HUnaryMathOperation V8_FINAL : public HTemplateInstruction<2> { |
2567 public: | 2590 public: |
2568 static HInstruction* New(Zone* zone, | 2591 static HInstruction* New(Zone* zone, |
2569 HValue* context, | 2592 HValue* context, |
2570 HValue* value, | 2593 HValue* value, |
2571 BuiltinFunctionId op); | 2594 BuiltinFunctionId op); |
2572 | 2595 |
2573 HValue* context() { return OperandAt(0); } | 2596 HValue* context() const { return OperandAt(0); } |
2574 HValue* value() { return OperandAt(1); } | 2597 HValue* value() const { return OperandAt(1); } |
2575 | 2598 |
2576 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 2599 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
2577 | 2600 |
2578 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2601 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
2579 if (index == 0) { | 2602 if (index == 0) { |
2580 return Representation::Tagged(); | 2603 return Representation::Tagged(); |
2581 } else { | 2604 } else { |
2582 switch (op_) { | 2605 switch (op_) { |
2583 case kMathFloor: | 2606 case kMathFloor: |
2584 case kMathRound: | 2607 case kMathRound: |
2585 case kMathSqrt: | 2608 case kMathSqrt: |
2586 case kMathPowHalf: | 2609 case kMathPowHalf: |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2734 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } | 2757 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } |
2735 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2758 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
2736 return Representation::Tagged(); | 2759 return Representation::Tagged(); |
2737 } | 2760 } |
2738 | 2761 |
2739 virtual HType CalculateInferredType() V8_OVERRIDE { | 2762 virtual HType CalculateInferredType() V8_OVERRIDE { |
2740 if (value()->type().IsHeapObject()) return value()->type(); | 2763 if (value()->type().IsHeapObject()) return value()->type(); |
2741 return HType::HeapObject(); | 2764 return HType::HeapObject(); |
2742 } | 2765 } |
2743 | 2766 |
2744 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 2767 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
2745 | 2768 |
2746 HValue* value() const { return OperandAt(0); } | 2769 HValue* value() const { return OperandAt(0); } |
2747 HValue* typecheck() const { return OperandAt(1); } | 2770 HValue* typecheck() const { return OperandAt(1); } |
2748 | 2771 |
2749 const UniqueSet<Map>* maps() const { return maps_; } | 2772 const UniqueSet<Map>* maps() const { return maps_; } |
2750 void set_maps(const UniqueSet<Map>* maps) { maps_ = maps; } | 2773 void set_maps(const UniqueSet<Map>* maps) { maps_ = maps; } |
2751 | 2774 |
2752 bool maps_are_stable() const { return maps_are_stable_; } | 2775 bool maps_are_stable() const { return maps_are_stable_; } |
2753 | 2776 |
2754 bool HasMigrationTarget() const { return has_migration_target_; } | 2777 bool HasMigrationTarget() const { return has_migration_target_; } |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2842 return new(zone) HCheckValue(value, target, object_in_new_space); | 2865 return new(zone) HCheckValue(value, target, object_in_new_space); |
2843 } | 2866 } |
2844 | 2867 |
2845 virtual void FinalizeUniqueness() V8_OVERRIDE { | 2868 virtual void FinalizeUniqueness() V8_OVERRIDE { |
2846 object_ = Unique<HeapObject>(object_.handle()); | 2869 object_ = Unique<HeapObject>(object_.handle()); |
2847 } | 2870 } |
2848 | 2871 |
2849 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2872 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
2850 return Representation::Tagged(); | 2873 return Representation::Tagged(); |
2851 } | 2874 } |
2852 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 2875 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
2853 | 2876 |
2854 virtual HValue* Canonicalize() V8_OVERRIDE; | 2877 virtual HValue* Canonicalize() V8_OVERRIDE; |
2855 | 2878 |
2856 #ifdef DEBUG | 2879 #ifdef DEBUG |
2857 virtual void Verify() V8_OVERRIDE; | 2880 virtual void Verify() V8_OVERRIDE; |
2858 #endif | 2881 #endif |
2859 | 2882 |
2860 Unique<HeapObject> object() const { return object_; } | 2883 Unique<HeapObject> object() const { return object_; } |
2861 bool object_in_new_space() const { return object_in_new_space_; } | 2884 bool object_in_new_space() const { return object_in_new_space_; } |
2862 | 2885 |
(...skipping 25 matching lines...) Expand all Loading... |
2888 enum Check { | 2911 enum Check { |
2889 IS_SPEC_OBJECT, | 2912 IS_SPEC_OBJECT, |
2890 IS_JS_ARRAY, | 2913 IS_JS_ARRAY, |
2891 IS_STRING, | 2914 IS_STRING, |
2892 IS_INTERNALIZED_STRING, | 2915 IS_INTERNALIZED_STRING, |
2893 LAST_INTERVAL_CHECK = IS_JS_ARRAY | 2916 LAST_INTERVAL_CHECK = IS_JS_ARRAY |
2894 }; | 2917 }; |
2895 | 2918 |
2896 DECLARE_INSTRUCTION_FACTORY_P2(HCheckInstanceType, HValue*, Check); | 2919 DECLARE_INSTRUCTION_FACTORY_P2(HCheckInstanceType, HValue*, Check); |
2897 | 2920 |
2898 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 2921 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
2899 | 2922 |
2900 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2923 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
2901 return Representation::Tagged(); | 2924 return Representation::Tagged(); |
2902 } | 2925 } |
2903 | 2926 |
2904 virtual HType CalculateInferredType() V8_OVERRIDE { | 2927 virtual HType CalculateInferredType() V8_OVERRIDE { |
2905 switch (check_) { | 2928 switch (check_) { |
2906 case IS_SPEC_OBJECT: return HType::JSObject(); | 2929 case IS_SPEC_OBJECT: return HType::JSObject(); |
2907 case IS_JS_ARRAY: return HType::JSArray(); | 2930 case IS_JS_ARRAY: return HType::JSArray(); |
2908 case IS_STRING: return HType::String(); | 2931 case IS_STRING: return HType::String(); |
(...skipping 18 matching lines...) Expand all Loading... |
2927 // type checks if we have already performed an instance type check | 2950 // type checks if we have already performed an instance type check |
2928 // with a larger range. | 2951 // with a larger range. |
2929 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 2952 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
2930 HCheckInstanceType* b = HCheckInstanceType::cast(other); | 2953 HCheckInstanceType* b = HCheckInstanceType::cast(other); |
2931 return check_ == b->check_; | 2954 return check_ == b->check_; |
2932 } | 2955 } |
2933 | 2956 |
2934 virtual int RedefinedOperandIndex() { return 0; } | 2957 virtual int RedefinedOperandIndex() { return 0; } |
2935 | 2958 |
2936 private: | 2959 private: |
2937 const char* GetCheckName(); | 2960 const char* GetCheckName() const; |
2938 | 2961 |
2939 HCheckInstanceType(HValue* value, Check check) | 2962 HCheckInstanceType(HValue* value, Check check) |
2940 : HUnaryOperation(value, HType::HeapObject()), check_(check) { | 2963 : HUnaryOperation(value, HType::HeapObject()), check_(check) { |
2941 set_representation(Representation::Tagged()); | 2964 set_representation(Representation::Tagged()); |
2942 SetFlag(kUseGVN); | 2965 SetFlag(kUseGVN); |
2943 } | 2966 } |
2944 | 2967 |
2945 const Check check_; | 2968 const Check check_; |
2946 }; | 2969 }; |
2947 | 2970 |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3252 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 3275 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; |
3253 virtual void InferRepresentation( | 3276 virtual void InferRepresentation( |
3254 HInferRepresentationPhase* h_infer) V8_OVERRIDE; | 3277 HInferRepresentationPhase* h_infer) V8_OVERRIDE; |
3255 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3278 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
3256 return representation(); | 3279 return representation(); |
3257 } | 3280 } |
3258 virtual Representation KnownOptimalRepresentation() V8_OVERRIDE { | 3281 virtual Representation KnownOptimalRepresentation() V8_OVERRIDE { |
3259 return representation(); | 3282 return representation(); |
3260 } | 3283 } |
3261 virtual HType CalculateInferredType() V8_OVERRIDE; | 3284 virtual HType CalculateInferredType() V8_OVERRIDE; |
3262 virtual int OperandCount() V8_OVERRIDE { return inputs_.length(); } | 3285 virtual int OperandCount() const V8_OVERRIDE { return inputs_.length(); } |
3263 virtual HValue* OperandAt(int index) const V8_OVERRIDE { | 3286 virtual HValue* OperandAt(int index) const V8_OVERRIDE { |
3264 return inputs_[index]; | 3287 return inputs_[index]; |
3265 } | 3288 } |
3266 HValue* GetRedundantReplacement(); | 3289 HValue* GetRedundantReplacement(); |
3267 void AddInput(HValue* value); | 3290 void AddInput(HValue* value); |
3268 bool HasRealUses(); | 3291 bool HasRealUses(); |
3269 | 3292 |
3270 bool IsReceiver() const { return merged_index_ == 0; } | 3293 bool IsReceiver() const { return merged_index_ == 0; } |
3271 bool HasMergedIndex() const { return merged_index_ != kInvalidMergedIndex; } | 3294 bool HasMergedIndex() const { return merged_index_ != kInvalidMergedIndex; } |
3272 | 3295 |
3273 virtual HSourcePosition position() const V8_OVERRIDE; | 3296 virtual HSourcePosition position() const V8_OVERRIDE; |
3274 | 3297 |
3275 int merged_index() const { return merged_index_; } | 3298 int merged_index() const { return merged_index_; } |
3276 | 3299 |
3277 InductionVariableData* induction_variable_data() { | 3300 InductionVariableData* induction_variable_data() { |
3278 return induction_variable_data_; | 3301 return induction_variable_data_; |
3279 } | 3302 } |
3280 bool IsInductionVariable() { | 3303 bool IsInductionVariable() { |
3281 return induction_variable_data_ != NULL; | 3304 return induction_variable_data_ != NULL; |
3282 } | 3305 } |
3283 bool IsLimitedInductionVariable() { | 3306 bool IsLimitedInductionVariable() { |
3284 return IsInductionVariable() && | 3307 return IsInductionVariable() && |
3285 induction_variable_data_->limit() != NULL; | 3308 induction_variable_data_->limit() != NULL; |
3286 } | 3309 } |
3287 void DetectInductionVariable() { | 3310 void DetectInductionVariable() { |
3288 ASSERT(induction_variable_data_ == NULL); | 3311 ASSERT(induction_variable_data_ == NULL); |
3289 induction_variable_data_ = InductionVariableData::ExaminePhi(this); | 3312 induction_variable_data_ = InductionVariableData::ExaminePhi(this); |
3290 } | 3313 } |
3291 | 3314 |
3292 virtual void PrintTo(StringStream* stream) V8_OVERRIDE; | 3315 virtual OStream& PrintTo(OStream& os) const V8_OVERRIDE; // NOLINT |
3293 | 3316 |
3294 #ifdef DEBUG | 3317 #ifdef DEBUG |
3295 virtual void Verify() V8_OVERRIDE; | 3318 virtual void Verify() V8_OVERRIDE; |
3296 #endif | 3319 #endif |
3297 | 3320 |
3298 void InitRealUses(int id); | 3321 void InitRealUses(int id); |
3299 void AddNonPhiUsesFrom(HPhi* other); | 3322 void AddNonPhiUsesFrom(HPhi* other); |
3300 void AddIndirectUsesTo(int* use_count); | 3323 void AddIndirectUsesTo(int* use_count); |
3301 | 3324 |
3302 int tagged_non_phi_uses() const { | 3325 int tagged_non_phi_uses() const { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3354 // TODO(titzer): we can't eliminate the receiver for generating backtraces | 3377 // TODO(titzer): we can't eliminate the receiver for generating backtraces |
3355 virtual bool IsDeletable() const V8_OVERRIDE { return !IsReceiver(); } | 3378 virtual bool IsDeletable() const V8_OVERRIDE { return !IsReceiver(); } |
3356 }; | 3379 }; |
3357 | 3380 |
3358 | 3381 |
3359 // Common base class for HArgumentsObject and HCapturedObject. | 3382 // Common base class for HArgumentsObject and HCapturedObject. |
3360 class HDematerializedObject : public HInstruction { | 3383 class HDematerializedObject : public HInstruction { |
3361 public: | 3384 public: |
3362 HDematerializedObject(int count, Zone* zone) : values_(count, zone) {} | 3385 HDematerializedObject(int count, Zone* zone) : values_(count, zone) {} |
3363 | 3386 |
3364 virtual int OperandCount() V8_FINAL V8_OVERRIDE { return values_.length(); } | 3387 virtual int OperandCount() const V8_FINAL V8_OVERRIDE { |
| 3388 return values_.length(); |
| 3389 } |
3365 virtual HValue* OperandAt(int index) const V8_FINAL V8_OVERRIDE { | 3390 virtual HValue* OperandAt(int index) const V8_FINAL V8_OVERRIDE { |
3366 return values_[index]; | 3391 return values_[index]; |
3367 } | 3392 } |
3368 | 3393 |
3369 virtual bool HasEscapingOperandAt(int index) V8_FINAL V8_OVERRIDE { | 3394 virtual bool HasEscapingOperandAt(int index) V8_FINAL V8_OVERRIDE { |
3370 return false; | 3395 return false; |
3371 } | 3396 } |
3372 virtual Representation RequiredInputRepresentation( | 3397 virtual Representation RequiredInputRepresentation( |
3373 int index) V8_FINAL V8_OVERRIDE { | 3398 int index) V8_FINAL V8_OVERRIDE { |
3374 return Representation::None(); | 3399 return Representation::None(); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3432 | 3457 |
3433 void ReuseSideEffectsFromStore(HInstruction* store) { | 3458 void ReuseSideEffectsFromStore(HInstruction* store) { |
3434 ASSERT(store->HasObservableSideEffects()); | 3459 ASSERT(store->HasObservableSideEffects()); |
3435 ASSERT(store->IsStoreNamedField()); | 3460 ASSERT(store->IsStoreNamedField()); |
3436 changes_flags_.Add(store->ChangesFlags()); | 3461 changes_flags_.Add(store->ChangesFlags()); |
3437 } | 3462 } |
3438 | 3463 |
3439 // Replay effects of this instruction on the given environment. | 3464 // Replay effects of this instruction on the given environment. |
3440 void ReplayEnvironment(HEnvironment* env); | 3465 void ReplayEnvironment(HEnvironment* env); |
3441 | 3466 |
3442 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 3467 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
3443 | 3468 |
3444 DECLARE_CONCRETE_INSTRUCTION(CapturedObject) | 3469 DECLARE_CONCRETE_INSTRUCTION(CapturedObject) |
3445 | 3470 |
3446 private: | 3471 private: |
3447 int capture_id_; | 3472 int capture_id_; |
3448 | 3473 |
3449 // Note that we cannot DCE captured objects as they are used to replay | 3474 // Note that we cannot DCE captured objects as they are used to replay |
3450 // the environment. This method is here as an explicit reminder. | 3475 // the environment. This method is here as an explicit reminder. |
3451 // TODO(mstarzinger): Turn HSimulates into full snapshots maybe? | 3476 // TODO(mstarzinger): Turn HSimulates into full snapshots maybe? |
3452 virtual bool IsDeletable() const V8_FINAL V8_OVERRIDE { return false; } | 3477 virtual bool IsDeletable() const V8_FINAL V8_OVERRIDE { return false; } |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3538 | 3563 |
3539 virtual Representation KnownOptimalRepresentation() V8_OVERRIDE { | 3564 virtual Representation KnownOptimalRepresentation() V8_OVERRIDE { |
3540 if (HasSmiValue() && SmiValuesAre31Bits()) return Representation::Smi(); | 3565 if (HasSmiValue() && SmiValuesAre31Bits()) return Representation::Smi(); |
3541 if (HasInteger32Value()) return Representation::Integer32(); | 3566 if (HasInteger32Value()) return Representation::Integer32(); |
3542 if (HasNumberValue()) return Representation::Double(); | 3567 if (HasNumberValue()) return Representation::Double(); |
3543 if (HasExternalReferenceValue()) return Representation::External(); | 3568 if (HasExternalReferenceValue()) return Representation::External(); |
3544 return Representation::Tagged(); | 3569 return Representation::Tagged(); |
3545 } | 3570 } |
3546 | 3571 |
3547 virtual bool EmitAtUses() V8_OVERRIDE; | 3572 virtual bool EmitAtUses() V8_OVERRIDE; |
3548 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 3573 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
3549 HConstant* CopyToRepresentation(Representation r, Zone* zone) const; | 3574 HConstant* CopyToRepresentation(Representation r, Zone* zone) const; |
3550 Maybe<HConstant*> CopyToTruncatedInt32(Zone* zone); | 3575 Maybe<HConstant*> CopyToTruncatedInt32(Zone* zone); |
3551 Maybe<HConstant*> CopyToTruncatedNumber(Zone* zone); | 3576 Maybe<HConstant*> CopyToTruncatedNumber(Zone* zone); |
3552 bool HasInteger32Value() const { return has_int32_value_; } | 3577 bool HasInteger32Value() const { return has_int32_value_; } |
3553 int32_t Integer32Value() const { | 3578 int32_t Integer32Value() const { |
3554 ASSERT(HasInteger32Value()); | 3579 ASSERT(HasInteger32Value()); |
3555 return int32_value_; | 3580 return int32_value_; |
3556 } | 3581 } |
3557 bool HasSmiValue() const { return has_smi_value_; } | 3582 bool HasSmiValue() const { return has_smi_value_; } |
3558 bool HasDoubleValue() const { return has_double_value_; } | 3583 bool HasDoubleValue() const { return has_double_value_; } |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3800 } | 3825 } |
3801 | 3826 |
3802 virtual void InferRepresentation( | 3827 virtual void InferRepresentation( |
3803 HInferRepresentationPhase* h_infer) V8_OVERRIDE; | 3828 HInferRepresentationPhase* h_infer) V8_OVERRIDE; |
3804 virtual Representation RepresentationFromInputs() V8_OVERRIDE; | 3829 virtual Representation RepresentationFromInputs() V8_OVERRIDE; |
3805 Representation RepresentationFromOutput(); | 3830 Representation RepresentationFromOutput(); |
3806 virtual void AssumeRepresentation(Representation r) V8_OVERRIDE; | 3831 virtual void AssumeRepresentation(Representation r) V8_OVERRIDE; |
3807 | 3832 |
3808 virtual bool IsCommutative() const { return false; } | 3833 virtual bool IsCommutative() const { return false; } |
3809 | 3834 |
3810 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 3835 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
3811 | 3836 |
3812 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3837 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
3813 if (index == 0) return Representation::Tagged(); | 3838 if (index == 0) return Representation::Tagged(); |
3814 return representation(); | 3839 return representation(); |
3815 } | 3840 } |
3816 | 3841 |
3817 void SetOperandPositions(Zone* zone, | 3842 void SetOperandPositions(Zone* zone, |
3818 HSourcePosition left_pos, | 3843 HSourcePosition left_pos, |
3819 HSourcePosition right_pos) { | 3844 HSourcePosition right_pos) { |
3820 set_operand_position(zone, 1, left_pos); | 3845 set_operand_position(zone, 1, left_pos); |
(...skipping 19 matching lines...) Expand all Loading... |
3840 class HWrapReceiver V8_FINAL : public HTemplateInstruction<2> { | 3865 class HWrapReceiver V8_FINAL : public HTemplateInstruction<2> { |
3841 public: | 3866 public: |
3842 DECLARE_INSTRUCTION_FACTORY_P2(HWrapReceiver, HValue*, HValue*); | 3867 DECLARE_INSTRUCTION_FACTORY_P2(HWrapReceiver, HValue*, HValue*); |
3843 | 3868 |
3844 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 3869 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } |
3845 | 3870 |
3846 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3871 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
3847 return Representation::Tagged(); | 3872 return Representation::Tagged(); |
3848 } | 3873 } |
3849 | 3874 |
3850 HValue* receiver() { return OperandAt(0); } | 3875 HValue* receiver() const { return OperandAt(0); } |
3851 HValue* function() { return OperandAt(1); } | 3876 HValue* function() const { return OperandAt(1); } |
3852 | 3877 |
3853 virtual HValue* Canonicalize() V8_OVERRIDE; | 3878 virtual HValue* Canonicalize() V8_OVERRIDE; |
3854 | 3879 |
3855 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 3880 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
3856 bool known_function() const { return known_function_; } | 3881 bool known_function() const { return known_function_; } |
3857 | 3882 |
3858 DECLARE_CONCRETE_INSTRUCTION(WrapReceiver) | 3883 DECLARE_CONCRETE_INSTRUCTION(WrapReceiver) |
3859 | 3884 |
3860 private: | 3885 private: |
3861 HWrapReceiver(HValue* receiver, HValue* function) { | 3886 HWrapReceiver(HValue* receiver, HValue* function) { |
3862 known_function_ = function->IsConstant() && | 3887 known_function_ = function->IsConstant() && |
3863 HConstant::cast(function)->handle(function->isolate())->IsJSFunction(); | 3888 HConstant::cast(function)->handle(function->isolate())->IsJSFunction(); |
3864 set_representation(Representation::Tagged()); | 3889 set_representation(Representation::Tagged()); |
3865 SetOperandAt(0, receiver); | 3890 SetOperandAt(0, receiver); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3954 } | 3979 } |
3955 | 3980 |
3956 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 3981 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
3957 }; | 3982 }; |
3958 | 3983 |
3959 | 3984 |
3960 class HAccessArgumentsAt V8_FINAL : public HTemplateInstruction<3> { | 3985 class HAccessArgumentsAt V8_FINAL : public HTemplateInstruction<3> { |
3961 public: | 3986 public: |
3962 DECLARE_INSTRUCTION_FACTORY_P3(HAccessArgumentsAt, HValue*, HValue*, HValue*); | 3987 DECLARE_INSTRUCTION_FACTORY_P3(HAccessArgumentsAt, HValue*, HValue*, HValue*); |
3963 | 3988 |
3964 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 3989 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
3965 | 3990 |
3966 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3991 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
3967 // The arguments elements is considered tagged. | 3992 // The arguments elements is considered tagged. |
3968 return index == 0 | 3993 return index == 0 |
3969 ? Representation::Tagged() | 3994 ? Representation::Tagged() |
3970 : Representation::Integer32(); | 3995 : Representation::Integer32(); |
3971 } | 3996 } |
3972 | 3997 |
3973 HValue* arguments() { return OperandAt(0); } | 3998 HValue* arguments() const { return OperandAt(0); } |
3974 HValue* length() { return OperandAt(1); } | 3999 HValue* length() const { return OperandAt(1); } |
3975 HValue* index() { return OperandAt(2); } | 4000 HValue* index() const { return OperandAt(2); } |
3976 | 4001 |
3977 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt) | 4002 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt) |
3978 | 4003 |
3979 private: | 4004 private: |
3980 HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { | 4005 HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { |
3981 set_representation(Representation::Tagged()); | 4006 set_representation(Representation::Tagged()); |
3982 SetFlag(kUseGVN); | 4007 SetFlag(kUseGVN); |
3983 SetOperandAt(0, arguments); | 4008 SetOperandAt(0, arguments); |
3984 SetOperandAt(1, length); | 4009 SetOperandAt(1, length); |
3985 SetOperandAt(2, index); | 4010 SetOperandAt(2, index); |
3986 } | 4011 } |
3987 | 4012 |
3988 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 4013 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } |
3989 }; | 4014 }; |
3990 | 4015 |
3991 | 4016 |
3992 class HBoundsCheckBaseIndexInformation; | 4017 class HBoundsCheckBaseIndexInformation; |
3993 | 4018 |
3994 | 4019 |
3995 class HBoundsCheck V8_FINAL : public HTemplateInstruction<2> { | 4020 class HBoundsCheck V8_FINAL : public HTemplateInstruction<2> { |
3996 public: | 4021 public: |
3997 DECLARE_INSTRUCTION_FACTORY_P2(HBoundsCheck, HValue*, HValue*); | 4022 DECLARE_INSTRUCTION_FACTORY_P2(HBoundsCheck, HValue*, HValue*); |
3998 | 4023 |
3999 bool skip_check() const { return skip_check_; } | 4024 bool skip_check() const { return skip_check_; } |
4000 void set_skip_check() { skip_check_ = true; } | 4025 void set_skip_check() { skip_check_ = true; } |
4001 | 4026 |
4002 HValue* base() { return base_; } | 4027 HValue* base() const { return base_; } |
4003 int offset() { return offset_; } | 4028 int offset() const { return offset_; } |
4004 int scale() { return scale_; } | 4029 int scale() const { return scale_; } |
4005 | 4030 |
4006 void ApplyIndexChange(); | 4031 void ApplyIndexChange(); |
4007 bool DetectCompoundIndex() { | 4032 bool DetectCompoundIndex() { |
4008 ASSERT(base() == NULL); | 4033 ASSERT(base() == NULL); |
4009 | 4034 |
4010 DecompositionResult decomposition; | 4035 DecompositionResult decomposition; |
4011 if (index()->TryDecompose(&decomposition)) { | 4036 if (index()->TryDecompose(&decomposition)) { |
4012 base_ = decomposition.base(); | 4037 base_ = decomposition.base(); |
4013 offset_ = decomposition.offset(); | 4038 offset_ = decomposition.offset(); |
4014 scale_ = decomposition.scale(); | 4039 scale_ = decomposition.scale(); |
4015 return true; | 4040 return true; |
4016 } else { | 4041 } else { |
4017 base_ = index(); | 4042 base_ = index(); |
4018 offset_ = 0; | 4043 offset_ = 0; |
4019 scale_ = 0; | 4044 scale_ = 0; |
4020 return false; | 4045 return false; |
4021 } | 4046 } |
4022 } | 4047 } |
4023 | 4048 |
4024 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4049 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
4025 return representation(); | 4050 return representation(); |
4026 } | 4051 } |
4027 | 4052 |
4028 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 4053 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
4029 virtual void InferRepresentation( | 4054 virtual void InferRepresentation( |
4030 HInferRepresentationPhase* h_infer) V8_OVERRIDE; | 4055 HInferRepresentationPhase* h_infer) V8_OVERRIDE; |
4031 | 4056 |
4032 HValue* index() { return OperandAt(0); } | 4057 HValue* index() const { return OperandAt(0); } |
4033 HValue* length() { return OperandAt(1); } | 4058 HValue* length() const { return OperandAt(1); } |
4034 bool allow_equality() { return allow_equality_; } | 4059 bool allow_equality() const { return allow_equality_; } |
4035 void set_allow_equality(bool v) { allow_equality_ = v; } | 4060 void set_allow_equality(bool v) { allow_equality_ = v; } |
4036 | 4061 |
4037 virtual int RedefinedOperandIndex() V8_OVERRIDE { return 0; } | 4062 virtual int RedefinedOperandIndex() V8_OVERRIDE { return 0; } |
4038 virtual bool IsPurelyInformativeDefinition() V8_OVERRIDE { | 4063 virtual bool IsPurelyInformativeDefinition() V8_OVERRIDE { |
4039 return skip_check(); | 4064 return skip_check(); |
4040 } | 4065 } |
4041 | 4066 |
4042 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck) | 4067 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck) |
4043 | 4068 |
4044 protected: | 4069 protected: |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4080 explicit HBoundsCheckBaseIndexInformation(HBoundsCheck* check) { | 4105 explicit HBoundsCheckBaseIndexInformation(HBoundsCheck* check) { |
4081 DecompositionResult decomposition; | 4106 DecompositionResult decomposition; |
4082 if (check->index()->TryDecompose(&decomposition)) { | 4107 if (check->index()->TryDecompose(&decomposition)) { |
4083 SetOperandAt(0, decomposition.base()); | 4108 SetOperandAt(0, decomposition.base()); |
4084 SetOperandAt(1, check); | 4109 SetOperandAt(1, check); |
4085 } else { | 4110 } else { |
4086 UNREACHABLE(); | 4111 UNREACHABLE(); |
4087 } | 4112 } |
4088 } | 4113 } |
4089 | 4114 |
4090 HValue* base_index() { return OperandAt(0); } | 4115 HValue* base_index() const { return OperandAt(0); } |
4091 HBoundsCheck* bounds_check() { return HBoundsCheck::cast(OperandAt(1)); } | 4116 HBoundsCheck* bounds_check() { return HBoundsCheck::cast(OperandAt(1)); } |
4092 | 4117 |
4093 DECLARE_CONCRETE_INSTRUCTION(BoundsCheckBaseIndexInformation) | 4118 DECLARE_CONCRETE_INSTRUCTION(BoundsCheckBaseIndexInformation) |
4094 | 4119 |
4095 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4120 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
4096 return representation(); | 4121 return representation(); |
4097 } | 4122 } |
4098 | 4123 |
4099 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 4124 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
4100 | 4125 |
4101 virtual int RedefinedOperandIndex() V8_OVERRIDE { return 0; } | 4126 virtual int RedefinedOperandIndex() V8_OVERRIDE { return 0; } |
4102 virtual bool IsPurelyInformativeDefinition() V8_OVERRIDE { return true; } | 4127 virtual bool IsPurelyInformativeDefinition() V8_OVERRIDE { return true; } |
4103 }; | 4128 }; |
4104 | 4129 |
4105 | 4130 |
4106 class HBitwiseBinaryOperation : public HBinaryOperation { | 4131 class HBitwiseBinaryOperation : public HBinaryOperation { |
4107 public: | 4132 public: |
4108 HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right, | 4133 HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right, |
4109 HType type = HType::TaggedNumber()) | 4134 HType type = HType::TaggedNumber()) |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4215 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCompareGeneric, HValue*, | 4240 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCompareGeneric, HValue*, |
4216 HValue*, Token::Value); | 4241 HValue*, Token::Value); |
4217 | 4242 |
4218 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4243 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
4219 return index == 0 | 4244 return index == 0 |
4220 ? Representation::Tagged() | 4245 ? Representation::Tagged() |
4221 : representation(); | 4246 : representation(); |
4222 } | 4247 } |
4223 | 4248 |
4224 Token::Value token() const { return token_; } | 4249 Token::Value token() const { return token_; } |
4225 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 4250 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
4226 | 4251 |
4227 DECLARE_CONCRETE_INSTRUCTION(CompareGeneric) | 4252 DECLARE_CONCRETE_INSTRUCTION(CompareGeneric) |
4228 | 4253 |
4229 private: | 4254 private: |
4230 HCompareGeneric(HValue* context, | 4255 HCompareGeneric(HValue* context, |
4231 HValue* left, | 4256 HValue* left, |
4232 HValue* right, | 4257 HValue* right, |
4233 Token::Value token) | 4258 Token::Value token) |
4234 : HBinaryOperation(context, left, right, HType::Boolean()), | 4259 : HBinaryOperation(context, left, right, HType::Boolean()), |
4235 token_(token) { | 4260 token_(token) { |
4236 ASSERT(Token::IsCompareOp(token)); | 4261 ASSERT(Token::IsCompareOp(token)); |
4237 set_representation(Representation::Tagged()); | 4262 set_representation(Representation::Tagged()); |
4238 SetAllSideEffects(); | 4263 SetAllSideEffects(); |
4239 } | 4264 } |
4240 | 4265 |
4241 Token::Value token_; | 4266 Token::Value token_; |
4242 }; | 4267 }; |
4243 | 4268 |
4244 | 4269 |
4245 class HCompareNumericAndBranch : public HTemplateControlInstruction<2, 2> { | 4270 class HCompareNumericAndBranch : public HTemplateControlInstruction<2, 2> { |
4246 public: | 4271 public: |
4247 DECLARE_INSTRUCTION_FACTORY_P3(HCompareNumericAndBranch, | 4272 DECLARE_INSTRUCTION_FACTORY_P3(HCompareNumericAndBranch, |
4248 HValue*, HValue*, Token::Value); | 4273 HValue*, HValue*, Token::Value); |
4249 DECLARE_INSTRUCTION_FACTORY_P5(HCompareNumericAndBranch, | 4274 DECLARE_INSTRUCTION_FACTORY_P5(HCompareNumericAndBranch, |
4250 HValue*, HValue*, Token::Value, | 4275 HValue*, HValue*, Token::Value, |
4251 HBasicBlock*, HBasicBlock*); | 4276 HBasicBlock*, HBasicBlock*); |
4252 | 4277 |
4253 HValue* left() { return OperandAt(0); } | 4278 HValue* left() const { return OperandAt(0); } |
4254 HValue* right() { return OperandAt(1); } | 4279 HValue* right() const { return OperandAt(1); } |
4255 Token::Value token() const { return token_; } | 4280 Token::Value token() const { return token_; } |
4256 | 4281 |
4257 void set_observed_input_representation(Representation left, | 4282 void set_observed_input_representation(Representation left, |
4258 Representation right) { | 4283 Representation right) { |
4259 observed_input_representation_[0] = left; | 4284 observed_input_representation_[0] = left; |
4260 observed_input_representation_[1] = right; | 4285 observed_input_representation_[1] = right; |
4261 } | 4286 } |
4262 | 4287 |
4263 virtual void InferRepresentation( | 4288 virtual void InferRepresentation( |
4264 HInferRepresentationPhase* h_infer) V8_OVERRIDE; | 4289 HInferRepresentationPhase* h_infer) V8_OVERRIDE; |
4265 | 4290 |
4266 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4291 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
4267 return representation(); | 4292 return representation(); |
4268 } | 4293 } |
4269 virtual Representation observed_input_representation(int index) V8_OVERRIDE { | 4294 virtual Representation observed_input_representation(int index) V8_OVERRIDE { |
4270 return observed_input_representation_[index]; | 4295 return observed_input_representation_[index]; |
4271 } | 4296 } |
4272 | 4297 |
4273 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 4298 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
4274 | 4299 |
4275 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 4300 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
4276 | 4301 |
4277 void SetOperandPositions(Zone* zone, | 4302 void SetOperandPositions(Zone* zone, |
4278 HSourcePosition left_pos, | 4303 HSourcePosition left_pos, |
4279 HSourcePosition right_pos) { | 4304 HSourcePosition right_pos) { |
4280 set_operand_position(zone, 0, left_pos); | 4305 set_operand_position(zone, 0, left_pos); |
4281 set_operand_position(zone, 1, right_pos); | 4306 set_operand_position(zone, 1, right_pos); |
4282 } | 4307 } |
4283 | 4308 |
4284 DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch) | 4309 DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch) |
4285 | 4310 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4358 HBasicBlock*, HBasicBlock*); | 4383 HBasicBlock*, HBasicBlock*); |
4359 | 4384 |
4360 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 4385 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
4361 | 4386 |
4362 static const int kNoKnownSuccessorIndex = -1; | 4387 static const int kNoKnownSuccessorIndex = -1; |
4363 int known_successor_index() const { return known_successor_index_; } | 4388 int known_successor_index() const { return known_successor_index_; } |
4364 void set_known_successor_index(int known_successor_index) { | 4389 void set_known_successor_index(int known_successor_index) { |
4365 known_successor_index_ = known_successor_index; | 4390 known_successor_index_ = known_successor_index; |
4366 } | 4391 } |
4367 | 4392 |
4368 HValue* left() { return OperandAt(0); } | 4393 HValue* left() const { return OperandAt(0); } |
4369 HValue* right() { return OperandAt(1); } | 4394 HValue* right() const { return OperandAt(1); } |
4370 | 4395 |
4371 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 4396 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
4372 | 4397 |
4373 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4398 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
4374 return Representation::Tagged(); | 4399 return Representation::Tagged(); |
4375 } | 4400 } |
4376 | 4401 |
4377 virtual Representation observed_input_representation(int index) V8_OVERRIDE { | 4402 virtual Representation observed_input_representation(int index) V8_OVERRIDE { |
4378 return Representation::Tagged(); | 4403 return Representation::Tagged(); |
4379 } | 4404 } |
4380 | 4405 |
4381 DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch) | 4406 DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch) |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4505 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HStringCompareAndBranch, | 4530 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HStringCompareAndBranch, |
4506 HValue*, | 4531 HValue*, |
4507 HValue*, | 4532 HValue*, |
4508 Token::Value); | 4533 Token::Value); |
4509 | 4534 |
4510 HValue* context() { return OperandAt(0); } | 4535 HValue* context() { return OperandAt(0); } |
4511 HValue* left() { return OperandAt(1); } | 4536 HValue* left() { return OperandAt(1); } |
4512 HValue* right() { return OperandAt(2); } | 4537 HValue* right() { return OperandAt(2); } |
4513 Token::Value token() const { return token_; } | 4538 Token::Value token() const { return token_; } |
4514 | 4539 |
4515 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 4540 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
4516 | 4541 |
4517 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4542 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
4518 return Representation::Tagged(); | 4543 return Representation::Tagged(); |
4519 } | 4544 } |
4520 | 4545 |
4521 Representation GetInputRepresentation() const { | 4546 Representation GetInputRepresentation() const { |
4522 return Representation::Tagged(); | 4547 return Representation::Tagged(); |
4523 } | 4548 } |
4524 | 4549 |
4525 DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch) | 4550 DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch) |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4559 class HHasInstanceTypeAndBranch V8_FINAL : public HUnaryControlInstruction { | 4584 class HHasInstanceTypeAndBranch V8_FINAL : public HUnaryControlInstruction { |
4560 public: | 4585 public: |
4561 DECLARE_INSTRUCTION_FACTORY_P2( | 4586 DECLARE_INSTRUCTION_FACTORY_P2( |
4562 HHasInstanceTypeAndBranch, HValue*, InstanceType); | 4587 HHasInstanceTypeAndBranch, HValue*, InstanceType); |
4563 DECLARE_INSTRUCTION_FACTORY_P3( | 4588 DECLARE_INSTRUCTION_FACTORY_P3( |
4564 HHasInstanceTypeAndBranch, HValue*, InstanceType, InstanceType); | 4589 HHasInstanceTypeAndBranch, HValue*, InstanceType, InstanceType); |
4565 | 4590 |
4566 InstanceType from() { return from_; } | 4591 InstanceType from() { return from_; } |
4567 InstanceType to() { return to_; } | 4592 InstanceType to() { return to_; } |
4568 | 4593 |
4569 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 4594 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
4570 | 4595 |
4571 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4596 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
4572 return Representation::Tagged(); | 4597 return Representation::Tagged(); |
4573 } | 4598 } |
4574 | 4599 |
4575 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 4600 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
4576 | 4601 |
4577 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch) | 4602 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch) |
4578 | 4603 |
4579 private: | 4604 private: |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4631 public: | 4656 public: |
4632 DECLARE_INSTRUCTION_FACTORY_P2(HClassOfTestAndBranch, HValue*, | 4657 DECLARE_INSTRUCTION_FACTORY_P2(HClassOfTestAndBranch, HValue*, |
4633 Handle<String>); | 4658 Handle<String>); |
4634 | 4659 |
4635 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch) | 4660 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch) |
4636 | 4661 |
4637 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4662 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
4638 return Representation::Tagged(); | 4663 return Representation::Tagged(); |
4639 } | 4664 } |
4640 | 4665 |
4641 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 4666 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
4642 | 4667 |
4643 Handle<String> class_name() const { return class_name_; } | 4668 Handle<String> class_name() const { return class_name_; } |
4644 | 4669 |
4645 private: | 4670 private: |
4646 HClassOfTestAndBranch(HValue* value, Handle<String> class_name) | 4671 HClassOfTestAndBranch(HValue* value, Handle<String> class_name) |
4647 : HUnaryControlInstruction(value, NULL, NULL), | 4672 : HUnaryControlInstruction(value, NULL, NULL), |
4648 class_name_(class_name) { } | 4673 class_name_(class_name) { } |
4649 | 4674 |
4650 Handle<String> class_name_; | 4675 Handle<String> class_name_; |
4651 }; | 4676 }; |
4652 | 4677 |
4653 | 4678 |
4654 class HTypeofIsAndBranch V8_FINAL : public HUnaryControlInstruction { | 4679 class HTypeofIsAndBranch V8_FINAL : public HUnaryControlInstruction { |
4655 public: | 4680 public: |
4656 DECLARE_INSTRUCTION_FACTORY_P2(HTypeofIsAndBranch, HValue*, Handle<String>); | 4681 DECLARE_INSTRUCTION_FACTORY_P2(HTypeofIsAndBranch, HValue*, Handle<String>); |
4657 | 4682 |
4658 Handle<String> type_literal() { return type_literal_.handle(); } | 4683 Handle<String> type_literal() const { return type_literal_.handle(); } |
4659 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 4684 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
4660 | 4685 |
4661 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch) | 4686 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch) |
4662 | 4687 |
4663 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4688 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
4664 return Representation::None(); | 4689 return Representation::None(); |
4665 } | 4690 } |
4666 | 4691 |
4667 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 4692 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
4668 | 4693 |
4669 virtual void FinalizeUniqueness() V8_OVERRIDE { | 4694 virtual void FinalizeUniqueness() V8_OVERRIDE { |
(...skipping 10 matching lines...) Expand all Loading... |
4680 | 4705 |
4681 | 4706 |
4682 class HInstanceOf V8_FINAL : public HBinaryOperation { | 4707 class HInstanceOf V8_FINAL : public HBinaryOperation { |
4683 public: | 4708 public: |
4684 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInstanceOf, HValue*, HValue*); | 4709 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInstanceOf, HValue*, HValue*); |
4685 | 4710 |
4686 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4711 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
4687 return Representation::Tagged(); | 4712 return Representation::Tagged(); |
4688 } | 4713 } |
4689 | 4714 |
4690 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 4715 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
4691 | 4716 |
4692 DECLARE_CONCRETE_INSTRUCTION(InstanceOf) | 4717 DECLARE_CONCRETE_INSTRUCTION(InstanceOf) |
4693 | 4718 |
4694 private: | 4719 private: |
4695 HInstanceOf(HValue* context, HValue* left, HValue* right) | 4720 HInstanceOf(HValue* context, HValue* left, HValue* right) |
4696 : HBinaryOperation(context, left, right, HType::Boolean()) { | 4721 : HBinaryOperation(context, left, right, HType::Boolean()) { |
4697 set_representation(Representation::Tagged()); | 4722 set_representation(Representation::Tagged()); |
4698 SetAllSideEffects(); | 4723 SetAllSideEffects(); |
4699 } | 4724 } |
4700 }; | 4725 }; |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5039 Token::Value op, | 5064 Token::Value op, |
5040 HValue* left, | 5065 HValue* left, |
5041 HValue* right); | 5066 HValue* right); |
5042 | 5067 |
5043 Token::Value op() const { return op_; } | 5068 Token::Value op() const { return op_; } |
5044 | 5069 |
5045 virtual bool IsCommutative() const V8_OVERRIDE { return true; } | 5070 virtual bool IsCommutative() const V8_OVERRIDE { return true; } |
5046 | 5071 |
5047 virtual HValue* Canonicalize() V8_OVERRIDE; | 5072 virtual HValue* Canonicalize() V8_OVERRIDE; |
5048 | 5073 |
5049 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 5074 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
5050 | 5075 |
5051 DECLARE_CONCRETE_INSTRUCTION(Bitwise) | 5076 DECLARE_CONCRETE_INSTRUCTION(Bitwise) |
5052 | 5077 |
5053 protected: | 5078 protected: |
5054 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 5079 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
5055 return op() == HBitwise::cast(other)->op(); | 5080 return op() == HBitwise::cast(other)->op(); |
5056 } | 5081 } |
5057 | 5082 |
5058 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 5083 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; |
5059 | 5084 |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5262 }; | 5287 }; |
5263 | 5288 |
5264 DECLARE_INSTRUCTION_FACTORY_P1(HParameter, unsigned); | 5289 DECLARE_INSTRUCTION_FACTORY_P1(HParameter, unsigned); |
5265 DECLARE_INSTRUCTION_FACTORY_P2(HParameter, unsigned, ParameterKind); | 5290 DECLARE_INSTRUCTION_FACTORY_P2(HParameter, unsigned, ParameterKind); |
5266 DECLARE_INSTRUCTION_FACTORY_P3(HParameter, unsigned, ParameterKind, | 5291 DECLARE_INSTRUCTION_FACTORY_P3(HParameter, unsigned, ParameterKind, |
5267 Representation); | 5292 Representation); |
5268 | 5293 |
5269 unsigned index() const { return index_; } | 5294 unsigned index() const { return index_; } |
5270 ParameterKind kind() const { return kind_; } | 5295 ParameterKind kind() const { return kind_; } |
5271 | 5296 |
5272 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 5297 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
5273 | 5298 |
5274 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5299 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
5275 return Representation::None(); | 5300 return Representation::None(); |
5276 } | 5301 } |
5277 | 5302 |
5278 DECLARE_CONCRETE_INSTRUCTION(Parameter) | 5303 DECLARE_CONCRETE_INSTRUCTION(Parameter) |
5279 | 5304 |
5280 private: | 5305 private: |
5281 explicit HParameter(unsigned index, | 5306 explicit HParameter(unsigned index, |
5282 ParameterKind kind = STACK_PARAMETER) | 5307 ParameterKind kind = STACK_PARAMETER) |
(...skipping 15 matching lines...) Expand all Loading... |
5298 }; | 5323 }; |
5299 | 5324 |
5300 | 5325 |
5301 class HCallStub V8_FINAL : public HUnaryCall { | 5326 class HCallStub V8_FINAL : public HUnaryCall { |
5302 public: | 5327 public: |
5303 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallStub, CodeStub::Major, int); | 5328 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallStub, CodeStub::Major, int); |
5304 CodeStub::Major major_key() { return major_key_; } | 5329 CodeStub::Major major_key() { return major_key_; } |
5305 | 5330 |
5306 HValue* context() { return value(); } | 5331 HValue* context() { return value(); } |
5307 | 5332 |
5308 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 5333 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
5309 | 5334 |
5310 DECLARE_CONCRETE_INSTRUCTION(CallStub) | 5335 DECLARE_CONCRETE_INSTRUCTION(CallStub) |
5311 | 5336 |
5312 private: | 5337 private: |
5313 HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) | 5338 HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) |
5314 : HUnaryCall(context, argument_count), | 5339 : HUnaryCall(context, argument_count), |
5315 major_key_(major_key) { | 5340 major_key_(major_key) { |
5316 } | 5341 } |
5317 | 5342 |
5318 CodeStub::Major major_key_; | 5343 CodeStub::Major major_key_; |
5319 }; | 5344 }; |
5320 | 5345 |
5321 | 5346 |
5322 class HUnknownOSRValue V8_FINAL : public HTemplateInstruction<0> { | 5347 class HUnknownOSRValue V8_FINAL : public HTemplateInstruction<0> { |
5323 public: | 5348 public: |
5324 DECLARE_INSTRUCTION_FACTORY_P2(HUnknownOSRValue, HEnvironment*, int); | 5349 DECLARE_INSTRUCTION_FACTORY_P2(HUnknownOSRValue, HEnvironment*, int); |
5325 | 5350 |
5326 virtual void PrintDataTo(StringStream* stream); | 5351 virtual OStream& PrintDataTo(OStream& os) const; // NOLINT |
5327 | 5352 |
5328 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5353 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
5329 return Representation::None(); | 5354 return Representation::None(); |
5330 } | 5355 } |
5331 | 5356 |
5332 void set_incoming_value(HPhi* value) { incoming_value_ = value; } | 5357 void set_incoming_value(HPhi* value) { incoming_value_ = value; } |
5333 HPhi* incoming_value() { return incoming_value_; } | 5358 HPhi* incoming_value() { return incoming_value_; } |
5334 HEnvironment *environment() { return environment_; } | 5359 HEnvironment *environment() { return environment_; } |
5335 int index() { return index_; } | 5360 int index() { return index_; } |
5336 | 5361 |
(...skipping 19 matching lines...) Expand all Loading... |
5356 | 5381 |
5357 | 5382 |
5358 class HLoadGlobalCell V8_FINAL : public HTemplateInstruction<0> { | 5383 class HLoadGlobalCell V8_FINAL : public HTemplateInstruction<0> { |
5359 public: | 5384 public: |
5360 DECLARE_INSTRUCTION_FACTORY_P2(HLoadGlobalCell, Handle<Cell>, | 5385 DECLARE_INSTRUCTION_FACTORY_P2(HLoadGlobalCell, Handle<Cell>, |
5361 PropertyDetails); | 5386 PropertyDetails); |
5362 | 5387 |
5363 Unique<Cell> cell() const { return cell_; } | 5388 Unique<Cell> cell() const { return cell_; } |
5364 bool RequiresHoleCheck() const; | 5389 bool RequiresHoleCheck() const; |
5365 | 5390 |
5366 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 5391 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
5367 | 5392 |
5368 virtual intptr_t Hashcode() V8_OVERRIDE { | 5393 virtual intptr_t Hashcode() V8_OVERRIDE { |
5369 return cell_.Hashcode(); | 5394 return cell_.Hashcode(); |
5370 } | 5395 } |
5371 | 5396 |
5372 virtual void FinalizeUniqueness() V8_OVERRIDE { | 5397 virtual void FinalizeUniqueness() V8_OVERRIDE { |
5373 cell_ = Unique<Cell>(cell_.handle()); | 5398 cell_ = Unique<Cell>(cell_.handle()); |
5374 } | 5399 } |
5375 | 5400 |
5376 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5401 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
(...skipping 18 matching lines...) Expand all Loading... |
5395 virtual bool IsDeletable() const V8_OVERRIDE { return !RequiresHoleCheck(); } | 5420 virtual bool IsDeletable() const V8_OVERRIDE { return !RequiresHoleCheck(); } |
5396 | 5421 |
5397 Unique<Cell> cell_; | 5422 Unique<Cell> cell_; |
5398 PropertyDetails details_; | 5423 PropertyDetails details_; |
5399 }; | 5424 }; |
5400 | 5425 |
5401 | 5426 |
5402 class HLoadGlobalGeneric V8_FINAL : public HTemplateInstruction<2> { | 5427 class HLoadGlobalGeneric V8_FINAL : public HTemplateInstruction<2> { |
5403 public: | 5428 public: |
5404 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HLoadGlobalGeneric, HValue*, | 5429 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HLoadGlobalGeneric, HValue*, |
5405 Handle<Object>, bool); | 5430 Handle<String>, bool); |
5406 | 5431 |
5407 HValue* context() { return OperandAt(0); } | 5432 HValue* context() { return OperandAt(0); } |
5408 HValue* global_object() { return OperandAt(1); } | 5433 HValue* global_object() { return OperandAt(1); } |
5409 Handle<Object> name() const { return name_; } | 5434 Handle<String> name() const { return name_; } |
5410 bool for_typeof() const { return for_typeof_; } | 5435 bool for_typeof() const { return for_typeof_; } |
5411 | 5436 |
5412 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 5437 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
5413 | 5438 |
5414 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5439 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
5415 return Representation::Tagged(); | 5440 return Representation::Tagged(); |
5416 } | 5441 } |
5417 | 5442 |
5418 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric) | 5443 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric) |
5419 | 5444 |
5420 private: | 5445 private: |
5421 HLoadGlobalGeneric(HValue* context, | 5446 HLoadGlobalGeneric(HValue* context, HValue* global_object, |
5422 HValue* global_object, | 5447 Handle<String> name, bool for_typeof) |
5423 Handle<Object> name, | 5448 : name_(name), for_typeof_(for_typeof) { |
5424 bool for_typeof) | |
5425 : name_(name), | |
5426 for_typeof_(for_typeof) { | |
5427 SetOperandAt(0, context); | 5449 SetOperandAt(0, context); |
5428 SetOperandAt(1, global_object); | 5450 SetOperandAt(1, global_object); |
5429 set_representation(Representation::Tagged()); | 5451 set_representation(Representation::Tagged()); |
5430 SetAllSideEffects(); | 5452 SetAllSideEffects(); |
5431 } | 5453 } |
5432 | 5454 |
5433 Handle<Object> name_; | 5455 Handle<String> name_; |
5434 bool for_typeof_; | 5456 bool for_typeof_; |
5435 }; | 5457 }; |
5436 | 5458 |
5437 | 5459 |
5438 class HAllocate V8_FINAL : public HTemplateInstruction<2> { | 5460 class HAllocate V8_FINAL : public HTemplateInstruction<2> { |
5439 public: | 5461 public: |
5440 static bool CompatibleInstanceTypes(InstanceType type1, | 5462 static bool CompatibleInstanceTypes(InstanceType type1, |
5441 InstanceType type2) { | 5463 InstanceType type2) { |
5442 return ComputeFlags(TENURED, type1) == ComputeFlags(TENURED, type2) && | 5464 return ComputeFlags(TENURED, type1) == ComputeFlags(TENURED, type2) && |
5443 ComputeFlags(NOT_TENURED, type1) == ComputeFlags(NOT_TENURED, type2); | 5465 ComputeFlags(NOT_TENURED, type1) == ComputeFlags(NOT_TENURED, type2); |
5444 } | 5466 } |
5445 | 5467 |
5446 static HAllocate* New(Zone* zone, | 5468 static HAllocate* New(Zone* zone, |
5447 HValue* context, | 5469 HValue* context, |
5448 HValue* size, | 5470 HValue* size, |
5449 HType type, | 5471 HType type, |
5450 PretenureFlag pretenure_flag, | 5472 PretenureFlag pretenure_flag, |
5451 InstanceType instance_type, | 5473 InstanceType instance_type, |
5452 Handle<AllocationSite> allocation_site = | 5474 Handle<AllocationSite> allocation_site = |
5453 Handle<AllocationSite>::null()) { | 5475 Handle<AllocationSite>::null()) { |
5454 return new(zone) HAllocate(context, size, type, pretenure_flag, | 5476 return new(zone) HAllocate(context, size, type, pretenure_flag, |
5455 instance_type, allocation_site); | 5477 instance_type, allocation_site); |
5456 } | 5478 } |
5457 | 5479 |
5458 // Maximum instance size for which allocations will be inlined. | 5480 // Maximum instance size for which allocations will be inlined. |
5459 static const int kMaxInlineSize = 64 * kPointerSize; | 5481 static const int kMaxInlineSize = 64 * kPointerSize; |
5460 | 5482 |
5461 HValue* context() { return OperandAt(0); } | 5483 HValue* context() const { return OperandAt(0); } |
5462 HValue* size() { return OperandAt(1); } | 5484 HValue* size() const { return OperandAt(1); } |
5463 | 5485 |
5464 bool has_size_upper_bound() { return size_upper_bound_ != NULL; } | 5486 bool has_size_upper_bound() { return size_upper_bound_ != NULL; } |
5465 HConstant* size_upper_bound() { return size_upper_bound_; } | 5487 HConstant* size_upper_bound() { return size_upper_bound_; } |
5466 void set_size_upper_bound(HConstant* value) { | 5488 void set_size_upper_bound(HConstant* value) { |
5467 ASSERT(size_upper_bound_ == NULL); | 5489 ASSERT(size_upper_bound_ == NULL); |
5468 size_upper_bound_ = value; | 5490 size_upper_bound_ = value; |
5469 } | 5491 } |
5470 | 5492 |
5471 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5493 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
5472 if (index == 0) { | 5494 if (index == 0) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5512 return (flags_ & CLEAR_NEXT_MAP_WORD) != 0; | 5534 return (flags_ & CLEAR_NEXT_MAP_WORD) != 0; |
5513 } | 5535 } |
5514 | 5536 |
5515 void MakeDoubleAligned() { | 5537 void MakeDoubleAligned() { |
5516 flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED); | 5538 flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED); |
5517 } | 5539 } |
5518 | 5540 |
5519 virtual bool HandleSideEffectDominator(GVNFlag side_effect, | 5541 virtual bool HandleSideEffectDominator(GVNFlag side_effect, |
5520 HValue* dominator) V8_OVERRIDE; | 5542 HValue* dominator) V8_OVERRIDE; |
5521 | 5543 |
5522 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 5544 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
5523 | 5545 |
5524 DECLARE_CONCRETE_INSTRUCTION(Allocate) | 5546 DECLARE_CONCRETE_INSTRUCTION(Allocate) |
5525 | 5547 |
5526 private: | 5548 private: |
5527 enum Flags { | 5549 enum Flags { |
5528 ALLOCATE_IN_NEW_SPACE = 1 << 0, | 5550 ALLOCATE_IN_NEW_SPACE = 1 << 0, |
5529 ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1, | 5551 ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1, |
5530 ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2, | 5552 ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2, |
5531 ALLOCATE_DOUBLE_ALIGNED = 1 << 3, | 5553 ALLOCATE_DOUBLE_ALIGNED = 1 << 3, |
5532 PREFILL_WITH_FILLER = 1 << 4, | 5554 PREFILL_WITH_FILLER = 1 << 4, |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5652 class HInnerAllocatedObject V8_FINAL : public HTemplateInstruction<2> { | 5674 class HInnerAllocatedObject V8_FINAL : public HTemplateInstruction<2> { |
5653 public: | 5675 public: |
5654 static HInnerAllocatedObject* New(Zone* zone, | 5676 static HInnerAllocatedObject* New(Zone* zone, |
5655 HValue* context, | 5677 HValue* context, |
5656 HValue* value, | 5678 HValue* value, |
5657 HValue* offset, | 5679 HValue* offset, |
5658 HType type) { | 5680 HType type) { |
5659 return new(zone) HInnerAllocatedObject(value, offset, type); | 5681 return new(zone) HInnerAllocatedObject(value, offset, type); |
5660 } | 5682 } |
5661 | 5683 |
5662 HValue* base_object() { return OperandAt(0); } | 5684 HValue* base_object() const { return OperandAt(0); } |
5663 HValue* offset() { return OperandAt(1); } | 5685 HValue* offset() const { return OperandAt(1); } |
5664 | 5686 |
5665 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5687 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
5666 return index == 0 ? Representation::Tagged() : Representation::Integer32(); | 5688 return index == 0 ? Representation::Tagged() : Representation::Integer32(); |
5667 } | 5689 } |
5668 | 5690 |
5669 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 5691 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
5670 | 5692 |
5671 DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject) | 5693 DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject) |
5672 | 5694 |
5673 private: | 5695 private: |
5674 HInnerAllocatedObject(HValue* value, | 5696 HInnerAllocatedObject(HValue* value, |
5675 HValue* offset, | 5697 HValue* offset, |
5676 HType type) : HTemplateInstruction<2>(type) { | 5698 HType type) : HTemplateInstruction<2>(type) { |
5677 ASSERT(value->IsAllocate()); | 5699 ASSERT(value->IsAllocate()); |
5678 ASSERT(type.IsHeapObject()); | 5700 ASSERT(type.IsHeapObject()); |
5679 SetOperandAt(0, value); | 5701 SetOperandAt(0, value); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5759 return StoringValueNeedsWriteBarrier(value()); | 5781 return StoringValueNeedsWriteBarrier(value()); |
5760 } | 5782 } |
5761 | 5783 |
5762 virtual void FinalizeUniqueness() V8_OVERRIDE { | 5784 virtual void FinalizeUniqueness() V8_OVERRIDE { |
5763 cell_ = Unique<PropertyCell>(cell_.handle()); | 5785 cell_ = Unique<PropertyCell>(cell_.handle()); |
5764 } | 5786 } |
5765 | 5787 |
5766 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5788 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
5767 return Representation::Tagged(); | 5789 return Representation::Tagged(); |
5768 } | 5790 } |
5769 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 5791 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
5770 | 5792 |
5771 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) | 5793 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) |
5772 | 5794 |
5773 private: | 5795 private: |
5774 HStoreGlobalCell(HValue* value, | 5796 HStoreGlobalCell(HValue* value, |
5775 Handle<PropertyCell> cell, | 5797 Handle<PropertyCell> cell, |
5776 PropertyDetails details) | 5798 PropertyDetails details) |
5777 : HUnaryOperation(value), | 5799 : HUnaryOperation(value), |
5778 cell_(Unique<PropertyCell>::CreateUninitialized(cell)), | 5800 cell_(Unique<PropertyCell>::CreateUninitialized(cell)), |
5779 details_(details) { | 5801 details_(details) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5815 } | 5837 } |
5816 | 5838 |
5817 bool RequiresHoleCheck() const { | 5839 bool RequiresHoleCheck() const { |
5818 return mode_ != kNoCheck; | 5840 return mode_ != kNoCheck; |
5819 } | 5841 } |
5820 | 5842 |
5821 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5843 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
5822 return Representation::Tagged(); | 5844 return Representation::Tagged(); |
5823 } | 5845 } |
5824 | 5846 |
5825 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 5847 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
5826 | 5848 |
5827 DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot) | 5849 DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot) |
5828 | 5850 |
5829 protected: | 5851 protected: |
5830 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 5852 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
5831 HLoadContextSlot* b = HLoadContextSlot::cast(other); | 5853 HLoadContextSlot* b = HLoadContextSlot::cast(other); |
5832 return (slot_index() == b->slot_index()); | 5854 return (slot_index() == b->slot_index()); |
5833 } | 5855 } |
5834 | 5856 |
5835 private: | 5857 private: |
(...skipping 15 matching lines...) Expand all Loading... |
5851 // harmony bindings where we deoptimize into full-codegen generated code | 5873 // harmony bindings where we deoptimize into full-codegen generated code |
5852 // which will subsequently throw a reference error. | 5874 // which will subsequently throw a reference error. |
5853 kCheckDeoptimize, | 5875 kCheckDeoptimize, |
5854 // Check the previous value and ignore assignment if it isn't a hole value | 5876 // Check the previous value and ignore assignment if it isn't a hole value |
5855 kCheckIgnoreAssignment | 5877 kCheckIgnoreAssignment |
5856 }; | 5878 }; |
5857 | 5879 |
5858 DECLARE_INSTRUCTION_FACTORY_P4(HStoreContextSlot, HValue*, int, | 5880 DECLARE_INSTRUCTION_FACTORY_P4(HStoreContextSlot, HValue*, int, |
5859 Mode, HValue*); | 5881 Mode, HValue*); |
5860 | 5882 |
5861 HValue* context() { return OperandAt(0); } | 5883 HValue* context() const { return OperandAt(0); } |
5862 HValue* value() { return OperandAt(1); } | 5884 HValue* value() const { return OperandAt(1); } |
5863 int slot_index() const { return slot_index_; } | 5885 int slot_index() const { return slot_index_; } |
5864 Mode mode() const { return mode_; } | 5886 Mode mode() const { return mode_; } |
5865 | 5887 |
5866 bool NeedsWriteBarrier() { | 5888 bool NeedsWriteBarrier() { |
5867 return StoringValueNeedsWriteBarrier(value()); | 5889 return StoringValueNeedsWriteBarrier(value()); |
5868 } | 5890 } |
5869 | 5891 |
5870 bool DeoptimizesOnHole() { | 5892 bool DeoptimizesOnHole() { |
5871 return mode_ == kCheckDeoptimize; | 5893 return mode_ == kCheckDeoptimize; |
5872 } | 5894 } |
5873 | 5895 |
5874 bool RequiresHoleCheck() { | 5896 bool RequiresHoleCheck() { |
5875 return mode_ != kNoCheck; | 5897 return mode_ != kNoCheck; |
5876 } | 5898 } |
5877 | 5899 |
5878 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5900 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
5879 return Representation::Tagged(); | 5901 return Representation::Tagged(); |
5880 } | 5902 } |
5881 | 5903 |
5882 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 5904 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
5883 | 5905 |
5884 DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot) | 5906 DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot) |
5885 | 5907 |
5886 private: | 5908 private: |
5887 HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value) | 5909 HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value) |
5888 : slot_index_(slot_index), mode_(mode) { | 5910 : slot_index_(slot_index), mode_(mode) { |
5889 SetOperandAt(0, context); | 5911 SetOperandAt(0, context); |
5890 SetOperandAt(1, value); | 5912 SetOperandAt(1, value); |
5891 SetChangesFlag(kContextSlots); | 5913 SetChangesFlag(kContextSlots); |
5892 } | 5914 } |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6199 | 6221 |
6200 static HObjectAccess ForJSArrayBufferViewByteLength() { | 6222 static HObjectAccess ForJSArrayBufferViewByteLength() { |
6201 return HObjectAccess::ForObservableJSObjectOffset( | 6223 return HObjectAccess::ForObservableJSObjectOffset( |
6202 JSArrayBufferView::kByteLengthOffset); | 6224 JSArrayBufferView::kByteLengthOffset); |
6203 } | 6225 } |
6204 | 6226 |
6205 static HObjectAccess ForGlobalObjectNativeContext() { | 6227 static HObjectAccess ForGlobalObjectNativeContext() { |
6206 return HObjectAccess(kInobject, GlobalObject::kNativeContextOffset); | 6228 return HObjectAccess(kInobject, GlobalObject::kNativeContextOffset); |
6207 } | 6229 } |
6208 | 6230 |
6209 void PrintTo(StringStream* stream) const; | |
6210 | |
6211 inline bool Equals(HObjectAccess that) const { | 6231 inline bool Equals(HObjectAccess that) const { |
6212 return value_ == that.value_; // portion and offset must match | 6232 return value_ == that.value_; // portion and offset must match |
6213 } | 6233 } |
6214 | 6234 |
6215 protected: | 6235 protected: |
6216 void SetGVNFlags(HValue *instr, PropertyAccessType access_type); | 6236 void SetGVNFlags(HValue *instr, PropertyAccessType access_type); |
6217 | 6237 |
6218 private: | 6238 private: |
6219 // internal use only; different parts of an object or array | 6239 // internal use only; different parts of an object or array |
6220 enum Portion { | 6240 enum Portion { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6256 class ImmutableField : public BitField<bool, 7, 1> {}; | 6276 class ImmutableField : public BitField<bool, 7, 1> {}; |
6257 class ExistingInobjectPropertyField : public BitField<bool, 8, 1> {}; | 6277 class ExistingInobjectPropertyField : public BitField<bool, 8, 1> {}; |
6258 class OffsetField : public BitField<int, 9, 23> {}; | 6278 class OffsetField : public BitField<int, 9, 23> {}; |
6259 | 6279 |
6260 uint32_t value_; // encodes portion, representation, immutable, and offset | 6280 uint32_t value_; // encodes portion, representation, immutable, and offset |
6261 Handle<String> name_; | 6281 Handle<String> name_; |
6262 | 6282 |
6263 friend class HLoadNamedField; | 6283 friend class HLoadNamedField; |
6264 friend class HStoreNamedField; | 6284 friend class HStoreNamedField; |
6265 friend class SideEffectsTracker; | 6285 friend class SideEffectsTracker; |
| 6286 friend OStream& operator<<(OStream& os, const HObjectAccess& access); |
6266 | 6287 |
6267 inline Portion portion() const { | 6288 inline Portion portion() const { |
6268 return PortionField::decode(value_); | 6289 return PortionField::decode(value_); |
6269 } | 6290 } |
6270 }; | 6291 }; |
6271 | 6292 |
6272 | 6293 |
| 6294 OStream& operator<<(OStream& os, const HObjectAccess& access); |
| 6295 |
| 6296 |
6273 class HLoadNamedField V8_FINAL : public HTemplateInstruction<2> { | 6297 class HLoadNamedField V8_FINAL : public HTemplateInstruction<2> { |
6274 public: | 6298 public: |
6275 DECLARE_INSTRUCTION_FACTORY_P3(HLoadNamedField, HValue*, | 6299 DECLARE_INSTRUCTION_FACTORY_P3(HLoadNamedField, HValue*, |
6276 HValue*, HObjectAccess); | 6300 HValue*, HObjectAccess); |
6277 DECLARE_INSTRUCTION_FACTORY_P5(HLoadNamedField, HValue*, HValue*, | 6301 DECLARE_INSTRUCTION_FACTORY_P5(HLoadNamedField, HValue*, HValue*, |
6278 HObjectAccess, const UniqueSet<Map>*, HType); | 6302 HObjectAccess, const UniqueSet<Map>*, HType); |
6279 | 6303 |
6280 HValue* object() { return OperandAt(0); } | 6304 HValue* object() const { return OperandAt(0); } |
6281 HValue* dependency() { | 6305 HValue* dependency() const { |
6282 ASSERT(HasDependency()); | 6306 ASSERT(HasDependency()); |
6283 return OperandAt(1); | 6307 return OperandAt(1); |
6284 } | 6308 } |
6285 bool HasDependency() const { return OperandAt(0) != OperandAt(1); } | 6309 bool HasDependency() const { return OperandAt(0) != OperandAt(1); } |
6286 HObjectAccess access() const { return access_; } | 6310 HObjectAccess access() const { return access_; } |
6287 Representation field_representation() const { | 6311 Representation field_representation() const { |
6288 return access_.representation(); | 6312 return access_.representation(); |
6289 } | 6313 } |
6290 | 6314 |
6291 const UniqueSet<Map>* maps() const { return maps_; } | 6315 const UniqueSet<Map>* maps() const { return maps_; } |
6292 | 6316 |
6293 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } | 6317 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } |
6294 virtual bool HasOutOfBoundsAccess(int size) V8_OVERRIDE { | 6318 virtual bool HasOutOfBoundsAccess(int size) V8_OVERRIDE { |
6295 return !access().IsInobject() || access().offset() >= size; | 6319 return !access().IsInobject() || access().offset() >= size; |
6296 } | 6320 } |
6297 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6321 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
6298 if (index == 0 && access().IsExternalMemory()) { | 6322 if (index == 0 && access().IsExternalMemory()) { |
6299 // object must be external in case of external memory access | 6323 // object must be external in case of external memory access |
6300 return Representation::External(); | 6324 return Representation::External(); |
6301 } | 6325 } |
6302 return Representation::Tagged(); | 6326 return Representation::Tagged(); |
6303 } | 6327 } |
6304 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 6328 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; |
6305 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 6329 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
6306 | 6330 |
6307 bool CanBeReplacedWith(HValue* other) const { | 6331 bool CanBeReplacedWith(HValue* other) const { |
6308 if (!CheckFlag(HValue::kCantBeReplaced)) return false; | 6332 if (!CheckFlag(HValue::kCantBeReplaced)) return false; |
6309 if (!type().Equals(other->type())) return false; | 6333 if (!type().Equals(other->type())) return false; |
6310 if (!representation().Equals(other->representation())) return false; | 6334 if (!representation().Equals(other->representation())) return false; |
6311 if (!other->IsLoadNamedField()) return true; | 6335 if (!other->IsLoadNamedField()) return true; |
6312 HLoadNamedField* that = HLoadNamedField::cast(other); | 6336 HLoadNamedField* that = HLoadNamedField::cast(other); |
6313 if (this->maps_ == that->maps_) return true; | 6337 if (this->maps_ == that->maps_) return true; |
6314 if (this->maps_ == NULL || that->maps_ == NULL) return false; | 6338 if (this->maps_ == NULL || that->maps_ == NULL) return false; |
6315 return this->maps_->IsSubset(that->maps_); | 6339 return this->maps_->IsSubset(that->maps_); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6387 HObjectAccess access_; | 6411 HObjectAccess access_; |
6388 const UniqueSet<Map>* maps_; | 6412 const UniqueSet<Map>* maps_; |
6389 }; | 6413 }; |
6390 | 6414 |
6391 | 6415 |
6392 class HLoadNamedGeneric V8_FINAL : public HTemplateInstruction<2> { | 6416 class HLoadNamedGeneric V8_FINAL : public HTemplateInstruction<2> { |
6393 public: | 6417 public: |
6394 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HLoadNamedGeneric, HValue*, | 6418 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HLoadNamedGeneric, HValue*, |
6395 Handle<Object>); | 6419 Handle<Object>); |
6396 | 6420 |
6397 HValue* context() { return OperandAt(0); } | 6421 HValue* context() const { return OperandAt(0); } |
6398 HValue* object() { return OperandAt(1); } | 6422 HValue* object() const { return OperandAt(1); } |
6399 Handle<Object> name() const { return name_; } | 6423 Handle<Object> name() const { return name_; } |
6400 | 6424 |
6401 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6425 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
6402 return Representation::Tagged(); | 6426 return Representation::Tagged(); |
6403 } | 6427 } |
6404 | 6428 |
6405 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 6429 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
6406 | 6430 |
6407 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric) | 6431 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric) |
6408 | 6432 |
6409 private: | 6433 private: |
6410 HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name) | 6434 HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name) |
6411 : name_(name) { | 6435 : name_(name) { |
6412 SetOperandAt(0, context); | 6436 SetOperandAt(0, context); |
6413 SetOperandAt(1, object); | 6437 SetOperandAt(1, object); |
6414 set_representation(Representation::Tagged()); | 6438 set_representation(Representation::Tagged()); |
6415 SetAllSideEffects(); | 6439 SetAllSideEffects(); |
(...skipping 27 matching lines...) Expand all Loading... |
6443 } | 6467 } |
6444 }; | 6468 }; |
6445 | 6469 |
6446 class ArrayInstructionInterface { | 6470 class ArrayInstructionInterface { |
6447 public: | 6471 public: |
6448 virtual HValue* GetKey() = 0; | 6472 virtual HValue* GetKey() = 0; |
6449 virtual void SetKey(HValue* key) = 0; | 6473 virtual void SetKey(HValue* key) = 0; |
6450 virtual ElementsKind elements_kind() const = 0; | 6474 virtual ElementsKind elements_kind() const = 0; |
6451 // TryIncreaseBaseOffset returns false if overflow would result. | 6475 // TryIncreaseBaseOffset returns false if overflow would result. |
6452 virtual bool TryIncreaseBaseOffset(uint32_t increase_by_value) = 0; | 6476 virtual bool TryIncreaseBaseOffset(uint32_t increase_by_value) = 0; |
6453 virtual bool IsDehoisted() = 0; | 6477 virtual bool IsDehoisted() const = 0; |
6454 virtual void SetDehoisted(bool is_dehoisted) = 0; | 6478 virtual void SetDehoisted(bool is_dehoisted) = 0; |
6455 virtual ~ArrayInstructionInterface() { } | 6479 virtual ~ArrayInstructionInterface() { } |
6456 | 6480 |
6457 static Representation KeyedAccessIndexRequirement(Representation r) { | 6481 static Representation KeyedAccessIndexRequirement(Representation r) { |
6458 return r.IsInteger32() || SmiValuesAre32Bits() | 6482 return r.IsInteger32() || SmiValuesAre32Bits() |
6459 ? Representation::Integer32() : Representation::Smi(); | 6483 ? Representation::Integer32() : Representation::Smi(); |
6460 } | 6484 } |
6461 }; | 6485 }; |
6462 | 6486 |
6463 | 6487 |
(...skipping 17 matching lines...) Expand all Loading... |
6481 | 6505 |
6482 bool is_external() const { | 6506 bool is_external() const { |
6483 return IsExternalArrayElementsKind(elements_kind()); | 6507 return IsExternalArrayElementsKind(elements_kind()); |
6484 } | 6508 } |
6485 bool is_fixed_typed_array() const { | 6509 bool is_fixed_typed_array() const { |
6486 return IsFixedTypedArrayElementsKind(elements_kind()); | 6510 return IsFixedTypedArrayElementsKind(elements_kind()); |
6487 } | 6511 } |
6488 bool is_typed_elements() const { | 6512 bool is_typed_elements() const { |
6489 return is_external() || is_fixed_typed_array(); | 6513 return is_external() || is_fixed_typed_array(); |
6490 } | 6514 } |
6491 HValue* elements() { return OperandAt(0); } | 6515 HValue* elements() const { return OperandAt(0); } |
6492 HValue* key() { return OperandAt(1); } | 6516 HValue* key() const { return OperandAt(1); } |
6493 HValue* dependency() { | 6517 HValue* dependency() const { |
6494 ASSERT(HasDependency()); | 6518 ASSERT(HasDependency()); |
6495 return OperandAt(2); | 6519 return OperandAt(2); |
6496 } | 6520 } |
6497 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } | 6521 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } |
6498 uint32_t base_offset() { return BaseOffsetField::decode(bit_field_); } | 6522 uint32_t base_offset() const { return BaseOffsetField::decode(bit_field_); } |
6499 bool TryIncreaseBaseOffset(uint32_t increase_by_value); | 6523 bool TryIncreaseBaseOffset(uint32_t increase_by_value); |
6500 HValue* GetKey() { return key(); } | 6524 HValue* GetKey() { return key(); } |
6501 void SetKey(HValue* key) { SetOperandAt(1, key); } | 6525 void SetKey(HValue* key) { SetOperandAt(1, key); } |
6502 bool IsDehoisted() { return IsDehoistedField::decode(bit_field_); } | 6526 bool IsDehoisted() const { return IsDehoistedField::decode(bit_field_); } |
6503 void SetDehoisted(bool is_dehoisted) { | 6527 void SetDehoisted(bool is_dehoisted) { |
6504 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); | 6528 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); |
6505 } | 6529 } |
6506 virtual ElementsKind elements_kind() const V8_OVERRIDE { | 6530 virtual ElementsKind elements_kind() const V8_OVERRIDE { |
6507 return ElementsKindField::decode(bit_field_); | 6531 return ElementsKindField::decode(bit_field_); |
6508 } | 6532 } |
6509 LoadKeyedHoleMode hole_mode() const { | 6533 LoadKeyedHoleMode hole_mode() const { |
6510 return HoleModeField::decode(bit_field_); | 6534 return HoleModeField::decode(bit_field_); |
6511 } | 6535 } |
6512 | 6536 |
(...skipping 10 matching lines...) Expand all Loading... |
6523 return ArrayInstructionInterface::KeyedAccessIndexRequirement( | 6547 return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
6524 OperandAt(1)->representation()); | 6548 OperandAt(1)->representation()); |
6525 } | 6549 } |
6526 return Representation::None(); | 6550 return Representation::None(); |
6527 } | 6551 } |
6528 | 6552 |
6529 virtual Representation observed_input_representation(int index) V8_OVERRIDE { | 6553 virtual Representation observed_input_representation(int index) V8_OVERRIDE { |
6530 return RequiredInputRepresentation(index); | 6554 return RequiredInputRepresentation(index); |
6531 } | 6555 } |
6532 | 6556 |
6533 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 6557 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
6534 | 6558 |
6535 bool UsesMustHandleHole() const; | 6559 bool UsesMustHandleHole() const; |
6536 bool AllUsesCanTreatHoleAsNaN() const; | 6560 bool AllUsesCanTreatHoleAsNaN() const; |
6537 bool RequiresHoleCheck() const; | 6561 bool RequiresHoleCheck() const; |
6538 | 6562 |
6539 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 6563 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; |
6540 | 6564 |
6541 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed) | 6565 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed) |
6542 | 6566 |
6543 protected: | 6567 protected: |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6651 public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted> | 6675 public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted> |
6652 {}; // NOLINT | 6676 {}; // NOLINT |
6653 uint32_t bit_field_; | 6677 uint32_t bit_field_; |
6654 }; | 6678 }; |
6655 | 6679 |
6656 | 6680 |
6657 class HLoadKeyedGeneric V8_FINAL : public HTemplateInstruction<3> { | 6681 class HLoadKeyedGeneric V8_FINAL : public HTemplateInstruction<3> { |
6658 public: | 6682 public: |
6659 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HLoadKeyedGeneric, HValue*, | 6683 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HLoadKeyedGeneric, HValue*, |
6660 HValue*); | 6684 HValue*); |
6661 HValue* object() { return OperandAt(0); } | 6685 HValue* object() const { return OperandAt(0); } |
6662 HValue* key() { return OperandAt(1); } | 6686 HValue* key() const { return OperandAt(1); } |
6663 HValue* context() { return OperandAt(2); } | 6687 HValue* context() const { return OperandAt(2); } |
6664 | 6688 |
6665 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 6689 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
6666 | 6690 |
6667 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6691 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
6668 // tagged[tagged] | 6692 // tagged[tagged] |
6669 return Representation::Tagged(); | 6693 return Representation::Tagged(); |
6670 } | 6694 } |
6671 | 6695 |
6672 virtual HValue* Canonicalize() V8_OVERRIDE; | 6696 virtual HValue* Canonicalize() V8_OVERRIDE; |
6673 | 6697 |
6674 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) | 6698 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) |
6675 | 6699 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6734 } | 6758 } |
6735 return Representation::Tagged(); | 6759 return Representation::Tagged(); |
6736 } | 6760 } |
6737 virtual bool HandleSideEffectDominator(GVNFlag side_effect, | 6761 virtual bool HandleSideEffectDominator(GVNFlag side_effect, |
6738 HValue* dominator) V8_OVERRIDE { | 6762 HValue* dominator) V8_OVERRIDE { |
6739 ASSERT(side_effect == kNewSpacePromotion); | 6763 ASSERT(side_effect == kNewSpacePromotion); |
6740 if (!FLAG_use_write_barrier_elimination) return false; | 6764 if (!FLAG_use_write_barrier_elimination) return false; |
6741 dominator_ = dominator; | 6765 dominator_ = dominator; |
6742 return false; | 6766 return false; |
6743 } | 6767 } |
6744 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 6768 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
6745 | 6769 |
6746 HValue* object() const { return OperandAt(0); } | 6770 HValue* object() const { return OperandAt(0); } |
6747 HValue* value() const { return OperandAt(1); } | 6771 HValue* value() const { return OperandAt(1); } |
6748 HValue* transition() const { return OperandAt(2); } | 6772 HValue* transition() const { return OperandAt(2); } |
6749 | 6773 |
6750 HObjectAccess access() const { return access_; } | 6774 HObjectAccess access() const { return access_; } |
6751 HValue* dominator() const { return dominator_; } | 6775 HValue* dominator() const { return dominator_; } |
6752 bool has_transition() const { return has_transition_; } | 6776 bool has_transition() const { return has_transition_; } |
6753 StoreFieldOrKeyedMode store_mode() const { return store_mode_; } | 6777 StoreFieldOrKeyedMode store_mode() const { return store_mode_; } |
6754 | 6778 |
6755 Handle<Map> transition_map() const { | 6779 Handle<Map> transition_map() const { |
6756 if (has_transition()) { | 6780 if (has_transition()) { |
6757 return Handle<Map>::cast( | 6781 return Handle<Map>::cast( |
6758 HConstant::cast(transition())->handle(Isolate::Current())); | 6782 HConstant::cast(transition())->handle(Isolate::Current())); |
6759 } else { | 6783 } else { |
6760 return Handle<Map>(); | 6784 return Handle<Map>(); |
6761 } | 6785 } |
6762 } | 6786 } |
6763 | 6787 |
6764 void SetTransition(HConstant* transition) { | 6788 void SetTransition(HConstant* transition) { |
6765 ASSERT(!has_transition()); // Only set once. | 6789 ASSERT(!has_transition()); // Only set once. |
6766 SetOperandAt(2, transition); | 6790 SetOperandAt(2, transition); |
6767 has_transition_ = true; | 6791 has_transition_ = true; |
6768 SetChangesFlag(kMaps); | 6792 SetChangesFlag(kMaps); |
6769 } | 6793 } |
6770 | 6794 |
6771 bool NeedsWriteBarrier() { | 6795 bool NeedsWriteBarrier() const { |
6772 ASSERT(!field_representation().IsDouble() || !has_transition()); | 6796 ASSERT(!field_representation().IsDouble() || !has_transition()); |
6773 if (field_representation().IsDouble()) return false; | 6797 if (field_representation().IsDouble()) return false; |
6774 if (field_representation().IsSmi()) return false; | 6798 if (field_representation().IsSmi()) return false; |
6775 if (field_representation().IsInteger32()) return false; | 6799 if (field_representation().IsInteger32()) return false; |
6776 if (field_representation().IsExternal()) return false; | 6800 if (field_representation().IsExternal()) return false; |
6777 return StoringValueNeedsWriteBarrier(value()) && | 6801 return StoringValueNeedsWriteBarrier(value()) && |
6778 ReceiverObjectNeedsWriteBarrier(object(), value(), dominator()); | 6802 ReceiverObjectNeedsWriteBarrier(object(), value(), dominator()); |
6779 } | 6803 } |
6780 | 6804 |
6781 bool NeedsWriteBarrierForMap() { | 6805 bool NeedsWriteBarrierForMap() { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6838 bool has_transition_ : 1; | 6862 bool has_transition_ : 1; |
6839 StoreFieldOrKeyedMode store_mode_ : 1; | 6863 StoreFieldOrKeyedMode store_mode_ : 1; |
6840 }; | 6864 }; |
6841 | 6865 |
6842 | 6866 |
6843 class HStoreNamedGeneric V8_FINAL : public HTemplateInstruction<3> { | 6867 class HStoreNamedGeneric V8_FINAL : public HTemplateInstruction<3> { |
6844 public: | 6868 public: |
6845 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreNamedGeneric, HValue*, | 6869 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreNamedGeneric, HValue*, |
6846 Handle<String>, HValue*, | 6870 Handle<String>, HValue*, |
6847 StrictMode); | 6871 StrictMode); |
6848 HValue* object() { return OperandAt(0); } | 6872 HValue* object() const { return OperandAt(0); } |
6849 HValue* value() { return OperandAt(1); } | 6873 HValue* value() const { return OperandAt(1); } |
6850 HValue* context() { return OperandAt(2); } | 6874 HValue* context() const { return OperandAt(2); } |
6851 Handle<String> name() { return name_; } | 6875 Handle<String> name() const { return name_; } |
6852 StrictMode strict_mode() { return strict_mode_; } | 6876 StrictMode strict_mode() const { return strict_mode_; } |
6853 | 6877 |
6854 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 6878 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
6855 | 6879 |
6856 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6880 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
6857 return Representation::Tagged(); | 6881 return Representation::Tagged(); |
6858 } | 6882 } |
6859 | 6883 |
6860 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) | 6884 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) |
6861 | 6885 |
6862 private: | 6886 private: |
6863 HStoreNamedGeneric(HValue* context, | 6887 HStoreNamedGeneric(HValue* context, |
6864 HValue* object, | 6888 HValue* object, |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6952 } | 6976 } |
6953 | 6977 |
6954 HValue* elements() const { return OperandAt(0); } | 6978 HValue* elements() const { return OperandAt(0); } |
6955 HValue* key() const { return OperandAt(1); } | 6979 HValue* key() const { return OperandAt(1); } |
6956 HValue* value() const { return OperandAt(2); } | 6980 HValue* value() const { return OperandAt(2); } |
6957 bool value_is_smi() const { | 6981 bool value_is_smi() const { |
6958 return IsFastSmiElementsKind(elements_kind_); | 6982 return IsFastSmiElementsKind(elements_kind_); |
6959 } | 6983 } |
6960 StoreFieldOrKeyedMode store_mode() const { return store_mode_; } | 6984 StoreFieldOrKeyedMode store_mode() const { return store_mode_; } |
6961 ElementsKind elements_kind() const { return elements_kind_; } | 6985 ElementsKind elements_kind() const { return elements_kind_; } |
6962 uint32_t base_offset() { return base_offset_; } | 6986 uint32_t base_offset() const { return base_offset_; } |
6963 bool TryIncreaseBaseOffset(uint32_t increase_by_value); | 6987 bool TryIncreaseBaseOffset(uint32_t increase_by_value); |
6964 HValue* GetKey() { return key(); } | 6988 HValue* GetKey() { return key(); } |
6965 void SetKey(HValue* key) { SetOperandAt(1, key); } | 6989 void SetKey(HValue* key) { SetOperandAt(1, key); } |
6966 bool IsDehoisted() { return is_dehoisted_; } | 6990 bool IsDehoisted() const { return is_dehoisted_; } |
6967 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } | 6991 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
6968 bool IsUninitialized() { return is_uninitialized_; } | 6992 bool IsUninitialized() { return is_uninitialized_; } |
6969 void SetUninitialized(bool is_uninitialized) { | 6993 void SetUninitialized(bool is_uninitialized) { |
6970 is_uninitialized_ = is_uninitialized; | 6994 is_uninitialized_ = is_uninitialized; |
6971 } | 6995 } |
6972 | 6996 |
6973 bool IsConstantHoleStore() { | 6997 bool IsConstantHoleStore() { |
6974 return value()->IsConstant() && HConstant::cast(value())->IsTheHole(); | 6998 return value()->IsConstant() && HConstant::cast(value())->IsTheHole(); |
6975 } | 6999 } |
6976 | 7000 |
(...skipping 14 matching lines...) Expand all Loading... |
6991 ReceiverObjectNeedsWriteBarrier(elements(), value(), dominator()); | 7015 ReceiverObjectNeedsWriteBarrier(elements(), value(), dominator()); |
6992 } | 7016 } |
6993 } | 7017 } |
6994 | 7018 |
6995 PointersToHereCheck PointersToHereCheckForValue() const { | 7019 PointersToHereCheck PointersToHereCheckForValue() const { |
6996 return PointersToHereCheckForObject(value(), dominator()); | 7020 return PointersToHereCheckForObject(value(), dominator()); |
6997 } | 7021 } |
6998 | 7022 |
6999 bool NeedsCanonicalization(); | 7023 bool NeedsCanonicalization(); |
7000 | 7024 |
7001 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 7025 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
7002 | 7026 |
7003 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) | 7027 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) |
7004 | 7028 |
7005 private: | 7029 private: |
7006 HStoreKeyed(HValue* obj, HValue* key, HValue* val, | 7030 HStoreKeyed(HValue* obj, HValue* key, HValue* val, |
7007 ElementsKind elements_kind, | 7031 ElementsKind elements_kind, |
7008 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE, | 7032 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE, |
7009 int offset = kDefaultKeyedHeaderOffsetSentinel) | 7033 int offset = kDefaultKeyedHeaderOffsetSentinel) |
7010 : elements_kind_(elements_kind), | 7034 : elements_kind_(elements_kind), |
7011 base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel | 7035 base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7056 StoreFieldOrKeyedMode store_mode_: 1; | 7080 StoreFieldOrKeyedMode store_mode_: 1; |
7057 HValue* dominator_; | 7081 HValue* dominator_; |
7058 }; | 7082 }; |
7059 | 7083 |
7060 | 7084 |
7061 class HStoreKeyedGeneric V8_FINAL : public HTemplateInstruction<4> { | 7085 class HStoreKeyedGeneric V8_FINAL : public HTemplateInstruction<4> { |
7062 public: | 7086 public: |
7063 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*, | 7087 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*, |
7064 HValue*, HValue*, StrictMode); | 7088 HValue*, HValue*, StrictMode); |
7065 | 7089 |
7066 HValue* object() { return OperandAt(0); } | 7090 HValue* object() const { return OperandAt(0); } |
7067 HValue* key() { return OperandAt(1); } | 7091 HValue* key() const { return OperandAt(1); } |
7068 HValue* value() { return OperandAt(2); } | 7092 HValue* value() const { return OperandAt(2); } |
7069 HValue* context() { return OperandAt(3); } | 7093 HValue* context() const { return OperandAt(3); } |
7070 StrictMode strict_mode() { return strict_mode_; } | 7094 StrictMode strict_mode() const { return strict_mode_; } |
7071 | 7095 |
7072 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7096 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
7073 // tagged[tagged] = tagged | 7097 // tagged[tagged] = tagged |
7074 return Representation::Tagged(); | 7098 return Representation::Tagged(); |
7075 } | 7099 } |
7076 | 7100 |
7077 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 7101 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
7078 | 7102 |
7079 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) | 7103 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) |
7080 | 7104 |
7081 private: | 7105 private: |
7082 HStoreKeyedGeneric(HValue* context, | 7106 HStoreKeyedGeneric(HValue* context, |
7083 HValue* object, | 7107 HValue* object, |
7084 HValue* key, | 7108 HValue* key, |
7085 HValue* value, | 7109 HValue* value, |
7086 StrictMode strict_mode) | 7110 StrictMode strict_mode) |
7087 : strict_mode_(strict_mode) { | 7111 : strict_mode_(strict_mode) { |
(...skipping 16 matching lines...) Expand all Loading... |
7104 Handle<Map> original_map, | 7128 Handle<Map> original_map, |
7105 Handle<Map> transitioned_map) { | 7129 Handle<Map> transitioned_map) { |
7106 return new(zone) HTransitionElementsKind(context, object, | 7130 return new(zone) HTransitionElementsKind(context, object, |
7107 original_map, transitioned_map); | 7131 original_map, transitioned_map); |
7108 } | 7132 } |
7109 | 7133 |
7110 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7134 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
7111 return Representation::Tagged(); | 7135 return Representation::Tagged(); |
7112 } | 7136 } |
7113 | 7137 |
7114 HValue* object() { return OperandAt(0); } | 7138 HValue* object() const { return OperandAt(0); } |
7115 HValue* context() { return OperandAt(1); } | 7139 HValue* context() const { return OperandAt(1); } |
7116 Unique<Map> original_map() { return original_map_; } | 7140 Unique<Map> original_map() const { return original_map_; } |
7117 Unique<Map> transitioned_map() { return transitioned_map_; } | 7141 Unique<Map> transitioned_map() const { return transitioned_map_; } |
7118 ElementsKind from_kind() { return from_kind_; } | 7142 ElementsKind from_kind() const { return from_kind_; } |
7119 ElementsKind to_kind() { return to_kind_; } | 7143 ElementsKind to_kind() const { return to_kind_; } |
7120 | 7144 |
7121 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 7145 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
7122 | 7146 |
7123 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) | 7147 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) |
7124 | 7148 |
7125 protected: | 7149 protected: |
7126 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 7150 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
7127 HTransitionElementsKind* instr = HTransitionElementsKind::cast(other); | 7151 HTransitionElementsKind* instr = HTransitionElementsKind::cast(other); |
7128 return original_map_ == instr->original_map_ && | 7152 return original_map_ == instr->original_map_ && |
7129 transitioned_map_ == instr->transitioned_map_; | 7153 transitioned_map_ == instr->transitioned_map_; |
7130 } | 7154 } |
7131 | 7155 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7169 Handle<AllocationSite> allocation_site = | 7193 Handle<AllocationSite> allocation_site = |
7170 Handle<AllocationSite>::null()); | 7194 Handle<AllocationSite>::null()); |
7171 | 7195 |
7172 StringAddFlags flags() const { return flags_; } | 7196 StringAddFlags flags() const { return flags_; } |
7173 PretenureFlag pretenure_flag() const { return pretenure_flag_; } | 7197 PretenureFlag pretenure_flag() const { return pretenure_flag_; } |
7174 | 7198 |
7175 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7199 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
7176 return Representation::Tagged(); | 7200 return Representation::Tagged(); |
7177 } | 7201 } |
7178 | 7202 |
7179 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 7203 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
7180 | 7204 |
7181 DECLARE_CONCRETE_INSTRUCTION(StringAdd) | 7205 DECLARE_CONCRETE_INSTRUCTION(StringAdd) |
7182 | 7206 |
7183 protected: | 7207 protected: |
7184 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 7208 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
7185 return flags_ == HStringAdd::cast(other)->flags_ && | 7209 return flags_ == HStringAdd::cast(other)->flags_ && |
7186 pretenure_flag_ == HStringAdd::cast(other)->pretenure_flag_; | 7210 pretenure_flag_ == HStringAdd::cast(other)->pretenure_flag_; |
7187 } | 7211 } |
7188 | 7212 |
7189 private: | 7213 private: |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7404 bool has_no_literals_ : 1; | 7428 bool has_no_literals_ : 1; |
7405 bool is_generator_ : 1; | 7429 bool is_generator_ : 1; |
7406 StrictMode strict_mode_; | 7430 StrictMode strict_mode_; |
7407 }; | 7431 }; |
7408 | 7432 |
7409 | 7433 |
7410 class HTypeof V8_FINAL : public HTemplateInstruction<2> { | 7434 class HTypeof V8_FINAL : public HTemplateInstruction<2> { |
7411 public: | 7435 public: |
7412 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HTypeof, HValue*); | 7436 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HTypeof, HValue*); |
7413 | 7437 |
7414 HValue* context() { return OperandAt(0); } | 7438 HValue* context() const { return OperandAt(0); } |
7415 HValue* value() { return OperandAt(1); } | 7439 HValue* value() const { return OperandAt(1); } |
7416 | 7440 |
7417 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 7441 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
7418 | 7442 |
7419 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7443 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
7420 return Representation::Tagged(); | 7444 return Representation::Tagged(); |
7421 } | 7445 } |
7422 | 7446 |
7423 DECLARE_CONCRETE_INSTRUCTION(Typeof) | 7447 DECLARE_CONCRETE_INSTRUCTION(Typeof) |
7424 | 7448 |
7425 private: | 7449 private: |
7426 explicit HTypeof(HValue* context, HValue* value) { | 7450 explicit HTypeof(HValue* context, HValue* value) { |
7427 SetOperandAt(0, context); | 7451 SetOperandAt(0, context); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7591 | 7615 |
7592 | 7616 |
7593 class HCheckMapValue V8_FINAL : public HTemplateInstruction<2> { | 7617 class HCheckMapValue V8_FINAL : public HTemplateInstruction<2> { |
7594 public: | 7618 public: |
7595 DECLARE_INSTRUCTION_FACTORY_P2(HCheckMapValue, HValue*, HValue*); | 7619 DECLARE_INSTRUCTION_FACTORY_P2(HCheckMapValue, HValue*, HValue*); |
7596 | 7620 |
7597 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7621 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
7598 return Representation::Tagged(); | 7622 return Representation::Tagged(); |
7599 } | 7623 } |
7600 | 7624 |
7601 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 7625 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
7602 | 7626 |
7603 virtual HType CalculateInferredType() V8_OVERRIDE { | 7627 virtual HType CalculateInferredType() V8_OVERRIDE { |
7604 if (value()->type().IsHeapObject()) return value()->type(); | 7628 if (value()->type().IsHeapObject()) return value()->type(); |
7605 return HType::HeapObject(); | 7629 return HType::HeapObject(); |
7606 } | 7630 } |
7607 | 7631 |
7608 HValue* value() const { return OperandAt(0); } | 7632 HValue* value() const { return OperandAt(0); } |
7609 HValue* map() const { return OperandAt(1); } | 7633 HValue* map() const { return OperandAt(1); } |
7610 | 7634 |
7611 virtual HValue* Canonicalize() V8_OVERRIDE; | 7635 virtual HValue* Canonicalize() V8_OVERRIDE; |
(...skipping 21 matching lines...) Expand all Loading... |
7633 | 7657 |
7634 | 7658 |
7635 class HForInPrepareMap V8_FINAL : public HTemplateInstruction<2> { | 7659 class HForInPrepareMap V8_FINAL : public HTemplateInstruction<2> { |
7636 public: | 7660 public: |
7637 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HForInPrepareMap, HValue*); | 7661 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HForInPrepareMap, HValue*); |
7638 | 7662 |
7639 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7663 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
7640 return Representation::Tagged(); | 7664 return Representation::Tagged(); |
7641 } | 7665 } |
7642 | 7666 |
7643 HValue* context() { return OperandAt(0); } | 7667 HValue* context() const { return OperandAt(0); } |
7644 HValue* enumerable() { return OperandAt(1); } | 7668 HValue* enumerable() const { return OperandAt(1); } |
7645 | 7669 |
7646 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 7670 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
7647 | 7671 |
7648 virtual HType CalculateInferredType() V8_OVERRIDE { | 7672 virtual HType CalculateInferredType() V8_OVERRIDE { |
7649 return HType::Tagged(); | 7673 return HType::Tagged(); |
7650 } | 7674 } |
7651 | 7675 |
7652 DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap); | 7676 DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap); |
7653 | 7677 |
7654 private: | 7678 private: |
7655 HForInPrepareMap(HValue* context, | 7679 HForInPrepareMap(HValue* context, |
7656 HValue* object) { | 7680 HValue* object) { |
7657 SetOperandAt(0, context); | 7681 SetOperandAt(0, context); |
7658 SetOperandAt(1, object); | 7682 SetOperandAt(1, object); |
7659 set_representation(Representation::Tagged()); | 7683 set_representation(Representation::Tagged()); |
7660 SetAllSideEffects(); | 7684 SetAllSideEffects(); |
7661 } | 7685 } |
7662 }; | 7686 }; |
7663 | 7687 |
7664 | 7688 |
7665 class HForInCacheArray V8_FINAL : public HTemplateInstruction<2> { | 7689 class HForInCacheArray V8_FINAL : public HTemplateInstruction<2> { |
7666 public: | 7690 public: |
7667 DECLARE_INSTRUCTION_FACTORY_P3(HForInCacheArray, HValue*, HValue*, int); | 7691 DECLARE_INSTRUCTION_FACTORY_P3(HForInCacheArray, HValue*, HValue*, int); |
7668 | 7692 |
7669 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7693 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
7670 return Representation::Tagged(); | 7694 return Representation::Tagged(); |
7671 } | 7695 } |
7672 | 7696 |
7673 HValue* enumerable() { return OperandAt(0); } | 7697 HValue* enumerable() const { return OperandAt(0); } |
7674 HValue* map() { return OperandAt(1); } | 7698 HValue* map() const { return OperandAt(1); } |
7675 int idx() { return idx_; } | 7699 int idx() const { return idx_; } |
7676 | 7700 |
7677 HForInCacheArray* index_cache() { | 7701 HForInCacheArray* index_cache() { |
7678 return index_cache_; | 7702 return index_cache_; |
7679 } | 7703 } |
7680 | 7704 |
7681 void set_index_cache(HForInCacheArray* index_cache) { | 7705 void set_index_cache(HForInCacheArray* index_cache) { |
7682 index_cache_ = index_cache; | 7706 index_cache_ = index_cache; |
7683 } | 7707 } |
7684 | 7708 |
7685 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 7709 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
7686 | 7710 |
7687 virtual HType CalculateInferredType() V8_OVERRIDE { | 7711 virtual HType CalculateInferredType() V8_OVERRIDE { |
7688 return HType::Tagged(); | 7712 return HType::Tagged(); |
7689 } | 7713 } |
7690 | 7714 |
7691 DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray); | 7715 DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray); |
7692 | 7716 |
7693 private: | 7717 private: |
7694 HForInCacheArray(HValue* enumerable, | 7718 HForInCacheArray(HValue* enumerable, |
7695 HValue* keys, | 7719 HValue* keys, |
(...skipping 21 matching lines...) Expand all Loading... |
7717 } | 7741 } |
7718 | 7742 |
7719 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7743 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
7720 if (index == 1) { | 7744 if (index == 1) { |
7721 return Representation::Smi(); | 7745 return Representation::Smi(); |
7722 } else { | 7746 } else { |
7723 return Representation::Tagged(); | 7747 return Representation::Tagged(); |
7724 } | 7748 } |
7725 } | 7749 } |
7726 | 7750 |
7727 HValue* object() { return OperandAt(0); } | 7751 HValue* object() const { return OperandAt(0); } |
7728 HValue* index() { return OperandAt(1); } | 7752 HValue* index() const { return OperandAt(1); } |
7729 | 7753 |
7730 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 7754 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT |
7731 | 7755 |
7732 virtual HType CalculateInferredType() V8_OVERRIDE { | 7756 virtual HType CalculateInferredType() V8_OVERRIDE { |
7733 return HType::Tagged(); | 7757 return HType::Tagged(); |
7734 } | 7758 } |
7735 | 7759 |
7736 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); | 7760 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); |
7737 | 7761 |
7738 private: | 7762 private: |
7739 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7763 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
7740 }; | 7764 }; |
(...skipping 16 matching lines...) Expand all Loading... |
7757 set_representation(Representation::Tagged()); | 7781 set_representation(Representation::Tagged()); |
7758 SetChangesFlag(kContextSlots); | 7782 SetChangesFlag(kContextSlots); |
7759 } | 7783 } |
7760 }; | 7784 }; |
7761 | 7785 |
7762 | 7786 |
7763 class HAllocateBlockContext: public HTemplateInstruction<2> { | 7787 class HAllocateBlockContext: public HTemplateInstruction<2> { |
7764 public: | 7788 public: |
7765 DECLARE_INSTRUCTION_FACTORY_P3(HAllocateBlockContext, HValue*, | 7789 DECLARE_INSTRUCTION_FACTORY_P3(HAllocateBlockContext, HValue*, |
7766 HValue*, Handle<ScopeInfo>); | 7790 HValue*, Handle<ScopeInfo>); |
7767 HValue* context() { return OperandAt(0); } | 7791 HValue* context() const { return OperandAt(0); } |
7768 HValue* function() { return OperandAt(1); } | 7792 HValue* function() const { return OperandAt(1); } |
7769 Handle<ScopeInfo> scope_info() { return scope_info_; } | 7793 Handle<ScopeInfo> scope_info() const { return scope_info_; } |
7770 | 7794 |
7771 virtual Representation RequiredInputRepresentation(int index) { | 7795 virtual Representation RequiredInputRepresentation(int index) { |
7772 return Representation::Tagged(); | 7796 return Representation::Tagged(); |
7773 } | 7797 } |
7774 | 7798 |
7775 virtual void PrintDataTo(StringStream* stream); | 7799 virtual OStream& PrintDataTo(OStream& os) const; // NOLINT |
7776 | 7800 |
7777 DECLARE_CONCRETE_INSTRUCTION(AllocateBlockContext) | 7801 DECLARE_CONCRETE_INSTRUCTION(AllocateBlockContext) |
7778 | 7802 |
7779 private: | 7803 private: |
7780 HAllocateBlockContext(HValue* context, | 7804 HAllocateBlockContext(HValue* context, |
7781 HValue* function, | 7805 HValue* function, |
7782 Handle<ScopeInfo> scope_info) | 7806 Handle<ScopeInfo> scope_info) |
7783 : scope_info_(scope_info) { | 7807 : scope_info_(scope_info) { |
7784 SetOperandAt(0, context); | 7808 SetOperandAt(0, context); |
7785 SetOperandAt(1, function); | 7809 SetOperandAt(1, function); |
7786 set_representation(Representation::Tagged()); | 7810 set_representation(Representation::Tagged()); |
7787 } | 7811 } |
7788 | 7812 |
7789 Handle<ScopeInfo> scope_info_; | 7813 Handle<ScopeInfo> scope_info_; |
7790 }; | 7814 }; |
7791 | 7815 |
7792 | 7816 |
7793 | 7817 |
7794 #undef DECLARE_INSTRUCTION | 7818 #undef DECLARE_INSTRUCTION |
7795 #undef DECLARE_CONCRETE_INSTRUCTION | 7819 #undef DECLARE_CONCRETE_INSTRUCTION |
7796 | 7820 |
7797 } } // namespace v8::internal | 7821 } } // namespace v8::internal |
7798 | 7822 |
7799 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 7823 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |