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

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

Issue 23143007: Revert "Use V8_FINAL and V8_OVERRIDE in various places, fixing bugs revealed by them." (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/hydrogen.cc ('k') | src/ia32/lithium-codegen-ia32.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 V(DoubleArrayElements) \ 203 V(DoubleArrayElements) \
204 V(DoubleFields) \ 204 V(DoubleFields) \
205 V(ElementsKind) \ 205 V(ElementsKind) \
206 V(ElementsPointer) \ 206 V(ElementsPointer) \
207 V(GlobalVars) \ 207 V(GlobalVars) \
208 V(InobjectFields) \ 208 V(InobjectFields) \
209 V(OsrEntries) \ 209 V(OsrEntries) \
210 V(ExternalMemory) 210 V(ExternalMemory)
211 211
212 212
213 #define DECLARE_ABSTRACT_INSTRUCTION(type) \ 213 #define DECLARE_ABSTRACT_INSTRUCTION(type) \
214 virtual bool Is##type() const V8_FINAL V8_OVERRIDE { return true; } \ 214 virtual bool Is##type() const { return true; } \
215 static H##type* cast(HValue* value) { \ 215 static H##type* cast(HValue* value) { \
216 ASSERT(value->Is##type()); \ 216 ASSERT(value->Is##type()); \
217 return reinterpret_cast<H##type*>(value); \ 217 return reinterpret_cast<H##type*>(value); \
218 } 218 }
219 219
220 220
221 #define DECLARE_CONCRETE_INSTRUCTION(type) \ 221 #define DECLARE_CONCRETE_INSTRUCTION(type) \
222 virtual LInstruction* CompileToLithium( \ 222 virtual LInstruction* CompileToLithium(LChunkBuilder* builder); \
223 LChunkBuilder* builder) V8_FINAL V8_OVERRIDE; \ 223 static H##type* cast(HValue* value) { \
224 static H##type* cast(HValue* value) { \ 224 ASSERT(value->Is##type()); \
225 ASSERT(value->Is##type()); \ 225 return reinterpret_cast<H##type*>(value); \
226 return reinterpret_cast<H##type*>(value); \ 226 } \
227 } \ 227 virtual Opcode opcode() const { return HValue::k##type; }
228 virtual Opcode opcode() const V8_FINAL V8_OVERRIDE { \
229 return HValue::k##type; \
230 }
231 228
232 229
233 class Range V8_FINAL : public ZoneObject { 230 class Range: public ZoneObject {
234 public: 231 public:
235 Range() 232 Range()
236 : lower_(kMinInt), 233 : lower_(kMinInt),
237 upper_(kMaxInt), 234 upper_(kMaxInt),
238 next_(NULL), 235 next_(NULL),
239 can_be_minus_zero_(false) { } 236 can_be_minus_zero_(false) { }
240 237
241 Range(int32_t lower, int32_t upper) 238 Range(int32_t lower, int32_t upper)
242 : lower_(lower), 239 : lower_(lower),
243 upper_(upper), 240 upper_(upper),
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 bool MulAndCheckOverflow(const Representation& r, Range* other); 295 bool MulAndCheckOverflow(const Representation& r, Range* other);
299 296
300 private: 297 private:
301 int32_t lower_; 298 int32_t lower_;
302 int32_t upper_; 299 int32_t upper_;
303 Range* next_; 300 Range* next_;
304 bool can_be_minus_zero_; 301 bool can_be_minus_zero_;
305 }; 302 };
306 303
307 304
308 class UniqueValueId V8_FINAL { 305 class UniqueValueId {
309 public: 306 public:
310 UniqueValueId() : raw_address_(NULL) { } 307 UniqueValueId() : raw_address_(NULL) { }
311 308
312 explicit UniqueValueId(Object* object) { 309 explicit UniqueValueId(Object* object) {
313 raw_address_ = reinterpret_cast<Address>(object); 310 raw_address_ = reinterpret_cast<Address>(object);
314 ASSERT(IsInitialized()); 311 ASSERT(IsInitialized());
315 } 312 }
316 313
317 explicit UniqueValueId(Handle<Object> handle) { 314 explicit UniqueValueId(Handle<Object> handle) {
318 static const Address kEmptyHandleSentinel = reinterpret_cast<Address>(1); 315 static const Address kEmptyHandleSentinel = reinterpret_cast<Address>(1);
(...skipping 21 matching lines...) Expand all
340 intptr_t Hashcode() const { 337 intptr_t Hashcode() const {
341 ASSERT(IsInitialized()); 338 ASSERT(IsInitialized());
342 return reinterpret_cast<intptr_t>(raw_address_); 339 return reinterpret_cast<intptr_t>(raw_address_);
343 } 340 }
344 341
345 private: 342 private:
346 Address raw_address_; 343 Address raw_address_;
347 }; 344 };
348 345
349 346
350 class HType V8_FINAL { 347 class HType {
351 public: 348 public:
352 static HType None() { return HType(kNone); } 349 static HType None() { return HType(kNone); }
353 static HType Tagged() { return HType(kTagged); } 350 static HType Tagged() { return HType(kTagged); }
354 static HType TaggedPrimitive() { return HType(kTaggedPrimitive); } 351 static HType TaggedPrimitive() { return HType(kTaggedPrimitive); }
355 static HType TaggedNumber() { return HType(kTaggedNumber); } 352 static HType TaggedNumber() { return HType(kTaggedNumber); }
356 static HType Smi() { return HType(kSmi); } 353 static HType Smi() { return HType(kSmi); }
357 static HType HeapNumber() { return HType(kHeapNumber); } 354 static HType HeapNumber() { return HType(kHeapNumber); }
358 static HType String() { return HType(kString); } 355 static HType String() { return HType(kString); }
359 static HType Boolean() { return HType(kBoolean); } 356 static HType Boolean() { return HType(kBoolean); }
360 static HType NonPrimitive() { return HType(kNonPrimitive); } 357 static HType NonPrimitive() { return HType(kNonPrimitive); }
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 488
492 private: 489 private:
493 HUseListNode* tail_; 490 HUseListNode* tail_;
494 HValue* value_; 491 HValue* value_;
495 int index_; 492 int index_;
496 }; 493 };
497 494
498 495
499 // We reuse use list nodes behind the scenes as uses are added and deleted. 496 // We reuse use list nodes behind the scenes as uses are added and deleted.
500 // This class is the safe way to iterate uses while deleting them. 497 // This class is the safe way to iterate uses while deleting them.
501 class HUseIterator V8_FINAL BASE_EMBEDDED { 498 class HUseIterator BASE_EMBEDDED {
502 public: 499 public:
503 bool Done() { return current_ == NULL; } 500 bool Done() { return current_ == NULL; }
504 void Advance(); 501 void Advance();
505 502
506 HValue* value() { 503 HValue* value() {
507 ASSERT(!Done()); 504 ASSERT(!Done());
508 return value_; 505 return value_;
509 } 506 }
510 507
511 int index() { 508 int index() {
(...skipping 23 matching lines...) Expand all
535 GVN_UNTRACKED_FLAG_LIST(DECLARE_FLAG) 532 GVN_UNTRACKED_FLAG_LIST(DECLARE_FLAG)
536 #undef DECLARE_FLAG 533 #undef DECLARE_FLAG
537 kAfterLastFlag, 534 kAfterLastFlag,
538 kLastFlag = kAfterLastFlag - 1, 535 kLastFlag = kAfterLastFlag - 1,
539 #define COUNT_FLAG(type) + 1 536 #define COUNT_FLAG(type) + 1
540 kNumberOfTrackedSideEffects = 0 GVN_TRACKED_FLAG_LIST(COUNT_FLAG) 537 kNumberOfTrackedSideEffects = 0 GVN_TRACKED_FLAG_LIST(COUNT_FLAG)
541 #undef COUNT_FLAG 538 #undef COUNT_FLAG
542 }; 539 };
543 540
544 541
545 class DecompositionResult V8_FINAL BASE_EMBEDDED { 542 class DecompositionResult BASE_EMBEDDED {
546 public: 543 public:
547 DecompositionResult() : base_(NULL), offset_(0), scale_(0) {} 544 DecompositionResult() : base_(NULL), offset_(0), scale_(0) {}
548 545
549 HValue* base() { return base_; } 546 HValue* base() { return base_; }
550 int offset() { return offset_; } 547 int offset() { return offset_; }
551 int scale() { return scale_; } 548 int scale() { return scale_; }
552 549
553 bool Apply(HValue* other_base, int other_offset, int other_scale = 0) { 550 bool Apply(HValue* other_base, int other_offset, int other_scale = 0) {
554 if (base_ == NULL) { 551 if (base_ == NULL) {
555 base_ = other_base; 552 base_ = other_base;
(...skipping 27 matching lines...) Expand all
583 580
584 HValue* base_; 581 HValue* base_;
585 int offset_; 582 int offset_;
586 int scale_; 583 int scale_;
587 }; 584 };
588 585
589 586
590 typedef EnumSet<GVNFlag> GVNFlagSet; 587 typedef EnumSet<GVNFlag> GVNFlagSet;
591 588
592 589
593 class HValue : public ZoneObject { 590 class HValue: public ZoneObject {
594 public: 591 public:
595 static const int kNoNumber = -1; 592 static const int kNoNumber = -1;
596 593
597 enum Flag { 594 enum Flag {
598 kFlexibleRepresentation, 595 kFlexibleRepresentation,
599 kCannotBeTagged, 596 kCannotBeTagged,
600 // Participate in Global Value Numbering, i.e. elimination of 597 // Participate in Global Value Numbering, i.e. elimination of
601 // unnecessary recomputations. If an instruction sets this flag, it must 598 // unnecessary recomputations. If an instruction sets this flag, it must
602 // implement DataEquals(), which will be used to determine if other 599 // implement DataEquals(), which will be used to determine if other
603 // occurrences of the instruction are indeed the same. 600 // occurrences of the instruction are indeed the same.
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
1078 HValue* context, \ 1075 HValue* context, \
1079 P1 p1, \ 1076 P1 p1, \
1080 P2 p2, \ 1077 P2 p2, \
1081 P3 p3, \ 1078 P3 p3, \
1082 P4 p4, \ 1079 P4 p4, \
1083 P5 p5) { \ 1080 P5 p5) { \
1084 return new(zone) I(p1, p2, p3, p4, p5); \ 1081 return new(zone) I(p1, p2, p3, p4, p5); \
1085 } 1082 }
1086 1083
1087 1084
1088 class HInstruction : public HValue { 1085 class HInstruction: public HValue {
1089 public: 1086 public:
1090 HInstruction* next() const { return next_; } 1087 HInstruction* next() const { return next_; }
1091 HInstruction* previous() const { return previous_; } 1088 HInstruction* previous() const { return previous_; }
1092 1089
1093 virtual void PrintTo(StringStream* stream) V8_OVERRIDE; 1090 virtual void PrintTo(StringStream* stream);
1094 virtual void PrintDataTo(StringStream* stream); 1091 virtual void PrintDataTo(StringStream* stream);
1095 1092
1096 bool IsLinked() const { return block() != NULL; } 1093 bool IsLinked() const { return block() != NULL; }
1097 void Unlink(); 1094 void Unlink();
1098 void InsertBefore(HInstruction* next); 1095 void InsertBefore(HInstruction* next);
1099 void InsertAfter(HInstruction* previous); 1096 void InsertAfter(HInstruction* previous);
1100 1097
1101 // The position is a write-once variable. 1098 // The position is a write-once variable.
1102 int position() const { return position_; } 1099 int position() const { return position_; }
1103 bool has_position() const { return position_ != RelocInfo::kNoPosition; } 1100 bool has_position() const { return position_ != RelocInfo::kNoPosition; }
1104 void set_position(int position) { 1101 void set_position(int position) {
1105 ASSERT(!has_position()); 1102 ASSERT(!has_position());
1106 ASSERT(position != RelocInfo::kNoPosition); 1103 ASSERT(position != RelocInfo::kNoPosition);
1107 position_ = position; 1104 position_ = position;
1108 } 1105 }
1109 1106
1110 bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); } 1107 bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); }
1111 1108
1112 virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0; 1109 virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0;
1113 1110
1114 #ifdef DEBUG 1111 #ifdef DEBUG
1115 virtual void Verify() V8_OVERRIDE; 1112 virtual void Verify();
1116 #endif 1113 #endif
1117 1114
1118 virtual bool IsCall() { return false; } 1115 virtual bool IsCall() { return false; }
1119 1116
1120 DECLARE_ABSTRACT_INSTRUCTION(Instruction) 1117 DECLARE_ABSTRACT_INSTRUCTION(Instruction)
1121 1118
1122 protected: 1119 protected:
1123 HInstruction(HType type = HType::Tagged()) 1120 HInstruction(HType type = HType::Tagged())
1124 : HValue(type), 1121 : HValue(type),
1125 next_(NULL), 1122 next_(NULL),
1126 previous_(NULL), 1123 previous_(NULL),
1127 position_(RelocInfo::kNoPosition) { 1124 position_(RelocInfo::kNoPosition) {
1128 SetGVNFlag(kDependsOnOsrEntries); 1125 SetGVNFlag(kDependsOnOsrEntries);
1129 } 1126 }
1130 1127
1131 virtual void DeleteFromGraph() V8_OVERRIDE { Unlink(); } 1128 virtual void DeleteFromGraph() { Unlink(); }
1132 1129
1133 private: 1130 private:
1134 void InitializeAsFirst(HBasicBlock* block) { 1131 void InitializeAsFirst(HBasicBlock* block) {
1135 ASSERT(!IsLinked()); 1132 ASSERT(!IsLinked());
1136 SetBlock(block); 1133 SetBlock(block);
1137 } 1134 }
1138 1135
1139 void PrintMnemonicTo(StringStream* stream); 1136 void PrintMnemonicTo(StringStream* stream);
1140 1137
1141 HInstruction* next_; 1138 HInstruction* next_;
1142 HInstruction* previous_; 1139 HInstruction* previous_;
1143 int position_; 1140 int position_;
1144 1141
1145 friend class HBasicBlock; 1142 friend class HBasicBlock;
1146 }; 1143 };
1147 1144
1148 1145
1149 template<int V> 1146 template<int V>
1150 class HTemplateInstruction : public HInstruction { 1147 class HTemplateInstruction : public HInstruction {
1151 public: 1148 public:
1152 virtual int OperandCount() V8_FINAL V8_OVERRIDE { return V; } 1149 int OperandCount() { return V; }
1153 virtual HValue* OperandAt(int i) const V8_FINAL V8_OVERRIDE { 1150 HValue* OperandAt(int i) const { return inputs_[i]; }
1154 return inputs_[i];
1155 }
1156 1151
1157 protected: 1152 protected:
1158 HTemplateInstruction(HType type = HType::Tagged()) : HInstruction(type) {} 1153 HTemplateInstruction(HType type = HType::Tagged()) : HInstruction(type) {}
1159 1154
1160 virtual void InternalSetOperandAt(int i, HValue* value) V8_FINAL V8_OVERRIDE { 1155 void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
1161 inputs_[i] = value;
1162 }
1163 1156
1164 private: 1157 private:
1165 EmbeddedContainer<HValue*, V> inputs_; 1158 EmbeddedContainer<HValue*, V> inputs_;
1166 }; 1159 };
1167 1160
1168 1161
1169 class HControlInstruction : public HInstruction { 1162 class HControlInstruction: public HInstruction {
1170 public: 1163 public:
1171 virtual HBasicBlock* SuccessorAt(int i) = 0; 1164 virtual HBasicBlock* SuccessorAt(int i) = 0;
1172 virtual int SuccessorCount() = 0; 1165 virtual int SuccessorCount() = 0;
1173 virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0; 1166 virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0;
1174 1167
1175 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1168 virtual void PrintDataTo(StringStream* stream);
1176 1169
1177 HBasicBlock* FirstSuccessor() { 1170 HBasicBlock* FirstSuccessor() {
1178 return SuccessorCount() > 0 ? SuccessorAt(0) : NULL; 1171 return SuccessorCount() > 0 ? SuccessorAt(0) : NULL;
1179 } 1172 }
1180 HBasicBlock* SecondSuccessor() { 1173 HBasicBlock* SecondSuccessor() {
1181 return SuccessorCount() > 1 ? SuccessorAt(1) : NULL; 1174 return SuccessorCount() > 1 ? SuccessorAt(1) : NULL;
1182 } 1175 }
1183 1176
1184 DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction) 1177 DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction)
1185 }; 1178 };
1186 1179
1187 1180
1188 class HSuccessorIterator V8_FINAL BASE_EMBEDDED { 1181 class HSuccessorIterator BASE_EMBEDDED {
1189 public: 1182 public:
1190 explicit HSuccessorIterator(HControlInstruction* instr) 1183 explicit HSuccessorIterator(HControlInstruction* instr)
1191 : instr_(instr), current_(0) { } 1184 : instr_(instr), current_(0) { }
1192 1185
1193 bool Done() { return current_ >= instr_->SuccessorCount(); } 1186 bool Done() { return current_ >= instr_->SuccessorCount(); }
1194 HBasicBlock* Current() { return instr_->SuccessorAt(current_); } 1187 HBasicBlock* Current() { return instr_->SuccessorAt(current_); }
1195 void Advance() { current_++; } 1188 void Advance() { current_++; }
1196 1189
1197 private: 1190 private:
1198 HControlInstruction* instr_; 1191 HControlInstruction* instr_;
1199 int current_; 1192 int current_;
1200 }; 1193 };
1201 1194
1202 1195
1203 template<int S, int V> 1196 template<int S, int V>
1204 class HTemplateControlInstruction : public HControlInstruction { 1197 class HTemplateControlInstruction: public HControlInstruction {
1205 public: 1198 public:
1206 int SuccessorCount() V8_OVERRIDE { return S; } 1199 int SuccessorCount() { return S; }
1207 HBasicBlock* SuccessorAt(int i) V8_OVERRIDE { return successors_[i]; } 1200 HBasicBlock* SuccessorAt(int i) { return successors_[i]; }
1208 void SetSuccessorAt(int i, HBasicBlock* block) V8_OVERRIDE { 1201 void SetSuccessorAt(int i, HBasicBlock* block) { successors_[i] = block; }
1209 successors_[i] = block;
1210 }
1211 1202
1212 int OperandCount() V8_OVERRIDE { return V; } 1203 int OperandCount() { return V; }
1213 HValue* OperandAt(int i) const V8_OVERRIDE { return inputs_[i]; } 1204 HValue* OperandAt(int i) const { return inputs_[i]; }
1214 1205
1215 1206
1216 protected: 1207 protected:
1217 void InternalSetOperandAt(int i, HValue* value) V8_OVERRIDE { 1208 void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
1218 inputs_[i] = value;
1219 }
1220 1209
1221 private: 1210 private:
1222 EmbeddedContainer<HBasicBlock*, S> successors_; 1211 EmbeddedContainer<HBasicBlock*, S> successors_;
1223 EmbeddedContainer<HValue*, V> inputs_; 1212 EmbeddedContainer<HValue*, V> inputs_;
1224 }; 1213 };
1225 1214
1226 1215
1227 class HBlockEntry V8_FINAL : public HTemplateInstruction<0> { 1216 class HBlockEntry: public HTemplateInstruction<0> {
1228 public: 1217 public:
1229 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1218 virtual Representation RequiredInputRepresentation(int index) {
1230 return Representation::None(); 1219 return Representation::None();
1231 } 1220 }
1232 1221
1233 DECLARE_CONCRETE_INSTRUCTION(BlockEntry) 1222 DECLARE_CONCRETE_INSTRUCTION(BlockEntry)
1234 }; 1223 };
1235 1224
1236 1225
1237 class HDummyUse V8_FINAL : public HTemplateInstruction<1> { 1226 class HDummyUse: public HTemplateInstruction<1> {
1238 public: 1227 public:
1239 explicit HDummyUse(HValue* value) 1228 explicit HDummyUse(HValue* value)
1240 : HTemplateInstruction<1>(HType::Smi()) { 1229 : HTemplateInstruction<1>(HType::Smi()) {
1241 SetOperandAt(0, value); 1230 SetOperandAt(0, value);
1242 // Pretend to be a Smi so that the HChange instructions inserted 1231 // Pretend to be a Smi so that the HChange instructions inserted
1243 // before any use generate as little code as possible. 1232 // before any use generate as little code as possible.
1244 set_representation(Representation::Tagged()); 1233 set_representation(Representation::Tagged());
1245 } 1234 }
1246 1235
1247 HValue* value() { return OperandAt(0); } 1236 HValue* value() { return OperandAt(0); }
1248 1237
1249 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } 1238 virtual bool HasEscapingOperandAt(int index) { return false; }
1250 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1239 virtual Representation RequiredInputRepresentation(int index) {
1251 return Representation::None(); 1240 return Representation::None();
1252 } 1241 }
1253 1242
1254 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1243 virtual void PrintDataTo(StringStream* stream);
1255 1244
1256 DECLARE_CONCRETE_INSTRUCTION(DummyUse); 1245 DECLARE_CONCRETE_INSTRUCTION(DummyUse);
1257 }; 1246 };
1258 1247
1259 1248
1260 class HDeoptimize V8_FINAL : public HTemplateInstruction<0> { 1249 class HDeoptimize: public HTemplateInstruction<0> {
1261 public: 1250 public:
1262 DECLARE_INSTRUCTION_FACTORY_P2(HDeoptimize, const char*, 1251 DECLARE_INSTRUCTION_FACTORY_P2(HDeoptimize, const char*,
1263 Deoptimizer::BailoutType); 1252 Deoptimizer::BailoutType);
1264 1253
1265 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1254 virtual Representation RequiredInputRepresentation(int index) {
1266 return Representation::None(); 1255 return Representation::None();
1267 } 1256 }
1268 1257
1269 const char* reason() const { return reason_; } 1258 const char* reason() const { return reason_; }
1270 Deoptimizer::BailoutType type() { return type_; } 1259 Deoptimizer::BailoutType type() { return type_; }
1271 1260
1272 DECLARE_CONCRETE_INSTRUCTION(Deoptimize) 1261 DECLARE_CONCRETE_INSTRUCTION(Deoptimize)
1273 1262
1274 private: 1263 private:
1275 explicit HDeoptimize(const char* reason, Deoptimizer::BailoutType type) 1264 explicit HDeoptimize(const char* reason, Deoptimizer::BailoutType type)
1276 : reason_(reason), type_(type) {} 1265 : reason_(reason), type_(type) {}
1277 1266
1278 const char* reason_; 1267 const char* reason_;
1279 Deoptimizer::BailoutType type_; 1268 Deoptimizer::BailoutType type_;
1280 }; 1269 };
1281 1270
1282 1271
1283 // Inserts an int3/stop break instruction for debugging purposes. 1272 // Inserts an int3/stop break instruction for debugging purposes.
1284 class HDebugBreak V8_FINAL : public HTemplateInstruction<0> { 1273 class HDebugBreak: public HTemplateInstruction<0> {
1285 public: 1274 public:
1286 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1275 virtual Representation RequiredInputRepresentation(int index) {
1287 return Representation::None(); 1276 return Representation::None();
1288 } 1277 }
1289 1278
1290 DECLARE_CONCRETE_INSTRUCTION(DebugBreak) 1279 DECLARE_CONCRETE_INSTRUCTION(DebugBreak)
1291 }; 1280 };
1292 1281
1293 1282
1294 class HGoto V8_FINAL : public HTemplateControlInstruction<1, 0> { 1283 class HGoto: public HTemplateControlInstruction<1, 0> {
1295 public: 1284 public:
1296 explicit HGoto(HBasicBlock* target) { 1285 explicit HGoto(HBasicBlock* target) {
1297 SetSuccessorAt(0, target); 1286 SetSuccessorAt(0, target);
1298 } 1287 }
1299 1288
1300 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1289 virtual Representation RequiredInputRepresentation(int index) {
1301 return Representation::None(); 1290 return Representation::None();
1302 } 1291 }
1303 1292
1304 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1293 virtual void PrintDataTo(StringStream* stream);
1305 1294
1306 DECLARE_CONCRETE_INSTRUCTION(Goto) 1295 DECLARE_CONCRETE_INSTRUCTION(Goto)
1307 }; 1296 };
1308 1297
1309 1298
1310 class HUnaryControlInstruction : public HTemplateControlInstruction<2, 1> { 1299 class HUnaryControlInstruction: public HTemplateControlInstruction<2, 1> {
1311 public: 1300 public:
1312 HUnaryControlInstruction(HValue* value, 1301 HUnaryControlInstruction(HValue* value,
1313 HBasicBlock* true_target, 1302 HBasicBlock* true_target,
1314 HBasicBlock* false_target) { 1303 HBasicBlock* false_target) {
1315 SetOperandAt(0, value); 1304 SetOperandAt(0, value);
1316 SetSuccessorAt(0, true_target); 1305 SetSuccessorAt(0, true_target);
1317 SetSuccessorAt(1, false_target); 1306 SetSuccessorAt(1, false_target);
1318 } 1307 }
1319 1308
1320 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1309 virtual void PrintDataTo(StringStream* stream);
1321 1310
1322 HValue* value() { return OperandAt(0); } 1311 HValue* value() { return OperandAt(0); }
1323 }; 1312 };
1324 1313
1325 1314
1326 class HBranch V8_FINAL : public HUnaryControlInstruction { 1315 class HBranch: public HUnaryControlInstruction {
1327 public: 1316 public:
1328 HBranch(HValue* value, 1317 HBranch(HValue* value,
1329 ToBooleanStub::Types expected_input_types = ToBooleanStub::Types(), 1318 ToBooleanStub::Types expected_input_types = ToBooleanStub::Types(),
1330 HBasicBlock* true_target = NULL, 1319 HBasicBlock* true_target = NULL,
1331 HBasicBlock* false_target = NULL) 1320 HBasicBlock* false_target = NULL)
1332 : HUnaryControlInstruction(value, true_target, false_target), 1321 : HUnaryControlInstruction(value, true_target, false_target),
1333 expected_input_types_(expected_input_types) { 1322 expected_input_types_(expected_input_types) {
1334 SetFlag(kAllowUndefinedAsNaN); 1323 SetFlag(kAllowUndefinedAsNaN);
1335 } 1324 }
1336 1325
1337 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1326 virtual Representation RequiredInputRepresentation(int index) {
1338 return Representation::None(); 1327 return Representation::None();
1339 } 1328 }
1340 virtual Representation observed_input_representation(int index) V8_OVERRIDE; 1329 virtual Representation observed_input_representation(int index);
1341 1330
1342 ToBooleanStub::Types expected_input_types() const { 1331 ToBooleanStub::Types expected_input_types() const {
1343 return expected_input_types_; 1332 return expected_input_types_;
1344 } 1333 }
1345 1334
1346 DECLARE_CONCRETE_INSTRUCTION(Branch) 1335 DECLARE_CONCRETE_INSTRUCTION(Branch)
1347 1336
1348 private: 1337 private:
1349 ToBooleanStub::Types expected_input_types_; 1338 ToBooleanStub::Types expected_input_types_;
1350 }; 1339 };
1351 1340
1352 1341
1353 class HCompareMap V8_FINAL : public HUnaryControlInstruction { 1342 class HCompareMap: public HUnaryControlInstruction {
1354 public: 1343 public:
1355 HCompareMap(HValue* value, 1344 HCompareMap(HValue* value,
1356 Handle<Map> map, 1345 Handle<Map> map,
1357 HBasicBlock* true_target = NULL, 1346 HBasicBlock* true_target = NULL,
1358 HBasicBlock* false_target = NULL) 1347 HBasicBlock* false_target = NULL)
1359 : HUnaryControlInstruction(value, true_target, false_target), 1348 : HUnaryControlInstruction(value, true_target, false_target),
1360 map_(map) { 1349 map_(map) {
1361 ASSERT(!map.is_null()); 1350 ASSERT(!map.is_null());
1362 } 1351 }
1363 1352
1364 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1353 virtual void PrintDataTo(StringStream* stream);
1365 1354
1366 Handle<Map> map() const { return map_; } 1355 Handle<Map> map() const { return map_; }
1367 1356
1368 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1357 virtual Representation RequiredInputRepresentation(int index) {
1369 return Representation::Tagged(); 1358 return Representation::Tagged();
1370 } 1359 }
1371 1360
1372 DECLARE_CONCRETE_INSTRUCTION(CompareMap) 1361 DECLARE_CONCRETE_INSTRUCTION(CompareMap)
1373 1362
1374 private: 1363 private:
1375 Handle<Map> map_; 1364 Handle<Map> map_;
1376 }; 1365 };
1377 1366
1378 1367
1379 class HContext V8_FINAL : public HTemplateInstruction<0> { 1368 class HContext: public HTemplateInstruction<0> {
1380 public: 1369 public:
1381 static HContext* New(Zone* zone) { 1370 static HContext* New(Zone* zone) {
1382 return new(zone) HContext(); 1371 return new(zone) HContext();
1383 } 1372 }
1384 1373
1385 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1374 virtual Representation RequiredInputRepresentation(int index) {
1386 return Representation::None(); 1375 return Representation::None();
1387 } 1376 }
1388 1377
1389 DECLARE_CONCRETE_INSTRUCTION(Context) 1378 DECLARE_CONCRETE_INSTRUCTION(Context)
1390 1379
1391 protected: 1380 protected:
1392 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 1381 virtual bool DataEquals(HValue* other) { return true; }
1393 1382
1394 private: 1383 private:
1395 HContext() { 1384 HContext() {
1396 set_representation(Representation::Tagged()); 1385 set_representation(Representation::Tagged());
1397 SetFlag(kUseGVN); 1386 SetFlag(kUseGVN);
1398 } 1387 }
1399 1388
1400 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 1389 virtual bool IsDeletable() const { return true; }
1401 }; 1390 };
1402 1391
1403 1392
1404 class HReturn V8_FINAL : public HTemplateControlInstruction<0, 3> { 1393 class HReturn: public HTemplateControlInstruction<0, 3> {
1405 public: 1394 public:
1406 static HInstruction* New(Zone* zone, 1395 static HInstruction* New(Zone* zone,
1407 HValue* context, 1396 HValue* context,
1408 HValue* value, 1397 HValue* value,
1409 HValue* parameter_count) { 1398 HValue* parameter_count) {
1410 return new(zone) HReturn(value, context, parameter_count); 1399 return new(zone) HReturn(value, context, parameter_count);
1411 } 1400 }
1412 1401
1413 static HInstruction* New(Zone* zone, 1402 static HInstruction* New(Zone* zone,
1414 HValue* context, 1403 HValue* context,
1415 HValue* value) { 1404 HValue* value) {
1416 return new(zone) HReturn(value, context, 0); 1405 return new(zone) HReturn(value, context, 0);
1417 } 1406 }
1418 1407
1419 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1408 virtual Representation RequiredInputRepresentation(int index) {
1420 return Representation::Tagged(); 1409 return Representation::Tagged();
1421 } 1410 }
1422 1411
1423 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1412 virtual void PrintDataTo(StringStream* stream);
1424 1413
1425 HValue* value() { return OperandAt(0); } 1414 HValue* value() { return OperandAt(0); }
1426 HValue* context() { return OperandAt(1); } 1415 HValue* context() { return OperandAt(1); }
1427 HValue* parameter_count() { return OperandAt(2); } 1416 HValue* parameter_count() { return OperandAt(2); }
1428 1417
1429 DECLARE_CONCRETE_INSTRUCTION(Return) 1418 DECLARE_CONCRETE_INSTRUCTION(Return)
1430 1419
1431 private: 1420 private:
1432 HReturn(HValue* value, HValue* context, HValue* parameter_count) { 1421 HReturn(HValue* value, HValue* context, HValue* parameter_count) {
1433 SetOperandAt(0, value); 1422 SetOperandAt(0, value);
1434 SetOperandAt(1, context); 1423 SetOperandAt(1, context);
1435 SetOperandAt(2, parameter_count); 1424 SetOperandAt(2, parameter_count);
1436 } 1425 }
1437 }; 1426 };
1438 1427
1439 1428
1440 class HAbnormalExit V8_FINAL : public HTemplateControlInstruction<0, 0> { 1429 class HAbnormalExit: public HTemplateControlInstruction<0, 0> {
1441 public: 1430 public:
1442 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1431 virtual Representation RequiredInputRepresentation(int index) {
1443 return Representation::None(); 1432 return Representation::None();
1444 } 1433 }
1445 1434
1446 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit) 1435 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit)
1447 }; 1436 };
1448 1437
1449 1438
1450 class HUnaryOperation : public HTemplateInstruction<1> { 1439 class HUnaryOperation: public HTemplateInstruction<1> {
1451 public: 1440 public:
1452 HUnaryOperation(HValue* value, HType type = HType::Tagged()) 1441 HUnaryOperation(HValue* value, HType type = HType::Tagged())
1453 : HTemplateInstruction<1>(type) { 1442 : HTemplateInstruction<1>(type) {
1454 SetOperandAt(0, value); 1443 SetOperandAt(0, value);
1455 } 1444 }
1456 1445
1457 static HUnaryOperation* cast(HValue* value) { 1446 static HUnaryOperation* cast(HValue* value) {
1458 return reinterpret_cast<HUnaryOperation*>(value); 1447 return reinterpret_cast<HUnaryOperation*>(value);
1459 } 1448 }
1460 1449
1461 HValue* value() const { return OperandAt(0); } 1450 HValue* value() const { return OperandAt(0); }
1462 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1451 virtual void PrintDataTo(StringStream* stream);
1463 }; 1452 };
1464 1453
1465 1454
1466 class HThrow V8_FINAL : public HTemplateInstruction<2> { 1455 class HThrow: public HTemplateInstruction<2> {
1467 public: 1456 public:
1468 static HThrow* New(Zone* zone, 1457 static HThrow* New(Zone* zone,
1469 HValue* context, 1458 HValue* context,
1470 HValue* value) { 1459 HValue* value) {
1471 return new(zone) HThrow(context, value); 1460 return new(zone) HThrow(context, value);
1472 } 1461 }
1473 1462
1474 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1463 virtual Representation RequiredInputRepresentation(int index) {
1475 return Representation::Tagged(); 1464 return Representation::Tagged();
1476 } 1465 }
1477 1466
1478 HValue* context() { return OperandAt(0); } 1467 HValue* context() { return OperandAt(0); }
1479 HValue* value() { return OperandAt(1); } 1468 HValue* value() { return OperandAt(1); }
1480 1469
1481 DECLARE_CONCRETE_INSTRUCTION(Throw) 1470 DECLARE_CONCRETE_INSTRUCTION(Throw)
1482 1471
1483 private: 1472 private:
1484 HThrow(HValue* context, HValue* value) { 1473 HThrow(HValue* context, HValue* value) {
1485 SetOperandAt(0, context); 1474 SetOperandAt(0, context);
1486 SetOperandAt(1, value); 1475 SetOperandAt(1, value);
1487 SetAllSideEffects(); 1476 SetAllSideEffects();
1488 } 1477 }
1489 }; 1478 };
1490 1479
1491 1480
1492 class HUseConst V8_FINAL : public HUnaryOperation { 1481 class HUseConst: public HUnaryOperation {
1493 public: 1482 public:
1494 DECLARE_INSTRUCTION_FACTORY_P1(HUseConst, HValue*); 1483 DECLARE_INSTRUCTION_FACTORY_P1(HUseConst, HValue*);
1495 1484
1496 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1485 virtual Representation RequiredInputRepresentation(int index) {
1497 return Representation::None(); 1486 return Representation::None();
1498 } 1487 }
1499 1488
1500 DECLARE_CONCRETE_INSTRUCTION(UseConst) 1489 DECLARE_CONCRETE_INSTRUCTION(UseConst)
1501 1490
1502 private: 1491 private:
1503 explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { } 1492 explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { }
1504 }; 1493 };
1505 1494
1506 1495
1507 class HForceRepresentation V8_FINAL : public HTemplateInstruction<1> { 1496 class HForceRepresentation: public HTemplateInstruction<1> {
1508 public: 1497 public:
1509 DECLARE_INSTRUCTION_FACTORY_P2(HForceRepresentation, HValue*, Representation); 1498 DECLARE_INSTRUCTION_FACTORY_P2(HForceRepresentation, HValue*, Representation);
1510 1499
1511 HValue* value() { return OperandAt(0); } 1500 HValue* value() { return OperandAt(0); }
1512 1501
1513 virtual HValue* EnsureAndPropagateNotMinusZero( 1502 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1514 BitVector* visited) V8_OVERRIDE;
1515 1503
1516 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1504 virtual Representation RequiredInputRepresentation(int index) {
1517 return representation(); // Same as the output representation. 1505 return representation(); // Same as the output representation.
1518 } 1506 }
1519 1507
1520 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1508 virtual void PrintDataTo(StringStream* stream);
1521 1509
1522 DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation) 1510 DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation)
1523 1511
1524 private: 1512 private:
1525 HForceRepresentation(HValue* value, Representation required_representation) { 1513 HForceRepresentation(HValue* value, Representation required_representation) {
1526 SetOperandAt(0, value); 1514 SetOperandAt(0, value);
1527 set_representation(required_representation); 1515 set_representation(required_representation);
1528 } 1516 }
1529 }; 1517 };
1530 1518
1531 1519
1532 class HChange V8_FINAL : public HUnaryOperation { 1520 class HChange: public HUnaryOperation {
1533 public: 1521 public:
1534 HChange(HValue* value, 1522 HChange(HValue* value,
1535 Representation to, 1523 Representation to,
1536 bool is_truncating_to_smi, 1524 bool is_truncating_to_smi,
1537 bool is_truncating_to_int32) 1525 bool is_truncating_to_int32)
1538 : HUnaryOperation(value) { 1526 : HUnaryOperation(value) {
1539 ASSERT(!value->representation().IsNone()); 1527 ASSERT(!value->representation().IsNone());
1540 ASSERT(!to.IsNone()); 1528 ASSERT(!to.IsNone());
1541 ASSERT(!value->representation().Equals(to)); 1529 ASSERT(!value->representation().Equals(to));
1542 set_representation(to); 1530 set_representation(to);
1543 SetFlag(kUseGVN); 1531 SetFlag(kUseGVN);
1544 if (is_truncating_to_smi) SetFlag(kTruncatingToSmi); 1532 if (is_truncating_to_smi) SetFlag(kTruncatingToSmi);
1545 if (is_truncating_to_int32) SetFlag(kTruncatingToInt32); 1533 if (is_truncating_to_int32) SetFlag(kTruncatingToInt32);
1546 if (value->representation().IsSmi() || value->type().IsSmi()) { 1534 if (value->representation().IsSmi() || value->type().IsSmi()) {
1547 set_type(HType::Smi()); 1535 set_type(HType::Smi());
1548 } else { 1536 } else {
1549 set_type(HType::TaggedNumber()); 1537 set_type(HType::TaggedNumber());
1550 if (to.IsTagged()) SetGVNFlag(kChangesNewSpacePromotion); 1538 if (to.IsTagged()) SetGVNFlag(kChangesNewSpacePromotion);
1551 } 1539 }
1552 } 1540 }
1553 1541
1554 bool can_convert_undefined_to_nan() { 1542 bool can_convert_undefined_to_nan() {
1555 return CheckUsesForFlag(kAllowUndefinedAsNaN); 1543 return CheckUsesForFlag(kAllowUndefinedAsNaN);
1556 } 1544 }
1557 1545
1558 virtual HValue* EnsureAndPropagateNotMinusZero( 1546 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1559 BitVector* visited) V8_OVERRIDE; 1547 virtual HType CalculateInferredType();
1560 virtual HType CalculateInferredType() V8_OVERRIDE; 1548 virtual HValue* Canonicalize();
1561 virtual HValue* Canonicalize() V8_OVERRIDE;
1562 1549
1563 Representation from() const { return value()->representation(); } 1550 Representation from() const { return value()->representation(); }
1564 Representation to() const { return representation(); } 1551 Representation to() const { return representation(); }
1565 bool deoptimize_on_minus_zero() const { 1552 bool deoptimize_on_minus_zero() const {
1566 return CheckFlag(kBailoutOnMinusZero); 1553 return CheckFlag(kBailoutOnMinusZero);
1567 } 1554 }
1568 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1555 virtual Representation RequiredInputRepresentation(int index) {
1569 return from(); 1556 return from();
1570 } 1557 }
1571 1558
1572 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 1559 virtual Range* InferRange(Zone* zone);
1573 1560
1574 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1561 virtual void PrintDataTo(StringStream* stream);
1575 1562
1576 DECLARE_CONCRETE_INSTRUCTION(Change) 1563 DECLARE_CONCRETE_INSTRUCTION(Change)
1577 1564
1578 protected: 1565 protected:
1579 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 1566 virtual bool DataEquals(HValue* other) { return true; }
1580 1567
1581 private: 1568 private:
1582 virtual bool IsDeletable() const V8_OVERRIDE { 1569 virtual bool IsDeletable() const {
1583 return !from().IsTagged() || value()->type().IsSmi(); 1570 return !from().IsTagged() || value()->type().IsSmi();
1584 } 1571 }
1585 }; 1572 };
1586 1573
1587 1574
1588 class HClampToUint8 V8_FINAL : public HUnaryOperation { 1575 class HClampToUint8: public HUnaryOperation {
1589 public: 1576 public:
1590 DECLARE_INSTRUCTION_FACTORY_P1(HClampToUint8, HValue*); 1577 DECLARE_INSTRUCTION_FACTORY_P1(HClampToUint8, HValue*);
1591 1578
1592 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1579 virtual Representation RequiredInputRepresentation(int index) {
1593 return Representation::None(); 1580 return Representation::None();
1594 } 1581 }
1595 1582
1596 DECLARE_CONCRETE_INSTRUCTION(ClampToUint8) 1583 DECLARE_CONCRETE_INSTRUCTION(ClampToUint8)
1597 1584
1598 protected: 1585 protected:
1599 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 1586 virtual bool DataEquals(HValue* other) { return true; }
1600 1587
1601 private: 1588 private:
1602 explicit HClampToUint8(HValue* value) 1589 explicit HClampToUint8(HValue* value)
1603 : HUnaryOperation(value) { 1590 : HUnaryOperation(value) {
1604 set_representation(Representation::Integer32()); 1591 set_representation(Representation::Integer32());
1605 SetFlag(kAllowUndefinedAsNaN); 1592 SetFlag(kAllowUndefinedAsNaN);
1606 SetFlag(kUseGVN); 1593 SetFlag(kUseGVN);
1607 } 1594 }
1608 1595
1609 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 1596 virtual bool IsDeletable() const { return true; }
1610 }; 1597 };
1611 1598
1612 1599
1613 enum RemovableSimulate { 1600 enum RemovableSimulate {
1614 REMOVABLE_SIMULATE, 1601 REMOVABLE_SIMULATE,
1615 FIXED_SIMULATE 1602 FIXED_SIMULATE
1616 }; 1603 };
1617 1604
1618 1605
1619 class HSimulate V8_FINAL : public HInstruction { 1606 class HSimulate: public HInstruction {
1620 public: 1607 public:
1621 HSimulate(BailoutId ast_id, 1608 HSimulate(BailoutId ast_id,
1622 int pop_count, 1609 int pop_count,
1623 Zone* zone, 1610 Zone* zone,
1624 RemovableSimulate removable) 1611 RemovableSimulate removable)
1625 : ast_id_(ast_id), 1612 : ast_id_(ast_id),
1626 pop_count_(pop_count), 1613 pop_count_(pop_count),
1627 values_(2, zone), 1614 values_(2, zone),
1628 assigned_indexes_(2, zone), 1615 assigned_indexes_(2, zone),
1629 zone_(zone), 1616 zone_(zone),
1630 removable_(removable) {} 1617 removable_(removable) {}
1631 ~HSimulate() {} 1618 virtual ~HSimulate() {}
1632 1619
1633 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1620 virtual void PrintDataTo(StringStream* stream);
1634 1621
1635 bool HasAstId() const { return !ast_id_.IsNone(); } 1622 bool HasAstId() const { return !ast_id_.IsNone(); }
1636 BailoutId ast_id() const { return ast_id_; } 1623 BailoutId ast_id() const { return ast_id_; }
1637 void set_ast_id(BailoutId id) { 1624 void set_ast_id(BailoutId id) {
1638 ASSERT(!HasAstId()); 1625 ASSERT(!HasAstId());
1639 ast_id_ = id; 1626 ast_id_ = id;
1640 } 1627 }
1641 1628
1642 int pop_count() const { return pop_count_; } 1629 int pop_count() const { return pop_count_; }
1643 const ZoneList<HValue*>* values() const { return &values_; } 1630 const ZoneList<HValue*>* values() const { return &values_; }
1644 int GetAssignedIndexAt(int index) const { 1631 int GetAssignedIndexAt(int index) const {
1645 ASSERT(HasAssignedIndexAt(index)); 1632 ASSERT(HasAssignedIndexAt(index));
1646 return assigned_indexes_[index]; 1633 return assigned_indexes_[index];
1647 } 1634 }
1648 bool HasAssignedIndexAt(int index) const { 1635 bool HasAssignedIndexAt(int index) const {
1649 return assigned_indexes_[index] != kNoIndex; 1636 return assigned_indexes_[index] != kNoIndex;
1650 } 1637 }
1651 void AddAssignedValue(int index, HValue* value) { 1638 void AddAssignedValue(int index, HValue* value) {
1652 AddValue(index, value); 1639 AddValue(index, value);
1653 } 1640 }
1654 void AddPushedValue(HValue* value) { 1641 void AddPushedValue(HValue* value) {
1655 AddValue(kNoIndex, value); 1642 AddValue(kNoIndex, value);
1656 } 1643 }
1657 int ToOperandIndex(int environment_index) { 1644 int ToOperandIndex(int environment_index) {
1658 for (int i = 0; i < assigned_indexes_.length(); ++i) { 1645 for (int i = 0; i < assigned_indexes_.length(); ++i) {
1659 if (assigned_indexes_[i] == environment_index) return i; 1646 if (assigned_indexes_[i] == environment_index) return i;
1660 } 1647 }
1661 return -1; 1648 return -1;
1662 } 1649 }
1663 virtual int OperandCount() V8_OVERRIDE { return values_.length(); } 1650 virtual int OperandCount() { return values_.length(); }
1664 virtual HValue* OperandAt(int index) const V8_OVERRIDE { 1651 virtual HValue* OperandAt(int index) const { return values_[index]; }
1665 return values_[index];
1666 }
1667 1652
1668 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } 1653 virtual bool HasEscapingOperandAt(int index) { return false; }
1669 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1654 virtual Representation RequiredInputRepresentation(int index) {
1670 return Representation::None(); 1655 return Representation::None();
1671 } 1656 }
1672 1657
1673 void MergeWith(ZoneList<HSimulate*>* list); 1658 void MergeWith(ZoneList<HSimulate*>* list);
1674 bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; } 1659 bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; }
1675 1660
1676 DECLARE_CONCRETE_INSTRUCTION(Simulate) 1661 DECLARE_CONCRETE_INSTRUCTION(Simulate)
1677 1662
1678 #ifdef DEBUG 1663 #ifdef DEBUG
1679 virtual void Verify() V8_OVERRIDE; 1664 virtual void Verify();
1680 void set_closure(Handle<JSFunction> closure) { closure_ = closure; } 1665 void set_closure(Handle<JSFunction> closure) { closure_ = closure; }
1681 Handle<JSFunction> closure() const { return closure_; } 1666 Handle<JSFunction> closure() const { return closure_; }
1682 #endif 1667 #endif
1683 1668
1684 protected: 1669 protected:
1685 virtual void InternalSetOperandAt(int index, HValue* value) V8_OVERRIDE { 1670 virtual void InternalSetOperandAt(int index, HValue* value) {
1686 values_[index] = value; 1671 values_[index] = value;
1687 } 1672 }
1688 1673
1689 private: 1674 private:
1690 static const int kNoIndex = -1; 1675 static const int kNoIndex = -1;
1691 void AddValue(int index, HValue* value) { 1676 void AddValue(int index, HValue* value) {
1692 assigned_indexes_.Add(index, zone_); 1677 assigned_indexes_.Add(index, zone_);
1693 // Resize the list of pushed values. 1678 // Resize the list of pushed values.
1694 values_.Add(NULL, zone_); 1679 values_.Add(NULL, zone_);
1695 // Set the operand through the base method in HValue to make sure that the 1680 // Set the operand through the base method in HValue to make sure that the
(...skipping 12 matching lines...) Expand all
1708 ZoneList<int> assigned_indexes_; 1693 ZoneList<int> assigned_indexes_;
1709 Zone* zone_; 1694 Zone* zone_;
1710 RemovableSimulate removable_; 1695 RemovableSimulate removable_;
1711 1696
1712 #ifdef DEBUG 1697 #ifdef DEBUG
1713 Handle<JSFunction> closure_; 1698 Handle<JSFunction> closure_;
1714 #endif 1699 #endif
1715 }; 1700 };
1716 1701
1717 1702
1718 class HEnvironmentMarker V8_FINAL : public HTemplateInstruction<1> { 1703 class HEnvironmentMarker: public HTemplateInstruction<1> {
1719 public: 1704 public:
1720 enum Kind { BIND, LOOKUP }; 1705 enum Kind { BIND, LOOKUP };
1721 1706
1722 HEnvironmentMarker(Kind kind, int index) 1707 HEnvironmentMarker(Kind kind, int index)
1723 : kind_(kind), index_(index), next_simulate_(NULL) { } 1708 : kind_(kind), index_(index), next_simulate_(NULL) { }
1724 1709
1725 Kind kind() { return kind_; } 1710 Kind kind() { return kind_; }
1726 int index() { return index_; } 1711 int index() { return index_; }
1727 HSimulate* next_simulate() { return next_simulate_; } 1712 HSimulate* next_simulate() { return next_simulate_; }
1728 void set_next_simulate(HSimulate* simulate) { 1713 void set_next_simulate(HSimulate* simulate) {
1729 next_simulate_ = simulate; 1714 next_simulate_ = simulate;
1730 } 1715 }
1731 1716
1732 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1717 virtual Representation RequiredInputRepresentation(int index) {
1733 return Representation::None(); 1718 return Representation::None();
1734 } 1719 }
1735 1720
1736 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1721 virtual void PrintDataTo(StringStream* stream);
1737 1722
1738 #ifdef DEBUG 1723 #ifdef DEBUG
1739 void set_closure(Handle<JSFunction> closure) { 1724 void set_closure(Handle<JSFunction> closure) {
1740 ASSERT(closure_.is_null()); 1725 ASSERT(closure_.is_null());
1741 ASSERT(!closure.is_null()); 1726 ASSERT(!closure.is_null());
1742 closure_ = closure; 1727 closure_ = closure;
1743 } 1728 }
1744 Handle<JSFunction> closure() const { return closure_; } 1729 Handle<JSFunction> closure() const { return closure_; }
1745 #endif 1730 #endif
1746 1731
1747 DECLARE_CONCRETE_INSTRUCTION(EnvironmentMarker); 1732 DECLARE_CONCRETE_INSTRUCTION(EnvironmentMarker);
1748 1733
1749 private: 1734 private:
1750 Kind kind_; 1735 Kind kind_;
1751 int index_; 1736 int index_;
1752 HSimulate* next_simulate_; 1737 HSimulate* next_simulate_;
1753 1738
1754 #ifdef DEBUG 1739 #ifdef DEBUG
1755 Handle<JSFunction> closure_; 1740 Handle<JSFunction> closure_;
1756 #endif 1741 #endif
1757 }; 1742 };
1758 1743
1759 1744
1760 class HStackCheck V8_FINAL : public HTemplateInstruction<1> { 1745 class HStackCheck: public HTemplateInstruction<1> {
1761 public: 1746 public:
1762 enum Type { 1747 enum Type {
1763 kFunctionEntry, 1748 kFunctionEntry,
1764 kBackwardsBranch 1749 kBackwardsBranch
1765 }; 1750 };
1766 1751
1767 DECLARE_INSTRUCTION_FACTORY_P2(HStackCheck, HValue*, Type); 1752 DECLARE_INSTRUCTION_FACTORY_P2(HStackCheck, HValue*, Type);
1768 1753
1769 HValue* context() { return OperandAt(0); } 1754 HValue* context() { return OperandAt(0); }
1770 1755
1771 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1756 virtual Representation RequiredInputRepresentation(int index) {
1772 return Representation::Tagged(); 1757 return Representation::Tagged();
1773 } 1758 }
1774 1759
1775 void Eliminate() { 1760 void Eliminate() {
1776 // The stack check eliminator might try to eliminate the same stack 1761 // The stack check eliminator might try to eliminate the same stack
1777 // check instruction multiple times. 1762 // check instruction multiple times.
1778 if (IsLinked()) { 1763 if (IsLinked()) {
1779 DeleteAndReplaceWith(NULL); 1764 DeleteAndReplaceWith(NULL);
1780 } 1765 }
1781 } 1766 }
(...skipping 18 matching lines...) Expand all
1800 DROP_EXTRA_ON_RETURN, // Drop an extra value from the environment on return. 1785 DROP_EXTRA_ON_RETURN, // Drop an extra value from the environment on return.
1801 CONSTRUCT_CALL_RETURN, // Either use allocated receiver or return value. 1786 CONSTRUCT_CALL_RETURN, // Either use allocated receiver or return value.
1802 GETTER_CALL_RETURN, // Returning from a getter, need to restore context. 1787 GETTER_CALL_RETURN, // Returning from a getter, need to restore context.
1803 SETTER_CALL_RETURN // Use the RHS of the assignment as the return value. 1788 SETTER_CALL_RETURN // Use the RHS of the assignment as the return value.
1804 }; 1789 };
1805 1790
1806 1791
1807 class HArgumentsObject; 1792 class HArgumentsObject;
1808 1793
1809 1794
1810 class HEnterInlined V8_FINAL : public HTemplateInstruction<0> { 1795 class HEnterInlined: public HTemplateInstruction<0> {
1811 public: 1796 public:
1812 static HEnterInlined* New(Zone* zone, 1797 static HEnterInlined* New(Zone* zone,
1813 HValue* context, 1798 HValue* context,
1814 Handle<JSFunction> closure, 1799 Handle<JSFunction> closure,
1815 int arguments_count, 1800 int arguments_count,
1816 FunctionLiteral* function, 1801 FunctionLiteral* function,
1817 InliningKind inlining_kind, 1802 InliningKind inlining_kind,
1818 Variable* arguments_var, 1803 Variable* arguments_var,
1819 HArgumentsObject* arguments_object, 1804 HArgumentsObject* arguments_object,
1820 bool undefined_receiver) { 1805 bool undefined_receiver) {
1821 return new(zone) HEnterInlined(closure, arguments_count, function, 1806 return new(zone) HEnterInlined(closure, arguments_count, function,
1822 inlining_kind, arguments_var, 1807 inlining_kind, arguments_var,
1823 arguments_object, undefined_receiver, zone); 1808 arguments_object, undefined_receiver, zone);
1824 } 1809 }
1825 1810
1826 void RegisterReturnTarget(HBasicBlock* return_target, Zone* zone); 1811 void RegisterReturnTarget(HBasicBlock* return_target, Zone* zone);
1827 ZoneList<HBasicBlock*>* return_targets() { return &return_targets_; } 1812 ZoneList<HBasicBlock*>* return_targets() { return &return_targets_; }
1828 1813
1829 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1814 virtual void PrintDataTo(StringStream* stream);
1830 1815
1831 Handle<JSFunction> closure() const { return closure_; } 1816 Handle<JSFunction> closure() const { return closure_; }
1832 int arguments_count() const { return arguments_count_; } 1817 int arguments_count() const { return arguments_count_; }
1833 bool arguments_pushed() const { return arguments_pushed_; } 1818 bool arguments_pushed() const { return arguments_pushed_; }
1834 void set_arguments_pushed() { arguments_pushed_ = true; } 1819 void set_arguments_pushed() { arguments_pushed_ = true; }
1835 FunctionLiteral* function() const { return function_; } 1820 FunctionLiteral* function() const { return function_; }
1836 InliningKind inlining_kind() const { return inlining_kind_; } 1821 InliningKind inlining_kind() const { return inlining_kind_; }
1837 bool undefined_receiver() const { return undefined_receiver_; } 1822 bool undefined_receiver() const { return undefined_receiver_; }
1838 1823
1839 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1824 virtual Representation RequiredInputRepresentation(int index) {
1840 return Representation::None(); 1825 return Representation::None();
1841 } 1826 }
1842 1827
1843 Variable* arguments_var() { return arguments_var_; } 1828 Variable* arguments_var() { return arguments_var_; }
1844 HArgumentsObject* arguments_object() { return arguments_object_; } 1829 HArgumentsObject* arguments_object() { return arguments_object_; }
1845 1830
1846 DECLARE_CONCRETE_INSTRUCTION(EnterInlined) 1831 DECLARE_CONCRETE_INSTRUCTION(EnterInlined)
1847 1832
1848 private: 1833 private:
1849 HEnterInlined(Handle<JSFunction> closure, 1834 HEnterInlined(Handle<JSFunction> closure,
(...skipping 20 matching lines...) Expand all
1870 bool arguments_pushed_; 1855 bool arguments_pushed_;
1871 FunctionLiteral* function_; 1856 FunctionLiteral* function_;
1872 InliningKind inlining_kind_; 1857 InliningKind inlining_kind_;
1873 Variable* arguments_var_; 1858 Variable* arguments_var_;
1874 HArgumentsObject* arguments_object_; 1859 HArgumentsObject* arguments_object_;
1875 bool undefined_receiver_; 1860 bool undefined_receiver_;
1876 ZoneList<HBasicBlock*> return_targets_; 1861 ZoneList<HBasicBlock*> return_targets_;
1877 }; 1862 };
1878 1863
1879 1864
1880 class HLeaveInlined V8_FINAL : public HTemplateInstruction<0> { 1865 class HLeaveInlined: public HTemplateInstruction<0> {
1881 public: 1866 public:
1882 HLeaveInlined() { } 1867 HLeaveInlined() { }
1883 1868
1884 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1869 virtual Representation RequiredInputRepresentation(int index) {
1885 return Representation::None(); 1870 return Representation::None();
1886 } 1871 }
1887 1872
1888 DECLARE_CONCRETE_INSTRUCTION(LeaveInlined) 1873 DECLARE_CONCRETE_INSTRUCTION(LeaveInlined)
1889 }; 1874 };
1890 1875
1891 1876
1892 class HPushArgument V8_FINAL : public HUnaryOperation { 1877 class HPushArgument: public HUnaryOperation {
1893 public: 1878 public:
1894 DECLARE_INSTRUCTION_FACTORY_P1(HPushArgument, HValue*); 1879 DECLARE_INSTRUCTION_FACTORY_P1(HPushArgument, HValue*);
1895 1880
1896 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1881 virtual Representation RequiredInputRepresentation(int index) {
1897 return Representation::Tagged(); 1882 return Representation::Tagged();
1898 } 1883 }
1899 1884
1900 HValue* argument() { return OperandAt(0); } 1885 HValue* argument() { return OperandAt(0); }
1901 1886
1902 DECLARE_CONCRETE_INSTRUCTION(PushArgument) 1887 DECLARE_CONCRETE_INSTRUCTION(PushArgument)
1903 1888
1904 private: 1889 private:
1905 explicit HPushArgument(HValue* value) : HUnaryOperation(value) { 1890 explicit HPushArgument(HValue* value) : HUnaryOperation(value) {
1906 set_representation(Representation::Tagged()); 1891 set_representation(Representation::Tagged());
1907 } 1892 }
1908 }; 1893 };
1909 1894
1910 1895
1911 class HThisFunction V8_FINAL : public HTemplateInstruction<0> { 1896 class HThisFunction: public HTemplateInstruction<0> {
1912 public: 1897 public:
1913 HThisFunction() { 1898 HThisFunction() {
1914 set_representation(Representation::Tagged()); 1899 set_representation(Representation::Tagged());
1915 SetFlag(kUseGVN); 1900 SetFlag(kUseGVN);
1916 } 1901 }
1917 1902
1918 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1903 virtual Representation RequiredInputRepresentation(int index) {
1919 return Representation::None(); 1904 return Representation::None();
1920 } 1905 }
1921 1906
1922 DECLARE_CONCRETE_INSTRUCTION(ThisFunction) 1907 DECLARE_CONCRETE_INSTRUCTION(ThisFunction)
1923 1908
1924 protected: 1909 protected:
1925 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 1910 virtual bool DataEquals(HValue* other) { return true; }
1926 1911
1927 private: 1912 private:
1928 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 1913 virtual bool IsDeletable() const { return true; }
1929 }; 1914 };
1930 1915
1931 1916
1932 class HOuterContext V8_FINAL : public HUnaryOperation { 1917 class HOuterContext: public HUnaryOperation {
1933 public: 1918 public:
1934 DECLARE_INSTRUCTION_FACTORY_P1(HOuterContext, HValue*); 1919 DECLARE_INSTRUCTION_FACTORY_P1(HOuterContext, HValue*);
1935 1920
1936 DECLARE_CONCRETE_INSTRUCTION(OuterContext); 1921 DECLARE_CONCRETE_INSTRUCTION(OuterContext);
1937 1922
1938 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1923 virtual Representation RequiredInputRepresentation(int index) {
1939 return Representation::Tagged(); 1924 return Representation::Tagged();
1940 } 1925 }
1941 1926
1942 protected: 1927 protected:
1943 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 1928 virtual bool DataEquals(HValue* other) { return true; }
1944 1929
1945 private: 1930 private:
1946 explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) { 1931 explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) {
1947 set_representation(Representation::Tagged()); 1932 set_representation(Representation::Tagged());
1948 SetFlag(kUseGVN); 1933 SetFlag(kUseGVN);
1949 } 1934 }
1950 1935
1951 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 1936 virtual bool IsDeletable() const { return true; }
1952 }; 1937 };
1953 1938
1954 1939
1955 class HDeclareGlobals V8_FINAL : public HUnaryOperation { 1940 class HDeclareGlobals: public HUnaryOperation {
1956 public: 1941 public:
1957 HDeclareGlobals(HValue* context, 1942 HDeclareGlobals(HValue* context,
1958 Handle<FixedArray> pairs, 1943 Handle<FixedArray> pairs,
1959 int flags) 1944 int flags)
1960 : HUnaryOperation(context), 1945 : HUnaryOperation(context),
1961 pairs_(pairs), 1946 pairs_(pairs),
1962 flags_(flags) { 1947 flags_(flags) {
1963 set_representation(Representation::Tagged()); 1948 set_representation(Representation::Tagged());
1964 SetAllSideEffects(); 1949 SetAllSideEffects();
1965 } 1950 }
1966 1951
1967 static HDeclareGlobals* New(Zone* zone, 1952 static HDeclareGlobals* New(Zone* zone,
1968 HValue* context, 1953 HValue* context,
1969 Handle<FixedArray> pairs, 1954 Handle<FixedArray> pairs,
1970 int flags) { 1955 int flags) {
1971 return new(zone) HDeclareGlobals(context, pairs, flags); 1956 return new(zone) HDeclareGlobals(context, pairs, flags);
1972 } 1957 }
1973 1958
1974 HValue* context() { return OperandAt(0); } 1959 HValue* context() { return OperandAt(0); }
1975 Handle<FixedArray> pairs() const { return pairs_; } 1960 Handle<FixedArray> pairs() const { return pairs_; }
1976 int flags() const { return flags_; } 1961 int flags() const { return flags_; }
1977 1962
1978 DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals) 1963 DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals)
1979 1964
1980 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1965 virtual Representation RequiredInputRepresentation(int index) {
1981 return Representation::Tagged(); 1966 return Representation::Tagged();
1982 } 1967 }
1983 1968
1984 private: 1969 private:
1985 Handle<FixedArray> pairs_; 1970 Handle<FixedArray> pairs_;
1986 int flags_; 1971 int flags_;
1987 }; 1972 };
1988 1973
1989 1974
1990 class HGlobalObject V8_FINAL : public HUnaryOperation { 1975 class HGlobalObject: public HUnaryOperation {
1991 public: 1976 public:
1992 explicit HGlobalObject(HValue* context) : HUnaryOperation(context) { 1977 explicit HGlobalObject(HValue* context) : HUnaryOperation(context) {
1993 set_representation(Representation::Tagged()); 1978 set_representation(Representation::Tagged());
1994 SetFlag(kUseGVN); 1979 SetFlag(kUseGVN);
1995 } 1980 }
1996 1981
1997 static HGlobalObject* New(Zone* zone, HValue* context) { 1982 static HGlobalObject* New(Zone* zone, HValue* context) {
1998 return new(zone) HGlobalObject(context); 1983 return new(zone) HGlobalObject(context);
1999 } 1984 }
2000 1985
2001 DECLARE_CONCRETE_INSTRUCTION(GlobalObject) 1986 DECLARE_CONCRETE_INSTRUCTION(GlobalObject)
2002 1987
2003 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 1988 virtual Representation RequiredInputRepresentation(int index) {
2004 return Representation::Tagged(); 1989 return Representation::Tagged();
2005 } 1990 }
2006 1991
2007 protected: 1992 protected:
2008 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 1993 virtual bool DataEquals(HValue* other) { return true; }
2009 1994
2010 private: 1995 private:
2011 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 1996 virtual bool IsDeletable() const { return true; }
2012 }; 1997 };
2013 1998
2014 1999
2015 class HGlobalReceiver V8_FINAL : public HUnaryOperation { 2000 class HGlobalReceiver: public HUnaryOperation {
2016 public: 2001 public:
2017 DECLARE_INSTRUCTION_FACTORY_P1(HGlobalReceiver, HValue*); 2002 DECLARE_INSTRUCTION_FACTORY_P1(HGlobalReceiver, HValue*);
2018 2003
2019 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver) 2004 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver)
2020 2005
2021 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2006 virtual Representation RequiredInputRepresentation(int index) {
2022 return Representation::Tagged(); 2007 return Representation::Tagged();
2023 } 2008 }
2024 2009
2025 protected: 2010 protected:
2026 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 2011 virtual bool DataEquals(HValue* other) { return true; }
2027 2012
2028 private: 2013 private:
2029 explicit HGlobalReceiver(HValue* global_object) 2014 explicit HGlobalReceiver(HValue* global_object)
2030 : HUnaryOperation(global_object) { 2015 : HUnaryOperation(global_object) {
2031 set_representation(Representation::Tagged()); 2016 set_representation(Representation::Tagged());
2032 SetFlag(kUseGVN); 2017 SetFlag(kUseGVN);
2033 } 2018 }
2034 2019
2035 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 2020 virtual bool IsDeletable() const { return true; }
2036 }; 2021 };
2037 2022
2038 2023
2039 template <int V> 2024 template <int V>
2040 class HCall : public HTemplateInstruction<V> { 2025 class HCall: public HTemplateInstruction<V> {
2041 public: 2026 public:
2042 // The argument count includes the receiver. 2027 // The argument count includes the receiver.
2043 explicit HCall<V>(int argument_count) : argument_count_(argument_count) { 2028 explicit HCall<V>(int argument_count) : argument_count_(argument_count) {
2044 this->set_representation(Representation::Tagged()); 2029 this->set_representation(Representation::Tagged());
2045 this->SetAllSideEffects(); 2030 this->SetAllSideEffects();
2046 } 2031 }
2047 2032
2048 virtual HType CalculateInferredType() V8_FINAL V8_OVERRIDE { 2033 virtual HType CalculateInferredType() { return HType::Tagged(); }
2049 return HType::Tagged();
2050 }
2051 2034
2052 virtual int argument_count() const { return argument_count_; } 2035 virtual int argument_count() const { return argument_count_; }
2053 2036
2054 virtual bool IsCall() V8_FINAL V8_OVERRIDE { return true; } 2037 virtual bool IsCall() { return true; }
2055 2038
2056 private: 2039 private:
2057 int argument_count_; 2040 int argument_count_;
2058 }; 2041 };
2059 2042
2060 2043
2061 class HUnaryCall : public HCall<1> { 2044 class HUnaryCall: public HCall<1> {
2062 public: 2045 public:
2063 HUnaryCall(HValue* value, int argument_count) 2046 HUnaryCall(HValue* value, int argument_count)
2064 : HCall<1>(argument_count) { 2047 : HCall<1>(argument_count) {
2065 SetOperandAt(0, value); 2048 SetOperandAt(0, value);
2066 } 2049 }
2067 2050
2068 virtual Representation RequiredInputRepresentation( 2051 virtual Representation RequiredInputRepresentation(int index) {
2069 int index) V8_FINAL V8_OVERRIDE {
2070 return Representation::Tagged(); 2052 return Representation::Tagged();
2071 } 2053 }
2072 2054
2073 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 2055 virtual void PrintDataTo(StringStream* stream);
2074 2056
2075 HValue* value() { return OperandAt(0); } 2057 HValue* value() { return OperandAt(0); }
2076 }; 2058 };
2077 2059
2078 2060
2079 class HBinaryCall : public HCall<2> { 2061 class HBinaryCall: public HCall<2> {
2080 public: 2062 public:
2081 HBinaryCall(HValue* first, HValue* second, int argument_count) 2063 HBinaryCall(HValue* first, HValue* second, int argument_count)
2082 : HCall<2>(argument_count) { 2064 : HCall<2>(argument_count) {
2083 SetOperandAt(0, first); 2065 SetOperandAt(0, first);
2084 SetOperandAt(1, second); 2066 SetOperandAt(1, second);
2085 } 2067 }
2086 2068
2087 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 2069 virtual void PrintDataTo(StringStream* stream);
2088 2070
2089 virtual Representation RequiredInputRepresentation( 2071 virtual Representation RequiredInputRepresentation(int index) {
2090 int index) V8_FINAL V8_OVERRIDE {
2091 return Representation::Tagged(); 2072 return Representation::Tagged();
2092 } 2073 }
2093 2074
2094 HValue* first() { return OperandAt(0); } 2075 HValue* first() { return OperandAt(0); }
2095 HValue* second() { return OperandAt(1); } 2076 HValue* second() { return OperandAt(1); }
2096 }; 2077 };
2097 2078
2098 2079
2099 class HInvokeFunction V8_FINAL : public HBinaryCall { 2080 class HInvokeFunction: public HBinaryCall {
2100 public: 2081 public:
2101 HInvokeFunction(HValue* context, HValue* function, int argument_count) 2082 HInvokeFunction(HValue* context, HValue* function, int argument_count)
2102 : HBinaryCall(context, function, argument_count) { 2083 : HBinaryCall(context, function, argument_count) {
2103 } 2084 }
2104 2085
2105 static HInvokeFunction* New(Zone* zone, 2086 static HInvokeFunction* New(Zone* zone,
2106 HValue* context, 2087 HValue* context,
2107 HValue* function, 2088 HValue* function,
2108 int argument_count) { 2089 int argument_count) {
2109 return new(zone) HInvokeFunction(context, function, argument_count); 2090 return new(zone) HInvokeFunction(context, function, argument_count);
(...skipping 11 matching lines...) Expand all
2121 2102
2122 static HInvokeFunction* New(Zone* zone, 2103 static HInvokeFunction* New(Zone* zone,
2123 HValue* context, 2104 HValue* context,
2124 HValue* function, 2105 HValue* function,
2125 Handle<JSFunction> known_function, 2106 Handle<JSFunction> known_function,
2126 int argument_count) { 2107 int argument_count) {
2127 return new(zone) HInvokeFunction(context, function, 2108 return new(zone) HInvokeFunction(context, function,
2128 known_function, argument_count); 2109 known_function, argument_count);
2129 } 2110 }
2130 2111
2112 virtual Representation RequiredInputRepresentation(int index) {
2113 return Representation::Tagged();
2114 }
2115
2131 HValue* context() { return first(); } 2116 HValue* context() { return first(); }
2132 HValue* function() { return second(); } 2117 HValue* function() { return second(); }
2133 Handle<JSFunction> known_function() { return known_function_; } 2118 Handle<JSFunction> known_function() { return known_function_; }
2134 int formal_parameter_count() const { return formal_parameter_count_; } 2119 int formal_parameter_count() const { return formal_parameter_count_; }
2135 2120
2136 DECLARE_CONCRETE_INSTRUCTION(InvokeFunction) 2121 DECLARE_CONCRETE_INSTRUCTION(InvokeFunction)
2137 2122
2138 private: 2123 private:
2139 Handle<JSFunction> known_function_; 2124 Handle<JSFunction> known_function_;
2140 int formal_parameter_count_; 2125 int formal_parameter_count_;
2141 }; 2126 };
2142 2127
2143 2128
2144 class HCallConstantFunction V8_FINAL : public HCall<0> { 2129 class HCallConstantFunction: public HCall<0> {
2145 public: 2130 public:
2146 HCallConstantFunction(Handle<JSFunction> function, int argument_count) 2131 HCallConstantFunction(Handle<JSFunction> function, int argument_count)
2147 : HCall<0>(argument_count), 2132 : HCall<0>(argument_count),
2148 function_(function), 2133 function_(function),
2149 formal_parameter_count_(function->shared()->formal_parameter_count()) {} 2134 formal_parameter_count_(function->shared()->formal_parameter_count()) {}
2150 2135
2151 Handle<JSFunction> function() const { return function_; } 2136 Handle<JSFunction> function() const { return function_; }
2152 int formal_parameter_count() const { return formal_parameter_count_; } 2137 int formal_parameter_count() const { return formal_parameter_count_; }
2153 2138
2154 bool IsApplyFunction() const { 2139 bool IsApplyFunction() const {
2155 return function_->code() == 2140 return function_->code() ==
2156 Isolate::Current()->builtins()->builtin(Builtins::kFunctionApply); 2141 Isolate::Current()->builtins()->builtin(Builtins::kFunctionApply);
2157 } 2142 }
2158 2143
2159 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 2144 virtual void PrintDataTo(StringStream* stream);
2160 2145
2161 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2146 virtual Representation RequiredInputRepresentation(int index) {
2162 return Representation::None(); 2147 return Representation::None();
2163 } 2148 }
2164 2149
2165 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction) 2150 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction)
2166 2151
2167 private: 2152 private:
2168 Handle<JSFunction> function_; 2153 Handle<JSFunction> function_;
2169 int formal_parameter_count_; 2154 int formal_parameter_count_;
2170 }; 2155 };
2171 2156
2172 2157
2173 class HCallKeyed V8_FINAL : public HBinaryCall { 2158 class HCallKeyed: public HBinaryCall {
2174 public: 2159 public:
2175 HCallKeyed(HValue* context, HValue* key, int argument_count) 2160 HCallKeyed(HValue* context, HValue* key, int argument_count)
2176 : HBinaryCall(context, key, argument_count) { 2161 : HBinaryCall(context, key, argument_count) {
2177 } 2162 }
2178 2163
2164 virtual Representation RequiredInputRepresentation(int index) {
2165 return Representation::Tagged();
2166 }
2167
2179 HValue* context() { return first(); } 2168 HValue* context() { return first(); }
2180 HValue* key() { return second(); } 2169 HValue* key() { return second(); }
2181 2170
2182 DECLARE_CONCRETE_INSTRUCTION(CallKeyed) 2171 DECLARE_CONCRETE_INSTRUCTION(CallKeyed)
2183 }; 2172 };
2184 2173
2185 2174
2186 class HCallNamed V8_FINAL : public HUnaryCall { 2175 class HCallNamed: public HUnaryCall {
2187 public: 2176 public:
2188 HCallNamed(HValue* context, Handle<String> name, int argument_count) 2177 HCallNamed(HValue* context, Handle<String> name, int argument_count)
2189 : HUnaryCall(context, argument_count), name_(name) { 2178 : HUnaryCall(context, argument_count), name_(name) {
2190 } 2179 }
2191 2180
2192 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 2181 virtual void PrintDataTo(StringStream* stream);
2193 2182
2194 HValue* context() { return value(); } 2183 HValue* context() { return value(); }
2195 Handle<String> name() const { return name_; } 2184 Handle<String> name() const { return name_; }
2196 2185
2197 DECLARE_CONCRETE_INSTRUCTION(CallNamed) 2186 DECLARE_CONCRETE_INSTRUCTION(CallNamed)
2198 2187
2188 virtual Representation RequiredInputRepresentation(int index) {
2189 return Representation::Tagged();
2190 }
2191
2199 private: 2192 private:
2200 Handle<String> name_; 2193 Handle<String> name_;
2201 }; 2194 };
2202 2195
2203 2196
2204 class HCallFunction V8_FINAL : public HBinaryCall { 2197 class HCallFunction: public HBinaryCall {
2205 public: 2198 public:
2206 HCallFunction(HValue* context, HValue* function, int argument_count) 2199 HCallFunction(HValue* context, HValue* function, int argument_count)
2207 : HBinaryCall(context, function, argument_count) { 2200 : HBinaryCall(context, function, argument_count) {
2208 } 2201 }
2209 2202
2210 static HCallFunction* New(Zone* zone, 2203 static HCallFunction* New(Zone* zone,
2211 HValue* context, 2204 HValue* context,
2212 HValue* function, 2205 HValue* function,
2213 int argument_count) { 2206 int argument_count) {
2214 return new(zone) HCallFunction(context, function, argument_count); 2207 return new(zone) HCallFunction(context, function, argument_count);
2215 } 2208 }
2216 2209
2217 HValue* context() { return first(); } 2210 HValue* context() { return first(); }
2218 HValue* function() { return second(); } 2211 HValue* function() { return second(); }
2219 2212
2213 virtual Representation RequiredInputRepresentation(int index) {
2214 return Representation::Tagged();
2215 }
2216
2220 DECLARE_CONCRETE_INSTRUCTION(CallFunction) 2217 DECLARE_CONCRETE_INSTRUCTION(CallFunction)
2221 }; 2218 };
2222 2219
2223 2220
2224 class HCallGlobal V8_FINAL : public HUnaryCall { 2221 class HCallGlobal: public HUnaryCall {
2225 public: 2222 public:
2226 HCallGlobal(HValue* context, Handle<String> name, int argument_count) 2223 HCallGlobal(HValue* context, Handle<String> name, int argument_count)
2227 : HUnaryCall(context, argument_count), name_(name) { 2224 : HUnaryCall(context, argument_count), name_(name) {
2228 } 2225 }
2229 2226
2230 static HCallGlobal* New(Zone* zone, 2227 static HCallGlobal* New(Zone* zone,
2231 HValue* context, 2228 HValue* context,
2232 Handle<String> name, 2229 Handle<String> name,
2233 int argument_count) { 2230 int argument_count) {
2234 return new(zone) HCallGlobal(context, name, argument_count); 2231 return new(zone) HCallGlobal(context, name, argument_count);
2235 } 2232 }
2236 2233
2237 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 2234 virtual void PrintDataTo(StringStream* stream);
2238 2235
2239 HValue* context() { return value(); } 2236 HValue* context() { return value(); }
2240 Handle<String> name() const { return name_; } 2237 Handle<String> name() const { return name_; }
2241 2238
2239 virtual Representation RequiredInputRepresentation(int index) {
2240 return Representation::Tagged();
2241 }
2242
2242 DECLARE_CONCRETE_INSTRUCTION(CallGlobal) 2243 DECLARE_CONCRETE_INSTRUCTION(CallGlobal)
2243 2244
2244 private: 2245 private:
2245 Handle<String> name_; 2246 Handle<String> name_;
2246 }; 2247 };
2247 2248
2248 2249
2249 class HCallKnownGlobal V8_FINAL : public HCall<0> { 2250 class HCallKnownGlobal: public HCall<0> {
2250 public: 2251 public:
2251 HCallKnownGlobal(Handle<JSFunction> target, int argument_count) 2252 HCallKnownGlobal(Handle<JSFunction> target, int argument_count)
2252 : HCall<0>(argument_count), 2253 : HCall<0>(argument_count),
2253 target_(target), 2254 target_(target),
2254 formal_parameter_count_(target->shared()->formal_parameter_count()) { } 2255 formal_parameter_count_(target->shared()->formal_parameter_count()) { }
2255 2256
2256 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 2257 virtual void PrintDataTo(StringStream* stream);
2257 2258
2258 Handle<JSFunction> target() const { return target_; } 2259 Handle<JSFunction> target() const { return target_; }
2259 int formal_parameter_count() const { return formal_parameter_count_; } 2260 int formal_parameter_count() const { return formal_parameter_count_; }
2260 2261
2261 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2262 virtual Representation RequiredInputRepresentation(int index) {
2262 return Representation::None(); 2263 return Representation::None();
2263 } 2264 }
2264 2265
2265 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal) 2266 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal)
2266 2267
2267 private: 2268 private:
2268 Handle<JSFunction> target_; 2269 Handle<JSFunction> target_;
2269 int formal_parameter_count_; 2270 int formal_parameter_count_;
2270 }; 2271 };
2271 2272
2272 2273
2273 class HCallNew V8_FINAL : public HBinaryCall { 2274 class HCallNew: public HBinaryCall {
2274 public: 2275 public:
2275 HCallNew(HValue* context, HValue* constructor, int argument_count) 2276 HCallNew(HValue* context, HValue* constructor, int argument_count)
2276 : HBinaryCall(context, constructor, argument_count) {} 2277 : HBinaryCall(context, constructor, argument_count) {
2278 }
2279
2280 virtual Representation RequiredInputRepresentation(int index) {
2281 return Representation::Tagged();
2282 }
2277 2283
2278 HValue* context() { return first(); } 2284 HValue* context() { return first(); }
2279 HValue* constructor() { return second(); } 2285 HValue* constructor() { return second(); }
2280 2286
2281 DECLARE_CONCRETE_INSTRUCTION(CallNew) 2287 DECLARE_CONCRETE_INSTRUCTION(CallNew)
2282 }; 2288 };
2283 2289
2284 2290
2285 class HCallNewArray V8_FINAL : public HBinaryCall { 2291 class HCallNewArray: public HCallNew {
2286 public: 2292 public:
2287 HCallNewArray(HValue* context, HValue* constructor, int argument_count, 2293 HCallNewArray(HValue* context, HValue* constructor, int argument_count,
2288 Handle<Cell> type_cell, ElementsKind elements_kind) 2294 Handle<Cell> type_cell, ElementsKind elements_kind)
2289 : HBinaryCall(context, constructor, argument_count), 2295 : HCallNew(context, constructor, argument_count),
2290 elements_kind_(elements_kind), 2296 elements_kind_(elements_kind),
2291 type_cell_(type_cell) {} 2297 type_cell_(type_cell) {}
2292 2298
2293 HValue* context() { return first(); } 2299 virtual void PrintDataTo(StringStream* stream);
2294 HValue* constructor() { return second(); }
2295
2296 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
2297 2300
2298 Handle<Cell> property_cell() const { 2301 Handle<Cell> property_cell() const {
2299 return type_cell_; 2302 return type_cell_;
2300 } 2303 }
2301 2304
2302 ElementsKind elements_kind() const { return elements_kind_; } 2305 ElementsKind elements_kind() const { return elements_kind_; }
2303 2306
2304 DECLARE_CONCRETE_INSTRUCTION(CallNewArray) 2307 DECLARE_CONCRETE_INSTRUCTION(CallNewArray)
2305 2308
2306 private: 2309 private:
2307 ElementsKind elements_kind_; 2310 ElementsKind elements_kind_;
2308 Handle<Cell> type_cell_; 2311 Handle<Cell> type_cell_;
2309 }; 2312 };
2310 2313
2311 2314
2312 class HCallRuntime V8_FINAL : public HCall<1> { 2315 class HCallRuntime: public HCall<1> {
2313 public: 2316 public:
2314 static HCallRuntime* New(Zone* zone, 2317 static HCallRuntime* New(Zone* zone,
2315 HValue* context, 2318 HValue* context,
2316 Handle<String> name, 2319 Handle<String> name,
2317 const Runtime::Function* c_function, 2320 const Runtime::Function* c_function,
2318 int argument_count) { 2321 int argument_count) {
2319 return new(zone) HCallRuntime(context, name, c_function, argument_count); 2322 return new(zone) HCallRuntime(context, name, c_function, argument_count);
2320 } 2323 }
2321 2324
2322 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 2325 virtual void PrintDataTo(StringStream* stream);
2323 2326
2324 HValue* context() { return OperandAt(0); } 2327 HValue* context() { return OperandAt(0); }
2325 const Runtime::Function* function() const { return c_function_; } 2328 const Runtime::Function* function() const { return c_function_; }
2326 Handle<String> name() const { return name_; } 2329 Handle<String> name() const { return name_; }
2327 2330
2328 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2331 virtual Representation RequiredInputRepresentation(int index) {
2329 return Representation::Tagged(); 2332 return Representation::Tagged();
2330 } 2333 }
2331 2334
2332 DECLARE_CONCRETE_INSTRUCTION(CallRuntime) 2335 DECLARE_CONCRETE_INSTRUCTION(CallRuntime)
2333 2336
2334 private: 2337 private:
2335 HCallRuntime(HValue* context, 2338 HCallRuntime(HValue* context,
2336 Handle<String> name, 2339 Handle<String> name,
2337 const Runtime::Function* c_function, 2340 const Runtime::Function* c_function,
2338 int argument_count) 2341 int argument_count)
2339 : HCall<1>(argument_count), c_function_(c_function), name_(name) { 2342 : HCall<1>(argument_count), c_function_(c_function), name_(name) {
2340 SetOperandAt(0, context); 2343 SetOperandAt(0, context);
2341 } 2344 }
2342 2345
2343 const Runtime::Function* c_function_; 2346 const Runtime::Function* c_function_;
2344 Handle<String> name_; 2347 Handle<String> name_;
2345 }; 2348 };
2346 2349
2347 2350
2348 class HMapEnumLength V8_FINAL : public HUnaryOperation { 2351 class HMapEnumLength: public HUnaryOperation {
2349 public: 2352 public:
2350 DECLARE_INSTRUCTION_FACTORY_P1(HMapEnumLength, HValue*); 2353 DECLARE_INSTRUCTION_FACTORY_P1(HMapEnumLength, HValue*);
2351 2354
2352 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2355 virtual Representation RequiredInputRepresentation(int index) {
2353 return Representation::Tagged(); 2356 return Representation::Tagged();
2354 } 2357 }
2355 2358
2356 DECLARE_CONCRETE_INSTRUCTION(MapEnumLength) 2359 DECLARE_CONCRETE_INSTRUCTION(MapEnumLength)
2357 2360
2358 protected: 2361 protected:
2359 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 2362 virtual bool DataEquals(HValue* other) { return true; }
2360 2363
2361 private: 2364 private:
2362 explicit HMapEnumLength(HValue* value) 2365 explicit HMapEnumLength(HValue* value)
2363 : HUnaryOperation(value, HType::Smi()) { 2366 : HUnaryOperation(value, HType::Smi()) {
2364 set_representation(Representation::Smi()); 2367 set_representation(Representation::Smi());
2365 SetFlag(kUseGVN); 2368 SetFlag(kUseGVN);
2366 SetGVNFlag(kDependsOnMaps); 2369 SetGVNFlag(kDependsOnMaps);
2367 } 2370 }
2368 2371
2369 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 2372 virtual bool IsDeletable() const { return true; }
2370 }; 2373 };
2371 2374
2372 2375
2373 class HElementsKind V8_FINAL : public HUnaryOperation { 2376 class HElementsKind: public HUnaryOperation {
2374 public: 2377 public:
2375 explicit HElementsKind(HValue* value) : HUnaryOperation(value) { 2378 explicit HElementsKind(HValue* value) : HUnaryOperation(value) {
2376 set_representation(Representation::Integer32()); 2379 set_representation(Representation::Integer32());
2377 SetFlag(kUseGVN); 2380 SetFlag(kUseGVN);
2378 SetGVNFlag(kDependsOnElementsKind); 2381 SetGVNFlag(kDependsOnElementsKind);
2379 } 2382 }
2380 2383
2381 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2384 virtual Representation RequiredInputRepresentation(int index) {
2382 return Representation::Tagged(); 2385 return Representation::Tagged();
2383 } 2386 }
2384 2387
2385 DECLARE_CONCRETE_INSTRUCTION(ElementsKind) 2388 DECLARE_CONCRETE_INSTRUCTION(ElementsKind)
2386 2389
2387 protected: 2390 protected:
2388 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 2391 virtual bool DataEquals(HValue* other) { return true; }
2389 2392
2390 private: 2393 private:
2391 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 2394 virtual bool IsDeletable() const { return true; }
2392 }; 2395 };
2393 2396
2394 2397
2395 class HUnaryMathOperation V8_FINAL : public HTemplateInstruction<2> { 2398 class HUnaryMathOperation: public HTemplateInstruction<2> {
2396 public: 2399 public:
2397 static HInstruction* New(Zone* zone, 2400 static HInstruction* New(Zone* zone,
2398 HValue* context, 2401 HValue* context,
2399 HValue* value, 2402 HValue* value,
2400 BuiltinFunctionId op); 2403 BuiltinFunctionId op);
2401 2404
2402 HValue* context() { return OperandAt(0); } 2405 HValue* context() { return OperandAt(0); }
2403 HValue* value() { return OperandAt(1); } 2406 HValue* value() { return OperandAt(1); }
2404 2407
2405 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 2408 virtual void PrintDataTo(StringStream* stream);
2406 2409
2407 virtual HValue* EnsureAndPropagateNotMinusZero( 2410 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
2408 BitVector* visited) V8_OVERRIDE;
2409 2411
2410 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2412 virtual Representation RequiredInputRepresentation(int index) {
2411 if (index == 0) { 2413 if (index == 0) {
2412 return Representation::Tagged(); 2414 return Representation::Tagged();
2413 } else { 2415 } else {
2414 switch (op_) { 2416 switch (op_) {
2415 case kMathFloor: 2417 case kMathFloor:
2416 case kMathRound: 2418 case kMathRound:
2417 case kMathSqrt: 2419 case kMathSqrt:
2418 case kMathPowHalf: 2420 case kMathPowHalf:
2419 case kMathLog: 2421 case kMathLog:
2420 case kMathExp: 2422 case kMathExp:
2421 case kMathSin: 2423 case kMathSin:
2422 case kMathCos: 2424 case kMathCos:
2423 case kMathTan: 2425 case kMathTan:
2424 return Representation::Double(); 2426 return Representation::Double();
2425 case kMathAbs: 2427 case kMathAbs:
2426 return representation(); 2428 return representation();
2427 default: 2429 default:
2428 UNREACHABLE(); 2430 UNREACHABLE();
2429 return Representation::None(); 2431 return Representation::None();
2430 } 2432 }
2431 } 2433 }
2432 } 2434 }
2433 2435
2434 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 2436 virtual Range* InferRange(Zone* zone);
2435 2437
2436 virtual HValue* Canonicalize() V8_OVERRIDE; 2438 virtual HValue* Canonicalize();
2437 virtual Representation RepresentationFromInputs() V8_OVERRIDE; 2439 virtual Representation RepresentationFromInputs();
2438 2440
2439 BuiltinFunctionId op() const { return op_; } 2441 BuiltinFunctionId op() const { return op_; }
2440 const char* OpName() const; 2442 const char* OpName() const;
2441 2443
2442 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation) 2444 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation)
2443 2445
2444 protected: 2446 protected:
2445 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 2447 virtual bool DataEquals(HValue* other) {
2446 HUnaryMathOperation* b = HUnaryMathOperation::cast(other); 2448 HUnaryMathOperation* b = HUnaryMathOperation::cast(other);
2447 return op_ == b->op(); 2449 return op_ == b->op();
2448 } 2450 }
2449 2451
2450 private: 2452 private:
2451 HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op) 2453 HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op)
2452 : HTemplateInstruction<2>(HType::TaggedNumber()), op_(op) { 2454 : HTemplateInstruction<2>(HType::TaggedNumber()), op_(op) {
2453 SetOperandAt(0, context); 2455 SetOperandAt(0, context);
2454 SetOperandAt(1, value); 2456 SetOperandAt(1, value);
2455 switch (op) { 2457 switch (op) {
(...skipping 21 matching lines...) Expand all
2477 case kMathPowHalf: 2479 case kMathPowHalf:
2478 set_representation(Representation::Double()); 2480 set_representation(Representation::Double());
2479 break; 2481 break;
2480 default: 2482 default:
2481 UNREACHABLE(); 2483 UNREACHABLE();
2482 } 2484 }
2483 SetFlag(kUseGVN); 2485 SetFlag(kUseGVN);
2484 SetFlag(kAllowUndefinedAsNaN); 2486 SetFlag(kAllowUndefinedAsNaN);
2485 } 2487 }
2486 2488
2487 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 2489 virtual bool IsDeletable() const { return true; }
2488 2490
2489 BuiltinFunctionId op_; 2491 BuiltinFunctionId op_;
2490 }; 2492 };
2491 2493
2492 2494
2493 class HLoadExternalArrayPointer V8_FINAL : public HUnaryOperation { 2495 class HLoadExternalArrayPointer: public HUnaryOperation {
2494 public: 2496 public:
2495 DECLARE_INSTRUCTION_FACTORY_P1(HLoadExternalArrayPointer, HValue*); 2497 DECLARE_INSTRUCTION_FACTORY_P1(HLoadExternalArrayPointer, HValue*);
2496 2498
2497 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2499 virtual Representation RequiredInputRepresentation(int index) {
2498 return Representation::Tagged(); 2500 return Representation::Tagged();
2499 } 2501 }
2500 2502
2501 virtual HType CalculateInferredType() V8_OVERRIDE { 2503 virtual HType CalculateInferredType() {
2502 return HType::None(); 2504 return HType::None();
2503 } 2505 }
2504 2506
2505 DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer) 2507 DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer)
2506 2508
2507 protected: 2509 protected:
2508 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 2510 virtual bool DataEquals(HValue* other) { return true; }
2509 2511
2510 private: 2512 private:
2511 explicit HLoadExternalArrayPointer(HValue* value) 2513 explicit HLoadExternalArrayPointer(HValue* value)
2512 : HUnaryOperation(value) { 2514 : HUnaryOperation(value) {
2513 set_representation(Representation::External()); 2515 set_representation(Representation::External());
2514 // The result of this instruction is idempotent as long as its inputs don't 2516 // The result of this instruction is idempotent as long as its inputs don't
2515 // change. The external array of a specialized array elements object cannot 2517 // change. The external array of a specialized array elements object cannot
2516 // change once set, so it's no necessary to introduce any additional 2518 // change once set, so it's no necessary to introduce any additional
2517 // dependencies on top of the inputs. 2519 // dependencies on top of the inputs.
2518 SetFlag(kUseGVN); 2520 SetFlag(kUseGVN);
2519 } 2521 }
2520 2522
2521 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 2523 virtual bool IsDeletable() const { return true; }
2522 }; 2524 };
2523 2525
2524 2526
2525 class HCheckMaps V8_FINAL : public HTemplateInstruction<2> { 2527 class HCheckMaps: public HTemplateInstruction<2> {
2526 public: 2528 public:
2527 static HCheckMaps* New(Zone* zone, HValue* context, HValue* value, 2529 static HCheckMaps* New(Zone* zone, HValue* context, HValue* value,
2528 Handle<Map> map, CompilationInfo* info, 2530 Handle<Map> map, CompilationInfo* info,
2529 HValue *typecheck = NULL); 2531 HValue *typecheck = NULL);
2530 static HCheckMaps* New(Zone* zone, HValue* context, 2532 static HCheckMaps* New(Zone* zone, HValue* context,
2531 HValue* value, SmallMapList* maps, 2533 HValue* value, SmallMapList* maps,
2532 HValue *typecheck = NULL) { 2534 HValue *typecheck = NULL) {
2533 HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck); 2535 HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck);
2534 for (int i = 0; i < maps->length(); i++) { 2536 for (int i = 0; i < maps->length(); i++) {
2535 check_map->Add(maps->at(i), zone); 2537 check_map->Add(maps->at(i), zone);
2536 } 2538 }
2537 check_map->map_set_.Sort(); 2539 check_map->map_set_.Sort();
2538 return check_map; 2540 return check_map;
2539 } 2541 }
2540 2542
2541 bool CanOmitMapChecks() { return omit_; } 2543 bool CanOmitMapChecks() { return omit_; }
2542 2544
2543 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } 2545 virtual bool HasEscapingOperandAt(int index) { return false; }
2544 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2546 virtual Representation RequiredInputRepresentation(int index) {
2545 return Representation::Tagged(); 2547 return Representation::Tagged();
2546 } 2548 }
2547 virtual void HandleSideEffectDominator(GVNFlag side_effect, 2549 virtual void HandleSideEffectDominator(GVNFlag side_effect,
2548 HValue* dominator) V8_OVERRIDE; 2550 HValue* dominator);
2549 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 2551 virtual void PrintDataTo(StringStream* stream);
2550 2552
2551 HValue* value() { return OperandAt(0); } 2553 HValue* value() { return OperandAt(0); }
2552 SmallMapList* map_set() { return &map_set_; } 2554 SmallMapList* map_set() { return &map_set_; }
2553 2555
2554 bool has_migration_target() { 2556 bool has_migration_target() {
2555 return has_migration_target_; 2557 return has_migration_target_;
2556 } 2558 }
2557 2559
2558 virtual void FinalizeUniqueValueId() V8_OVERRIDE; 2560 virtual void FinalizeUniqueValueId();
2559 2561
2560 DECLARE_CONCRETE_INSTRUCTION(CheckMaps) 2562 DECLARE_CONCRETE_INSTRUCTION(CheckMaps)
2561 2563
2562 protected: 2564 protected:
2563 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 2565 virtual bool DataEquals(HValue* other) {
2564 ASSERT_EQ(map_set_.length(), map_unique_ids_.length()); 2566 ASSERT_EQ(map_set_.length(), map_unique_ids_.length());
2565 HCheckMaps* b = HCheckMaps::cast(other); 2567 HCheckMaps* b = HCheckMaps::cast(other);
2566 // Relies on the fact that map_set has been sorted before. 2568 // Relies on the fact that map_set has been sorted before.
2567 if (map_unique_ids_.length() != b->map_unique_ids_.length()) { 2569 if (map_unique_ids_.length() != b->map_unique_ids_.length()) {
2568 return false; 2570 return false;
2569 } 2571 }
2570 for (int i = 0; i < map_unique_ids_.length(); i++) { 2572 for (int i = 0; i < map_unique_ids_.length(); i++) {
2571 if (map_unique_ids_.at(i) != b->map_unique_ids_.at(i)) { 2573 if (map_unique_ids_.at(i) != b->map_unique_ids_.at(i)) {
2572 return false; 2574 return false;
2573 } 2575 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
2608 } 2610 }
2609 } 2611 }
2610 2612
2611 bool omit_; 2613 bool omit_;
2612 bool has_migration_target_; 2614 bool has_migration_target_;
2613 SmallMapList map_set_; 2615 SmallMapList map_set_;
2614 ZoneList<UniqueValueId> map_unique_ids_; 2616 ZoneList<UniqueValueId> map_unique_ids_;
2615 }; 2617 };
2616 2618
2617 2619
2618 class HCheckFunction V8_FINAL : public HUnaryOperation { 2620 class HCheckFunction: public HUnaryOperation {
2619 public: 2621 public:
2620 DECLARE_INSTRUCTION_FACTORY_P2(HCheckFunction, HValue*, Handle<JSFunction>); 2622 DECLARE_INSTRUCTION_FACTORY_P2(HCheckFunction, HValue*, Handle<JSFunction>);
2621 2623
2622 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2624 virtual Representation RequiredInputRepresentation(int index) {
2623 return Representation::Tagged(); 2625 return Representation::Tagged();
2624 } 2626 }
2625 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 2627 virtual void PrintDataTo(StringStream* stream);
2626 2628
2627 virtual HValue* Canonicalize() V8_OVERRIDE; 2629 virtual HValue* Canonicalize();
2628 2630
2629 #ifdef DEBUG 2631 #ifdef DEBUG
2630 virtual void Verify() V8_OVERRIDE; 2632 virtual void Verify();
2631 #endif 2633 #endif
2632 2634
2633 virtual void FinalizeUniqueValueId() V8_OVERRIDE { 2635 virtual void FinalizeUniqueValueId() {
2634 target_unique_id_ = UniqueValueId(target_); 2636 target_unique_id_ = UniqueValueId(target_);
2635 } 2637 }
2636 2638
2637 Handle<JSFunction> target() const { return target_; } 2639 Handle<JSFunction> target() const { return target_; }
2638 bool target_in_new_space() const { return target_in_new_space_; } 2640 bool target_in_new_space() const { return target_in_new_space_; }
2639 2641
2640 DECLARE_CONCRETE_INSTRUCTION(CheckFunction) 2642 DECLARE_CONCRETE_INSTRUCTION(CheckFunction)
2641 2643
2642 protected: 2644 protected:
2643 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 2645 virtual bool DataEquals(HValue* other) {
2644 HCheckFunction* b = HCheckFunction::cast(other); 2646 HCheckFunction* b = HCheckFunction::cast(other);
2645 return target_unique_id_ == b->target_unique_id_; 2647 return target_unique_id_ == b->target_unique_id_;
2646 } 2648 }
2647 2649
2648 private: 2650 private:
2649 HCheckFunction(HValue* value, Handle<JSFunction> function) 2651 HCheckFunction(HValue* value, Handle<JSFunction> function)
2650 : HUnaryOperation(value, value->type()), 2652 : HUnaryOperation(value, value->type()),
2651 target_(function), target_unique_id_() { 2653 target_(function), target_unique_id_() {
2652 set_representation(Representation::Tagged()); 2654 set_representation(Representation::Tagged());
2653 SetFlag(kUseGVN); 2655 SetFlag(kUseGVN);
2654 target_in_new_space_ = Isolate::Current()->heap()->InNewSpace(*function); 2656 target_in_new_space_ = Isolate::Current()->heap()->InNewSpace(*function);
2655 } 2657 }
2656 2658
2657 Handle<JSFunction> target_; 2659 Handle<JSFunction> target_;
2658 UniqueValueId target_unique_id_; 2660 UniqueValueId target_unique_id_;
2659 bool target_in_new_space_; 2661 bool target_in_new_space_;
2660 }; 2662 };
2661 2663
2662 2664
2663 class HCheckInstanceType V8_FINAL : public HUnaryOperation { 2665 class HCheckInstanceType: public HUnaryOperation {
2664 public: 2666 public:
2665 static HCheckInstanceType* NewIsSpecObject(HValue* value, Zone* zone) { 2667 static HCheckInstanceType* NewIsSpecObject(HValue* value, Zone* zone) {
2666 return new(zone) HCheckInstanceType(value, IS_SPEC_OBJECT); 2668 return new(zone) HCheckInstanceType(value, IS_SPEC_OBJECT);
2667 } 2669 }
2668 static HCheckInstanceType* NewIsJSArray(HValue* value, Zone* zone) { 2670 static HCheckInstanceType* NewIsJSArray(HValue* value, Zone* zone) {
2669 return new(zone) HCheckInstanceType(value, IS_JS_ARRAY); 2671 return new(zone) HCheckInstanceType(value, IS_JS_ARRAY);
2670 } 2672 }
2671 static HCheckInstanceType* NewIsString(HValue* value, Zone* zone) { 2673 static HCheckInstanceType* NewIsString(HValue* value, Zone* zone) {
2672 return new(zone) HCheckInstanceType(value, IS_STRING); 2674 return new(zone) HCheckInstanceType(value, IS_STRING);
2673 } 2675 }
2674 static HCheckInstanceType* NewIsInternalizedString( 2676 static HCheckInstanceType* NewIsInternalizedString(
2675 HValue* value, Zone* zone) { 2677 HValue* value, Zone* zone) {
2676 return new(zone) HCheckInstanceType(value, IS_INTERNALIZED_STRING); 2678 return new(zone) HCheckInstanceType(value, IS_INTERNALIZED_STRING);
2677 } 2679 }
2678 2680
2679 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 2681 virtual void PrintDataTo(StringStream* stream);
2680 2682
2681 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2683 virtual Representation RequiredInputRepresentation(int index) {
2682 return Representation::Tagged(); 2684 return Representation::Tagged();
2683 } 2685 }
2684 2686
2685 virtual HValue* Canonicalize() V8_OVERRIDE; 2687 virtual HValue* Canonicalize();
2686 2688
2687 bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; } 2689 bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; }
2688 void GetCheckInterval(InstanceType* first, InstanceType* last); 2690 void GetCheckInterval(InstanceType* first, InstanceType* last);
2689 void GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag); 2691 void GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag);
2690 2692
2691 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType) 2693 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType)
2692 2694
2693 protected: 2695 protected:
2694 // TODO(ager): It could be nice to allow the ommision of instance 2696 // TODO(ager): It could be nice to allow the ommision of instance
2695 // type checks if we have already performed an instance type check 2697 // type checks if we have already performed an instance type check
2696 // with a larger range. 2698 // with a larger range.
2697 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 2699 virtual bool DataEquals(HValue* other) {
2698 HCheckInstanceType* b = HCheckInstanceType::cast(other); 2700 HCheckInstanceType* b = HCheckInstanceType::cast(other);
2699 return check_ == b->check_; 2701 return check_ == b->check_;
2700 } 2702 }
2701 2703
2702 private: 2704 private:
2703 enum Check { 2705 enum Check {
2704 IS_SPEC_OBJECT, 2706 IS_SPEC_OBJECT,
2705 IS_JS_ARRAY, 2707 IS_JS_ARRAY,
2706 IS_STRING, 2708 IS_STRING,
2707 IS_INTERNALIZED_STRING, 2709 IS_INTERNALIZED_STRING,
2708 LAST_INTERVAL_CHECK = IS_JS_ARRAY 2710 LAST_INTERVAL_CHECK = IS_JS_ARRAY
2709 }; 2711 };
2710 2712
2711 const char* GetCheckName(); 2713 const char* GetCheckName();
2712 2714
2713 HCheckInstanceType(HValue* value, Check check) 2715 HCheckInstanceType(HValue* value, Check check)
2714 : HUnaryOperation(value), check_(check) { 2716 : HUnaryOperation(value), check_(check) {
2715 set_representation(Representation::Tagged()); 2717 set_representation(Representation::Tagged());
2716 SetFlag(kUseGVN); 2718 SetFlag(kUseGVN);
2717 } 2719 }
2718 2720
2719 const Check check_; 2721 const Check check_;
2720 }; 2722 };
2721 2723
2722 2724
2723 class HCheckSmi V8_FINAL : public HUnaryOperation { 2725 class HCheckSmi: public HUnaryOperation {
2724 public: 2726 public:
2725 DECLARE_INSTRUCTION_FACTORY_P1(HCheckSmi, HValue*); 2727 DECLARE_INSTRUCTION_FACTORY_P1(HCheckSmi, HValue*);
2726 2728
2727 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2729 virtual Representation RequiredInputRepresentation(int index) {
2728 return Representation::Tagged(); 2730 return Representation::Tagged();
2729 } 2731 }
2730 2732
2731 virtual HValue* Canonicalize() V8_OVERRIDE { 2733 virtual HValue* Canonicalize() {
2732 HType value_type = value()->type(); 2734 HType value_type = value()->type();
2733 if (value_type.IsSmi()) { 2735 if (value_type.IsSmi()) {
2734 return NULL; 2736 return NULL;
2735 } 2737 }
2736 return this; 2738 return this;
2737 } 2739 }
2738 2740
2739 DECLARE_CONCRETE_INSTRUCTION(CheckSmi) 2741 DECLARE_CONCRETE_INSTRUCTION(CheckSmi)
2740 2742
2741 protected: 2743 protected:
2742 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 2744 virtual bool DataEquals(HValue* other) { return true; }
2743 2745
2744 private: 2746 private:
2745 explicit HCheckSmi(HValue* value) : HUnaryOperation(value, HType::Smi()) { 2747 explicit HCheckSmi(HValue* value) : HUnaryOperation(value, HType::Smi()) {
2746 set_representation(Representation::Smi()); 2748 set_representation(Representation::Smi());
2747 SetFlag(kUseGVN); 2749 SetFlag(kUseGVN);
2748 } 2750 }
2749 }; 2751 };
2750 2752
2751 2753
2752 class HIsNumberAndBranch V8_FINAL : public HUnaryControlInstruction { 2754 class HIsNumberAndBranch: public HUnaryControlInstruction {
2753 public: 2755 public:
2754 explicit HIsNumberAndBranch(HValue* value) 2756 explicit HIsNumberAndBranch(HValue* value)
2755 : HUnaryControlInstruction(value, NULL, NULL) { 2757 : HUnaryControlInstruction(value, NULL, NULL) {
2756 SetFlag(kFlexibleRepresentation); 2758 SetFlag(kFlexibleRepresentation);
2757 } 2759 }
2758 2760
2759 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2761 virtual Representation RequiredInputRepresentation(int index) {
2760 return Representation::None(); 2762 return Representation::None();
2761 } 2763 }
2762 2764
2763 DECLARE_CONCRETE_INSTRUCTION(IsNumberAndBranch) 2765 DECLARE_CONCRETE_INSTRUCTION(IsNumberAndBranch)
2764 }; 2766 };
2765 2767
2766 2768
2767 class HCheckHeapObject V8_FINAL : public HUnaryOperation { 2769 class HCheckHeapObject: public HUnaryOperation {
2768 public: 2770 public:
2769 DECLARE_INSTRUCTION_FACTORY_P1(HCheckHeapObject, HValue*); 2771 DECLARE_INSTRUCTION_FACTORY_P1(HCheckHeapObject, HValue*);
2770 2772
2771 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } 2773 virtual bool HasEscapingOperandAt(int index) { return false; }
2772 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2774 virtual Representation RequiredInputRepresentation(int index) {
2773 return Representation::Tagged(); 2775 return Representation::Tagged();
2774 } 2776 }
2775 2777
2776 #ifdef DEBUG 2778 #ifdef DEBUG
2777 virtual void Verify() V8_OVERRIDE; 2779 virtual void Verify();
2778 #endif 2780 #endif
2779 2781
2780 virtual HValue* Canonicalize() V8_OVERRIDE { 2782 virtual HValue* Canonicalize() {
2781 return value()->type().IsHeapObject() ? NULL : this; 2783 return value()->type().IsHeapObject() ? NULL : this;
2782 } 2784 }
2783 2785
2784 DECLARE_CONCRETE_INSTRUCTION(CheckHeapObject) 2786 DECLARE_CONCRETE_INSTRUCTION(CheckHeapObject)
2785 2787
2786 protected: 2788 protected:
2787 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 2789 virtual bool DataEquals(HValue* other) { return true; }
2788 2790
2789 private: 2791 private:
2790 explicit HCheckHeapObject(HValue* value) 2792 explicit HCheckHeapObject(HValue* value)
2791 : HUnaryOperation(value, HType::NonPrimitive()) { 2793 : HUnaryOperation(value, HType::NonPrimitive()) {
2792 set_representation(Representation::Tagged()); 2794 set_representation(Representation::Tagged());
2793 SetFlag(kUseGVN); 2795 SetFlag(kUseGVN);
2794 } 2796 }
2795 }; 2797 };
2796 2798
2797 2799
(...skipping 11 matching lines...) Expand all
2809 limit_is_upper(false), limit_is_included(false) {} 2811 limit_is_upper(false), limit_is_included(false) {}
2810 }; 2812 };
2811 2813
2812 2814
2813 class HBoundsCheck; 2815 class HBoundsCheck;
2814 class HPhi; 2816 class HPhi;
2815 class HConstant; 2817 class HConstant;
2816 class HBitwise; 2818 class HBitwise;
2817 2819
2818 2820
2819 class InductionVariableData V8_FINAL : public ZoneObject { 2821 class InductionVariableData : public ZoneObject {
2820 public: 2822 public:
2821 class InductionVariableCheck : public ZoneObject { 2823 class InductionVariableCheck : public ZoneObject {
2822 public: 2824 public:
2823 HBoundsCheck* check() { return check_; } 2825 HBoundsCheck* check() { return check_; }
2824 InductionVariableCheck* next() { return next_; } 2826 InductionVariableCheck* next() { return next_; }
2825 bool HasUpperLimit() { return upper_limit_ >= 0; } 2827 bool HasUpperLimit() { return upper_limit_ >= 0; }
2826 int32_t upper_limit() { 2828 int32_t upper_limit() {
2827 ASSERT(HasUpperLimit()); 2829 ASSERT(HasUpperLimit());
2828 return upper_limit_; 2830 return upper_limit_;
2829 } 2831 }
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
3009 HBasicBlock* induction_exit_block_; 3011 HBasicBlock* induction_exit_block_;
3010 HBasicBlock* induction_exit_target_; 3012 HBasicBlock* induction_exit_target_;
3011 ChecksRelatedToLength* checks_; 3013 ChecksRelatedToLength* checks_;
3012 HValue* additional_upper_limit_; 3014 HValue* additional_upper_limit_;
3013 bool additional_upper_limit_is_included_; 3015 bool additional_upper_limit_is_included_;
3014 HValue* additional_lower_limit_; 3016 HValue* additional_lower_limit_;
3015 bool additional_lower_limit_is_included_; 3017 bool additional_lower_limit_is_included_;
3016 }; 3018 };
3017 3019
3018 3020
3019 class HPhi V8_FINAL : public HValue { 3021 class HPhi: public HValue {
3020 public: 3022 public:
3021 HPhi(int merged_index, Zone* zone) 3023 HPhi(int merged_index, Zone* zone)
3022 : inputs_(2, zone), 3024 : inputs_(2, zone),
3023 merged_index_(merged_index), 3025 merged_index_(merged_index),
3024 phi_id_(-1), 3026 phi_id_(-1),
3025 induction_variable_data_(NULL) { 3027 induction_variable_data_(NULL) {
3026 for (int i = 0; i < Representation::kNumRepresentations; i++) { 3028 for (int i = 0; i < Representation::kNumRepresentations; i++) {
3027 non_phi_uses_[i] = 0; 3029 non_phi_uses_[i] = 0;
3028 indirect_uses_[i] = 0; 3030 indirect_uses_[i] = 0;
3029 } 3031 }
3030 ASSERT(merged_index >= 0 || merged_index == kInvalidMergedIndex); 3032 ASSERT(merged_index >= 0 || merged_index == kInvalidMergedIndex);
3031 SetFlag(kFlexibleRepresentation); 3033 SetFlag(kFlexibleRepresentation);
3032 SetFlag(kAllowUndefinedAsNaN); 3034 SetFlag(kAllowUndefinedAsNaN);
3033 } 3035 }
3034 3036
3035 virtual Representation RepresentationFromInputs() V8_OVERRIDE; 3037 virtual Representation RepresentationFromInputs();
3036 3038
3037 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 3039 virtual Range* InferRange(Zone* zone);
3038 virtual void InferRepresentation( 3040 virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
3039 HInferRepresentationPhase* h_infer) V8_OVERRIDE; 3041 virtual Representation RequiredInputRepresentation(int index) {
3040 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
3041 return representation(); 3042 return representation();
3042 } 3043 }
3043 virtual Representation KnownOptimalRepresentation() V8_OVERRIDE { 3044 virtual Representation KnownOptimalRepresentation() {
3044 return representation(); 3045 return representation();
3045 } 3046 }
3046 virtual HType CalculateInferredType() V8_OVERRIDE; 3047 virtual HType CalculateInferredType();
3047 virtual int OperandCount() V8_OVERRIDE { return inputs_.length(); } 3048 virtual int OperandCount() { return inputs_.length(); }
3048 virtual HValue* OperandAt(int index) const V8_OVERRIDE { 3049 virtual HValue* OperandAt(int index) const { return inputs_[index]; }
3049 return inputs_[index];
3050 }
3051 HValue* GetRedundantReplacement(); 3050 HValue* GetRedundantReplacement();
3052 void AddInput(HValue* value); 3051 void AddInput(HValue* value);
3053 bool HasRealUses(); 3052 bool HasRealUses();
3054 3053
3055 bool IsReceiver() const { return merged_index_ == 0; } 3054 bool IsReceiver() const { return merged_index_ == 0; }
3056 bool HasMergedIndex() const { return merged_index_ != kInvalidMergedIndex; } 3055 bool HasMergedIndex() const { return merged_index_ != kInvalidMergedIndex; }
3057 3056
3058 int merged_index() const { return merged_index_; } 3057 int merged_index() const { return merged_index_; }
3059 3058
3060 InductionVariableData* induction_variable_data() { 3059 InductionVariableData* induction_variable_data() {
3061 return induction_variable_data_; 3060 return induction_variable_data_;
3062 } 3061 }
3063 bool IsInductionVariable() { 3062 bool IsInductionVariable() {
3064 return induction_variable_data_ != NULL; 3063 return induction_variable_data_ != NULL;
3065 } 3064 }
3066 bool IsLimitedInductionVariable() { 3065 bool IsLimitedInductionVariable() {
3067 return IsInductionVariable() && 3066 return IsInductionVariable() &&
3068 induction_variable_data_->limit() != NULL; 3067 induction_variable_data_->limit() != NULL;
3069 } 3068 }
3070 void DetectInductionVariable() { 3069 void DetectInductionVariable() {
3071 ASSERT(induction_variable_data_ == NULL); 3070 ASSERT(induction_variable_data_ == NULL);
3072 induction_variable_data_ = InductionVariableData::ExaminePhi(this); 3071 induction_variable_data_ = InductionVariableData::ExaminePhi(this);
3073 } 3072 }
3074 3073
3075 virtual void PrintTo(StringStream* stream) V8_OVERRIDE; 3074 virtual void PrintTo(StringStream* stream);
3076 3075
3077 #ifdef DEBUG 3076 #ifdef DEBUG
3078 virtual void Verify() V8_OVERRIDE; 3077 virtual void Verify();
3079 #endif 3078 #endif
3080 3079
3081 void InitRealUses(int id); 3080 void InitRealUses(int id);
3082 void AddNonPhiUsesFrom(HPhi* other); 3081 void AddNonPhiUsesFrom(HPhi* other);
3083 void AddIndirectUsesTo(int* use_count); 3082 void AddIndirectUsesTo(int* use_count);
3084 3083
3085 int tagged_non_phi_uses() const { 3084 int tagged_non_phi_uses() const {
3086 return non_phi_uses_[Representation::kTagged]; 3085 return non_phi_uses_[Representation::kTagged];
3087 } 3086 }
3088 int smi_non_phi_uses() const { 3087 int smi_non_phi_uses() const {
(...skipping 16 matching lines...) Expand all
3105 } 3104 }
3106 int double_indirect_uses() const { 3105 int double_indirect_uses() const {
3107 return indirect_uses_[Representation::kDouble]; 3106 return indirect_uses_[Representation::kDouble];
3108 } 3107 }
3109 int phi_id() { return phi_id_; } 3108 int phi_id() { return phi_id_; }
3110 3109
3111 static HPhi* cast(HValue* value) { 3110 static HPhi* cast(HValue* value) {
3112 ASSERT(value->IsPhi()); 3111 ASSERT(value->IsPhi());
3113 return reinterpret_cast<HPhi*>(value); 3112 return reinterpret_cast<HPhi*>(value);
3114 } 3113 }
3115 virtual Opcode opcode() const V8_OVERRIDE { return HValue::kPhi; } 3114 virtual Opcode opcode() const { return HValue::kPhi; }
3116 3115
3117 void SimplifyConstantInputs(); 3116 void SimplifyConstantInputs();
3118 3117
3119 // Marker value representing an invalid merge index. 3118 // Marker value representing an invalid merge index.
3120 static const int kInvalidMergedIndex = -1; 3119 static const int kInvalidMergedIndex = -1;
3121 3120
3122 protected: 3121 protected:
3123 virtual void DeleteFromGraph() V8_OVERRIDE; 3122 virtual void DeleteFromGraph();
3124 virtual void InternalSetOperandAt(int index, HValue* value) V8_OVERRIDE { 3123 virtual void InternalSetOperandAt(int index, HValue* value) {
3125 inputs_[index] = value; 3124 inputs_[index] = value;
3126 } 3125 }
3127 3126
3128 private: 3127 private:
3129 ZoneList<HValue*> inputs_; 3128 ZoneList<HValue*> inputs_;
3130 int merged_index_; 3129 int merged_index_;
3131 3130
3132 int non_phi_uses_[Representation::kNumRepresentations]; 3131 int non_phi_uses_[Representation::kNumRepresentations];
3133 int indirect_uses_[Representation::kNumRepresentations]; 3132 int indirect_uses_[Representation::kNumRepresentations];
3134 int phi_id_; 3133 int phi_id_;
3135 InductionVariableData* induction_variable_data_; 3134 InductionVariableData* induction_variable_data_;
3136 3135
3137 // TODO(titzer): we can't eliminate the receiver for generating backtraces 3136 // TODO(titzer): we can't eliminate the receiver for generating backtraces
3138 virtual bool IsDeletable() const V8_OVERRIDE { return !IsReceiver(); } 3137 virtual bool IsDeletable() const { return !IsReceiver(); }
3139 }; 3138 };
3140 3139
3141 3140
3142 // Common base class for HArgumentsObject and HCapturedObject. 3141 // Common base class for HArgumentsObject and HCapturedObject.
3143 class HDematerializedObject : public HInstruction { 3142 class HDematerializedObject: public HTemplateInstruction<0> {
3144 public: 3143 public:
3145 HDematerializedObject(int count, Zone* zone) : values_(count, zone) {} 3144 HDematerializedObject(int count, Zone* zone) : values_(count, zone) {}
3146 3145
3147 virtual int OperandCount() V8_FINAL V8_OVERRIDE { return values_.length(); } 3146 virtual int OperandCount() { return values_.length(); }
3148 virtual HValue* OperandAt(int index) const V8_FINAL V8_OVERRIDE { 3147 virtual HValue* OperandAt(int index) const { return values_[index]; }
3149 return values_[index];
3150 }
3151 3148
3152 virtual bool HasEscapingOperandAt(int index) V8_FINAL V8_OVERRIDE { 3149 virtual bool HasEscapingOperandAt(int index) { return false; }
3153 return false; 3150 virtual Representation RequiredInputRepresentation(int index) {
3154 }
3155 virtual Representation RequiredInputRepresentation(
3156 int index) V8_FINAL V8_OVERRIDE {
3157 return Representation::None(); 3151 return Representation::None();
3158 } 3152 }
3159 3153
3160 protected: 3154 protected:
3161 virtual void InternalSetOperandAt(int index, 3155 virtual void InternalSetOperandAt(int index, HValue* value) {
3162 HValue* value) V8_FINAL V8_OVERRIDE {
3163 values_[index] = value; 3156 values_[index] = value;
3164 } 3157 }
3165 3158
3166 // List of values tracked by this marker. 3159 // List of values tracked by this marker.
3167 ZoneList<HValue*> values_; 3160 ZoneList<HValue*> values_;
3168 3161
3169 private: 3162 private:
3170 virtual bool IsDeletable() const V8_FINAL V8_OVERRIDE { return true; } 3163 virtual bool IsDeletable() const { return true; }
3171 }; 3164 };
3172 3165
3173 3166
3174 class HArgumentsObject V8_FINAL : public HDematerializedObject { 3167 class HArgumentsObject: public HDematerializedObject {
3175 public: 3168 public:
3176 static HArgumentsObject* New(Zone* zone, HValue* context, int count) { 3169 static HArgumentsObject* New(Zone* zone, HValue* context, int count) {
3177 return new(zone) HArgumentsObject(count, zone); 3170 return new(zone) HArgumentsObject(count, zone);
3178 } 3171 }
3179 3172
3180 // The values contain a list of all elements in the arguments object 3173 // The values contain a list of all elements in the arguments object
3181 // including the receiver object, which is skipped when materializing. 3174 // including the receiver object, which is skipped when materializing.
3182 const ZoneList<HValue*>* arguments_values() const { return &values_; } 3175 const ZoneList<HValue*>* arguments_values() const { return &values_; }
3183 int arguments_count() const { return values_.length(); } 3176 int arguments_count() const { return values_.length(); }
3184 3177
3185 void AddArgument(HValue* argument, Zone* zone) { 3178 void AddArgument(HValue* argument, Zone* zone) {
3186 values_.Add(NULL, zone); // Resize list. 3179 values_.Add(NULL, zone); // Resize list.
3187 SetOperandAt(values_.length() - 1, argument); 3180 SetOperandAt(values_.length() - 1, argument);
3188 } 3181 }
3189 3182
3190 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) 3183 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject)
3191 3184
3192 private: 3185 private:
3193 HArgumentsObject(int count, Zone* zone) 3186 HArgumentsObject(int count, Zone* zone)
3194 : HDematerializedObject(count, zone) { 3187 : HDematerializedObject(count, zone) {
3195 set_representation(Representation::Tagged()); 3188 set_representation(Representation::Tagged());
3196 SetFlag(kIsArguments); 3189 SetFlag(kIsArguments);
3197 } 3190 }
3198 }; 3191 };
3199 3192
3200 3193
3201 class HCapturedObject V8_FINAL : public HDematerializedObject { 3194 class HCapturedObject: public HDematerializedObject {
3202 public: 3195 public:
3203 HCapturedObject(int length, Zone* zone) 3196 HCapturedObject(int length, Zone* zone)
3204 : HDematerializedObject(length, zone) { 3197 : HDematerializedObject(length, zone) {
3205 set_representation(Representation::Tagged()); 3198 set_representation(Representation::Tagged());
3206 values_.AddBlock(NULL, length, zone); // Resize list. 3199 values_.AddBlock(NULL, length, zone); // Resize list.
3207 } 3200 }
3208 3201
3209 // The values contain a list of all in-object properties inside the 3202 // The values contain a list of all in-object properties inside the
3210 // captured object and is index by field index. Properties in the 3203 // captured object and is index by field index. Properties in the
3211 // properties or elements backing store are not tracked here. 3204 // properties or elements backing store are not tracked here.
3212 const ZoneList<HValue*>* values() const { return &values_; } 3205 const ZoneList<HValue*>* values() const { return &values_; }
3213 int length() const { return values_.length(); } 3206 int length() const { return values_.length(); }
3214 3207
3215 DECLARE_CONCRETE_INSTRUCTION(CapturedObject) 3208 DECLARE_CONCRETE_INSTRUCTION(CapturedObject)
3216 }; 3209 };
3217 3210
3218 3211
3219 class HConstant V8_FINAL : public HTemplateInstruction<0> { 3212 class HConstant: public HTemplateInstruction<0> {
3220 public: 3213 public:
3221 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, int32_t); 3214 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, int32_t);
3222 DECLARE_INSTRUCTION_FACTORY_P2(HConstant, int32_t, Representation); 3215 DECLARE_INSTRUCTION_FACTORY_P2(HConstant, int32_t, Representation);
3223 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, double); 3216 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, double);
3224 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, Handle<Object>); 3217 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, Handle<Object>);
3225 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, ExternalReference); 3218 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, ExternalReference);
3226 3219
3227 Handle<Object> handle() { 3220 Handle<Object> handle() {
3228 if (handle_.is_null()) { 3221 if (handle_.is_null()) {
3229 Factory* factory = Isolate::Current()->factory(); 3222 Factory* factory = Isolate::Current()->factory();
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
3276 unique_id_ == UniqueValueId(heap->true_value()) || 3269 unique_id_ == UniqueValueId(heap->true_value()) ||
3277 unique_id_ == UniqueValueId(heap->false_value()) || 3270 unique_id_ == UniqueValueId(heap->false_value()) ||
3278 unique_id_ == UniqueValueId(heap->the_hole_value()) || 3271 unique_id_ == UniqueValueId(heap->the_hole_value()) ||
3279 unique_id_ == UniqueValueId(heap->empty_string()); 3272 unique_id_ == UniqueValueId(heap->empty_string());
3280 } 3273 }
3281 3274
3282 bool IsCell() const { 3275 bool IsCell() const {
3283 return is_cell_; 3276 return is_cell_;
3284 } 3277 }
3285 3278
3286 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3279 virtual Representation RequiredInputRepresentation(int index) {
3287 return Representation::None(); 3280 return Representation::None();
3288 } 3281 }
3289 3282
3290 virtual Representation KnownOptimalRepresentation() V8_OVERRIDE { 3283 virtual Representation KnownOptimalRepresentation() {
3291 if (HasSmiValue() && kSmiValueSize == 31) return Representation::Smi(); 3284 if (HasSmiValue() && kSmiValueSize == 31) return Representation::Smi();
3292 if (HasInteger32Value()) return Representation::Integer32(); 3285 if (HasInteger32Value()) return Representation::Integer32();
3293 if (HasNumberValue()) return Representation::Double(); 3286 if (HasNumberValue()) return Representation::Double();
3294 if (HasExternalReferenceValue()) return Representation::External(); 3287 if (HasExternalReferenceValue()) return Representation::External();
3295 return Representation::Tagged(); 3288 return Representation::Tagged();
3296 } 3289 }
3297 3290
3298 virtual bool EmitAtUses() V8_OVERRIDE; 3291 virtual bool EmitAtUses();
3299 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 3292 virtual void PrintDataTo(StringStream* stream);
3300 bool IsInteger() { return handle()->IsSmi(); } 3293 bool IsInteger() { return handle()->IsSmi(); }
3301 HConstant* CopyToRepresentation(Representation r, Zone* zone) const; 3294 HConstant* CopyToRepresentation(Representation r, Zone* zone) const;
3302 Maybe<HConstant*> CopyToTruncatedInt32(Zone* zone); 3295 Maybe<HConstant*> CopyToTruncatedInt32(Zone* zone);
3303 Maybe<HConstant*> CopyToTruncatedNumber(Zone* zone); 3296 Maybe<HConstant*> CopyToTruncatedNumber(Zone* zone);
3304 bool HasInteger32Value() const { return has_int32_value_; } 3297 bool HasInteger32Value() const { return has_int32_value_; }
3305 int32_t Integer32Value() const { 3298 int32_t Integer32Value() const {
3306 ASSERT(HasInteger32Value()); 3299 ASSERT(HasInteger32Value());
3307 return int32_value_; 3300 return int32_value_;
3308 } 3301 }
3309 bool HasSmiValue() const { return has_smi_value_; } 3302 bool HasSmiValue() const { return has_smi_value_; }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3346 bool HasExternalReferenceValue() const { 3339 bool HasExternalReferenceValue() const {
3347 return has_external_reference_value_; 3340 return has_external_reference_value_;
3348 } 3341 }
3349 ExternalReference ExternalReferenceValue() const { 3342 ExternalReference ExternalReferenceValue() const {
3350 return external_reference_value_; 3343 return external_reference_value_;
3351 } 3344 }
3352 3345
3353 bool HasBooleanValue() const { return type_.IsBoolean(); } 3346 bool HasBooleanValue() const { return type_.IsBoolean(); }
3354 bool BooleanValue() const { return boolean_value_; } 3347 bool BooleanValue() const { return boolean_value_; }
3355 3348
3356 virtual intptr_t Hashcode() V8_OVERRIDE { 3349 virtual intptr_t Hashcode() {
3357 if (has_int32_value_) { 3350 if (has_int32_value_) {
3358 return static_cast<intptr_t>(int32_value_); 3351 return static_cast<intptr_t>(int32_value_);
3359 } else if (has_double_value_) { 3352 } else if (has_double_value_) {
3360 return static_cast<intptr_t>(BitCast<int64_t>(double_value_)); 3353 return static_cast<intptr_t>(BitCast<int64_t>(double_value_));
3361 } else if (has_external_reference_value_) { 3354 } else if (has_external_reference_value_) {
3362 return reinterpret_cast<intptr_t>(external_reference_value_.address()); 3355 return reinterpret_cast<intptr_t>(external_reference_value_.address());
3363 } else { 3356 } else {
3364 ASSERT(!handle_.is_null()); 3357 ASSERT(!handle_.is_null());
3365 return unique_id_.Hashcode(); 3358 return unique_id_.Hashcode();
3366 } 3359 }
3367 } 3360 }
3368 3361
3369 virtual void FinalizeUniqueValueId() V8_OVERRIDE { 3362 virtual void FinalizeUniqueValueId() {
3370 if (!has_double_value_ && !has_external_reference_value_) { 3363 if (!has_double_value_ && !has_external_reference_value_) {
3371 ASSERT(!handle_.is_null()); 3364 ASSERT(!handle_.is_null());
3372 unique_id_ = UniqueValueId(handle_); 3365 unique_id_ = UniqueValueId(handle_);
3373 } 3366 }
3374 } 3367 }
3375 3368
3376 bool UniqueValueIdsMatch(UniqueValueId other) { 3369 bool UniqueValueIdsMatch(UniqueValueId other) {
3377 return !has_double_value_ && !has_external_reference_value_ && 3370 return !has_double_value_ && !has_external_reference_value_ &&
3378 unique_id_ == other; 3371 unique_id_ == other;
3379 } 3372 }
3380 3373
3381 #ifdef DEBUG 3374 #ifdef DEBUG
3382 virtual void Verify() V8_OVERRIDE { } 3375 virtual void Verify() { }
3383 #endif 3376 #endif
3384 3377
3385 DECLARE_CONCRETE_INSTRUCTION(Constant) 3378 DECLARE_CONCRETE_INSTRUCTION(Constant)
3386 3379
3387 protected: 3380 protected:
3388 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 3381 virtual Range* InferRange(Zone* zone);
3389 3382
3390 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 3383 virtual bool DataEquals(HValue* other) {
3391 HConstant* other_constant = HConstant::cast(other); 3384 HConstant* other_constant = HConstant::cast(other);
3392 if (has_int32_value_) { 3385 if (has_int32_value_) {
3393 return other_constant->has_int32_value_ && 3386 return other_constant->has_int32_value_ &&
3394 int32_value_ == other_constant->int32_value_; 3387 int32_value_ == other_constant->int32_value_;
3395 } else if (has_double_value_) { 3388 } else if (has_double_value_) {
3396 return other_constant->has_double_value_ && 3389 return other_constant->has_double_value_ &&
3397 BitCast<int64_t>(double_value_) == 3390 BitCast<int64_t>(double_value_) ==
3398 BitCast<int64_t>(other_constant->double_value_); 3391 BitCast<int64_t>(other_constant->double_value_);
3399 } else if (has_external_reference_value_) { 3392 } else if (has_external_reference_value_) {
3400 return other_constant->has_external_reference_value_ && 3393 return other_constant->has_external_reference_value_ &&
(...skipping 22 matching lines...) Expand all
3423 Representation r, 3416 Representation r,
3424 HType type, 3417 HType type,
3425 bool is_internalized_string, 3418 bool is_internalized_string,
3426 bool is_not_in_new_space, 3419 bool is_not_in_new_space,
3427 bool is_cell, 3420 bool is_cell,
3428 bool boolean_value); 3421 bool boolean_value);
3429 explicit HConstant(ExternalReference reference); 3422 explicit HConstant(ExternalReference reference);
3430 3423
3431 void Initialize(Representation r); 3424 void Initialize(Representation r);
3432 3425
3433 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 3426 virtual bool IsDeletable() const { return true; }
3434 3427
3435 // If this is a numerical constant, handle_ either points to to the 3428 // If this is a numerical constant, handle_ either points to to the
3436 // HeapObject the constant originated from or is null. If the 3429 // HeapObject the constant originated from or is null. If the
3437 // constant is non-numeric, handle_ always points to a valid 3430 // constant is non-numeric, handle_ always points to a valid
3438 // constant HeapObject. 3431 // constant HeapObject.
3439 Handle<Object> handle_; 3432 Handle<Object> handle_;
3440 UniqueValueId unique_id_; 3433 UniqueValueId unique_id_;
3441 3434
3442 // We store the HConstant in the most specific form safely possible. 3435 // We store the HConstant in the most specific form safely possible.
3443 // The two flags, has_int32_value_ and has_double_value_ tell us if 3436 // The two flags, has_int32_value_ and has_double_value_ tell us if
3444 // int32_value_ and double_value_ hold valid, safe representations 3437 // int32_value_ and double_value_ hold valid, safe representations
3445 // of the constant. has_int32_value_ implies has_double_value_ but 3438 // of the constant. has_int32_value_ implies has_double_value_ but
3446 // not the converse. 3439 // not the converse.
3447 bool has_smi_value_ : 1; 3440 bool has_smi_value_ : 1;
3448 bool has_int32_value_ : 1; 3441 bool has_int32_value_ : 1;
3449 bool has_double_value_ : 1; 3442 bool has_double_value_ : 1;
3450 bool has_external_reference_value_ : 1; 3443 bool has_external_reference_value_ : 1;
3451 bool is_internalized_string_ : 1; // TODO(yangguo): make this part of HType. 3444 bool is_internalized_string_ : 1; // TODO(yangguo): make this part of HType.
3452 bool is_not_in_new_space_ : 1; 3445 bool is_not_in_new_space_ : 1;
3453 bool is_cell_ : 1; 3446 bool is_cell_ : 1;
3454 bool boolean_value_ : 1; 3447 bool boolean_value_ : 1;
3455 int32_t int32_value_; 3448 int32_t int32_value_;
3456 double double_value_; 3449 double double_value_;
3457 ExternalReference external_reference_value_; 3450 ExternalReference external_reference_value_;
3458 }; 3451 };
3459 3452
3460 3453
3461 class HBinaryOperation : public HTemplateInstruction<3> { 3454 class HBinaryOperation: public HTemplateInstruction<3> {
3462 public: 3455 public:
3463 HBinaryOperation(HValue* context, HValue* left, HValue* right, 3456 HBinaryOperation(HValue* context, HValue* left, HValue* right,
3464 HType type = HType::Tagged()) 3457 HType type = HType::Tagged())
3465 : HTemplateInstruction<3>(type), 3458 : HTemplateInstruction<3>(type),
3466 observed_output_representation_(Representation::None()) { 3459 observed_output_representation_(Representation::None()) {
3467 ASSERT(left != NULL && right != NULL); 3460 ASSERT(left != NULL && right != NULL);
3468 SetOperandAt(0, context); 3461 SetOperandAt(0, context);
3469 SetOperandAt(1, left); 3462 SetOperandAt(1, left);
3470 SetOperandAt(2, right); 3463 SetOperandAt(2, right);
3471 observed_input_representation_[0] = Representation::None(); 3464 observed_input_representation_[0] = Representation::None();
(...skipping 29 matching lines...) Expand all
3501 3494
3502 void set_observed_input_representation(int index, Representation rep) { 3495 void set_observed_input_representation(int index, Representation rep) {
3503 ASSERT(index >= 1 && index <= 2); 3496 ASSERT(index >= 1 && index <= 2);
3504 observed_input_representation_[index - 1] = rep; 3497 observed_input_representation_[index - 1] = rep;
3505 } 3498 }
3506 3499
3507 virtual void initialize_output_representation(Representation observed) { 3500 virtual void initialize_output_representation(Representation observed) {
3508 observed_output_representation_ = observed; 3501 observed_output_representation_ = observed;
3509 } 3502 }
3510 3503
3511 virtual Representation observed_input_representation(int index) V8_OVERRIDE { 3504 virtual Representation observed_input_representation(int index) {
3512 if (index == 0) return Representation::Tagged(); 3505 if (index == 0) return Representation::Tagged();
3513 return observed_input_representation_[index - 1]; 3506 return observed_input_representation_[index - 1];
3514 } 3507 }
3515 3508
3516 virtual void UpdateRepresentation(Representation new_rep, 3509 virtual void UpdateRepresentation(Representation new_rep,
3517 HInferRepresentationPhase* h_infer, 3510 HInferRepresentationPhase* h_infer,
3518 const char* reason) V8_OVERRIDE { 3511 const char* reason) {
3519 Representation rep = !FLAG_smi_binop && new_rep.IsSmi() 3512 Representation rep = !FLAG_smi_binop && new_rep.IsSmi()
3520 ? Representation::Integer32() : new_rep; 3513 ? Representation::Integer32() : new_rep;
3521 HValue::UpdateRepresentation(rep, h_infer, reason); 3514 HValue::UpdateRepresentation(rep, h_infer, reason);
3522 } 3515 }
3523 3516
3524 virtual void InferRepresentation( 3517 virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
3525 HInferRepresentationPhase* h_infer) V8_OVERRIDE; 3518 virtual Representation RepresentationFromInputs();
3526 virtual Representation RepresentationFromInputs() V8_OVERRIDE;
3527 Representation RepresentationFromOutput(); 3519 Representation RepresentationFromOutput();
3528 virtual void AssumeRepresentation(Representation r) V8_OVERRIDE; 3520 virtual void AssumeRepresentation(Representation r);
3529 3521
3530 virtual bool IsCommutative() const { return false; } 3522 virtual bool IsCommutative() const { return false; }
3531 3523
3532 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 3524 virtual void PrintDataTo(StringStream* stream);
3533 3525
3534 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3526 virtual Representation RequiredInputRepresentation(int index) {
3535 if (index == 0) return Representation::Tagged(); 3527 if (index == 0) return Representation::Tagged();
3536 return representation(); 3528 return representation();
3537 } 3529 }
3538 3530
3539 DECLARE_ABSTRACT_INSTRUCTION(BinaryOperation) 3531 DECLARE_ABSTRACT_INSTRUCTION(BinaryOperation)
3540 3532
3541 private: 3533 private:
3542 bool IgnoreObservedOutputRepresentation(Representation current_rep); 3534 bool IgnoreObservedOutputRepresentation(Representation current_rep);
3543 3535
3544 Representation observed_input_representation_[2]; 3536 Representation observed_input_representation_[2];
3545 Representation observed_output_representation_; 3537 Representation observed_output_representation_;
3546 }; 3538 };
3547 3539
3548 3540
3549 class HWrapReceiver V8_FINAL : public HTemplateInstruction<2> { 3541 class HWrapReceiver: public HTemplateInstruction<2> {
3550 public: 3542 public:
3551 DECLARE_INSTRUCTION_FACTORY_P2(HWrapReceiver, HValue*, HValue*); 3543 DECLARE_INSTRUCTION_FACTORY_P2(HWrapReceiver, HValue*, HValue*);
3552 3544
3553 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3545 virtual Representation RequiredInputRepresentation(int index) {
3554 return Representation::Tagged(); 3546 return Representation::Tagged();
3555 } 3547 }
3556 3548
3557 HValue* receiver() { return OperandAt(0); } 3549 HValue* receiver() { return OperandAt(0); }
3558 HValue* function() { return OperandAt(1); } 3550 HValue* function() { return OperandAt(1); }
3559 3551
3560 virtual HValue* Canonicalize() V8_OVERRIDE; 3552 virtual HValue* Canonicalize();
3561 3553
3562 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 3554 virtual void PrintDataTo(StringStream* stream);
3563 3555
3564 DECLARE_CONCRETE_INSTRUCTION(WrapReceiver) 3556 DECLARE_CONCRETE_INSTRUCTION(WrapReceiver)
3565 3557
3566 private: 3558 private:
3567 HWrapReceiver(HValue* receiver, HValue* function) { 3559 HWrapReceiver(HValue* receiver, HValue* function) {
3568 set_representation(Representation::Tagged()); 3560 set_representation(Representation::Tagged());
3569 SetOperandAt(0, receiver); 3561 SetOperandAt(0, receiver);
3570 SetOperandAt(1, function); 3562 SetOperandAt(1, function);
3571 } 3563 }
3572 }; 3564 };
3573 3565
3574 3566
3575 class HApplyArguments V8_FINAL : public HTemplateInstruction<4> { 3567 class HApplyArguments: public HTemplateInstruction<4> {
3576 public: 3568 public:
3577 HApplyArguments(HValue* function, 3569 HApplyArguments(HValue* function,
3578 HValue* receiver, 3570 HValue* receiver,
3579 HValue* length, 3571 HValue* length,
3580 HValue* elements) { 3572 HValue* elements) {
3581 set_representation(Representation::Tagged()); 3573 set_representation(Representation::Tagged());
3582 SetOperandAt(0, function); 3574 SetOperandAt(0, function);
3583 SetOperandAt(1, receiver); 3575 SetOperandAt(1, receiver);
3584 SetOperandAt(2, length); 3576 SetOperandAt(2, length);
3585 SetOperandAt(3, elements); 3577 SetOperandAt(3, elements);
3586 SetAllSideEffects(); 3578 SetAllSideEffects();
3587 } 3579 }
3588 3580
3589 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3581 virtual Representation RequiredInputRepresentation(int index) {
3590 // The length is untagged, all other inputs are tagged. 3582 // The length is untagged, all other inputs are tagged.
3591 return (index == 2) 3583 return (index == 2)
3592 ? Representation::Integer32() 3584 ? Representation::Integer32()
3593 : Representation::Tagged(); 3585 : Representation::Tagged();
3594 } 3586 }
3595 3587
3596 HValue* function() { return OperandAt(0); } 3588 HValue* function() { return OperandAt(0); }
3597 HValue* receiver() { return OperandAt(1); } 3589 HValue* receiver() { return OperandAt(1); }
3598 HValue* length() { return OperandAt(2); } 3590 HValue* length() { return OperandAt(2); }
3599 HValue* elements() { return OperandAt(3); } 3591 HValue* elements() { return OperandAt(3); }
3600 3592
3601 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments) 3593 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments)
3602 }; 3594 };
3603 3595
3604 3596
3605 class HArgumentsElements V8_FINAL : public HTemplateInstruction<0> { 3597 class HArgumentsElements: public HTemplateInstruction<0> {
3606 public: 3598 public:
3607 DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsElements, bool); 3599 DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsElements, bool);
3608 3600
3609 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements) 3601 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements)
3610 3602
3611 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3603 virtual Representation RequiredInputRepresentation(int index) {
3612 return Representation::None(); 3604 return Representation::None();
3613 } 3605 }
3614 3606
3615 bool from_inlined() const { return from_inlined_; } 3607 bool from_inlined() const { return from_inlined_; }
3616 3608
3617 protected: 3609 protected:
3618 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 3610 virtual bool DataEquals(HValue* other) { return true; }
3619 3611
3620 private: 3612 private:
3621 explicit HArgumentsElements(bool from_inlined) : from_inlined_(from_inlined) { 3613 explicit HArgumentsElements(bool from_inlined) : from_inlined_(from_inlined) {
3622 // The value produced by this instruction is a pointer into the stack 3614 // The value produced by this instruction is a pointer into the stack
3623 // that looks as if it was a smi because of alignment. 3615 // that looks as if it was a smi because of alignment.
3624 set_representation(Representation::Tagged()); 3616 set_representation(Representation::Tagged());
3625 SetFlag(kUseGVN); 3617 SetFlag(kUseGVN);
3626 } 3618 }
3627 3619
3628 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 3620 virtual bool IsDeletable() const { return true; }
3629 3621
3630 bool from_inlined_; 3622 bool from_inlined_;
3631 }; 3623 };
3632 3624
3633 3625
3634 class HArgumentsLength V8_FINAL : public HUnaryOperation { 3626 class HArgumentsLength: public HUnaryOperation {
3635 public: 3627 public:
3636 DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsLength, HValue*); 3628 DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsLength, HValue*);
3637 3629
3638 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3630 virtual Representation RequiredInputRepresentation(int index) {
3639 return Representation::Tagged(); 3631 return Representation::Tagged();
3640 } 3632 }
3641 3633
3642 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength) 3634 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength)
3643 3635
3644 protected: 3636 protected:
3645 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 3637 virtual bool DataEquals(HValue* other) { return true; }
3646 3638
3647 private: 3639 private:
3648 explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) { 3640 explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) {
3649 set_representation(Representation::Integer32()); 3641 set_representation(Representation::Integer32());
3650 SetFlag(kUseGVN); 3642 SetFlag(kUseGVN);
3651 } 3643 }
3652 3644
3653 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 3645 virtual bool IsDeletable() const { return true; }
3654 }; 3646 };
3655 3647
3656 3648
3657 class HAccessArgumentsAt V8_FINAL : public HTemplateInstruction<3> { 3649 class HAccessArgumentsAt: public HTemplateInstruction<3> {
3658 public: 3650 public:
3659 HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { 3651 HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) {
3660 set_representation(Representation::Tagged()); 3652 set_representation(Representation::Tagged());
3661 SetFlag(kUseGVN); 3653 SetFlag(kUseGVN);
3662 SetOperandAt(0, arguments); 3654 SetOperandAt(0, arguments);
3663 SetOperandAt(1, length); 3655 SetOperandAt(1, length);
3664 SetOperandAt(2, index); 3656 SetOperandAt(2, index);
3665 } 3657 }
3666 3658
3667 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 3659 virtual void PrintDataTo(StringStream* stream);
3668 3660
3669 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3661 virtual Representation RequiredInputRepresentation(int index) {
3670 // The arguments elements is considered tagged. 3662 // The arguments elements is considered tagged.
3671 return index == 0 3663 return index == 0
3672 ? Representation::Tagged() 3664 ? Representation::Tagged()
3673 : Representation::Integer32(); 3665 : Representation::Integer32();
3674 } 3666 }
3675 3667
3676 HValue* arguments() { return OperandAt(0); } 3668 HValue* arguments() { return OperandAt(0); }
3677 HValue* length() { return OperandAt(1); } 3669 HValue* length() { return OperandAt(1); }
3678 HValue* index() { return OperandAt(2); } 3670 HValue* index() { return OperandAt(2); }
3679 3671
3680 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt) 3672 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt)
3681 3673
3682 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 3674 virtual bool DataEquals(HValue* other) { return true; }
3683 }; 3675 };
3684 3676
3685 3677
3686 class HBoundsCheckBaseIndexInformation; 3678 class HBoundsCheckBaseIndexInformation;
3687 3679
3688 3680
3689 class HBoundsCheck V8_FINAL : public HTemplateInstruction<2> { 3681 class HBoundsCheck: public HTemplateInstruction<2> {
3690 public: 3682 public:
3691 DECLARE_INSTRUCTION_FACTORY_P2(HBoundsCheck, HValue*, HValue*); 3683 DECLARE_INSTRUCTION_FACTORY_P2(HBoundsCheck, HValue*, HValue*);
3692 3684
3693 bool skip_check() const { return skip_check_; } 3685 bool skip_check() const { return skip_check_; }
3694 void set_skip_check() { skip_check_ = true; } 3686 void set_skip_check() { skip_check_ = true; }
3695 3687
3696 HValue* base() { return base_; } 3688 HValue* base() { return base_; }
3697 int offset() { return offset_; } 3689 int offset() { return offset_; }
3698 int scale() { return scale_; } 3690 int scale() { return scale_; }
3699 3691
3700 void ApplyIndexChange(); 3692 void ApplyIndexChange();
3701 bool DetectCompoundIndex() { 3693 bool DetectCompoundIndex() {
3702 ASSERT(base() == NULL); 3694 ASSERT(base() == NULL);
3703 3695
3704 DecompositionResult decomposition; 3696 DecompositionResult decomposition;
3705 if (index()->TryDecompose(&decomposition)) { 3697 if (index()->TryDecompose(&decomposition)) {
3706 base_ = decomposition.base(); 3698 base_ = decomposition.base();
3707 offset_ = decomposition.offset(); 3699 offset_ = decomposition.offset();
3708 scale_ = decomposition.scale(); 3700 scale_ = decomposition.scale();
3709 return true; 3701 return true;
3710 } else { 3702 } else {
3711 base_ = index(); 3703 base_ = index();
3712 offset_ = 0; 3704 offset_ = 0;
3713 scale_ = 0; 3705 scale_ = 0;
3714 return false; 3706 return false;
3715 } 3707 }
3716 } 3708 }
3717 3709
3718 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3710 virtual Representation RequiredInputRepresentation(int arg_index) {
3719 return representation(); 3711 return representation();
3720 } 3712 }
3721 3713
3722 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 3714 virtual void PrintDataTo(StringStream* stream);
3723 virtual void InferRepresentation( 3715 virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
3724 HInferRepresentationPhase* h_infer) V8_OVERRIDE;
3725 3716
3726 HValue* index() { return OperandAt(0); } 3717 HValue* index() { return OperandAt(0); }
3727 HValue* length() { return OperandAt(1); } 3718 HValue* length() { return OperandAt(1); }
3728 bool allow_equality() { return allow_equality_; } 3719 bool allow_equality() { return allow_equality_; }
3729 void set_allow_equality(bool v) { allow_equality_ = v; } 3720 void set_allow_equality(bool v) { allow_equality_ = v; }
3730 3721
3731 virtual int RedefinedOperandIndex() V8_OVERRIDE { return 0; } 3722 virtual int RedefinedOperandIndex() { return 0; }
3732 virtual bool IsPurelyInformativeDefinition() V8_OVERRIDE { 3723 virtual bool IsPurelyInformativeDefinition() { return skip_check(); }
3733 return skip_check();
3734 }
3735 3724
3736 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck) 3725 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck)
3737 3726
3738 protected: 3727 protected:
3739 friend class HBoundsCheckBaseIndexInformation; 3728 friend class HBoundsCheckBaseIndexInformation;
3740 3729
3741 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 3730 virtual bool DataEquals(HValue* other) { return true; }
3742 bool skip_check_; 3731 bool skip_check_;
3743 HValue* base_; 3732 HValue* base_;
3744 int offset_; 3733 int offset_;
3745 int scale_; 3734 int scale_;
3746 bool allow_equality_; 3735 bool allow_equality_;
3747 3736
3748 private: 3737 private:
3749 // Normally HBoundsCheck should be created using the 3738 // Normally HBoundsCheck should be created using the
3750 // HGraphBuilder::AddBoundsCheck() helper. 3739 // HGraphBuilder::AddBoundsCheck() helper.
3751 // However when building stubs, where we know that the arguments are Int32, 3740 // However when building stubs, where we know that the arguments are Int32,
3752 // it makes sense to invoke this constructor directly. 3741 // it makes sense to invoke this constructor directly.
3753 HBoundsCheck(HValue* index, HValue* length) 3742 HBoundsCheck(HValue* index, HValue* length)
3754 : skip_check_(false), 3743 : skip_check_(false),
3755 base_(NULL), offset_(0), scale_(0), 3744 base_(NULL), offset_(0), scale_(0),
3756 allow_equality_(false) { 3745 allow_equality_(false) {
3757 SetOperandAt(0, index); 3746 SetOperandAt(0, index);
3758 SetOperandAt(1, length); 3747 SetOperandAt(1, length);
3759 SetFlag(kFlexibleRepresentation); 3748 SetFlag(kFlexibleRepresentation);
3760 SetFlag(kUseGVN); 3749 SetFlag(kUseGVN);
3761 } 3750 }
3762 3751
3763 virtual bool IsDeletable() const V8_OVERRIDE { 3752 virtual bool IsDeletable() const {
3764 return skip_check() && !FLAG_debug_code; 3753 return skip_check() && !FLAG_debug_code;
3765 } 3754 }
3766 }; 3755 };
3767 3756
3768 3757
3769 class HBoundsCheckBaseIndexInformation V8_FINAL 3758 class HBoundsCheckBaseIndexInformation: public HTemplateInstruction<2> {
3770 : public HTemplateInstruction<2> {
3771 public: 3759 public:
3772 explicit HBoundsCheckBaseIndexInformation(HBoundsCheck* check) { 3760 explicit HBoundsCheckBaseIndexInformation(HBoundsCheck* check) {
3773 DecompositionResult decomposition; 3761 DecompositionResult decomposition;
3774 if (check->index()->TryDecompose(&decomposition)) { 3762 if (check->index()->TryDecompose(&decomposition)) {
3775 SetOperandAt(0, decomposition.base()); 3763 SetOperandAt(0, decomposition.base());
3776 SetOperandAt(1, check); 3764 SetOperandAt(1, check);
3777 } else { 3765 } else {
3778 UNREACHABLE(); 3766 UNREACHABLE();
3779 } 3767 }
3780 } 3768 }
3781 3769
3782 HValue* base_index() { return OperandAt(0); } 3770 HValue* base_index() { return OperandAt(0); }
3783 HBoundsCheck* bounds_check() { return HBoundsCheck::cast(OperandAt(1)); } 3771 HBoundsCheck* bounds_check() { return HBoundsCheck::cast(OperandAt(1)); }
3784 3772
3785 DECLARE_CONCRETE_INSTRUCTION(BoundsCheckBaseIndexInformation) 3773 DECLARE_CONCRETE_INSTRUCTION(BoundsCheckBaseIndexInformation)
3786 3774
3787 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3775 virtual Representation RequiredInputRepresentation(int arg_index) {
3788 return representation(); 3776 return representation();
3789 } 3777 }
3790 3778
3791 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 3779 virtual void PrintDataTo(StringStream* stream);
3792 3780
3793 virtual int RedefinedOperandIndex() V8_OVERRIDE { return 0; } 3781 virtual int RedefinedOperandIndex() { return 0; }
3794 virtual bool IsPurelyInformativeDefinition() V8_OVERRIDE { return true; } 3782 virtual bool IsPurelyInformativeDefinition() { return true; }
3795 }; 3783 };
3796 3784
3797 3785
3798 class HBitwiseBinaryOperation : public HBinaryOperation { 3786 class HBitwiseBinaryOperation: public HBinaryOperation {
3799 public: 3787 public:
3800 HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right, 3788 HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right,
3801 HType type = HType::Tagged()) 3789 HType type = HType::Tagged())
3802 : HBinaryOperation(context, left, right, type) { 3790 : HBinaryOperation(context, left, right, type) {
3803 SetFlag(kFlexibleRepresentation); 3791 SetFlag(kFlexibleRepresentation);
3804 SetFlag(kTruncatingToInt32); 3792 SetFlag(kTruncatingToInt32);
3805 SetFlag(kAllowUndefinedAsNaN); 3793 SetFlag(kAllowUndefinedAsNaN);
3806 SetAllSideEffects(); 3794 SetAllSideEffects();
3807 } 3795 }
3808 3796
3809 virtual void RepresentationChanged(Representation to) V8_OVERRIDE { 3797 virtual void RepresentationChanged(Representation to) {
3810 if (!to.IsTagged()) { 3798 if (!to.IsTagged()) {
3811 ASSERT(to.IsSmiOrInteger32()); 3799 ASSERT(to.IsSmiOrInteger32());
3812 ClearAllSideEffects(); 3800 ClearAllSideEffects();
3813 SetFlag(kUseGVN); 3801 SetFlag(kUseGVN);
3814 } else { 3802 } else {
3815 SetAllSideEffects(); 3803 SetAllSideEffects();
3816 ClearFlag(kUseGVN); 3804 ClearFlag(kUseGVN);
3817 } 3805 }
3818 } 3806 }
3819 3807
3820 virtual void UpdateRepresentation(Representation new_rep, 3808 virtual void UpdateRepresentation(Representation new_rep,
3821 HInferRepresentationPhase* h_infer, 3809 HInferRepresentationPhase* h_infer,
3822 const char* reason) V8_OVERRIDE { 3810 const char* reason) {
3823 // We only generate either int32 or generic tagged bitwise operations. 3811 // We only generate either int32 or generic tagged bitwise operations.
3824 if (new_rep.IsDouble()) new_rep = Representation::Integer32(); 3812 if (new_rep.IsDouble()) new_rep = Representation::Integer32();
3825 HBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 3813 HBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
3826 } 3814 }
3827 3815
3828 virtual Representation observed_input_representation(int index) V8_OVERRIDE { 3816 virtual Representation observed_input_representation(int index) {
3829 Representation r = HBinaryOperation::observed_input_representation(index); 3817 Representation r = HBinaryOperation::observed_input_representation(index);
3830 if (r.IsDouble()) return Representation::Integer32(); 3818 if (r.IsDouble()) return Representation::Integer32();
3831 return r; 3819 return r;
3832 } 3820 }
3833 3821
3834 virtual void initialize_output_representation(Representation observed) { 3822 virtual void initialize_output_representation(Representation observed) {
3835 if (observed.IsDouble()) observed = Representation::Integer32(); 3823 if (observed.IsDouble()) observed = Representation::Integer32();
3836 HBinaryOperation::initialize_output_representation(observed); 3824 HBinaryOperation::initialize_output_representation(observed);
3837 } 3825 }
3838 3826
3839 DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation) 3827 DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation)
3840 3828
3841 private: 3829 private:
3842 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 3830 virtual bool IsDeletable() const { return true; }
3843 }; 3831 };
3844 3832
3845 3833
3846 class HMathFloorOfDiv V8_FINAL : public HBinaryOperation { 3834 class HMathFloorOfDiv: public HBinaryOperation {
3847 public: 3835 public:
3848 static HMathFloorOfDiv* New(Zone* zone, 3836 static HMathFloorOfDiv* New(Zone* zone,
3849 HValue* context, 3837 HValue* context,
3850 HValue* left, 3838 HValue* left,
3851 HValue* right) { 3839 HValue* right) {
3852 return new(zone) HMathFloorOfDiv(context, left, right); 3840 return new(zone) HMathFloorOfDiv(context, left, right);
3853 } 3841 }
3854 3842
3855 virtual HValue* EnsureAndPropagateNotMinusZero( 3843 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
3856 BitVector* visited) V8_OVERRIDE;
3857 3844
3858 DECLARE_CONCRETE_INSTRUCTION(MathFloorOfDiv) 3845 DECLARE_CONCRETE_INSTRUCTION(MathFloorOfDiv)
3859 3846
3860 protected: 3847 protected:
3861 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 3848 virtual bool DataEquals(HValue* other) { return true; }
3862 3849
3863 private: 3850 private:
3864 HMathFloorOfDiv(HValue* context, HValue* left, HValue* right) 3851 HMathFloorOfDiv(HValue* context, HValue* left, HValue* right)
3865 : HBinaryOperation(context, left, right) { 3852 : HBinaryOperation(context, left, right) {
3866 set_representation(Representation::Integer32()); 3853 set_representation(Representation::Integer32());
3867 SetFlag(kUseGVN); 3854 SetFlag(kUseGVN);
3868 SetFlag(kCanOverflow); 3855 SetFlag(kCanOverflow);
3869 if (!right->IsConstant()) { 3856 if (!right->IsConstant()) {
3870 SetFlag(kCanBeDivByZero); 3857 SetFlag(kCanBeDivByZero);
3871 } 3858 }
3872 SetFlag(kAllowUndefinedAsNaN); 3859 SetFlag(kAllowUndefinedAsNaN);
3873 } 3860 }
3874 3861
3875 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 3862 virtual bool IsDeletable() const { return true; }
3876 }; 3863 };
3877 3864
3878 3865
3879 class HArithmeticBinaryOperation : public HBinaryOperation { 3866 class HArithmeticBinaryOperation: public HBinaryOperation {
3880 public: 3867 public:
3881 HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right) 3868 HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right)
3882 : HBinaryOperation(context, left, right, HType::TaggedNumber()) { 3869 : HBinaryOperation(context, left, right, HType::TaggedNumber()) {
3883 SetAllSideEffects(); 3870 SetAllSideEffects();
3884 SetFlag(kFlexibleRepresentation); 3871 SetFlag(kFlexibleRepresentation);
3885 SetFlag(kAllowUndefinedAsNaN); 3872 SetFlag(kAllowUndefinedAsNaN);
3886 } 3873 }
3887 3874
3888 virtual void RepresentationChanged(Representation to) V8_OVERRIDE { 3875 virtual void RepresentationChanged(Representation to) {
3889 if (to.IsTagged()) { 3876 if (to.IsTagged()) {
3890 SetAllSideEffects(); 3877 SetAllSideEffects();
3891 ClearFlag(kUseGVN); 3878 ClearFlag(kUseGVN);
3892 } else { 3879 } else {
3893 ClearAllSideEffects(); 3880 ClearAllSideEffects();
3894 SetFlag(kUseGVN); 3881 SetFlag(kUseGVN);
3895 } 3882 }
3896 } 3883 }
3897 3884
3898 DECLARE_ABSTRACT_INSTRUCTION(ArithmeticBinaryOperation) 3885 DECLARE_ABSTRACT_INSTRUCTION(ArithmeticBinaryOperation)
3899 3886
3900 private: 3887 private:
3901 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 3888 virtual bool IsDeletable() const { return true; }
3902 }; 3889 };
3903 3890
3904 3891
3905 class HCompareGeneric V8_FINAL : public HBinaryOperation { 3892 class HCompareGeneric: public HBinaryOperation {
3906 public: 3893 public:
3907 HCompareGeneric(HValue* context, 3894 HCompareGeneric(HValue* context,
3908 HValue* left, 3895 HValue* left,
3909 HValue* right, 3896 HValue* right,
3910 Token::Value token) 3897 Token::Value token)
3911 : HBinaryOperation(context, left, right, HType::Boolean()), 3898 : HBinaryOperation(context, left, right, HType::Boolean()),
3912 token_(token) { 3899 token_(token) {
3913 ASSERT(Token::IsCompareOp(token)); 3900 ASSERT(Token::IsCompareOp(token));
3914 set_representation(Representation::Tagged()); 3901 set_representation(Representation::Tagged());
3915 SetAllSideEffects(); 3902 SetAllSideEffects();
3916 } 3903 }
3917 3904
3918 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3905 virtual Representation RequiredInputRepresentation(int index) {
3919 return index == 0 3906 return index == 0
3920 ? Representation::Tagged() 3907 ? Representation::Tagged()
3921 : representation(); 3908 : representation();
3922 } 3909 }
3923 3910
3924 Token::Value token() const { return token_; } 3911 Token::Value token() const { return token_; }
3925 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 3912 virtual void PrintDataTo(StringStream* stream);
3926 3913
3927 DECLARE_CONCRETE_INSTRUCTION(CompareGeneric) 3914 DECLARE_CONCRETE_INSTRUCTION(CompareGeneric)
3928 3915
3929 private: 3916 private:
3930 Token::Value token_; 3917 Token::Value token_;
3931 }; 3918 };
3932 3919
3933 3920
3934 class HCompareNumericAndBranch : public HTemplateControlInstruction<2, 2> { 3921 class HCompareNumericAndBranch: public HTemplateControlInstruction<2, 2> {
3935 public: 3922 public:
3936 HCompareNumericAndBranch(HValue* left, HValue* right, Token::Value token) 3923 HCompareNumericAndBranch(HValue* left, HValue* right, Token::Value token)
3937 : token_(token) { 3924 : token_(token) {
3938 SetFlag(kFlexibleRepresentation); 3925 SetFlag(kFlexibleRepresentation);
3939 ASSERT(Token::IsCompareOp(token)); 3926 ASSERT(Token::IsCompareOp(token));
3940 SetOperandAt(0, left); 3927 SetOperandAt(0, left);
3941 SetOperandAt(1, right); 3928 SetOperandAt(1, right);
3942 } 3929 }
3943 3930
3944 HValue* left() { return OperandAt(0); } 3931 HValue* left() { return OperandAt(0); }
3945 HValue* right() { return OperandAt(1); } 3932 HValue* right() { return OperandAt(1); }
3946 Token::Value token() const { return token_; } 3933 Token::Value token() const { return token_; }
3947 3934
3948 void set_observed_input_representation(Representation left, 3935 void set_observed_input_representation(Representation left,
3949 Representation right) { 3936 Representation right) {
3950 observed_input_representation_[0] = left; 3937 observed_input_representation_[0] = left;
3951 observed_input_representation_[1] = right; 3938 observed_input_representation_[1] = right;
3952 } 3939 }
3953 3940
3954 virtual void InferRepresentation( 3941 virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
3955 HInferRepresentationPhase* h_infer) V8_OVERRIDE;
3956 3942
3957 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3943 virtual Representation RequiredInputRepresentation(int index) {
3958 return representation(); 3944 return representation();
3959 } 3945 }
3960 virtual Representation observed_input_representation(int index) V8_OVERRIDE { 3946 virtual Representation observed_input_representation(int index) {
3961 return observed_input_representation_[index]; 3947 return observed_input_representation_[index];
3962 } 3948 }
3963 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 3949 virtual void PrintDataTo(StringStream* stream);
3964 3950
3965 DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch) 3951 DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch)
3966 3952
3967 private: 3953 private:
3968 Representation observed_input_representation_[2]; 3954 Representation observed_input_representation_[2];
3969 Token::Value token_; 3955 Token::Value token_;
3970 }; 3956 };
3971 3957
3972 3958
3973 class HCompareHoleAndBranch V8_FINAL 3959 class HCompareHoleAndBranch: public HTemplateControlInstruction<2, 1> {
3974 : public HTemplateControlInstruction<2, 1> {
3975 public: 3960 public:
3976 // TODO(danno): make this private when the IfBuilder properly constructs 3961 // TODO(danno): make this private when the IfBuilder properly constructs
3977 // control flow instructions. 3962 // control flow instructions.
3978 explicit HCompareHoleAndBranch(HValue* object) { 3963 explicit HCompareHoleAndBranch(HValue* object) {
3979 SetFlag(kFlexibleRepresentation); 3964 SetFlag(kFlexibleRepresentation);
3980 SetFlag(kAllowUndefinedAsNaN); 3965 SetFlag(kAllowUndefinedAsNaN);
3981 SetOperandAt(0, object); 3966 SetOperandAt(0, object);
3982 } 3967 }
3983 3968
3984 DECLARE_INSTRUCTION_FACTORY_P1(HCompareHoleAndBranch, HValue*); 3969 DECLARE_INSTRUCTION_FACTORY_P1(HCompareHoleAndBranch, HValue*);
3985 3970
3986 HValue* object() { return OperandAt(0); } 3971 HValue* object() { return OperandAt(0); }
3987 3972
3988 virtual void InferRepresentation( 3973 virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
3989 HInferRepresentationPhase* h_infer) V8_OVERRIDE;
3990 3974
3991 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3975 virtual Representation RequiredInputRepresentation(int index) {
3992 return representation(); 3976 return representation();
3993 } 3977 }
3994 3978
3995 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 3979 virtual void PrintDataTo(StringStream* stream);
3996 3980
3997 DECLARE_CONCRETE_INSTRUCTION(CompareHoleAndBranch) 3981 DECLARE_CONCRETE_INSTRUCTION(CompareHoleAndBranch)
3998 }; 3982 };
3999 3983
4000 3984
4001 class HCompareObjectEqAndBranch : public HTemplateControlInstruction<2, 2> { 3985 class HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> {
4002 public: 3986 public:
4003 // TODO(danno): make this private when the IfBuilder properly constructs 3987 // TODO(danno): make this private when the IfBuilder properly constructs
4004 // control flow instructions. 3988 // control flow instructions.
4005 HCompareObjectEqAndBranch(HValue* left, 3989 HCompareObjectEqAndBranch(HValue* left,
4006 HValue* right) { 3990 HValue* right) {
4007 SetOperandAt(0, left); 3991 SetOperandAt(0, left);
4008 SetOperandAt(1, right); 3992 SetOperandAt(1, right);
4009 } 3993 }
4010 3994
4011 DECLARE_INSTRUCTION_FACTORY_P2(HCompareObjectEqAndBranch, HValue*, HValue*); 3995 DECLARE_INSTRUCTION_FACTORY_P2(HCompareObjectEqAndBranch, HValue*, HValue*);
4012 3996
4013 HValue* left() { return OperandAt(0); } 3997 HValue* left() { return OperandAt(0); }
4014 HValue* right() { return OperandAt(1); } 3998 HValue* right() { return OperandAt(1); }
4015 3999
4016 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 4000 virtual void PrintDataTo(StringStream* stream);
4017 4001
4018 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4002 virtual Representation RequiredInputRepresentation(int index) {
4019 return Representation::Tagged(); 4003 return Representation::Tagged();
4020 } 4004 }
4021 4005
4022 virtual Representation observed_input_representation(int index) V8_OVERRIDE { 4006 virtual Representation observed_input_representation(int index) {
4023 return Representation::Tagged(); 4007 return Representation::Tagged();
4024 } 4008 }
4025 4009
4026 DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch) 4010 DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch)
4027 }; 4011 };
4028 4012
4029 4013
4030 class HIsObjectAndBranch V8_FINAL : public HUnaryControlInstruction { 4014 class HIsObjectAndBranch: public HUnaryControlInstruction {
4031 public: 4015 public:
4032 explicit HIsObjectAndBranch(HValue* value) 4016 explicit HIsObjectAndBranch(HValue* value)
4033 : HUnaryControlInstruction(value, NULL, NULL) { } 4017 : HUnaryControlInstruction(value, NULL, NULL) { }
4034 4018
4035 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4019 virtual Representation RequiredInputRepresentation(int index) {
4036 return Representation::Tagged(); 4020 return Representation::Tagged();
4037 } 4021 }
4038 4022
4039 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch) 4023 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch)
4040 }; 4024 };
4041 4025
4042 class HIsStringAndBranch V8_FINAL : public HUnaryControlInstruction { 4026 class HIsStringAndBranch: public HUnaryControlInstruction {
4043 public: 4027 public:
4044 explicit HIsStringAndBranch(HValue* value) 4028 explicit HIsStringAndBranch(HValue* value)
4045 : HUnaryControlInstruction(value, NULL, NULL) { } 4029 : HUnaryControlInstruction(value, NULL, NULL) { }
4046 4030
4047 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4031 virtual Representation RequiredInputRepresentation(int index) {
4048 return Representation::Tagged(); 4032 return Representation::Tagged();
4049 } 4033 }
4050 4034
4051 DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch) 4035 DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch)
4052 }; 4036 };
4053 4037
4054 4038
4055 class HIsSmiAndBranch V8_FINAL : public HUnaryControlInstruction { 4039 class HIsSmiAndBranch: public HUnaryControlInstruction {
4056 public: 4040 public:
4057 explicit HIsSmiAndBranch(HValue* value) 4041 explicit HIsSmiAndBranch(HValue* value)
4058 : HUnaryControlInstruction(value, NULL, NULL) { } 4042 : HUnaryControlInstruction(value, NULL, NULL) { }
4059 4043
4060 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch) 4044 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch)
4061 4045
4062 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4046 virtual Representation RequiredInputRepresentation(int index) {
4063 return Representation::Tagged(); 4047 return Representation::Tagged();
4064 } 4048 }
4065 4049
4066 protected: 4050 protected:
4067 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 4051 virtual bool DataEquals(HValue* other) { return true; }
4068 }; 4052 };
4069 4053
4070 4054
4071 class HIsUndetectableAndBranch V8_FINAL : public HUnaryControlInstruction { 4055 class HIsUndetectableAndBranch: public HUnaryControlInstruction {
4072 public: 4056 public:
4073 explicit HIsUndetectableAndBranch(HValue* value) 4057 explicit HIsUndetectableAndBranch(HValue* value)
4074 : HUnaryControlInstruction(value, NULL, NULL) { } 4058 : HUnaryControlInstruction(value, NULL, NULL) { }
4075 4059
4076 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4060 virtual Representation RequiredInputRepresentation(int index) {
4077 return Representation::Tagged(); 4061 return Representation::Tagged();
4078 } 4062 }
4079 4063
4080 DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch) 4064 DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch)
4081 }; 4065 };
4082 4066
4083 4067
4084 class HStringCompareAndBranch : public HTemplateControlInstruction<2, 3> { 4068 class HStringCompareAndBranch: public HTemplateControlInstruction<2, 3> {
4085 public: 4069 public:
4086 HStringCompareAndBranch(HValue* context, 4070 HStringCompareAndBranch(HValue* context,
4087 HValue* left, 4071 HValue* left,
4088 HValue* right, 4072 HValue* right,
4089 Token::Value token) 4073 Token::Value token)
4090 : token_(token) { 4074 : token_(token) {
4091 ASSERT(Token::IsCompareOp(token)); 4075 ASSERT(Token::IsCompareOp(token));
4092 SetOperandAt(0, context); 4076 SetOperandAt(0, context);
4093 SetOperandAt(1, left); 4077 SetOperandAt(1, left);
4094 SetOperandAt(2, right); 4078 SetOperandAt(2, right);
4095 set_representation(Representation::Tagged()); 4079 set_representation(Representation::Tagged());
4096 SetGVNFlag(kChangesNewSpacePromotion); 4080 SetGVNFlag(kChangesNewSpacePromotion);
4097 } 4081 }
4098 4082
4099 HValue* context() { return OperandAt(0); } 4083 HValue* context() { return OperandAt(0); }
4100 HValue* left() { return OperandAt(1); } 4084 HValue* left() { return OperandAt(1); }
4101 HValue* right() { return OperandAt(2); } 4085 HValue* right() { return OperandAt(2); }
4102 Token::Value token() const { return token_; } 4086 Token::Value token() const { return token_; }
4103 4087
4104 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 4088 virtual void PrintDataTo(StringStream* stream);
4105 4089
4106 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4090 virtual Representation RequiredInputRepresentation(int index) {
4107 return Representation::Tagged(); 4091 return Representation::Tagged();
4108 } 4092 }
4109 4093
4110 Representation GetInputRepresentation() const { 4094 Representation GetInputRepresentation() const {
4111 return Representation::Tagged(); 4095 return Representation::Tagged();
4112 } 4096 }
4113 4097
4114 DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch) 4098 DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch)
4115 4099
4116 private: 4100 private:
4117 Token::Value token_; 4101 Token::Value token_;
4118 }; 4102 };
4119 4103
4120 4104
4121 class HIsConstructCallAndBranch : public HTemplateControlInstruction<2, 0> { 4105 class HIsConstructCallAndBranch: public HTemplateControlInstruction<2, 0> {
4122 public: 4106 public:
4123 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4107 virtual Representation RequiredInputRepresentation(int index) {
4124 return Representation::None(); 4108 return Representation::None();
4125 } 4109 }
4126 4110
4127 DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch) 4111 DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch)
4128 }; 4112 };
4129 4113
4130 4114
4131 class HHasInstanceTypeAndBranch V8_FINAL : public HUnaryControlInstruction { 4115 class HHasInstanceTypeAndBranch: public HUnaryControlInstruction {
4132 public: 4116 public:
4133 HHasInstanceTypeAndBranch(HValue* value, InstanceType type) 4117 HHasInstanceTypeAndBranch(HValue* value, InstanceType type)
4134 : HUnaryControlInstruction(value, NULL, NULL), from_(type), to_(type) { } 4118 : HUnaryControlInstruction(value, NULL, NULL), from_(type), to_(type) { }
4135 HHasInstanceTypeAndBranch(HValue* value, InstanceType from, InstanceType to) 4119 HHasInstanceTypeAndBranch(HValue* value, InstanceType from, InstanceType to)
4136 : HUnaryControlInstruction(value, NULL, NULL), from_(from), to_(to) { 4120 : HUnaryControlInstruction(value, NULL, NULL), from_(from), to_(to) {
4137 ASSERT(to == LAST_TYPE); // Others not implemented yet in backend. 4121 ASSERT(to == LAST_TYPE); // Others not implemented yet in backend.
4138 } 4122 }
4139 4123
4140 InstanceType from() { return from_; } 4124 InstanceType from() { return from_; }
4141 InstanceType to() { return to_; } 4125 InstanceType to() { return to_; }
4142 4126
4143 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 4127 virtual void PrintDataTo(StringStream* stream);
4144 4128
4145 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4129 virtual Representation RequiredInputRepresentation(int index) {
4146 return Representation::Tagged(); 4130 return Representation::Tagged();
4147 } 4131 }
4148 4132
4149 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch) 4133 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch)
4150 4134
4151 private: 4135 private:
4152 InstanceType from_; 4136 InstanceType from_;
4153 InstanceType to_; // Inclusive range, not all combinations work. 4137 InstanceType to_; // Inclusive range, not all combinations work.
4154 }; 4138 };
4155 4139
4156 4140
4157 class HHasCachedArrayIndexAndBranch V8_FINAL : public HUnaryControlInstruction { 4141 class HHasCachedArrayIndexAndBranch: public HUnaryControlInstruction {
4158 public: 4142 public:
4159 explicit HHasCachedArrayIndexAndBranch(HValue* value) 4143 explicit HHasCachedArrayIndexAndBranch(HValue* value)
4160 : HUnaryControlInstruction(value, NULL, NULL) { } 4144 : HUnaryControlInstruction(value, NULL, NULL) { }
4161 4145
4162 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4146 virtual Representation RequiredInputRepresentation(int index) {
4163 return Representation::Tagged(); 4147 return Representation::Tagged();
4164 } 4148 }
4165 4149
4166 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch) 4150 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch)
4167 }; 4151 };
4168 4152
4169 4153
4170 class HGetCachedArrayIndex V8_FINAL : public HUnaryOperation { 4154 class HGetCachedArrayIndex: public HUnaryOperation {
4171 public: 4155 public:
4172 explicit HGetCachedArrayIndex(HValue* value) : HUnaryOperation(value) { 4156 explicit HGetCachedArrayIndex(HValue* value) : HUnaryOperation(value) {
4173 set_representation(Representation::Tagged()); 4157 set_representation(Representation::Tagged());
4174 SetFlag(kUseGVN); 4158 SetFlag(kUseGVN);
4175 } 4159 }
4176 4160
4177 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4161 virtual Representation RequiredInputRepresentation(int index) {
4178 return Representation::Tagged(); 4162 return Representation::Tagged();
4179 } 4163 }
4180 4164
4181 DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex) 4165 DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex)
4182 4166
4183 protected: 4167 protected:
4184 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 4168 virtual bool DataEquals(HValue* other) { return true; }
4185 4169
4186 private: 4170 private:
4187 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 4171 virtual bool IsDeletable() const { return true; }
4188 }; 4172 };
4189 4173
4190 4174
4191 class HClassOfTestAndBranch V8_FINAL : public HUnaryControlInstruction { 4175 class HClassOfTestAndBranch: public HUnaryControlInstruction {
4192 public: 4176 public:
4193 HClassOfTestAndBranch(HValue* value, Handle<String> class_name) 4177 HClassOfTestAndBranch(HValue* value, Handle<String> class_name)
4194 : HUnaryControlInstruction(value, NULL, NULL), 4178 : HUnaryControlInstruction(value, NULL, NULL),
4195 class_name_(class_name) { } 4179 class_name_(class_name) { }
4196 4180
4197 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch) 4181 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch)
4198 4182
4199 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4183 virtual Representation RequiredInputRepresentation(int index) {
4200 return Representation::Tagged(); 4184 return Representation::Tagged();
4201 } 4185 }
4202 4186
4203 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 4187 virtual void PrintDataTo(StringStream* stream);
4204 4188
4205 Handle<String> class_name() const { return class_name_; } 4189 Handle<String> class_name() const { return class_name_; }
4206 4190
4207 private: 4191 private:
4208 Handle<String> class_name_; 4192 Handle<String> class_name_;
4209 }; 4193 };
4210 4194
4211 4195
4212 class HTypeofIsAndBranch V8_FINAL : public HUnaryControlInstruction { 4196 class HTypeofIsAndBranch: public HUnaryControlInstruction {
4213 public: 4197 public:
4214 HTypeofIsAndBranch(HValue* value, Handle<String> type_literal) 4198 HTypeofIsAndBranch(HValue* value, Handle<String> type_literal)
4215 : HUnaryControlInstruction(value, NULL, NULL), 4199 : HUnaryControlInstruction(value, NULL, NULL),
4216 type_literal_(type_literal) { } 4200 type_literal_(type_literal) { }
4217 4201
4218 Handle<String> type_literal() { return type_literal_; } 4202 Handle<String> type_literal() { return type_literal_; }
4219 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 4203 virtual void PrintDataTo(StringStream* stream);
4220 4204
4221 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch) 4205 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch)
4222 4206
4223 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4207 virtual Representation RequiredInputRepresentation(int index) {
4224 return Representation::Tagged(); 4208 return Representation::Tagged();
4225 } 4209 }
4226 4210
4227 private: 4211 private:
4228 Handle<String> type_literal_; 4212 Handle<String> type_literal_;
4229 }; 4213 };
4230 4214
4231 4215
4232 class HInstanceOf V8_FINAL : public HBinaryOperation { 4216 class HInstanceOf: public HBinaryOperation {
4233 public: 4217 public:
4234 HInstanceOf(HValue* context, HValue* left, HValue* right) 4218 HInstanceOf(HValue* context, HValue* left, HValue* right)
4235 : HBinaryOperation(context, left, right, HType::Boolean()) { 4219 : HBinaryOperation(context, left, right, HType::Boolean()) {
4236 set_representation(Representation::Tagged()); 4220 set_representation(Representation::Tagged());
4237 SetAllSideEffects(); 4221 SetAllSideEffects();
4238 } 4222 }
4239 4223
4240 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4224 virtual Representation RequiredInputRepresentation(int index) {
4241 return Representation::Tagged(); 4225 return Representation::Tagged();
4242 } 4226 }
4243 4227
4244 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 4228 virtual void PrintDataTo(StringStream* stream);
4245 4229
4246 DECLARE_CONCRETE_INSTRUCTION(InstanceOf) 4230 DECLARE_CONCRETE_INSTRUCTION(InstanceOf)
4247 }; 4231 };
4248 4232
4249 4233
4250 class HInstanceOfKnownGlobal V8_FINAL : public HTemplateInstruction<2> { 4234 class HInstanceOfKnownGlobal: public HTemplateInstruction<2> {
4251 public: 4235 public:
4252 HInstanceOfKnownGlobal(HValue* context, 4236 HInstanceOfKnownGlobal(HValue* context,
4253 HValue* left, 4237 HValue* left,
4254 Handle<JSFunction> right) 4238 Handle<JSFunction> right)
4255 : HTemplateInstruction<2>(HType::Boolean()), function_(right) { 4239 : HTemplateInstruction<2>(HType::Boolean()), function_(right) {
4256 SetOperandAt(0, context); 4240 SetOperandAt(0, context);
4257 SetOperandAt(1, left); 4241 SetOperandAt(1, left);
4258 set_representation(Representation::Tagged()); 4242 set_representation(Representation::Tagged());
4259 SetAllSideEffects(); 4243 SetAllSideEffects();
4260 } 4244 }
4261 4245
4262 HValue* context() { return OperandAt(0); } 4246 HValue* context() { return OperandAt(0); }
4263 HValue* left() { return OperandAt(1); } 4247 HValue* left() { return OperandAt(1); }
4264 Handle<JSFunction> function() { return function_; } 4248 Handle<JSFunction> function() { return function_; }
4265 4249
4266 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4250 virtual Representation RequiredInputRepresentation(int index) {
4267 return Representation::Tagged(); 4251 return Representation::Tagged();
4268 } 4252 }
4269 4253
4270 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal) 4254 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal)
4271 4255
4272 private: 4256 private:
4273 Handle<JSFunction> function_; 4257 Handle<JSFunction> function_;
4274 }; 4258 };
4275 4259
4276 4260
4277 // TODO(mstarzinger): This instruction should be modeled as a load of the map 4261 // TODO(mstarzinger): This instruction should be modeled as a load of the map
4278 // field followed by a load of the instance size field once HLoadNamedField is 4262 // field followed by a load of the instance size field once HLoadNamedField is
4279 // flexible enough to accommodate byte-field loads. 4263 // flexible enough to accommodate byte-field loads.
4280 class HInstanceSize V8_FINAL : public HTemplateInstruction<1> { 4264 class HInstanceSize: public HTemplateInstruction<1> {
4281 public: 4265 public:
4282 explicit HInstanceSize(HValue* object) { 4266 explicit HInstanceSize(HValue* object) {
4283 SetOperandAt(0, object); 4267 SetOperandAt(0, object);
4284 set_representation(Representation::Integer32()); 4268 set_representation(Representation::Integer32());
4285 } 4269 }
4286 4270
4287 HValue* object() { return OperandAt(0); } 4271 HValue* object() { return OperandAt(0); }
4288 4272
4289 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4273 virtual Representation RequiredInputRepresentation(int index) {
4290 return Representation::Tagged(); 4274 return Representation::Tagged();
4291 } 4275 }
4292 4276
4293 DECLARE_CONCRETE_INSTRUCTION(InstanceSize) 4277 DECLARE_CONCRETE_INSTRUCTION(InstanceSize)
4294 }; 4278 };
4295 4279
4296 4280
4297 class HPower V8_FINAL : public HTemplateInstruction<2> { 4281 class HPower: public HTemplateInstruction<2> {
4298 public: 4282 public:
4299 static HInstruction* New(Zone* zone, 4283 static HInstruction* New(Zone* zone,
4300 HValue* context, 4284 HValue* context,
4301 HValue* left, 4285 HValue* left,
4302 HValue* right); 4286 HValue* right);
4303 4287
4304 HValue* left() { return OperandAt(0); } 4288 HValue* left() { return OperandAt(0); }
4305 HValue* right() const { return OperandAt(1); } 4289 HValue* right() const { return OperandAt(1); }
4306 4290
4307 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4291 virtual Representation RequiredInputRepresentation(int index) {
4308 return index == 0 4292 return index == 0
4309 ? Representation::Double() 4293 ? Representation::Double()
4310 : Representation::None(); 4294 : Representation::None();
4311 } 4295 }
4312 virtual Representation observed_input_representation(int index) V8_OVERRIDE { 4296 virtual Representation observed_input_representation(int index) {
4313 return RequiredInputRepresentation(index); 4297 return RequiredInputRepresentation(index);
4314 } 4298 }
4315 4299
4316 DECLARE_CONCRETE_INSTRUCTION(Power) 4300 DECLARE_CONCRETE_INSTRUCTION(Power)
4317 4301
4318 protected: 4302 protected:
4319 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 4303 virtual bool DataEquals(HValue* other) { return true; }
4320 4304
4321 private: 4305 private:
4322 HPower(HValue* left, HValue* right) { 4306 HPower(HValue* left, HValue* right) {
4323 SetOperandAt(0, left); 4307 SetOperandAt(0, left);
4324 SetOperandAt(1, right); 4308 SetOperandAt(1, right);
4325 set_representation(Representation::Double()); 4309 set_representation(Representation::Double());
4326 SetFlag(kUseGVN); 4310 SetFlag(kUseGVN);
4327 SetGVNFlag(kChangesNewSpacePromotion); 4311 SetGVNFlag(kChangesNewSpacePromotion);
4328 } 4312 }
4329 4313
4330 virtual bool IsDeletable() const V8_OVERRIDE { 4314 virtual bool IsDeletable() const {
4331 return !right()->representation().IsTagged(); 4315 return !right()->representation().IsTagged();
4332 } 4316 }
4333 }; 4317 };
4334 4318
4335 4319
4336 class HRandom V8_FINAL : public HTemplateInstruction<1> { 4320 class HRandom: public HTemplateInstruction<1> {
4337 public: 4321 public:
4338 explicit HRandom(HValue* global_object) { 4322 explicit HRandom(HValue* global_object) {
4339 SetOperandAt(0, global_object); 4323 SetOperandAt(0, global_object);
4340 set_representation(Representation::Double()); 4324 set_representation(Representation::Double());
4341 } 4325 }
4342 4326
4343 HValue* global_object() { return OperandAt(0); } 4327 HValue* global_object() { return OperandAt(0); }
4344 4328
4345 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4329 virtual Representation RequiredInputRepresentation(int index) {
4346 return Representation::Tagged(); 4330 return Representation::Tagged();
4347 } 4331 }
4348 4332
4349 DECLARE_CONCRETE_INSTRUCTION(Random) 4333 DECLARE_CONCRETE_INSTRUCTION(Random)
4350 4334
4351 private: 4335 private:
4352 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 4336 virtual bool IsDeletable() const { return true; }
4353 }; 4337 };
4354 4338
4355 4339
4356 class HAdd V8_FINAL : public HArithmeticBinaryOperation { 4340 class HAdd: public HArithmeticBinaryOperation {
4357 public: 4341 public:
4358 static HInstruction* New(Zone* zone, 4342 static HInstruction* New(Zone* zone,
4359 HValue* context, 4343 HValue* context,
4360 HValue* left, 4344 HValue* left,
4361 HValue* right); 4345 HValue* right);
4362 4346
4363 // Add is only commutative if two integer values are added and not if two 4347 // Add is only commutative if two integer values are added and not if two
4364 // tagged values are added (because it might be a String concatenation). 4348 // tagged values are added (because it might be a String concatenation).
4365 virtual bool IsCommutative() const V8_OVERRIDE { 4349 virtual bool IsCommutative() const {
4366 return !representation().IsTagged(); 4350 return !representation().IsTagged();
4367 } 4351 }
4368 4352
4369 virtual HValue* EnsureAndPropagateNotMinusZero( 4353 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
4370 BitVector* visited) V8_OVERRIDE;
4371 4354
4372 virtual HValue* Canonicalize() V8_OVERRIDE; 4355 virtual HValue* Canonicalize();
4373 4356
4374 virtual bool TryDecompose(DecompositionResult* decomposition) V8_OVERRIDE { 4357 virtual bool TryDecompose(DecompositionResult* decomposition) {
4375 if (left()->IsInteger32Constant()) { 4358 if (left()->IsInteger32Constant()) {
4376 decomposition->Apply(right(), left()->GetInteger32Constant()); 4359 decomposition->Apply(right(), left()->GetInteger32Constant());
4377 return true; 4360 return true;
4378 } else if (right()->IsInteger32Constant()) { 4361 } else if (right()->IsInteger32Constant()) {
4379 decomposition->Apply(left(), right()->GetInteger32Constant()); 4362 decomposition->Apply(left(), right()->GetInteger32Constant());
4380 return true; 4363 return true;
4381 } else { 4364 } else {
4382 return false; 4365 return false;
4383 } 4366 }
4384 } 4367 }
4385 4368
4386 virtual void RepresentationChanged(Representation to) V8_OVERRIDE { 4369 virtual void RepresentationChanged(Representation to) {
4387 if (to.IsTagged()) ClearFlag(kAllowUndefinedAsNaN); 4370 if (to.IsTagged()) ClearFlag(kAllowUndefinedAsNaN);
4388 HArithmeticBinaryOperation::RepresentationChanged(to); 4371 HArithmeticBinaryOperation::RepresentationChanged(to);
4389 } 4372 }
4390 4373
4391 DECLARE_CONCRETE_INSTRUCTION(Add) 4374 DECLARE_CONCRETE_INSTRUCTION(Add)
4392 4375
4393 protected: 4376 protected:
4394 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 4377 virtual bool DataEquals(HValue* other) { return true; }
4395 4378
4396 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 4379 virtual Range* InferRange(Zone* zone);
4397 4380
4398 private: 4381 private:
4399 HAdd(HValue* context, HValue* left, HValue* right) 4382 HAdd(HValue* context, HValue* left, HValue* right)
4400 : HArithmeticBinaryOperation(context, left, right) { 4383 : HArithmeticBinaryOperation(context, left, right) {
4401 SetFlag(kCanOverflow); 4384 SetFlag(kCanOverflow);
4402 } 4385 }
4403 }; 4386 };
4404 4387
4405 4388
4406 class HSub V8_FINAL : public HArithmeticBinaryOperation { 4389 class HSub: public HArithmeticBinaryOperation {
4407 public: 4390 public:
4408 static HInstruction* New(Zone* zone, 4391 static HInstruction* New(Zone* zone,
4409 HValue* context, 4392 HValue* context,
4410 HValue* left, 4393 HValue* left,
4411 HValue* right); 4394 HValue* right);
4412 4395
4413 virtual HValue* EnsureAndPropagateNotMinusZero( 4396 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
4414 BitVector* visited) V8_OVERRIDE;
4415 4397
4416 virtual HValue* Canonicalize() V8_OVERRIDE; 4398 virtual HValue* Canonicalize();
4417 4399
4418 virtual bool TryDecompose(DecompositionResult* decomposition) V8_OVERRIDE { 4400 virtual bool TryDecompose(DecompositionResult* decomposition) {
4419 if (right()->IsInteger32Constant()) { 4401 if (right()->IsInteger32Constant()) {
4420 decomposition->Apply(left(), -right()->GetInteger32Constant()); 4402 decomposition->Apply(left(), -right()->GetInteger32Constant());
4421 return true; 4403 return true;
4422 } else { 4404 } else {
4423 return false; 4405 return false;
4424 } 4406 }
4425 } 4407 }
4426 4408
4427 DECLARE_CONCRETE_INSTRUCTION(Sub) 4409 DECLARE_CONCRETE_INSTRUCTION(Sub)
4428 4410
4429 protected: 4411 protected:
4430 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 4412 virtual bool DataEquals(HValue* other) { return true; }
4431 4413
4432 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 4414 virtual Range* InferRange(Zone* zone);
4433 4415
4434 private: 4416 private:
4435 HSub(HValue* context, HValue* left, HValue* right) 4417 HSub(HValue* context, HValue* left, HValue* right)
4436 : HArithmeticBinaryOperation(context, left, right) { 4418 : HArithmeticBinaryOperation(context, left, right) {
4437 SetFlag(kCanOverflow); 4419 SetFlag(kCanOverflow);
4438 } 4420 }
4439 }; 4421 };
4440 4422
4441 4423
4442 class HMul V8_FINAL : public HArithmeticBinaryOperation { 4424 class HMul: public HArithmeticBinaryOperation {
4443 public: 4425 public:
4444 static HInstruction* New(Zone* zone, 4426 static HInstruction* New(Zone* zone,
4445 HValue* context, 4427 HValue* context,
4446 HValue* left, 4428 HValue* left,
4447 HValue* right); 4429 HValue* right);
4448 4430
4449 static HInstruction* NewImul(Zone* zone, 4431 static HInstruction* NewImul(Zone* zone,
4450 HValue* context, 4432 HValue* context,
4451 HValue* left, 4433 HValue* left,
4452 HValue* right) { 4434 HValue* right) {
4453 HMul* mul = new(zone) HMul(context, left, right); 4435 HMul* mul = new(zone) HMul(context, left, right);
4454 // TODO(mstarzinger): Prevent bailout on minus zero for imul. 4436 // TODO(mstarzinger): Prevent bailout on minus zero for imul.
4455 mul->AssumeRepresentation(Representation::Integer32()); 4437 mul->AssumeRepresentation(Representation::Integer32());
4456 mul->ClearFlag(HValue::kCanOverflow); 4438 mul->ClearFlag(HValue::kCanOverflow);
4457 return mul; 4439 return mul;
4458 } 4440 }
4459 4441
4460 virtual HValue* EnsureAndPropagateNotMinusZero( 4442 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
4461 BitVector* visited) V8_OVERRIDE;
4462 4443
4463 virtual HValue* Canonicalize() V8_OVERRIDE; 4444 virtual HValue* Canonicalize();
4464 4445
4465 // Only commutative if it is certain that not two objects are multiplicated. 4446 // Only commutative if it is certain that not two objects are multiplicated.
4466 virtual bool IsCommutative() const V8_OVERRIDE { 4447 virtual bool IsCommutative() const {
4467 return !representation().IsTagged(); 4448 return !representation().IsTagged();
4468 } 4449 }
4469 4450
4470 virtual void UpdateRepresentation(Representation new_rep, 4451 virtual void UpdateRepresentation(Representation new_rep,
4471 HInferRepresentationPhase* h_infer, 4452 HInferRepresentationPhase* h_infer,
4472 const char* reason) V8_OVERRIDE { 4453 const char* reason) {
4473 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 4454 if (new_rep.IsSmi()) new_rep = Representation::Integer32();
4474 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4455 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4475 } 4456 }
4476 4457
4477 DECLARE_CONCRETE_INSTRUCTION(Mul) 4458 DECLARE_CONCRETE_INSTRUCTION(Mul)
4478 4459
4479 protected: 4460 protected:
4480 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 4461 virtual bool DataEquals(HValue* other) { return true; }
4481 4462
4482 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 4463 virtual Range* InferRange(Zone* zone);
4483 4464
4484 private: 4465 private:
4485 HMul(HValue* context, HValue* left, HValue* right) 4466 HMul(HValue* context, HValue* left, HValue* right)
4486 : HArithmeticBinaryOperation(context, left, right) { 4467 : HArithmeticBinaryOperation(context, left, right) {
4487 SetFlag(kCanOverflow); 4468 SetFlag(kCanOverflow);
4488 } 4469 }
4489 }; 4470 };
4490 4471
4491 4472
4492 class HMod V8_FINAL : public HArithmeticBinaryOperation { 4473 class HMod: public HArithmeticBinaryOperation {
4493 public: 4474 public:
4494 static HInstruction* New(Zone* zone, 4475 static HInstruction* New(Zone* zone,
4495 HValue* context, 4476 HValue* context,
4496 HValue* left, 4477 HValue* left,
4497 HValue* right, 4478 HValue* right,
4498 Maybe<int> fixed_right_arg); 4479 Maybe<int> fixed_right_arg);
4499 4480
4500 Maybe<int> fixed_right_arg() const { return fixed_right_arg_; } 4481 Maybe<int> fixed_right_arg() const { return fixed_right_arg_; }
4501 4482
4502 bool HasPowerOf2Divisor() { 4483 bool HasPowerOf2Divisor() {
4503 if (right()->IsConstant() && 4484 if (right()->IsConstant() &&
4504 HConstant::cast(right())->HasInteger32Value()) { 4485 HConstant::cast(right())->HasInteger32Value()) {
4505 int32_t value = HConstant::cast(right())->Integer32Value(); 4486 int32_t value = HConstant::cast(right())->Integer32Value();
4506 return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value)); 4487 return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value));
4507 } 4488 }
4508 4489
4509 return false; 4490 return false;
4510 } 4491 }
4511 4492
4512 virtual HValue* EnsureAndPropagateNotMinusZero( 4493 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
4513 BitVector* visited) V8_OVERRIDE;
4514 4494
4515 virtual HValue* Canonicalize() V8_OVERRIDE; 4495 virtual HValue* Canonicalize();
4516 4496
4517 virtual void UpdateRepresentation(Representation new_rep, 4497 virtual void UpdateRepresentation(Representation new_rep,
4518 HInferRepresentationPhase* h_infer, 4498 HInferRepresentationPhase* h_infer,
4519 const char* reason) V8_OVERRIDE { 4499 const char* reason) {
4520 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 4500 if (new_rep.IsSmi()) new_rep = Representation::Integer32();
4521 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4501 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4522 } 4502 }
4523 4503
4524 DECLARE_CONCRETE_INSTRUCTION(Mod) 4504 DECLARE_CONCRETE_INSTRUCTION(Mod)
4525 4505
4526 protected: 4506 protected:
4527 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 4507 virtual bool DataEquals(HValue* other) { return true; }
4528 4508
4529 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 4509 virtual Range* InferRange(Zone* zone);
4530 4510
4531 private: 4511 private:
4532 HMod(HValue* context, 4512 HMod(HValue* context,
4533 HValue* left, 4513 HValue* left,
4534 HValue* right, 4514 HValue* right,
4535 Maybe<int> fixed_right_arg) 4515 Maybe<int> fixed_right_arg)
4536 : HArithmeticBinaryOperation(context, left, right), 4516 : HArithmeticBinaryOperation(context, left, right),
4537 fixed_right_arg_(fixed_right_arg) { 4517 fixed_right_arg_(fixed_right_arg) {
4538 SetFlag(kCanBeDivByZero); 4518 SetFlag(kCanBeDivByZero);
4539 SetFlag(kCanOverflow); 4519 SetFlag(kCanOverflow);
4540 } 4520 }
4541 4521
4542 const Maybe<int> fixed_right_arg_; 4522 const Maybe<int> fixed_right_arg_;
4543 }; 4523 };
4544 4524
4545 4525
4546 class HDiv V8_FINAL : public HArithmeticBinaryOperation { 4526 class HDiv: public HArithmeticBinaryOperation {
4547 public: 4527 public:
4548 static HInstruction* New(Zone* zone, 4528 static HInstruction* New(Zone* zone,
4549 HValue* context, 4529 HValue* context,
4550 HValue* left, 4530 HValue* left,
4551 HValue* right); 4531 HValue* right);
4552 4532
4553 bool HasPowerOf2Divisor() { 4533 bool HasPowerOf2Divisor() {
4554 if (right()->IsInteger32Constant()) { 4534 if (right()->IsInteger32Constant()) {
4555 int32_t value = right()->GetInteger32Constant(); 4535 int32_t value = right()->GetInteger32Constant();
4556 return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value)); 4536 return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value));
4557 } 4537 }
4558 4538
4559 return false; 4539 return false;
4560 } 4540 }
4561 4541
4562 virtual HValue* EnsureAndPropagateNotMinusZero( 4542 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
4563 BitVector* visited) V8_OVERRIDE;
4564 4543
4565 virtual HValue* Canonicalize() V8_OVERRIDE; 4544 virtual HValue* Canonicalize();
4566 4545
4567 virtual void UpdateRepresentation(Representation new_rep, 4546 virtual void UpdateRepresentation(Representation new_rep,
4568 HInferRepresentationPhase* h_infer, 4547 HInferRepresentationPhase* h_infer,
4569 const char* reason) V8_OVERRIDE { 4548 const char* reason) {
4570 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 4549 if (new_rep.IsSmi()) new_rep = Representation::Integer32();
4571 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4550 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4572 } 4551 }
4573 4552
4574 DECLARE_CONCRETE_INSTRUCTION(Div) 4553 DECLARE_CONCRETE_INSTRUCTION(Div)
4575 4554
4576 protected: 4555 protected:
4577 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 4556 virtual bool DataEquals(HValue* other) { return true; }
4578 4557
4579 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 4558 virtual Range* InferRange(Zone* zone);
4580 4559
4581 private: 4560 private:
4582 HDiv(HValue* context, HValue* left, HValue* right) 4561 HDiv(HValue* context, HValue* left, HValue* right)
4583 : HArithmeticBinaryOperation(context, left, right) { 4562 : HArithmeticBinaryOperation(context, left, right) {
4584 SetFlag(kCanBeDivByZero); 4563 SetFlag(kCanBeDivByZero);
4585 SetFlag(kCanOverflow); 4564 SetFlag(kCanOverflow);
4586 } 4565 }
4587 }; 4566 };
4588 4567
4589 4568
4590 class HMathMinMax V8_FINAL : public HArithmeticBinaryOperation { 4569 class HMathMinMax: public HArithmeticBinaryOperation {
4591 public: 4570 public:
4592 enum Operation { kMathMin, kMathMax }; 4571 enum Operation { kMathMin, kMathMax };
4593 4572
4594 static HInstruction* New(Zone* zone, 4573 static HInstruction* New(Zone* zone,
4595 HValue* context, 4574 HValue* context,
4596 HValue* left, 4575 HValue* left,
4597 HValue* right, 4576 HValue* right,
4598 Operation op); 4577 Operation op);
4599 4578
4600 virtual Representation observed_input_representation(int index) V8_OVERRIDE { 4579 virtual Representation RequiredInputRepresentation(int index) {
4580 return index == 0 ? Representation::Tagged()
4581 : representation();
4582 }
4583
4584 virtual Representation observed_input_representation(int index) {
4601 return RequiredInputRepresentation(index); 4585 return RequiredInputRepresentation(index);
4602 } 4586 }
4603 4587
4604 virtual void InferRepresentation( 4588 virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
4605 HInferRepresentationPhase* h_infer) V8_OVERRIDE;
4606 4589
4607 virtual Representation RepresentationFromInputs() V8_OVERRIDE { 4590 virtual Representation RepresentationFromInputs() {
4608 Representation left_rep = left()->representation(); 4591 Representation left_rep = left()->representation();
4609 Representation right_rep = right()->representation(); 4592 Representation right_rep = right()->representation();
4610 Representation result = Representation::Smi(); 4593 Representation result = Representation::Smi();
4611 result = result.generalize(left_rep); 4594 result = result.generalize(left_rep);
4612 result = result.generalize(right_rep); 4595 result = result.generalize(right_rep);
4613 if (result.IsTagged()) return Representation::Double(); 4596 if (result.IsTagged()) return Representation::Double();
4614 return result; 4597 return result;
4615 } 4598 }
4616 4599
4617 virtual bool IsCommutative() const V8_OVERRIDE { return true; } 4600 virtual bool IsCommutative() const { return true; }
4618 4601
4619 Operation operation() { return operation_; } 4602 Operation operation() { return operation_; }
4620 4603
4621 DECLARE_CONCRETE_INSTRUCTION(MathMinMax) 4604 DECLARE_CONCRETE_INSTRUCTION(MathMinMax)
4622 4605
4623 protected: 4606 protected:
4624 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 4607 virtual bool DataEquals(HValue* other) {
4625 return other->IsMathMinMax() && 4608 return other->IsMathMinMax() &&
4626 HMathMinMax::cast(other)->operation_ == operation_; 4609 HMathMinMax::cast(other)->operation_ == operation_;
4627 } 4610 }
4628 4611
4629 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 4612 virtual Range* InferRange(Zone* zone);
4630 4613
4631 private: 4614 private:
4632 HMathMinMax(HValue* context, HValue* left, HValue* right, Operation op) 4615 HMathMinMax(HValue* context, HValue* left, HValue* right, Operation op)
4633 : HArithmeticBinaryOperation(context, left, right), 4616 : HArithmeticBinaryOperation(context, left, right),
4634 operation_(op) { } 4617 operation_(op) { }
4635 4618
4636 Operation operation_; 4619 Operation operation_;
4637 }; 4620 };
4638 4621
4639 4622
4640 class HBitwise V8_FINAL : public HBitwiseBinaryOperation { 4623 class HBitwise: public HBitwiseBinaryOperation {
4641 public: 4624 public:
4642 static HInstruction* New(Zone* zone, 4625 static HInstruction* New(Zone* zone,
4643 HValue* context, 4626 HValue* context,
4644 Token::Value op, 4627 Token::Value op,
4645 HValue* left, 4628 HValue* left,
4646 HValue* right); 4629 HValue* right);
4647 4630
4648 Token::Value op() const { return op_; } 4631 Token::Value op() const { return op_; }
4649 4632
4650 virtual bool IsCommutative() const V8_OVERRIDE { return true; } 4633 virtual bool IsCommutative() const { return true; }
4651 4634
4652 virtual HValue* Canonicalize() V8_OVERRIDE; 4635 virtual HValue* Canonicalize();
4653 4636
4654 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 4637 virtual void PrintDataTo(StringStream* stream);
4655 4638
4656 DECLARE_CONCRETE_INSTRUCTION(Bitwise) 4639 DECLARE_CONCRETE_INSTRUCTION(Bitwise)
4657 4640
4658 protected: 4641 protected:
4659 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 4642 virtual bool DataEquals(HValue* other) {
4660 return op() == HBitwise::cast(other)->op(); 4643 return op() == HBitwise::cast(other)->op();
4661 } 4644 }
4662 4645
4663 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 4646 virtual Range* InferRange(Zone* zone);
4664 4647
4665 private: 4648 private:
4666 HBitwise(HValue* context, 4649 HBitwise(HValue* context,
4667 Token::Value op, 4650 Token::Value op,
4668 HValue* left, 4651 HValue* left,
4669 HValue* right) 4652 HValue* right)
4670 : HBitwiseBinaryOperation(context, left, right, HType::TaggedNumber()), 4653 : HBitwiseBinaryOperation(context, left, right, HType::TaggedNumber()),
4671 op_(op) { 4654 op_(op) {
4672 ASSERT(op == Token::BIT_AND || op == Token::BIT_OR || op == Token::BIT_XOR); 4655 ASSERT(op == Token::BIT_AND || op == Token::BIT_OR || op == Token::BIT_XOR);
4673 // BIT_AND with a smi-range positive value will always unset the 4656 // BIT_AND with a smi-range positive value will always unset the
(...skipping 16 matching lines...) Expand all
4690 right->representation().IsSmi() && 4673 right->representation().IsSmi() &&
4691 HConstant::cast(right)->Integer32Value() < 0))) { 4674 HConstant::cast(right)->Integer32Value() < 0))) {
4692 SetFlag(kTruncatingToSmi); 4675 SetFlag(kTruncatingToSmi);
4693 } 4676 }
4694 } 4677 }
4695 4678
4696 Token::Value op_; 4679 Token::Value op_;
4697 }; 4680 };
4698 4681
4699 4682
4700 class HShl V8_FINAL : public HBitwiseBinaryOperation { 4683 class HShl: public HBitwiseBinaryOperation {
4701 public: 4684 public:
4702 static HInstruction* New(Zone* zone, 4685 static HInstruction* New(Zone* zone,
4703 HValue* context, 4686 HValue* context,
4704 HValue* left, 4687 HValue* left,
4705 HValue* right); 4688 HValue* right);
4706 4689
4707 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 4690 virtual Range* InferRange(Zone* zone);
4708 4691
4709 virtual void UpdateRepresentation(Representation new_rep, 4692 virtual void UpdateRepresentation(Representation new_rep,
4710 HInferRepresentationPhase* h_infer, 4693 HInferRepresentationPhase* h_infer,
4711 const char* reason) V8_OVERRIDE { 4694 const char* reason) {
4712 if (new_rep.IsSmi() && 4695 if (new_rep.IsSmi() &&
4713 !(right()->IsInteger32Constant() && 4696 !(right()->IsInteger32Constant() &&
4714 right()->GetInteger32Constant() >= 0)) { 4697 right()->GetInteger32Constant() >= 0)) {
4715 new_rep = Representation::Integer32(); 4698 new_rep = Representation::Integer32();
4716 } 4699 }
4717 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4700 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4718 } 4701 }
4719 4702
4720 DECLARE_CONCRETE_INSTRUCTION(Shl) 4703 DECLARE_CONCRETE_INSTRUCTION(Shl)
4721 4704
4722 protected: 4705 protected:
4723 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 4706 virtual bool DataEquals(HValue* other) { return true; }
4724 4707
4725 private: 4708 private:
4726 HShl(HValue* context, HValue* left, HValue* right) 4709 HShl(HValue* context, HValue* left, HValue* right)
4727 : HBitwiseBinaryOperation(context, left, right) { } 4710 : HBitwiseBinaryOperation(context, left, right) { }
4728 }; 4711 };
4729 4712
4730 4713
4731 class HShr V8_FINAL : public HBitwiseBinaryOperation { 4714 class HShr: public HBitwiseBinaryOperation {
4732 public: 4715 public:
4733 static HInstruction* New(Zone* zone, 4716 static HInstruction* New(Zone* zone,
4734 HValue* context, 4717 HValue* context,
4735 HValue* left, 4718 HValue* left,
4736 HValue* right); 4719 HValue* right);
4737 4720
4738 virtual bool TryDecompose(DecompositionResult* decomposition) V8_OVERRIDE { 4721 virtual bool TryDecompose(DecompositionResult* decomposition) {
4739 if (right()->IsInteger32Constant()) { 4722 if (right()->IsInteger32Constant()) {
4740 if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) { 4723 if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) {
4741 // This is intended to look for HAdd and HSub, to handle compounds 4724 // This is intended to look for HAdd and HSub, to handle compounds
4742 // like ((base + offset) >> scale) with one single decomposition. 4725 // like ((base + offset) >> scale) with one single decomposition.
4743 left()->TryDecompose(decomposition); 4726 left()->TryDecompose(decomposition);
4744 return true; 4727 return true;
4745 } 4728 }
4746 } 4729 }
4747 return false; 4730 return false;
4748 } 4731 }
4749 4732
4750 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 4733 virtual Range* InferRange(Zone* zone);
4751 4734
4752 virtual void UpdateRepresentation(Representation new_rep, 4735 virtual void UpdateRepresentation(Representation new_rep,
4753 HInferRepresentationPhase* h_infer, 4736 HInferRepresentationPhase* h_infer,
4754 const char* reason) V8_OVERRIDE { 4737 const char* reason) {
4755 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 4738 if (new_rep.IsSmi()) new_rep = Representation::Integer32();
4756 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4739 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4757 } 4740 }
4758 4741
4759 DECLARE_CONCRETE_INSTRUCTION(Shr) 4742 DECLARE_CONCRETE_INSTRUCTION(Shr)
4760 4743
4761 protected: 4744 protected:
4762 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 4745 virtual bool DataEquals(HValue* other) { return true; }
4763 4746
4764 private: 4747 private:
4765 HShr(HValue* context, HValue* left, HValue* right) 4748 HShr(HValue* context, HValue* left, HValue* right)
4766 : HBitwiseBinaryOperation(context, left, right) { } 4749 : HBitwiseBinaryOperation(context, left, right) { }
4767 }; 4750 };
4768 4751
4769 4752
4770 class HSar V8_FINAL : public HBitwiseBinaryOperation { 4753 class HSar: public HBitwiseBinaryOperation {
4771 public: 4754 public:
4772 static HInstruction* New(Zone* zone, 4755 static HInstruction* New(Zone* zone,
4773 HValue* context, 4756 HValue* context,
4774 HValue* left, 4757 HValue* left,
4775 HValue* right); 4758 HValue* right);
4776 4759
4777 virtual bool TryDecompose(DecompositionResult* decomposition) V8_OVERRIDE { 4760 virtual bool TryDecompose(DecompositionResult* decomposition) {
4778 if (right()->IsInteger32Constant()) { 4761 if (right()->IsInteger32Constant()) {
4779 if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) { 4762 if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) {
4780 // This is intended to look for HAdd and HSub, to handle compounds 4763 // This is intended to look for HAdd and HSub, to handle compounds
4781 // like ((base + offset) >> scale) with one single decomposition. 4764 // like ((base + offset) >> scale) with one single decomposition.
4782 left()->TryDecompose(decomposition); 4765 left()->TryDecompose(decomposition);
4783 return true; 4766 return true;
4784 } 4767 }
4785 } 4768 }
4786 return false; 4769 return false;
4787 } 4770 }
4788 4771
4789 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 4772 virtual Range* InferRange(Zone* zone);
4790 4773
4791 virtual void UpdateRepresentation(Representation new_rep, 4774 virtual void UpdateRepresentation(Representation new_rep,
4792 HInferRepresentationPhase* h_infer, 4775 HInferRepresentationPhase* h_infer,
4793 const char* reason) V8_OVERRIDE { 4776 const char* reason) {
4794 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 4777 if (new_rep.IsSmi()) new_rep = Representation::Integer32();
4795 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4778 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4796 } 4779 }
4797 4780
4798 DECLARE_CONCRETE_INSTRUCTION(Sar) 4781 DECLARE_CONCRETE_INSTRUCTION(Sar)
4799 4782
4800 protected: 4783 protected:
4801 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 4784 virtual bool DataEquals(HValue* other) { return true; }
4802 4785
4803 private: 4786 private:
4804 HSar(HValue* context, HValue* left, HValue* right) 4787 HSar(HValue* context, HValue* left, HValue* right)
4805 : HBitwiseBinaryOperation(context, left, right) { } 4788 : HBitwiseBinaryOperation(context, left, right) { }
4806 }; 4789 };
4807 4790
4808 4791
4809 class HRor V8_FINAL : public HBitwiseBinaryOperation { 4792 class HRor: public HBitwiseBinaryOperation {
4810 public: 4793 public:
4811 HRor(HValue* context, HValue* left, HValue* right) 4794 HRor(HValue* context, HValue* left, HValue* right)
4812 : HBitwiseBinaryOperation(context, left, right) { 4795 : HBitwiseBinaryOperation(context, left, right) {
4813 ChangeRepresentation(Representation::Integer32()); 4796 ChangeRepresentation(Representation::Integer32());
4814 } 4797 }
4815 4798
4816 virtual void UpdateRepresentation(Representation new_rep, 4799 virtual void UpdateRepresentation(Representation new_rep,
4817 HInferRepresentationPhase* h_infer, 4800 HInferRepresentationPhase* h_infer,
4818 const char* reason) V8_OVERRIDE { 4801 const char* reason) {
4819 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 4802 if (new_rep.IsSmi()) new_rep = Representation::Integer32();
4820 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4803 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4821 } 4804 }
4822 4805
4823 DECLARE_CONCRETE_INSTRUCTION(Ror) 4806 DECLARE_CONCRETE_INSTRUCTION(Ror)
4824 4807
4825 protected: 4808 protected:
4826 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 4809 virtual bool DataEquals(HValue* other) { return true; }
4827 }; 4810 };
4828 4811
4829 4812
4830 class HOsrEntry V8_FINAL : public HTemplateInstruction<0> { 4813 class HOsrEntry: public HTemplateInstruction<0> {
4831 public: 4814 public:
4832 DECLARE_INSTRUCTION_FACTORY_P1(HOsrEntry, BailoutId); 4815 DECLARE_INSTRUCTION_FACTORY_P1(HOsrEntry, BailoutId);
4833 4816
4834 BailoutId ast_id() const { return ast_id_; } 4817 BailoutId ast_id() const { return ast_id_; }
4835 4818
4836 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4819 virtual Representation RequiredInputRepresentation(int index) {
4837 return Representation::None(); 4820 return Representation::None();
4838 } 4821 }
4839 4822
4840 DECLARE_CONCRETE_INSTRUCTION(OsrEntry) 4823 DECLARE_CONCRETE_INSTRUCTION(OsrEntry)
4841 4824
4842 private: 4825 private:
4843 explicit HOsrEntry(BailoutId ast_id) : ast_id_(ast_id) { 4826 explicit HOsrEntry(BailoutId ast_id) : ast_id_(ast_id) {
4844 SetGVNFlag(kChangesOsrEntries); 4827 SetGVNFlag(kChangesOsrEntries);
4845 SetGVNFlag(kChangesNewSpacePromotion); 4828 SetGVNFlag(kChangesNewSpacePromotion);
4846 } 4829 }
4847 4830
4848 BailoutId ast_id_; 4831 BailoutId ast_id_;
4849 }; 4832 };
4850 4833
4851 4834
4852 class HParameter V8_FINAL : public HTemplateInstruction<0> { 4835 class HParameter: public HTemplateInstruction<0> {
4853 public: 4836 public:
4854 enum ParameterKind { 4837 enum ParameterKind {
4855 STACK_PARAMETER, 4838 STACK_PARAMETER,
4856 REGISTER_PARAMETER 4839 REGISTER_PARAMETER
4857 }; 4840 };
4858 4841
4859 DECLARE_INSTRUCTION_FACTORY_P1(HParameter, unsigned); 4842 DECLARE_INSTRUCTION_FACTORY_P1(HParameter, unsigned);
4860 DECLARE_INSTRUCTION_FACTORY_P2(HParameter, unsigned, ParameterKind); 4843 DECLARE_INSTRUCTION_FACTORY_P2(HParameter, unsigned, ParameterKind);
4861 DECLARE_INSTRUCTION_FACTORY_P3(HParameter, unsigned, ParameterKind, 4844 DECLARE_INSTRUCTION_FACTORY_P3(HParameter, unsigned, ParameterKind,
4862 Representation); 4845 Representation);
4863 4846
4864 unsigned index() const { return index_; } 4847 unsigned index() const { return index_; }
4865 ParameterKind kind() const { return kind_; } 4848 ParameterKind kind() const { return kind_; }
4866 4849
4867 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 4850 virtual void PrintDataTo(StringStream* stream);
4868 4851
4869 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4852 virtual Representation RequiredInputRepresentation(int index) {
4870 return Representation::None(); 4853 return Representation::None();
4871 } 4854 }
4872 4855
4873 DECLARE_CONCRETE_INSTRUCTION(Parameter) 4856 DECLARE_CONCRETE_INSTRUCTION(Parameter)
4874 4857
4875 private: 4858 private:
4876 explicit HParameter(unsigned index, 4859 explicit HParameter(unsigned index,
4877 ParameterKind kind = STACK_PARAMETER) 4860 ParameterKind kind = STACK_PARAMETER)
4878 : index_(index), 4861 : index_(index),
4879 kind_(kind) { 4862 kind_(kind) {
4880 set_representation(Representation::Tagged()); 4863 set_representation(Representation::Tagged());
4881 } 4864 }
4882 4865
4883 explicit HParameter(unsigned index, 4866 explicit HParameter(unsigned index,
4884 ParameterKind kind, 4867 ParameterKind kind,
4885 Representation r) 4868 Representation r)
4886 : index_(index), 4869 : index_(index),
4887 kind_(kind) { 4870 kind_(kind) {
4888 set_representation(r); 4871 set_representation(r);
4889 } 4872 }
4890 4873
4891 unsigned index_; 4874 unsigned index_;
4892 ParameterKind kind_; 4875 ParameterKind kind_;
4893 }; 4876 };
4894 4877
4895 4878
4896 class HCallStub V8_FINAL : public HUnaryCall { 4879 class HCallStub: public HUnaryCall {
4897 public: 4880 public:
4898 HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) 4881 HCallStub(HValue* context, CodeStub::Major major_key, int argument_count)
4899 : HUnaryCall(context, argument_count), 4882 : HUnaryCall(context, argument_count),
4900 major_key_(major_key), 4883 major_key_(major_key),
4901 transcendental_type_(TranscendentalCache::kNumberOfCaches) { 4884 transcendental_type_(TranscendentalCache::kNumberOfCaches) {
4902 } 4885 }
4903 4886
4904 CodeStub::Major major_key() { return major_key_; } 4887 CodeStub::Major major_key() { return major_key_; }
4905 4888
4906 HValue* context() { return value(); } 4889 HValue* context() { return value(); }
4907 4890
4908 void set_transcendental_type(TranscendentalCache::Type transcendental_type) { 4891 void set_transcendental_type(TranscendentalCache::Type transcendental_type) {
4909 transcendental_type_ = transcendental_type; 4892 transcendental_type_ = transcendental_type;
4910 } 4893 }
4911 TranscendentalCache::Type transcendental_type() { 4894 TranscendentalCache::Type transcendental_type() {
4912 return transcendental_type_; 4895 return transcendental_type_;
4913 } 4896 }
4914 4897
4915 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 4898 virtual void PrintDataTo(StringStream* stream);
4899
4900 virtual Representation RequiredInputRepresentation(int index) {
4901 return Representation::Tagged();
4902 }
4916 4903
4917 DECLARE_CONCRETE_INSTRUCTION(CallStub) 4904 DECLARE_CONCRETE_INSTRUCTION(CallStub)
4918 4905
4919 private: 4906 private:
4920 CodeStub::Major major_key_; 4907 CodeStub::Major major_key_;
4921 TranscendentalCache::Type transcendental_type_; 4908 TranscendentalCache::Type transcendental_type_;
4922 }; 4909 };
4923 4910
4924 4911
4925 class HUnknownOSRValue V8_FINAL : public HTemplateInstruction<0> { 4912 class HUnknownOSRValue: public HTemplateInstruction<0> {
4926 public: 4913 public:
4927 DECLARE_INSTRUCTION_FACTORY_P0(HUnknownOSRValue) 4914 DECLARE_INSTRUCTION_FACTORY_P0(HUnknownOSRValue)
4928 4915
4929 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4916 virtual Representation RequiredInputRepresentation(int index) {
4930 return Representation::None(); 4917 return Representation::None();
4931 } 4918 }
4932 4919
4933 void set_incoming_value(HPhi* value) { 4920 void set_incoming_value(HPhi* value) {
4934 incoming_value_ = value; 4921 incoming_value_ = value;
4935 } 4922 }
4936 4923
4937 HPhi* incoming_value() { 4924 HPhi* incoming_value() {
4938 return incoming_value_; 4925 return incoming_value_;
4939 } 4926 }
4940 4927
4941 virtual Representation KnownOptimalRepresentation() V8_OVERRIDE { 4928 virtual Representation KnownOptimalRepresentation() {
4942 if (incoming_value_ == NULL) return Representation::None(); 4929 if (incoming_value_ == NULL) return Representation::None();
4943 return incoming_value_->KnownOptimalRepresentation(); 4930 return incoming_value_->KnownOptimalRepresentation();
4944 } 4931 }
4945 4932
4946 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue) 4933 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue)
4947 4934
4948 private: 4935 private:
4949 HUnknownOSRValue() 4936 HUnknownOSRValue()
4950 : incoming_value_(NULL) { 4937 : incoming_value_(NULL) {
4951 set_representation(Representation::Tagged()); 4938 set_representation(Representation::Tagged());
4952 } 4939 }
4953 4940
4954 HPhi* incoming_value_; 4941 HPhi* incoming_value_;
4955 }; 4942 };
4956 4943
4957 4944
4958 class HLoadGlobalCell V8_FINAL : public HTemplateInstruction<0> { 4945 class HLoadGlobalCell: public HTemplateInstruction<0> {
4959 public: 4946 public:
4960 HLoadGlobalCell(Handle<Cell> cell, PropertyDetails details) 4947 HLoadGlobalCell(Handle<Cell> cell, PropertyDetails details)
4961 : cell_(cell), details_(details), unique_id_() { 4948 : cell_(cell), details_(details), unique_id_() {
4962 set_representation(Representation::Tagged()); 4949 set_representation(Representation::Tagged());
4963 SetFlag(kUseGVN); 4950 SetFlag(kUseGVN);
4964 SetGVNFlag(kDependsOnGlobalVars); 4951 SetGVNFlag(kDependsOnGlobalVars);
4965 } 4952 }
4966 4953
4967 Handle<Cell> cell() const { return cell_; } 4954 Handle<Cell> cell() const { return cell_; }
4968 bool RequiresHoleCheck() const; 4955 bool RequiresHoleCheck() const;
4969 4956
4970 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 4957 virtual void PrintDataTo(StringStream* stream);
4971 4958
4972 virtual intptr_t Hashcode() V8_OVERRIDE { 4959 virtual intptr_t Hashcode() {
4973 return unique_id_.Hashcode(); 4960 return unique_id_.Hashcode();
4974 } 4961 }
4975 4962
4976 virtual void FinalizeUniqueValueId() V8_OVERRIDE { 4963 virtual void FinalizeUniqueValueId() {
4977 unique_id_ = UniqueValueId(cell_); 4964 unique_id_ = UniqueValueId(cell_);
4978 } 4965 }
4979 4966
4980 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4967 virtual Representation RequiredInputRepresentation(int index) {
4981 return Representation::None(); 4968 return Representation::None();
4982 } 4969 }
4983 4970
4984 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell) 4971 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell)
4985 4972
4986 protected: 4973 protected:
4987 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 4974 virtual bool DataEquals(HValue* other) {
4988 HLoadGlobalCell* b = HLoadGlobalCell::cast(other); 4975 HLoadGlobalCell* b = HLoadGlobalCell::cast(other);
4989 return unique_id_ == b->unique_id_; 4976 return unique_id_ == b->unique_id_;
4990 } 4977 }
4991 4978
4992 private: 4979 private:
4993 virtual bool IsDeletable() const V8_OVERRIDE { return !RequiresHoleCheck(); } 4980 virtual bool IsDeletable() const { return !RequiresHoleCheck(); }
4994 4981
4995 Handle<Cell> cell_; 4982 Handle<Cell> cell_;
4996 PropertyDetails details_; 4983 PropertyDetails details_;
4997 UniqueValueId unique_id_; 4984 UniqueValueId unique_id_;
4998 }; 4985 };
4999 4986
5000 4987
5001 class HLoadGlobalGeneric V8_FINAL : public HTemplateInstruction<2> { 4988 class HLoadGlobalGeneric: public HTemplateInstruction<2> {
5002 public: 4989 public:
5003 HLoadGlobalGeneric(HValue* context, 4990 HLoadGlobalGeneric(HValue* context,
5004 HValue* global_object, 4991 HValue* global_object,
5005 Handle<Object> name, 4992 Handle<Object> name,
5006 bool for_typeof) 4993 bool for_typeof)
5007 : name_(name), 4994 : name_(name),
5008 for_typeof_(for_typeof) { 4995 for_typeof_(for_typeof) {
5009 SetOperandAt(0, context); 4996 SetOperandAt(0, context);
5010 SetOperandAt(1, global_object); 4997 SetOperandAt(1, global_object);
5011 set_representation(Representation::Tagged()); 4998 set_representation(Representation::Tagged());
5012 SetAllSideEffects(); 4999 SetAllSideEffects();
5013 } 5000 }
5014 5001
5015 HValue* context() { return OperandAt(0); } 5002 HValue* context() { return OperandAt(0); }
5016 HValue* global_object() { return OperandAt(1); } 5003 HValue* global_object() { return OperandAt(1); }
5017 Handle<Object> name() const { return name_; } 5004 Handle<Object> name() const { return name_; }
5018 bool for_typeof() const { return for_typeof_; } 5005 bool for_typeof() const { return for_typeof_; }
5019 5006
5020 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5007 virtual void PrintDataTo(StringStream* stream);
5021 5008
5022 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5009 virtual Representation RequiredInputRepresentation(int index) {
5023 return Representation::Tagged(); 5010 return Representation::Tagged();
5024 } 5011 }
5025 5012
5026 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric) 5013 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric)
5027 5014
5028 private: 5015 private:
5029 Handle<Object> name_; 5016 Handle<Object> name_;
5030 bool for_typeof_; 5017 bool for_typeof_;
5031 }; 5018 };
5032 5019
5033 5020
5034 class HAllocate V8_FINAL : public HTemplateInstruction<2> { 5021 class HAllocate: public HTemplateInstruction<2> {
5035 public: 5022 public:
5036 static HAllocate* New(Zone* zone, 5023 static HAllocate* New(Zone* zone,
5037 HValue* context, 5024 HValue* context,
5038 HValue* size, 5025 HValue* size,
5039 HType type, 5026 HType type,
5040 PretenureFlag pretenure_flag, 5027 PretenureFlag pretenure_flag,
5041 InstanceType instance_type) { 5028 InstanceType instance_type) {
5042 return new(zone) HAllocate(context, size, type, pretenure_flag, 5029 return new(zone) HAllocate(context, size, type, pretenure_flag,
5043 instance_type); 5030 instance_type);
5044 } 5031 }
5045 5032
5046 // Maximum instance size for which allocations will be inlined. 5033 // Maximum instance size for which allocations will be inlined.
5047 static const int kMaxInlineSize = 64 * kPointerSize; 5034 static const int kMaxInlineSize = 64 * kPointerSize;
5048 5035
5049 HValue* context() { return OperandAt(0); } 5036 HValue* context() { return OperandAt(0); }
5050 HValue* size() { return OperandAt(1); } 5037 HValue* size() { return OperandAt(1); }
5051 5038
5052 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5039 virtual Representation RequiredInputRepresentation(int index) {
5053 if (index == 0) { 5040 if (index == 0) {
5054 return Representation::Tagged(); 5041 return Representation::Tagged();
5055 } else { 5042 } else {
5056 return Representation::Integer32(); 5043 return Representation::Integer32();
5057 } 5044 }
5058 } 5045 }
5059 5046
5060 virtual Handle<Map> GetMonomorphicJSObjectMap() { 5047 virtual Handle<Map> GetMonomorphicJSObjectMap() {
5061 return known_initial_map_; 5048 return known_initial_map_;
5062 } 5049 }
(...skipping 28 matching lines...) Expand all
5091 5078
5092 void MakeDoubleAligned() { 5079 void MakeDoubleAligned() {
5093 flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED); 5080 flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED);
5094 } 5081 }
5095 5082
5096 void UpdateSize(HValue* size) { 5083 void UpdateSize(HValue* size) {
5097 SetOperandAt(1, size); 5084 SetOperandAt(1, size);
5098 } 5085 }
5099 5086
5100 virtual void HandleSideEffectDominator(GVNFlag side_effect, 5087 virtual void HandleSideEffectDominator(GVNFlag side_effect,
5101 HValue* dominator) V8_OVERRIDE; 5088 HValue* dominator);
5102 5089
5103 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5090 virtual void PrintDataTo(StringStream* stream);
5104 5091
5105 DECLARE_CONCRETE_INSTRUCTION(Allocate) 5092 DECLARE_CONCRETE_INSTRUCTION(Allocate)
5106 5093
5107 private: 5094 private:
5108 enum Flags { 5095 enum Flags {
5109 ALLOCATE_IN_NEW_SPACE = 1 << 0, 5096 ALLOCATE_IN_NEW_SPACE = 1 << 0,
5110 ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1, 5097 ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1,
5111 ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2, 5098 ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2,
5112 ALLOCATE_DOUBLE_ALIGNED = 1 << 3, 5099 ALLOCATE_DOUBLE_ALIGNED = 1 << 3,
5113 PREFILL_WITH_FILLER = 1 << 4 5100 PREFILL_WITH_FILLER = 1 << 4
(...skipping 19 matching lines...) Expand all
5133 flags_ = static_cast<HAllocate::Flags>(flags_ | 5120 flags_ = static_cast<HAllocate::Flags>(flags_ |
5134 ALLOCATE_DOUBLE_ALIGNED); 5121 ALLOCATE_DOUBLE_ALIGNED);
5135 } 5122 }
5136 } 5123 }
5137 5124
5138 Flags flags_; 5125 Flags flags_;
5139 Handle<Map> known_initial_map_; 5126 Handle<Map> known_initial_map_;
5140 }; 5127 };
5141 5128
5142 5129
5143 class HInnerAllocatedObject V8_FINAL : public HTemplateInstruction<1> { 5130 class HInnerAllocatedObject: public HTemplateInstruction<1> {
5144 public: 5131 public:
5145 static HInnerAllocatedObject* New(Zone* zone, 5132 static HInnerAllocatedObject* New(Zone* zone,
5146 HValue* context, 5133 HValue* context,
5147 HValue* value, 5134 HValue* value,
5148 int offset, 5135 int offset,
5149 HType type = HType::Tagged()) { 5136 HType type = HType::Tagged()) {
5150 return new(zone) HInnerAllocatedObject(value, offset, type); 5137 return new(zone) HInnerAllocatedObject(value, offset, type);
5151 } 5138 }
5152 5139
5153 HValue* base_object() { return OperandAt(0); } 5140 HValue* base_object() { return OperandAt(0); }
5154 int offset() { return offset_; } 5141 int offset() { return offset_; }
5155 5142
5156 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5143 virtual Representation RequiredInputRepresentation(int index) {
5157 return Representation::Tagged(); 5144 return Representation::Tagged();
5158 } 5145 }
5159 5146
5160 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5147 virtual void PrintDataTo(StringStream* stream);
5161 5148
5162 DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject) 5149 DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject)
5163 5150
5164 private: 5151 private:
5165 HInnerAllocatedObject(HValue* value, int offset, HType type = HType::Tagged()) 5152 HInnerAllocatedObject(HValue* value, int offset, HType type = HType::Tagged())
5166 : HTemplateInstruction<1>(type), offset_(offset) { 5153 : HTemplateInstruction<1>(type), offset_(offset) {
5167 ASSERT(value->IsAllocate()); 5154 ASSERT(value->IsAllocate());
5168 SetOperandAt(0, value); 5155 SetOperandAt(0, value);
5169 set_type(type); 5156 set_type(type);
5170 set_representation(Representation::Tagged()); 5157 set_representation(Representation::Tagged());
(...skipping 26 matching lines...) Expand all
5197 return false; 5184 return false;
5198 } 5185 }
5199 if (object != new_space_dominator) return true; 5186 if (object != new_space_dominator) return true;
5200 if (object->IsAllocate()) { 5187 if (object->IsAllocate()) {
5201 return !HAllocate::cast(object)->IsNewSpaceAllocation(); 5188 return !HAllocate::cast(object)->IsNewSpaceAllocation();
5202 } 5189 }
5203 return true; 5190 return true;
5204 } 5191 }
5205 5192
5206 5193
5207 class HStoreGlobalCell V8_FINAL : public HUnaryOperation { 5194 class HStoreGlobalCell: public HUnaryOperation {
5208 public: 5195 public:
5209 DECLARE_INSTRUCTION_FACTORY_P3(HStoreGlobalCell, HValue*, 5196 DECLARE_INSTRUCTION_FACTORY_P3(HStoreGlobalCell, HValue*,
5210 Handle<PropertyCell>, PropertyDetails); 5197 Handle<PropertyCell>, PropertyDetails);
5211 5198
5212 Handle<PropertyCell> cell() const { return cell_; } 5199 Handle<PropertyCell> cell() const { return cell_; }
5213 bool RequiresHoleCheck() { 5200 bool RequiresHoleCheck() {
5214 return !details_.IsDontDelete() || details_.IsReadOnly(); 5201 return !details_.IsDontDelete() || details_.IsReadOnly();
5215 } 5202 }
5216 bool NeedsWriteBarrier() { 5203 bool NeedsWriteBarrier() {
5217 return StoringValueNeedsWriteBarrier(value()); 5204 return StoringValueNeedsWriteBarrier(value());
5218 } 5205 }
5219 5206
5220 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5207 virtual Representation RequiredInputRepresentation(int index) {
5221 return Representation::Tagged(); 5208 return Representation::Tagged();
5222 } 5209 }
5223 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5210 virtual void PrintDataTo(StringStream* stream);
5224 5211
5225 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) 5212 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell)
5226 5213
5227 private: 5214 private:
5228 HStoreGlobalCell(HValue* value, 5215 HStoreGlobalCell(HValue* value,
5229 Handle<PropertyCell> cell, 5216 Handle<PropertyCell> cell,
5230 PropertyDetails details) 5217 PropertyDetails details)
5231 : HUnaryOperation(value), 5218 : HUnaryOperation(value),
5232 cell_(cell), 5219 cell_(cell),
5233 details_(details) { 5220 details_(details) {
5234 SetGVNFlag(kChangesGlobalVars); 5221 SetGVNFlag(kChangesGlobalVars);
5235 } 5222 }
5236 5223
5237 Handle<PropertyCell> cell_; 5224 Handle<PropertyCell> cell_;
5238 PropertyDetails details_; 5225 PropertyDetails details_;
5239 }; 5226 };
5240 5227
5241 5228
5242 class HStoreGlobalGeneric : public HTemplateInstruction<3> { 5229 class HStoreGlobalGeneric: public HTemplateInstruction<3> {
5243 public: 5230 public:
5244 inline static HStoreGlobalGeneric* New(Zone* zone, 5231 inline static HStoreGlobalGeneric* New(Zone* zone,
5245 HValue* context, 5232 HValue* context,
5246 HValue* global_object, 5233 HValue* global_object,
5247 Handle<Object> name, 5234 Handle<Object> name,
5248 HValue* value, 5235 HValue* value,
5249 StrictModeFlag strict_mode_flag) { 5236 StrictModeFlag strict_mode_flag) {
5250 return new(zone) HStoreGlobalGeneric(context, global_object, 5237 return new(zone) HStoreGlobalGeneric(context, global_object,
5251 name, value, strict_mode_flag); 5238 name, value, strict_mode_flag);
5252 } 5239 }
5253 5240
5254 HValue* context() { return OperandAt(0); } 5241 HValue* context() { return OperandAt(0); }
5255 HValue* global_object() { return OperandAt(1); } 5242 HValue* global_object() { return OperandAt(1); }
5256 Handle<Object> name() const { return name_; } 5243 Handle<Object> name() const { return name_; }
5257 HValue* value() { return OperandAt(2); } 5244 HValue* value() { return OperandAt(2); }
5258 StrictModeFlag strict_mode_flag() { return strict_mode_flag_; } 5245 StrictModeFlag strict_mode_flag() { return strict_mode_flag_; }
5259 5246
5260 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5247 virtual void PrintDataTo(StringStream* stream);
5261 5248
5262 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5249 virtual Representation RequiredInputRepresentation(int index) {
5263 return Representation::Tagged(); 5250 return Representation::Tagged();
5264 } 5251 }
5265 5252
5266 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric) 5253 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric)
5267 5254
5268 private: 5255 private:
5269 HStoreGlobalGeneric(HValue* context, 5256 HStoreGlobalGeneric(HValue* context,
5270 HValue* global_object, 5257 HValue* global_object,
5271 Handle<Object> name, 5258 Handle<Object> name,
5272 HValue* value, 5259 HValue* value,
5273 StrictModeFlag strict_mode_flag) 5260 StrictModeFlag strict_mode_flag)
5274 : name_(name), 5261 : name_(name),
5275 strict_mode_flag_(strict_mode_flag) { 5262 strict_mode_flag_(strict_mode_flag) {
5276 SetOperandAt(0, context); 5263 SetOperandAt(0, context);
5277 SetOperandAt(1, global_object); 5264 SetOperandAt(1, global_object);
5278 SetOperandAt(2, value); 5265 SetOperandAt(2, value);
5279 set_representation(Representation::Tagged()); 5266 set_representation(Representation::Tagged());
5280 SetAllSideEffects(); 5267 SetAllSideEffects();
5281 } 5268 }
5282 5269
5283 Handle<Object> name_; 5270 Handle<Object> name_;
5284 StrictModeFlag strict_mode_flag_; 5271 StrictModeFlag strict_mode_flag_;
5285 }; 5272 };
5286 5273
5287 5274
5288 class HLoadContextSlot V8_FINAL : public HUnaryOperation { 5275 class HLoadContextSlot: public HUnaryOperation {
5289 public: 5276 public:
5290 enum Mode { 5277 enum Mode {
5291 // Perform a normal load of the context slot without checking its value. 5278 // Perform a normal load of the context slot without checking its value.
5292 kNoCheck, 5279 kNoCheck,
5293 // Load and check the value of the context slot. Deoptimize if it's the 5280 // Load and check the value of the context slot. Deoptimize if it's the
5294 // hole value. This is used for checking for loading of uninitialized 5281 // hole value. This is used for checking for loading of uninitialized
5295 // harmony bindings where we deoptimize into full-codegen generated code 5282 // harmony bindings where we deoptimize into full-codegen generated code
5296 // which will subsequently throw a reference error. 5283 // which will subsequently throw a reference error.
5297 kCheckDeoptimize, 5284 kCheckDeoptimize,
5298 // Load and check the value of the context slot. Return undefined if it's 5285 // Load and check the value of the context slot. Return undefined if it's
(...skipping 24 matching lines...) Expand all
5323 Mode mode() const { return mode_; } 5310 Mode mode() const { return mode_; }
5324 5311
5325 bool DeoptimizesOnHole() { 5312 bool DeoptimizesOnHole() {
5326 return mode_ == kCheckDeoptimize; 5313 return mode_ == kCheckDeoptimize;
5327 } 5314 }
5328 5315
5329 bool RequiresHoleCheck() const { 5316 bool RequiresHoleCheck() const {
5330 return mode_ != kNoCheck; 5317 return mode_ != kNoCheck;
5331 } 5318 }
5332 5319
5333 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5320 virtual Representation RequiredInputRepresentation(int index) {
5334 return Representation::Tagged(); 5321 return Representation::Tagged();
5335 } 5322 }
5336 5323
5337 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5324 virtual void PrintDataTo(StringStream* stream);
5338 5325
5339 DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot) 5326 DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot)
5340 5327
5341 protected: 5328 protected:
5342 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 5329 virtual bool DataEquals(HValue* other) {
5343 HLoadContextSlot* b = HLoadContextSlot::cast(other); 5330 HLoadContextSlot* b = HLoadContextSlot::cast(other);
5344 return (slot_index() == b->slot_index()); 5331 return (slot_index() == b->slot_index());
5345 } 5332 }
5346 5333
5347 private: 5334 private:
5348 virtual bool IsDeletable() const V8_OVERRIDE { return !RequiresHoleCheck(); } 5335 virtual bool IsDeletable() const { return !RequiresHoleCheck(); }
5349 5336
5350 int slot_index_; 5337 int slot_index_;
5351 Mode mode_; 5338 Mode mode_;
5352 }; 5339 };
5353 5340
5354 5341
5355 class HStoreContextSlot V8_FINAL : public HTemplateInstruction<2> { 5342 class HStoreContextSlot: public HTemplateInstruction<2> {
5356 public: 5343 public:
5357 enum Mode { 5344 enum Mode {
5358 // Perform a normal store to the context slot without checking its previous 5345 // Perform a normal store to the context slot without checking its previous
5359 // value. 5346 // value.
5360 kNoCheck, 5347 kNoCheck,
5361 // Check the previous value of the context slot and deoptimize if it's the 5348 // Check the previous value of the context slot and deoptimize if it's the
5362 // hole value. This is used for checking for assignments to uninitialized 5349 // hole value. This is used for checking for assignments to uninitialized
5363 // harmony bindings where we deoptimize into full-codegen generated code 5350 // harmony bindings where we deoptimize into full-codegen generated code
5364 // which will subsequently throw a reference error. 5351 // which will subsequently throw a reference error.
5365 kCheckDeoptimize, 5352 kCheckDeoptimize,
(...skipping 14 matching lines...) Expand all
5380 } 5367 }
5381 5368
5382 bool DeoptimizesOnHole() { 5369 bool DeoptimizesOnHole() {
5383 return mode_ == kCheckDeoptimize; 5370 return mode_ == kCheckDeoptimize;
5384 } 5371 }
5385 5372
5386 bool RequiresHoleCheck() { 5373 bool RequiresHoleCheck() {
5387 return mode_ != kNoCheck; 5374 return mode_ != kNoCheck;
5388 } 5375 }
5389 5376
5390 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5377 virtual Representation RequiredInputRepresentation(int index) {
5391 return Representation::Tagged(); 5378 return Representation::Tagged();
5392 } 5379 }
5393 5380
5394 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5381 virtual void PrintDataTo(StringStream* stream);
5395 5382
5396 DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot) 5383 DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot)
5397 5384
5398 private: 5385 private:
5399 HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value) 5386 HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value)
5400 : slot_index_(slot_index), mode_(mode) { 5387 : slot_index_(slot_index), mode_(mode) {
5401 SetOperandAt(0, context); 5388 SetOperandAt(0, context);
5402 SetOperandAt(1, value); 5389 SetOperandAt(1, value);
5403 SetGVNFlag(kChangesContextSlots); 5390 SetGVNFlag(kChangesContextSlots);
5404 } 5391 }
5405 5392
5406 int slot_index_; 5393 int slot_index_;
5407 Mode mode_; 5394 Mode mode_;
5408 }; 5395 };
5409 5396
5410 5397
5411 // Represents an access to a portion of an object, such as the map pointer, 5398 // Represents an access to a portion of an object, such as the map pointer,
5412 // array elements pointer, etc, but not accesses to array elements themselves. 5399 // array elements pointer, etc, but not accesses to array elements themselves.
5413 class HObjectAccess V8_FINAL { 5400 class HObjectAccess {
5414 public: 5401 public:
5415 inline bool IsInobject() const { 5402 inline bool IsInobject() const {
5416 return portion() != kBackingStore && portion() != kExternalMemory; 5403 return portion() != kBackingStore && portion() != kExternalMemory;
5417 } 5404 }
5418 5405
5419 inline bool IsExternalMemory() const { 5406 inline bool IsExternalMemory() const {
5420 return portion() == kExternalMemory; 5407 return portion() == kExternalMemory;
5421 } 5408 }
5422 5409
5423 inline bool IsStringLength() const { 5410 inline bool IsStringLength() const {
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
5578 5565
5579 friend class HLoadNamedField; 5566 friend class HLoadNamedField;
5580 friend class HStoreNamedField; 5567 friend class HStoreNamedField;
5581 5568
5582 inline Portion portion() const { 5569 inline Portion portion() const {
5583 return PortionField::decode(value_); 5570 return PortionField::decode(value_);
5584 } 5571 }
5585 }; 5572 };
5586 5573
5587 5574
5588 class HLoadNamedField V8_FINAL : public HTemplateInstruction<2> { 5575 class HLoadNamedField: public HTemplateInstruction<2> {
5589 public: 5576 public:
5590 DECLARE_INSTRUCTION_FACTORY_P2(HLoadNamedField, HValue*, HObjectAccess); 5577 DECLARE_INSTRUCTION_FACTORY_P2(HLoadNamedField, HValue*, HObjectAccess);
5591 DECLARE_INSTRUCTION_FACTORY_P3(HLoadNamedField, HValue*, HObjectAccess, 5578 DECLARE_INSTRUCTION_FACTORY_P3(HLoadNamedField, HValue*, HObjectAccess,
5592 HValue*); 5579 HValue*);
5593 5580
5594 HValue* object() { return OperandAt(0); } 5581 HValue* object() { return OperandAt(0); }
5595 HValue* typecheck() { 5582 HValue* typecheck() {
5596 ASSERT(HasTypeCheck()); 5583 ASSERT(HasTypeCheck());
5597 return OperandAt(1); 5584 return OperandAt(1);
5598 } 5585 }
5599 5586
5600 bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); } 5587 bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); }
5601 void ClearTypeCheck() { SetOperandAt(1, object()); } 5588 void ClearTypeCheck() { SetOperandAt(1, object()); }
5602 HObjectAccess access() const { return access_; } 5589 HObjectAccess access() const { return access_; }
5603 Representation field_representation() const { 5590 Representation field_representation() const {
5604 return access_.representation(); 5591 return access_.representation();
5605 } 5592 }
5606 5593
5607 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } 5594 virtual bool HasEscapingOperandAt(int index) { return false; }
5608 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5595 virtual Representation RequiredInputRepresentation(int index) {
5609 if (index == 0 && access().IsExternalMemory()) { 5596 if (index == 0 && access().IsExternalMemory()) {
5610 // object must be external in case of external memory access 5597 // object must be external in case of external memory access
5611 return Representation::External(); 5598 return Representation::External();
5612 } 5599 }
5613 return Representation::Tagged(); 5600 return Representation::Tagged();
5614 } 5601 }
5615 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 5602 virtual Range* InferRange(Zone* zone);
5616 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5603 virtual void PrintDataTo(StringStream* stream);
5617 5604
5618 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField) 5605 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField)
5619 5606
5620 protected: 5607 protected:
5621 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 5608 virtual bool DataEquals(HValue* other) {
5622 HLoadNamedField* b = HLoadNamedField::cast(other); 5609 HLoadNamedField* b = HLoadNamedField::cast(other);
5623 return access_.Equals(b->access_); 5610 return access_.Equals(b->access_);
5624 } 5611 }
5625 5612
5626 private: 5613 private:
5627 HLoadNamedField(HValue* object, 5614 HLoadNamedField(HValue* object,
5628 HObjectAccess access, 5615 HObjectAccess access,
5629 HValue* typecheck = NULL) 5616 HValue* typecheck = NULL)
5630 : access_(access) { 5617 : access_(access) {
5631 ASSERT(object != NULL); 5618 ASSERT(object != NULL);
(...skipping 11 matching lines...) Expand all
5643 } else if (FLAG_track_heap_object_fields && 5630 } else if (FLAG_track_heap_object_fields &&
5644 representation.IsHeapObject()) { 5631 representation.IsHeapObject()) {
5645 set_type(HType::NonPrimitive()); 5632 set_type(HType::NonPrimitive());
5646 set_representation(Representation::Tagged()); 5633 set_representation(Representation::Tagged());
5647 } else { 5634 } else {
5648 set_representation(Representation::Tagged()); 5635 set_representation(Representation::Tagged());
5649 } 5636 }
5650 access.SetGVNFlags(this, false); 5637 access.SetGVNFlags(this, false);
5651 } 5638 }
5652 5639
5653 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 5640 virtual bool IsDeletable() const { return true; }
5654 5641
5655 HObjectAccess access_; 5642 HObjectAccess access_;
5656 }; 5643 };
5657 5644
5658 5645
5659 class HLoadNamedGeneric V8_FINAL : public HTemplateInstruction<2> { 5646 class HLoadNamedGeneric: public HTemplateInstruction<2> {
5660 public: 5647 public:
5661 HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name) 5648 HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name)
5662 : name_(name) { 5649 : name_(name) {
5663 SetOperandAt(0, context); 5650 SetOperandAt(0, context);
5664 SetOperandAt(1, object); 5651 SetOperandAt(1, object);
5665 set_representation(Representation::Tagged()); 5652 set_representation(Representation::Tagged());
5666 SetAllSideEffects(); 5653 SetAllSideEffects();
5667 } 5654 }
5668 5655
5669 HValue* context() { return OperandAt(0); } 5656 HValue* context() { return OperandAt(0); }
5670 HValue* object() { return OperandAt(1); } 5657 HValue* object() { return OperandAt(1); }
5671 Handle<Object> name() const { return name_; } 5658 Handle<Object> name() const { return name_; }
5672 5659
5673 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5660 virtual Representation RequiredInputRepresentation(int index) {
5674 return Representation::Tagged(); 5661 return Representation::Tagged();
5675 } 5662 }
5676 5663
5677 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5664 virtual void PrintDataTo(StringStream* stream);
5678 5665
5679 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric) 5666 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric)
5680 5667
5681 private: 5668 private:
5682 Handle<Object> name_; 5669 Handle<Object> name_;
5683 }; 5670 };
5684 5671
5685 5672
5686 class HLoadFunctionPrototype V8_FINAL : public HUnaryOperation { 5673 class HLoadFunctionPrototype: public HUnaryOperation {
5687 public: 5674 public:
5688 explicit HLoadFunctionPrototype(HValue* function) 5675 explicit HLoadFunctionPrototype(HValue* function)
5689 : HUnaryOperation(function) { 5676 : HUnaryOperation(function) {
5690 set_representation(Representation::Tagged()); 5677 set_representation(Representation::Tagged());
5691 SetFlag(kUseGVN); 5678 SetFlag(kUseGVN);
5692 SetGVNFlag(kDependsOnCalls); 5679 SetGVNFlag(kDependsOnCalls);
5693 } 5680 }
5694 5681
5695 HValue* function() { return OperandAt(0); } 5682 HValue* function() { return OperandAt(0); }
5696 5683
5697 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5684 virtual Representation RequiredInputRepresentation(int index) {
5698 return Representation::Tagged(); 5685 return Representation::Tagged();
5699 } 5686 }
5700 5687
5701 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype) 5688 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype)
5702 5689
5703 protected: 5690 protected:
5704 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 5691 virtual bool DataEquals(HValue* other) { return true; }
5705 }; 5692 };
5706 5693
5707 class ArrayInstructionInterface { 5694 class ArrayInstructionInterface {
5708 public: 5695 public:
5709 virtual HValue* GetKey() = 0; 5696 virtual HValue* GetKey() = 0;
5710 virtual void SetKey(HValue* key) = 0; 5697 virtual void SetKey(HValue* key) = 0;
5711 virtual void SetIndexOffset(uint32_t index_offset) = 0; 5698 virtual void SetIndexOffset(uint32_t index_offset) = 0;
5712 virtual bool IsDehoisted() = 0; 5699 virtual bool IsDehoisted() = 0;
5713 virtual void SetDehoisted(bool is_dehoisted) = 0; 5700 virtual void SetDehoisted(bool is_dehoisted) = 0;
5714 virtual ~ArrayInstructionInterface() { }; 5701 virtual ~ArrayInstructionInterface() { };
5715 5702
5716 static Representation KeyedAccessIndexRequirement(Representation r) { 5703 static Representation KeyedAccessIndexRequirement(Representation r) {
5717 return r.IsInteger32() || kSmiValueSize != 31 5704 return r.IsInteger32() || kSmiValueSize != 31
5718 ? Representation::Integer32() : Representation::Smi(); 5705 ? Representation::Integer32() : Representation::Smi();
5719 } 5706 }
5720 }; 5707 };
5721 5708
5722 5709
5723 enum LoadKeyedHoleMode { 5710 enum LoadKeyedHoleMode {
5724 NEVER_RETURN_HOLE, 5711 NEVER_RETURN_HOLE,
5725 ALLOW_RETURN_HOLE 5712 ALLOW_RETURN_HOLE
5726 }; 5713 };
5727 5714
5728 5715
5729 class HLoadKeyed V8_FINAL 5716 class HLoadKeyed
5730 : public HTemplateInstruction<3>, public ArrayInstructionInterface { 5717 : public HTemplateInstruction<3>, public ArrayInstructionInterface {
5731 public: 5718 public:
5732 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*, 5719 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*,
5733 ElementsKind); 5720 ElementsKind);
5734 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, 5721 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*,
5735 ElementsKind, LoadKeyedHoleMode); 5722 ElementsKind, LoadKeyedHoleMode);
5736 5723
5737 bool is_external() const { 5724 bool is_external() const {
5738 return IsExternalArrayElementsKind(elements_kind()); 5725 return IsExternalArrayElementsKind(elements_kind());
5739 } 5726 }
(...skipping 14 matching lines...) Expand all
5754 void SetDehoisted(bool is_dehoisted) { 5741 void SetDehoisted(bool is_dehoisted) {
5755 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); 5742 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted);
5756 } 5743 }
5757 ElementsKind elements_kind() const { 5744 ElementsKind elements_kind() const {
5758 return ElementsKindField::decode(bit_field_); 5745 return ElementsKindField::decode(bit_field_);
5759 } 5746 }
5760 LoadKeyedHoleMode hole_mode() const { 5747 LoadKeyedHoleMode hole_mode() const {
5761 return HoleModeField::decode(bit_field_); 5748 return HoleModeField::decode(bit_field_);
5762 } 5749 }
5763 5750
5764 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5751 virtual Representation RequiredInputRepresentation(int index) {
5765 // kind_fast: tagged[int32] (none) 5752 // kind_fast: tagged[int32] (none)
5766 // kind_double: tagged[int32] (none) 5753 // kind_double: tagged[int32] (none)
5767 // kind_external: external[int32] (none) 5754 // kind_external: external[int32] (none)
5768 if (index == 0) { 5755 if (index == 0) {
5769 return is_external() ? Representation::External() 5756 return is_external() ? Representation::External()
5770 : Representation::Tagged(); 5757 : Representation::Tagged();
5771 } 5758 }
5772 if (index == 1) { 5759 if (index == 1) {
5773 return ArrayInstructionInterface::KeyedAccessIndexRequirement( 5760 return ArrayInstructionInterface::KeyedAccessIndexRequirement(
5774 OperandAt(1)->representation()); 5761 OperandAt(1)->representation());
5775 } 5762 }
5776 return Representation::None(); 5763 return Representation::None();
5777 } 5764 }
5778 5765
5779 virtual Representation observed_input_representation(int index) V8_OVERRIDE { 5766 virtual Representation observed_input_representation(int index) {
5780 return RequiredInputRepresentation(index); 5767 return RequiredInputRepresentation(index);
5781 } 5768 }
5782 5769
5783 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5770 virtual void PrintDataTo(StringStream* stream);
5784 5771
5785 bool UsesMustHandleHole() const; 5772 bool UsesMustHandleHole() const;
5786 bool AllUsesCanTreatHoleAsNaN() const; 5773 bool AllUsesCanTreatHoleAsNaN() const;
5787 bool RequiresHoleCheck() const; 5774 bool RequiresHoleCheck() const;
5788 5775
5789 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 5776 virtual Range* InferRange(Zone* zone);
5790 5777
5791 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed) 5778 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed)
5792 5779
5793 protected: 5780 protected:
5794 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 5781 virtual bool DataEquals(HValue* other) {
5795 if (!other->IsLoadKeyed()) return false; 5782 if (!other->IsLoadKeyed()) return false;
5796 HLoadKeyed* other_load = HLoadKeyed::cast(other); 5783 HLoadKeyed* other_load = HLoadKeyed::cast(other);
5797 5784
5798 if (IsDehoisted() && index_offset() != other_load->index_offset()) 5785 if (IsDehoisted() && index_offset() != other_load->index_offset())
5799 return false; 5786 return false;
5800 return elements_kind() == other_load->elements_kind(); 5787 return elements_kind() == other_load->elements_kind();
5801 } 5788 }
5802 5789
5803 private: 5790 private:
5804 HLoadKeyed(HValue* obj, 5791 HLoadKeyed(HValue* obj,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
5844 } 5831 }
5845 5832
5846 SetGVNFlag(kDependsOnExternalMemory); 5833 SetGVNFlag(kDependsOnExternalMemory);
5847 // Native code could change the specialized array. 5834 // Native code could change the specialized array.
5848 SetGVNFlag(kDependsOnCalls); 5835 SetGVNFlag(kDependsOnCalls);
5849 } 5836 }
5850 5837
5851 SetFlag(kUseGVN); 5838 SetFlag(kUseGVN);
5852 } 5839 }
5853 5840
5854 virtual bool IsDeletable() const V8_OVERRIDE { 5841 virtual bool IsDeletable() const {
5855 return !RequiresHoleCheck(); 5842 return !RequiresHoleCheck();
5856 } 5843 }
5857 5844
5858 // Establish some checks around our packed fields 5845 // Establish some checks around our packed fields
5859 enum LoadKeyedBits { 5846 enum LoadKeyedBits {
5860 kBitsForElementsKind = 5, 5847 kBitsForElementsKind = 5,
5861 kBitsForHoleMode = 1, 5848 kBitsForHoleMode = 1,
5862 kBitsForIndexOffset = 25, 5849 kBitsForIndexOffset = 25,
5863 kBitsForIsDehoisted = 1, 5850 kBitsForIsDehoisted = 1,
5864 5851
(...skipping 15 matching lines...) Expand all
5880 class IndexOffsetField: 5867 class IndexOffsetField:
5881 public BitField<uint32_t, kStartIndexOffset, kBitsForIndexOffset> 5868 public BitField<uint32_t, kStartIndexOffset, kBitsForIndexOffset>
5882 {}; // NOLINT 5869 {}; // NOLINT
5883 class IsDehoistedField: 5870 class IsDehoistedField:
5884 public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted> 5871 public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted>
5885 {}; // NOLINT 5872 {}; // NOLINT
5886 uint32_t bit_field_; 5873 uint32_t bit_field_;
5887 }; 5874 };
5888 5875
5889 5876
5890 class HLoadKeyedGeneric V8_FINAL : public HTemplateInstruction<3> { 5877 class HLoadKeyedGeneric: public HTemplateInstruction<3> {
5891 public: 5878 public:
5892 HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) { 5879 HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) {
5893 set_representation(Representation::Tagged()); 5880 set_representation(Representation::Tagged());
5894 SetOperandAt(0, obj); 5881 SetOperandAt(0, obj);
5895 SetOperandAt(1, key); 5882 SetOperandAt(1, key);
5896 SetOperandAt(2, context); 5883 SetOperandAt(2, context);
5897 SetAllSideEffects(); 5884 SetAllSideEffects();
5898 } 5885 }
5899 5886
5900 HValue* object() { return OperandAt(0); } 5887 HValue* object() { return OperandAt(0); }
5901 HValue* key() { return OperandAt(1); } 5888 HValue* key() { return OperandAt(1); }
5902 HValue* context() { return OperandAt(2); } 5889 HValue* context() { return OperandAt(2); }
5903 5890
5904 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5891 virtual void PrintDataTo(StringStream* stream);
5905 5892
5906 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5893 virtual Representation RequiredInputRepresentation(int index) {
5907 // tagged[tagged] 5894 // tagged[tagged]
5908 return Representation::Tagged(); 5895 return Representation::Tagged();
5909 } 5896 }
5910 5897
5911 virtual HValue* Canonicalize() V8_OVERRIDE; 5898 virtual HValue* Canonicalize();
5912 5899
5913 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) 5900 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric)
5914 }; 5901 };
5915 5902
5916 5903
5917 class HStoreNamedField V8_FINAL : public HTemplateInstruction<3> { 5904 class HStoreNamedField: public HTemplateInstruction<3> {
5918 public: 5905 public:
5919 DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*, 5906 DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*,
5920 HObjectAccess, HValue*); 5907 HObjectAccess, HValue*);
5921 5908
5922 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) 5909 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField)
5923 5910
5924 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { 5911 virtual bool HasEscapingOperandAt(int index) { return index == 1; }
5925 return index == 1; 5912 virtual Representation RequiredInputRepresentation(int index) {
5926 }
5927 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
5928 if (index == 0 && access().IsExternalMemory()) { 5913 if (index == 0 && access().IsExternalMemory()) {
5929 // object must be external in case of external memory access 5914 // object must be external in case of external memory access
5930 return Representation::External(); 5915 return Representation::External();
5931 } else if (index == 1 && 5916 } else if (index == 1 &&
5932 (field_representation().IsDouble() || 5917 (field_representation().IsDouble() ||
5933 field_representation().IsSmi() || 5918 field_representation().IsSmi() ||
5934 field_representation().IsInteger32())) { 5919 field_representation().IsInteger32())) {
5935 return field_representation(); 5920 return field_representation();
5936 } 5921 }
5937 return Representation::Tagged(); 5922 return Representation::Tagged();
5938 } 5923 }
5939 virtual void HandleSideEffectDominator(GVNFlag side_effect, 5924 virtual void HandleSideEffectDominator(GVNFlag side_effect,
5940 HValue* dominator) V8_OVERRIDE { 5925 HValue* dominator) {
5941 ASSERT(side_effect == kChangesNewSpacePromotion); 5926 ASSERT(side_effect == kChangesNewSpacePromotion);
5942 new_space_dominator_ = dominator; 5927 new_space_dominator_ = dominator;
5943 } 5928 }
5944 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5929 virtual void PrintDataTo(StringStream* stream);
5945 5930
5946 void SkipWriteBarrier() { write_barrier_mode_ = SKIP_WRITE_BARRIER; } 5931 void SkipWriteBarrier() { write_barrier_mode_ = SKIP_WRITE_BARRIER; }
5947 bool IsSkipWriteBarrier() const { 5932 bool IsSkipWriteBarrier() const {
5948 return write_barrier_mode_ == SKIP_WRITE_BARRIER; 5933 return write_barrier_mode_ == SKIP_WRITE_BARRIER;
5949 } 5934 }
5950 5935
5951 HValue* object() const { return OperandAt(0); } 5936 HValue* object() const { return OperandAt(0); }
5952 HValue* value() const { return OperandAt(1); } 5937 HValue* value() const { return OperandAt(1); }
5953 HValue* transition() const { return OperandAt(2); } 5938 HValue* transition() const { return OperandAt(2); }
5954 5939
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
6009 access.SetGVNFlags(this, true); 5994 access.SetGVNFlags(this, true);
6010 } 5995 }
6011 5996
6012 HObjectAccess access_; 5997 HObjectAccess access_;
6013 HValue* new_space_dominator_; 5998 HValue* new_space_dominator_;
6014 WriteBarrierMode write_barrier_mode_ : 1; 5999 WriteBarrierMode write_barrier_mode_ : 1;
6015 bool has_transition_ : 1; 6000 bool has_transition_ : 1;
6016 }; 6001 };
6017 6002
6018 6003
6019 class HStoreNamedGeneric V8_FINAL : public HTemplateInstruction<3> { 6004 class HStoreNamedGeneric: public HTemplateInstruction<3> {
6020 public: 6005 public:
6021 HStoreNamedGeneric(HValue* context, 6006 HStoreNamedGeneric(HValue* context,
6022 HValue* object, 6007 HValue* object,
6023 Handle<String> name, 6008 Handle<String> name,
6024 HValue* value, 6009 HValue* value,
6025 StrictModeFlag strict_mode_flag) 6010 StrictModeFlag strict_mode_flag)
6026 : name_(name), 6011 : name_(name),
6027 strict_mode_flag_(strict_mode_flag) { 6012 strict_mode_flag_(strict_mode_flag) {
6028 SetOperandAt(0, object); 6013 SetOperandAt(0, object);
6029 SetOperandAt(1, value); 6014 SetOperandAt(1, value);
6030 SetOperandAt(2, context); 6015 SetOperandAt(2, context);
6031 SetAllSideEffects(); 6016 SetAllSideEffects();
6032 } 6017 }
6033 6018
6034 HValue* object() { return OperandAt(0); } 6019 HValue* object() { return OperandAt(0); }
6035 HValue* value() { return OperandAt(1); } 6020 HValue* value() { return OperandAt(1); }
6036 HValue* context() { return OperandAt(2); } 6021 HValue* context() { return OperandAt(2); }
6037 Handle<String> name() { return name_; } 6022 Handle<String> name() { return name_; }
6038 StrictModeFlag strict_mode_flag() { return strict_mode_flag_; } 6023 StrictModeFlag strict_mode_flag() { return strict_mode_flag_; }
6039 6024
6040 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 6025 virtual void PrintDataTo(StringStream* stream);
6041 6026
6042 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6027 virtual Representation RequiredInputRepresentation(int index) {
6043 return Representation::Tagged(); 6028 return Representation::Tagged();
6044 } 6029 }
6045 6030
6046 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) 6031 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric)
6047 6032
6048 private: 6033 private:
6049 Handle<String> name_; 6034 Handle<String> name_;
6050 StrictModeFlag strict_mode_flag_; 6035 StrictModeFlag strict_mode_flag_;
6051 }; 6036 };
6052 6037
6053 6038
6054 class HStoreKeyed V8_FINAL 6039 class HStoreKeyed
6055 : public HTemplateInstruction<3>, public ArrayInstructionInterface { 6040 : public HTemplateInstruction<3>, public ArrayInstructionInterface {
6056 public: 6041 public:
6057 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*, 6042 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*,
6058 ElementsKind); 6043 ElementsKind);
6059 6044
6060 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6045 virtual Representation RequiredInputRepresentation(int index) {
6061 // kind_fast: tagged[int32] = tagged 6046 // kind_fast: tagged[int32] = tagged
6062 // kind_double: tagged[int32] = double 6047 // kind_double: tagged[int32] = double
6063 // kind_smi : tagged[int32] = smi 6048 // kind_smi : tagged[int32] = smi
6064 // kind_external: external[int32] = (double | int32) 6049 // kind_external: external[int32] = (double | int32)
6065 if (index == 0) { 6050 if (index == 0) {
6066 return is_external() ? Representation::External() 6051 return is_external() ? Representation::External()
6067 : Representation::Tagged(); 6052 : Representation::Tagged();
6068 } else if (index == 1) { 6053 } else if (index == 1) {
6069 return ArrayInstructionInterface::KeyedAccessIndexRequirement( 6054 return ArrayInstructionInterface::KeyedAccessIndexRequirement(
6070 OperandAt(1)->representation()); 6055 OperandAt(1)->representation());
6071 } 6056 }
6072 6057
6073 ASSERT_EQ(index, 2); 6058 ASSERT_EQ(index, 2);
6074 if (IsDoubleOrFloatElementsKind(elements_kind())) { 6059 if (IsDoubleOrFloatElementsKind(elements_kind())) {
6075 return Representation::Double(); 6060 return Representation::Double();
6076 } 6061 }
6077 6062
6078 if (IsFastSmiElementsKind(elements_kind())) { 6063 if (IsFastSmiElementsKind(elements_kind())) {
6079 return Representation::Smi(); 6064 return Representation::Smi();
6080 } 6065 }
6081 6066
6082 return is_external() ? Representation::Integer32() 6067 return is_external() ? Representation::Integer32()
6083 : Representation::Tagged(); 6068 : Representation::Tagged();
6084 } 6069 }
6085 6070
6086 bool is_external() const { 6071 bool is_external() const {
6087 return IsExternalArrayElementsKind(elements_kind()); 6072 return IsExternalArrayElementsKind(elements_kind());
6088 } 6073 }
6089 6074
6090 virtual Representation observed_input_representation(int index) V8_OVERRIDE { 6075 virtual Representation observed_input_representation(int index) {
6091 if (index < 2) return RequiredInputRepresentation(index); 6076 if (index < 2) return RequiredInputRepresentation(index);
6092 if (IsUninitialized()) { 6077 if (IsUninitialized()) {
6093 return Representation::None(); 6078 return Representation::None();
6094 } 6079 }
6095 if (IsFastSmiElementsKind(elements_kind())) { 6080 if (IsFastSmiElementsKind(elements_kind())) {
6096 return Representation::Smi(); 6081 return Representation::Smi();
6097 } 6082 }
6098 if (IsDoubleOrFloatElementsKind(elements_kind())) { 6083 if (IsDoubleOrFloatElementsKind(elements_kind())) {
6099 return Representation::Double(); 6084 return Representation::Double();
6100 } 6085 }
(...skipping 20 matching lines...) Expand all
6121 bool IsUninitialized() { return is_uninitialized_; } 6106 bool IsUninitialized() { return is_uninitialized_; }
6122 void SetUninitialized(bool is_uninitialized) { 6107 void SetUninitialized(bool is_uninitialized) {
6123 is_uninitialized_ = is_uninitialized; 6108 is_uninitialized_ = is_uninitialized;
6124 } 6109 }
6125 6110
6126 bool IsConstantHoleStore() { 6111 bool IsConstantHoleStore() {
6127 return value()->IsConstant() && HConstant::cast(value())->IsTheHole(); 6112 return value()->IsConstant() && HConstant::cast(value())->IsTheHole();
6128 } 6113 }
6129 6114
6130 virtual void HandleSideEffectDominator(GVNFlag side_effect, 6115 virtual void HandleSideEffectDominator(GVNFlag side_effect,
6131 HValue* dominator) V8_OVERRIDE { 6116 HValue* dominator) {
6132 ASSERT(side_effect == kChangesNewSpacePromotion); 6117 ASSERT(side_effect == kChangesNewSpacePromotion);
6133 new_space_dominator_ = dominator; 6118 new_space_dominator_ = dominator;
6134 } 6119 }
6135 6120
6136 HValue* new_space_dominator() const { return new_space_dominator_; } 6121 HValue* new_space_dominator() const { return new_space_dominator_; }
6137 6122
6138 bool NeedsWriteBarrier() { 6123 bool NeedsWriteBarrier() {
6139 if (value_is_smi()) { 6124 if (value_is_smi()) {
6140 return false; 6125 return false;
6141 } else { 6126 } else {
6142 return StoringValueNeedsWriteBarrier(value()) && 6127 return StoringValueNeedsWriteBarrier(value()) &&
6143 ReceiverObjectNeedsWriteBarrier(elements(), new_space_dominator()); 6128 ReceiverObjectNeedsWriteBarrier(elements(), new_space_dominator());
6144 } 6129 }
6145 } 6130 }
6146 6131
6147 bool NeedsCanonicalization(); 6132 bool NeedsCanonicalization();
6148 6133
6149 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 6134 virtual void PrintDataTo(StringStream* stream);
6150 6135
6151 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) 6136 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed)
6152 6137
6153 private: 6138 private:
6154 HStoreKeyed(HValue* obj, HValue* key, HValue* val, 6139 HStoreKeyed(HValue* obj, HValue* key, HValue* val,
6155 ElementsKind elements_kind) 6140 ElementsKind elements_kind)
6156 : elements_kind_(elements_kind), 6141 : elements_kind_(elements_kind),
6157 index_offset_(0), 6142 index_offset_(0),
6158 is_dehoisted_(false), 6143 is_dehoisted_(false),
6159 is_uninitialized_(false), 6144 is_uninitialized_(false),
(...skipping 25 matching lines...) Expand all
6185 } 6170 }
6186 6171
6187 ElementsKind elements_kind_; 6172 ElementsKind elements_kind_;
6188 uint32_t index_offset_; 6173 uint32_t index_offset_;
6189 bool is_dehoisted_ : 1; 6174 bool is_dehoisted_ : 1;
6190 bool is_uninitialized_ : 1; 6175 bool is_uninitialized_ : 1;
6191 HValue* new_space_dominator_; 6176 HValue* new_space_dominator_;
6192 }; 6177 };
6193 6178
6194 6179
6195 class HStoreKeyedGeneric V8_FINAL : public HTemplateInstruction<4> { 6180 class HStoreKeyedGeneric: public HTemplateInstruction<4> {
6196 public: 6181 public:
6197 HStoreKeyedGeneric(HValue* context, 6182 HStoreKeyedGeneric(HValue* context,
6198 HValue* object, 6183 HValue* object,
6199 HValue* key, 6184 HValue* key,
6200 HValue* value, 6185 HValue* value,
6201 StrictModeFlag strict_mode_flag) 6186 StrictModeFlag strict_mode_flag)
6202 : strict_mode_flag_(strict_mode_flag) { 6187 : strict_mode_flag_(strict_mode_flag) {
6203 SetOperandAt(0, object); 6188 SetOperandAt(0, object);
6204 SetOperandAt(1, key); 6189 SetOperandAt(1, key);
6205 SetOperandAt(2, value); 6190 SetOperandAt(2, value);
6206 SetOperandAt(3, context); 6191 SetOperandAt(3, context);
6207 SetAllSideEffects(); 6192 SetAllSideEffects();
6208 } 6193 }
6209 6194
6210 HValue* object() { return OperandAt(0); } 6195 HValue* object() { return OperandAt(0); }
6211 HValue* key() { return OperandAt(1); } 6196 HValue* key() { return OperandAt(1); }
6212 HValue* value() { return OperandAt(2); } 6197 HValue* value() { return OperandAt(2); }
6213 HValue* context() { return OperandAt(3); } 6198 HValue* context() { return OperandAt(3); }
6214 StrictModeFlag strict_mode_flag() { return strict_mode_flag_; } 6199 StrictModeFlag strict_mode_flag() { return strict_mode_flag_; }
6215 6200
6216 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6201 virtual Representation RequiredInputRepresentation(int index) {
6217 // tagged[tagged] = tagged 6202 // tagged[tagged] = tagged
6218 return Representation::Tagged(); 6203 return Representation::Tagged();
6219 } 6204 }
6220 6205
6221 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 6206 virtual void PrintDataTo(StringStream* stream);
6222 6207
6223 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) 6208 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric)
6224 6209
6225 private: 6210 private:
6226 StrictModeFlag strict_mode_flag_; 6211 StrictModeFlag strict_mode_flag_;
6227 }; 6212 };
6228 6213
6229 6214
6230 class HTransitionElementsKind V8_FINAL : public HTemplateInstruction<2> { 6215 class HTransitionElementsKind: public HTemplateInstruction<2> {
6231 public: 6216 public:
6232 inline static HTransitionElementsKind* New(Zone* zone, 6217 inline static HTransitionElementsKind* New(Zone* zone,
6233 HValue* context, 6218 HValue* context,
6234 HValue* object, 6219 HValue* object,
6235 Handle<Map> original_map, 6220 Handle<Map> original_map,
6236 Handle<Map> transitioned_map) { 6221 Handle<Map> transitioned_map) {
6237 return new(zone) HTransitionElementsKind(context, object, 6222 return new(zone) HTransitionElementsKind(context, object,
6238 original_map, transitioned_map); 6223 original_map, transitioned_map);
6239 } 6224 }
6240 6225
6241 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6226 virtual Representation RequiredInputRepresentation(int index) {
6242 return Representation::Tagged(); 6227 return Representation::Tagged();
6243 } 6228 }
6244 6229
6245 HValue* object() { return OperandAt(0); } 6230 HValue* object() { return OperandAt(0); }
6246 HValue* context() { return OperandAt(1); } 6231 HValue* context() { return OperandAt(1); }
6247 Handle<Map> original_map() { return original_map_; } 6232 Handle<Map> original_map() { return original_map_; }
6248 Handle<Map> transitioned_map() { return transitioned_map_; } 6233 Handle<Map> transitioned_map() { return transitioned_map_; }
6249 ElementsKind from_kind() { return from_kind_; } 6234 ElementsKind from_kind() { return from_kind_; }
6250 ElementsKind to_kind() { return to_kind_; } 6235 ElementsKind to_kind() { return to_kind_; }
6251 6236
6252 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 6237 virtual void PrintDataTo(StringStream* stream);
6253 6238
6254 virtual void FinalizeUniqueValueId() V8_OVERRIDE { 6239 virtual void FinalizeUniqueValueId() {
6255 original_map_unique_id_ = UniqueValueId(original_map_); 6240 original_map_unique_id_ = UniqueValueId(original_map_);
6256 transitioned_map_unique_id_ = UniqueValueId(transitioned_map_); 6241 transitioned_map_unique_id_ = UniqueValueId(transitioned_map_);
6257 } 6242 }
6258 6243
6259 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) 6244 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind)
6260 6245
6261 protected: 6246 protected:
6262 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 6247 virtual bool DataEquals(HValue* other) {
6263 HTransitionElementsKind* instr = HTransitionElementsKind::cast(other); 6248 HTransitionElementsKind* instr = HTransitionElementsKind::cast(other);
6264 return original_map_unique_id_ == instr->original_map_unique_id_ && 6249 return original_map_unique_id_ == instr->original_map_unique_id_ &&
6265 transitioned_map_unique_id_ == instr->transitioned_map_unique_id_; 6250 transitioned_map_unique_id_ == instr->transitioned_map_unique_id_;
6266 } 6251 }
6267 6252
6268 private: 6253 private:
6269 HTransitionElementsKind(HValue* context, 6254 HTransitionElementsKind(HValue* context,
6270 HValue* object, 6255 HValue* object,
6271 Handle<Map> original_map, 6256 Handle<Map> original_map,
6272 Handle<Map> transitioned_map) 6257 Handle<Map> transitioned_map)
(...skipping 16 matching lines...) Expand all
6289 6274
6290 Handle<Map> original_map_; 6275 Handle<Map> original_map_;
6291 Handle<Map> transitioned_map_; 6276 Handle<Map> transitioned_map_;
6292 UniqueValueId original_map_unique_id_; 6277 UniqueValueId original_map_unique_id_;
6293 UniqueValueId transitioned_map_unique_id_; 6278 UniqueValueId transitioned_map_unique_id_;
6294 ElementsKind from_kind_; 6279 ElementsKind from_kind_;
6295 ElementsKind to_kind_; 6280 ElementsKind to_kind_;
6296 }; 6281 };
6297 6282
6298 6283
6299 class HStringAdd V8_FINAL : public HBinaryOperation { 6284 class HStringAdd: public HBinaryOperation {
6300 public: 6285 public:
6301 static HInstruction* New(Zone* zone, 6286 static HInstruction* New(Zone* zone,
6302 HValue* context, 6287 HValue* context,
6303 HValue* left, 6288 HValue* left,
6304 HValue* right, 6289 HValue* right,
6305 StringAddFlags flags = STRING_ADD_CHECK_NONE); 6290 StringAddFlags flags = STRING_ADD_CHECK_NONE);
6306 6291
6307 StringAddFlags flags() const { return flags_; } 6292 StringAddFlags flags() const { return flags_; }
6308 6293
6309 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6294 virtual Representation RequiredInputRepresentation(int index) {
6310 return Representation::Tagged(); 6295 return Representation::Tagged();
6311 } 6296 }
6312 6297
6313 DECLARE_CONCRETE_INSTRUCTION(StringAdd) 6298 DECLARE_CONCRETE_INSTRUCTION(StringAdd)
6314 6299
6315 protected: 6300 protected:
6316 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 6301 virtual bool DataEquals(HValue* other) { return true; }
6317 6302
6318 private: 6303 private:
6319 HStringAdd(HValue* context, HValue* left, HValue* right, StringAddFlags flags) 6304 HStringAdd(HValue* context, HValue* left, HValue* right, StringAddFlags flags)
6320 : HBinaryOperation(context, left, right, HType::String()), flags_(flags) { 6305 : HBinaryOperation(context, left, right, HType::String()), flags_(flags) {
6321 set_representation(Representation::Tagged()); 6306 set_representation(Representation::Tagged());
6322 SetFlag(kUseGVN); 6307 SetFlag(kUseGVN);
6323 SetGVNFlag(kDependsOnMaps); 6308 SetGVNFlag(kDependsOnMaps);
6324 SetGVNFlag(kChangesNewSpacePromotion); 6309 SetGVNFlag(kChangesNewSpacePromotion);
6325 } 6310 }
6326 6311
6327 // No side-effects except possible allocation. 6312 // No side-effects except possible allocation.
6328 // NOTE: this instruction _does not_ call ToString() on its inputs. 6313 // NOTE: this instruction _does not_ call ToString() on its inputs.
6329 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 6314 virtual bool IsDeletable() const { return true; }
6330 6315
6331 const StringAddFlags flags_; 6316 const StringAddFlags flags_;
6332 }; 6317 };
6333 6318
6334 6319
6335 class HStringCharCodeAt V8_FINAL : public HTemplateInstruction<3> { 6320 class HStringCharCodeAt: public HTemplateInstruction<3> {
6336 public: 6321 public:
6337 static HStringCharCodeAt* New(Zone* zone, 6322 static HStringCharCodeAt* New(Zone* zone,
6338 HValue* context, 6323 HValue* context,
6339 HValue* string, 6324 HValue* string,
6340 HValue* index) { 6325 HValue* index) {
6341 return new(zone) HStringCharCodeAt(context, string, index); 6326 return new(zone) HStringCharCodeAt(context, string, index);
6342 } 6327 }
6343 6328
6344 virtual Representation RequiredInputRepresentation(int index) { 6329 virtual Representation RequiredInputRepresentation(int index) {
6345 // The index is supposed to be Integer32. 6330 // The index is supposed to be Integer32.
6346 return index == 2 6331 return index == 2
6347 ? Representation::Integer32() 6332 ? Representation::Integer32()
6348 : Representation::Tagged(); 6333 : Representation::Tagged();
6349 } 6334 }
6350 6335
6351 HValue* context() const { return OperandAt(0); } 6336 HValue* context() const { return OperandAt(0); }
6352 HValue* string() const { return OperandAt(1); } 6337 HValue* string() const { return OperandAt(1); }
6353 HValue* index() const { return OperandAt(2); } 6338 HValue* index() const { return OperandAt(2); }
6354 6339
6355 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt) 6340 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt)
6356 6341
6357 protected: 6342 protected:
6358 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 6343 virtual bool DataEquals(HValue* other) { return true; }
6359 6344
6360 virtual Range* InferRange(Zone* zone) V8_OVERRIDE { 6345 virtual Range* InferRange(Zone* zone) {
6361 return new(zone) Range(0, String::kMaxUtf16CodeUnit); 6346 return new(zone) Range(0, String::kMaxUtf16CodeUnit);
6362 } 6347 }
6363 6348
6364 private: 6349 private:
6365 HStringCharCodeAt(HValue* context, HValue* string, HValue* index) { 6350 HStringCharCodeAt(HValue* context, HValue* string, HValue* index) {
6366 SetOperandAt(0, context); 6351 SetOperandAt(0, context);
6367 SetOperandAt(1, string); 6352 SetOperandAt(1, string);
6368 SetOperandAt(2, index); 6353 SetOperandAt(2, index);
6369 set_representation(Representation::Integer32()); 6354 set_representation(Representation::Integer32());
6370 SetFlag(kUseGVN); 6355 SetFlag(kUseGVN);
6371 SetGVNFlag(kDependsOnMaps); 6356 SetGVNFlag(kDependsOnMaps);
6372 SetGVNFlag(kChangesNewSpacePromotion); 6357 SetGVNFlag(kChangesNewSpacePromotion);
6373 } 6358 }
6374 6359
6375 // No side effects: runtime function assumes string + number inputs. 6360 // No side effects: runtime function assumes string + number inputs.
6376 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 6361 virtual bool IsDeletable() const { return true; }
6377 }; 6362 };
6378 6363
6379 6364
6380 class HStringCharFromCode V8_FINAL : public HTemplateInstruction<2> { 6365 class HStringCharFromCode: public HTemplateInstruction<2> {
6381 public: 6366 public:
6382 static HInstruction* New(Zone* zone, 6367 static HInstruction* New(Zone* zone,
6383 HValue* context, 6368 HValue* context,
6384 HValue* char_code); 6369 HValue* char_code);
6385 6370
6386 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6371 virtual Representation RequiredInputRepresentation(int index) {
6387 return index == 0 6372 return index == 0
6388 ? Representation::Tagged() 6373 ? Representation::Tagged()
6389 : Representation::Integer32(); 6374 : Representation::Integer32();
6390 } 6375 }
6391 6376
6392 HValue* context() const { return OperandAt(0); } 6377 HValue* context() const { return OperandAt(0); }
6393 HValue* value() const { return OperandAt(1); } 6378 HValue* value() const { return OperandAt(1); }
6394 6379
6395 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } 6380 virtual bool DataEquals(HValue* other) { return true; }
6396 6381
6397 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) 6382 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode)
6398 6383
6399 private: 6384 private:
6400 HStringCharFromCode(HValue* context, HValue* char_code) 6385 HStringCharFromCode(HValue* context, HValue* char_code)
6401 : HTemplateInstruction<2>(HType::String()) { 6386 : HTemplateInstruction<2>(HType::String()) {
6402 SetOperandAt(0, context); 6387 SetOperandAt(0, context);
6403 SetOperandAt(1, char_code); 6388 SetOperandAt(1, char_code);
6404 set_representation(Representation::Tagged()); 6389 set_representation(Representation::Tagged());
6405 SetFlag(kUseGVN); 6390 SetFlag(kUseGVN);
6406 SetGVNFlag(kChangesNewSpacePromotion); 6391 SetGVNFlag(kChangesNewSpacePromotion);
6407 } 6392 }
6408 6393
6409 virtual bool IsDeletable() const V8_OVERRIDE { 6394 virtual bool IsDeletable() const {
6410 return !value()->ToNumberCanBeObserved(); 6395 return !value()->ToNumberCanBeObserved();
6411 } 6396 }
6412 }; 6397 };
6413 6398
6414 6399
6415 template <int V> 6400 template <int V>
6416 class HMaterializedLiteral : public HTemplateInstruction<V> { 6401 class HMaterializedLiteral: public HTemplateInstruction<V> {
6417 public: 6402 public:
6418 HMaterializedLiteral<V>(int index, int depth, AllocationSiteMode mode) 6403 HMaterializedLiteral<V>(int index, int depth, AllocationSiteMode mode)
6419 : literal_index_(index), depth_(depth), allocation_site_mode_(mode) { 6404 : literal_index_(index), depth_(depth), allocation_site_mode_(mode) {
6420 this->set_representation(Representation::Tagged()); 6405 this->set_representation(Representation::Tagged());
6421 } 6406 }
6422 6407
6423 HMaterializedLiteral<V>(int index, int depth) 6408 HMaterializedLiteral<V>(int index, int depth)
6424 : literal_index_(index), depth_(depth), 6409 : literal_index_(index), depth_(depth),
6425 allocation_site_mode_(DONT_TRACK_ALLOCATION_SITE) { 6410 allocation_site_mode_(DONT_TRACK_ALLOCATION_SITE) {
6426 this->set_representation(Representation::Tagged()); 6411 this->set_representation(Representation::Tagged());
6427 } 6412 }
6428 6413
6429 int literal_index() const { return literal_index_; } 6414 int literal_index() const { return literal_index_; }
6430 int depth() const { return depth_; } 6415 int depth() const { return depth_; }
6431 AllocationSiteMode allocation_site_mode() const { 6416 AllocationSiteMode allocation_site_mode() const {
6432 return allocation_site_mode_; 6417 return allocation_site_mode_;
6433 } 6418 }
6434 6419
6435 private: 6420 private:
6436 virtual bool IsDeletable() const V8_FINAL V8_OVERRIDE { return true; } 6421 virtual bool IsDeletable() const { return true; }
6437 6422
6438 int literal_index_; 6423 int literal_index_;
6439 int depth_; 6424 int depth_;
6440 AllocationSiteMode allocation_site_mode_; 6425 AllocationSiteMode allocation_site_mode_;
6441 }; 6426 };
6442 6427
6443 6428
6444 class HRegExpLiteral V8_FINAL : public HMaterializedLiteral<1> { 6429 class HRegExpLiteral: public HMaterializedLiteral<1> {
6445 public: 6430 public:
6446 HRegExpLiteral(HValue* context, 6431 HRegExpLiteral(HValue* context,
6447 Handle<FixedArray> literals, 6432 Handle<FixedArray> literals,
6448 Handle<String> pattern, 6433 Handle<String> pattern,
6449 Handle<String> flags, 6434 Handle<String> flags,
6450 int literal_index) 6435 int literal_index)
6451 : HMaterializedLiteral<1>(literal_index, 0), 6436 : HMaterializedLiteral<1>(literal_index, 0),
6452 literals_(literals), 6437 literals_(literals),
6453 pattern_(pattern), 6438 pattern_(pattern),
6454 flags_(flags) { 6439 flags_(flags) {
6455 SetOperandAt(0, context); 6440 SetOperandAt(0, context);
6456 SetAllSideEffects(); 6441 SetAllSideEffects();
6457 set_type(HType::JSObject()); 6442 set_type(HType::JSObject());
6458 } 6443 }
6459 6444
6460 HValue* context() { return OperandAt(0); } 6445 HValue* context() { return OperandAt(0); }
6461 Handle<FixedArray> literals() { return literals_; } 6446 Handle<FixedArray> literals() { return literals_; }
6462 Handle<String> pattern() { return pattern_; } 6447 Handle<String> pattern() { return pattern_; }
6463 Handle<String> flags() { return flags_; } 6448 Handle<String> flags() { return flags_; }
6464 6449
6465 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6450 virtual Representation RequiredInputRepresentation(int index) {
6466 return Representation::Tagged(); 6451 return Representation::Tagged();
6467 } 6452 }
6468 6453
6469 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral) 6454 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral)
6470 6455
6471 private: 6456 private:
6472 Handle<FixedArray> literals_; 6457 Handle<FixedArray> literals_;
6473 Handle<String> pattern_; 6458 Handle<String> pattern_;
6474 Handle<String> flags_; 6459 Handle<String> flags_;
6475 }; 6460 };
6476 6461
6477 6462
6478 class HFunctionLiteral V8_FINAL : public HTemplateInstruction<1> { 6463 class HFunctionLiteral: public HTemplateInstruction<1> {
6479 public: 6464 public:
6480 HFunctionLiteral(HValue* context, 6465 HFunctionLiteral(HValue* context,
6481 Handle<SharedFunctionInfo> shared, 6466 Handle<SharedFunctionInfo> shared,
6482 bool pretenure) 6467 bool pretenure)
6483 : HTemplateInstruction<1>(HType::JSObject()), 6468 : HTemplateInstruction<1>(HType::JSObject()),
6484 shared_info_(shared), 6469 shared_info_(shared),
6485 pretenure_(pretenure), 6470 pretenure_(pretenure),
6486 has_no_literals_(shared->num_literals() == 0), 6471 has_no_literals_(shared->num_literals() == 0),
6487 is_generator_(shared->is_generator()), 6472 is_generator_(shared->is_generator()),
6488 language_mode_(shared->language_mode()) { 6473 language_mode_(shared->language_mode()) {
6489 SetOperandAt(0, context); 6474 SetOperandAt(0, context);
6490 set_representation(Representation::Tagged()); 6475 set_representation(Representation::Tagged());
6491 SetGVNFlag(kChangesNewSpacePromotion); 6476 SetGVNFlag(kChangesNewSpacePromotion);
6492 } 6477 }
6493 6478
6494 HValue* context() { return OperandAt(0); } 6479 HValue* context() { return OperandAt(0); }
6495 6480
6496 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6481 virtual Representation RequiredInputRepresentation(int index) {
6497 return Representation::Tagged(); 6482 return Representation::Tagged();
6498 } 6483 }
6499 6484
6500 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) 6485 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral)
6501 6486
6502 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } 6487 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; }
6503 bool pretenure() const { return pretenure_; } 6488 bool pretenure() const { return pretenure_; }
6504 bool has_no_literals() const { return has_no_literals_; } 6489 bool has_no_literals() const { return has_no_literals_; }
6505 bool is_generator() const { return is_generator_; } 6490 bool is_generator() const { return is_generator_; }
6506 LanguageMode language_mode() const { return language_mode_; } 6491 LanguageMode language_mode() const { return language_mode_; }
6507 6492
6508 private: 6493 private:
6509 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 6494 virtual bool IsDeletable() const { return true; }
6510 6495
6511 Handle<SharedFunctionInfo> shared_info_; 6496 Handle<SharedFunctionInfo> shared_info_;
6512 bool pretenure_ : 1; 6497 bool pretenure_ : 1;
6513 bool has_no_literals_ : 1; 6498 bool has_no_literals_ : 1;
6514 bool is_generator_ : 1; 6499 bool is_generator_ : 1;
6515 LanguageMode language_mode_; 6500 LanguageMode language_mode_;
6516 }; 6501 };
6517 6502
6518 6503
6519 class HTypeof V8_FINAL : public HTemplateInstruction<2> { 6504 class HTypeof: public HTemplateInstruction<2> {
6520 public: 6505 public:
6521 explicit HTypeof(HValue* context, HValue* value) { 6506 explicit HTypeof(HValue* context, HValue* value) {
6522 SetOperandAt(0, context); 6507 SetOperandAt(0, context);
6523 SetOperandAt(1, value); 6508 SetOperandAt(1, value);
6524 set_representation(Representation::Tagged()); 6509 set_representation(Representation::Tagged());
6525 } 6510 }
6526 6511
6527 HValue* context() { return OperandAt(0); } 6512 HValue* context() { return OperandAt(0); }
6528 HValue* value() { return OperandAt(1); } 6513 HValue* value() { return OperandAt(1); }
6529 6514
6530 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 6515 virtual void PrintDataTo(StringStream* stream);
6531 6516
6532 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6517 virtual Representation RequiredInputRepresentation(int index) {
6533 return Representation::Tagged(); 6518 return Representation::Tagged();
6534 } 6519 }
6535 6520
6536 DECLARE_CONCRETE_INSTRUCTION(Typeof) 6521 DECLARE_CONCRETE_INSTRUCTION(Typeof)
6537 6522
6538 private: 6523 private:
6539 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 6524 virtual bool IsDeletable() const { return true; }
6540 }; 6525 };
6541 6526
6542 6527
6543 class HTrapAllocationMemento V8_FINAL : public HTemplateInstruction<1> { 6528 class HTrapAllocationMemento : public HTemplateInstruction<1> {
6544 public: 6529 public:
6545 DECLARE_INSTRUCTION_FACTORY_P1(HTrapAllocationMemento, HValue*); 6530 DECLARE_INSTRUCTION_FACTORY_P1(HTrapAllocationMemento, HValue*);
6546 6531
6547 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6532 virtual Representation RequiredInputRepresentation(int index) {
6548 return Representation::Tagged(); 6533 return Representation::Tagged();
6549 } 6534 }
6550 6535
6551 HValue* object() { return OperandAt(0); } 6536 HValue* object() { return OperandAt(0); }
6552 6537
6553 DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento) 6538 DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento)
6554 6539
6555 private: 6540 private:
6556 explicit HTrapAllocationMemento(HValue* obj) { 6541 explicit HTrapAllocationMemento(HValue* obj) {
6557 SetOperandAt(0, obj); 6542 SetOperandAt(0, obj);
6558 } 6543 }
6559 }; 6544 };
6560 6545
6561 6546
6562 class HToFastProperties V8_FINAL : public HUnaryOperation { 6547 class HToFastProperties: public HUnaryOperation {
6563 public: 6548 public:
6564 DECLARE_INSTRUCTION_FACTORY_P1(HToFastProperties, HValue*); 6549 DECLARE_INSTRUCTION_FACTORY_P1(HToFastProperties, HValue*);
6565 6550
6566 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6551 virtual Representation RequiredInputRepresentation(int index) {
6567 return Representation::Tagged(); 6552 return Representation::Tagged();
6568 } 6553 }
6569 6554
6570 DECLARE_CONCRETE_INSTRUCTION(ToFastProperties) 6555 DECLARE_CONCRETE_INSTRUCTION(ToFastProperties)
6571 6556
6572 private: 6557 private:
6573 explicit HToFastProperties(HValue* value) : HUnaryOperation(value) { 6558 explicit HToFastProperties(HValue* value) : HUnaryOperation(value) {
6574 set_representation(Representation::Tagged()); 6559 set_representation(Representation::Tagged());
6575 SetGVNFlag(kChangesNewSpacePromotion); 6560 SetGVNFlag(kChangesNewSpacePromotion);
6576 6561
6577 // This instruction is not marked as kChangesMaps, but does 6562 // This instruction is not marked as kChangesMaps, but does
6578 // change the map of the input operand. Use it only when creating 6563 // change the map of the input operand. Use it only when creating
6579 // object literals via a runtime call. 6564 // object literals via a runtime call.
6580 ASSERT(value->IsCallRuntime()); 6565 ASSERT(value->IsCallRuntime());
6581 #ifdef DEBUG 6566 #ifdef DEBUG
6582 const Runtime::Function* function = HCallRuntime::cast(value)->function(); 6567 const Runtime::Function* function = HCallRuntime::cast(value)->function();
6583 ASSERT(function->function_id == Runtime::kCreateObjectLiteral || 6568 ASSERT(function->function_id == Runtime::kCreateObjectLiteral ||
6584 function->function_id == Runtime::kCreateObjectLiteralShallow); 6569 function->function_id == Runtime::kCreateObjectLiteralShallow);
6585 #endif 6570 #endif
6586 } 6571 }
6587 6572
6588 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 6573 virtual bool IsDeletable() const { return true; }
6589 }; 6574 };
6590 6575
6591 6576
6592 class HValueOf V8_FINAL : public HUnaryOperation { 6577 class HValueOf: public HUnaryOperation {
6593 public: 6578 public:
6594 explicit HValueOf(HValue* value) : HUnaryOperation(value) { 6579 explicit HValueOf(HValue* value) : HUnaryOperation(value) {
6595 set_representation(Representation::Tagged()); 6580 set_representation(Representation::Tagged());
6596 } 6581 }
6597 6582
6598 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6583 virtual Representation RequiredInputRepresentation(int index) {
6599 return Representation::Tagged(); 6584 return Representation::Tagged();
6600 } 6585 }
6601 6586
6602 DECLARE_CONCRETE_INSTRUCTION(ValueOf) 6587 DECLARE_CONCRETE_INSTRUCTION(ValueOf)
6603 6588
6604 private: 6589 private:
6605 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 6590 virtual bool IsDeletable() const { return true; }
6606 }; 6591 };
6607 6592
6608 6593
6609 class HDateField V8_FINAL : public HUnaryOperation { 6594 class HDateField: public HUnaryOperation {
6610 public: 6595 public:
6611 HDateField(HValue* date, Smi* index) 6596 HDateField(HValue* date, Smi* index)
6612 : HUnaryOperation(date), index_(index) { 6597 : HUnaryOperation(date), index_(index) {
6613 set_representation(Representation::Tagged()); 6598 set_representation(Representation::Tagged());
6614 } 6599 }
6615 6600
6616 Smi* index() const { return index_; } 6601 Smi* index() const { return index_; }
6617 6602
6618 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6603 virtual Representation RequiredInputRepresentation(int index) {
6619 return Representation::Tagged(); 6604 return Representation::Tagged();
6620 } 6605 }
6621 6606
6622 DECLARE_CONCRETE_INSTRUCTION(DateField) 6607 DECLARE_CONCRETE_INSTRUCTION(DateField)
6623 6608
6624 private: 6609 private:
6625 Smi* index_; 6610 Smi* index_;
6626 }; 6611 };
6627 6612
6628 6613
6629 class HSeqStringSetChar V8_FINAL : public HTemplateInstruction<3> { 6614 class HSeqStringSetChar: public HTemplateInstruction<3> {
6630 public: 6615 public:
6631 HSeqStringSetChar(String::Encoding encoding, 6616 HSeqStringSetChar(String::Encoding encoding,
6632 HValue* string, 6617 HValue* string,
6633 HValue* index, 6618 HValue* index,
6634 HValue* value) : encoding_(encoding) { 6619 HValue* value) : encoding_(encoding) {
6635 SetOperandAt(0, string); 6620 SetOperandAt(0, string);
6636 SetOperandAt(1, index); 6621 SetOperandAt(1, index);
6637 SetOperandAt(2, value); 6622 SetOperandAt(2, value);
6638 set_representation(Representation::Tagged()); 6623 set_representation(Representation::Tagged());
6639 } 6624 }
6640 6625
6641 String::Encoding encoding() { return encoding_; } 6626 String::Encoding encoding() { return encoding_; }
6642 HValue* string() { return OperandAt(0); } 6627 HValue* string() { return OperandAt(0); }
6643 HValue* index() { return OperandAt(1); } 6628 HValue* index() { return OperandAt(1); }
6644 HValue* value() { return OperandAt(2); } 6629 HValue* value() { return OperandAt(2); }
6645 6630
6646 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6631 virtual Representation RequiredInputRepresentation(int index) {
6647 return (index == 0) ? Representation::Tagged() 6632 return (index == 0) ? Representation::Tagged()
6648 : Representation::Integer32(); 6633 : Representation::Integer32();
6649 } 6634 }
6650 6635
6651 DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar) 6636 DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar)
6652 6637
6653 private: 6638 private:
6654 String::Encoding encoding_; 6639 String::Encoding encoding_;
6655 }; 6640 };
6656 6641
6657 6642
6658 class HCheckMapValue V8_FINAL : public HTemplateInstruction<2> { 6643 class HCheckMapValue: public HTemplateInstruction<2> {
6659 public: 6644 public:
6660 DECLARE_INSTRUCTION_FACTORY_P2(HCheckMapValue, HValue*, HValue*); 6645 DECLARE_INSTRUCTION_FACTORY_P2(HCheckMapValue, HValue*, HValue*);
6661 6646
6662 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6647 virtual Representation RequiredInputRepresentation(int index) {
6663 return Representation::Tagged(); 6648 return Representation::Tagged();
6664 } 6649 }
6665 6650
6666 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 6651 virtual void PrintDataTo(StringStream* stream);
6667 6652
6668 virtual HType CalculateInferredType() V8_OVERRIDE { 6653 virtual HType CalculateInferredType() {
6669 return HType::Tagged(); 6654 return HType::Tagged();
6670 } 6655 }
6671 6656
6672 HValue* value() { return OperandAt(0); } 6657 HValue* value() { return OperandAt(0); }
6673 HValue* map() { return OperandAt(1); } 6658 HValue* map() { return OperandAt(1); }
6674 6659
6675 DECLARE_CONCRETE_INSTRUCTION(CheckMapValue) 6660 DECLARE_CONCRETE_INSTRUCTION(CheckMapValue)
6676 6661
6677 protected: 6662 protected:
6678 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 6663 virtual bool DataEquals(HValue* other) {
6679 return true; 6664 return true;
6680 } 6665 }
6681 6666
6682 private: 6667 private:
6683 HCheckMapValue(HValue* value, 6668 HCheckMapValue(HValue* value,
6684 HValue* map) { 6669 HValue* map) {
6685 SetOperandAt(0, value); 6670 SetOperandAt(0, value);
6686 SetOperandAt(1, map); 6671 SetOperandAt(1, map);
6687 set_representation(Representation::Tagged()); 6672 set_representation(Representation::Tagged());
6688 SetFlag(kUseGVN); 6673 SetFlag(kUseGVN);
6689 SetGVNFlag(kDependsOnMaps); 6674 SetGVNFlag(kDependsOnMaps);
6690 SetGVNFlag(kDependsOnElementsKind); 6675 SetGVNFlag(kDependsOnElementsKind);
6691 } 6676 }
6692 }; 6677 };
6693 6678
6694 6679
6695 class HForInPrepareMap V8_FINAL : public HTemplateInstruction<2> { 6680 class HForInPrepareMap : public HTemplateInstruction<2> {
6696 public: 6681 public:
6697 static HForInPrepareMap* New(Zone* zone, 6682 static HForInPrepareMap* New(Zone* zone,
6698 HValue* context, 6683 HValue* context,
6699 HValue* object) { 6684 HValue* object) {
6700 return new(zone) HForInPrepareMap(context, object); 6685 return new(zone) HForInPrepareMap(context, object);
6701 } 6686 }
6702 6687
6703 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6688 virtual Representation RequiredInputRepresentation(int index) {
6704 return Representation::Tagged(); 6689 return Representation::Tagged();
6705 } 6690 }
6706 6691
6707 HValue* context() { return OperandAt(0); } 6692 HValue* context() { return OperandAt(0); }
6708 HValue* enumerable() { return OperandAt(1); } 6693 HValue* enumerable() { return OperandAt(1); }
6709 6694
6710 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 6695 virtual void PrintDataTo(StringStream* stream);
6711 6696
6712 virtual HType CalculateInferredType() V8_OVERRIDE { 6697 virtual HType CalculateInferredType() {
6713 return HType::Tagged(); 6698 return HType::Tagged();
6714 } 6699 }
6715 6700
6716 DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap); 6701 DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap);
6717 6702
6718 private: 6703 private:
6719 HForInPrepareMap(HValue* context, 6704 HForInPrepareMap(HValue* context,
6720 HValue* object) { 6705 HValue* object) {
6721 SetOperandAt(0, context); 6706 SetOperandAt(0, context);
6722 SetOperandAt(1, object); 6707 SetOperandAt(1, object);
6723 set_representation(Representation::Tagged()); 6708 set_representation(Representation::Tagged());
6724 SetAllSideEffects(); 6709 SetAllSideEffects();
6725 } 6710 }
6726 }; 6711 };
6727 6712
6728 6713
6729 class HForInCacheArray V8_FINAL : public HTemplateInstruction<2> { 6714 class HForInCacheArray : public HTemplateInstruction<2> {
6730 public: 6715 public:
6731 DECLARE_INSTRUCTION_FACTORY_P3(HForInCacheArray, HValue*, HValue*, int); 6716 DECLARE_INSTRUCTION_FACTORY_P3(HForInCacheArray, HValue*, HValue*, int);
6732 6717
6733 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6718 virtual Representation RequiredInputRepresentation(int index) {
6734 return Representation::Tagged(); 6719 return Representation::Tagged();
6735 } 6720 }
6736 6721
6737 HValue* enumerable() { return OperandAt(0); } 6722 HValue* enumerable() { return OperandAt(0); }
6738 HValue* map() { return OperandAt(1); } 6723 HValue* map() { return OperandAt(1); }
6739 int idx() { return idx_; } 6724 int idx() { return idx_; }
6740 6725
6741 HForInCacheArray* index_cache() { 6726 HForInCacheArray* index_cache() {
6742 return index_cache_; 6727 return index_cache_;
6743 } 6728 }
6744 6729
6745 void set_index_cache(HForInCacheArray* index_cache) { 6730 void set_index_cache(HForInCacheArray* index_cache) {
6746 index_cache_ = index_cache; 6731 index_cache_ = index_cache;
6747 } 6732 }
6748 6733
6749 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 6734 virtual void PrintDataTo(StringStream* stream);
6750 6735
6751 virtual HType CalculateInferredType() V8_OVERRIDE { 6736 virtual HType CalculateInferredType() {
6752 return HType::Tagged(); 6737 return HType::Tagged();
6753 } 6738 }
6754 6739
6755 DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray); 6740 DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray);
6756 6741
6757 private: 6742 private:
6758 HForInCacheArray(HValue* enumerable, 6743 HForInCacheArray(HValue* enumerable,
6759 HValue* keys, 6744 HValue* keys,
6760 int idx) : idx_(idx) { 6745 int idx) : idx_(idx) {
6761 SetOperandAt(0, enumerable); 6746 SetOperandAt(0, enumerable);
6762 SetOperandAt(1, keys); 6747 SetOperandAt(1, keys);
6763 set_representation(Representation::Tagged()); 6748 set_representation(Representation::Tagged());
6764 } 6749 }
6765 6750
6766 int idx_; 6751 int idx_;
6767 HForInCacheArray* index_cache_; 6752 HForInCacheArray* index_cache_;
6768 }; 6753 };
6769 6754
6770 6755
6771 class HLoadFieldByIndex V8_FINAL : public HTemplateInstruction<2> { 6756 class HLoadFieldByIndex : public HTemplateInstruction<2> {
6772 public: 6757 public:
6773 HLoadFieldByIndex(HValue* object, 6758 HLoadFieldByIndex(HValue* object,
6774 HValue* index) { 6759 HValue* index) {
6775 SetOperandAt(0, object); 6760 SetOperandAt(0, object);
6776 SetOperandAt(1, index); 6761 SetOperandAt(1, index);
6777 set_representation(Representation::Tagged()); 6762 set_representation(Representation::Tagged());
6778 } 6763 }
6779 6764
6780 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6765 virtual Representation RequiredInputRepresentation(int index) {
6781 return Representation::Tagged(); 6766 return Representation::Tagged();
6782 } 6767 }
6783 6768
6784 HValue* object() { return OperandAt(0); } 6769 HValue* object() { return OperandAt(0); }
6785 HValue* index() { return OperandAt(1); } 6770 HValue* index() { return OperandAt(1); }
6786 6771
6787 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 6772 virtual void PrintDataTo(StringStream* stream);
6788 6773
6789 virtual HType CalculateInferredType() V8_OVERRIDE { 6774 virtual HType CalculateInferredType() {
6790 return HType::Tagged(); 6775 return HType::Tagged();
6791 } 6776 }
6792 6777
6793 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); 6778 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex);
6794 6779
6795 private: 6780 private:
6796 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 6781 virtual bool IsDeletable() const { return true; }
6797 }; 6782 };
6798 6783
6799 6784
6800 #undef DECLARE_INSTRUCTION 6785 #undef DECLARE_INSTRUCTION
6801 #undef DECLARE_CONCRETE_INSTRUCTION 6786 #undef DECLARE_CONCRETE_INSTRUCTION
6802 6787
6803 } } // namespace v8::internal 6788 } } // namespace v8::internal
6804 6789
6805 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 6790 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« no previous file with comments | « src/hydrogen.cc ('k') | src/ia32/lithium-codegen-ia32.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698