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