| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_HYDROGEN_INSTRUCTIONS_H_ | 5 #ifndef V8_HYDROGEN_INSTRUCTIONS_H_ |
| 6 #define V8_HYDROGEN_INSTRUCTIONS_H_ | 6 #define V8_HYDROGEN_INSTRUCTIONS_H_ |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/allocation.h" | 10 #include "src/allocation.h" |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 V(GlobalVars) \ | 182 V(GlobalVars) \ |
| 183 V(InobjectFields) \ | 183 V(InobjectFields) \ |
| 184 V(Maps) \ | 184 V(Maps) \ |
| 185 V(OsrEntries) \ | 185 V(OsrEntries) \ |
| 186 V(ExternalMemory) \ | 186 V(ExternalMemory) \ |
| 187 V(StringChars) \ | 187 V(StringChars) \ |
| 188 V(TypedArrayElements) | 188 V(TypedArrayElements) |
| 189 | 189 |
| 190 | 190 |
| 191 #define DECLARE_ABSTRACT_INSTRUCTION(type) \ | 191 #define DECLARE_ABSTRACT_INSTRUCTION(type) \ |
| 192 virtual bool Is##type() const V8_FINAL V8_OVERRIDE { return true; } \ | 192 virtual bool Is##type() const FINAL OVERRIDE { return true; } \ |
| 193 static H##type* cast(HValue* value) { \ | 193 static H##type* cast(HValue* value) { \ |
| 194 DCHECK(value->Is##type()); \ | 194 DCHECK(value->Is##type()); \ |
| 195 return reinterpret_cast<H##type*>(value); \ | 195 return reinterpret_cast<H##type*>(value); \ |
| 196 } | 196 } |
| 197 | 197 |
| 198 | 198 |
| 199 #define DECLARE_CONCRETE_INSTRUCTION(type) \ | 199 #define DECLARE_CONCRETE_INSTRUCTION(type) \ |
| 200 virtual LInstruction* CompileToLithium( \ | 200 virtual LInstruction* CompileToLithium( \ |
| 201 LChunkBuilder* builder) V8_FINAL V8_OVERRIDE; \ | 201 LChunkBuilder* builder) FINAL OVERRIDE; \ |
| 202 static H##type* cast(HValue* value) { \ | 202 static H##type* cast(HValue* value) { \ |
| 203 DCHECK(value->Is##type()); \ | 203 DCHECK(value->Is##type()); \ |
| 204 return reinterpret_cast<H##type*>(value); \ | 204 return reinterpret_cast<H##type*>(value); \ |
| 205 } \ | 205 } \ |
| 206 virtual Opcode opcode() const V8_FINAL V8_OVERRIDE { \ | 206 virtual Opcode opcode() const FINAL OVERRIDE { \ |
| 207 return HValue::k##type; \ | 207 return HValue::k##type; \ |
| 208 } | 208 } |
| 209 | 209 |
| 210 | 210 |
| 211 enum PropertyAccessType { LOAD, STORE }; | 211 enum PropertyAccessType { LOAD, STORE }; |
| 212 | 212 |
| 213 | 213 |
| 214 class Range V8_FINAL : public ZoneObject { | 214 class Range FINAL : public ZoneObject { |
| 215 public: | 215 public: |
| 216 Range() | 216 Range() |
| 217 : lower_(kMinInt), | 217 : lower_(kMinInt), |
| 218 upper_(kMaxInt), | 218 upper_(kMaxInt), |
| 219 next_(NULL), | 219 next_(NULL), |
| 220 can_be_minus_zero_(false) { } | 220 can_be_minus_zero_(false) { } |
| 221 | 221 |
| 222 Range(int32_t lower, int32_t upper) | 222 Range(int32_t lower, int32_t upper) |
| 223 : lower_(lower), | 223 : lower_(lower), |
| 224 upper_(upper), | 224 upper_(upper), |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 | 308 |
| 309 private: | 309 private: |
| 310 HUseListNode* tail_; | 310 HUseListNode* tail_; |
| 311 HValue* value_; | 311 HValue* value_; |
| 312 int index_; | 312 int index_; |
| 313 }; | 313 }; |
| 314 | 314 |
| 315 | 315 |
| 316 // We reuse use list nodes behind the scenes as uses are added and deleted. | 316 // We reuse use list nodes behind the scenes as uses are added and deleted. |
| 317 // This class is the safe way to iterate uses while deleting them. | 317 // This class is the safe way to iterate uses while deleting them. |
| 318 class HUseIterator V8_FINAL BASE_EMBEDDED { | 318 class HUseIterator FINAL BASE_EMBEDDED { |
| 319 public: | 319 public: |
| 320 bool Done() { return current_ == NULL; } | 320 bool Done() { return current_ == NULL; } |
| 321 void Advance(); | 321 void Advance(); |
| 322 | 322 |
| 323 HValue* value() { | 323 HValue* value() { |
| 324 DCHECK(!Done()); | 324 DCHECK(!Done()); |
| 325 return value_; | 325 return value_; |
| 326 } | 326 } |
| 327 | 327 |
| 328 int index() { | 328 int index() { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 357 }; | 357 }; |
| 358 | 358 |
| 359 | 359 |
| 360 static inline GVNFlag GVNFlagFromInt(int i) { | 360 static inline GVNFlag GVNFlagFromInt(int i) { |
| 361 DCHECK(i >= 0); | 361 DCHECK(i >= 0); |
| 362 DCHECK(i < kNumberOfFlags); | 362 DCHECK(i < kNumberOfFlags); |
| 363 return static_cast<GVNFlag>(i); | 363 return static_cast<GVNFlag>(i); |
| 364 } | 364 } |
| 365 | 365 |
| 366 | 366 |
| 367 class DecompositionResult V8_FINAL BASE_EMBEDDED { | 367 class DecompositionResult FINAL BASE_EMBEDDED { |
| 368 public: | 368 public: |
| 369 DecompositionResult() : base_(NULL), offset_(0), scale_(0) {} | 369 DecompositionResult() : base_(NULL), offset_(0), scale_(0) {} |
| 370 | 370 |
| 371 HValue* base() { return base_; } | 371 HValue* base() { return base_; } |
| 372 int offset() { return offset_; } | 372 int offset() { return offset_; } |
| 373 int scale() { return scale_; } | 373 int scale() { return scale_; } |
| 374 | 374 |
| 375 bool Apply(HValue* other_base, int other_offset, int other_scale = 0) { | 375 bool Apply(HValue* other_base, int other_offset, int other_scale = 0) { |
| 376 if (base_ == NULL) { | 376 if (base_ == NULL) { |
| 377 base_ = other_base; | 377 base_ = other_base; |
| (...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1138 | 1138 |
| 1139 intptr_t data_; | 1139 intptr_t data_; |
| 1140 }; | 1140 }; |
| 1141 | 1141 |
| 1142 | 1142 |
| 1143 class HInstruction : public HValue { | 1143 class HInstruction : public HValue { |
| 1144 public: | 1144 public: |
| 1145 HInstruction* next() const { return next_; } | 1145 HInstruction* next() const { return next_; } |
| 1146 HInstruction* previous() const { return previous_; } | 1146 HInstruction* previous() const { return previous_; } |
| 1147 | 1147 |
| 1148 virtual OStream& PrintTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1148 virtual OStream& PrintTo(OStream& os) const OVERRIDE; // NOLINT |
| 1149 virtual OStream& PrintDataTo(OStream& os) const; // NOLINT | 1149 virtual OStream& PrintDataTo(OStream& os) const; // NOLINT |
| 1150 | 1150 |
| 1151 bool IsLinked() const { return block() != NULL; } | 1151 bool IsLinked() const { return block() != NULL; } |
| 1152 void Unlink(); | 1152 void Unlink(); |
| 1153 | 1153 |
| 1154 void InsertBefore(HInstruction* next); | 1154 void InsertBefore(HInstruction* next); |
| 1155 | 1155 |
| 1156 template<class T> T* Prepend(T* instr) { | 1156 template<class T> T* Prepend(T* instr) { |
| 1157 instr->InsertBefore(this); | 1157 instr->InsertBefore(this); |
| 1158 return instr; | 1158 return instr; |
| 1159 } | 1159 } |
| 1160 | 1160 |
| 1161 void InsertAfter(HInstruction* previous); | 1161 void InsertAfter(HInstruction* previous); |
| 1162 | 1162 |
| 1163 template<class T> T* Append(T* instr) { | 1163 template<class T> T* Append(T* instr) { |
| 1164 instr->InsertAfter(this); | 1164 instr->InsertAfter(this); |
| 1165 return instr; | 1165 return instr; |
| 1166 } | 1166 } |
| 1167 | 1167 |
| 1168 // The position is a write-once variable. | 1168 // The position is a write-once variable. |
| 1169 virtual HSourcePosition position() const V8_OVERRIDE { | 1169 virtual HSourcePosition position() const OVERRIDE { |
| 1170 return HSourcePosition(position_.position()); | 1170 return HSourcePosition(position_.position()); |
| 1171 } | 1171 } |
| 1172 bool has_position() const { | 1172 bool has_position() const { |
| 1173 return !position().IsUnknown(); | 1173 return !position().IsUnknown(); |
| 1174 } | 1174 } |
| 1175 void set_position(HSourcePosition position) { | 1175 void set_position(HSourcePosition position) { |
| 1176 DCHECK(!has_position()); | 1176 DCHECK(!has_position()); |
| 1177 DCHECK(!position.IsUnknown()); | 1177 DCHECK(!position.IsUnknown()); |
| 1178 position_.set_position(position); | 1178 position_.set_position(position); |
| 1179 } | 1179 } |
| 1180 | 1180 |
| 1181 virtual HSourcePosition operand_position(int index) const V8_OVERRIDE { | 1181 virtual HSourcePosition operand_position(int index) const OVERRIDE { |
| 1182 const HSourcePosition pos = position_.operand_position(index); | 1182 const HSourcePosition pos = position_.operand_position(index); |
| 1183 return pos.IsUnknown() ? position() : pos; | 1183 return pos.IsUnknown() ? position() : pos; |
| 1184 } | 1184 } |
| 1185 void set_operand_position(Zone* zone, int index, HSourcePosition pos) { | 1185 void set_operand_position(Zone* zone, int index, HSourcePosition pos) { |
| 1186 DCHECK(0 <= index && index < OperandCount()); | 1186 DCHECK(0 <= index && index < OperandCount()); |
| 1187 position_.ensure_storage_for_operand_positions(zone, OperandCount()); | 1187 position_.ensure_storage_for_operand_positions(zone, OperandCount()); |
| 1188 position_.set_operand_position(index, pos); | 1188 position_.set_operand_position(index, pos); |
| 1189 } | 1189 } |
| 1190 | 1190 |
| 1191 bool Dominates(HInstruction* other); | 1191 bool Dominates(HInstruction* other); |
| 1192 bool CanTruncateToSmi() const { return CheckFlag(kTruncatingToSmi); } | 1192 bool CanTruncateToSmi() const { return CheckFlag(kTruncatingToSmi); } |
| 1193 bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); } | 1193 bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); } |
| 1194 | 1194 |
| 1195 virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0; | 1195 virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0; |
| 1196 | 1196 |
| 1197 #ifdef DEBUG | 1197 #ifdef DEBUG |
| 1198 virtual void Verify() V8_OVERRIDE; | 1198 virtual void Verify() OVERRIDE; |
| 1199 #endif | 1199 #endif |
| 1200 | 1200 |
| 1201 bool CanDeoptimize(); | 1201 bool CanDeoptimize(); |
| 1202 | 1202 |
| 1203 virtual bool HasStackCheck() { return false; } | 1203 virtual bool HasStackCheck() { return false; } |
| 1204 | 1204 |
| 1205 DECLARE_ABSTRACT_INSTRUCTION(Instruction) | 1205 DECLARE_ABSTRACT_INSTRUCTION(Instruction) |
| 1206 | 1206 |
| 1207 protected: | 1207 protected: |
| 1208 explicit HInstruction(HType type = HType::Tagged()) | 1208 explicit HInstruction(HType type = HType::Tagged()) |
| 1209 : HValue(type), | 1209 : HValue(type), |
| 1210 next_(NULL), | 1210 next_(NULL), |
| 1211 previous_(NULL), | 1211 previous_(NULL), |
| 1212 position_(RelocInfo::kNoPosition) { | 1212 position_(RelocInfo::kNoPosition) { |
| 1213 SetDependsOnFlag(kOsrEntries); | 1213 SetDependsOnFlag(kOsrEntries); |
| 1214 } | 1214 } |
| 1215 | 1215 |
| 1216 virtual void DeleteFromGraph() V8_OVERRIDE { Unlink(); } | 1216 virtual void DeleteFromGraph() OVERRIDE { Unlink(); } |
| 1217 | 1217 |
| 1218 private: | 1218 private: |
| 1219 void InitializeAsFirst(HBasicBlock* block) { | 1219 void InitializeAsFirst(HBasicBlock* block) { |
| 1220 DCHECK(!IsLinked()); | 1220 DCHECK(!IsLinked()); |
| 1221 SetBlock(block); | 1221 SetBlock(block); |
| 1222 } | 1222 } |
| 1223 | 1223 |
| 1224 HInstruction* next_; | 1224 HInstruction* next_; |
| 1225 HInstruction* previous_; | 1225 HInstruction* previous_; |
| 1226 HPositionInfo position_; | 1226 HPositionInfo position_; |
| 1227 | 1227 |
| 1228 friend class HBasicBlock; | 1228 friend class HBasicBlock; |
| 1229 }; | 1229 }; |
| 1230 | 1230 |
| 1231 | 1231 |
| 1232 template<int V> | 1232 template<int V> |
| 1233 class HTemplateInstruction : public HInstruction { | 1233 class HTemplateInstruction : public HInstruction { |
| 1234 public: | 1234 public: |
| 1235 virtual int OperandCount() const V8_FINAL V8_OVERRIDE { return V; } | 1235 virtual int OperandCount() const FINAL OVERRIDE { return V; } |
| 1236 virtual HValue* OperandAt(int i) const V8_FINAL V8_OVERRIDE { | 1236 virtual HValue* OperandAt(int i) const FINAL OVERRIDE { |
| 1237 return inputs_[i]; | 1237 return inputs_[i]; |
| 1238 } | 1238 } |
| 1239 | 1239 |
| 1240 protected: | 1240 protected: |
| 1241 explicit HTemplateInstruction(HType type = HType::Tagged()) | 1241 explicit HTemplateInstruction(HType type = HType::Tagged()) |
| 1242 : HInstruction(type) {} | 1242 : HInstruction(type) {} |
| 1243 | 1243 |
| 1244 virtual void InternalSetOperandAt(int i, HValue* value) V8_FINAL V8_OVERRIDE { | 1244 virtual void InternalSetOperandAt(int i, HValue* value) FINAL OVERRIDE { |
| 1245 inputs_[i] = value; | 1245 inputs_[i] = value; |
| 1246 } | 1246 } |
| 1247 | 1247 |
| 1248 private: | 1248 private: |
| 1249 EmbeddedContainer<HValue*, V> inputs_; | 1249 EmbeddedContainer<HValue*, V> inputs_; |
| 1250 }; | 1250 }; |
| 1251 | 1251 |
| 1252 | 1252 |
| 1253 class HControlInstruction : public HInstruction { | 1253 class HControlInstruction : public HInstruction { |
| 1254 public: | 1254 public: |
| 1255 virtual HBasicBlock* SuccessorAt(int i) const = 0; | 1255 virtual HBasicBlock* SuccessorAt(int i) const = 0; |
| 1256 virtual int SuccessorCount() const = 0; | 1256 virtual int SuccessorCount() const = 0; |
| 1257 virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0; | 1257 virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0; |
| 1258 | 1258 |
| 1259 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1259 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 1260 | 1260 |
| 1261 virtual bool KnownSuccessorBlock(HBasicBlock** block) { | 1261 virtual bool KnownSuccessorBlock(HBasicBlock** block) { |
| 1262 *block = NULL; | 1262 *block = NULL; |
| 1263 return false; | 1263 return false; |
| 1264 } | 1264 } |
| 1265 | 1265 |
| 1266 HBasicBlock* FirstSuccessor() { | 1266 HBasicBlock* FirstSuccessor() { |
| 1267 return SuccessorCount() > 0 ? SuccessorAt(0) : NULL; | 1267 return SuccessorCount() > 0 ? SuccessorAt(0) : NULL; |
| 1268 } | 1268 } |
| 1269 HBasicBlock* SecondSuccessor() { | 1269 HBasicBlock* SecondSuccessor() { |
| 1270 return SuccessorCount() > 1 ? SuccessorAt(1) : NULL; | 1270 return SuccessorCount() > 1 ? SuccessorAt(1) : NULL; |
| 1271 } | 1271 } |
| 1272 | 1272 |
| 1273 void Not() { | 1273 void Not() { |
| 1274 HBasicBlock* swap = SuccessorAt(0); | 1274 HBasicBlock* swap = SuccessorAt(0); |
| 1275 SetSuccessorAt(0, SuccessorAt(1)); | 1275 SetSuccessorAt(0, SuccessorAt(1)); |
| 1276 SetSuccessorAt(1, swap); | 1276 SetSuccessorAt(1, swap); |
| 1277 } | 1277 } |
| 1278 | 1278 |
| 1279 DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction) | 1279 DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction) |
| 1280 }; | 1280 }; |
| 1281 | 1281 |
| 1282 | 1282 |
| 1283 class HSuccessorIterator V8_FINAL BASE_EMBEDDED { | 1283 class HSuccessorIterator FINAL BASE_EMBEDDED { |
| 1284 public: | 1284 public: |
| 1285 explicit HSuccessorIterator(const HControlInstruction* instr) | 1285 explicit HSuccessorIterator(const HControlInstruction* instr) |
| 1286 : instr_(instr), current_(0) {} | 1286 : instr_(instr), current_(0) {} |
| 1287 | 1287 |
| 1288 bool Done() { return current_ >= instr_->SuccessorCount(); } | 1288 bool Done() { return current_ >= instr_->SuccessorCount(); } |
| 1289 HBasicBlock* Current() { return instr_->SuccessorAt(current_); } | 1289 HBasicBlock* Current() { return instr_->SuccessorAt(current_); } |
| 1290 void Advance() { current_++; } | 1290 void Advance() { current_++; } |
| 1291 | 1291 |
| 1292 private: | 1292 private: |
| 1293 const HControlInstruction* instr_; | 1293 const HControlInstruction* instr_; |
| 1294 int current_; | 1294 int current_; |
| 1295 }; | 1295 }; |
| 1296 | 1296 |
| 1297 | 1297 |
| 1298 template<int S, int V> | 1298 template<int S, int V> |
| 1299 class HTemplateControlInstruction : public HControlInstruction { | 1299 class HTemplateControlInstruction : public HControlInstruction { |
| 1300 public: | 1300 public: |
| 1301 int SuccessorCount() const V8_OVERRIDE { return S; } | 1301 int SuccessorCount() const OVERRIDE { return S; } |
| 1302 HBasicBlock* SuccessorAt(int i) const V8_OVERRIDE { return successors_[i]; } | 1302 HBasicBlock* SuccessorAt(int i) const OVERRIDE { return successors_[i]; } |
| 1303 void SetSuccessorAt(int i, HBasicBlock* block) V8_OVERRIDE { | 1303 void SetSuccessorAt(int i, HBasicBlock* block) OVERRIDE { |
| 1304 successors_[i] = block; | 1304 successors_[i] = block; |
| 1305 } | 1305 } |
| 1306 | 1306 |
| 1307 int OperandCount() const V8_OVERRIDE { return V; } | 1307 int OperandCount() const OVERRIDE { return V; } |
| 1308 HValue* OperandAt(int i) const V8_OVERRIDE { return inputs_[i]; } | 1308 HValue* OperandAt(int i) const OVERRIDE { return inputs_[i]; } |
| 1309 | 1309 |
| 1310 | 1310 |
| 1311 protected: | 1311 protected: |
| 1312 void InternalSetOperandAt(int i, HValue* value) V8_OVERRIDE { | 1312 void InternalSetOperandAt(int i, HValue* value) OVERRIDE { |
| 1313 inputs_[i] = value; | 1313 inputs_[i] = value; |
| 1314 } | 1314 } |
| 1315 | 1315 |
| 1316 private: | 1316 private: |
| 1317 EmbeddedContainer<HBasicBlock*, S> successors_; | 1317 EmbeddedContainer<HBasicBlock*, S> successors_; |
| 1318 EmbeddedContainer<HValue*, V> inputs_; | 1318 EmbeddedContainer<HValue*, V> inputs_; |
| 1319 }; | 1319 }; |
| 1320 | 1320 |
| 1321 | 1321 |
| 1322 class HBlockEntry V8_FINAL : public HTemplateInstruction<0> { | 1322 class HBlockEntry FINAL : public HTemplateInstruction<0> { |
| 1323 public: | 1323 public: |
| 1324 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1324 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1325 return Representation::None(); | 1325 return Representation::None(); |
| 1326 } | 1326 } |
| 1327 | 1327 |
| 1328 DECLARE_CONCRETE_INSTRUCTION(BlockEntry) | 1328 DECLARE_CONCRETE_INSTRUCTION(BlockEntry) |
| 1329 }; | 1329 }; |
| 1330 | 1330 |
| 1331 | 1331 |
| 1332 class HDummyUse V8_FINAL : public HTemplateInstruction<1> { | 1332 class HDummyUse FINAL : public HTemplateInstruction<1> { |
| 1333 public: | 1333 public: |
| 1334 explicit HDummyUse(HValue* value) | 1334 explicit HDummyUse(HValue* value) |
| 1335 : HTemplateInstruction<1>(HType::Smi()) { | 1335 : HTemplateInstruction<1>(HType::Smi()) { |
| 1336 SetOperandAt(0, value); | 1336 SetOperandAt(0, value); |
| 1337 // Pretend to be a Smi so that the HChange instructions inserted | 1337 // Pretend to be a Smi so that the HChange instructions inserted |
| 1338 // before any use generate as little code as possible. | 1338 // before any use generate as little code as possible. |
| 1339 set_representation(Representation::Tagged()); | 1339 set_representation(Representation::Tagged()); |
| 1340 } | 1340 } |
| 1341 | 1341 |
| 1342 HValue* value() const { return OperandAt(0); } | 1342 HValue* value() const { return OperandAt(0); } |
| 1343 | 1343 |
| 1344 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } | 1344 virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; } |
| 1345 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1345 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1346 return Representation::None(); | 1346 return Representation::None(); |
| 1347 } | 1347 } |
| 1348 | 1348 |
| 1349 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1349 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 1350 | 1350 |
| 1351 DECLARE_CONCRETE_INSTRUCTION(DummyUse); | 1351 DECLARE_CONCRETE_INSTRUCTION(DummyUse); |
| 1352 }; | 1352 }; |
| 1353 | 1353 |
| 1354 | 1354 |
| 1355 // Inserts an int3/stop break instruction for debugging purposes. | 1355 // Inserts an int3/stop break instruction for debugging purposes. |
| 1356 class HDebugBreak V8_FINAL : public HTemplateInstruction<0> { | 1356 class HDebugBreak FINAL : public HTemplateInstruction<0> { |
| 1357 public: | 1357 public: |
| 1358 DECLARE_INSTRUCTION_FACTORY_P0(HDebugBreak); | 1358 DECLARE_INSTRUCTION_FACTORY_P0(HDebugBreak); |
| 1359 | 1359 |
| 1360 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1360 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1361 return Representation::None(); | 1361 return Representation::None(); |
| 1362 } | 1362 } |
| 1363 | 1363 |
| 1364 DECLARE_CONCRETE_INSTRUCTION(DebugBreak) | 1364 DECLARE_CONCRETE_INSTRUCTION(DebugBreak) |
| 1365 }; | 1365 }; |
| 1366 | 1366 |
| 1367 | 1367 |
| 1368 class HGoto V8_FINAL : public HTemplateControlInstruction<1, 0> { | 1368 class HGoto FINAL : public HTemplateControlInstruction<1, 0> { |
| 1369 public: | 1369 public: |
| 1370 explicit HGoto(HBasicBlock* target) { | 1370 explicit HGoto(HBasicBlock* target) { |
| 1371 SetSuccessorAt(0, target); | 1371 SetSuccessorAt(0, target); |
| 1372 } | 1372 } |
| 1373 | 1373 |
| 1374 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE { | 1374 virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE { |
| 1375 *block = FirstSuccessor(); | 1375 *block = FirstSuccessor(); |
| 1376 return true; | 1376 return true; |
| 1377 } | 1377 } |
| 1378 | 1378 |
| 1379 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1379 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1380 return Representation::None(); | 1380 return Representation::None(); |
| 1381 } | 1381 } |
| 1382 | 1382 |
| 1383 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1383 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 1384 | 1384 |
| 1385 DECLARE_CONCRETE_INSTRUCTION(Goto) | 1385 DECLARE_CONCRETE_INSTRUCTION(Goto) |
| 1386 }; | 1386 }; |
| 1387 | 1387 |
| 1388 | 1388 |
| 1389 class HDeoptimize V8_FINAL : public HTemplateControlInstruction<1, 0> { | 1389 class HDeoptimize FINAL : public HTemplateControlInstruction<1, 0> { |
| 1390 public: | 1390 public: |
| 1391 static HDeoptimize* New(Zone* zone, | 1391 static HDeoptimize* New(Zone* zone, |
| 1392 HValue* context, | 1392 HValue* context, |
| 1393 const char* reason, | 1393 const char* reason, |
| 1394 Deoptimizer::BailoutType type, | 1394 Deoptimizer::BailoutType type, |
| 1395 HBasicBlock* unreachable_continuation) { | 1395 HBasicBlock* unreachable_continuation) { |
| 1396 return new(zone) HDeoptimize(reason, type, unreachable_continuation); | 1396 return new(zone) HDeoptimize(reason, type, unreachable_continuation); |
| 1397 } | 1397 } |
| 1398 | 1398 |
| 1399 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE { | 1399 virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE { |
| 1400 *block = NULL; | 1400 *block = NULL; |
| 1401 return true; | 1401 return true; |
| 1402 } | 1402 } |
| 1403 | 1403 |
| 1404 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1404 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1405 return Representation::None(); | 1405 return Representation::None(); |
| 1406 } | 1406 } |
| 1407 | 1407 |
| 1408 const char* reason() const { return reason_; } | 1408 const char* reason() const { return reason_; } |
| 1409 Deoptimizer::BailoutType type() { return type_; } | 1409 Deoptimizer::BailoutType type() { return type_; } |
| 1410 | 1410 |
| 1411 DECLARE_CONCRETE_INSTRUCTION(Deoptimize) | 1411 DECLARE_CONCRETE_INSTRUCTION(Deoptimize) |
| 1412 | 1412 |
| 1413 private: | 1413 private: |
| 1414 explicit HDeoptimize(const char* reason, | 1414 explicit HDeoptimize(const char* reason, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1426 class HUnaryControlInstruction : public HTemplateControlInstruction<2, 1> { | 1426 class HUnaryControlInstruction : public HTemplateControlInstruction<2, 1> { |
| 1427 public: | 1427 public: |
| 1428 HUnaryControlInstruction(HValue* value, | 1428 HUnaryControlInstruction(HValue* value, |
| 1429 HBasicBlock* true_target, | 1429 HBasicBlock* true_target, |
| 1430 HBasicBlock* false_target) { | 1430 HBasicBlock* false_target) { |
| 1431 SetOperandAt(0, value); | 1431 SetOperandAt(0, value); |
| 1432 SetSuccessorAt(0, true_target); | 1432 SetSuccessorAt(0, true_target); |
| 1433 SetSuccessorAt(1, false_target); | 1433 SetSuccessorAt(1, false_target); |
| 1434 } | 1434 } |
| 1435 | 1435 |
| 1436 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1436 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 1437 | 1437 |
| 1438 HValue* value() const { return OperandAt(0); } | 1438 HValue* value() const { return OperandAt(0); } |
| 1439 }; | 1439 }; |
| 1440 | 1440 |
| 1441 | 1441 |
| 1442 class HBranch V8_FINAL : public HUnaryControlInstruction { | 1442 class HBranch FINAL : public HUnaryControlInstruction { |
| 1443 public: | 1443 public: |
| 1444 DECLARE_INSTRUCTION_FACTORY_P1(HBranch, HValue*); | 1444 DECLARE_INSTRUCTION_FACTORY_P1(HBranch, HValue*); |
| 1445 DECLARE_INSTRUCTION_FACTORY_P2(HBranch, HValue*, | 1445 DECLARE_INSTRUCTION_FACTORY_P2(HBranch, HValue*, |
| 1446 ToBooleanStub::Types); | 1446 ToBooleanStub::Types); |
| 1447 DECLARE_INSTRUCTION_FACTORY_P4(HBranch, HValue*, | 1447 DECLARE_INSTRUCTION_FACTORY_P4(HBranch, HValue*, |
| 1448 ToBooleanStub::Types, | 1448 ToBooleanStub::Types, |
| 1449 HBasicBlock*, HBasicBlock*); | 1449 HBasicBlock*, HBasicBlock*); |
| 1450 | 1450 |
| 1451 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1451 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1452 return Representation::None(); | 1452 return Representation::None(); |
| 1453 } | 1453 } |
| 1454 virtual Representation observed_input_representation(int index) V8_OVERRIDE; | 1454 virtual Representation observed_input_representation(int index) OVERRIDE; |
| 1455 | 1455 |
| 1456 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 1456 virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; |
| 1457 | 1457 |
| 1458 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1458 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 1459 | 1459 |
| 1460 ToBooleanStub::Types expected_input_types() const { | 1460 ToBooleanStub::Types expected_input_types() const { |
| 1461 return expected_input_types_; | 1461 return expected_input_types_; |
| 1462 } | 1462 } |
| 1463 | 1463 |
| 1464 DECLARE_CONCRETE_INSTRUCTION(Branch) | 1464 DECLARE_CONCRETE_INSTRUCTION(Branch) |
| 1465 | 1465 |
| 1466 private: | 1466 private: |
| 1467 HBranch(HValue* value, | 1467 HBranch(HValue* value, |
| 1468 ToBooleanStub::Types expected_input_types = ToBooleanStub::Types(), | 1468 ToBooleanStub::Types expected_input_types = ToBooleanStub::Types(), |
| 1469 HBasicBlock* true_target = NULL, | 1469 HBasicBlock* true_target = NULL, |
| 1470 HBasicBlock* false_target = NULL) | 1470 HBasicBlock* false_target = NULL) |
| 1471 : HUnaryControlInstruction(value, true_target, false_target), | 1471 : HUnaryControlInstruction(value, true_target, false_target), |
| 1472 expected_input_types_(expected_input_types) { | 1472 expected_input_types_(expected_input_types) { |
| 1473 SetFlag(kAllowUndefinedAsNaN); | 1473 SetFlag(kAllowUndefinedAsNaN); |
| 1474 } | 1474 } |
| 1475 | 1475 |
| 1476 ToBooleanStub::Types expected_input_types_; | 1476 ToBooleanStub::Types expected_input_types_; |
| 1477 }; | 1477 }; |
| 1478 | 1478 |
| 1479 | 1479 |
| 1480 class HCompareMap V8_FINAL : public HUnaryControlInstruction { | 1480 class HCompareMap FINAL : public HUnaryControlInstruction { |
| 1481 public: | 1481 public: |
| 1482 DECLARE_INSTRUCTION_FACTORY_P2(HCompareMap, HValue*, Handle<Map>); | 1482 DECLARE_INSTRUCTION_FACTORY_P2(HCompareMap, HValue*, Handle<Map>); |
| 1483 DECLARE_INSTRUCTION_FACTORY_P4(HCompareMap, HValue*, Handle<Map>, | 1483 DECLARE_INSTRUCTION_FACTORY_P4(HCompareMap, HValue*, Handle<Map>, |
| 1484 HBasicBlock*, HBasicBlock*); | 1484 HBasicBlock*, HBasicBlock*); |
| 1485 | 1485 |
| 1486 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE { | 1486 virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE { |
| 1487 if (known_successor_index() != kNoKnownSuccessorIndex) { | 1487 if (known_successor_index() != kNoKnownSuccessorIndex) { |
| 1488 *block = SuccessorAt(known_successor_index()); | 1488 *block = SuccessorAt(known_successor_index()); |
| 1489 return true; | 1489 return true; |
| 1490 } | 1490 } |
| 1491 *block = NULL; | 1491 *block = NULL; |
| 1492 return false; | 1492 return false; |
| 1493 } | 1493 } |
| 1494 | 1494 |
| 1495 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1495 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 1496 | 1496 |
| 1497 static const int kNoKnownSuccessorIndex = -1; | 1497 static const int kNoKnownSuccessorIndex = -1; |
| 1498 int known_successor_index() const { return known_successor_index_; } | 1498 int known_successor_index() const { return known_successor_index_; } |
| 1499 void set_known_successor_index(int known_successor_index) { | 1499 void set_known_successor_index(int known_successor_index) { |
| 1500 known_successor_index_ = known_successor_index; | 1500 known_successor_index_ = known_successor_index; |
| 1501 } | 1501 } |
| 1502 | 1502 |
| 1503 Unique<Map> map() const { return map_; } | 1503 Unique<Map> map() const { return map_; } |
| 1504 bool map_is_stable() const { return map_is_stable_; } | 1504 bool map_is_stable() const { return map_is_stable_; } |
| 1505 | 1505 |
| 1506 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1506 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1507 return Representation::Tagged(); | 1507 return Representation::Tagged(); |
| 1508 } | 1508 } |
| 1509 | 1509 |
| 1510 DECLARE_CONCRETE_INSTRUCTION(CompareMap) | 1510 DECLARE_CONCRETE_INSTRUCTION(CompareMap) |
| 1511 | 1511 |
| 1512 protected: | 1512 protected: |
| 1513 virtual int RedefinedOperandIndex() { return 0; } | 1513 virtual int RedefinedOperandIndex() { return 0; } |
| 1514 | 1514 |
| 1515 private: | 1515 private: |
| 1516 HCompareMap(HValue* value, | 1516 HCompareMap(HValue* value, |
| 1517 Handle<Map> map, | 1517 Handle<Map> map, |
| 1518 HBasicBlock* true_target = NULL, | 1518 HBasicBlock* true_target = NULL, |
| 1519 HBasicBlock* false_target = NULL) | 1519 HBasicBlock* false_target = NULL) |
| 1520 : HUnaryControlInstruction(value, true_target, false_target), | 1520 : HUnaryControlInstruction(value, true_target, false_target), |
| 1521 known_successor_index_(kNoKnownSuccessorIndex), | 1521 known_successor_index_(kNoKnownSuccessorIndex), |
| 1522 map_is_stable_(map->is_stable()), | 1522 map_is_stable_(map->is_stable()), |
| 1523 map_(Unique<Map>::CreateImmovable(map)) { | 1523 map_(Unique<Map>::CreateImmovable(map)) { |
| 1524 set_representation(Representation::Tagged()); | 1524 set_representation(Representation::Tagged()); |
| 1525 } | 1525 } |
| 1526 | 1526 |
| 1527 int known_successor_index_ : 31; | 1527 int known_successor_index_ : 31; |
| 1528 bool map_is_stable_ : 1; | 1528 bool map_is_stable_ : 1; |
| 1529 Unique<Map> map_; | 1529 Unique<Map> map_; |
| 1530 }; | 1530 }; |
| 1531 | 1531 |
| 1532 | 1532 |
| 1533 class HContext V8_FINAL : public HTemplateInstruction<0> { | 1533 class HContext FINAL : public HTemplateInstruction<0> { |
| 1534 public: | 1534 public: |
| 1535 static HContext* New(Zone* zone) { | 1535 static HContext* New(Zone* zone) { |
| 1536 return new(zone) HContext(); | 1536 return new(zone) HContext(); |
| 1537 } | 1537 } |
| 1538 | 1538 |
| 1539 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1539 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1540 return Representation::None(); | 1540 return Representation::None(); |
| 1541 } | 1541 } |
| 1542 | 1542 |
| 1543 DECLARE_CONCRETE_INSTRUCTION(Context) | 1543 DECLARE_CONCRETE_INSTRUCTION(Context) |
| 1544 | 1544 |
| 1545 protected: | 1545 protected: |
| 1546 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 1546 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 1547 | 1547 |
| 1548 private: | 1548 private: |
| 1549 HContext() { | 1549 HContext() { |
| 1550 set_representation(Representation::Tagged()); | 1550 set_representation(Representation::Tagged()); |
| 1551 SetFlag(kUseGVN); | 1551 SetFlag(kUseGVN); |
| 1552 } | 1552 } |
| 1553 | 1553 |
| 1554 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 1554 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 1555 }; | 1555 }; |
| 1556 | 1556 |
| 1557 | 1557 |
| 1558 class HReturn V8_FINAL : public HTemplateControlInstruction<0, 3> { | 1558 class HReturn FINAL : public HTemplateControlInstruction<0, 3> { |
| 1559 public: | 1559 public: |
| 1560 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HReturn, HValue*, HValue*); | 1560 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HReturn, HValue*, HValue*); |
| 1561 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HReturn, HValue*); | 1561 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HReturn, HValue*); |
| 1562 | 1562 |
| 1563 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1563 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1564 // TODO(titzer): require an Int32 input for faster returns. | 1564 // TODO(titzer): require an Int32 input for faster returns. |
| 1565 if (index == 2) return Representation::Smi(); | 1565 if (index == 2) return Representation::Smi(); |
| 1566 return Representation::Tagged(); | 1566 return Representation::Tagged(); |
| 1567 } | 1567 } |
| 1568 | 1568 |
| 1569 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1569 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 1570 | 1570 |
| 1571 HValue* value() const { return OperandAt(0); } | 1571 HValue* value() const { return OperandAt(0); } |
| 1572 HValue* context() const { return OperandAt(1); } | 1572 HValue* context() const { return OperandAt(1); } |
| 1573 HValue* parameter_count() const { return OperandAt(2); } | 1573 HValue* parameter_count() const { return OperandAt(2); } |
| 1574 | 1574 |
| 1575 DECLARE_CONCRETE_INSTRUCTION(Return) | 1575 DECLARE_CONCRETE_INSTRUCTION(Return) |
| 1576 | 1576 |
| 1577 private: | 1577 private: |
| 1578 HReturn(HValue* context, HValue* value, HValue* parameter_count = 0) { | 1578 HReturn(HValue* context, HValue* value, HValue* parameter_count = 0) { |
| 1579 SetOperandAt(0, value); | 1579 SetOperandAt(0, value); |
| 1580 SetOperandAt(1, context); | 1580 SetOperandAt(1, context); |
| 1581 SetOperandAt(2, parameter_count); | 1581 SetOperandAt(2, parameter_count); |
| 1582 } | 1582 } |
| 1583 }; | 1583 }; |
| 1584 | 1584 |
| 1585 | 1585 |
| 1586 class HAbnormalExit V8_FINAL : public HTemplateControlInstruction<0, 0> { | 1586 class HAbnormalExit FINAL : public HTemplateControlInstruction<0, 0> { |
| 1587 public: | 1587 public: |
| 1588 DECLARE_INSTRUCTION_FACTORY_P0(HAbnormalExit); | 1588 DECLARE_INSTRUCTION_FACTORY_P0(HAbnormalExit); |
| 1589 | 1589 |
| 1590 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1590 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1591 return Representation::None(); | 1591 return Representation::None(); |
| 1592 } | 1592 } |
| 1593 | 1593 |
| 1594 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit) | 1594 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit) |
| 1595 private: | 1595 private: |
| 1596 HAbnormalExit() {} | 1596 HAbnormalExit() {} |
| 1597 }; | 1597 }; |
| 1598 | 1598 |
| 1599 | 1599 |
| 1600 class HUnaryOperation : public HTemplateInstruction<1> { | 1600 class HUnaryOperation : public HTemplateInstruction<1> { |
| 1601 public: | 1601 public: |
| 1602 explicit HUnaryOperation(HValue* value, HType type = HType::Tagged()) | 1602 explicit HUnaryOperation(HValue* value, HType type = HType::Tagged()) |
| 1603 : HTemplateInstruction<1>(type) { | 1603 : HTemplateInstruction<1>(type) { |
| 1604 SetOperandAt(0, value); | 1604 SetOperandAt(0, value); |
| 1605 } | 1605 } |
| 1606 | 1606 |
| 1607 static HUnaryOperation* cast(HValue* value) { | 1607 static HUnaryOperation* cast(HValue* value) { |
| 1608 return reinterpret_cast<HUnaryOperation*>(value); | 1608 return reinterpret_cast<HUnaryOperation*>(value); |
| 1609 } | 1609 } |
| 1610 | 1610 |
| 1611 HValue* value() const { return OperandAt(0); } | 1611 HValue* value() const { return OperandAt(0); } |
| 1612 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1612 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 1613 }; | 1613 }; |
| 1614 | 1614 |
| 1615 | 1615 |
| 1616 class HUseConst V8_FINAL : public HUnaryOperation { | 1616 class HUseConst FINAL : public HUnaryOperation { |
| 1617 public: | 1617 public: |
| 1618 DECLARE_INSTRUCTION_FACTORY_P1(HUseConst, HValue*); | 1618 DECLARE_INSTRUCTION_FACTORY_P1(HUseConst, HValue*); |
| 1619 | 1619 |
| 1620 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1620 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1621 return Representation::None(); | 1621 return Representation::None(); |
| 1622 } | 1622 } |
| 1623 | 1623 |
| 1624 DECLARE_CONCRETE_INSTRUCTION(UseConst) | 1624 DECLARE_CONCRETE_INSTRUCTION(UseConst) |
| 1625 | 1625 |
| 1626 private: | 1626 private: |
| 1627 explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { } | 1627 explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { } |
| 1628 }; | 1628 }; |
| 1629 | 1629 |
| 1630 | 1630 |
| 1631 class HForceRepresentation V8_FINAL : public HTemplateInstruction<1> { | 1631 class HForceRepresentation FINAL : public HTemplateInstruction<1> { |
| 1632 public: | 1632 public: |
| 1633 static HInstruction* New(Zone* zone, HValue* context, HValue* value, | 1633 static HInstruction* New(Zone* zone, HValue* context, HValue* value, |
| 1634 Representation required_representation); | 1634 Representation required_representation); |
| 1635 | 1635 |
| 1636 HValue* value() const { return OperandAt(0); } | 1636 HValue* value() const { return OperandAt(0); } |
| 1637 | 1637 |
| 1638 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1638 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1639 return representation(); // Same as the output representation. | 1639 return representation(); // Same as the output representation. |
| 1640 } | 1640 } |
| 1641 | 1641 |
| 1642 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1642 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 1643 | 1643 |
| 1644 DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation) | 1644 DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation) |
| 1645 | 1645 |
| 1646 private: | 1646 private: |
| 1647 HForceRepresentation(HValue* value, Representation required_representation) { | 1647 HForceRepresentation(HValue* value, Representation required_representation) { |
| 1648 SetOperandAt(0, value); | 1648 SetOperandAt(0, value); |
| 1649 set_representation(required_representation); | 1649 set_representation(required_representation); |
| 1650 } | 1650 } |
| 1651 }; | 1651 }; |
| 1652 | 1652 |
| 1653 | 1653 |
| 1654 class HChange V8_FINAL : public HUnaryOperation { | 1654 class HChange FINAL : public HUnaryOperation { |
| 1655 public: | 1655 public: |
| 1656 HChange(HValue* value, | 1656 HChange(HValue* value, |
| 1657 Representation to, | 1657 Representation to, |
| 1658 bool is_truncating_to_smi, | 1658 bool is_truncating_to_smi, |
| 1659 bool is_truncating_to_int32) | 1659 bool is_truncating_to_int32) |
| 1660 : HUnaryOperation(value) { | 1660 : HUnaryOperation(value) { |
| 1661 DCHECK(!value->representation().IsNone()); | 1661 DCHECK(!value->representation().IsNone()); |
| 1662 DCHECK(!to.IsNone()); | 1662 DCHECK(!to.IsNone()); |
| 1663 DCHECK(!value->representation().Equals(to)); | 1663 DCHECK(!value->representation().Equals(to)); |
| 1664 set_representation(to); | 1664 set_representation(to); |
| 1665 SetFlag(kUseGVN); | 1665 SetFlag(kUseGVN); |
| 1666 SetFlag(kCanOverflow); | 1666 SetFlag(kCanOverflow); |
| 1667 if (is_truncating_to_smi && to.IsSmi()) { | 1667 if (is_truncating_to_smi && to.IsSmi()) { |
| 1668 SetFlag(kTruncatingToSmi); | 1668 SetFlag(kTruncatingToSmi); |
| 1669 SetFlag(kTruncatingToInt32); | 1669 SetFlag(kTruncatingToInt32); |
| 1670 } | 1670 } |
| 1671 if (is_truncating_to_int32) SetFlag(kTruncatingToInt32); | 1671 if (is_truncating_to_int32) SetFlag(kTruncatingToInt32); |
| 1672 if (value->representation().IsSmi() || value->type().IsSmi()) { | 1672 if (value->representation().IsSmi() || value->type().IsSmi()) { |
| 1673 set_type(HType::Smi()); | 1673 set_type(HType::Smi()); |
| 1674 } else { | 1674 } else { |
| 1675 set_type(HType::TaggedNumber()); | 1675 set_type(HType::TaggedNumber()); |
| 1676 if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion); | 1676 if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion); |
| 1677 } | 1677 } |
| 1678 } | 1678 } |
| 1679 | 1679 |
| 1680 bool can_convert_undefined_to_nan() { | 1680 bool can_convert_undefined_to_nan() { |
| 1681 return CheckUsesForFlag(kAllowUndefinedAsNaN); | 1681 return CheckUsesForFlag(kAllowUndefinedAsNaN); |
| 1682 } | 1682 } |
| 1683 | 1683 |
| 1684 virtual HType CalculateInferredType() V8_OVERRIDE; | 1684 virtual HType CalculateInferredType() OVERRIDE; |
| 1685 virtual HValue* Canonicalize() V8_OVERRIDE; | 1685 virtual HValue* Canonicalize() OVERRIDE; |
| 1686 | 1686 |
| 1687 Representation from() const { return value()->representation(); } | 1687 Representation from() const { return value()->representation(); } |
| 1688 Representation to() const { return representation(); } | 1688 Representation to() const { return representation(); } |
| 1689 bool deoptimize_on_minus_zero() const { | 1689 bool deoptimize_on_minus_zero() const { |
| 1690 return CheckFlag(kBailoutOnMinusZero); | 1690 return CheckFlag(kBailoutOnMinusZero); |
| 1691 } | 1691 } |
| 1692 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1692 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1693 return from(); | 1693 return from(); |
| 1694 } | 1694 } |
| 1695 | 1695 |
| 1696 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 1696 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 1697 | 1697 |
| 1698 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1698 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 1699 | 1699 |
| 1700 DECLARE_CONCRETE_INSTRUCTION(Change) | 1700 DECLARE_CONCRETE_INSTRUCTION(Change) |
| 1701 | 1701 |
| 1702 protected: | 1702 protected: |
| 1703 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 1703 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 1704 | 1704 |
| 1705 private: | 1705 private: |
| 1706 virtual bool IsDeletable() const V8_OVERRIDE { | 1706 virtual bool IsDeletable() const OVERRIDE { |
| 1707 return !from().IsTagged() || value()->type().IsSmi(); | 1707 return !from().IsTagged() || value()->type().IsSmi(); |
| 1708 } | 1708 } |
| 1709 }; | 1709 }; |
| 1710 | 1710 |
| 1711 | 1711 |
| 1712 class HClampToUint8 V8_FINAL : public HUnaryOperation { | 1712 class HClampToUint8 FINAL : public HUnaryOperation { |
| 1713 public: | 1713 public: |
| 1714 DECLARE_INSTRUCTION_FACTORY_P1(HClampToUint8, HValue*); | 1714 DECLARE_INSTRUCTION_FACTORY_P1(HClampToUint8, HValue*); |
| 1715 | 1715 |
| 1716 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1716 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1717 return Representation::None(); | 1717 return Representation::None(); |
| 1718 } | 1718 } |
| 1719 | 1719 |
| 1720 DECLARE_CONCRETE_INSTRUCTION(ClampToUint8) | 1720 DECLARE_CONCRETE_INSTRUCTION(ClampToUint8) |
| 1721 | 1721 |
| 1722 protected: | 1722 protected: |
| 1723 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 1723 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 1724 | 1724 |
| 1725 private: | 1725 private: |
| 1726 explicit HClampToUint8(HValue* value) | 1726 explicit HClampToUint8(HValue* value) |
| 1727 : HUnaryOperation(value) { | 1727 : HUnaryOperation(value) { |
| 1728 set_representation(Representation::Integer32()); | 1728 set_representation(Representation::Integer32()); |
| 1729 SetFlag(kAllowUndefinedAsNaN); | 1729 SetFlag(kAllowUndefinedAsNaN); |
| 1730 SetFlag(kUseGVN); | 1730 SetFlag(kUseGVN); |
| 1731 } | 1731 } |
| 1732 | 1732 |
| 1733 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 1733 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 1734 }; | 1734 }; |
| 1735 | 1735 |
| 1736 | 1736 |
| 1737 class HDoubleBits V8_FINAL : public HUnaryOperation { | 1737 class HDoubleBits FINAL : public HUnaryOperation { |
| 1738 public: | 1738 public: |
| 1739 enum Bits { HIGH, LOW }; | 1739 enum Bits { HIGH, LOW }; |
| 1740 DECLARE_INSTRUCTION_FACTORY_P2(HDoubleBits, HValue*, Bits); | 1740 DECLARE_INSTRUCTION_FACTORY_P2(HDoubleBits, HValue*, Bits); |
| 1741 | 1741 |
| 1742 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1742 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1743 return Representation::Double(); | 1743 return Representation::Double(); |
| 1744 } | 1744 } |
| 1745 | 1745 |
| 1746 DECLARE_CONCRETE_INSTRUCTION(DoubleBits) | 1746 DECLARE_CONCRETE_INSTRUCTION(DoubleBits) |
| 1747 | 1747 |
| 1748 Bits bits() { return bits_; } | 1748 Bits bits() { return bits_; } |
| 1749 | 1749 |
| 1750 protected: | 1750 protected: |
| 1751 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 1751 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 1752 return other->IsDoubleBits() && HDoubleBits::cast(other)->bits() == bits(); | 1752 return other->IsDoubleBits() && HDoubleBits::cast(other)->bits() == bits(); |
| 1753 } | 1753 } |
| 1754 | 1754 |
| 1755 private: | 1755 private: |
| 1756 HDoubleBits(HValue* value, Bits bits) | 1756 HDoubleBits(HValue* value, Bits bits) |
| 1757 : HUnaryOperation(value), bits_(bits) { | 1757 : HUnaryOperation(value), bits_(bits) { |
| 1758 set_representation(Representation::Integer32()); | 1758 set_representation(Representation::Integer32()); |
| 1759 SetFlag(kUseGVN); | 1759 SetFlag(kUseGVN); |
| 1760 } | 1760 } |
| 1761 | 1761 |
| 1762 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 1762 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 1763 | 1763 |
| 1764 Bits bits_; | 1764 Bits bits_; |
| 1765 }; | 1765 }; |
| 1766 | 1766 |
| 1767 | 1767 |
| 1768 class HConstructDouble V8_FINAL : public HTemplateInstruction<2> { | 1768 class HConstructDouble FINAL : public HTemplateInstruction<2> { |
| 1769 public: | 1769 public: |
| 1770 DECLARE_INSTRUCTION_FACTORY_P2(HConstructDouble, HValue*, HValue*); | 1770 DECLARE_INSTRUCTION_FACTORY_P2(HConstructDouble, HValue*, HValue*); |
| 1771 | 1771 |
| 1772 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1772 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1773 return Representation::Integer32(); | 1773 return Representation::Integer32(); |
| 1774 } | 1774 } |
| 1775 | 1775 |
| 1776 DECLARE_CONCRETE_INSTRUCTION(ConstructDouble) | 1776 DECLARE_CONCRETE_INSTRUCTION(ConstructDouble) |
| 1777 | 1777 |
| 1778 HValue* hi() { return OperandAt(0); } | 1778 HValue* hi() { return OperandAt(0); } |
| 1779 HValue* lo() { return OperandAt(1); } | 1779 HValue* lo() { return OperandAt(1); } |
| 1780 | 1780 |
| 1781 protected: | 1781 protected: |
| 1782 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 1782 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 1783 | 1783 |
| 1784 private: | 1784 private: |
| 1785 explicit HConstructDouble(HValue* hi, HValue* lo) { | 1785 explicit HConstructDouble(HValue* hi, HValue* lo) { |
| 1786 set_representation(Representation::Double()); | 1786 set_representation(Representation::Double()); |
| 1787 SetFlag(kUseGVN); | 1787 SetFlag(kUseGVN); |
| 1788 SetOperandAt(0, hi); | 1788 SetOperandAt(0, hi); |
| 1789 SetOperandAt(1, lo); | 1789 SetOperandAt(1, lo); |
| 1790 } | 1790 } |
| 1791 | 1791 |
| 1792 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 1792 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 1793 }; | 1793 }; |
| 1794 | 1794 |
| 1795 | 1795 |
| 1796 enum RemovableSimulate { | 1796 enum RemovableSimulate { |
| 1797 REMOVABLE_SIMULATE, | 1797 REMOVABLE_SIMULATE, |
| 1798 FIXED_SIMULATE | 1798 FIXED_SIMULATE |
| 1799 }; | 1799 }; |
| 1800 | 1800 |
| 1801 | 1801 |
| 1802 class HSimulate V8_FINAL : public HInstruction { | 1802 class HSimulate FINAL : public HInstruction { |
| 1803 public: | 1803 public: |
| 1804 HSimulate(BailoutId ast_id, | 1804 HSimulate(BailoutId ast_id, |
| 1805 int pop_count, | 1805 int pop_count, |
| 1806 Zone* zone, | 1806 Zone* zone, |
| 1807 RemovableSimulate removable) | 1807 RemovableSimulate removable) |
| 1808 : ast_id_(ast_id), | 1808 : ast_id_(ast_id), |
| 1809 pop_count_(pop_count), | 1809 pop_count_(pop_count), |
| 1810 values_(2, zone), | 1810 values_(2, zone), |
| 1811 assigned_indexes_(2, zone), | 1811 assigned_indexes_(2, zone), |
| 1812 zone_(zone), | 1812 zone_(zone), |
| 1813 removable_(removable), | 1813 removable_(removable), |
| 1814 done_with_replay_(false) {} | 1814 done_with_replay_(false) {} |
| 1815 ~HSimulate() {} | 1815 ~HSimulate() {} |
| 1816 | 1816 |
| 1817 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1817 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 1818 | 1818 |
| 1819 bool HasAstId() const { return !ast_id_.IsNone(); } | 1819 bool HasAstId() const { return !ast_id_.IsNone(); } |
| 1820 BailoutId ast_id() const { return ast_id_; } | 1820 BailoutId ast_id() const { return ast_id_; } |
| 1821 void set_ast_id(BailoutId id) { | 1821 void set_ast_id(BailoutId id) { |
| 1822 DCHECK(!HasAstId()); | 1822 DCHECK(!HasAstId()); |
| 1823 ast_id_ = id; | 1823 ast_id_ = id; |
| 1824 } | 1824 } |
| 1825 | 1825 |
| 1826 int pop_count() const { return pop_count_; } | 1826 int pop_count() const { return pop_count_; } |
| 1827 const ZoneList<HValue*>* values() const { return &values_; } | 1827 const ZoneList<HValue*>* values() const { return &values_; } |
| 1828 int GetAssignedIndexAt(int index) const { | 1828 int GetAssignedIndexAt(int index) const { |
| 1829 DCHECK(HasAssignedIndexAt(index)); | 1829 DCHECK(HasAssignedIndexAt(index)); |
| 1830 return assigned_indexes_[index]; | 1830 return assigned_indexes_[index]; |
| 1831 } | 1831 } |
| 1832 bool HasAssignedIndexAt(int index) const { | 1832 bool HasAssignedIndexAt(int index) const { |
| 1833 return assigned_indexes_[index] != kNoIndex; | 1833 return assigned_indexes_[index] != kNoIndex; |
| 1834 } | 1834 } |
| 1835 void AddAssignedValue(int index, HValue* value) { | 1835 void AddAssignedValue(int index, HValue* value) { |
| 1836 AddValue(index, value); | 1836 AddValue(index, value); |
| 1837 } | 1837 } |
| 1838 void AddPushedValue(HValue* value) { | 1838 void AddPushedValue(HValue* value) { |
| 1839 AddValue(kNoIndex, value); | 1839 AddValue(kNoIndex, value); |
| 1840 } | 1840 } |
| 1841 int ToOperandIndex(int environment_index) { | 1841 int ToOperandIndex(int environment_index) { |
| 1842 for (int i = 0; i < assigned_indexes_.length(); ++i) { | 1842 for (int i = 0; i < assigned_indexes_.length(); ++i) { |
| 1843 if (assigned_indexes_[i] == environment_index) return i; | 1843 if (assigned_indexes_[i] == environment_index) return i; |
| 1844 } | 1844 } |
| 1845 return -1; | 1845 return -1; |
| 1846 } | 1846 } |
| 1847 virtual int OperandCount() const V8_OVERRIDE { return values_.length(); } | 1847 virtual int OperandCount() const OVERRIDE { return values_.length(); } |
| 1848 virtual HValue* OperandAt(int index) const V8_OVERRIDE { | 1848 virtual HValue* OperandAt(int index) const OVERRIDE { |
| 1849 return values_[index]; | 1849 return values_[index]; |
| 1850 } | 1850 } |
| 1851 | 1851 |
| 1852 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } | 1852 virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; } |
| 1853 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1853 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1854 return Representation::None(); | 1854 return Representation::None(); |
| 1855 } | 1855 } |
| 1856 | 1856 |
| 1857 void MergeWith(ZoneList<HSimulate*>* list); | 1857 void MergeWith(ZoneList<HSimulate*>* list); |
| 1858 bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; } | 1858 bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; } |
| 1859 | 1859 |
| 1860 // Replay effects of this instruction on the given environment. | 1860 // Replay effects of this instruction on the given environment. |
| 1861 void ReplayEnvironment(HEnvironment* env); | 1861 void ReplayEnvironment(HEnvironment* env); |
| 1862 | 1862 |
| 1863 DECLARE_CONCRETE_INSTRUCTION(Simulate) | 1863 DECLARE_CONCRETE_INSTRUCTION(Simulate) |
| 1864 | 1864 |
| 1865 #ifdef DEBUG | 1865 #ifdef DEBUG |
| 1866 virtual void Verify() V8_OVERRIDE; | 1866 virtual void Verify() OVERRIDE; |
| 1867 void set_closure(Handle<JSFunction> closure) { closure_ = closure; } | 1867 void set_closure(Handle<JSFunction> closure) { closure_ = closure; } |
| 1868 Handle<JSFunction> closure() const { return closure_; } | 1868 Handle<JSFunction> closure() const { return closure_; } |
| 1869 #endif | 1869 #endif |
| 1870 | 1870 |
| 1871 protected: | 1871 protected: |
| 1872 virtual void InternalSetOperandAt(int index, HValue* value) V8_OVERRIDE { | 1872 virtual void InternalSetOperandAt(int index, HValue* value) OVERRIDE { |
| 1873 values_[index] = value; | 1873 values_[index] = value; |
| 1874 } | 1874 } |
| 1875 | 1875 |
| 1876 private: | 1876 private: |
| 1877 static const int kNoIndex = -1; | 1877 static const int kNoIndex = -1; |
| 1878 void AddValue(int index, HValue* value) { | 1878 void AddValue(int index, HValue* value) { |
| 1879 assigned_indexes_.Add(index, zone_); | 1879 assigned_indexes_.Add(index, zone_); |
| 1880 // Resize the list of pushed values. | 1880 // Resize the list of pushed values. |
| 1881 values_.Add(NULL, zone_); | 1881 values_.Add(NULL, zone_); |
| 1882 // Set the operand through the base method in HValue to make sure that the | 1882 // Set the operand through the base method in HValue to make sure that the |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1896 Zone* zone_; | 1896 Zone* zone_; |
| 1897 RemovableSimulate removable_ : 2; | 1897 RemovableSimulate removable_ : 2; |
| 1898 bool done_with_replay_ : 1; | 1898 bool done_with_replay_ : 1; |
| 1899 | 1899 |
| 1900 #ifdef DEBUG | 1900 #ifdef DEBUG |
| 1901 Handle<JSFunction> closure_; | 1901 Handle<JSFunction> closure_; |
| 1902 #endif | 1902 #endif |
| 1903 }; | 1903 }; |
| 1904 | 1904 |
| 1905 | 1905 |
| 1906 class HEnvironmentMarker V8_FINAL : public HTemplateInstruction<1> { | 1906 class HEnvironmentMarker FINAL : public HTemplateInstruction<1> { |
| 1907 public: | 1907 public: |
| 1908 enum Kind { BIND, LOOKUP }; | 1908 enum Kind { BIND, LOOKUP }; |
| 1909 | 1909 |
| 1910 DECLARE_INSTRUCTION_FACTORY_P2(HEnvironmentMarker, Kind, int); | 1910 DECLARE_INSTRUCTION_FACTORY_P2(HEnvironmentMarker, Kind, int); |
| 1911 | 1911 |
| 1912 Kind kind() const { return kind_; } | 1912 Kind kind() const { return kind_; } |
| 1913 int index() const { return index_; } | 1913 int index() const { return index_; } |
| 1914 HSimulate* next_simulate() { return next_simulate_; } | 1914 HSimulate* next_simulate() { return next_simulate_; } |
| 1915 void set_next_simulate(HSimulate* simulate) { | 1915 void set_next_simulate(HSimulate* simulate) { |
| 1916 next_simulate_ = simulate; | 1916 next_simulate_ = simulate; |
| 1917 } | 1917 } |
| 1918 | 1918 |
| 1919 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1919 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1920 return Representation::None(); | 1920 return Representation::None(); |
| 1921 } | 1921 } |
| 1922 | 1922 |
| 1923 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 1923 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 1924 | 1924 |
| 1925 #ifdef DEBUG | 1925 #ifdef DEBUG |
| 1926 void set_closure(Handle<JSFunction> closure) { | 1926 void set_closure(Handle<JSFunction> closure) { |
| 1927 DCHECK(closure_.is_null()); | 1927 DCHECK(closure_.is_null()); |
| 1928 DCHECK(!closure.is_null()); | 1928 DCHECK(!closure.is_null()); |
| 1929 closure_ = closure; | 1929 closure_ = closure; |
| 1930 } | 1930 } |
| 1931 Handle<JSFunction> closure() const { return closure_; } | 1931 Handle<JSFunction> closure() const { return closure_; } |
| 1932 #endif | 1932 #endif |
| 1933 | 1933 |
| 1934 DECLARE_CONCRETE_INSTRUCTION(EnvironmentMarker); | 1934 DECLARE_CONCRETE_INSTRUCTION(EnvironmentMarker); |
| 1935 | 1935 |
| 1936 private: | 1936 private: |
| 1937 HEnvironmentMarker(Kind kind, int index) | 1937 HEnvironmentMarker(Kind kind, int index) |
| 1938 : kind_(kind), index_(index), next_simulate_(NULL) { } | 1938 : kind_(kind), index_(index), next_simulate_(NULL) { } |
| 1939 | 1939 |
| 1940 Kind kind_; | 1940 Kind kind_; |
| 1941 int index_; | 1941 int index_; |
| 1942 HSimulate* next_simulate_; | 1942 HSimulate* next_simulate_; |
| 1943 | 1943 |
| 1944 #ifdef DEBUG | 1944 #ifdef DEBUG |
| 1945 Handle<JSFunction> closure_; | 1945 Handle<JSFunction> closure_; |
| 1946 #endif | 1946 #endif |
| 1947 }; | 1947 }; |
| 1948 | 1948 |
| 1949 | 1949 |
| 1950 class HStackCheck V8_FINAL : public HTemplateInstruction<1> { | 1950 class HStackCheck FINAL : public HTemplateInstruction<1> { |
| 1951 public: | 1951 public: |
| 1952 enum Type { | 1952 enum Type { |
| 1953 kFunctionEntry, | 1953 kFunctionEntry, |
| 1954 kBackwardsBranch | 1954 kBackwardsBranch |
| 1955 }; | 1955 }; |
| 1956 | 1956 |
| 1957 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HStackCheck, Type); | 1957 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HStackCheck, Type); |
| 1958 | 1958 |
| 1959 HValue* context() { return OperandAt(0); } | 1959 HValue* context() { return OperandAt(0); } |
| 1960 | 1960 |
| 1961 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1961 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 1962 return Representation::Tagged(); | 1962 return Representation::Tagged(); |
| 1963 } | 1963 } |
| 1964 | 1964 |
| 1965 void Eliminate() { | 1965 void Eliminate() { |
| 1966 // The stack check eliminator might try to eliminate the same stack | 1966 // The stack check eliminator might try to eliminate the same stack |
| 1967 // check instruction multiple times. | 1967 // check instruction multiple times. |
| 1968 if (IsLinked()) { | 1968 if (IsLinked()) { |
| 1969 DeleteAndReplaceWith(NULL); | 1969 DeleteAndReplaceWith(NULL); |
| 1970 } | 1970 } |
| 1971 } | 1971 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1990 CONSTRUCT_CALL_RETURN, // Either use allocated receiver or return value. | 1990 CONSTRUCT_CALL_RETURN, // Either use allocated receiver or return value. |
| 1991 GETTER_CALL_RETURN, // Returning from a getter, need to restore context. | 1991 GETTER_CALL_RETURN, // Returning from a getter, need to restore context. |
| 1992 SETTER_CALL_RETURN // Use the RHS of the assignment as the return value. | 1992 SETTER_CALL_RETURN // Use the RHS of the assignment as the return value. |
| 1993 }; | 1993 }; |
| 1994 | 1994 |
| 1995 | 1995 |
| 1996 class HArgumentsObject; | 1996 class HArgumentsObject; |
| 1997 class HConstant; | 1997 class HConstant; |
| 1998 | 1998 |
| 1999 | 1999 |
| 2000 class HEnterInlined V8_FINAL : public HTemplateInstruction<0> { | 2000 class HEnterInlined FINAL : public HTemplateInstruction<0> { |
| 2001 public: | 2001 public: |
| 2002 static HEnterInlined* New(Zone* zone, HValue* context, BailoutId return_id, | 2002 static HEnterInlined* New(Zone* zone, HValue* context, BailoutId return_id, |
| 2003 Handle<JSFunction> closure, | 2003 Handle<JSFunction> closure, |
| 2004 HConstant* closure_context, int arguments_count, | 2004 HConstant* closure_context, int arguments_count, |
| 2005 FunctionLiteral* function, | 2005 FunctionLiteral* function, |
| 2006 InliningKind inlining_kind, Variable* arguments_var, | 2006 InliningKind inlining_kind, Variable* arguments_var, |
| 2007 HArgumentsObject* arguments_object) { | 2007 HArgumentsObject* arguments_object) { |
| 2008 return new (zone) HEnterInlined(return_id, closure, closure_context, | 2008 return new (zone) HEnterInlined(return_id, closure, closure_context, |
| 2009 arguments_count, function, inlining_kind, | 2009 arguments_count, function, inlining_kind, |
| 2010 arguments_var, arguments_object, zone); | 2010 arguments_var, arguments_object, zone); |
| 2011 } | 2011 } |
| 2012 | 2012 |
| 2013 void RegisterReturnTarget(HBasicBlock* return_target, Zone* zone); | 2013 void RegisterReturnTarget(HBasicBlock* return_target, Zone* zone); |
| 2014 ZoneList<HBasicBlock*>* return_targets() { return &return_targets_; } | 2014 ZoneList<HBasicBlock*>* return_targets() { return &return_targets_; } |
| 2015 | 2015 |
| 2016 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 2016 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 2017 | 2017 |
| 2018 Handle<JSFunction> closure() const { return closure_; } | 2018 Handle<JSFunction> closure() const { return closure_; } |
| 2019 HConstant* closure_context() const { return closure_context_; } | 2019 HConstant* closure_context() const { return closure_context_; } |
| 2020 int arguments_count() const { return arguments_count_; } | 2020 int arguments_count() const { return arguments_count_; } |
| 2021 bool arguments_pushed() const { return arguments_pushed_; } | 2021 bool arguments_pushed() const { return arguments_pushed_; } |
| 2022 void set_arguments_pushed() { arguments_pushed_ = true; } | 2022 void set_arguments_pushed() { arguments_pushed_ = true; } |
| 2023 FunctionLiteral* function() const { return function_; } | 2023 FunctionLiteral* function() const { return function_; } |
| 2024 InliningKind inlining_kind() const { return inlining_kind_; } | 2024 InliningKind inlining_kind() const { return inlining_kind_; } |
| 2025 BailoutId ReturnId() const { return return_id_; } | 2025 BailoutId ReturnId() const { return return_id_; } |
| 2026 | 2026 |
| 2027 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2027 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2028 return Representation::None(); | 2028 return Representation::None(); |
| 2029 } | 2029 } |
| 2030 | 2030 |
| 2031 Variable* arguments_var() { return arguments_var_; } | 2031 Variable* arguments_var() { return arguments_var_; } |
| 2032 HArgumentsObject* arguments_object() { return arguments_object_; } | 2032 HArgumentsObject* arguments_object() { return arguments_object_; } |
| 2033 | 2033 |
| 2034 DECLARE_CONCRETE_INSTRUCTION(EnterInlined) | 2034 DECLARE_CONCRETE_INSTRUCTION(EnterInlined) |
| 2035 | 2035 |
| 2036 private: | 2036 private: |
| 2037 HEnterInlined(BailoutId return_id, Handle<JSFunction> closure, | 2037 HEnterInlined(BailoutId return_id, Handle<JSFunction> closure, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2056 int arguments_count_; | 2056 int arguments_count_; |
| 2057 bool arguments_pushed_; | 2057 bool arguments_pushed_; |
| 2058 FunctionLiteral* function_; | 2058 FunctionLiteral* function_; |
| 2059 InliningKind inlining_kind_; | 2059 InliningKind inlining_kind_; |
| 2060 Variable* arguments_var_; | 2060 Variable* arguments_var_; |
| 2061 HArgumentsObject* arguments_object_; | 2061 HArgumentsObject* arguments_object_; |
| 2062 ZoneList<HBasicBlock*> return_targets_; | 2062 ZoneList<HBasicBlock*> return_targets_; |
| 2063 }; | 2063 }; |
| 2064 | 2064 |
| 2065 | 2065 |
| 2066 class HLeaveInlined V8_FINAL : public HTemplateInstruction<0> { | 2066 class HLeaveInlined FINAL : public HTemplateInstruction<0> { |
| 2067 public: | 2067 public: |
| 2068 HLeaveInlined(HEnterInlined* entry, | 2068 HLeaveInlined(HEnterInlined* entry, |
| 2069 int drop_count) | 2069 int drop_count) |
| 2070 : entry_(entry), | 2070 : entry_(entry), |
| 2071 drop_count_(drop_count) { } | 2071 drop_count_(drop_count) { } |
| 2072 | 2072 |
| 2073 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2073 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2074 return Representation::None(); | 2074 return Representation::None(); |
| 2075 } | 2075 } |
| 2076 | 2076 |
| 2077 virtual int argument_delta() const V8_OVERRIDE { | 2077 virtual int argument_delta() const OVERRIDE { |
| 2078 return entry_->arguments_pushed() ? -drop_count_ : 0; | 2078 return entry_->arguments_pushed() ? -drop_count_ : 0; |
| 2079 } | 2079 } |
| 2080 | 2080 |
| 2081 DECLARE_CONCRETE_INSTRUCTION(LeaveInlined) | 2081 DECLARE_CONCRETE_INSTRUCTION(LeaveInlined) |
| 2082 | 2082 |
| 2083 private: | 2083 private: |
| 2084 HEnterInlined* entry_; | 2084 HEnterInlined* entry_; |
| 2085 int drop_count_; | 2085 int drop_count_; |
| 2086 }; | 2086 }; |
| 2087 | 2087 |
| 2088 | 2088 |
| 2089 class HPushArguments V8_FINAL : public HInstruction { | 2089 class HPushArguments FINAL : public HInstruction { |
| 2090 public: | 2090 public: |
| 2091 static HPushArguments* New(Zone* zone, HValue* context) { | 2091 static HPushArguments* New(Zone* zone, HValue* context) { |
| 2092 return new(zone) HPushArguments(zone); | 2092 return new(zone) HPushArguments(zone); |
| 2093 } | 2093 } |
| 2094 static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1) { | 2094 static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1) { |
| 2095 HPushArguments* instr = new(zone) HPushArguments(zone); | 2095 HPushArguments* instr = new(zone) HPushArguments(zone); |
| 2096 instr->AddInput(arg1); | 2096 instr->AddInput(arg1); |
| 2097 return instr; | 2097 return instr; |
| 2098 } | 2098 } |
| 2099 static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1, | 2099 static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2114 static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1, | 2114 static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1, |
| 2115 HValue* arg2, HValue* arg3, HValue* arg4) { | 2115 HValue* arg2, HValue* arg3, HValue* arg4) { |
| 2116 HPushArguments* instr = new(zone) HPushArguments(zone); | 2116 HPushArguments* instr = new(zone) HPushArguments(zone); |
| 2117 instr->AddInput(arg1); | 2117 instr->AddInput(arg1); |
| 2118 instr->AddInput(arg2); | 2118 instr->AddInput(arg2); |
| 2119 instr->AddInput(arg3); | 2119 instr->AddInput(arg3); |
| 2120 instr->AddInput(arg4); | 2120 instr->AddInput(arg4); |
| 2121 return instr; | 2121 return instr; |
| 2122 } | 2122 } |
| 2123 | 2123 |
| 2124 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2124 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2125 return Representation::Tagged(); | 2125 return Representation::Tagged(); |
| 2126 } | 2126 } |
| 2127 | 2127 |
| 2128 virtual int argument_delta() const V8_OVERRIDE { return inputs_.length(); } | 2128 virtual int argument_delta() const OVERRIDE { return inputs_.length(); } |
| 2129 HValue* argument(int i) { return OperandAt(i); } | 2129 HValue* argument(int i) { return OperandAt(i); } |
| 2130 | 2130 |
| 2131 virtual int OperandCount() const V8_FINAL V8_OVERRIDE { | 2131 virtual int OperandCount() const FINAL OVERRIDE { |
| 2132 return inputs_.length(); | 2132 return inputs_.length(); |
| 2133 } | 2133 } |
| 2134 virtual HValue* OperandAt(int i) const V8_FINAL V8_OVERRIDE { | 2134 virtual HValue* OperandAt(int i) const FINAL OVERRIDE { |
| 2135 return inputs_[i]; | 2135 return inputs_[i]; |
| 2136 } | 2136 } |
| 2137 | 2137 |
| 2138 void AddInput(HValue* value); | 2138 void AddInput(HValue* value); |
| 2139 | 2139 |
| 2140 DECLARE_CONCRETE_INSTRUCTION(PushArguments) | 2140 DECLARE_CONCRETE_INSTRUCTION(PushArguments) |
| 2141 | 2141 |
| 2142 protected: | 2142 protected: |
| 2143 virtual void InternalSetOperandAt(int i, HValue* value) V8_FINAL V8_OVERRIDE { | 2143 virtual void InternalSetOperandAt(int i, HValue* value) FINAL OVERRIDE { |
| 2144 inputs_[i] = value; | 2144 inputs_[i] = value; |
| 2145 } | 2145 } |
| 2146 | 2146 |
| 2147 private: | 2147 private: |
| 2148 explicit HPushArguments(Zone* zone) | 2148 explicit HPushArguments(Zone* zone) |
| 2149 : HInstruction(HType::Tagged()), inputs_(4, zone) { | 2149 : HInstruction(HType::Tagged()), inputs_(4, zone) { |
| 2150 set_representation(Representation::Tagged()); | 2150 set_representation(Representation::Tagged()); |
| 2151 } | 2151 } |
| 2152 | 2152 |
| 2153 ZoneList<HValue*> inputs_; | 2153 ZoneList<HValue*> inputs_; |
| 2154 }; | 2154 }; |
| 2155 | 2155 |
| 2156 | 2156 |
| 2157 class HThisFunction V8_FINAL : public HTemplateInstruction<0> { | 2157 class HThisFunction FINAL : public HTemplateInstruction<0> { |
| 2158 public: | 2158 public: |
| 2159 DECLARE_INSTRUCTION_FACTORY_P0(HThisFunction); | 2159 DECLARE_INSTRUCTION_FACTORY_P0(HThisFunction); |
| 2160 | 2160 |
| 2161 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2161 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2162 return Representation::None(); | 2162 return Representation::None(); |
| 2163 } | 2163 } |
| 2164 | 2164 |
| 2165 DECLARE_CONCRETE_INSTRUCTION(ThisFunction) | 2165 DECLARE_CONCRETE_INSTRUCTION(ThisFunction) |
| 2166 | 2166 |
| 2167 protected: | 2167 protected: |
| 2168 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 2168 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 2169 | 2169 |
| 2170 private: | 2170 private: |
| 2171 HThisFunction() { | 2171 HThisFunction() { |
| 2172 set_representation(Representation::Tagged()); | 2172 set_representation(Representation::Tagged()); |
| 2173 SetFlag(kUseGVN); | 2173 SetFlag(kUseGVN); |
| 2174 } | 2174 } |
| 2175 | 2175 |
| 2176 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 2176 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 2177 }; | 2177 }; |
| 2178 | 2178 |
| 2179 | 2179 |
| 2180 class HDeclareGlobals V8_FINAL : public HUnaryOperation { | 2180 class HDeclareGlobals FINAL : public HUnaryOperation { |
| 2181 public: | 2181 public: |
| 2182 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HDeclareGlobals, | 2182 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HDeclareGlobals, |
| 2183 Handle<FixedArray>, | 2183 Handle<FixedArray>, |
| 2184 int); | 2184 int); |
| 2185 | 2185 |
| 2186 HValue* context() { return OperandAt(0); } | 2186 HValue* context() { return OperandAt(0); } |
| 2187 Handle<FixedArray> pairs() const { return pairs_; } | 2187 Handle<FixedArray> pairs() const { return pairs_; } |
| 2188 int flags() const { return flags_; } | 2188 int flags() const { return flags_; } |
| 2189 | 2189 |
| 2190 DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals) | 2190 DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals) |
| 2191 | 2191 |
| 2192 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2192 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2193 return Representation::Tagged(); | 2193 return Representation::Tagged(); |
| 2194 } | 2194 } |
| 2195 | 2195 |
| 2196 private: | 2196 private: |
| 2197 HDeclareGlobals(HValue* context, | 2197 HDeclareGlobals(HValue* context, |
| 2198 Handle<FixedArray> pairs, | 2198 Handle<FixedArray> pairs, |
| 2199 int flags) | 2199 int flags) |
| 2200 : HUnaryOperation(context), | 2200 : HUnaryOperation(context), |
| 2201 pairs_(pairs), | 2201 pairs_(pairs), |
| 2202 flags_(flags) { | 2202 flags_(flags) { |
| 2203 set_representation(Representation::Tagged()); | 2203 set_representation(Representation::Tagged()); |
| 2204 SetAllSideEffects(); | 2204 SetAllSideEffects(); |
| 2205 } | 2205 } |
| 2206 | 2206 |
| 2207 Handle<FixedArray> pairs_; | 2207 Handle<FixedArray> pairs_; |
| 2208 int flags_; | 2208 int flags_; |
| 2209 }; | 2209 }; |
| 2210 | 2210 |
| 2211 | 2211 |
| 2212 template <int V> | 2212 template <int V> |
| 2213 class HCall : public HTemplateInstruction<V> { | 2213 class HCall : public HTemplateInstruction<V> { |
| 2214 public: | 2214 public: |
| 2215 // The argument count includes the receiver. | 2215 // The argument count includes the receiver. |
| 2216 explicit HCall<V>(int argument_count) : argument_count_(argument_count) { | 2216 explicit HCall<V>(int argument_count) : argument_count_(argument_count) { |
| 2217 this->set_representation(Representation::Tagged()); | 2217 this->set_representation(Representation::Tagged()); |
| 2218 this->SetAllSideEffects(); | 2218 this->SetAllSideEffects(); |
| 2219 } | 2219 } |
| 2220 | 2220 |
| 2221 virtual HType CalculateInferredType() V8_FINAL V8_OVERRIDE { | 2221 virtual HType CalculateInferredType() FINAL OVERRIDE { |
| 2222 return HType::Tagged(); | 2222 return HType::Tagged(); |
| 2223 } | 2223 } |
| 2224 | 2224 |
| 2225 virtual int argument_count() const { | 2225 virtual int argument_count() const { |
| 2226 return argument_count_; | 2226 return argument_count_; |
| 2227 } | 2227 } |
| 2228 | 2228 |
| 2229 virtual int argument_delta() const V8_OVERRIDE { | 2229 virtual int argument_delta() const OVERRIDE { |
| 2230 return -argument_count(); | 2230 return -argument_count(); |
| 2231 } | 2231 } |
| 2232 | 2232 |
| 2233 private: | 2233 private: |
| 2234 int argument_count_; | 2234 int argument_count_; |
| 2235 }; | 2235 }; |
| 2236 | 2236 |
| 2237 | 2237 |
| 2238 class HUnaryCall : public HCall<1> { | 2238 class HUnaryCall : public HCall<1> { |
| 2239 public: | 2239 public: |
| 2240 HUnaryCall(HValue* value, int argument_count) | 2240 HUnaryCall(HValue* value, int argument_count) |
| 2241 : HCall<1>(argument_count) { | 2241 : HCall<1>(argument_count) { |
| 2242 SetOperandAt(0, value); | 2242 SetOperandAt(0, value); |
| 2243 } | 2243 } |
| 2244 | 2244 |
| 2245 virtual Representation RequiredInputRepresentation( | 2245 virtual Representation RequiredInputRepresentation( |
| 2246 int index) V8_FINAL V8_OVERRIDE { | 2246 int index) FINAL OVERRIDE { |
| 2247 return Representation::Tagged(); | 2247 return Representation::Tagged(); |
| 2248 } | 2248 } |
| 2249 | 2249 |
| 2250 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 2250 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 2251 | 2251 |
| 2252 HValue* value() const { return OperandAt(0); } | 2252 HValue* value() const { return OperandAt(0); } |
| 2253 }; | 2253 }; |
| 2254 | 2254 |
| 2255 | 2255 |
| 2256 class HBinaryCall : public HCall<2> { | 2256 class HBinaryCall : public HCall<2> { |
| 2257 public: | 2257 public: |
| 2258 HBinaryCall(HValue* first, HValue* second, int argument_count) | 2258 HBinaryCall(HValue* first, HValue* second, int argument_count) |
| 2259 : HCall<2>(argument_count) { | 2259 : HCall<2>(argument_count) { |
| 2260 SetOperandAt(0, first); | 2260 SetOperandAt(0, first); |
| 2261 SetOperandAt(1, second); | 2261 SetOperandAt(1, second); |
| 2262 } | 2262 } |
| 2263 | 2263 |
| 2264 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 2264 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 2265 | 2265 |
| 2266 virtual Representation RequiredInputRepresentation( | 2266 virtual Representation RequiredInputRepresentation( |
| 2267 int index) V8_FINAL V8_OVERRIDE { | 2267 int index) FINAL OVERRIDE { |
| 2268 return Representation::Tagged(); | 2268 return Representation::Tagged(); |
| 2269 } | 2269 } |
| 2270 | 2270 |
| 2271 HValue* first() const { return OperandAt(0); } | 2271 HValue* first() const { return OperandAt(0); } |
| 2272 HValue* second() const { return OperandAt(1); } | 2272 HValue* second() const { return OperandAt(1); } |
| 2273 }; | 2273 }; |
| 2274 | 2274 |
| 2275 | 2275 |
| 2276 class HCallJSFunction V8_FINAL : public HCall<1> { | 2276 class HCallJSFunction FINAL : public HCall<1> { |
| 2277 public: | 2277 public: |
| 2278 static HCallJSFunction* New(Zone* zone, | 2278 static HCallJSFunction* New(Zone* zone, |
| 2279 HValue* context, | 2279 HValue* context, |
| 2280 HValue* function, | 2280 HValue* function, |
| 2281 int argument_count, | 2281 int argument_count, |
| 2282 bool pass_argument_count); | 2282 bool pass_argument_count); |
| 2283 | 2283 |
| 2284 HValue* function() const { return OperandAt(0); } | 2284 HValue* function() const { return OperandAt(0); } |
| 2285 | 2285 |
| 2286 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 2286 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 2287 | 2287 |
| 2288 virtual Representation RequiredInputRepresentation( | 2288 virtual Representation RequiredInputRepresentation( |
| 2289 int index) V8_FINAL V8_OVERRIDE { | 2289 int index) FINAL OVERRIDE { |
| 2290 DCHECK(index == 0); | 2290 DCHECK(index == 0); |
| 2291 return Representation::Tagged(); | 2291 return Representation::Tagged(); |
| 2292 } | 2292 } |
| 2293 | 2293 |
| 2294 bool pass_argument_count() const { return pass_argument_count_; } | 2294 bool pass_argument_count() const { return pass_argument_count_; } |
| 2295 | 2295 |
| 2296 virtual bool HasStackCheck() V8_FINAL V8_OVERRIDE { | 2296 virtual bool HasStackCheck() FINAL OVERRIDE { |
| 2297 return has_stack_check_; | 2297 return has_stack_check_; |
| 2298 } | 2298 } |
| 2299 | 2299 |
| 2300 DECLARE_CONCRETE_INSTRUCTION(CallJSFunction) | 2300 DECLARE_CONCRETE_INSTRUCTION(CallJSFunction) |
| 2301 | 2301 |
| 2302 private: | 2302 private: |
| 2303 // The argument count includes the receiver. | 2303 // The argument count includes the receiver. |
| 2304 HCallJSFunction(HValue* function, | 2304 HCallJSFunction(HValue* function, |
| 2305 int argument_count, | 2305 int argument_count, |
| 2306 bool pass_argument_count, | 2306 bool pass_argument_count, |
| 2307 bool has_stack_check) | 2307 bool has_stack_check) |
| 2308 : HCall<1>(argument_count), | 2308 : HCall<1>(argument_count), |
| 2309 pass_argument_count_(pass_argument_count), | 2309 pass_argument_count_(pass_argument_count), |
| 2310 has_stack_check_(has_stack_check) { | 2310 has_stack_check_(has_stack_check) { |
| 2311 SetOperandAt(0, function); | 2311 SetOperandAt(0, function); |
| 2312 } | 2312 } |
| 2313 | 2313 |
| 2314 bool pass_argument_count_; | 2314 bool pass_argument_count_; |
| 2315 bool has_stack_check_; | 2315 bool has_stack_check_; |
| 2316 }; | 2316 }; |
| 2317 | 2317 |
| 2318 | 2318 |
| 2319 class HCallWithDescriptor V8_FINAL : public HInstruction { | 2319 class HCallWithDescriptor FINAL : public HInstruction { |
| 2320 public: | 2320 public: |
| 2321 static HCallWithDescriptor* New(Zone* zone, HValue* context, HValue* target, | 2321 static HCallWithDescriptor* New(Zone* zone, HValue* context, HValue* target, |
| 2322 int argument_count, | 2322 int argument_count, |
| 2323 const CallInterfaceDescriptor* descriptor, | 2323 const CallInterfaceDescriptor* descriptor, |
| 2324 const Vector<HValue*>& operands) { | 2324 const Vector<HValue*>& operands) { |
| 2325 DCHECK(operands.length() == descriptor->GetEnvironmentLength()); | 2325 DCHECK(operands.length() == descriptor->GetEnvironmentLength()); |
| 2326 HCallWithDescriptor* res = | 2326 HCallWithDescriptor* res = |
| 2327 new(zone) HCallWithDescriptor(target, argument_count, | 2327 new(zone) HCallWithDescriptor(target, argument_count, |
| 2328 descriptor, operands, zone); | 2328 descriptor, operands, zone); |
| 2329 return res; | 2329 return res; |
| 2330 } | 2330 } |
| 2331 | 2331 |
| 2332 virtual int OperandCount() const V8_FINAL V8_OVERRIDE { | 2332 virtual int OperandCount() const FINAL OVERRIDE { |
| 2333 return values_.length(); | 2333 return values_.length(); |
| 2334 } | 2334 } |
| 2335 virtual HValue* OperandAt(int index) const V8_FINAL V8_OVERRIDE { | 2335 virtual HValue* OperandAt(int index) const FINAL OVERRIDE { |
| 2336 return values_[index]; | 2336 return values_[index]; |
| 2337 } | 2337 } |
| 2338 | 2338 |
| 2339 virtual Representation RequiredInputRepresentation( | 2339 virtual Representation RequiredInputRepresentation( |
| 2340 int index) V8_FINAL V8_OVERRIDE { | 2340 int index) FINAL OVERRIDE { |
| 2341 if (index == 0) { | 2341 if (index == 0) { |
| 2342 return Representation::Tagged(); | 2342 return Representation::Tagged(); |
| 2343 } else { | 2343 } else { |
| 2344 int par_index = index - 1; | 2344 int par_index = index - 1; |
| 2345 DCHECK(par_index < descriptor_->GetEnvironmentLength()); | 2345 DCHECK(par_index < descriptor_->GetEnvironmentLength()); |
| 2346 return descriptor_->GetParameterRepresentation(par_index); | 2346 return descriptor_->GetParameterRepresentation(par_index); |
| 2347 } | 2347 } |
| 2348 } | 2348 } |
| 2349 | 2349 |
| 2350 DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor) | 2350 DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor) |
| 2351 | 2351 |
| 2352 virtual HType CalculateInferredType() V8_FINAL V8_OVERRIDE { | 2352 virtual HType CalculateInferredType() FINAL OVERRIDE { |
| 2353 return HType::Tagged(); | 2353 return HType::Tagged(); |
| 2354 } | 2354 } |
| 2355 | 2355 |
| 2356 virtual int argument_count() const { | 2356 virtual int argument_count() const { |
| 2357 return argument_count_; | 2357 return argument_count_; |
| 2358 } | 2358 } |
| 2359 | 2359 |
| 2360 virtual int argument_delta() const V8_OVERRIDE { | 2360 virtual int argument_delta() const OVERRIDE { |
| 2361 return -argument_count_; | 2361 return -argument_count_; |
| 2362 } | 2362 } |
| 2363 | 2363 |
| 2364 const CallInterfaceDescriptor* descriptor() const { return descriptor_; } | 2364 const CallInterfaceDescriptor* descriptor() const { return descriptor_; } |
| 2365 | 2365 |
| 2366 HValue* target() { | 2366 HValue* target() { |
| 2367 return OperandAt(0); | 2367 return OperandAt(0); |
| 2368 } | 2368 } |
| 2369 | 2369 |
| 2370 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 2370 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 2371 | 2371 |
| 2372 private: | 2372 private: |
| 2373 // The argument count includes the receiver. | 2373 // The argument count includes the receiver. |
| 2374 HCallWithDescriptor(HValue* target, int argument_count, | 2374 HCallWithDescriptor(HValue* target, int argument_count, |
| 2375 const CallInterfaceDescriptor* descriptor, | 2375 const CallInterfaceDescriptor* descriptor, |
| 2376 const Vector<HValue*>& operands, Zone* zone) | 2376 const Vector<HValue*>& operands, Zone* zone) |
| 2377 : descriptor_(descriptor), | 2377 : descriptor_(descriptor), |
| 2378 values_(descriptor->GetEnvironmentLength() + 1, zone) { | 2378 values_(descriptor->GetEnvironmentLength() + 1, zone) { |
| 2379 argument_count_ = argument_count; | 2379 argument_count_ = argument_count; |
| 2380 AddOperand(target, zone); | 2380 AddOperand(target, zone); |
| 2381 for (int i = 0; i < operands.length(); i++) { | 2381 for (int i = 0; i < operands.length(); i++) { |
| 2382 AddOperand(operands[i], zone); | 2382 AddOperand(operands[i], zone); |
| 2383 } | 2383 } |
| 2384 this->set_representation(Representation::Tagged()); | 2384 this->set_representation(Representation::Tagged()); |
| 2385 this->SetAllSideEffects(); | 2385 this->SetAllSideEffects(); |
| 2386 } | 2386 } |
| 2387 | 2387 |
| 2388 void AddOperand(HValue* v, Zone* zone) { | 2388 void AddOperand(HValue* v, Zone* zone) { |
| 2389 values_.Add(NULL, zone); | 2389 values_.Add(NULL, zone); |
| 2390 SetOperandAt(values_.length() - 1, v); | 2390 SetOperandAt(values_.length() - 1, v); |
| 2391 } | 2391 } |
| 2392 | 2392 |
| 2393 void InternalSetOperandAt(int index, | 2393 void InternalSetOperandAt(int index, |
| 2394 HValue* value) V8_FINAL V8_OVERRIDE { | 2394 HValue* value) FINAL OVERRIDE { |
| 2395 values_[index] = value; | 2395 values_[index] = value; |
| 2396 } | 2396 } |
| 2397 | 2397 |
| 2398 const CallInterfaceDescriptor* descriptor_; | 2398 const CallInterfaceDescriptor* descriptor_; |
| 2399 ZoneList<HValue*> values_; | 2399 ZoneList<HValue*> values_; |
| 2400 int argument_count_; | 2400 int argument_count_; |
| 2401 }; | 2401 }; |
| 2402 | 2402 |
| 2403 | 2403 |
| 2404 class HInvokeFunction V8_FINAL : public HBinaryCall { | 2404 class HInvokeFunction FINAL : public HBinaryCall { |
| 2405 public: | 2405 public: |
| 2406 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInvokeFunction, HValue*, int); | 2406 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInvokeFunction, HValue*, int); |
| 2407 | 2407 |
| 2408 HInvokeFunction(HValue* context, | 2408 HInvokeFunction(HValue* context, |
| 2409 HValue* function, | 2409 HValue* function, |
| 2410 Handle<JSFunction> known_function, | 2410 Handle<JSFunction> known_function, |
| 2411 int argument_count) | 2411 int argument_count) |
| 2412 : HBinaryCall(context, function, argument_count), | 2412 : HBinaryCall(context, function, argument_count), |
| 2413 known_function_(known_function) { | 2413 known_function_(known_function) { |
| 2414 formal_parameter_count_ = known_function.is_null() | 2414 formal_parameter_count_ = known_function.is_null() |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2425 int argument_count) { | 2425 int argument_count) { |
| 2426 return new(zone) HInvokeFunction(context, function, | 2426 return new(zone) HInvokeFunction(context, function, |
| 2427 known_function, argument_count); | 2427 known_function, argument_count); |
| 2428 } | 2428 } |
| 2429 | 2429 |
| 2430 HValue* context() { return first(); } | 2430 HValue* context() { return first(); } |
| 2431 HValue* function() { return second(); } | 2431 HValue* function() { return second(); } |
| 2432 Handle<JSFunction> known_function() { return known_function_; } | 2432 Handle<JSFunction> known_function() { return known_function_; } |
| 2433 int formal_parameter_count() const { return formal_parameter_count_; } | 2433 int formal_parameter_count() const { return formal_parameter_count_; } |
| 2434 | 2434 |
| 2435 virtual bool HasStackCheck() V8_FINAL V8_OVERRIDE { | 2435 virtual bool HasStackCheck() FINAL OVERRIDE { |
| 2436 return has_stack_check_; | 2436 return has_stack_check_; |
| 2437 } | 2437 } |
| 2438 | 2438 |
| 2439 DECLARE_CONCRETE_INSTRUCTION(InvokeFunction) | 2439 DECLARE_CONCRETE_INSTRUCTION(InvokeFunction) |
| 2440 | 2440 |
| 2441 private: | 2441 private: |
| 2442 HInvokeFunction(HValue* context, HValue* function, int argument_count) | 2442 HInvokeFunction(HValue* context, HValue* function, int argument_count) |
| 2443 : HBinaryCall(context, function, argument_count), | 2443 : HBinaryCall(context, function, argument_count), |
| 2444 has_stack_check_(false) { | 2444 has_stack_check_(false) { |
| 2445 } | 2445 } |
| 2446 | 2446 |
| 2447 Handle<JSFunction> known_function_; | 2447 Handle<JSFunction> known_function_; |
| 2448 int formal_parameter_count_; | 2448 int formal_parameter_count_; |
| 2449 bool has_stack_check_; | 2449 bool has_stack_check_; |
| 2450 }; | 2450 }; |
| 2451 | 2451 |
| 2452 | 2452 |
| 2453 class HCallFunction V8_FINAL : public HBinaryCall { | 2453 class HCallFunction FINAL : public HBinaryCall { |
| 2454 public: | 2454 public: |
| 2455 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallFunction, HValue*, int); | 2455 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallFunction, HValue*, int); |
| 2456 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3( | 2456 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3( |
| 2457 HCallFunction, HValue*, int, CallFunctionFlags); | 2457 HCallFunction, HValue*, int, CallFunctionFlags); |
| 2458 | 2458 |
| 2459 HValue* context() { return first(); } | 2459 HValue* context() { return first(); } |
| 2460 HValue* function() { return second(); } | 2460 HValue* function() { return second(); } |
| 2461 CallFunctionFlags function_flags() const { return function_flags_; } | 2461 CallFunctionFlags function_flags() const { return function_flags_; } |
| 2462 | 2462 |
| 2463 DECLARE_CONCRETE_INSTRUCTION(CallFunction) | 2463 DECLARE_CONCRETE_INSTRUCTION(CallFunction) |
| 2464 | 2464 |
| 2465 virtual int argument_delta() const V8_OVERRIDE { return -argument_count(); } | 2465 virtual int argument_delta() const OVERRIDE { return -argument_count(); } |
| 2466 | 2466 |
| 2467 private: | 2467 private: |
| 2468 HCallFunction(HValue* context, | 2468 HCallFunction(HValue* context, |
| 2469 HValue* function, | 2469 HValue* function, |
| 2470 int argument_count, | 2470 int argument_count, |
| 2471 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS) | 2471 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS) |
| 2472 : HBinaryCall(context, function, argument_count), function_flags_(flags) { | 2472 : HBinaryCall(context, function, argument_count), function_flags_(flags) { |
| 2473 } | 2473 } |
| 2474 CallFunctionFlags function_flags_; | 2474 CallFunctionFlags function_flags_; |
| 2475 }; | 2475 }; |
| 2476 | 2476 |
| 2477 | 2477 |
| 2478 class HCallNew V8_FINAL : public HBinaryCall { | 2478 class HCallNew FINAL : public HBinaryCall { |
| 2479 public: | 2479 public: |
| 2480 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallNew, HValue*, int); | 2480 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallNew, HValue*, int); |
| 2481 | 2481 |
| 2482 HValue* context() { return first(); } | 2482 HValue* context() { return first(); } |
| 2483 HValue* constructor() { return second(); } | 2483 HValue* constructor() { return second(); } |
| 2484 | 2484 |
| 2485 DECLARE_CONCRETE_INSTRUCTION(CallNew) | 2485 DECLARE_CONCRETE_INSTRUCTION(CallNew) |
| 2486 | 2486 |
| 2487 private: | 2487 private: |
| 2488 HCallNew(HValue* context, HValue* constructor, int argument_count) | 2488 HCallNew(HValue* context, HValue* constructor, int argument_count) |
| 2489 : HBinaryCall(context, constructor, argument_count) {} | 2489 : HBinaryCall(context, constructor, argument_count) {} |
| 2490 }; | 2490 }; |
| 2491 | 2491 |
| 2492 | 2492 |
| 2493 class HCallNewArray V8_FINAL : public HBinaryCall { | 2493 class HCallNewArray FINAL : public HBinaryCall { |
| 2494 public: | 2494 public: |
| 2495 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCallNewArray, | 2495 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCallNewArray, |
| 2496 HValue*, | 2496 HValue*, |
| 2497 int, | 2497 int, |
| 2498 ElementsKind); | 2498 ElementsKind); |
| 2499 | 2499 |
| 2500 HValue* context() { return first(); } | 2500 HValue* context() { return first(); } |
| 2501 HValue* constructor() { return second(); } | 2501 HValue* constructor() { return second(); } |
| 2502 | 2502 |
| 2503 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 2503 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 2504 | 2504 |
| 2505 ElementsKind elements_kind() const { return elements_kind_; } | 2505 ElementsKind elements_kind() const { return elements_kind_; } |
| 2506 | 2506 |
| 2507 DECLARE_CONCRETE_INSTRUCTION(CallNewArray) | 2507 DECLARE_CONCRETE_INSTRUCTION(CallNewArray) |
| 2508 | 2508 |
| 2509 private: | 2509 private: |
| 2510 HCallNewArray(HValue* context, HValue* constructor, int argument_count, | 2510 HCallNewArray(HValue* context, HValue* constructor, int argument_count, |
| 2511 ElementsKind elements_kind) | 2511 ElementsKind elements_kind) |
| 2512 : HBinaryCall(context, constructor, argument_count), | 2512 : HBinaryCall(context, constructor, argument_count), |
| 2513 elements_kind_(elements_kind) {} | 2513 elements_kind_(elements_kind) {} |
| 2514 | 2514 |
| 2515 ElementsKind elements_kind_; | 2515 ElementsKind elements_kind_; |
| 2516 }; | 2516 }; |
| 2517 | 2517 |
| 2518 | 2518 |
| 2519 class HCallRuntime V8_FINAL : public HCall<1> { | 2519 class HCallRuntime FINAL : public HCall<1> { |
| 2520 public: | 2520 public: |
| 2521 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCallRuntime, | 2521 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCallRuntime, |
| 2522 Handle<String>, | 2522 Handle<String>, |
| 2523 const Runtime::Function*, | 2523 const Runtime::Function*, |
| 2524 int); | 2524 int); |
| 2525 | 2525 |
| 2526 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 2526 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 2527 | 2527 |
| 2528 HValue* context() { return OperandAt(0); } | 2528 HValue* context() { return OperandAt(0); } |
| 2529 const Runtime::Function* function() const { return c_function_; } | 2529 const Runtime::Function* function() const { return c_function_; } |
| 2530 Handle<String> name() const { return name_; } | 2530 Handle<String> name() const { return name_; } |
| 2531 SaveFPRegsMode save_doubles() const { return save_doubles_; } | 2531 SaveFPRegsMode save_doubles() const { return save_doubles_; } |
| 2532 void set_save_doubles(SaveFPRegsMode save_doubles) { | 2532 void set_save_doubles(SaveFPRegsMode save_doubles) { |
| 2533 save_doubles_ = save_doubles; | 2533 save_doubles_ = save_doubles; |
| 2534 } | 2534 } |
| 2535 | 2535 |
| 2536 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2536 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2537 return Representation::Tagged(); | 2537 return Representation::Tagged(); |
| 2538 } | 2538 } |
| 2539 | 2539 |
| 2540 DECLARE_CONCRETE_INSTRUCTION(CallRuntime) | 2540 DECLARE_CONCRETE_INSTRUCTION(CallRuntime) |
| 2541 | 2541 |
| 2542 private: | 2542 private: |
| 2543 HCallRuntime(HValue* context, | 2543 HCallRuntime(HValue* context, |
| 2544 Handle<String> name, | 2544 Handle<String> name, |
| 2545 const Runtime::Function* c_function, | 2545 const Runtime::Function* c_function, |
| 2546 int argument_count) | 2546 int argument_count) |
| 2547 : HCall<1>(argument_count), c_function_(c_function), name_(name), | 2547 : HCall<1>(argument_count), c_function_(c_function), name_(name), |
| 2548 save_doubles_(kDontSaveFPRegs) { | 2548 save_doubles_(kDontSaveFPRegs) { |
| 2549 SetOperandAt(0, context); | 2549 SetOperandAt(0, context); |
| 2550 } | 2550 } |
| 2551 | 2551 |
| 2552 const Runtime::Function* c_function_; | 2552 const Runtime::Function* c_function_; |
| 2553 Handle<String> name_; | 2553 Handle<String> name_; |
| 2554 SaveFPRegsMode save_doubles_; | 2554 SaveFPRegsMode save_doubles_; |
| 2555 }; | 2555 }; |
| 2556 | 2556 |
| 2557 | 2557 |
| 2558 class HMapEnumLength V8_FINAL : public HUnaryOperation { | 2558 class HMapEnumLength FINAL : public HUnaryOperation { |
| 2559 public: | 2559 public: |
| 2560 DECLARE_INSTRUCTION_FACTORY_P1(HMapEnumLength, HValue*); | 2560 DECLARE_INSTRUCTION_FACTORY_P1(HMapEnumLength, HValue*); |
| 2561 | 2561 |
| 2562 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2562 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2563 return Representation::Tagged(); | 2563 return Representation::Tagged(); |
| 2564 } | 2564 } |
| 2565 | 2565 |
| 2566 DECLARE_CONCRETE_INSTRUCTION(MapEnumLength) | 2566 DECLARE_CONCRETE_INSTRUCTION(MapEnumLength) |
| 2567 | 2567 |
| 2568 protected: | 2568 protected: |
| 2569 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 2569 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 2570 | 2570 |
| 2571 private: | 2571 private: |
| 2572 explicit HMapEnumLength(HValue* value) | 2572 explicit HMapEnumLength(HValue* value) |
| 2573 : HUnaryOperation(value, HType::Smi()) { | 2573 : HUnaryOperation(value, HType::Smi()) { |
| 2574 set_representation(Representation::Smi()); | 2574 set_representation(Representation::Smi()); |
| 2575 SetFlag(kUseGVN); | 2575 SetFlag(kUseGVN); |
| 2576 SetDependsOnFlag(kMaps); | 2576 SetDependsOnFlag(kMaps); |
| 2577 } | 2577 } |
| 2578 | 2578 |
| 2579 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 2579 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 2580 }; | 2580 }; |
| 2581 | 2581 |
| 2582 | 2582 |
| 2583 class HUnaryMathOperation V8_FINAL : public HTemplateInstruction<2> { | 2583 class HUnaryMathOperation FINAL : public HTemplateInstruction<2> { |
| 2584 public: | 2584 public: |
| 2585 static HInstruction* New(Zone* zone, | 2585 static HInstruction* New(Zone* zone, |
| 2586 HValue* context, | 2586 HValue* context, |
| 2587 HValue* value, | 2587 HValue* value, |
| 2588 BuiltinFunctionId op); | 2588 BuiltinFunctionId op); |
| 2589 | 2589 |
| 2590 HValue* context() const { return OperandAt(0); } | 2590 HValue* context() const { return OperandAt(0); } |
| 2591 HValue* value() const { return OperandAt(1); } | 2591 HValue* value() const { return OperandAt(1); } |
| 2592 | 2592 |
| 2593 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 2593 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 2594 | 2594 |
| 2595 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2595 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2596 if (index == 0) { | 2596 if (index == 0) { |
| 2597 return Representation::Tagged(); | 2597 return Representation::Tagged(); |
| 2598 } else { | 2598 } else { |
| 2599 switch (op_) { | 2599 switch (op_) { |
| 2600 case kMathFloor: | 2600 case kMathFloor: |
| 2601 case kMathRound: | 2601 case kMathRound: |
| 2602 case kMathFround: | 2602 case kMathFround: |
| 2603 case kMathSqrt: | 2603 case kMathSqrt: |
| 2604 case kMathPowHalf: | 2604 case kMathPowHalf: |
| 2605 case kMathLog: | 2605 case kMathLog: |
| 2606 case kMathExp: | 2606 case kMathExp: |
| 2607 return Representation::Double(); | 2607 return Representation::Double(); |
| 2608 case kMathAbs: | 2608 case kMathAbs: |
| 2609 return representation(); | 2609 return representation(); |
| 2610 case kMathClz32: | 2610 case kMathClz32: |
| 2611 return Representation::Integer32(); | 2611 return Representation::Integer32(); |
| 2612 default: | 2612 default: |
| 2613 UNREACHABLE(); | 2613 UNREACHABLE(); |
| 2614 return Representation::None(); | 2614 return Representation::None(); |
| 2615 } | 2615 } |
| 2616 } | 2616 } |
| 2617 } | 2617 } |
| 2618 | 2618 |
| 2619 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 2619 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 2620 | 2620 |
| 2621 virtual HValue* Canonicalize() V8_OVERRIDE; | 2621 virtual HValue* Canonicalize() OVERRIDE; |
| 2622 virtual Representation RepresentationFromUses() V8_OVERRIDE; | 2622 virtual Representation RepresentationFromUses() OVERRIDE; |
| 2623 virtual Representation RepresentationFromInputs() V8_OVERRIDE; | 2623 virtual Representation RepresentationFromInputs() OVERRIDE; |
| 2624 | 2624 |
| 2625 BuiltinFunctionId op() const { return op_; } | 2625 BuiltinFunctionId op() const { return op_; } |
| 2626 const char* OpName() const; | 2626 const char* OpName() const; |
| 2627 | 2627 |
| 2628 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation) | 2628 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation) |
| 2629 | 2629 |
| 2630 protected: | 2630 protected: |
| 2631 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 2631 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 2632 HUnaryMathOperation* b = HUnaryMathOperation::cast(other); | 2632 HUnaryMathOperation* b = HUnaryMathOperation::cast(other); |
| 2633 return op_ == b->op(); | 2633 return op_ == b->op(); |
| 2634 } | 2634 } |
| 2635 | 2635 |
| 2636 private: | 2636 private: |
| 2637 // Indicates if we support a double (and int32) output for Math.floor and | 2637 // Indicates if we support a double (and int32) output for Math.floor and |
| 2638 // Math.round. | 2638 // Math.round. |
| 2639 bool SupportsFlexibleFloorAndRound() const { | 2639 bool SupportsFlexibleFloorAndRound() const { |
| 2640 #ifdef V8_TARGET_ARCH_ARM64 | 2640 #ifdef V8_TARGET_ARCH_ARM64 |
| 2641 return true; | 2641 return true; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2673 case kMathPowHalf: | 2673 case kMathPowHalf: |
| 2674 set_representation(Representation::Double()); | 2674 set_representation(Representation::Double()); |
| 2675 break; | 2675 break; |
| 2676 default: | 2676 default: |
| 2677 UNREACHABLE(); | 2677 UNREACHABLE(); |
| 2678 } | 2678 } |
| 2679 SetFlag(kUseGVN); | 2679 SetFlag(kUseGVN); |
| 2680 SetFlag(kAllowUndefinedAsNaN); | 2680 SetFlag(kAllowUndefinedAsNaN); |
| 2681 } | 2681 } |
| 2682 | 2682 |
| 2683 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 2683 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 2684 | 2684 |
| 2685 HValue* SimplifiedDividendForMathFloorOfDiv(HDiv* hdiv); | 2685 HValue* SimplifiedDividendForMathFloorOfDiv(HDiv* hdiv); |
| 2686 HValue* SimplifiedDivisorForMathFloorOfDiv(HDiv* hdiv); | 2686 HValue* SimplifiedDivisorForMathFloorOfDiv(HDiv* hdiv); |
| 2687 | 2687 |
| 2688 BuiltinFunctionId op_; | 2688 BuiltinFunctionId op_; |
| 2689 }; | 2689 }; |
| 2690 | 2690 |
| 2691 | 2691 |
| 2692 class HLoadRoot V8_FINAL : public HTemplateInstruction<0> { | 2692 class HLoadRoot FINAL : public HTemplateInstruction<0> { |
| 2693 public: | 2693 public: |
| 2694 DECLARE_INSTRUCTION_FACTORY_P1(HLoadRoot, Heap::RootListIndex); | 2694 DECLARE_INSTRUCTION_FACTORY_P1(HLoadRoot, Heap::RootListIndex); |
| 2695 DECLARE_INSTRUCTION_FACTORY_P2(HLoadRoot, Heap::RootListIndex, HType); | 2695 DECLARE_INSTRUCTION_FACTORY_P2(HLoadRoot, Heap::RootListIndex, HType); |
| 2696 | 2696 |
| 2697 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2697 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2698 return Representation::None(); | 2698 return Representation::None(); |
| 2699 } | 2699 } |
| 2700 | 2700 |
| 2701 Heap::RootListIndex index() const { return index_; } | 2701 Heap::RootListIndex index() const { return index_; } |
| 2702 | 2702 |
| 2703 DECLARE_CONCRETE_INSTRUCTION(LoadRoot) | 2703 DECLARE_CONCRETE_INSTRUCTION(LoadRoot) |
| 2704 | 2704 |
| 2705 protected: | 2705 protected: |
| 2706 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 2706 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 2707 HLoadRoot* b = HLoadRoot::cast(other); | 2707 HLoadRoot* b = HLoadRoot::cast(other); |
| 2708 return index_ == b->index_; | 2708 return index_ == b->index_; |
| 2709 } | 2709 } |
| 2710 | 2710 |
| 2711 private: | 2711 private: |
| 2712 explicit HLoadRoot(Heap::RootListIndex index, HType type = HType::Tagged()) | 2712 explicit HLoadRoot(Heap::RootListIndex index, HType type = HType::Tagged()) |
| 2713 : HTemplateInstruction<0>(type), index_(index) { | 2713 : HTemplateInstruction<0>(type), index_(index) { |
| 2714 SetFlag(kUseGVN); | 2714 SetFlag(kUseGVN); |
| 2715 // TODO(bmeurer): We'll need kDependsOnRoots once we add the | 2715 // TODO(bmeurer): We'll need kDependsOnRoots once we add the |
| 2716 // corresponding HStoreRoot instruction. | 2716 // corresponding HStoreRoot instruction. |
| 2717 SetDependsOnFlag(kCalls); | 2717 SetDependsOnFlag(kCalls); |
| 2718 } | 2718 } |
| 2719 | 2719 |
| 2720 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 2720 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 2721 | 2721 |
| 2722 const Heap::RootListIndex index_; | 2722 const Heap::RootListIndex index_; |
| 2723 }; | 2723 }; |
| 2724 | 2724 |
| 2725 | 2725 |
| 2726 class HCheckMaps V8_FINAL : public HTemplateInstruction<2> { | 2726 class HCheckMaps FINAL : public HTemplateInstruction<2> { |
| 2727 public: | 2727 public: |
| 2728 static HCheckMaps* New(Zone* zone, HValue* context, HValue* value, | 2728 static HCheckMaps* New(Zone* zone, HValue* context, HValue* value, |
| 2729 Handle<Map> map, HValue* typecheck = NULL) { | 2729 Handle<Map> map, HValue* typecheck = NULL) { |
| 2730 return new(zone) HCheckMaps(value, new(zone) UniqueSet<Map>( | 2730 return new(zone) HCheckMaps(value, new(zone) UniqueSet<Map>( |
| 2731 Unique<Map>::CreateImmovable(map), zone), typecheck); | 2731 Unique<Map>::CreateImmovable(map), zone), typecheck); |
| 2732 } | 2732 } |
| 2733 static HCheckMaps* New(Zone* zone, HValue* context, | 2733 static HCheckMaps* New(Zone* zone, HValue* context, |
| 2734 HValue* value, SmallMapList* map_list, | 2734 HValue* value, SmallMapList* map_list, |
| 2735 HValue* typecheck = NULL) { | 2735 HValue* typecheck = NULL) { |
| 2736 UniqueSet<Map>* maps = new(zone) UniqueSet<Map>(map_list->length(), zone); | 2736 UniqueSet<Map>* maps = new(zone) UniqueSet<Map>(map_list->length(), zone); |
| 2737 for (int i = 0; i < map_list->length(); ++i) { | 2737 for (int i = 0; i < map_list->length(); ++i) { |
| 2738 maps->Add(Unique<Map>::CreateImmovable(map_list->at(i)), zone); | 2738 maps->Add(Unique<Map>::CreateImmovable(map_list->at(i)), zone); |
| 2739 } | 2739 } |
| 2740 return new(zone) HCheckMaps(value, maps, typecheck); | 2740 return new(zone) HCheckMaps(value, maps, typecheck); |
| 2741 } | 2741 } |
| 2742 | 2742 |
| 2743 bool IsStabilityCheck() const { return is_stability_check_; } | 2743 bool IsStabilityCheck() const { return is_stability_check_; } |
| 2744 void MarkAsStabilityCheck() { | 2744 void MarkAsStabilityCheck() { |
| 2745 maps_are_stable_ = true; | 2745 maps_are_stable_ = true; |
| 2746 has_migration_target_ = false; | 2746 has_migration_target_ = false; |
| 2747 is_stability_check_ = true; | 2747 is_stability_check_ = true; |
| 2748 ClearChangesFlag(kNewSpacePromotion); | 2748 ClearChangesFlag(kNewSpacePromotion); |
| 2749 ClearDependsOnFlag(kElementsKind); | 2749 ClearDependsOnFlag(kElementsKind); |
| 2750 ClearDependsOnFlag(kMaps); | 2750 ClearDependsOnFlag(kMaps); |
| 2751 } | 2751 } |
| 2752 | 2752 |
| 2753 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } | 2753 virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; } |
| 2754 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2754 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2755 return Representation::Tagged(); | 2755 return Representation::Tagged(); |
| 2756 } | 2756 } |
| 2757 | 2757 |
| 2758 virtual HType CalculateInferredType() V8_OVERRIDE { | 2758 virtual HType CalculateInferredType() OVERRIDE { |
| 2759 if (value()->type().IsHeapObject()) return value()->type(); | 2759 if (value()->type().IsHeapObject()) return value()->type(); |
| 2760 return HType::HeapObject(); | 2760 return HType::HeapObject(); |
| 2761 } | 2761 } |
| 2762 | 2762 |
| 2763 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 2763 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 2764 | 2764 |
| 2765 HValue* value() const { return OperandAt(0); } | 2765 HValue* value() const { return OperandAt(0); } |
| 2766 HValue* typecheck() const { return OperandAt(1); } | 2766 HValue* typecheck() const { return OperandAt(1); } |
| 2767 | 2767 |
| 2768 const UniqueSet<Map>* maps() const { return maps_; } | 2768 const UniqueSet<Map>* maps() const { return maps_; } |
| 2769 void set_maps(const UniqueSet<Map>* maps) { maps_ = maps; } | 2769 void set_maps(const UniqueSet<Map>* maps) { maps_ = maps; } |
| 2770 | 2770 |
| 2771 bool maps_are_stable() const { return maps_are_stable_; } | 2771 bool maps_are_stable() const { return maps_are_stable_; } |
| 2772 | 2772 |
| 2773 bool HasMigrationTarget() const { return has_migration_target_; } | 2773 bool HasMigrationTarget() const { return has_migration_target_; } |
| 2774 | 2774 |
| 2775 virtual HValue* Canonicalize() V8_OVERRIDE; | 2775 virtual HValue* Canonicalize() OVERRIDE; |
| 2776 | 2776 |
| 2777 static HCheckMaps* CreateAndInsertAfter(Zone* zone, | 2777 static HCheckMaps* CreateAndInsertAfter(Zone* zone, |
| 2778 HValue* value, | 2778 HValue* value, |
| 2779 Unique<Map> map, | 2779 Unique<Map> map, |
| 2780 bool map_is_stable, | 2780 bool map_is_stable, |
| 2781 HInstruction* instr) { | 2781 HInstruction* instr) { |
| 2782 return instr->Append(new(zone) HCheckMaps( | 2782 return instr->Append(new(zone) HCheckMaps( |
| 2783 value, new(zone) UniqueSet<Map>(map, zone), map_is_stable)); | 2783 value, new(zone) UniqueSet<Map>(map, zone), map_is_stable)); |
| 2784 } | 2784 } |
| 2785 | 2785 |
| 2786 static HCheckMaps* CreateAndInsertBefore(Zone* zone, | 2786 static HCheckMaps* CreateAndInsertBefore(Zone* zone, |
| 2787 HValue* value, | 2787 HValue* value, |
| 2788 const UniqueSet<Map>* maps, | 2788 const UniqueSet<Map>* maps, |
| 2789 bool maps_are_stable, | 2789 bool maps_are_stable, |
| 2790 HInstruction* instr) { | 2790 HInstruction* instr) { |
| 2791 return instr->Prepend(new(zone) HCheckMaps(value, maps, maps_are_stable)); | 2791 return instr->Prepend(new(zone) HCheckMaps(value, maps, maps_are_stable)); |
| 2792 } | 2792 } |
| 2793 | 2793 |
| 2794 DECLARE_CONCRETE_INSTRUCTION(CheckMaps) | 2794 DECLARE_CONCRETE_INSTRUCTION(CheckMaps) |
| 2795 | 2795 |
| 2796 protected: | 2796 protected: |
| 2797 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 2797 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 2798 return this->maps()->Equals(HCheckMaps::cast(other)->maps()); | 2798 return this->maps()->Equals(HCheckMaps::cast(other)->maps()); |
| 2799 } | 2799 } |
| 2800 | 2800 |
| 2801 virtual int RedefinedOperandIndex() { return 0; } | 2801 virtual int RedefinedOperandIndex() { return 0; } |
| 2802 | 2802 |
| 2803 private: | 2803 private: |
| 2804 HCheckMaps(HValue* value, const UniqueSet<Map>* maps, bool maps_are_stable) | 2804 HCheckMaps(HValue* value, const UniqueSet<Map>* maps, bool maps_are_stable) |
| 2805 : HTemplateInstruction<2>(HType::HeapObject()), maps_(maps), | 2805 : HTemplateInstruction<2>(HType::HeapObject()), maps_(maps), |
| 2806 has_migration_target_(false), is_stability_check_(false), | 2806 has_migration_target_(false), is_stability_check_(false), |
| 2807 maps_are_stable_(maps_are_stable) { | 2807 maps_are_stable_(maps_are_stable) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2835 if (has_migration_target_) SetChangesFlag(kNewSpacePromotion); | 2835 if (has_migration_target_) SetChangesFlag(kNewSpacePromotion); |
| 2836 } | 2836 } |
| 2837 | 2837 |
| 2838 const UniqueSet<Map>* maps_; | 2838 const UniqueSet<Map>* maps_; |
| 2839 bool has_migration_target_ : 1; | 2839 bool has_migration_target_ : 1; |
| 2840 bool is_stability_check_ : 1; | 2840 bool is_stability_check_ : 1; |
| 2841 bool maps_are_stable_ : 1; | 2841 bool maps_are_stable_ : 1; |
| 2842 }; | 2842 }; |
| 2843 | 2843 |
| 2844 | 2844 |
| 2845 class HCheckValue V8_FINAL : public HUnaryOperation { | 2845 class HCheckValue FINAL : public HUnaryOperation { |
| 2846 public: | 2846 public: |
| 2847 static HCheckValue* New(Zone* zone, HValue* context, | 2847 static HCheckValue* New(Zone* zone, HValue* context, |
| 2848 HValue* value, Handle<JSFunction> func) { | 2848 HValue* value, Handle<JSFunction> func) { |
| 2849 bool in_new_space = zone->isolate()->heap()->InNewSpace(*func); | 2849 bool in_new_space = zone->isolate()->heap()->InNewSpace(*func); |
| 2850 // NOTE: We create an uninitialized Unique and initialize it later. | 2850 // NOTE: We create an uninitialized Unique and initialize it later. |
| 2851 // This is because a JSFunction can move due to GC during graph creation. | 2851 // This is because a JSFunction can move due to GC during graph creation. |
| 2852 // TODO(titzer): This is a migration crutch. Replace with some kind of | 2852 // TODO(titzer): This is a migration crutch. Replace with some kind of |
| 2853 // Uniqueness scope later. | 2853 // Uniqueness scope later. |
| 2854 Unique<JSFunction> target = Unique<JSFunction>::CreateUninitialized(func); | 2854 Unique<JSFunction> target = Unique<JSFunction>::CreateUninitialized(func); |
| 2855 HCheckValue* check = new(zone) HCheckValue(value, target, in_new_space); | 2855 HCheckValue* check = new(zone) HCheckValue(value, target, in_new_space); |
| 2856 return check; | 2856 return check; |
| 2857 } | 2857 } |
| 2858 static HCheckValue* New(Zone* zone, HValue* context, | 2858 static HCheckValue* New(Zone* zone, HValue* context, |
| 2859 HValue* value, Unique<HeapObject> target, | 2859 HValue* value, Unique<HeapObject> target, |
| 2860 bool object_in_new_space) { | 2860 bool object_in_new_space) { |
| 2861 return new(zone) HCheckValue(value, target, object_in_new_space); | 2861 return new(zone) HCheckValue(value, target, object_in_new_space); |
| 2862 } | 2862 } |
| 2863 | 2863 |
| 2864 virtual void FinalizeUniqueness() V8_OVERRIDE { | 2864 virtual void FinalizeUniqueness() OVERRIDE { |
| 2865 object_ = Unique<HeapObject>(object_.handle()); | 2865 object_ = Unique<HeapObject>(object_.handle()); |
| 2866 } | 2866 } |
| 2867 | 2867 |
| 2868 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2868 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2869 return Representation::Tagged(); | 2869 return Representation::Tagged(); |
| 2870 } | 2870 } |
| 2871 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 2871 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 2872 | 2872 |
| 2873 virtual HValue* Canonicalize() V8_OVERRIDE; | 2873 virtual HValue* Canonicalize() OVERRIDE; |
| 2874 | 2874 |
| 2875 #ifdef DEBUG | 2875 #ifdef DEBUG |
| 2876 virtual void Verify() V8_OVERRIDE; | 2876 virtual void Verify() OVERRIDE; |
| 2877 #endif | 2877 #endif |
| 2878 | 2878 |
| 2879 Unique<HeapObject> object() const { return object_; } | 2879 Unique<HeapObject> object() const { return object_; } |
| 2880 bool object_in_new_space() const { return object_in_new_space_; } | 2880 bool object_in_new_space() const { return object_in_new_space_; } |
| 2881 | 2881 |
| 2882 DECLARE_CONCRETE_INSTRUCTION(CheckValue) | 2882 DECLARE_CONCRETE_INSTRUCTION(CheckValue) |
| 2883 | 2883 |
| 2884 protected: | 2884 protected: |
| 2885 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 2885 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 2886 HCheckValue* b = HCheckValue::cast(other); | 2886 HCheckValue* b = HCheckValue::cast(other); |
| 2887 return object_ == b->object_; | 2887 return object_ == b->object_; |
| 2888 } | 2888 } |
| 2889 | 2889 |
| 2890 private: | 2890 private: |
| 2891 HCheckValue(HValue* value, Unique<HeapObject> object, | 2891 HCheckValue(HValue* value, Unique<HeapObject> object, |
| 2892 bool object_in_new_space) | 2892 bool object_in_new_space) |
| 2893 : HUnaryOperation(value, value->type()), | 2893 : HUnaryOperation(value, value->type()), |
| 2894 object_(object), | 2894 object_(object), |
| 2895 object_in_new_space_(object_in_new_space) { | 2895 object_in_new_space_(object_in_new_space) { |
| 2896 set_representation(Representation::Tagged()); | 2896 set_representation(Representation::Tagged()); |
| 2897 SetFlag(kUseGVN); | 2897 SetFlag(kUseGVN); |
| 2898 } | 2898 } |
| 2899 | 2899 |
| 2900 Unique<HeapObject> object_; | 2900 Unique<HeapObject> object_; |
| 2901 bool object_in_new_space_; | 2901 bool object_in_new_space_; |
| 2902 }; | 2902 }; |
| 2903 | 2903 |
| 2904 | 2904 |
| 2905 class HCheckInstanceType V8_FINAL : public HUnaryOperation { | 2905 class HCheckInstanceType FINAL : public HUnaryOperation { |
| 2906 public: | 2906 public: |
| 2907 enum Check { | 2907 enum Check { |
| 2908 IS_SPEC_OBJECT, | 2908 IS_SPEC_OBJECT, |
| 2909 IS_JS_ARRAY, | 2909 IS_JS_ARRAY, |
| 2910 IS_STRING, | 2910 IS_STRING, |
| 2911 IS_INTERNALIZED_STRING, | 2911 IS_INTERNALIZED_STRING, |
| 2912 LAST_INTERVAL_CHECK = IS_JS_ARRAY | 2912 LAST_INTERVAL_CHECK = IS_JS_ARRAY |
| 2913 }; | 2913 }; |
| 2914 | 2914 |
| 2915 DECLARE_INSTRUCTION_FACTORY_P2(HCheckInstanceType, HValue*, Check); | 2915 DECLARE_INSTRUCTION_FACTORY_P2(HCheckInstanceType, HValue*, Check); |
| 2916 | 2916 |
| 2917 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 2917 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 2918 | 2918 |
| 2919 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2919 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2920 return Representation::Tagged(); | 2920 return Representation::Tagged(); |
| 2921 } | 2921 } |
| 2922 | 2922 |
| 2923 virtual HType CalculateInferredType() V8_OVERRIDE { | 2923 virtual HType CalculateInferredType() OVERRIDE { |
| 2924 switch (check_) { | 2924 switch (check_) { |
| 2925 case IS_SPEC_OBJECT: return HType::JSObject(); | 2925 case IS_SPEC_OBJECT: return HType::JSObject(); |
| 2926 case IS_JS_ARRAY: return HType::JSArray(); | 2926 case IS_JS_ARRAY: return HType::JSArray(); |
| 2927 case IS_STRING: return HType::String(); | 2927 case IS_STRING: return HType::String(); |
| 2928 case IS_INTERNALIZED_STRING: return HType::String(); | 2928 case IS_INTERNALIZED_STRING: return HType::String(); |
| 2929 } | 2929 } |
| 2930 UNREACHABLE(); | 2930 UNREACHABLE(); |
| 2931 return HType::Tagged(); | 2931 return HType::Tagged(); |
| 2932 } | 2932 } |
| 2933 | 2933 |
| 2934 virtual HValue* Canonicalize() V8_OVERRIDE; | 2934 virtual HValue* Canonicalize() OVERRIDE; |
| 2935 | 2935 |
| 2936 bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; } | 2936 bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; } |
| 2937 void GetCheckInterval(InstanceType* first, InstanceType* last); | 2937 void GetCheckInterval(InstanceType* first, InstanceType* last); |
| 2938 void GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag); | 2938 void GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag); |
| 2939 | 2939 |
| 2940 Check check() const { return check_; } | 2940 Check check() const { return check_; } |
| 2941 | 2941 |
| 2942 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType) | 2942 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType) |
| 2943 | 2943 |
| 2944 protected: | 2944 protected: |
| 2945 // TODO(ager): It could be nice to allow the ommision of instance | 2945 // TODO(ager): It could be nice to allow the ommision of instance |
| 2946 // type checks if we have already performed an instance type check | 2946 // type checks if we have already performed an instance type check |
| 2947 // with a larger range. | 2947 // with a larger range. |
| 2948 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 2948 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 2949 HCheckInstanceType* b = HCheckInstanceType::cast(other); | 2949 HCheckInstanceType* b = HCheckInstanceType::cast(other); |
| 2950 return check_ == b->check_; | 2950 return check_ == b->check_; |
| 2951 } | 2951 } |
| 2952 | 2952 |
| 2953 virtual int RedefinedOperandIndex() { return 0; } | 2953 virtual int RedefinedOperandIndex() { return 0; } |
| 2954 | 2954 |
| 2955 private: | 2955 private: |
| 2956 const char* GetCheckName() const; | 2956 const char* GetCheckName() const; |
| 2957 | 2957 |
| 2958 HCheckInstanceType(HValue* value, Check check) | 2958 HCheckInstanceType(HValue* value, Check check) |
| 2959 : HUnaryOperation(value, HType::HeapObject()), check_(check) { | 2959 : HUnaryOperation(value, HType::HeapObject()), check_(check) { |
| 2960 set_representation(Representation::Tagged()); | 2960 set_representation(Representation::Tagged()); |
| 2961 SetFlag(kUseGVN); | 2961 SetFlag(kUseGVN); |
| 2962 } | 2962 } |
| 2963 | 2963 |
| 2964 const Check check_; | 2964 const Check check_; |
| 2965 }; | 2965 }; |
| 2966 | 2966 |
| 2967 | 2967 |
| 2968 class HCheckSmi V8_FINAL : public HUnaryOperation { | 2968 class HCheckSmi FINAL : public HUnaryOperation { |
| 2969 public: | 2969 public: |
| 2970 DECLARE_INSTRUCTION_FACTORY_P1(HCheckSmi, HValue*); | 2970 DECLARE_INSTRUCTION_FACTORY_P1(HCheckSmi, HValue*); |
| 2971 | 2971 |
| 2972 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2972 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 2973 return Representation::Tagged(); | 2973 return Representation::Tagged(); |
| 2974 } | 2974 } |
| 2975 | 2975 |
| 2976 virtual HValue* Canonicalize() V8_OVERRIDE { | 2976 virtual HValue* Canonicalize() OVERRIDE { |
| 2977 HType value_type = value()->type(); | 2977 HType value_type = value()->type(); |
| 2978 if (value_type.IsSmi()) { | 2978 if (value_type.IsSmi()) { |
| 2979 return NULL; | 2979 return NULL; |
| 2980 } | 2980 } |
| 2981 return this; | 2981 return this; |
| 2982 } | 2982 } |
| 2983 | 2983 |
| 2984 DECLARE_CONCRETE_INSTRUCTION(CheckSmi) | 2984 DECLARE_CONCRETE_INSTRUCTION(CheckSmi) |
| 2985 | 2985 |
| 2986 protected: | 2986 protected: |
| 2987 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 2987 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 2988 | 2988 |
| 2989 private: | 2989 private: |
| 2990 explicit HCheckSmi(HValue* value) : HUnaryOperation(value, HType::Smi()) { | 2990 explicit HCheckSmi(HValue* value) : HUnaryOperation(value, HType::Smi()) { |
| 2991 set_representation(Representation::Smi()); | 2991 set_representation(Representation::Smi()); |
| 2992 SetFlag(kUseGVN); | 2992 SetFlag(kUseGVN); |
| 2993 } | 2993 } |
| 2994 }; | 2994 }; |
| 2995 | 2995 |
| 2996 | 2996 |
| 2997 class HCheckHeapObject V8_FINAL : public HUnaryOperation { | 2997 class HCheckHeapObject FINAL : public HUnaryOperation { |
| 2998 public: | 2998 public: |
| 2999 DECLARE_INSTRUCTION_FACTORY_P1(HCheckHeapObject, HValue*); | 2999 DECLARE_INSTRUCTION_FACTORY_P1(HCheckHeapObject, HValue*); |
| 3000 | 3000 |
| 3001 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } | 3001 virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; } |
| 3002 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3002 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 3003 return Representation::Tagged(); | 3003 return Representation::Tagged(); |
| 3004 } | 3004 } |
| 3005 | 3005 |
| 3006 virtual HType CalculateInferredType() V8_OVERRIDE { | 3006 virtual HType CalculateInferredType() OVERRIDE { |
| 3007 if (value()->type().IsHeapObject()) return value()->type(); | 3007 if (value()->type().IsHeapObject()) return value()->type(); |
| 3008 return HType::HeapObject(); | 3008 return HType::HeapObject(); |
| 3009 } | 3009 } |
| 3010 | 3010 |
| 3011 #ifdef DEBUG | 3011 #ifdef DEBUG |
| 3012 virtual void Verify() V8_OVERRIDE; | 3012 virtual void Verify() OVERRIDE; |
| 3013 #endif | 3013 #endif |
| 3014 | 3014 |
| 3015 virtual HValue* Canonicalize() V8_OVERRIDE { | 3015 virtual HValue* Canonicalize() OVERRIDE { |
| 3016 return value()->type().IsHeapObject() ? NULL : this; | 3016 return value()->type().IsHeapObject() ? NULL : this; |
| 3017 } | 3017 } |
| 3018 | 3018 |
| 3019 DECLARE_CONCRETE_INSTRUCTION(CheckHeapObject) | 3019 DECLARE_CONCRETE_INSTRUCTION(CheckHeapObject) |
| 3020 | 3020 |
| 3021 protected: | 3021 protected: |
| 3022 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 3022 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 3023 | 3023 |
| 3024 private: | 3024 private: |
| 3025 explicit HCheckHeapObject(HValue* value) : HUnaryOperation(value) { | 3025 explicit HCheckHeapObject(HValue* value) : HUnaryOperation(value) { |
| 3026 set_representation(Representation::Tagged()); | 3026 set_representation(Representation::Tagged()); |
| 3027 SetFlag(kUseGVN); | 3027 SetFlag(kUseGVN); |
| 3028 } | 3028 } |
| 3029 }; | 3029 }; |
| 3030 | 3030 |
| 3031 | 3031 |
| 3032 class InductionVariableData; | 3032 class InductionVariableData; |
| 3033 | 3033 |
| 3034 | 3034 |
| 3035 struct InductionVariableLimitUpdate { | 3035 struct InductionVariableLimitUpdate { |
| 3036 InductionVariableData* updated_variable; | 3036 InductionVariableData* updated_variable; |
| 3037 HValue* limit; | 3037 HValue* limit; |
| 3038 bool limit_is_upper; | 3038 bool limit_is_upper; |
| 3039 bool limit_is_included; | 3039 bool limit_is_included; |
| 3040 | 3040 |
| 3041 InductionVariableLimitUpdate() | 3041 InductionVariableLimitUpdate() |
| 3042 : updated_variable(NULL), limit(NULL), | 3042 : updated_variable(NULL), limit(NULL), |
| 3043 limit_is_upper(false), limit_is_included(false) {} | 3043 limit_is_upper(false), limit_is_included(false) {} |
| 3044 }; | 3044 }; |
| 3045 | 3045 |
| 3046 | 3046 |
| 3047 class HBoundsCheck; | 3047 class HBoundsCheck; |
| 3048 class HPhi; | 3048 class HPhi; |
| 3049 class HBitwise; | 3049 class HBitwise; |
| 3050 | 3050 |
| 3051 | 3051 |
| 3052 class InductionVariableData V8_FINAL : public ZoneObject { | 3052 class InductionVariableData FINAL : public ZoneObject { |
| 3053 public: | 3053 public: |
| 3054 class InductionVariableCheck : public ZoneObject { | 3054 class InductionVariableCheck : public ZoneObject { |
| 3055 public: | 3055 public: |
| 3056 HBoundsCheck* check() { return check_; } | 3056 HBoundsCheck* check() { return check_; } |
| 3057 InductionVariableCheck* next() { return next_; } | 3057 InductionVariableCheck* next() { return next_; } |
| 3058 bool HasUpperLimit() { return upper_limit_ >= 0; } | 3058 bool HasUpperLimit() { return upper_limit_ >= 0; } |
| 3059 int32_t upper_limit() { | 3059 int32_t upper_limit() { |
| 3060 DCHECK(HasUpperLimit()); | 3060 DCHECK(HasUpperLimit()); |
| 3061 return upper_limit_; | 3061 return upper_limit_; |
| 3062 } | 3062 } |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3242 HBasicBlock* induction_exit_block_; | 3242 HBasicBlock* induction_exit_block_; |
| 3243 HBasicBlock* induction_exit_target_; | 3243 HBasicBlock* induction_exit_target_; |
| 3244 ChecksRelatedToLength* checks_; | 3244 ChecksRelatedToLength* checks_; |
| 3245 HValue* additional_upper_limit_; | 3245 HValue* additional_upper_limit_; |
| 3246 bool additional_upper_limit_is_included_; | 3246 bool additional_upper_limit_is_included_; |
| 3247 HValue* additional_lower_limit_; | 3247 HValue* additional_lower_limit_; |
| 3248 bool additional_lower_limit_is_included_; | 3248 bool additional_lower_limit_is_included_; |
| 3249 }; | 3249 }; |
| 3250 | 3250 |
| 3251 | 3251 |
| 3252 class HPhi V8_FINAL : public HValue { | 3252 class HPhi FINAL : public HValue { |
| 3253 public: | 3253 public: |
| 3254 HPhi(int merged_index, Zone* zone) | 3254 HPhi(int merged_index, Zone* zone) |
| 3255 : inputs_(2, zone), | 3255 : inputs_(2, zone), |
| 3256 merged_index_(merged_index), | 3256 merged_index_(merged_index), |
| 3257 phi_id_(-1), | 3257 phi_id_(-1), |
| 3258 induction_variable_data_(NULL) { | 3258 induction_variable_data_(NULL) { |
| 3259 for (int i = 0; i < Representation::kNumRepresentations; i++) { | 3259 for (int i = 0; i < Representation::kNumRepresentations; i++) { |
| 3260 non_phi_uses_[i] = 0; | 3260 non_phi_uses_[i] = 0; |
| 3261 indirect_uses_[i] = 0; | 3261 indirect_uses_[i] = 0; |
| 3262 } | 3262 } |
| 3263 DCHECK(merged_index >= 0 || merged_index == kInvalidMergedIndex); | 3263 DCHECK(merged_index >= 0 || merged_index == kInvalidMergedIndex); |
| 3264 SetFlag(kFlexibleRepresentation); | 3264 SetFlag(kFlexibleRepresentation); |
| 3265 SetFlag(kAllowUndefinedAsNaN); | 3265 SetFlag(kAllowUndefinedAsNaN); |
| 3266 } | 3266 } |
| 3267 | 3267 |
| 3268 virtual Representation RepresentationFromInputs() V8_OVERRIDE; | 3268 virtual Representation RepresentationFromInputs() OVERRIDE; |
| 3269 | 3269 |
| 3270 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 3270 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 3271 virtual void InferRepresentation( | 3271 virtual void InferRepresentation( |
| 3272 HInferRepresentationPhase* h_infer) V8_OVERRIDE; | 3272 HInferRepresentationPhase* h_infer) OVERRIDE; |
| 3273 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3273 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 3274 return representation(); | 3274 return representation(); |
| 3275 } | 3275 } |
| 3276 virtual Representation KnownOptimalRepresentation() V8_OVERRIDE { | 3276 virtual Representation KnownOptimalRepresentation() OVERRIDE { |
| 3277 return representation(); | 3277 return representation(); |
| 3278 } | 3278 } |
| 3279 virtual HType CalculateInferredType() V8_OVERRIDE; | 3279 virtual HType CalculateInferredType() OVERRIDE; |
| 3280 virtual int OperandCount() const V8_OVERRIDE { return inputs_.length(); } | 3280 virtual int OperandCount() const OVERRIDE { return inputs_.length(); } |
| 3281 virtual HValue* OperandAt(int index) const V8_OVERRIDE { | 3281 virtual HValue* OperandAt(int index) const OVERRIDE { |
| 3282 return inputs_[index]; | 3282 return inputs_[index]; |
| 3283 } | 3283 } |
| 3284 HValue* GetRedundantReplacement(); | 3284 HValue* GetRedundantReplacement(); |
| 3285 void AddInput(HValue* value); | 3285 void AddInput(HValue* value); |
| 3286 bool HasRealUses(); | 3286 bool HasRealUses(); |
| 3287 | 3287 |
| 3288 bool IsReceiver() const { return merged_index_ == 0; } | 3288 bool IsReceiver() const { return merged_index_ == 0; } |
| 3289 bool HasMergedIndex() const { return merged_index_ != kInvalidMergedIndex; } | 3289 bool HasMergedIndex() const { return merged_index_ != kInvalidMergedIndex; } |
| 3290 | 3290 |
| 3291 virtual HSourcePosition position() const V8_OVERRIDE; | 3291 virtual HSourcePosition position() const OVERRIDE; |
| 3292 | 3292 |
| 3293 int merged_index() const { return merged_index_; } | 3293 int merged_index() const { return merged_index_; } |
| 3294 | 3294 |
| 3295 InductionVariableData* induction_variable_data() { | 3295 InductionVariableData* induction_variable_data() { |
| 3296 return induction_variable_data_; | 3296 return induction_variable_data_; |
| 3297 } | 3297 } |
| 3298 bool IsInductionVariable() { | 3298 bool IsInductionVariable() { |
| 3299 return induction_variable_data_ != NULL; | 3299 return induction_variable_data_ != NULL; |
| 3300 } | 3300 } |
| 3301 bool IsLimitedInductionVariable() { | 3301 bool IsLimitedInductionVariable() { |
| 3302 return IsInductionVariable() && | 3302 return IsInductionVariable() && |
| 3303 induction_variable_data_->limit() != NULL; | 3303 induction_variable_data_->limit() != NULL; |
| 3304 } | 3304 } |
| 3305 void DetectInductionVariable() { | 3305 void DetectInductionVariable() { |
| 3306 DCHECK(induction_variable_data_ == NULL); | 3306 DCHECK(induction_variable_data_ == NULL); |
| 3307 induction_variable_data_ = InductionVariableData::ExaminePhi(this); | 3307 induction_variable_data_ = InductionVariableData::ExaminePhi(this); |
| 3308 } | 3308 } |
| 3309 | 3309 |
| 3310 virtual OStream& PrintTo(OStream& os) const V8_OVERRIDE; // NOLINT | 3310 virtual OStream& PrintTo(OStream& os) const OVERRIDE; // NOLINT |
| 3311 | 3311 |
| 3312 #ifdef DEBUG | 3312 #ifdef DEBUG |
| 3313 virtual void Verify() V8_OVERRIDE; | 3313 virtual void Verify() OVERRIDE; |
| 3314 #endif | 3314 #endif |
| 3315 | 3315 |
| 3316 void InitRealUses(int id); | 3316 void InitRealUses(int id); |
| 3317 void AddNonPhiUsesFrom(HPhi* other); | 3317 void AddNonPhiUsesFrom(HPhi* other); |
| 3318 void AddIndirectUsesTo(int* use_count); | 3318 void AddIndirectUsesTo(int* use_count); |
| 3319 | 3319 |
| 3320 int tagged_non_phi_uses() const { | 3320 int tagged_non_phi_uses() const { |
| 3321 return non_phi_uses_[Representation::kTagged]; | 3321 return non_phi_uses_[Representation::kTagged]; |
| 3322 } | 3322 } |
| 3323 int smi_non_phi_uses() const { | 3323 int smi_non_phi_uses() const { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3340 } | 3340 } |
| 3341 int double_indirect_uses() const { | 3341 int double_indirect_uses() const { |
| 3342 return indirect_uses_[Representation::kDouble]; | 3342 return indirect_uses_[Representation::kDouble]; |
| 3343 } | 3343 } |
| 3344 int phi_id() { return phi_id_; } | 3344 int phi_id() { return phi_id_; } |
| 3345 | 3345 |
| 3346 static HPhi* cast(HValue* value) { | 3346 static HPhi* cast(HValue* value) { |
| 3347 DCHECK(value->IsPhi()); | 3347 DCHECK(value->IsPhi()); |
| 3348 return reinterpret_cast<HPhi*>(value); | 3348 return reinterpret_cast<HPhi*>(value); |
| 3349 } | 3349 } |
| 3350 virtual Opcode opcode() const V8_OVERRIDE { return HValue::kPhi; } | 3350 virtual Opcode opcode() const OVERRIDE { return HValue::kPhi; } |
| 3351 | 3351 |
| 3352 void SimplifyConstantInputs(); | 3352 void SimplifyConstantInputs(); |
| 3353 | 3353 |
| 3354 // Marker value representing an invalid merge index. | 3354 // Marker value representing an invalid merge index. |
| 3355 static const int kInvalidMergedIndex = -1; | 3355 static const int kInvalidMergedIndex = -1; |
| 3356 | 3356 |
| 3357 protected: | 3357 protected: |
| 3358 virtual void DeleteFromGraph() V8_OVERRIDE; | 3358 virtual void DeleteFromGraph() OVERRIDE; |
| 3359 virtual void InternalSetOperandAt(int index, HValue* value) V8_OVERRIDE { | 3359 virtual void InternalSetOperandAt(int index, HValue* value) OVERRIDE { |
| 3360 inputs_[index] = value; | 3360 inputs_[index] = value; |
| 3361 } | 3361 } |
| 3362 | 3362 |
| 3363 private: | 3363 private: |
| 3364 ZoneList<HValue*> inputs_; | 3364 ZoneList<HValue*> inputs_; |
| 3365 int merged_index_; | 3365 int merged_index_; |
| 3366 | 3366 |
| 3367 int non_phi_uses_[Representation::kNumRepresentations]; | 3367 int non_phi_uses_[Representation::kNumRepresentations]; |
| 3368 int indirect_uses_[Representation::kNumRepresentations]; | 3368 int indirect_uses_[Representation::kNumRepresentations]; |
| 3369 int phi_id_; | 3369 int phi_id_; |
| 3370 InductionVariableData* induction_variable_data_; | 3370 InductionVariableData* induction_variable_data_; |
| 3371 | 3371 |
| 3372 // TODO(titzer): we can't eliminate the receiver for generating backtraces | 3372 // TODO(titzer): we can't eliminate the receiver for generating backtraces |
| 3373 virtual bool IsDeletable() const V8_OVERRIDE { return !IsReceiver(); } | 3373 virtual bool IsDeletable() const OVERRIDE { return !IsReceiver(); } |
| 3374 }; | 3374 }; |
| 3375 | 3375 |
| 3376 | 3376 |
| 3377 // Common base class for HArgumentsObject and HCapturedObject. | 3377 // Common base class for HArgumentsObject and HCapturedObject. |
| 3378 class HDematerializedObject : public HInstruction { | 3378 class HDematerializedObject : public HInstruction { |
| 3379 public: | 3379 public: |
| 3380 HDematerializedObject(int count, Zone* zone) : values_(count, zone) {} | 3380 HDematerializedObject(int count, Zone* zone) : values_(count, zone) {} |
| 3381 | 3381 |
| 3382 virtual int OperandCount() const V8_FINAL V8_OVERRIDE { | 3382 virtual int OperandCount() const FINAL OVERRIDE { |
| 3383 return values_.length(); | 3383 return values_.length(); |
| 3384 } | 3384 } |
| 3385 virtual HValue* OperandAt(int index) const V8_FINAL V8_OVERRIDE { | 3385 virtual HValue* OperandAt(int index) const FINAL OVERRIDE { |
| 3386 return values_[index]; | 3386 return values_[index]; |
| 3387 } | 3387 } |
| 3388 | 3388 |
| 3389 virtual bool HasEscapingOperandAt(int index) V8_FINAL V8_OVERRIDE { | 3389 virtual bool HasEscapingOperandAt(int index) FINAL OVERRIDE { |
| 3390 return false; | 3390 return false; |
| 3391 } | 3391 } |
| 3392 virtual Representation RequiredInputRepresentation( | 3392 virtual Representation RequiredInputRepresentation( |
| 3393 int index) V8_FINAL V8_OVERRIDE { | 3393 int index) FINAL OVERRIDE { |
| 3394 return Representation::None(); | 3394 return Representation::None(); |
| 3395 } | 3395 } |
| 3396 | 3396 |
| 3397 protected: | 3397 protected: |
| 3398 virtual void InternalSetOperandAt(int index, | 3398 virtual void InternalSetOperandAt(int index, |
| 3399 HValue* value) V8_FINAL V8_OVERRIDE { | 3399 HValue* value) FINAL OVERRIDE { |
| 3400 values_[index] = value; | 3400 values_[index] = value; |
| 3401 } | 3401 } |
| 3402 | 3402 |
| 3403 // List of values tracked by this marker. | 3403 // List of values tracked by this marker. |
| 3404 ZoneList<HValue*> values_; | 3404 ZoneList<HValue*> values_; |
| 3405 }; | 3405 }; |
| 3406 | 3406 |
| 3407 | 3407 |
| 3408 class HArgumentsObject V8_FINAL : public HDematerializedObject { | 3408 class HArgumentsObject FINAL : public HDematerializedObject { |
| 3409 public: | 3409 public: |
| 3410 static HArgumentsObject* New(Zone* zone, HValue* context, int count) { | 3410 static HArgumentsObject* New(Zone* zone, HValue* context, int count) { |
| 3411 return new(zone) HArgumentsObject(count, zone); | 3411 return new(zone) HArgumentsObject(count, zone); |
| 3412 } | 3412 } |
| 3413 | 3413 |
| 3414 // The values contain a list of all elements in the arguments object | 3414 // The values contain a list of all elements in the arguments object |
| 3415 // including the receiver object, which is skipped when materializing. | 3415 // including the receiver object, which is skipped when materializing. |
| 3416 const ZoneList<HValue*>* arguments_values() const { return &values_; } | 3416 const ZoneList<HValue*>* arguments_values() const { return &values_; } |
| 3417 int arguments_count() const { return values_.length(); } | 3417 int arguments_count() const { return values_.length(); } |
| 3418 | 3418 |
| 3419 void AddArgument(HValue* argument, Zone* zone) { | 3419 void AddArgument(HValue* argument, Zone* zone) { |
| 3420 values_.Add(NULL, zone); // Resize list. | 3420 values_.Add(NULL, zone); // Resize list. |
| 3421 SetOperandAt(values_.length() - 1, argument); | 3421 SetOperandAt(values_.length() - 1, argument); |
| 3422 } | 3422 } |
| 3423 | 3423 |
| 3424 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) | 3424 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) |
| 3425 | 3425 |
| 3426 private: | 3426 private: |
| 3427 HArgumentsObject(int count, Zone* zone) | 3427 HArgumentsObject(int count, Zone* zone) |
| 3428 : HDematerializedObject(count, zone) { | 3428 : HDematerializedObject(count, zone) { |
| 3429 set_representation(Representation::Tagged()); | 3429 set_representation(Representation::Tagged()); |
| 3430 SetFlag(kIsArguments); | 3430 SetFlag(kIsArguments); |
| 3431 } | 3431 } |
| 3432 }; | 3432 }; |
| 3433 | 3433 |
| 3434 | 3434 |
| 3435 class HCapturedObject V8_FINAL : public HDematerializedObject { | 3435 class HCapturedObject FINAL : public HDematerializedObject { |
| 3436 public: | 3436 public: |
| 3437 HCapturedObject(int length, int id, Zone* zone) | 3437 HCapturedObject(int length, int id, Zone* zone) |
| 3438 : HDematerializedObject(length, zone), capture_id_(id) { | 3438 : HDematerializedObject(length, zone), capture_id_(id) { |
| 3439 set_representation(Representation::Tagged()); | 3439 set_representation(Representation::Tagged()); |
| 3440 values_.AddBlock(NULL, length, zone); // Resize list. | 3440 values_.AddBlock(NULL, length, zone); // Resize list. |
| 3441 } | 3441 } |
| 3442 | 3442 |
| 3443 // The values contain a list of all in-object properties inside the | 3443 // The values contain a list of all in-object properties inside the |
| 3444 // captured object and is index by field index. Properties in the | 3444 // captured object and is index by field index. Properties in the |
| 3445 // properties or elements backing store are not tracked here. | 3445 // properties or elements backing store are not tracked here. |
| 3446 const ZoneList<HValue*>* values() const { return &values_; } | 3446 const ZoneList<HValue*>* values() const { return &values_; } |
| 3447 int length() const { return values_.length(); } | 3447 int length() const { return values_.length(); } |
| 3448 int capture_id() const { return capture_id_; } | 3448 int capture_id() const { return capture_id_; } |
| 3449 | 3449 |
| 3450 // Shortcut for the map value of this captured object. | 3450 // Shortcut for the map value of this captured object. |
| 3451 HValue* map_value() const { return values()->first(); } | 3451 HValue* map_value() const { return values()->first(); } |
| 3452 | 3452 |
| 3453 void ReuseSideEffectsFromStore(HInstruction* store) { | 3453 void ReuseSideEffectsFromStore(HInstruction* store) { |
| 3454 DCHECK(store->HasObservableSideEffects()); | 3454 DCHECK(store->HasObservableSideEffects()); |
| 3455 DCHECK(store->IsStoreNamedField()); | 3455 DCHECK(store->IsStoreNamedField()); |
| 3456 changes_flags_.Add(store->ChangesFlags()); | 3456 changes_flags_.Add(store->ChangesFlags()); |
| 3457 } | 3457 } |
| 3458 | 3458 |
| 3459 // Replay effects of this instruction on the given environment. | 3459 // Replay effects of this instruction on the given environment. |
| 3460 void ReplayEnvironment(HEnvironment* env); | 3460 void ReplayEnvironment(HEnvironment* env); |
| 3461 | 3461 |
| 3462 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 3462 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 3463 | 3463 |
| 3464 DECLARE_CONCRETE_INSTRUCTION(CapturedObject) | 3464 DECLARE_CONCRETE_INSTRUCTION(CapturedObject) |
| 3465 | 3465 |
| 3466 private: | 3466 private: |
| 3467 int capture_id_; | 3467 int capture_id_; |
| 3468 | 3468 |
| 3469 // Note that we cannot DCE captured objects as they are used to replay | 3469 // Note that we cannot DCE captured objects as they are used to replay |
| 3470 // the environment. This method is here as an explicit reminder. | 3470 // the environment. This method is here as an explicit reminder. |
| 3471 // TODO(mstarzinger): Turn HSimulates into full snapshots maybe? | 3471 // TODO(mstarzinger): Turn HSimulates into full snapshots maybe? |
| 3472 virtual bool IsDeletable() const V8_FINAL V8_OVERRIDE { return false; } | 3472 virtual bool IsDeletable() const FINAL OVERRIDE { return false; } |
| 3473 }; | 3473 }; |
| 3474 | 3474 |
| 3475 | 3475 |
| 3476 class HConstant V8_FINAL : public HTemplateInstruction<0> { | 3476 class HConstant FINAL : public HTemplateInstruction<0> { |
| 3477 public: | 3477 public: |
| 3478 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, int32_t); | 3478 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, int32_t); |
| 3479 DECLARE_INSTRUCTION_FACTORY_P2(HConstant, int32_t, Representation); | 3479 DECLARE_INSTRUCTION_FACTORY_P2(HConstant, int32_t, Representation); |
| 3480 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, double); | 3480 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, double); |
| 3481 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, Handle<Object>); | 3481 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, Handle<Object>); |
| 3482 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, ExternalReference); | 3482 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, ExternalReference); |
| 3483 | 3483 |
| 3484 static HConstant* CreateAndInsertAfter(Zone* zone, | 3484 static HConstant* CreateAndInsertAfter(Zone* zone, |
| 3485 HValue* context, | 3485 HValue* context, |
| 3486 int32_t value, | 3486 int32_t value, |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3545 bool ImmortalImmovable() const; | 3545 bool ImmortalImmovable() const; |
| 3546 | 3546 |
| 3547 bool IsCell() const { | 3547 bool IsCell() const { |
| 3548 return instance_type_ == CELL_TYPE || instance_type_ == PROPERTY_CELL_TYPE; | 3548 return instance_type_ == CELL_TYPE || instance_type_ == PROPERTY_CELL_TYPE; |
| 3549 } | 3549 } |
| 3550 | 3550 |
| 3551 bool IsMap() const { | 3551 bool IsMap() const { |
| 3552 return instance_type_ == MAP_TYPE; | 3552 return instance_type_ == MAP_TYPE; |
| 3553 } | 3553 } |
| 3554 | 3554 |
| 3555 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3555 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 3556 return Representation::None(); | 3556 return Representation::None(); |
| 3557 } | 3557 } |
| 3558 | 3558 |
| 3559 virtual Representation KnownOptimalRepresentation() V8_OVERRIDE { | 3559 virtual Representation KnownOptimalRepresentation() OVERRIDE { |
| 3560 if (HasSmiValue() && SmiValuesAre31Bits()) return Representation::Smi(); | 3560 if (HasSmiValue() && SmiValuesAre31Bits()) return Representation::Smi(); |
| 3561 if (HasInteger32Value()) return Representation::Integer32(); | 3561 if (HasInteger32Value()) return Representation::Integer32(); |
| 3562 if (HasNumberValue()) return Representation::Double(); | 3562 if (HasNumberValue()) return Representation::Double(); |
| 3563 if (HasExternalReferenceValue()) return Representation::External(); | 3563 if (HasExternalReferenceValue()) return Representation::External(); |
| 3564 return Representation::Tagged(); | 3564 return Representation::Tagged(); |
| 3565 } | 3565 } |
| 3566 | 3566 |
| 3567 virtual bool EmitAtUses() V8_OVERRIDE; | 3567 virtual bool EmitAtUses() OVERRIDE; |
| 3568 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 3568 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 3569 HConstant* CopyToRepresentation(Representation r, Zone* zone) const; | 3569 HConstant* CopyToRepresentation(Representation r, Zone* zone) const; |
| 3570 Maybe<HConstant*> CopyToTruncatedInt32(Zone* zone); | 3570 Maybe<HConstant*> CopyToTruncatedInt32(Zone* zone); |
| 3571 Maybe<HConstant*> CopyToTruncatedNumber(Zone* zone); | 3571 Maybe<HConstant*> CopyToTruncatedNumber(Zone* zone); |
| 3572 bool HasInteger32Value() const { return has_int32_value_; } | 3572 bool HasInteger32Value() const { return has_int32_value_; } |
| 3573 int32_t Integer32Value() const { | 3573 int32_t Integer32Value() const { |
| 3574 DCHECK(HasInteger32Value()); | 3574 DCHECK(HasInteger32Value()); |
| 3575 return int32_value_; | 3575 return int32_value_; |
| 3576 } | 3576 } |
| 3577 bool HasSmiValue() const { return has_smi_value_; } | 3577 bool HasSmiValue() const { return has_smi_value_; } |
| 3578 bool HasDoubleValue() const { return has_double_value_; } | 3578 bool HasDoubleValue() const { return has_double_value_; } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3628 DCHECK(HasMapValue() || !has_stable_map_value_); | 3628 DCHECK(HasMapValue() || !has_stable_map_value_); |
| 3629 return has_stable_map_value_; | 3629 return has_stable_map_value_; |
| 3630 } | 3630 } |
| 3631 | 3631 |
| 3632 bool HasObjectMap() const { return !object_map_.IsNull(); } | 3632 bool HasObjectMap() const { return !object_map_.IsNull(); } |
| 3633 Unique<Map> ObjectMap() const { | 3633 Unique<Map> ObjectMap() const { |
| 3634 DCHECK(HasObjectMap()); | 3634 DCHECK(HasObjectMap()); |
| 3635 return object_map_; | 3635 return object_map_; |
| 3636 } | 3636 } |
| 3637 | 3637 |
| 3638 virtual intptr_t Hashcode() V8_OVERRIDE { | 3638 virtual intptr_t Hashcode() OVERRIDE { |
| 3639 if (has_int32_value_) { | 3639 if (has_int32_value_) { |
| 3640 return static_cast<intptr_t>(int32_value_); | 3640 return static_cast<intptr_t>(int32_value_); |
| 3641 } else if (has_double_value_) { | 3641 } else if (has_double_value_) { |
| 3642 return static_cast<intptr_t>(BitCast<int64_t>(double_value_)); | 3642 return static_cast<intptr_t>(BitCast<int64_t>(double_value_)); |
| 3643 } else if (has_external_reference_value_) { | 3643 } else if (has_external_reference_value_) { |
| 3644 return reinterpret_cast<intptr_t>(external_reference_value_.address()); | 3644 return reinterpret_cast<intptr_t>(external_reference_value_.address()); |
| 3645 } else { | 3645 } else { |
| 3646 DCHECK(!object_.handle().is_null()); | 3646 DCHECK(!object_.handle().is_null()); |
| 3647 return object_.Hashcode(); | 3647 return object_.Hashcode(); |
| 3648 } | 3648 } |
| 3649 } | 3649 } |
| 3650 | 3650 |
| 3651 virtual void FinalizeUniqueness() V8_OVERRIDE { | 3651 virtual void FinalizeUniqueness() OVERRIDE { |
| 3652 if (!has_double_value_ && !has_external_reference_value_) { | 3652 if (!has_double_value_ && !has_external_reference_value_) { |
| 3653 DCHECK(!object_.handle().is_null()); | 3653 DCHECK(!object_.handle().is_null()); |
| 3654 object_ = Unique<Object>(object_.handle()); | 3654 object_ = Unique<Object>(object_.handle()); |
| 3655 } | 3655 } |
| 3656 } | 3656 } |
| 3657 | 3657 |
| 3658 Unique<Object> GetUnique() const { | 3658 Unique<Object> GetUnique() const { |
| 3659 return object_; | 3659 return object_; |
| 3660 } | 3660 } |
| 3661 | 3661 |
| 3662 bool EqualsUnique(Unique<Object> other) const { | 3662 bool EqualsUnique(Unique<Object> other) const { |
| 3663 return object_.IsInitialized() && object_ == other; | 3663 return object_.IsInitialized() && object_ == other; |
| 3664 } | 3664 } |
| 3665 | 3665 |
| 3666 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 3666 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 3667 HConstant* other_constant = HConstant::cast(other); | 3667 HConstant* other_constant = HConstant::cast(other); |
| 3668 if (has_int32_value_) { | 3668 if (has_int32_value_) { |
| 3669 return other_constant->has_int32_value_ && | 3669 return other_constant->has_int32_value_ && |
| 3670 int32_value_ == other_constant->int32_value_; | 3670 int32_value_ == other_constant->int32_value_; |
| 3671 } else if (has_double_value_) { | 3671 } else if (has_double_value_) { |
| 3672 return other_constant->has_double_value_ && | 3672 return other_constant->has_double_value_ && |
| 3673 BitCast<int64_t>(double_value_) == | 3673 BitCast<int64_t>(double_value_) == |
| 3674 BitCast<int64_t>(other_constant->double_value_); | 3674 BitCast<int64_t>(other_constant->double_value_); |
| 3675 } else if (has_external_reference_value_) { | 3675 } else if (has_external_reference_value_) { |
| 3676 return other_constant->has_external_reference_value_ && | 3676 return other_constant->has_external_reference_value_ && |
| 3677 external_reference_value_ == | 3677 external_reference_value_ == |
| 3678 other_constant->external_reference_value_; | 3678 other_constant->external_reference_value_; |
| 3679 } else { | 3679 } else { |
| 3680 if (other_constant->has_int32_value_ || | 3680 if (other_constant->has_int32_value_ || |
| 3681 other_constant->has_double_value_ || | 3681 other_constant->has_double_value_ || |
| 3682 other_constant->has_external_reference_value_) { | 3682 other_constant->has_external_reference_value_) { |
| 3683 return false; | 3683 return false; |
| 3684 } | 3684 } |
| 3685 DCHECK(!object_.handle().is_null()); | 3685 DCHECK(!object_.handle().is_null()); |
| 3686 return other_constant->object_ == object_; | 3686 return other_constant->object_ == object_; |
| 3687 } | 3687 } |
| 3688 } | 3688 } |
| 3689 | 3689 |
| 3690 #ifdef DEBUG | 3690 #ifdef DEBUG |
| 3691 virtual void Verify() V8_OVERRIDE { } | 3691 virtual void Verify() OVERRIDE { } |
| 3692 #endif | 3692 #endif |
| 3693 | 3693 |
| 3694 DECLARE_CONCRETE_INSTRUCTION(Constant) | 3694 DECLARE_CONCRETE_INSTRUCTION(Constant) |
| 3695 | 3695 |
| 3696 protected: | 3696 protected: |
| 3697 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 3697 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 3698 | 3698 |
| 3699 private: | 3699 private: |
| 3700 friend class HGraph; | 3700 friend class HGraph; |
| 3701 explicit HConstant(Handle<Object> handle, | 3701 explicit HConstant(Handle<Object> handle, |
| 3702 Representation r = Representation::None()); | 3702 Representation r = Representation::None()); |
| 3703 HConstant(int32_t value, | 3703 HConstant(int32_t value, |
| 3704 Representation r = Representation::None(), | 3704 Representation r = Representation::None(), |
| 3705 bool is_not_in_new_space = true, | 3705 bool is_not_in_new_space = true, |
| 3706 Unique<Object> optional = Unique<Object>(Handle<Object>::null())); | 3706 Unique<Object> optional = Unique<Object>(Handle<Object>::null())); |
| 3707 HConstant(double value, | 3707 HConstant(double value, |
| 3708 Representation r = Representation::None(), | 3708 Representation r = Representation::None(), |
| 3709 bool is_not_in_new_space = true, | 3709 bool is_not_in_new_space = true, |
| 3710 Unique<Object> optional = Unique<Object>(Handle<Object>::null())); | 3710 Unique<Object> optional = Unique<Object>(Handle<Object>::null())); |
| 3711 HConstant(Unique<Object> object, | 3711 HConstant(Unique<Object> object, |
| 3712 Unique<Map> object_map, | 3712 Unique<Map> object_map, |
| 3713 bool has_stable_map_value, | 3713 bool has_stable_map_value, |
| 3714 Representation r, | 3714 Representation r, |
| 3715 HType type, | 3715 HType type, |
| 3716 bool is_not_in_new_space, | 3716 bool is_not_in_new_space, |
| 3717 bool boolean_value, | 3717 bool boolean_value, |
| 3718 bool is_undetectable, | 3718 bool is_undetectable, |
| 3719 InstanceType instance_type); | 3719 InstanceType instance_type); |
| 3720 | 3720 |
| 3721 explicit HConstant(ExternalReference reference); | 3721 explicit HConstant(ExternalReference reference); |
| 3722 | 3722 |
| 3723 void Initialize(Representation r); | 3723 void Initialize(Representation r); |
| 3724 | 3724 |
| 3725 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 3725 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 3726 | 3726 |
| 3727 // If this is a numerical constant, object_ either points to the | 3727 // If this is a numerical constant, object_ either points to the |
| 3728 // HeapObject the constant originated from or is null. If the | 3728 // HeapObject the constant originated from or is null. If the |
| 3729 // constant is non-numeric, object_ always points to a valid | 3729 // constant is non-numeric, object_ always points to a valid |
| 3730 // constant HeapObject. | 3730 // constant HeapObject. |
| 3731 Unique<Object> object_; | 3731 Unique<Object> object_; |
| 3732 | 3732 |
| 3733 // If object_ is a heap object, this points to the stable map of the object. | 3733 // If object_ is a heap object, this points to the stable map of the object. |
| 3734 Unique<Map> object_map_; | 3734 Unique<Map> object_map_; |
| 3735 | 3735 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3800 | 3800 |
| 3801 void set_observed_input_representation(int index, Representation rep) { | 3801 void set_observed_input_representation(int index, Representation rep) { |
| 3802 DCHECK(index >= 1 && index <= 2); | 3802 DCHECK(index >= 1 && index <= 2); |
| 3803 observed_input_representation_[index - 1] = rep; | 3803 observed_input_representation_[index - 1] = rep; |
| 3804 } | 3804 } |
| 3805 | 3805 |
| 3806 virtual void initialize_output_representation(Representation observed) { | 3806 virtual void initialize_output_representation(Representation observed) { |
| 3807 observed_output_representation_ = observed; | 3807 observed_output_representation_ = observed; |
| 3808 } | 3808 } |
| 3809 | 3809 |
| 3810 virtual Representation observed_input_representation(int index) V8_OVERRIDE { | 3810 virtual Representation observed_input_representation(int index) OVERRIDE { |
| 3811 if (index == 0) return Representation::Tagged(); | 3811 if (index == 0) return Representation::Tagged(); |
| 3812 return observed_input_representation_[index - 1]; | 3812 return observed_input_representation_[index - 1]; |
| 3813 } | 3813 } |
| 3814 | 3814 |
| 3815 virtual void UpdateRepresentation(Representation new_rep, | 3815 virtual void UpdateRepresentation(Representation new_rep, |
| 3816 HInferRepresentationPhase* h_infer, | 3816 HInferRepresentationPhase* h_infer, |
| 3817 const char* reason) V8_OVERRIDE { | 3817 const char* reason) OVERRIDE { |
| 3818 Representation rep = !FLAG_smi_binop && new_rep.IsSmi() | 3818 Representation rep = !FLAG_smi_binop && new_rep.IsSmi() |
| 3819 ? Representation::Integer32() : new_rep; | 3819 ? Representation::Integer32() : new_rep; |
| 3820 HValue::UpdateRepresentation(rep, h_infer, reason); | 3820 HValue::UpdateRepresentation(rep, h_infer, reason); |
| 3821 } | 3821 } |
| 3822 | 3822 |
| 3823 virtual void InferRepresentation( | 3823 virtual void InferRepresentation( |
| 3824 HInferRepresentationPhase* h_infer) V8_OVERRIDE; | 3824 HInferRepresentationPhase* h_infer) OVERRIDE; |
| 3825 virtual Representation RepresentationFromInputs() V8_OVERRIDE; | 3825 virtual Representation RepresentationFromInputs() OVERRIDE; |
| 3826 Representation RepresentationFromOutput(); | 3826 Representation RepresentationFromOutput(); |
| 3827 virtual void AssumeRepresentation(Representation r) V8_OVERRIDE; | 3827 virtual void AssumeRepresentation(Representation r) OVERRIDE; |
| 3828 | 3828 |
| 3829 virtual bool IsCommutative() const { return false; } | 3829 virtual bool IsCommutative() const { return false; } |
| 3830 | 3830 |
| 3831 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 3831 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 3832 | 3832 |
| 3833 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3833 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 3834 if (index == 0) return Representation::Tagged(); | 3834 if (index == 0) return Representation::Tagged(); |
| 3835 return representation(); | 3835 return representation(); |
| 3836 } | 3836 } |
| 3837 | 3837 |
| 3838 void SetOperandPositions(Zone* zone, | 3838 void SetOperandPositions(Zone* zone, |
| 3839 HSourcePosition left_pos, | 3839 HSourcePosition left_pos, |
| 3840 HSourcePosition right_pos) { | 3840 HSourcePosition right_pos) { |
| 3841 set_operand_position(zone, 1, left_pos); | 3841 set_operand_position(zone, 1, left_pos); |
| 3842 set_operand_position(zone, 2, right_pos); | 3842 set_operand_position(zone, 2, right_pos); |
| 3843 } | 3843 } |
| 3844 | 3844 |
| 3845 bool RightIsPowerOf2() { | 3845 bool RightIsPowerOf2() { |
| 3846 if (!right()->IsInteger32Constant()) return false; | 3846 if (!right()->IsInteger32Constant()) return false; |
| 3847 int32_t value = right()->GetInteger32Constant(); | 3847 int32_t value = right()->GetInteger32Constant(); |
| 3848 return IsPowerOf2(value) || IsPowerOf2(-value); | 3848 return IsPowerOf2(value) || IsPowerOf2(-value); |
| 3849 } | 3849 } |
| 3850 | 3850 |
| 3851 DECLARE_ABSTRACT_INSTRUCTION(BinaryOperation) | 3851 DECLARE_ABSTRACT_INSTRUCTION(BinaryOperation) |
| 3852 | 3852 |
| 3853 private: | 3853 private: |
| 3854 bool IgnoreObservedOutputRepresentation(Representation current_rep); | 3854 bool IgnoreObservedOutputRepresentation(Representation current_rep); |
| 3855 | 3855 |
| 3856 Representation observed_input_representation_[2]; | 3856 Representation observed_input_representation_[2]; |
| 3857 Representation observed_output_representation_; | 3857 Representation observed_output_representation_; |
| 3858 }; | 3858 }; |
| 3859 | 3859 |
| 3860 | 3860 |
| 3861 class HWrapReceiver V8_FINAL : public HTemplateInstruction<2> { | 3861 class HWrapReceiver FINAL : public HTemplateInstruction<2> { |
| 3862 public: | 3862 public: |
| 3863 DECLARE_INSTRUCTION_FACTORY_P2(HWrapReceiver, HValue*, HValue*); | 3863 DECLARE_INSTRUCTION_FACTORY_P2(HWrapReceiver, HValue*, HValue*); |
| 3864 | 3864 |
| 3865 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 3865 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 3866 | 3866 |
| 3867 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3867 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 3868 return Representation::Tagged(); | 3868 return Representation::Tagged(); |
| 3869 } | 3869 } |
| 3870 | 3870 |
| 3871 HValue* receiver() const { return OperandAt(0); } | 3871 HValue* receiver() const { return OperandAt(0); } |
| 3872 HValue* function() const { return OperandAt(1); } | 3872 HValue* function() const { return OperandAt(1); } |
| 3873 | 3873 |
| 3874 virtual HValue* Canonicalize() V8_OVERRIDE; | 3874 virtual HValue* Canonicalize() OVERRIDE; |
| 3875 | 3875 |
| 3876 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 3876 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 3877 bool known_function() const { return known_function_; } | 3877 bool known_function() const { return known_function_; } |
| 3878 | 3878 |
| 3879 DECLARE_CONCRETE_INSTRUCTION(WrapReceiver) | 3879 DECLARE_CONCRETE_INSTRUCTION(WrapReceiver) |
| 3880 | 3880 |
| 3881 private: | 3881 private: |
| 3882 HWrapReceiver(HValue* receiver, HValue* function) { | 3882 HWrapReceiver(HValue* receiver, HValue* function) { |
| 3883 known_function_ = function->IsConstant() && | 3883 known_function_ = function->IsConstant() && |
| 3884 HConstant::cast(function)->handle(function->isolate())->IsJSFunction(); | 3884 HConstant::cast(function)->handle(function->isolate())->IsJSFunction(); |
| 3885 set_representation(Representation::Tagged()); | 3885 set_representation(Representation::Tagged()); |
| 3886 SetOperandAt(0, receiver); | 3886 SetOperandAt(0, receiver); |
| 3887 SetOperandAt(1, function); | 3887 SetOperandAt(1, function); |
| 3888 SetFlag(kUseGVN); | 3888 SetFlag(kUseGVN); |
| 3889 } | 3889 } |
| 3890 | 3890 |
| 3891 bool known_function_; | 3891 bool known_function_; |
| 3892 }; | 3892 }; |
| 3893 | 3893 |
| 3894 | 3894 |
| 3895 class HApplyArguments V8_FINAL : public HTemplateInstruction<4> { | 3895 class HApplyArguments FINAL : public HTemplateInstruction<4> { |
| 3896 public: | 3896 public: |
| 3897 DECLARE_INSTRUCTION_FACTORY_P4(HApplyArguments, HValue*, HValue*, HValue*, | 3897 DECLARE_INSTRUCTION_FACTORY_P4(HApplyArguments, HValue*, HValue*, HValue*, |
| 3898 HValue*); | 3898 HValue*); |
| 3899 | 3899 |
| 3900 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3900 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 3901 // The length is untagged, all other inputs are tagged. | 3901 // The length is untagged, all other inputs are tagged. |
| 3902 return (index == 2) | 3902 return (index == 2) |
| 3903 ? Representation::Integer32() | 3903 ? Representation::Integer32() |
| 3904 : Representation::Tagged(); | 3904 : Representation::Tagged(); |
| 3905 } | 3905 } |
| 3906 | 3906 |
| 3907 HValue* function() { return OperandAt(0); } | 3907 HValue* function() { return OperandAt(0); } |
| 3908 HValue* receiver() { return OperandAt(1); } | 3908 HValue* receiver() { return OperandAt(1); } |
| 3909 HValue* length() { return OperandAt(2); } | 3909 HValue* length() { return OperandAt(2); } |
| 3910 HValue* elements() { return OperandAt(3); } | 3910 HValue* elements() { return OperandAt(3); } |
| 3911 | 3911 |
| 3912 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments) | 3912 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments) |
| 3913 | 3913 |
| 3914 private: | 3914 private: |
| 3915 HApplyArguments(HValue* function, | 3915 HApplyArguments(HValue* function, |
| 3916 HValue* receiver, | 3916 HValue* receiver, |
| 3917 HValue* length, | 3917 HValue* length, |
| 3918 HValue* elements) { | 3918 HValue* elements) { |
| 3919 set_representation(Representation::Tagged()); | 3919 set_representation(Representation::Tagged()); |
| 3920 SetOperandAt(0, function); | 3920 SetOperandAt(0, function); |
| 3921 SetOperandAt(1, receiver); | 3921 SetOperandAt(1, receiver); |
| 3922 SetOperandAt(2, length); | 3922 SetOperandAt(2, length); |
| 3923 SetOperandAt(3, elements); | 3923 SetOperandAt(3, elements); |
| 3924 SetAllSideEffects(); | 3924 SetAllSideEffects(); |
| 3925 } | 3925 } |
| 3926 }; | 3926 }; |
| 3927 | 3927 |
| 3928 | 3928 |
| 3929 class HArgumentsElements V8_FINAL : public HTemplateInstruction<0> { | 3929 class HArgumentsElements FINAL : public HTemplateInstruction<0> { |
| 3930 public: | 3930 public: |
| 3931 DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsElements, bool); | 3931 DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsElements, bool); |
| 3932 | 3932 |
| 3933 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements) | 3933 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements) |
| 3934 | 3934 |
| 3935 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3935 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 3936 return Representation::None(); | 3936 return Representation::None(); |
| 3937 } | 3937 } |
| 3938 | 3938 |
| 3939 bool from_inlined() const { return from_inlined_; } | 3939 bool from_inlined() const { return from_inlined_; } |
| 3940 | 3940 |
| 3941 protected: | 3941 protected: |
| 3942 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 3942 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 3943 | 3943 |
| 3944 private: | 3944 private: |
| 3945 explicit HArgumentsElements(bool from_inlined) : from_inlined_(from_inlined) { | 3945 explicit HArgumentsElements(bool from_inlined) : from_inlined_(from_inlined) { |
| 3946 // The value produced by this instruction is a pointer into the stack | 3946 // The value produced by this instruction is a pointer into the stack |
| 3947 // that looks as if it was a smi because of alignment. | 3947 // that looks as if it was a smi because of alignment. |
| 3948 set_representation(Representation::Tagged()); | 3948 set_representation(Representation::Tagged()); |
| 3949 SetFlag(kUseGVN); | 3949 SetFlag(kUseGVN); |
| 3950 } | 3950 } |
| 3951 | 3951 |
| 3952 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 3952 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 3953 | 3953 |
| 3954 bool from_inlined_; | 3954 bool from_inlined_; |
| 3955 }; | 3955 }; |
| 3956 | 3956 |
| 3957 | 3957 |
| 3958 class HArgumentsLength V8_FINAL : public HUnaryOperation { | 3958 class HArgumentsLength FINAL : public HUnaryOperation { |
| 3959 public: | 3959 public: |
| 3960 DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsLength, HValue*); | 3960 DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsLength, HValue*); |
| 3961 | 3961 |
| 3962 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3962 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 3963 return Representation::Tagged(); | 3963 return Representation::Tagged(); |
| 3964 } | 3964 } |
| 3965 | 3965 |
| 3966 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength) | 3966 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength) |
| 3967 | 3967 |
| 3968 protected: | 3968 protected: |
| 3969 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 3969 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 3970 | 3970 |
| 3971 private: | 3971 private: |
| 3972 explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) { | 3972 explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) { |
| 3973 set_representation(Representation::Integer32()); | 3973 set_representation(Representation::Integer32()); |
| 3974 SetFlag(kUseGVN); | 3974 SetFlag(kUseGVN); |
| 3975 } | 3975 } |
| 3976 | 3976 |
| 3977 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 3977 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 3978 }; | 3978 }; |
| 3979 | 3979 |
| 3980 | 3980 |
| 3981 class HAccessArgumentsAt V8_FINAL : public HTemplateInstruction<3> { | 3981 class HAccessArgumentsAt FINAL : public HTemplateInstruction<3> { |
| 3982 public: | 3982 public: |
| 3983 DECLARE_INSTRUCTION_FACTORY_P3(HAccessArgumentsAt, HValue*, HValue*, HValue*); | 3983 DECLARE_INSTRUCTION_FACTORY_P3(HAccessArgumentsAt, HValue*, HValue*, HValue*); |
| 3984 | 3984 |
| 3985 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 3985 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 3986 | 3986 |
| 3987 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3987 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 3988 // The arguments elements is considered tagged. | 3988 // The arguments elements is considered tagged. |
| 3989 return index == 0 | 3989 return index == 0 |
| 3990 ? Representation::Tagged() | 3990 ? Representation::Tagged() |
| 3991 : Representation::Integer32(); | 3991 : Representation::Integer32(); |
| 3992 } | 3992 } |
| 3993 | 3993 |
| 3994 HValue* arguments() const { return OperandAt(0); } | 3994 HValue* arguments() const { return OperandAt(0); } |
| 3995 HValue* length() const { return OperandAt(1); } | 3995 HValue* length() const { return OperandAt(1); } |
| 3996 HValue* index() const { return OperandAt(2); } | 3996 HValue* index() const { return OperandAt(2); } |
| 3997 | 3997 |
| 3998 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt) | 3998 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt) |
| 3999 | 3999 |
| 4000 private: | 4000 private: |
| 4001 HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { | 4001 HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { |
| 4002 set_representation(Representation::Tagged()); | 4002 set_representation(Representation::Tagged()); |
| 4003 SetFlag(kUseGVN); | 4003 SetFlag(kUseGVN); |
| 4004 SetOperandAt(0, arguments); | 4004 SetOperandAt(0, arguments); |
| 4005 SetOperandAt(1, length); | 4005 SetOperandAt(1, length); |
| 4006 SetOperandAt(2, index); | 4006 SetOperandAt(2, index); |
| 4007 } | 4007 } |
| 4008 | 4008 |
| 4009 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 4009 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 4010 }; | 4010 }; |
| 4011 | 4011 |
| 4012 | 4012 |
| 4013 class HBoundsCheckBaseIndexInformation; | 4013 class HBoundsCheckBaseIndexInformation; |
| 4014 | 4014 |
| 4015 | 4015 |
| 4016 class HBoundsCheck V8_FINAL : public HTemplateInstruction<2> { | 4016 class HBoundsCheck FINAL : public HTemplateInstruction<2> { |
| 4017 public: | 4017 public: |
| 4018 DECLARE_INSTRUCTION_FACTORY_P2(HBoundsCheck, HValue*, HValue*); | 4018 DECLARE_INSTRUCTION_FACTORY_P2(HBoundsCheck, HValue*, HValue*); |
| 4019 | 4019 |
| 4020 bool skip_check() const { return skip_check_; } | 4020 bool skip_check() const { return skip_check_; } |
| 4021 void set_skip_check() { skip_check_ = true; } | 4021 void set_skip_check() { skip_check_ = true; } |
| 4022 | 4022 |
| 4023 HValue* base() const { return base_; } | 4023 HValue* base() const { return base_; } |
| 4024 int offset() const { return offset_; } | 4024 int offset() const { return offset_; } |
| 4025 int scale() const { return scale_; } | 4025 int scale() const { return scale_; } |
| 4026 | 4026 |
| 4027 void ApplyIndexChange(); | 4027 void ApplyIndexChange(); |
| 4028 bool DetectCompoundIndex() { | 4028 bool DetectCompoundIndex() { |
| 4029 DCHECK(base() == NULL); | 4029 DCHECK(base() == NULL); |
| 4030 | 4030 |
| 4031 DecompositionResult decomposition; | 4031 DecompositionResult decomposition; |
| 4032 if (index()->TryDecompose(&decomposition)) { | 4032 if (index()->TryDecompose(&decomposition)) { |
| 4033 base_ = decomposition.base(); | 4033 base_ = decomposition.base(); |
| 4034 offset_ = decomposition.offset(); | 4034 offset_ = decomposition.offset(); |
| 4035 scale_ = decomposition.scale(); | 4035 scale_ = decomposition.scale(); |
| 4036 return true; | 4036 return true; |
| 4037 } else { | 4037 } else { |
| 4038 base_ = index(); | 4038 base_ = index(); |
| 4039 offset_ = 0; | 4039 offset_ = 0; |
| 4040 scale_ = 0; | 4040 scale_ = 0; |
| 4041 return false; | 4041 return false; |
| 4042 } | 4042 } |
| 4043 } | 4043 } |
| 4044 | 4044 |
| 4045 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4045 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4046 return representation(); | 4046 return representation(); |
| 4047 } | 4047 } |
| 4048 | 4048 |
| 4049 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 4049 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 4050 virtual void InferRepresentation( | 4050 virtual void InferRepresentation( |
| 4051 HInferRepresentationPhase* h_infer) V8_OVERRIDE; | 4051 HInferRepresentationPhase* h_infer) OVERRIDE; |
| 4052 | 4052 |
| 4053 HValue* index() const { return OperandAt(0); } | 4053 HValue* index() const { return OperandAt(0); } |
| 4054 HValue* length() const { return OperandAt(1); } | 4054 HValue* length() const { return OperandAt(1); } |
| 4055 bool allow_equality() const { return allow_equality_; } | 4055 bool allow_equality() const { return allow_equality_; } |
| 4056 void set_allow_equality(bool v) { allow_equality_ = v; } | 4056 void set_allow_equality(bool v) { allow_equality_ = v; } |
| 4057 | 4057 |
| 4058 virtual int RedefinedOperandIndex() V8_OVERRIDE { return 0; } | 4058 virtual int RedefinedOperandIndex() OVERRIDE { return 0; } |
| 4059 virtual bool IsPurelyInformativeDefinition() V8_OVERRIDE { | 4059 virtual bool IsPurelyInformativeDefinition() OVERRIDE { |
| 4060 return skip_check(); | 4060 return skip_check(); |
| 4061 } | 4061 } |
| 4062 | 4062 |
| 4063 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck) | 4063 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck) |
| 4064 | 4064 |
| 4065 protected: | 4065 protected: |
| 4066 friend class HBoundsCheckBaseIndexInformation; | 4066 friend class HBoundsCheckBaseIndexInformation; |
| 4067 | 4067 |
| 4068 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 4068 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 4069 | 4069 |
| 4070 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 4070 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 4071 bool skip_check_; | 4071 bool skip_check_; |
| 4072 HValue* base_; | 4072 HValue* base_; |
| 4073 int offset_; | 4073 int offset_; |
| 4074 int scale_; | 4074 int scale_; |
| 4075 bool allow_equality_; | 4075 bool allow_equality_; |
| 4076 | 4076 |
| 4077 private: | 4077 private: |
| 4078 // Normally HBoundsCheck should be created using the | 4078 // Normally HBoundsCheck should be created using the |
| 4079 // HGraphBuilder::AddBoundsCheck() helper. | 4079 // HGraphBuilder::AddBoundsCheck() helper. |
| 4080 // However when building stubs, where we know that the arguments are Int32, | 4080 // However when building stubs, where we know that the arguments are Int32, |
| 4081 // it makes sense to invoke this constructor directly. | 4081 // it makes sense to invoke this constructor directly. |
| 4082 HBoundsCheck(HValue* index, HValue* length) | 4082 HBoundsCheck(HValue* index, HValue* length) |
| 4083 : skip_check_(false), | 4083 : skip_check_(false), |
| 4084 base_(NULL), offset_(0), scale_(0), | 4084 base_(NULL), offset_(0), scale_(0), |
| 4085 allow_equality_(false) { | 4085 allow_equality_(false) { |
| 4086 SetOperandAt(0, index); | 4086 SetOperandAt(0, index); |
| 4087 SetOperandAt(1, length); | 4087 SetOperandAt(1, length); |
| 4088 SetFlag(kFlexibleRepresentation); | 4088 SetFlag(kFlexibleRepresentation); |
| 4089 SetFlag(kUseGVN); | 4089 SetFlag(kUseGVN); |
| 4090 } | 4090 } |
| 4091 | 4091 |
| 4092 virtual bool IsDeletable() const V8_OVERRIDE { | 4092 virtual bool IsDeletable() const OVERRIDE { |
| 4093 return skip_check() && !FLAG_debug_code; | 4093 return skip_check() && !FLAG_debug_code; |
| 4094 } | 4094 } |
| 4095 }; | 4095 }; |
| 4096 | 4096 |
| 4097 | 4097 |
| 4098 class HBoundsCheckBaseIndexInformation V8_FINAL | 4098 class HBoundsCheckBaseIndexInformation FINAL |
| 4099 : public HTemplateInstruction<2> { | 4099 : public HTemplateInstruction<2> { |
| 4100 public: | 4100 public: |
| 4101 explicit HBoundsCheckBaseIndexInformation(HBoundsCheck* check) { | 4101 explicit HBoundsCheckBaseIndexInformation(HBoundsCheck* check) { |
| 4102 DecompositionResult decomposition; | 4102 DecompositionResult decomposition; |
| 4103 if (check->index()->TryDecompose(&decomposition)) { | 4103 if (check->index()->TryDecompose(&decomposition)) { |
| 4104 SetOperandAt(0, decomposition.base()); | 4104 SetOperandAt(0, decomposition.base()); |
| 4105 SetOperandAt(1, check); | 4105 SetOperandAt(1, check); |
| 4106 } else { | 4106 } else { |
| 4107 UNREACHABLE(); | 4107 UNREACHABLE(); |
| 4108 } | 4108 } |
| 4109 } | 4109 } |
| 4110 | 4110 |
| 4111 HValue* base_index() const { return OperandAt(0); } | 4111 HValue* base_index() const { return OperandAt(0); } |
| 4112 HBoundsCheck* bounds_check() { return HBoundsCheck::cast(OperandAt(1)); } | 4112 HBoundsCheck* bounds_check() { return HBoundsCheck::cast(OperandAt(1)); } |
| 4113 | 4113 |
| 4114 DECLARE_CONCRETE_INSTRUCTION(BoundsCheckBaseIndexInformation) | 4114 DECLARE_CONCRETE_INSTRUCTION(BoundsCheckBaseIndexInformation) |
| 4115 | 4115 |
| 4116 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4116 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4117 return representation(); | 4117 return representation(); |
| 4118 } | 4118 } |
| 4119 | 4119 |
| 4120 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 4120 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 4121 | 4121 |
| 4122 virtual int RedefinedOperandIndex() V8_OVERRIDE { return 0; } | 4122 virtual int RedefinedOperandIndex() OVERRIDE { return 0; } |
| 4123 virtual bool IsPurelyInformativeDefinition() V8_OVERRIDE { return true; } | 4123 virtual bool IsPurelyInformativeDefinition() OVERRIDE { return true; } |
| 4124 }; | 4124 }; |
| 4125 | 4125 |
| 4126 | 4126 |
| 4127 class HBitwiseBinaryOperation : public HBinaryOperation { | 4127 class HBitwiseBinaryOperation : public HBinaryOperation { |
| 4128 public: | 4128 public: |
| 4129 HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right, | 4129 HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right, |
| 4130 HType type = HType::TaggedNumber()) | 4130 HType type = HType::TaggedNumber()) |
| 4131 : HBinaryOperation(context, left, right, type) { | 4131 : HBinaryOperation(context, left, right, type) { |
| 4132 SetFlag(kFlexibleRepresentation); | 4132 SetFlag(kFlexibleRepresentation); |
| 4133 SetFlag(kTruncatingToInt32); | 4133 SetFlag(kTruncatingToInt32); |
| 4134 SetFlag(kAllowUndefinedAsNaN); | 4134 SetFlag(kAllowUndefinedAsNaN); |
| 4135 SetAllSideEffects(); | 4135 SetAllSideEffects(); |
| 4136 } | 4136 } |
| 4137 | 4137 |
| 4138 virtual void RepresentationChanged(Representation to) V8_OVERRIDE { | 4138 virtual void RepresentationChanged(Representation to) OVERRIDE { |
| 4139 if (to.IsTagged() && | 4139 if (to.IsTagged() && |
| 4140 (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) { | 4140 (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) { |
| 4141 SetAllSideEffects(); | 4141 SetAllSideEffects(); |
| 4142 ClearFlag(kUseGVN); | 4142 ClearFlag(kUseGVN); |
| 4143 } else { | 4143 } else { |
| 4144 ClearAllSideEffects(); | 4144 ClearAllSideEffects(); |
| 4145 SetFlag(kUseGVN); | 4145 SetFlag(kUseGVN); |
| 4146 } | 4146 } |
| 4147 if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion); | 4147 if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion); |
| 4148 } | 4148 } |
| 4149 | 4149 |
| 4150 virtual void UpdateRepresentation(Representation new_rep, | 4150 virtual void UpdateRepresentation(Representation new_rep, |
| 4151 HInferRepresentationPhase* h_infer, | 4151 HInferRepresentationPhase* h_infer, |
| 4152 const char* reason) V8_OVERRIDE { | 4152 const char* reason) OVERRIDE { |
| 4153 // We only generate either int32 or generic tagged bitwise operations. | 4153 // We only generate either int32 or generic tagged bitwise operations. |
| 4154 if (new_rep.IsDouble()) new_rep = Representation::Integer32(); | 4154 if (new_rep.IsDouble()) new_rep = Representation::Integer32(); |
| 4155 HBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); | 4155 HBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); |
| 4156 } | 4156 } |
| 4157 | 4157 |
| 4158 virtual Representation observed_input_representation(int index) V8_OVERRIDE { | 4158 virtual Representation observed_input_representation(int index) OVERRIDE { |
| 4159 Representation r = HBinaryOperation::observed_input_representation(index); | 4159 Representation r = HBinaryOperation::observed_input_representation(index); |
| 4160 if (r.IsDouble()) return Representation::Integer32(); | 4160 if (r.IsDouble()) return Representation::Integer32(); |
| 4161 return r; | 4161 return r; |
| 4162 } | 4162 } |
| 4163 | 4163 |
| 4164 virtual void initialize_output_representation(Representation observed) { | 4164 virtual void initialize_output_representation(Representation observed) { |
| 4165 if (observed.IsDouble()) observed = Representation::Integer32(); | 4165 if (observed.IsDouble()) observed = Representation::Integer32(); |
| 4166 HBinaryOperation::initialize_output_representation(observed); | 4166 HBinaryOperation::initialize_output_representation(observed); |
| 4167 } | 4167 } |
| 4168 | 4168 |
| 4169 DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation) | 4169 DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation) |
| 4170 | 4170 |
| 4171 private: | 4171 private: |
| 4172 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 4172 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 4173 }; | 4173 }; |
| 4174 | 4174 |
| 4175 | 4175 |
| 4176 class HMathFloorOfDiv V8_FINAL : public HBinaryOperation { | 4176 class HMathFloorOfDiv FINAL : public HBinaryOperation { |
| 4177 public: | 4177 public: |
| 4178 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HMathFloorOfDiv, | 4178 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HMathFloorOfDiv, |
| 4179 HValue*, | 4179 HValue*, |
| 4180 HValue*); | 4180 HValue*); |
| 4181 | 4181 |
| 4182 DECLARE_CONCRETE_INSTRUCTION(MathFloorOfDiv) | 4182 DECLARE_CONCRETE_INSTRUCTION(MathFloorOfDiv) |
| 4183 | 4183 |
| 4184 protected: | 4184 protected: |
| 4185 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 4185 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 4186 | 4186 |
| 4187 private: | 4187 private: |
| 4188 HMathFloorOfDiv(HValue* context, HValue* left, HValue* right) | 4188 HMathFloorOfDiv(HValue* context, HValue* left, HValue* right) |
| 4189 : HBinaryOperation(context, left, right) { | 4189 : HBinaryOperation(context, left, right) { |
| 4190 set_representation(Representation::Integer32()); | 4190 set_representation(Representation::Integer32()); |
| 4191 SetFlag(kUseGVN); | 4191 SetFlag(kUseGVN); |
| 4192 SetFlag(kCanOverflow); | 4192 SetFlag(kCanOverflow); |
| 4193 SetFlag(kCanBeDivByZero); | 4193 SetFlag(kCanBeDivByZero); |
| 4194 SetFlag(kLeftCanBeMinInt); | 4194 SetFlag(kLeftCanBeMinInt); |
| 4195 SetFlag(kLeftCanBeNegative); | 4195 SetFlag(kLeftCanBeNegative); |
| 4196 SetFlag(kLeftCanBePositive); | 4196 SetFlag(kLeftCanBePositive); |
| 4197 SetFlag(kAllowUndefinedAsNaN); | 4197 SetFlag(kAllowUndefinedAsNaN); |
| 4198 } | 4198 } |
| 4199 | 4199 |
| 4200 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 4200 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 4201 | 4201 |
| 4202 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 4202 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 4203 }; | 4203 }; |
| 4204 | 4204 |
| 4205 | 4205 |
| 4206 class HArithmeticBinaryOperation : public HBinaryOperation { | 4206 class HArithmeticBinaryOperation : public HBinaryOperation { |
| 4207 public: | 4207 public: |
| 4208 HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right) | 4208 HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right) |
| 4209 : HBinaryOperation(context, left, right, HType::TaggedNumber()) { | 4209 : HBinaryOperation(context, left, right, HType::TaggedNumber()) { |
| 4210 SetAllSideEffects(); | 4210 SetAllSideEffects(); |
| 4211 SetFlag(kFlexibleRepresentation); | 4211 SetFlag(kFlexibleRepresentation); |
| 4212 SetFlag(kAllowUndefinedAsNaN); | 4212 SetFlag(kAllowUndefinedAsNaN); |
| 4213 } | 4213 } |
| 4214 | 4214 |
| 4215 virtual void RepresentationChanged(Representation to) V8_OVERRIDE { | 4215 virtual void RepresentationChanged(Representation to) OVERRIDE { |
| 4216 if (to.IsTagged() && | 4216 if (to.IsTagged() && |
| 4217 (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) { | 4217 (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) { |
| 4218 SetAllSideEffects(); | 4218 SetAllSideEffects(); |
| 4219 ClearFlag(kUseGVN); | 4219 ClearFlag(kUseGVN); |
| 4220 } else { | 4220 } else { |
| 4221 ClearAllSideEffects(); | 4221 ClearAllSideEffects(); |
| 4222 SetFlag(kUseGVN); | 4222 SetFlag(kUseGVN); |
| 4223 } | 4223 } |
| 4224 if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion); | 4224 if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion); |
| 4225 } | 4225 } |
| 4226 | 4226 |
| 4227 DECLARE_ABSTRACT_INSTRUCTION(ArithmeticBinaryOperation) | 4227 DECLARE_ABSTRACT_INSTRUCTION(ArithmeticBinaryOperation) |
| 4228 | 4228 |
| 4229 private: | 4229 private: |
| 4230 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 4230 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 4231 }; | 4231 }; |
| 4232 | 4232 |
| 4233 | 4233 |
| 4234 class HCompareGeneric V8_FINAL : public HBinaryOperation { | 4234 class HCompareGeneric FINAL : public HBinaryOperation { |
| 4235 public: | 4235 public: |
| 4236 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCompareGeneric, HValue*, | 4236 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCompareGeneric, HValue*, |
| 4237 HValue*, Token::Value); | 4237 HValue*, Token::Value); |
| 4238 | 4238 |
| 4239 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4239 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4240 return index == 0 | 4240 return index == 0 |
| 4241 ? Representation::Tagged() | 4241 ? Representation::Tagged() |
| 4242 : representation(); | 4242 : representation(); |
| 4243 } | 4243 } |
| 4244 | 4244 |
| 4245 Token::Value token() const { return token_; } | 4245 Token::Value token() const { return token_; } |
| 4246 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 4246 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 4247 | 4247 |
| 4248 DECLARE_CONCRETE_INSTRUCTION(CompareGeneric) | 4248 DECLARE_CONCRETE_INSTRUCTION(CompareGeneric) |
| 4249 | 4249 |
| 4250 private: | 4250 private: |
| 4251 HCompareGeneric(HValue* context, | 4251 HCompareGeneric(HValue* context, |
| 4252 HValue* left, | 4252 HValue* left, |
| 4253 HValue* right, | 4253 HValue* right, |
| 4254 Token::Value token) | 4254 Token::Value token) |
| 4255 : HBinaryOperation(context, left, right, HType::Boolean()), | 4255 : HBinaryOperation(context, left, right, HType::Boolean()), |
| 4256 token_(token) { | 4256 token_(token) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4275 HValue* right() const { return OperandAt(1); } | 4275 HValue* right() const { return OperandAt(1); } |
| 4276 Token::Value token() const { return token_; } | 4276 Token::Value token() const { return token_; } |
| 4277 | 4277 |
| 4278 void set_observed_input_representation(Representation left, | 4278 void set_observed_input_representation(Representation left, |
| 4279 Representation right) { | 4279 Representation right) { |
| 4280 observed_input_representation_[0] = left; | 4280 observed_input_representation_[0] = left; |
| 4281 observed_input_representation_[1] = right; | 4281 observed_input_representation_[1] = right; |
| 4282 } | 4282 } |
| 4283 | 4283 |
| 4284 virtual void InferRepresentation( | 4284 virtual void InferRepresentation( |
| 4285 HInferRepresentationPhase* h_infer) V8_OVERRIDE; | 4285 HInferRepresentationPhase* h_infer) OVERRIDE; |
| 4286 | 4286 |
| 4287 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4287 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4288 return representation(); | 4288 return representation(); |
| 4289 } | 4289 } |
| 4290 virtual Representation observed_input_representation(int index) V8_OVERRIDE { | 4290 virtual Representation observed_input_representation(int index) OVERRIDE { |
| 4291 return observed_input_representation_[index]; | 4291 return observed_input_representation_[index]; |
| 4292 } | 4292 } |
| 4293 | 4293 |
| 4294 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 4294 virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; |
| 4295 | 4295 |
| 4296 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 4296 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 4297 | 4297 |
| 4298 void SetOperandPositions(Zone* zone, | 4298 void SetOperandPositions(Zone* zone, |
| 4299 HSourcePosition left_pos, | 4299 HSourcePosition left_pos, |
| 4300 HSourcePosition right_pos) { | 4300 HSourcePosition right_pos) { |
| 4301 set_operand_position(zone, 0, left_pos); | 4301 set_operand_position(zone, 0, left_pos); |
| 4302 set_operand_position(zone, 1, right_pos); | 4302 set_operand_position(zone, 1, right_pos); |
| 4303 } | 4303 } |
| 4304 | 4304 |
| 4305 DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch) | 4305 DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch) |
| 4306 | 4306 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 4317 SetOperandAt(1, right); | 4317 SetOperandAt(1, right); |
| 4318 SetSuccessorAt(0, true_target); | 4318 SetSuccessorAt(0, true_target); |
| 4319 SetSuccessorAt(1, false_target); | 4319 SetSuccessorAt(1, false_target); |
| 4320 } | 4320 } |
| 4321 | 4321 |
| 4322 Representation observed_input_representation_[2]; | 4322 Representation observed_input_representation_[2]; |
| 4323 Token::Value token_; | 4323 Token::Value token_; |
| 4324 }; | 4324 }; |
| 4325 | 4325 |
| 4326 | 4326 |
| 4327 class HCompareHoleAndBranch V8_FINAL : public HUnaryControlInstruction { | 4327 class HCompareHoleAndBranch FINAL : public HUnaryControlInstruction { |
| 4328 public: | 4328 public: |
| 4329 DECLARE_INSTRUCTION_FACTORY_P1(HCompareHoleAndBranch, HValue*); | 4329 DECLARE_INSTRUCTION_FACTORY_P1(HCompareHoleAndBranch, HValue*); |
| 4330 DECLARE_INSTRUCTION_FACTORY_P3(HCompareHoleAndBranch, HValue*, | 4330 DECLARE_INSTRUCTION_FACTORY_P3(HCompareHoleAndBranch, HValue*, |
| 4331 HBasicBlock*, HBasicBlock*); | 4331 HBasicBlock*, HBasicBlock*); |
| 4332 | 4332 |
| 4333 virtual void InferRepresentation( | 4333 virtual void InferRepresentation( |
| 4334 HInferRepresentationPhase* h_infer) V8_OVERRIDE; | 4334 HInferRepresentationPhase* h_infer) OVERRIDE; |
| 4335 | 4335 |
| 4336 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4336 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4337 return representation(); | 4337 return representation(); |
| 4338 } | 4338 } |
| 4339 | 4339 |
| 4340 DECLARE_CONCRETE_INSTRUCTION(CompareHoleAndBranch) | 4340 DECLARE_CONCRETE_INSTRUCTION(CompareHoleAndBranch) |
| 4341 | 4341 |
| 4342 private: | 4342 private: |
| 4343 HCompareHoleAndBranch(HValue* value, | 4343 HCompareHoleAndBranch(HValue* value, |
| 4344 HBasicBlock* true_target = NULL, | 4344 HBasicBlock* true_target = NULL, |
| 4345 HBasicBlock* false_target = NULL) | 4345 HBasicBlock* false_target = NULL) |
| 4346 : HUnaryControlInstruction(value, true_target, false_target) { | 4346 : HUnaryControlInstruction(value, true_target, false_target) { |
| 4347 SetFlag(kFlexibleRepresentation); | 4347 SetFlag(kFlexibleRepresentation); |
| 4348 SetFlag(kAllowUndefinedAsNaN); | 4348 SetFlag(kAllowUndefinedAsNaN); |
| 4349 } | 4349 } |
| 4350 }; | 4350 }; |
| 4351 | 4351 |
| 4352 | 4352 |
| 4353 class HCompareMinusZeroAndBranch V8_FINAL : public HUnaryControlInstruction { | 4353 class HCompareMinusZeroAndBranch FINAL : public HUnaryControlInstruction { |
| 4354 public: | 4354 public: |
| 4355 DECLARE_INSTRUCTION_FACTORY_P1(HCompareMinusZeroAndBranch, HValue*); | 4355 DECLARE_INSTRUCTION_FACTORY_P1(HCompareMinusZeroAndBranch, HValue*); |
| 4356 | 4356 |
| 4357 virtual void InferRepresentation( | 4357 virtual void InferRepresentation( |
| 4358 HInferRepresentationPhase* h_infer) V8_OVERRIDE; | 4358 HInferRepresentationPhase* h_infer) OVERRIDE; |
| 4359 | 4359 |
| 4360 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4360 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4361 return representation(); | 4361 return representation(); |
| 4362 } | 4362 } |
| 4363 | 4363 |
| 4364 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 4364 virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; |
| 4365 | 4365 |
| 4366 DECLARE_CONCRETE_INSTRUCTION(CompareMinusZeroAndBranch) | 4366 DECLARE_CONCRETE_INSTRUCTION(CompareMinusZeroAndBranch) |
| 4367 | 4367 |
| 4368 private: | 4368 private: |
| 4369 explicit HCompareMinusZeroAndBranch(HValue* value) | 4369 explicit HCompareMinusZeroAndBranch(HValue* value) |
| 4370 : HUnaryControlInstruction(value, NULL, NULL) { | 4370 : HUnaryControlInstruction(value, NULL, NULL) { |
| 4371 } | 4371 } |
| 4372 }; | 4372 }; |
| 4373 | 4373 |
| 4374 | 4374 |
| 4375 class HCompareObjectEqAndBranch : public HTemplateControlInstruction<2, 2> { | 4375 class HCompareObjectEqAndBranch : public HTemplateControlInstruction<2, 2> { |
| 4376 public: | 4376 public: |
| 4377 DECLARE_INSTRUCTION_FACTORY_P2(HCompareObjectEqAndBranch, HValue*, HValue*); | 4377 DECLARE_INSTRUCTION_FACTORY_P2(HCompareObjectEqAndBranch, HValue*, HValue*); |
| 4378 DECLARE_INSTRUCTION_FACTORY_P4(HCompareObjectEqAndBranch, HValue*, HValue*, | 4378 DECLARE_INSTRUCTION_FACTORY_P4(HCompareObjectEqAndBranch, HValue*, HValue*, |
| 4379 HBasicBlock*, HBasicBlock*); | 4379 HBasicBlock*, HBasicBlock*); |
| 4380 | 4380 |
| 4381 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 4381 virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; |
| 4382 | 4382 |
| 4383 static const int kNoKnownSuccessorIndex = -1; | 4383 static const int kNoKnownSuccessorIndex = -1; |
| 4384 int known_successor_index() const { return known_successor_index_; } | 4384 int known_successor_index() const { return known_successor_index_; } |
| 4385 void set_known_successor_index(int known_successor_index) { | 4385 void set_known_successor_index(int known_successor_index) { |
| 4386 known_successor_index_ = known_successor_index; | 4386 known_successor_index_ = known_successor_index; |
| 4387 } | 4387 } |
| 4388 | 4388 |
| 4389 HValue* left() const { return OperandAt(0); } | 4389 HValue* left() const { return OperandAt(0); } |
| 4390 HValue* right() const { return OperandAt(1); } | 4390 HValue* right() const { return OperandAt(1); } |
| 4391 | 4391 |
| 4392 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 4392 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 4393 | 4393 |
| 4394 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4394 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4395 return Representation::Tagged(); | 4395 return Representation::Tagged(); |
| 4396 } | 4396 } |
| 4397 | 4397 |
| 4398 virtual Representation observed_input_representation(int index) V8_OVERRIDE { | 4398 virtual Representation observed_input_representation(int index) OVERRIDE { |
| 4399 return Representation::Tagged(); | 4399 return Representation::Tagged(); |
| 4400 } | 4400 } |
| 4401 | 4401 |
| 4402 DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch) | 4402 DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch) |
| 4403 | 4403 |
| 4404 private: | 4404 private: |
| 4405 HCompareObjectEqAndBranch(HValue* left, | 4405 HCompareObjectEqAndBranch(HValue* left, |
| 4406 HValue* right, | 4406 HValue* right, |
| 4407 HBasicBlock* true_target = NULL, | 4407 HBasicBlock* true_target = NULL, |
| 4408 HBasicBlock* false_target = NULL) | 4408 HBasicBlock* false_target = NULL) |
| 4409 : known_successor_index_(kNoKnownSuccessorIndex) { | 4409 : known_successor_index_(kNoKnownSuccessorIndex) { |
| 4410 SetOperandAt(0, left); | 4410 SetOperandAt(0, left); |
| 4411 SetOperandAt(1, right); | 4411 SetOperandAt(1, right); |
| 4412 SetSuccessorAt(0, true_target); | 4412 SetSuccessorAt(0, true_target); |
| 4413 SetSuccessorAt(1, false_target); | 4413 SetSuccessorAt(1, false_target); |
| 4414 } | 4414 } |
| 4415 | 4415 |
| 4416 int known_successor_index_; | 4416 int known_successor_index_; |
| 4417 }; | 4417 }; |
| 4418 | 4418 |
| 4419 | 4419 |
| 4420 class HIsObjectAndBranch V8_FINAL : public HUnaryControlInstruction { | 4420 class HIsObjectAndBranch FINAL : public HUnaryControlInstruction { |
| 4421 public: | 4421 public: |
| 4422 DECLARE_INSTRUCTION_FACTORY_P1(HIsObjectAndBranch, HValue*); | 4422 DECLARE_INSTRUCTION_FACTORY_P1(HIsObjectAndBranch, HValue*); |
| 4423 DECLARE_INSTRUCTION_FACTORY_P3(HIsObjectAndBranch, HValue*, | 4423 DECLARE_INSTRUCTION_FACTORY_P3(HIsObjectAndBranch, HValue*, |
| 4424 HBasicBlock*, HBasicBlock*); | 4424 HBasicBlock*, HBasicBlock*); |
| 4425 | 4425 |
| 4426 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4426 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4427 return Representation::Tagged(); | 4427 return Representation::Tagged(); |
| 4428 } | 4428 } |
| 4429 | 4429 |
| 4430 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 4430 virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; |
| 4431 | 4431 |
| 4432 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch) | 4432 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch) |
| 4433 | 4433 |
| 4434 private: | 4434 private: |
| 4435 HIsObjectAndBranch(HValue* value, | 4435 HIsObjectAndBranch(HValue* value, |
| 4436 HBasicBlock* true_target = NULL, | 4436 HBasicBlock* true_target = NULL, |
| 4437 HBasicBlock* false_target = NULL) | 4437 HBasicBlock* false_target = NULL) |
| 4438 : HUnaryControlInstruction(value, true_target, false_target) {} | 4438 : HUnaryControlInstruction(value, true_target, false_target) {} |
| 4439 }; | 4439 }; |
| 4440 | 4440 |
| 4441 | 4441 |
| 4442 class HIsStringAndBranch V8_FINAL : public HUnaryControlInstruction { | 4442 class HIsStringAndBranch FINAL : public HUnaryControlInstruction { |
| 4443 public: | 4443 public: |
| 4444 DECLARE_INSTRUCTION_FACTORY_P1(HIsStringAndBranch, HValue*); | 4444 DECLARE_INSTRUCTION_FACTORY_P1(HIsStringAndBranch, HValue*); |
| 4445 DECLARE_INSTRUCTION_FACTORY_P3(HIsStringAndBranch, HValue*, | 4445 DECLARE_INSTRUCTION_FACTORY_P3(HIsStringAndBranch, HValue*, |
| 4446 HBasicBlock*, HBasicBlock*); | 4446 HBasicBlock*, HBasicBlock*); |
| 4447 | 4447 |
| 4448 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4448 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4449 return Representation::Tagged(); | 4449 return Representation::Tagged(); |
| 4450 } | 4450 } |
| 4451 | 4451 |
| 4452 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 4452 virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; |
| 4453 | 4453 |
| 4454 static const int kNoKnownSuccessorIndex = -1; | 4454 static const int kNoKnownSuccessorIndex = -1; |
| 4455 int known_successor_index() const { return known_successor_index_; } | 4455 int known_successor_index() const { return known_successor_index_; } |
| 4456 void set_known_successor_index(int known_successor_index) { | 4456 void set_known_successor_index(int known_successor_index) { |
| 4457 known_successor_index_ = known_successor_index; | 4457 known_successor_index_ = known_successor_index; |
| 4458 } | 4458 } |
| 4459 | 4459 |
| 4460 DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch) | 4460 DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch) |
| 4461 | 4461 |
| 4462 protected: | 4462 protected: |
| 4463 virtual int RedefinedOperandIndex() { return 0; } | 4463 virtual int RedefinedOperandIndex() { return 0; } |
| 4464 | 4464 |
| 4465 private: | 4465 private: |
| 4466 HIsStringAndBranch(HValue* value, | 4466 HIsStringAndBranch(HValue* value, |
| 4467 HBasicBlock* true_target = NULL, | 4467 HBasicBlock* true_target = NULL, |
| 4468 HBasicBlock* false_target = NULL) | 4468 HBasicBlock* false_target = NULL) |
| 4469 : HUnaryControlInstruction(value, true_target, false_target), | 4469 : HUnaryControlInstruction(value, true_target, false_target), |
| 4470 known_successor_index_(kNoKnownSuccessorIndex) { } | 4470 known_successor_index_(kNoKnownSuccessorIndex) { } |
| 4471 | 4471 |
| 4472 int known_successor_index_; | 4472 int known_successor_index_; |
| 4473 }; | 4473 }; |
| 4474 | 4474 |
| 4475 | 4475 |
| 4476 class HIsSmiAndBranch V8_FINAL : public HUnaryControlInstruction { | 4476 class HIsSmiAndBranch FINAL : public HUnaryControlInstruction { |
| 4477 public: | 4477 public: |
| 4478 DECLARE_INSTRUCTION_FACTORY_P1(HIsSmiAndBranch, HValue*); | 4478 DECLARE_INSTRUCTION_FACTORY_P1(HIsSmiAndBranch, HValue*); |
| 4479 DECLARE_INSTRUCTION_FACTORY_P3(HIsSmiAndBranch, HValue*, | 4479 DECLARE_INSTRUCTION_FACTORY_P3(HIsSmiAndBranch, HValue*, |
| 4480 HBasicBlock*, HBasicBlock*); | 4480 HBasicBlock*, HBasicBlock*); |
| 4481 | 4481 |
| 4482 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch) | 4482 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch) |
| 4483 | 4483 |
| 4484 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4484 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4485 return Representation::Tagged(); | 4485 return Representation::Tagged(); |
| 4486 } | 4486 } |
| 4487 | 4487 |
| 4488 protected: | 4488 protected: |
| 4489 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 4489 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 4490 virtual int RedefinedOperandIndex() { return 0; } | 4490 virtual int RedefinedOperandIndex() { return 0; } |
| 4491 | 4491 |
| 4492 private: | 4492 private: |
| 4493 HIsSmiAndBranch(HValue* value, | 4493 HIsSmiAndBranch(HValue* value, |
| 4494 HBasicBlock* true_target = NULL, | 4494 HBasicBlock* true_target = NULL, |
| 4495 HBasicBlock* false_target = NULL) | 4495 HBasicBlock* false_target = NULL) |
| 4496 : HUnaryControlInstruction(value, true_target, false_target) { | 4496 : HUnaryControlInstruction(value, true_target, false_target) { |
| 4497 set_representation(Representation::Tagged()); | 4497 set_representation(Representation::Tagged()); |
| 4498 } | 4498 } |
| 4499 }; | 4499 }; |
| 4500 | 4500 |
| 4501 | 4501 |
| 4502 class HIsUndetectableAndBranch V8_FINAL : public HUnaryControlInstruction { | 4502 class HIsUndetectableAndBranch FINAL : public HUnaryControlInstruction { |
| 4503 public: | 4503 public: |
| 4504 DECLARE_INSTRUCTION_FACTORY_P1(HIsUndetectableAndBranch, HValue*); | 4504 DECLARE_INSTRUCTION_FACTORY_P1(HIsUndetectableAndBranch, HValue*); |
| 4505 DECLARE_INSTRUCTION_FACTORY_P3(HIsUndetectableAndBranch, HValue*, | 4505 DECLARE_INSTRUCTION_FACTORY_P3(HIsUndetectableAndBranch, HValue*, |
| 4506 HBasicBlock*, HBasicBlock*); | 4506 HBasicBlock*, HBasicBlock*); |
| 4507 | 4507 |
| 4508 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4508 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4509 return Representation::Tagged(); | 4509 return Representation::Tagged(); |
| 4510 } | 4510 } |
| 4511 | 4511 |
| 4512 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 4512 virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; |
| 4513 | 4513 |
| 4514 DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch) | 4514 DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch) |
| 4515 | 4515 |
| 4516 private: | 4516 private: |
| 4517 HIsUndetectableAndBranch(HValue* value, | 4517 HIsUndetectableAndBranch(HValue* value, |
| 4518 HBasicBlock* true_target = NULL, | 4518 HBasicBlock* true_target = NULL, |
| 4519 HBasicBlock* false_target = NULL) | 4519 HBasicBlock* false_target = NULL) |
| 4520 : HUnaryControlInstruction(value, true_target, false_target) {} | 4520 : HUnaryControlInstruction(value, true_target, false_target) {} |
| 4521 }; | 4521 }; |
| 4522 | 4522 |
| 4523 | 4523 |
| 4524 class HStringCompareAndBranch : public HTemplateControlInstruction<2, 3> { | 4524 class HStringCompareAndBranch : public HTemplateControlInstruction<2, 3> { |
| 4525 public: | 4525 public: |
| 4526 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HStringCompareAndBranch, | 4526 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HStringCompareAndBranch, |
| 4527 HValue*, | 4527 HValue*, |
| 4528 HValue*, | 4528 HValue*, |
| 4529 Token::Value); | 4529 Token::Value); |
| 4530 | 4530 |
| 4531 HValue* context() { return OperandAt(0); } | 4531 HValue* context() { return OperandAt(0); } |
| 4532 HValue* left() { return OperandAt(1); } | 4532 HValue* left() { return OperandAt(1); } |
| 4533 HValue* right() { return OperandAt(2); } | 4533 HValue* right() { return OperandAt(2); } |
| 4534 Token::Value token() const { return token_; } | 4534 Token::Value token() const { return token_; } |
| 4535 | 4535 |
| 4536 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 4536 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 4537 | 4537 |
| 4538 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4538 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4539 return Representation::Tagged(); | 4539 return Representation::Tagged(); |
| 4540 } | 4540 } |
| 4541 | 4541 |
| 4542 Representation GetInputRepresentation() const { | 4542 Representation GetInputRepresentation() const { |
| 4543 return Representation::Tagged(); | 4543 return Representation::Tagged(); |
| 4544 } | 4544 } |
| 4545 | 4545 |
| 4546 DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch) | 4546 DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch) |
| 4547 | 4547 |
| 4548 private: | 4548 private: |
| (...skipping 11 matching lines...) Expand all Loading... |
| 4560 } | 4560 } |
| 4561 | 4561 |
| 4562 Token::Value token_; | 4562 Token::Value token_; |
| 4563 }; | 4563 }; |
| 4564 | 4564 |
| 4565 | 4565 |
| 4566 class HIsConstructCallAndBranch : public HTemplateControlInstruction<2, 0> { | 4566 class HIsConstructCallAndBranch : public HTemplateControlInstruction<2, 0> { |
| 4567 public: | 4567 public: |
| 4568 DECLARE_INSTRUCTION_FACTORY_P0(HIsConstructCallAndBranch); | 4568 DECLARE_INSTRUCTION_FACTORY_P0(HIsConstructCallAndBranch); |
| 4569 | 4569 |
| 4570 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4570 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4571 return Representation::None(); | 4571 return Representation::None(); |
| 4572 } | 4572 } |
| 4573 | 4573 |
| 4574 DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch) | 4574 DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch) |
| 4575 private: | 4575 private: |
| 4576 HIsConstructCallAndBranch() {} | 4576 HIsConstructCallAndBranch() {} |
| 4577 }; | 4577 }; |
| 4578 | 4578 |
| 4579 | 4579 |
| 4580 class HHasInstanceTypeAndBranch V8_FINAL : public HUnaryControlInstruction { | 4580 class HHasInstanceTypeAndBranch FINAL : public HUnaryControlInstruction { |
| 4581 public: | 4581 public: |
| 4582 DECLARE_INSTRUCTION_FACTORY_P2( | 4582 DECLARE_INSTRUCTION_FACTORY_P2( |
| 4583 HHasInstanceTypeAndBranch, HValue*, InstanceType); | 4583 HHasInstanceTypeAndBranch, HValue*, InstanceType); |
| 4584 DECLARE_INSTRUCTION_FACTORY_P3( | 4584 DECLARE_INSTRUCTION_FACTORY_P3( |
| 4585 HHasInstanceTypeAndBranch, HValue*, InstanceType, InstanceType); | 4585 HHasInstanceTypeAndBranch, HValue*, InstanceType, InstanceType); |
| 4586 | 4586 |
| 4587 InstanceType from() { return from_; } | 4587 InstanceType from() { return from_; } |
| 4588 InstanceType to() { return to_; } | 4588 InstanceType to() { return to_; } |
| 4589 | 4589 |
| 4590 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 4590 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 4591 | 4591 |
| 4592 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4592 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4593 return Representation::Tagged(); | 4593 return Representation::Tagged(); |
| 4594 } | 4594 } |
| 4595 | 4595 |
| 4596 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 4596 virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; |
| 4597 | 4597 |
| 4598 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch) | 4598 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch) |
| 4599 | 4599 |
| 4600 private: | 4600 private: |
| 4601 HHasInstanceTypeAndBranch(HValue* value, InstanceType type) | 4601 HHasInstanceTypeAndBranch(HValue* value, InstanceType type) |
| 4602 : HUnaryControlInstruction(value, NULL, NULL), from_(type), to_(type) { } | 4602 : HUnaryControlInstruction(value, NULL, NULL), from_(type), to_(type) { } |
| 4603 HHasInstanceTypeAndBranch(HValue* value, InstanceType from, InstanceType to) | 4603 HHasInstanceTypeAndBranch(HValue* value, InstanceType from, InstanceType to) |
| 4604 : HUnaryControlInstruction(value, NULL, NULL), from_(from), to_(to) { | 4604 : HUnaryControlInstruction(value, NULL, NULL), from_(from), to_(to) { |
| 4605 DCHECK(to == LAST_TYPE); // Others not implemented yet in backend. | 4605 DCHECK(to == LAST_TYPE); // Others not implemented yet in backend. |
| 4606 } | 4606 } |
| 4607 | 4607 |
| 4608 InstanceType from_; | 4608 InstanceType from_; |
| 4609 InstanceType to_; // Inclusive range, not all combinations work. | 4609 InstanceType to_; // Inclusive range, not all combinations work. |
| 4610 }; | 4610 }; |
| 4611 | 4611 |
| 4612 | 4612 |
| 4613 class HHasCachedArrayIndexAndBranch V8_FINAL : public HUnaryControlInstruction { | 4613 class HHasCachedArrayIndexAndBranch FINAL : public HUnaryControlInstruction { |
| 4614 public: | 4614 public: |
| 4615 DECLARE_INSTRUCTION_FACTORY_P1(HHasCachedArrayIndexAndBranch, HValue*); | 4615 DECLARE_INSTRUCTION_FACTORY_P1(HHasCachedArrayIndexAndBranch, HValue*); |
| 4616 | 4616 |
| 4617 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4617 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4618 return Representation::Tagged(); | 4618 return Representation::Tagged(); |
| 4619 } | 4619 } |
| 4620 | 4620 |
| 4621 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch) | 4621 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch) |
| 4622 private: | 4622 private: |
| 4623 explicit HHasCachedArrayIndexAndBranch(HValue* value) | 4623 explicit HHasCachedArrayIndexAndBranch(HValue* value) |
| 4624 : HUnaryControlInstruction(value, NULL, NULL) { } | 4624 : HUnaryControlInstruction(value, NULL, NULL) { } |
| 4625 }; | 4625 }; |
| 4626 | 4626 |
| 4627 | 4627 |
| 4628 class HGetCachedArrayIndex V8_FINAL : public HUnaryOperation { | 4628 class HGetCachedArrayIndex FINAL : public HUnaryOperation { |
| 4629 public: | 4629 public: |
| 4630 DECLARE_INSTRUCTION_FACTORY_P1(HGetCachedArrayIndex, HValue*); | 4630 DECLARE_INSTRUCTION_FACTORY_P1(HGetCachedArrayIndex, HValue*); |
| 4631 | 4631 |
| 4632 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4632 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4633 return Representation::Tagged(); | 4633 return Representation::Tagged(); |
| 4634 } | 4634 } |
| 4635 | 4635 |
| 4636 DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex) | 4636 DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex) |
| 4637 | 4637 |
| 4638 protected: | 4638 protected: |
| 4639 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 4639 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 4640 | 4640 |
| 4641 private: | 4641 private: |
| 4642 explicit HGetCachedArrayIndex(HValue* value) : HUnaryOperation(value) { | 4642 explicit HGetCachedArrayIndex(HValue* value) : HUnaryOperation(value) { |
| 4643 set_representation(Representation::Tagged()); | 4643 set_representation(Representation::Tagged()); |
| 4644 SetFlag(kUseGVN); | 4644 SetFlag(kUseGVN); |
| 4645 } | 4645 } |
| 4646 | 4646 |
| 4647 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 4647 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 4648 }; | 4648 }; |
| 4649 | 4649 |
| 4650 | 4650 |
| 4651 class HClassOfTestAndBranch V8_FINAL : public HUnaryControlInstruction { | 4651 class HClassOfTestAndBranch FINAL : public HUnaryControlInstruction { |
| 4652 public: | 4652 public: |
| 4653 DECLARE_INSTRUCTION_FACTORY_P2(HClassOfTestAndBranch, HValue*, | 4653 DECLARE_INSTRUCTION_FACTORY_P2(HClassOfTestAndBranch, HValue*, |
| 4654 Handle<String>); | 4654 Handle<String>); |
| 4655 | 4655 |
| 4656 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch) | 4656 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch) |
| 4657 | 4657 |
| 4658 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4658 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4659 return Representation::Tagged(); | 4659 return Representation::Tagged(); |
| 4660 } | 4660 } |
| 4661 | 4661 |
| 4662 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 4662 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 4663 | 4663 |
| 4664 Handle<String> class_name() const { return class_name_; } | 4664 Handle<String> class_name() const { return class_name_; } |
| 4665 | 4665 |
| 4666 private: | 4666 private: |
| 4667 HClassOfTestAndBranch(HValue* value, Handle<String> class_name) | 4667 HClassOfTestAndBranch(HValue* value, Handle<String> class_name) |
| 4668 : HUnaryControlInstruction(value, NULL, NULL), | 4668 : HUnaryControlInstruction(value, NULL, NULL), |
| 4669 class_name_(class_name) { } | 4669 class_name_(class_name) { } |
| 4670 | 4670 |
| 4671 Handle<String> class_name_; | 4671 Handle<String> class_name_; |
| 4672 }; | 4672 }; |
| 4673 | 4673 |
| 4674 | 4674 |
| 4675 class HTypeofIsAndBranch V8_FINAL : public HUnaryControlInstruction { | 4675 class HTypeofIsAndBranch FINAL : public HUnaryControlInstruction { |
| 4676 public: | 4676 public: |
| 4677 DECLARE_INSTRUCTION_FACTORY_P2(HTypeofIsAndBranch, HValue*, Handle<String>); | 4677 DECLARE_INSTRUCTION_FACTORY_P2(HTypeofIsAndBranch, HValue*, Handle<String>); |
| 4678 | 4678 |
| 4679 Handle<String> type_literal() const { return type_literal_.handle(); } | 4679 Handle<String> type_literal() const { return type_literal_.handle(); } |
| 4680 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 4680 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 4681 | 4681 |
| 4682 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch) | 4682 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch) |
| 4683 | 4683 |
| 4684 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4684 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4685 return Representation::None(); | 4685 return Representation::None(); |
| 4686 } | 4686 } |
| 4687 | 4687 |
| 4688 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 4688 virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; |
| 4689 | 4689 |
| 4690 virtual void FinalizeUniqueness() V8_OVERRIDE { | 4690 virtual void FinalizeUniqueness() OVERRIDE { |
| 4691 type_literal_ = Unique<String>(type_literal_.handle()); | 4691 type_literal_ = Unique<String>(type_literal_.handle()); |
| 4692 } | 4692 } |
| 4693 | 4693 |
| 4694 private: | 4694 private: |
| 4695 HTypeofIsAndBranch(HValue* value, Handle<String> type_literal) | 4695 HTypeofIsAndBranch(HValue* value, Handle<String> type_literal) |
| 4696 : HUnaryControlInstruction(value, NULL, NULL), | 4696 : HUnaryControlInstruction(value, NULL, NULL), |
| 4697 type_literal_(Unique<String>::CreateUninitialized(type_literal)) { } | 4697 type_literal_(Unique<String>::CreateUninitialized(type_literal)) { } |
| 4698 | 4698 |
| 4699 Unique<String> type_literal_; | 4699 Unique<String> type_literal_; |
| 4700 }; | 4700 }; |
| 4701 | 4701 |
| 4702 | 4702 |
| 4703 class HInstanceOf V8_FINAL : public HBinaryOperation { | 4703 class HInstanceOf FINAL : public HBinaryOperation { |
| 4704 public: | 4704 public: |
| 4705 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInstanceOf, HValue*, HValue*); | 4705 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInstanceOf, HValue*, HValue*); |
| 4706 | 4706 |
| 4707 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4707 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4708 return Representation::Tagged(); | 4708 return Representation::Tagged(); |
| 4709 } | 4709 } |
| 4710 | 4710 |
| 4711 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 4711 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 4712 | 4712 |
| 4713 DECLARE_CONCRETE_INSTRUCTION(InstanceOf) | 4713 DECLARE_CONCRETE_INSTRUCTION(InstanceOf) |
| 4714 | 4714 |
| 4715 private: | 4715 private: |
| 4716 HInstanceOf(HValue* context, HValue* left, HValue* right) | 4716 HInstanceOf(HValue* context, HValue* left, HValue* right) |
| 4717 : HBinaryOperation(context, left, right, HType::Boolean()) { | 4717 : HBinaryOperation(context, left, right, HType::Boolean()) { |
| 4718 set_representation(Representation::Tagged()); | 4718 set_representation(Representation::Tagged()); |
| 4719 SetAllSideEffects(); | 4719 SetAllSideEffects(); |
| 4720 } | 4720 } |
| 4721 }; | 4721 }; |
| 4722 | 4722 |
| 4723 | 4723 |
| 4724 class HInstanceOfKnownGlobal V8_FINAL : public HTemplateInstruction<2> { | 4724 class HInstanceOfKnownGlobal FINAL : public HTemplateInstruction<2> { |
| 4725 public: | 4725 public: |
| 4726 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInstanceOfKnownGlobal, | 4726 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInstanceOfKnownGlobal, |
| 4727 HValue*, | 4727 HValue*, |
| 4728 Handle<JSFunction>); | 4728 Handle<JSFunction>); |
| 4729 | 4729 |
| 4730 HValue* context() { return OperandAt(0); } | 4730 HValue* context() { return OperandAt(0); } |
| 4731 HValue* left() { return OperandAt(1); } | 4731 HValue* left() { return OperandAt(1); } |
| 4732 Handle<JSFunction> function() { return function_; } | 4732 Handle<JSFunction> function() { return function_; } |
| 4733 | 4733 |
| 4734 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4734 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4735 return Representation::Tagged(); | 4735 return Representation::Tagged(); |
| 4736 } | 4736 } |
| 4737 | 4737 |
| 4738 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal) | 4738 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal) |
| 4739 | 4739 |
| 4740 private: | 4740 private: |
| 4741 HInstanceOfKnownGlobal(HValue* context, | 4741 HInstanceOfKnownGlobal(HValue* context, |
| 4742 HValue* left, | 4742 HValue* left, |
| 4743 Handle<JSFunction> right) | 4743 Handle<JSFunction> right) |
| 4744 : HTemplateInstruction<2>(HType::Boolean()), function_(right) { | 4744 : HTemplateInstruction<2>(HType::Boolean()), function_(right) { |
| 4745 SetOperandAt(0, context); | 4745 SetOperandAt(0, context); |
| 4746 SetOperandAt(1, left); | 4746 SetOperandAt(1, left); |
| 4747 set_representation(Representation::Tagged()); | 4747 set_representation(Representation::Tagged()); |
| 4748 SetAllSideEffects(); | 4748 SetAllSideEffects(); |
| 4749 } | 4749 } |
| 4750 | 4750 |
| 4751 Handle<JSFunction> function_; | 4751 Handle<JSFunction> function_; |
| 4752 }; | 4752 }; |
| 4753 | 4753 |
| 4754 | 4754 |
| 4755 class HPower V8_FINAL : public HTemplateInstruction<2> { | 4755 class HPower FINAL : public HTemplateInstruction<2> { |
| 4756 public: | 4756 public: |
| 4757 static HInstruction* New(Zone* zone, | 4757 static HInstruction* New(Zone* zone, |
| 4758 HValue* context, | 4758 HValue* context, |
| 4759 HValue* left, | 4759 HValue* left, |
| 4760 HValue* right); | 4760 HValue* right); |
| 4761 | 4761 |
| 4762 HValue* left() { return OperandAt(0); } | 4762 HValue* left() { return OperandAt(0); } |
| 4763 HValue* right() const { return OperandAt(1); } | 4763 HValue* right() const { return OperandAt(1); } |
| 4764 | 4764 |
| 4765 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 4765 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 4766 return index == 0 | 4766 return index == 0 |
| 4767 ? Representation::Double() | 4767 ? Representation::Double() |
| 4768 : Representation::None(); | 4768 : Representation::None(); |
| 4769 } | 4769 } |
| 4770 virtual Representation observed_input_representation(int index) V8_OVERRIDE { | 4770 virtual Representation observed_input_representation(int index) OVERRIDE { |
| 4771 return RequiredInputRepresentation(index); | 4771 return RequiredInputRepresentation(index); |
| 4772 } | 4772 } |
| 4773 | 4773 |
| 4774 DECLARE_CONCRETE_INSTRUCTION(Power) | 4774 DECLARE_CONCRETE_INSTRUCTION(Power) |
| 4775 | 4775 |
| 4776 protected: | 4776 protected: |
| 4777 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 4777 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 4778 | 4778 |
| 4779 private: | 4779 private: |
| 4780 HPower(HValue* left, HValue* right) { | 4780 HPower(HValue* left, HValue* right) { |
| 4781 SetOperandAt(0, left); | 4781 SetOperandAt(0, left); |
| 4782 SetOperandAt(1, right); | 4782 SetOperandAt(1, right); |
| 4783 set_representation(Representation::Double()); | 4783 set_representation(Representation::Double()); |
| 4784 SetFlag(kUseGVN); | 4784 SetFlag(kUseGVN); |
| 4785 SetChangesFlag(kNewSpacePromotion); | 4785 SetChangesFlag(kNewSpacePromotion); |
| 4786 } | 4786 } |
| 4787 | 4787 |
| 4788 virtual bool IsDeletable() const V8_OVERRIDE { | 4788 virtual bool IsDeletable() const OVERRIDE { |
| 4789 return !right()->representation().IsTagged(); | 4789 return !right()->representation().IsTagged(); |
| 4790 } | 4790 } |
| 4791 }; | 4791 }; |
| 4792 | 4792 |
| 4793 | 4793 |
| 4794 class HAdd V8_FINAL : public HArithmeticBinaryOperation { | 4794 class HAdd FINAL : public HArithmeticBinaryOperation { |
| 4795 public: | 4795 public: |
| 4796 static HInstruction* New(Zone* zone, | 4796 static HInstruction* New(Zone* zone, |
| 4797 HValue* context, | 4797 HValue* context, |
| 4798 HValue* left, | 4798 HValue* left, |
| 4799 HValue* right); | 4799 HValue* right); |
| 4800 | 4800 |
| 4801 // Add is only commutative if two integer values are added and not if two | 4801 // Add is only commutative if two integer values are added and not if two |
| 4802 // tagged values are added (because it might be a String concatenation). | 4802 // tagged values are added (because it might be a String concatenation). |
| 4803 // We also do not commute (pointer + offset). | 4803 // We also do not commute (pointer + offset). |
| 4804 virtual bool IsCommutative() const V8_OVERRIDE { | 4804 virtual bool IsCommutative() const OVERRIDE { |
| 4805 return !representation().IsTagged() && !representation().IsExternal(); | 4805 return !representation().IsTagged() && !representation().IsExternal(); |
| 4806 } | 4806 } |
| 4807 | 4807 |
| 4808 virtual HValue* Canonicalize() V8_OVERRIDE; | 4808 virtual HValue* Canonicalize() OVERRIDE; |
| 4809 | 4809 |
| 4810 virtual bool TryDecompose(DecompositionResult* decomposition) V8_OVERRIDE { | 4810 virtual bool TryDecompose(DecompositionResult* decomposition) OVERRIDE { |
| 4811 if (left()->IsInteger32Constant()) { | 4811 if (left()->IsInteger32Constant()) { |
| 4812 decomposition->Apply(right(), left()->GetInteger32Constant()); | 4812 decomposition->Apply(right(), left()->GetInteger32Constant()); |
| 4813 return true; | 4813 return true; |
| 4814 } else if (right()->IsInteger32Constant()) { | 4814 } else if (right()->IsInteger32Constant()) { |
| 4815 decomposition->Apply(left(), right()->GetInteger32Constant()); | 4815 decomposition->Apply(left(), right()->GetInteger32Constant()); |
| 4816 return true; | 4816 return true; |
| 4817 } else { | 4817 } else { |
| 4818 return false; | 4818 return false; |
| 4819 } | 4819 } |
| 4820 } | 4820 } |
| 4821 | 4821 |
| 4822 virtual void RepresentationChanged(Representation to) V8_OVERRIDE { | 4822 virtual void RepresentationChanged(Representation to) OVERRIDE { |
| 4823 if (to.IsTagged() && | 4823 if (to.IsTagged() && |
| 4824 (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved() || | 4824 (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved() || |
| 4825 left()->ToStringCanBeObserved() || right()->ToStringCanBeObserved())) { | 4825 left()->ToStringCanBeObserved() || right()->ToStringCanBeObserved())) { |
| 4826 SetAllSideEffects(); | 4826 SetAllSideEffects(); |
| 4827 ClearFlag(kUseGVN); | 4827 ClearFlag(kUseGVN); |
| 4828 } else { | 4828 } else { |
| 4829 ClearAllSideEffects(); | 4829 ClearAllSideEffects(); |
| 4830 SetFlag(kUseGVN); | 4830 SetFlag(kUseGVN); |
| 4831 } | 4831 } |
| 4832 if (to.IsTagged()) { | 4832 if (to.IsTagged()) { |
| 4833 SetChangesFlag(kNewSpacePromotion); | 4833 SetChangesFlag(kNewSpacePromotion); |
| 4834 ClearFlag(kAllowUndefinedAsNaN); | 4834 ClearFlag(kAllowUndefinedAsNaN); |
| 4835 } | 4835 } |
| 4836 } | 4836 } |
| 4837 | 4837 |
| 4838 virtual Representation RepresentationFromInputs() V8_OVERRIDE; | 4838 virtual Representation RepresentationFromInputs() OVERRIDE; |
| 4839 | 4839 |
| 4840 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE; | 4840 virtual Representation RequiredInputRepresentation(int index) OVERRIDE; |
| 4841 | 4841 |
| 4842 DECLARE_CONCRETE_INSTRUCTION(Add) | 4842 DECLARE_CONCRETE_INSTRUCTION(Add) |
| 4843 | 4843 |
| 4844 protected: | 4844 protected: |
| 4845 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 4845 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 4846 | 4846 |
| 4847 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 4847 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 4848 | 4848 |
| 4849 private: | 4849 private: |
| 4850 HAdd(HValue* context, HValue* left, HValue* right) | 4850 HAdd(HValue* context, HValue* left, HValue* right) |
| 4851 : HArithmeticBinaryOperation(context, left, right) { | 4851 : HArithmeticBinaryOperation(context, left, right) { |
| 4852 SetFlag(kCanOverflow); | 4852 SetFlag(kCanOverflow); |
| 4853 } | 4853 } |
| 4854 }; | 4854 }; |
| 4855 | 4855 |
| 4856 | 4856 |
| 4857 class HSub V8_FINAL : public HArithmeticBinaryOperation { | 4857 class HSub FINAL : public HArithmeticBinaryOperation { |
| 4858 public: | 4858 public: |
| 4859 static HInstruction* New(Zone* zone, | 4859 static HInstruction* New(Zone* zone, |
| 4860 HValue* context, | 4860 HValue* context, |
| 4861 HValue* left, | 4861 HValue* left, |
| 4862 HValue* right); | 4862 HValue* right); |
| 4863 | 4863 |
| 4864 virtual HValue* Canonicalize() V8_OVERRIDE; | 4864 virtual HValue* Canonicalize() OVERRIDE; |
| 4865 | 4865 |
| 4866 virtual bool TryDecompose(DecompositionResult* decomposition) V8_OVERRIDE { | 4866 virtual bool TryDecompose(DecompositionResult* decomposition) OVERRIDE { |
| 4867 if (right()->IsInteger32Constant()) { | 4867 if (right()->IsInteger32Constant()) { |
| 4868 decomposition->Apply(left(), -right()->GetInteger32Constant()); | 4868 decomposition->Apply(left(), -right()->GetInteger32Constant()); |
| 4869 return true; | 4869 return true; |
| 4870 } else { | 4870 } else { |
| 4871 return false; | 4871 return false; |
| 4872 } | 4872 } |
| 4873 } | 4873 } |
| 4874 | 4874 |
| 4875 DECLARE_CONCRETE_INSTRUCTION(Sub) | 4875 DECLARE_CONCRETE_INSTRUCTION(Sub) |
| 4876 | 4876 |
| 4877 protected: | 4877 protected: |
| 4878 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 4878 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 4879 | 4879 |
| 4880 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 4880 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 4881 | 4881 |
| 4882 private: | 4882 private: |
| 4883 HSub(HValue* context, HValue* left, HValue* right) | 4883 HSub(HValue* context, HValue* left, HValue* right) |
| 4884 : HArithmeticBinaryOperation(context, left, right) { | 4884 : HArithmeticBinaryOperation(context, left, right) { |
| 4885 SetFlag(kCanOverflow); | 4885 SetFlag(kCanOverflow); |
| 4886 } | 4886 } |
| 4887 }; | 4887 }; |
| 4888 | 4888 |
| 4889 | 4889 |
| 4890 class HMul V8_FINAL : public HArithmeticBinaryOperation { | 4890 class HMul FINAL : public HArithmeticBinaryOperation { |
| 4891 public: | 4891 public: |
| 4892 static HInstruction* New(Zone* zone, | 4892 static HInstruction* New(Zone* zone, |
| 4893 HValue* context, | 4893 HValue* context, |
| 4894 HValue* left, | 4894 HValue* left, |
| 4895 HValue* right); | 4895 HValue* right); |
| 4896 | 4896 |
| 4897 static HInstruction* NewImul(Zone* zone, | 4897 static HInstruction* NewImul(Zone* zone, |
| 4898 HValue* context, | 4898 HValue* context, |
| 4899 HValue* left, | 4899 HValue* left, |
| 4900 HValue* right) { | 4900 HValue* right) { |
| 4901 HInstruction* instr = HMul::New(zone, context, left, right); | 4901 HInstruction* instr = HMul::New(zone, context, left, right); |
| 4902 if (!instr->IsMul()) return instr; | 4902 if (!instr->IsMul()) return instr; |
| 4903 HMul* mul = HMul::cast(instr); | 4903 HMul* mul = HMul::cast(instr); |
| 4904 // TODO(mstarzinger): Prevent bailout on minus zero for imul. | 4904 // TODO(mstarzinger): Prevent bailout on minus zero for imul. |
| 4905 mul->AssumeRepresentation(Representation::Integer32()); | 4905 mul->AssumeRepresentation(Representation::Integer32()); |
| 4906 mul->ClearFlag(HValue::kCanOverflow); | 4906 mul->ClearFlag(HValue::kCanOverflow); |
| 4907 return mul; | 4907 return mul; |
| 4908 } | 4908 } |
| 4909 | 4909 |
| 4910 virtual HValue* Canonicalize() V8_OVERRIDE; | 4910 virtual HValue* Canonicalize() OVERRIDE; |
| 4911 | 4911 |
| 4912 // Only commutative if it is certain that not two objects are multiplicated. | 4912 // Only commutative if it is certain that not two objects are multiplicated. |
| 4913 virtual bool IsCommutative() const V8_OVERRIDE { | 4913 virtual bool IsCommutative() const OVERRIDE { |
| 4914 return !representation().IsTagged(); | 4914 return !representation().IsTagged(); |
| 4915 } | 4915 } |
| 4916 | 4916 |
| 4917 virtual void UpdateRepresentation(Representation new_rep, | 4917 virtual void UpdateRepresentation(Representation new_rep, |
| 4918 HInferRepresentationPhase* h_infer, | 4918 HInferRepresentationPhase* h_infer, |
| 4919 const char* reason) V8_OVERRIDE { | 4919 const char* reason) OVERRIDE { |
| 4920 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); | 4920 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); |
| 4921 } | 4921 } |
| 4922 | 4922 |
| 4923 bool MulMinusOne(); | 4923 bool MulMinusOne(); |
| 4924 | 4924 |
| 4925 DECLARE_CONCRETE_INSTRUCTION(Mul) | 4925 DECLARE_CONCRETE_INSTRUCTION(Mul) |
| 4926 | 4926 |
| 4927 protected: | 4927 protected: |
| 4928 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 4928 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 4929 | 4929 |
| 4930 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 4930 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 4931 | 4931 |
| 4932 private: | 4932 private: |
| 4933 HMul(HValue* context, HValue* left, HValue* right) | 4933 HMul(HValue* context, HValue* left, HValue* right) |
| 4934 : HArithmeticBinaryOperation(context, left, right) { | 4934 : HArithmeticBinaryOperation(context, left, right) { |
| 4935 SetFlag(kCanOverflow); | 4935 SetFlag(kCanOverflow); |
| 4936 } | 4936 } |
| 4937 }; | 4937 }; |
| 4938 | 4938 |
| 4939 | 4939 |
| 4940 class HMod V8_FINAL : public HArithmeticBinaryOperation { | 4940 class HMod FINAL : public HArithmeticBinaryOperation { |
| 4941 public: | 4941 public: |
| 4942 static HInstruction* New(Zone* zone, | 4942 static HInstruction* New(Zone* zone, |
| 4943 HValue* context, | 4943 HValue* context, |
| 4944 HValue* left, | 4944 HValue* left, |
| 4945 HValue* right); | 4945 HValue* right); |
| 4946 | 4946 |
| 4947 virtual HValue* Canonicalize() V8_OVERRIDE; | 4947 virtual HValue* Canonicalize() OVERRIDE; |
| 4948 | 4948 |
| 4949 virtual void UpdateRepresentation(Representation new_rep, | 4949 virtual void UpdateRepresentation(Representation new_rep, |
| 4950 HInferRepresentationPhase* h_infer, | 4950 HInferRepresentationPhase* h_infer, |
| 4951 const char* reason) V8_OVERRIDE { | 4951 const char* reason) OVERRIDE { |
| 4952 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); | 4952 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); |
| 4953 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); | 4953 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); |
| 4954 } | 4954 } |
| 4955 | 4955 |
| 4956 DECLARE_CONCRETE_INSTRUCTION(Mod) | 4956 DECLARE_CONCRETE_INSTRUCTION(Mod) |
| 4957 | 4957 |
| 4958 protected: | 4958 protected: |
| 4959 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 4959 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 4960 | 4960 |
| 4961 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 4961 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 4962 | 4962 |
| 4963 private: | 4963 private: |
| 4964 HMod(HValue* context, | 4964 HMod(HValue* context, |
| 4965 HValue* left, | 4965 HValue* left, |
| 4966 HValue* right) : HArithmeticBinaryOperation(context, left, right) { | 4966 HValue* right) : HArithmeticBinaryOperation(context, left, right) { |
| 4967 SetFlag(kCanBeDivByZero); | 4967 SetFlag(kCanBeDivByZero); |
| 4968 SetFlag(kCanOverflow); | 4968 SetFlag(kCanOverflow); |
| 4969 SetFlag(kLeftCanBeNegative); | 4969 SetFlag(kLeftCanBeNegative); |
| 4970 } | 4970 } |
| 4971 }; | 4971 }; |
| 4972 | 4972 |
| 4973 | 4973 |
| 4974 class HDiv V8_FINAL : public HArithmeticBinaryOperation { | 4974 class HDiv FINAL : public HArithmeticBinaryOperation { |
| 4975 public: | 4975 public: |
| 4976 static HInstruction* New(Zone* zone, | 4976 static HInstruction* New(Zone* zone, |
| 4977 HValue* context, | 4977 HValue* context, |
| 4978 HValue* left, | 4978 HValue* left, |
| 4979 HValue* right); | 4979 HValue* right); |
| 4980 | 4980 |
| 4981 virtual HValue* Canonicalize() V8_OVERRIDE; | 4981 virtual HValue* Canonicalize() OVERRIDE; |
| 4982 | 4982 |
| 4983 virtual void UpdateRepresentation(Representation new_rep, | 4983 virtual void UpdateRepresentation(Representation new_rep, |
| 4984 HInferRepresentationPhase* h_infer, | 4984 HInferRepresentationPhase* h_infer, |
| 4985 const char* reason) V8_OVERRIDE { | 4985 const char* reason) OVERRIDE { |
| 4986 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); | 4986 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); |
| 4987 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); | 4987 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); |
| 4988 } | 4988 } |
| 4989 | 4989 |
| 4990 DECLARE_CONCRETE_INSTRUCTION(Div) | 4990 DECLARE_CONCRETE_INSTRUCTION(Div) |
| 4991 | 4991 |
| 4992 protected: | 4992 protected: |
| 4993 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 4993 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 4994 | 4994 |
| 4995 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 4995 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 4996 | 4996 |
| 4997 private: | 4997 private: |
| 4998 HDiv(HValue* context, HValue* left, HValue* right) | 4998 HDiv(HValue* context, HValue* left, HValue* right) |
| 4999 : HArithmeticBinaryOperation(context, left, right) { | 4999 : HArithmeticBinaryOperation(context, left, right) { |
| 5000 SetFlag(kCanBeDivByZero); | 5000 SetFlag(kCanBeDivByZero); |
| 5001 SetFlag(kCanOverflow); | 5001 SetFlag(kCanOverflow); |
| 5002 } | 5002 } |
| 5003 }; | 5003 }; |
| 5004 | 5004 |
| 5005 | 5005 |
| 5006 class HMathMinMax V8_FINAL : public HArithmeticBinaryOperation { | 5006 class HMathMinMax FINAL : public HArithmeticBinaryOperation { |
| 5007 public: | 5007 public: |
| 5008 enum Operation { kMathMin, kMathMax }; | 5008 enum Operation { kMathMin, kMathMax }; |
| 5009 | 5009 |
| 5010 static HInstruction* New(Zone* zone, | 5010 static HInstruction* New(Zone* zone, |
| 5011 HValue* context, | 5011 HValue* context, |
| 5012 HValue* left, | 5012 HValue* left, |
| 5013 HValue* right, | 5013 HValue* right, |
| 5014 Operation op); | 5014 Operation op); |
| 5015 | 5015 |
| 5016 virtual Representation observed_input_representation(int index) V8_OVERRIDE { | 5016 virtual Representation observed_input_representation(int index) OVERRIDE { |
| 5017 return RequiredInputRepresentation(index); | 5017 return RequiredInputRepresentation(index); |
| 5018 } | 5018 } |
| 5019 | 5019 |
| 5020 virtual void InferRepresentation( | 5020 virtual void InferRepresentation( |
| 5021 HInferRepresentationPhase* h_infer) V8_OVERRIDE; | 5021 HInferRepresentationPhase* h_infer) OVERRIDE; |
| 5022 | 5022 |
| 5023 virtual Representation RepresentationFromInputs() V8_OVERRIDE { | 5023 virtual Representation RepresentationFromInputs() OVERRIDE { |
| 5024 Representation left_rep = left()->representation(); | 5024 Representation left_rep = left()->representation(); |
| 5025 Representation right_rep = right()->representation(); | 5025 Representation right_rep = right()->representation(); |
| 5026 Representation result = Representation::Smi(); | 5026 Representation result = Representation::Smi(); |
| 5027 result = result.generalize(left_rep); | 5027 result = result.generalize(left_rep); |
| 5028 result = result.generalize(right_rep); | 5028 result = result.generalize(right_rep); |
| 5029 if (result.IsTagged()) return Representation::Double(); | 5029 if (result.IsTagged()) return Representation::Double(); |
| 5030 return result; | 5030 return result; |
| 5031 } | 5031 } |
| 5032 | 5032 |
| 5033 virtual bool IsCommutative() const V8_OVERRIDE { return true; } | 5033 virtual bool IsCommutative() const OVERRIDE { return true; } |
| 5034 | 5034 |
| 5035 Operation operation() { return operation_; } | 5035 Operation operation() { return operation_; } |
| 5036 | 5036 |
| 5037 DECLARE_CONCRETE_INSTRUCTION(MathMinMax) | 5037 DECLARE_CONCRETE_INSTRUCTION(MathMinMax) |
| 5038 | 5038 |
| 5039 protected: | 5039 protected: |
| 5040 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 5040 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 5041 return other->IsMathMinMax() && | 5041 return other->IsMathMinMax() && |
| 5042 HMathMinMax::cast(other)->operation_ == operation_; | 5042 HMathMinMax::cast(other)->operation_ == operation_; |
| 5043 } | 5043 } |
| 5044 | 5044 |
| 5045 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 5045 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 5046 | 5046 |
| 5047 private: | 5047 private: |
| 5048 HMathMinMax(HValue* context, HValue* left, HValue* right, Operation op) | 5048 HMathMinMax(HValue* context, HValue* left, HValue* right, Operation op) |
| 5049 : HArithmeticBinaryOperation(context, left, right), | 5049 : HArithmeticBinaryOperation(context, left, right), |
| 5050 operation_(op) { } | 5050 operation_(op) { } |
| 5051 | 5051 |
| 5052 Operation operation_; | 5052 Operation operation_; |
| 5053 }; | 5053 }; |
| 5054 | 5054 |
| 5055 | 5055 |
| 5056 class HBitwise V8_FINAL : public HBitwiseBinaryOperation { | 5056 class HBitwise FINAL : public HBitwiseBinaryOperation { |
| 5057 public: | 5057 public: |
| 5058 static HInstruction* New(Zone* zone, | 5058 static HInstruction* New(Zone* zone, |
| 5059 HValue* context, | 5059 HValue* context, |
| 5060 Token::Value op, | 5060 Token::Value op, |
| 5061 HValue* left, | 5061 HValue* left, |
| 5062 HValue* right); | 5062 HValue* right); |
| 5063 | 5063 |
| 5064 Token::Value op() const { return op_; } | 5064 Token::Value op() const { return op_; } |
| 5065 | 5065 |
| 5066 virtual bool IsCommutative() const V8_OVERRIDE { return true; } | 5066 virtual bool IsCommutative() const OVERRIDE { return true; } |
| 5067 | 5067 |
| 5068 virtual HValue* Canonicalize() V8_OVERRIDE; | 5068 virtual HValue* Canonicalize() OVERRIDE; |
| 5069 | 5069 |
| 5070 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 5070 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 5071 | 5071 |
| 5072 DECLARE_CONCRETE_INSTRUCTION(Bitwise) | 5072 DECLARE_CONCRETE_INSTRUCTION(Bitwise) |
| 5073 | 5073 |
| 5074 protected: | 5074 protected: |
| 5075 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 5075 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 5076 return op() == HBitwise::cast(other)->op(); | 5076 return op() == HBitwise::cast(other)->op(); |
| 5077 } | 5077 } |
| 5078 | 5078 |
| 5079 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 5079 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 5080 | 5080 |
| 5081 private: | 5081 private: |
| 5082 HBitwise(HValue* context, | 5082 HBitwise(HValue* context, |
| 5083 Token::Value op, | 5083 Token::Value op, |
| 5084 HValue* left, | 5084 HValue* left, |
| 5085 HValue* right) | 5085 HValue* right) |
| 5086 : HBitwiseBinaryOperation(context, left, right), | 5086 : HBitwiseBinaryOperation(context, left, right), |
| 5087 op_(op) { | 5087 op_(op) { |
| 5088 DCHECK(op == Token::BIT_AND || op == Token::BIT_OR || op == Token::BIT_XOR); | 5088 DCHECK(op == Token::BIT_AND || op == Token::BIT_OR || op == Token::BIT_XOR); |
| 5089 // BIT_AND with a smi-range positive value will always unset the | 5089 // BIT_AND with a smi-range positive value will always unset the |
| (...skipping 18 matching lines...) Expand all Loading... |
| 5108 HConstant::cast(right)->Integer32Value() < 0))) { | 5108 HConstant::cast(right)->Integer32Value() < 0))) { |
| 5109 SetFlag(kTruncatingToSmi); | 5109 SetFlag(kTruncatingToSmi); |
| 5110 SetFlag(kTruncatingToInt32); | 5110 SetFlag(kTruncatingToInt32); |
| 5111 } | 5111 } |
| 5112 } | 5112 } |
| 5113 | 5113 |
| 5114 Token::Value op_; | 5114 Token::Value op_; |
| 5115 }; | 5115 }; |
| 5116 | 5116 |
| 5117 | 5117 |
| 5118 class HShl V8_FINAL : public HBitwiseBinaryOperation { | 5118 class HShl FINAL : public HBitwiseBinaryOperation { |
| 5119 public: | 5119 public: |
| 5120 static HInstruction* New(Zone* zone, | 5120 static HInstruction* New(Zone* zone, |
| 5121 HValue* context, | 5121 HValue* context, |
| 5122 HValue* left, | 5122 HValue* left, |
| 5123 HValue* right); | 5123 HValue* right); |
| 5124 | 5124 |
| 5125 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 5125 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 5126 | 5126 |
| 5127 virtual void UpdateRepresentation(Representation new_rep, | 5127 virtual void UpdateRepresentation(Representation new_rep, |
| 5128 HInferRepresentationPhase* h_infer, | 5128 HInferRepresentationPhase* h_infer, |
| 5129 const char* reason) V8_OVERRIDE { | 5129 const char* reason) OVERRIDE { |
| 5130 if (new_rep.IsSmi() && | 5130 if (new_rep.IsSmi() && |
| 5131 !(right()->IsInteger32Constant() && | 5131 !(right()->IsInteger32Constant() && |
| 5132 right()->GetInteger32Constant() >= 0)) { | 5132 right()->GetInteger32Constant() >= 0)) { |
| 5133 new_rep = Representation::Integer32(); | 5133 new_rep = Representation::Integer32(); |
| 5134 } | 5134 } |
| 5135 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); | 5135 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); |
| 5136 } | 5136 } |
| 5137 | 5137 |
| 5138 DECLARE_CONCRETE_INSTRUCTION(Shl) | 5138 DECLARE_CONCRETE_INSTRUCTION(Shl) |
| 5139 | 5139 |
| 5140 protected: | 5140 protected: |
| 5141 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 5141 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 5142 | 5142 |
| 5143 private: | 5143 private: |
| 5144 HShl(HValue* context, HValue* left, HValue* right) | 5144 HShl(HValue* context, HValue* left, HValue* right) |
| 5145 : HBitwiseBinaryOperation(context, left, right) { } | 5145 : HBitwiseBinaryOperation(context, left, right) { } |
| 5146 }; | 5146 }; |
| 5147 | 5147 |
| 5148 | 5148 |
| 5149 class HShr V8_FINAL : public HBitwiseBinaryOperation { | 5149 class HShr FINAL : public HBitwiseBinaryOperation { |
| 5150 public: | 5150 public: |
| 5151 static HInstruction* New(Zone* zone, | 5151 static HInstruction* New(Zone* zone, |
| 5152 HValue* context, | 5152 HValue* context, |
| 5153 HValue* left, | 5153 HValue* left, |
| 5154 HValue* right); | 5154 HValue* right); |
| 5155 | 5155 |
| 5156 virtual bool TryDecompose(DecompositionResult* decomposition) V8_OVERRIDE { | 5156 virtual bool TryDecompose(DecompositionResult* decomposition) OVERRIDE { |
| 5157 if (right()->IsInteger32Constant()) { | 5157 if (right()->IsInteger32Constant()) { |
| 5158 if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) { | 5158 if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) { |
| 5159 // This is intended to look for HAdd and HSub, to handle compounds | 5159 // This is intended to look for HAdd and HSub, to handle compounds |
| 5160 // like ((base + offset) >> scale) with one single decomposition. | 5160 // like ((base + offset) >> scale) with one single decomposition. |
| 5161 left()->TryDecompose(decomposition); | 5161 left()->TryDecompose(decomposition); |
| 5162 return true; | 5162 return true; |
| 5163 } | 5163 } |
| 5164 } | 5164 } |
| 5165 return false; | 5165 return false; |
| 5166 } | 5166 } |
| 5167 | 5167 |
| 5168 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 5168 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 5169 | 5169 |
| 5170 virtual void UpdateRepresentation(Representation new_rep, | 5170 virtual void UpdateRepresentation(Representation new_rep, |
| 5171 HInferRepresentationPhase* h_infer, | 5171 HInferRepresentationPhase* h_infer, |
| 5172 const char* reason) V8_OVERRIDE { | 5172 const char* reason) OVERRIDE { |
| 5173 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); | 5173 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); |
| 5174 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); | 5174 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); |
| 5175 } | 5175 } |
| 5176 | 5176 |
| 5177 DECLARE_CONCRETE_INSTRUCTION(Shr) | 5177 DECLARE_CONCRETE_INSTRUCTION(Shr) |
| 5178 | 5178 |
| 5179 protected: | 5179 protected: |
| 5180 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 5180 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 5181 | 5181 |
| 5182 private: | 5182 private: |
| 5183 HShr(HValue* context, HValue* left, HValue* right) | 5183 HShr(HValue* context, HValue* left, HValue* right) |
| 5184 : HBitwiseBinaryOperation(context, left, right) { } | 5184 : HBitwiseBinaryOperation(context, left, right) { } |
| 5185 }; | 5185 }; |
| 5186 | 5186 |
| 5187 | 5187 |
| 5188 class HSar V8_FINAL : public HBitwiseBinaryOperation { | 5188 class HSar FINAL : public HBitwiseBinaryOperation { |
| 5189 public: | 5189 public: |
| 5190 static HInstruction* New(Zone* zone, | 5190 static HInstruction* New(Zone* zone, |
| 5191 HValue* context, | 5191 HValue* context, |
| 5192 HValue* left, | 5192 HValue* left, |
| 5193 HValue* right); | 5193 HValue* right); |
| 5194 | 5194 |
| 5195 virtual bool TryDecompose(DecompositionResult* decomposition) V8_OVERRIDE { | 5195 virtual bool TryDecompose(DecompositionResult* decomposition) OVERRIDE { |
| 5196 if (right()->IsInteger32Constant()) { | 5196 if (right()->IsInteger32Constant()) { |
| 5197 if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) { | 5197 if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) { |
| 5198 // This is intended to look for HAdd and HSub, to handle compounds | 5198 // This is intended to look for HAdd and HSub, to handle compounds |
| 5199 // like ((base + offset) >> scale) with one single decomposition. | 5199 // like ((base + offset) >> scale) with one single decomposition. |
| 5200 left()->TryDecompose(decomposition); | 5200 left()->TryDecompose(decomposition); |
| 5201 return true; | 5201 return true; |
| 5202 } | 5202 } |
| 5203 } | 5203 } |
| 5204 return false; | 5204 return false; |
| 5205 } | 5205 } |
| 5206 | 5206 |
| 5207 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 5207 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 5208 | 5208 |
| 5209 virtual void UpdateRepresentation(Representation new_rep, | 5209 virtual void UpdateRepresentation(Representation new_rep, |
| 5210 HInferRepresentationPhase* h_infer, | 5210 HInferRepresentationPhase* h_infer, |
| 5211 const char* reason) V8_OVERRIDE { | 5211 const char* reason) OVERRIDE { |
| 5212 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); | 5212 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); |
| 5213 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); | 5213 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); |
| 5214 } | 5214 } |
| 5215 | 5215 |
| 5216 DECLARE_CONCRETE_INSTRUCTION(Sar) | 5216 DECLARE_CONCRETE_INSTRUCTION(Sar) |
| 5217 | 5217 |
| 5218 protected: | 5218 protected: |
| 5219 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 5219 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 5220 | 5220 |
| 5221 private: | 5221 private: |
| 5222 HSar(HValue* context, HValue* left, HValue* right) | 5222 HSar(HValue* context, HValue* left, HValue* right) |
| 5223 : HBitwiseBinaryOperation(context, left, right) { } | 5223 : HBitwiseBinaryOperation(context, left, right) { } |
| 5224 }; | 5224 }; |
| 5225 | 5225 |
| 5226 | 5226 |
| 5227 class HRor V8_FINAL : public HBitwiseBinaryOperation { | 5227 class HRor FINAL : public HBitwiseBinaryOperation { |
| 5228 public: | 5228 public: |
| 5229 static HInstruction* New(Zone* zone, | 5229 static HInstruction* New(Zone* zone, |
| 5230 HValue* context, | 5230 HValue* context, |
| 5231 HValue* left, | 5231 HValue* left, |
| 5232 HValue* right) { | 5232 HValue* right) { |
| 5233 return new(zone) HRor(context, left, right); | 5233 return new(zone) HRor(context, left, right); |
| 5234 } | 5234 } |
| 5235 | 5235 |
| 5236 virtual void UpdateRepresentation(Representation new_rep, | 5236 virtual void UpdateRepresentation(Representation new_rep, |
| 5237 HInferRepresentationPhase* h_infer, | 5237 HInferRepresentationPhase* h_infer, |
| 5238 const char* reason) V8_OVERRIDE { | 5238 const char* reason) OVERRIDE { |
| 5239 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); | 5239 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); |
| 5240 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); | 5240 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); |
| 5241 } | 5241 } |
| 5242 | 5242 |
| 5243 DECLARE_CONCRETE_INSTRUCTION(Ror) | 5243 DECLARE_CONCRETE_INSTRUCTION(Ror) |
| 5244 | 5244 |
| 5245 protected: | 5245 protected: |
| 5246 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 5246 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 5247 | 5247 |
| 5248 private: | 5248 private: |
| 5249 HRor(HValue* context, HValue* left, HValue* right) | 5249 HRor(HValue* context, HValue* left, HValue* right) |
| 5250 : HBitwiseBinaryOperation(context, left, right) { | 5250 : HBitwiseBinaryOperation(context, left, right) { |
| 5251 ChangeRepresentation(Representation::Integer32()); | 5251 ChangeRepresentation(Representation::Integer32()); |
| 5252 } | 5252 } |
| 5253 }; | 5253 }; |
| 5254 | 5254 |
| 5255 | 5255 |
| 5256 class HOsrEntry V8_FINAL : public HTemplateInstruction<0> { | 5256 class HOsrEntry FINAL : public HTemplateInstruction<0> { |
| 5257 public: | 5257 public: |
| 5258 DECLARE_INSTRUCTION_FACTORY_P1(HOsrEntry, BailoutId); | 5258 DECLARE_INSTRUCTION_FACTORY_P1(HOsrEntry, BailoutId); |
| 5259 | 5259 |
| 5260 BailoutId ast_id() const { return ast_id_; } | 5260 BailoutId ast_id() const { return ast_id_; } |
| 5261 | 5261 |
| 5262 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5262 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 5263 return Representation::None(); | 5263 return Representation::None(); |
| 5264 } | 5264 } |
| 5265 | 5265 |
| 5266 DECLARE_CONCRETE_INSTRUCTION(OsrEntry) | 5266 DECLARE_CONCRETE_INSTRUCTION(OsrEntry) |
| 5267 | 5267 |
| 5268 private: | 5268 private: |
| 5269 explicit HOsrEntry(BailoutId ast_id) : ast_id_(ast_id) { | 5269 explicit HOsrEntry(BailoutId ast_id) : ast_id_(ast_id) { |
| 5270 SetChangesFlag(kOsrEntries); | 5270 SetChangesFlag(kOsrEntries); |
| 5271 SetChangesFlag(kNewSpacePromotion); | 5271 SetChangesFlag(kNewSpacePromotion); |
| 5272 } | 5272 } |
| 5273 | 5273 |
| 5274 BailoutId ast_id_; | 5274 BailoutId ast_id_; |
| 5275 }; | 5275 }; |
| 5276 | 5276 |
| 5277 | 5277 |
| 5278 class HParameter V8_FINAL : public HTemplateInstruction<0> { | 5278 class HParameter FINAL : public HTemplateInstruction<0> { |
| 5279 public: | 5279 public: |
| 5280 enum ParameterKind { | 5280 enum ParameterKind { |
| 5281 STACK_PARAMETER, | 5281 STACK_PARAMETER, |
| 5282 REGISTER_PARAMETER | 5282 REGISTER_PARAMETER |
| 5283 }; | 5283 }; |
| 5284 | 5284 |
| 5285 DECLARE_INSTRUCTION_FACTORY_P1(HParameter, unsigned); | 5285 DECLARE_INSTRUCTION_FACTORY_P1(HParameter, unsigned); |
| 5286 DECLARE_INSTRUCTION_FACTORY_P2(HParameter, unsigned, ParameterKind); | 5286 DECLARE_INSTRUCTION_FACTORY_P2(HParameter, unsigned, ParameterKind); |
| 5287 DECLARE_INSTRUCTION_FACTORY_P3(HParameter, unsigned, ParameterKind, | 5287 DECLARE_INSTRUCTION_FACTORY_P3(HParameter, unsigned, ParameterKind, |
| 5288 Representation); | 5288 Representation); |
| 5289 | 5289 |
| 5290 unsigned index() const { return index_; } | 5290 unsigned index() const { return index_; } |
| 5291 ParameterKind kind() const { return kind_; } | 5291 ParameterKind kind() const { return kind_; } |
| 5292 | 5292 |
| 5293 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 5293 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 5294 | 5294 |
| 5295 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5295 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 5296 return Representation::None(); | 5296 return Representation::None(); |
| 5297 } | 5297 } |
| 5298 | 5298 |
| 5299 DECLARE_CONCRETE_INSTRUCTION(Parameter) | 5299 DECLARE_CONCRETE_INSTRUCTION(Parameter) |
| 5300 | 5300 |
| 5301 private: | 5301 private: |
| 5302 explicit HParameter(unsigned index, | 5302 explicit HParameter(unsigned index, |
| 5303 ParameterKind kind = STACK_PARAMETER) | 5303 ParameterKind kind = STACK_PARAMETER) |
| 5304 : index_(index), | 5304 : index_(index), |
| 5305 kind_(kind) { | 5305 kind_(kind) { |
| 5306 set_representation(Representation::Tagged()); | 5306 set_representation(Representation::Tagged()); |
| 5307 } | 5307 } |
| 5308 | 5308 |
| 5309 explicit HParameter(unsigned index, | 5309 explicit HParameter(unsigned index, |
| 5310 ParameterKind kind, | 5310 ParameterKind kind, |
| 5311 Representation r) | 5311 Representation r) |
| 5312 : index_(index), | 5312 : index_(index), |
| 5313 kind_(kind) { | 5313 kind_(kind) { |
| 5314 set_representation(r); | 5314 set_representation(r); |
| 5315 } | 5315 } |
| 5316 | 5316 |
| 5317 unsigned index_; | 5317 unsigned index_; |
| 5318 ParameterKind kind_; | 5318 ParameterKind kind_; |
| 5319 }; | 5319 }; |
| 5320 | 5320 |
| 5321 | 5321 |
| 5322 class HCallStub V8_FINAL : public HUnaryCall { | 5322 class HCallStub FINAL : public HUnaryCall { |
| 5323 public: | 5323 public: |
| 5324 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallStub, CodeStub::Major, int); | 5324 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallStub, CodeStub::Major, int); |
| 5325 CodeStub::Major major_key() { return major_key_; } | 5325 CodeStub::Major major_key() { return major_key_; } |
| 5326 | 5326 |
| 5327 HValue* context() { return value(); } | 5327 HValue* context() { return value(); } |
| 5328 | 5328 |
| 5329 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 5329 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 5330 | 5330 |
| 5331 DECLARE_CONCRETE_INSTRUCTION(CallStub) | 5331 DECLARE_CONCRETE_INSTRUCTION(CallStub) |
| 5332 | 5332 |
| 5333 private: | 5333 private: |
| 5334 HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) | 5334 HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) |
| 5335 : HUnaryCall(context, argument_count), | 5335 : HUnaryCall(context, argument_count), |
| 5336 major_key_(major_key) { | 5336 major_key_(major_key) { |
| 5337 } | 5337 } |
| 5338 | 5338 |
| 5339 CodeStub::Major major_key_; | 5339 CodeStub::Major major_key_; |
| 5340 }; | 5340 }; |
| 5341 | 5341 |
| 5342 | 5342 |
| 5343 class HUnknownOSRValue V8_FINAL : public HTemplateInstruction<0> { | 5343 class HUnknownOSRValue FINAL : public HTemplateInstruction<0> { |
| 5344 public: | 5344 public: |
| 5345 DECLARE_INSTRUCTION_FACTORY_P2(HUnknownOSRValue, HEnvironment*, int); | 5345 DECLARE_INSTRUCTION_FACTORY_P2(HUnknownOSRValue, HEnvironment*, int); |
| 5346 | 5346 |
| 5347 virtual OStream& PrintDataTo(OStream& os) const; // NOLINT | 5347 virtual OStream& PrintDataTo(OStream& os) const; // NOLINT |
| 5348 | 5348 |
| 5349 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5349 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 5350 return Representation::None(); | 5350 return Representation::None(); |
| 5351 } | 5351 } |
| 5352 | 5352 |
| 5353 void set_incoming_value(HPhi* value) { incoming_value_ = value; } | 5353 void set_incoming_value(HPhi* value) { incoming_value_ = value; } |
| 5354 HPhi* incoming_value() { return incoming_value_; } | 5354 HPhi* incoming_value() { return incoming_value_; } |
| 5355 HEnvironment *environment() { return environment_; } | 5355 HEnvironment *environment() { return environment_; } |
| 5356 int index() { return index_; } | 5356 int index() { return index_; } |
| 5357 | 5357 |
| 5358 virtual Representation KnownOptimalRepresentation() V8_OVERRIDE { | 5358 virtual Representation KnownOptimalRepresentation() OVERRIDE { |
| 5359 if (incoming_value_ == NULL) return Representation::None(); | 5359 if (incoming_value_ == NULL) return Representation::None(); |
| 5360 return incoming_value_->KnownOptimalRepresentation(); | 5360 return incoming_value_->KnownOptimalRepresentation(); |
| 5361 } | 5361 } |
| 5362 | 5362 |
| 5363 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue) | 5363 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue) |
| 5364 | 5364 |
| 5365 private: | 5365 private: |
| 5366 HUnknownOSRValue(HEnvironment* environment, int index) | 5366 HUnknownOSRValue(HEnvironment* environment, int index) |
| 5367 : environment_(environment), | 5367 : environment_(environment), |
| 5368 index_(index), | 5368 index_(index), |
| 5369 incoming_value_(NULL) { | 5369 incoming_value_(NULL) { |
| 5370 set_representation(Representation::Tagged()); | 5370 set_representation(Representation::Tagged()); |
| 5371 } | 5371 } |
| 5372 | 5372 |
| 5373 HEnvironment* environment_; | 5373 HEnvironment* environment_; |
| 5374 int index_; | 5374 int index_; |
| 5375 HPhi* incoming_value_; | 5375 HPhi* incoming_value_; |
| 5376 }; | 5376 }; |
| 5377 | 5377 |
| 5378 | 5378 |
| 5379 class HLoadGlobalCell V8_FINAL : public HTemplateInstruction<0> { | 5379 class HLoadGlobalCell FINAL : public HTemplateInstruction<0> { |
| 5380 public: | 5380 public: |
| 5381 DECLARE_INSTRUCTION_FACTORY_P2(HLoadGlobalCell, Handle<Cell>, | 5381 DECLARE_INSTRUCTION_FACTORY_P2(HLoadGlobalCell, Handle<Cell>, |
| 5382 PropertyDetails); | 5382 PropertyDetails); |
| 5383 | 5383 |
| 5384 Unique<Cell> cell() const { return cell_; } | 5384 Unique<Cell> cell() const { return cell_; } |
| 5385 bool RequiresHoleCheck() const; | 5385 bool RequiresHoleCheck() const; |
| 5386 | 5386 |
| 5387 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 5387 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 5388 | 5388 |
| 5389 virtual intptr_t Hashcode() V8_OVERRIDE { | 5389 virtual intptr_t Hashcode() OVERRIDE { |
| 5390 return cell_.Hashcode(); | 5390 return cell_.Hashcode(); |
| 5391 } | 5391 } |
| 5392 | 5392 |
| 5393 virtual void FinalizeUniqueness() V8_OVERRIDE { | 5393 virtual void FinalizeUniqueness() OVERRIDE { |
| 5394 cell_ = Unique<Cell>(cell_.handle()); | 5394 cell_ = Unique<Cell>(cell_.handle()); |
| 5395 } | 5395 } |
| 5396 | 5396 |
| 5397 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5397 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 5398 return Representation::None(); | 5398 return Representation::None(); |
| 5399 } | 5399 } |
| 5400 | 5400 |
| 5401 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell) | 5401 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell) |
| 5402 | 5402 |
| 5403 protected: | 5403 protected: |
| 5404 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 5404 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 5405 return cell_ == HLoadGlobalCell::cast(other)->cell_; | 5405 return cell_ == HLoadGlobalCell::cast(other)->cell_; |
| 5406 } | 5406 } |
| 5407 | 5407 |
| 5408 private: | 5408 private: |
| 5409 HLoadGlobalCell(Handle<Cell> cell, PropertyDetails details) | 5409 HLoadGlobalCell(Handle<Cell> cell, PropertyDetails details) |
| 5410 : cell_(Unique<Cell>::CreateUninitialized(cell)), details_(details) { | 5410 : cell_(Unique<Cell>::CreateUninitialized(cell)), details_(details) { |
| 5411 set_representation(Representation::Tagged()); | 5411 set_representation(Representation::Tagged()); |
| 5412 SetFlag(kUseGVN); | 5412 SetFlag(kUseGVN); |
| 5413 SetDependsOnFlag(kGlobalVars); | 5413 SetDependsOnFlag(kGlobalVars); |
| 5414 } | 5414 } |
| 5415 | 5415 |
| 5416 virtual bool IsDeletable() const V8_OVERRIDE { return !RequiresHoleCheck(); } | 5416 virtual bool IsDeletable() const OVERRIDE { return !RequiresHoleCheck(); } |
| 5417 | 5417 |
| 5418 Unique<Cell> cell_; | 5418 Unique<Cell> cell_; |
| 5419 PropertyDetails details_; | 5419 PropertyDetails details_; |
| 5420 }; | 5420 }; |
| 5421 | 5421 |
| 5422 | 5422 |
| 5423 class HLoadGlobalGeneric V8_FINAL : public HTemplateInstruction<2> { | 5423 class HLoadGlobalGeneric FINAL : public HTemplateInstruction<2> { |
| 5424 public: | 5424 public: |
| 5425 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HLoadGlobalGeneric, HValue*, | 5425 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HLoadGlobalGeneric, HValue*, |
| 5426 Handle<String>, bool); | 5426 Handle<String>, bool); |
| 5427 | 5427 |
| 5428 HValue* context() { return OperandAt(0); } | 5428 HValue* context() { return OperandAt(0); } |
| 5429 HValue* global_object() { return OperandAt(1); } | 5429 HValue* global_object() { return OperandAt(1); } |
| 5430 Handle<String> name() const { return name_; } | 5430 Handle<String> name() const { return name_; } |
| 5431 bool for_typeof() const { return for_typeof_; } | 5431 bool for_typeof() const { return for_typeof_; } |
| 5432 int slot() const { | 5432 int slot() const { |
| 5433 DCHECK(FLAG_vector_ics && | 5433 DCHECK(FLAG_vector_ics && |
| 5434 slot_ != FeedbackSlotInterface::kInvalidFeedbackSlot); | 5434 slot_ != FeedbackSlotInterface::kInvalidFeedbackSlot); |
| 5435 return slot_; | 5435 return slot_; |
| 5436 } | 5436 } |
| 5437 Handle<FixedArray> feedback_vector() const { return feedback_vector_; } | 5437 Handle<FixedArray> feedback_vector() const { return feedback_vector_; } |
| 5438 void SetVectorAndSlot(Handle<FixedArray> vector, int slot) { | 5438 void SetVectorAndSlot(Handle<FixedArray> vector, int slot) { |
| 5439 DCHECK(FLAG_vector_ics); | 5439 DCHECK(FLAG_vector_ics); |
| 5440 feedback_vector_ = vector; | 5440 feedback_vector_ = vector; |
| 5441 slot_ = slot; | 5441 slot_ = slot; |
| 5442 } | 5442 } |
| 5443 | 5443 |
| 5444 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 5444 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 5445 | 5445 |
| 5446 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5446 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 5447 return Representation::Tagged(); | 5447 return Representation::Tagged(); |
| 5448 } | 5448 } |
| 5449 | 5449 |
| 5450 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric) | 5450 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric) |
| 5451 | 5451 |
| 5452 private: | 5452 private: |
| 5453 HLoadGlobalGeneric(HValue* context, HValue* global_object, | 5453 HLoadGlobalGeneric(HValue* context, HValue* global_object, |
| 5454 Handle<String> name, bool for_typeof) | 5454 Handle<String> name, bool for_typeof) |
| 5455 : name_(name), for_typeof_(for_typeof), | 5455 : name_(name), for_typeof_(for_typeof), |
| 5456 slot_(FeedbackSlotInterface::kInvalidFeedbackSlot) { | 5456 slot_(FeedbackSlotInterface::kInvalidFeedbackSlot) { |
| 5457 SetOperandAt(0, context); | 5457 SetOperandAt(0, context); |
| 5458 SetOperandAt(1, global_object); | 5458 SetOperandAt(1, global_object); |
| 5459 set_representation(Representation::Tagged()); | 5459 set_representation(Representation::Tagged()); |
| 5460 SetAllSideEffects(); | 5460 SetAllSideEffects(); |
| 5461 } | 5461 } |
| 5462 | 5462 |
| 5463 Handle<String> name_; | 5463 Handle<String> name_; |
| 5464 bool for_typeof_; | 5464 bool for_typeof_; |
| 5465 Handle<FixedArray> feedback_vector_; | 5465 Handle<FixedArray> feedback_vector_; |
| 5466 int slot_; | 5466 int slot_; |
| 5467 }; | 5467 }; |
| 5468 | 5468 |
| 5469 | 5469 |
| 5470 class HAllocate V8_FINAL : public HTemplateInstruction<2> { | 5470 class HAllocate FINAL : public HTemplateInstruction<2> { |
| 5471 public: | 5471 public: |
| 5472 static bool CompatibleInstanceTypes(InstanceType type1, | 5472 static bool CompatibleInstanceTypes(InstanceType type1, |
| 5473 InstanceType type2) { | 5473 InstanceType type2) { |
| 5474 return ComputeFlags(TENURED, type1) == ComputeFlags(TENURED, type2) && | 5474 return ComputeFlags(TENURED, type1) == ComputeFlags(TENURED, type2) && |
| 5475 ComputeFlags(NOT_TENURED, type1) == ComputeFlags(NOT_TENURED, type2); | 5475 ComputeFlags(NOT_TENURED, type1) == ComputeFlags(NOT_TENURED, type2); |
| 5476 } | 5476 } |
| 5477 | 5477 |
| 5478 static HAllocate* New(Zone* zone, | 5478 static HAllocate* New(Zone* zone, |
| 5479 HValue* context, | 5479 HValue* context, |
| 5480 HValue* size, | 5480 HValue* size, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 5493 HValue* context() const { return OperandAt(0); } | 5493 HValue* context() const { return OperandAt(0); } |
| 5494 HValue* size() const { return OperandAt(1); } | 5494 HValue* size() const { return OperandAt(1); } |
| 5495 | 5495 |
| 5496 bool has_size_upper_bound() { return size_upper_bound_ != NULL; } | 5496 bool has_size_upper_bound() { return size_upper_bound_ != NULL; } |
| 5497 HConstant* size_upper_bound() { return size_upper_bound_; } | 5497 HConstant* size_upper_bound() { return size_upper_bound_; } |
| 5498 void set_size_upper_bound(HConstant* value) { | 5498 void set_size_upper_bound(HConstant* value) { |
| 5499 DCHECK(size_upper_bound_ == NULL); | 5499 DCHECK(size_upper_bound_ == NULL); |
| 5500 size_upper_bound_ = value; | 5500 size_upper_bound_ = value; |
| 5501 } | 5501 } |
| 5502 | 5502 |
| 5503 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5503 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 5504 if (index == 0) { | 5504 if (index == 0) { |
| 5505 return Representation::Tagged(); | 5505 return Representation::Tagged(); |
| 5506 } else { | 5506 } else { |
| 5507 return Representation::Integer32(); | 5507 return Representation::Integer32(); |
| 5508 } | 5508 } |
| 5509 } | 5509 } |
| 5510 | 5510 |
| 5511 virtual Handle<Map> GetMonomorphicJSObjectMap() { | 5511 virtual Handle<Map> GetMonomorphicJSObjectMap() { |
| 5512 return known_initial_map_; | 5512 return known_initial_map_; |
| 5513 } | 5513 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 5542 | 5542 |
| 5543 bool MustClearNextMapWord() const { | 5543 bool MustClearNextMapWord() const { |
| 5544 return (flags_ & CLEAR_NEXT_MAP_WORD) != 0; | 5544 return (flags_ & CLEAR_NEXT_MAP_WORD) != 0; |
| 5545 } | 5545 } |
| 5546 | 5546 |
| 5547 void MakeDoubleAligned() { | 5547 void MakeDoubleAligned() { |
| 5548 flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED); | 5548 flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED); |
| 5549 } | 5549 } |
| 5550 | 5550 |
| 5551 virtual bool HandleSideEffectDominator(GVNFlag side_effect, | 5551 virtual bool HandleSideEffectDominator(GVNFlag side_effect, |
| 5552 HValue* dominator) V8_OVERRIDE; | 5552 HValue* dominator) OVERRIDE; |
| 5553 | 5553 |
| 5554 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 5554 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 5555 | 5555 |
| 5556 DECLARE_CONCRETE_INSTRUCTION(Allocate) | 5556 DECLARE_CONCRETE_INSTRUCTION(Allocate) |
| 5557 | 5557 |
| 5558 private: | 5558 private: |
| 5559 enum Flags { | 5559 enum Flags { |
| 5560 ALLOCATE_IN_NEW_SPACE = 1 << 0, | 5560 ALLOCATE_IN_NEW_SPACE = 1 << 0, |
| 5561 ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1, | 5561 ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1, |
| 5562 ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2, | 5562 ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2, |
| 5563 ALLOCATE_DOUBLE_ALIGNED = 1 << 3, | 5563 ALLOCATE_DOUBLE_ALIGNED = 1 << 3, |
| 5564 PREFILL_WITH_FILLER = 1 << 4, | 5564 PREFILL_WITH_FILLER = 1 << 4, |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5648 void ClearNextMapWord(int offset); | 5648 void ClearNextMapWord(int offset); |
| 5649 | 5649 |
| 5650 Flags flags_; | 5650 Flags flags_; |
| 5651 Handle<Map> known_initial_map_; | 5651 Handle<Map> known_initial_map_; |
| 5652 HAllocate* dominating_allocate_; | 5652 HAllocate* dominating_allocate_; |
| 5653 HStoreNamedField* filler_free_space_size_; | 5653 HStoreNamedField* filler_free_space_size_; |
| 5654 HConstant* size_upper_bound_; | 5654 HConstant* size_upper_bound_; |
| 5655 }; | 5655 }; |
| 5656 | 5656 |
| 5657 | 5657 |
| 5658 class HStoreCodeEntry V8_FINAL: public HTemplateInstruction<2> { | 5658 class HStoreCodeEntry FINAL: public HTemplateInstruction<2> { |
| 5659 public: | 5659 public: |
| 5660 static HStoreCodeEntry* New(Zone* zone, | 5660 static HStoreCodeEntry* New(Zone* zone, |
| 5661 HValue* context, | 5661 HValue* context, |
| 5662 HValue* function, | 5662 HValue* function, |
| 5663 HValue* code) { | 5663 HValue* code) { |
| 5664 return new(zone) HStoreCodeEntry(function, code); | 5664 return new(zone) HStoreCodeEntry(function, code); |
| 5665 } | 5665 } |
| 5666 | 5666 |
| 5667 virtual Representation RequiredInputRepresentation(int index) { | 5667 virtual Representation RequiredInputRepresentation(int index) { |
| 5668 return Representation::Tagged(); | 5668 return Representation::Tagged(); |
| 5669 } | 5669 } |
| 5670 | 5670 |
| 5671 HValue* function() { return OperandAt(0); } | 5671 HValue* function() { return OperandAt(0); } |
| 5672 HValue* code_object() { return OperandAt(1); } | 5672 HValue* code_object() { return OperandAt(1); } |
| 5673 | 5673 |
| 5674 DECLARE_CONCRETE_INSTRUCTION(StoreCodeEntry) | 5674 DECLARE_CONCRETE_INSTRUCTION(StoreCodeEntry) |
| 5675 | 5675 |
| 5676 private: | 5676 private: |
| 5677 HStoreCodeEntry(HValue* function, HValue* code) { | 5677 HStoreCodeEntry(HValue* function, HValue* code) { |
| 5678 SetOperandAt(0, function); | 5678 SetOperandAt(0, function); |
| 5679 SetOperandAt(1, code); | 5679 SetOperandAt(1, code); |
| 5680 } | 5680 } |
| 5681 }; | 5681 }; |
| 5682 | 5682 |
| 5683 | 5683 |
| 5684 class HInnerAllocatedObject V8_FINAL : public HTemplateInstruction<2> { | 5684 class HInnerAllocatedObject FINAL : public HTemplateInstruction<2> { |
| 5685 public: | 5685 public: |
| 5686 static HInnerAllocatedObject* New(Zone* zone, | 5686 static HInnerAllocatedObject* New(Zone* zone, |
| 5687 HValue* context, | 5687 HValue* context, |
| 5688 HValue* value, | 5688 HValue* value, |
| 5689 HValue* offset, | 5689 HValue* offset, |
| 5690 HType type) { | 5690 HType type) { |
| 5691 return new(zone) HInnerAllocatedObject(value, offset, type); | 5691 return new(zone) HInnerAllocatedObject(value, offset, type); |
| 5692 } | 5692 } |
| 5693 | 5693 |
| 5694 HValue* base_object() const { return OperandAt(0); } | 5694 HValue* base_object() const { return OperandAt(0); } |
| 5695 HValue* offset() const { return OperandAt(1); } | 5695 HValue* offset() const { return OperandAt(1); } |
| 5696 | 5696 |
| 5697 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5697 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 5698 return index == 0 ? Representation::Tagged() : Representation::Integer32(); | 5698 return index == 0 ? Representation::Tagged() : Representation::Integer32(); |
| 5699 } | 5699 } |
| 5700 | 5700 |
| 5701 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 5701 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 5702 | 5702 |
| 5703 DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject) | 5703 DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject) |
| 5704 | 5704 |
| 5705 private: | 5705 private: |
| 5706 HInnerAllocatedObject(HValue* value, | 5706 HInnerAllocatedObject(HValue* value, |
| 5707 HValue* offset, | 5707 HValue* offset, |
| 5708 HType type) : HTemplateInstruction<2>(type) { | 5708 HType type) : HTemplateInstruction<2>(type) { |
| 5709 DCHECK(value->IsAllocate()); | 5709 DCHECK(value->IsAllocate()); |
| 5710 DCHECK(type.IsHeapObject()); | 5710 DCHECK(type.IsHeapObject()); |
| 5711 SetOperandAt(0, value); | 5711 SetOperandAt(0, value); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5771 } | 5771 } |
| 5772 if (object == dominator && | 5772 if (object == dominator && |
| 5773 object->IsAllocate() && | 5773 object->IsAllocate() && |
| 5774 HAllocate::cast(object)->IsNewSpaceAllocation()) { | 5774 HAllocate::cast(object)->IsNewSpaceAllocation()) { |
| 5775 return kPointersToHereAreAlwaysInteresting; | 5775 return kPointersToHereAreAlwaysInteresting; |
| 5776 } | 5776 } |
| 5777 return kPointersToHereMaybeInteresting; | 5777 return kPointersToHereMaybeInteresting; |
| 5778 } | 5778 } |
| 5779 | 5779 |
| 5780 | 5780 |
| 5781 class HStoreGlobalCell V8_FINAL : public HUnaryOperation { | 5781 class HStoreGlobalCell FINAL : public HUnaryOperation { |
| 5782 public: | 5782 public: |
| 5783 DECLARE_INSTRUCTION_FACTORY_P3(HStoreGlobalCell, HValue*, | 5783 DECLARE_INSTRUCTION_FACTORY_P3(HStoreGlobalCell, HValue*, |
| 5784 Handle<PropertyCell>, PropertyDetails); | 5784 Handle<PropertyCell>, PropertyDetails); |
| 5785 | 5785 |
| 5786 Unique<PropertyCell> cell() const { return cell_; } | 5786 Unique<PropertyCell> cell() const { return cell_; } |
| 5787 bool RequiresHoleCheck() { return details_.IsConfigurable(); } | 5787 bool RequiresHoleCheck() { return details_.IsConfigurable(); } |
| 5788 bool NeedsWriteBarrier() { | 5788 bool NeedsWriteBarrier() { |
| 5789 return StoringValueNeedsWriteBarrier(value()); | 5789 return StoringValueNeedsWriteBarrier(value()); |
| 5790 } | 5790 } |
| 5791 | 5791 |
| 5792 virtual void FinalizeUniqueness() V8_OVERRIDE { | 5792 virtual void FinalizeUniqueness() OVERRIDE { |
| 5793 cell_ = Unique<PropertyCell>(cell_.handle()); | 5793 cell_ = Unique<PropertyCell>(cell_.handle()); |
| 5794 } | 5794 } |
| 5795 | 5795 |
| 5796 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5796 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 5797 return Representation::Tagged(); | 5797 return Representation::Tagged(); |
| 5798 } | 5798 } |
| 5799 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 5799 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 5800 | 5800 |
| 5801 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) | 5801 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) |
| 5802 | 5802 |
| 5803 private: | 5803 private: |
| 5804 HStoreGlobalCell(HValue* value, | 5804 HStoreGlobalCell(HValue* value, |
| 5805 Handle<PropertyCell> cell, | 5805 Handle<PropertyCell> cell, |
| 5806 PropertyDetails details) | 5806 PropertyDetails details) |
| 5807 : HUnaryOperation(value), | 5807 : HUnaryOperation(value), |
| 5808 cell_(Unique<PropertyCell>::CreateUninitialized(cell)), | 5808 cell_(Unique<PropertyCell>::CreateUninitialized(cell)), |
| 5809 details_(details) { | 5809 details_(details) { |
| 5810 SetChangesFlag(kGlobalVars); | 5810 SetChangesFlag(kGlobalVars); |
| 5811 } | 5811 } |
| 5812 | 5812 |
| 5813 Unique<PropertyCell> cell_; | 5813 Unique<PropertyCell> cell_; |
| 5814 PropertyDetails details_; | 5814 PropertyDetails details_; |
| 5815 }; | 5815 }; |
| 5816 | 5816 |
| 5817 | 5817 |
| 5818 class HLoadContextSlot V8_FINAL : public HUnaryOperation { | 5818 class HLoadContextSlot FINAL : public HUnaryOperation { |
| 5819 public: | 5819 public: |
| 5820 enum Mode { | 5820 enum Mode { |
| 5821 // Perform a normal load of the context slot without checking its value. | 5821 // Perform a normal load of the context slot without checking its value. |
| 5822 kNoCheck, | 5822 kNoCheck, |
| 5823 // Load and check the value of the context slot. Deoptimize if it's the | 5823 // Load and check the value of the context slot. Deoptimize if it's the |
| 5824 // hole value. This is used for checking for loading of uninitialized | 5824 // hole value. This is used for checking for loading of uninitialized |
| 5825 // harmony bindings where we deoptimize into full-codegen generated code | 5825 // harmony bindings where we deoptimize into full-codegen generated code |
| 5826 // which will subsequently throw a reference error. | 5826 // which will subsequently throw a reference error. |
| 5827 kCheckDeoptimize, | 5827 kCheckDeoptimize, |
| 5828 // Load and check the value of the context slot. Return undefined if it's | 5828 // Load and check the value of the context slot. Return undefined if it's |
| (...skipping 12 matching lines...) Expand all Loading... |
| 5841 Mode mode() const { return mode_; } | 5841 Mode mode() const { return mode_; } |
| 5842 | 5842 |
| 5843 bool DeoptimizesOnHole() { | 5843 bool DeoptimizesOnHole() { |
| 5844 return mode_ == kCheckDeoptimize; | 5844 return mode_ == kCheckDeoptimize; |
| 5845 } | 5845 } |
| 5846 | 5846 |
| 5847 bool RequiresHoleCheck() const { | 5847 bool RequiresHoleCheck() const { |
| 5848 return mode_ != kNoCheck; | 5848 return mode_ != kNoCheck; |
| 5849 } | 5849 } |
| 5850 | 5850 |
| 5851 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5851 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 5852 return Representation::Tagged(); | 5852 return Representation::Tagged(); |
| 5853 } | 5853 } |
| 5854 | 5854 |
| 5855 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 5855 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 5856 | 5856 |
| 5857 DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot) | 5857 DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot) |
| 5858 | 5858 |
| 5859 protected: | 5859 protected: |
| 5860 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 5860 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 5861 HLoadContextSlot* b = HLoadContextSlot::cast(other); | 5861 HLoadContextSlot* b = HLoadContextSlot::cast(other); |
| 5862 return (slot_index() == b->slot_index()); | 5862 return (slot_index() == b->slot_index()); |
| 5863 } | 5863 } |
| 5864 | 5864 |
| 5865 private: | 5865 private: |
| 5866 virtual bool IsDeletable() const V8_OVERRIDE { return !RequiresHoleCheck(); } | 5866 virtual bool IsDeletable() const OVERRIDE { return !RequiresHoleCheck(); } |
| 5867 | 5867 |
| 5868 int slot_index_; | 5868 int slot_index_; |
| 5869 Mode mode_; | 5869 Mode mode_; |
| 5870 }; | 5870 }; |
| 5871 | 5871 |
| 5872 | 5872 |
| 5873 class HStoreContextSlot V8_FINAL : public HTemplateInstruction<2> { | 5873 class HStoreContextSlot FINAL : public HTemplateInstruction<2> { |
| 5874 public: | 5874 public: |
| 5875 enum Mode { | 5875 enum Mode { |
| 5876 // Perform a normal store to the context slot without checking its previous | 5876 // Perform a normal store to the context slot without checking its previous |
| 5877 // value. | 5877 // value. |
| 5878 kNoCheck, | 5878 kNoCheck, |
| 5879 // Check the previous value of the context slot and deoptimize if it's the | 5879 // Check the previous value of the context slot and deoptimize if it's the |
| 5880 // hole value. This is used for checking for assignments to uninitialized | 5880 // hole value. This is used for checking for assignments to uninitialized |
| 5881 // harmony bindings where we deoptimize into full-codegen generated code | 5881 // harmony bindings where we deoptimize into full-codegen generated code |
| 5882 // which will subsequently throw a reference error. | 5882 // which will subsequently throw a reference error. |
| 5883 kCheckDeoptimize, | 5883 kCheckDeoptimize, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 5898 } | 5898 } |
| 5899 | 5899 |
| 5900 bool DeoptimizesOnHole() { | 5900 bool DeoptimizesOnHole() { |
| 5901 return mode_ == kCheckDeoptimize; | 5901 return mode_ == kCheckDeoptimize; |
| 5902 } | 5902 } |
| 5903 | 5903 |
| 5904 bool RequiresHoleCheck() { | 5904 bool RequiresHoleCheck() { |
| 5905 return mode_ != kNoCheck; | 5905 return mode_ != kNoCheck; |
| 5906 } | 5906 } |
| 5907 | 5907 |
| 5908 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5908 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 5909 return Representation::Tagged(); | 5909 return Representation::Tagged(); |
| 5910 } | 5910 } |
| 5911 | 5911 |
| 5912 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 5912 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 5913 | 5913 |
| 5914 DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot) | 5914 DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot) |
| 5915 | 5915 |
| 5916 private: | 5916 private: |
| 5917 HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value) | 5917 HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value) |
| 5918 : slot_index_(slot_index), mode_(mode) { | 5918 : slot_index_(slot_index), mode_(mode) { |
| 5919 SetOperandAt(0, context); | 5919 SetOperandAt(0, context); |
| 5920 SetOperandAt(1, value); | 5920 SetOperandAt(1, value); |
| 5921 SetChangesFlag(kContextSlots); | 5921 SetChangesFlag(kContextSlots); |
| 5922 } | 5922 } |
| 5923 | 5923 |
| 5924 int slot_index_; | 5924 int slot_index_; |
| 5925 Mode mode_; | 5925 Mode mode_; |
| 5926 }; | 5926 }; |
| 5927 | 5927 |
| 5928 | 5928 |
| 5929 // Represents an access to a portion of an object, such as the map pointer, | 5929 // Represents an access to a portion of an object, such as the map pointer, |
| 5930 // array elements pointer, etc, but not accesses to array elements themselves. | 5930 // array elements pointer, etc, but not accesses to array elements themselves. |
| 5931 class HObjectAccess V8_FINAL { | 5931 class HObjectAccess FINAL { |
| 5932 public: | 5932 public: |
| 5933 inline bool IsInobject() const { | 5933 inline bool IsInobject() const { |
| 5934 return portion() != kBackingStore && portion() != kExternalMemory; | 5934 return portion() != kBackingStore && portion() != kExternalMemory; |
| 5935 } | 5935 } |
| 5936 | 5936 |
| 5937 inline bool IsExternalMemory() const { | 5937 inline bool IsExternalMemory() const { |
| 5938 return portion() == kExternalMemory; | 5938 return portion() == kExternalMemory; |
| 5939 } | 5939 } |
| 5940 | 5940 |
| 5941 inline bool IsStringLength() const { | 5941 inline bool IsStringLength() const { |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6296 | 6296 |
| 6297 inline Portion portion() const { | 6297 inline Portion portion() const { |
| 6298 return PortionField::decode(value_); | 6298 return PortionField::decode(value_); |
| 6299 } | 6299 } |
| 6300 }; | 6300 }; |
| 6301 | 6301 |
| 6302 | 6302 |
| 6303 OStream& operator<<(OStream& os, const HObjectAccess& access); | 6303 OStream& operator<<(OStream& os, const HObjectAccess& access); |
| 6304 | 6304 |
| 6305 | 6305 |
| 6306 class HLoadNamedField V8_FINAL : public HTemplateInstruction<2> { | 6306 class HLoadNamedField FINAL : public HTemplateInstruction<2> { |
| 6307 public: | 6307 public: |
| 6308 DECLARE_INSTRUCTION_FACTORY_P3(HLoadNamedField, HValue*, | 6308 DECLARE_INSTRUCTION_FACTORY_P3(HLoadNamedField, HValue*, |
| 6309 HValue*, HObjectAccess); | 6309 HValue*, HObjectAccess); |
| 6310 DECLARE_INSTRUCTION_FACTORY_P5(HLoadNamedField, HValue*, HValue*, | 6310 DECLARE_INSTRUCTION_FACTORY_P5(HLoadNamedField, HValue*, HValue*, |
| 6311 HObjectAccess, const UniqueSet<Map>*, HType); | 6311 HObjectAccess, const UniqueSet<Map>*, HType); |
| 6312 | 6312 |
| 6313 HValue* object() const { return OperandAt(0); } | 6313 HValue* object() const { return OperandAt(0); } |
| 6314 HValue* dependency() const { | 6314 HValue* dependency() const { |
| 6315 DCHECK(HasDependency()); | 6315 DCHECK(HasDependency()); |
| 6316 return OperandAt(1); | 6316 return OperandAt(1); |
| 6317 } | 6317 } |
| 6318 bool HasDependency() const { return OperandAt(0) != OperandAt(1); } | 6318 bool HasDependency() const { return OperandAt(0) != OperandAt(1); } |
| 6319 HObjectAccess access() const { return access_; } | 6319 HObjectAccess access() const { return access_; } |
| 6320 Representation field_representation() const { | 6320 Representation field_representation() const { |
| 6321 return access_.representation(); | 6321 return access_.representation(); |
| 6322 } | 6322 } |
| 6323 | 6323 |
| 6324 const UniqueSet<Map>* maps() const { return maps_; } | 6324 const UniqueSet<Map>* maps() const { return maps_; } |
| 6325 | 6325 |
| 6326 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } | 6326 virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; } |
| 6327 virtual bool HasOutOfBoundsAccess(int size) V8_OVERRIDE { | 6327 virtual bool HasOutOfBoundsAccess(int size) OVERRIDE { |
| 6328 return !access().IsInobject() || access().offset() >= size; | 6328 return !access().IsInobject() || access().offset() >= size; |
| 6329 } | 6329 } |
| 6330 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6330 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 6331 if (index == 0 && access().IsExternalMemory()) { | 6331 if (index == 0 && access().IsExternalMemory()) { |
| 6332 // object must be external in case of external memory access | 6332 // object must be external in case of external memory access |
| 6333 return Representation::External(); | 6333 return Representation::External(); |
| 6334 } | 6334 } |
| 6335 return Representation::Tagged(); | 6335 return Representation::Tagged(); |
| 6336 } | 6336 } |
| 6337 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 6337 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 6338 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 6338 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 6339 | 6339 |
| 6340 bool CanBeReplacedWith(HValue* other) const { | 6340 bool CanBeReplacedWith(HValue* other) const { |
| 6341 if (!CheckFlag(HValue::kCantBeReplaced)) return false; | 6341 if (!CheckFlag(HValue::kCantBeReplaced)) return false; |
| 6342 if (!type().Equals(other->type())) return false; | 6342 if (!type().Equals(other->type())) return false; |
| 6343 if (!representation().Equals(other->representation())) return false; | 6343 if (!representation().Equals(other->representation())) return false; |
| 6344 if (!other->IsLoadNamedField()) return true; | 6344 if (!other->IsLoadNamedField()) return true; |
| 6345 HLoadNamedField* that = HLoadNamedField::cast(other); | 6345 HLoadNamedField* that = HLoadNamedField::cast(other); |
| 6346 if (this->maps_ == that->maps_) return true; | 6346 if (this->maps_ == that->maps_) return true; |
| 6347 if (this->maps_ == NULL || that->maps_ == NULL) return false; | 6347 if (this->maps_ == NULL || that->maps_ == NULL) return false; |
| 6348 return this->maps_->IsSubset(that->maps_); | 6348 return this->maps_->IsSubset(that->maps_); |
| 6349 } | 6349 } |
| 6350 | 6350 |
| 6351 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField) | 6351 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField) |
| 6352 | 6352 |
| 6353 protected: | 6353 protected: |
| 6354 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 6354 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 6355 HLoadNamedField* that = HLoadNamedField::cast(other); | 6355 HLoadNamedField* that = HLoadNamedField::cast(other); |
| 6356 if (!this->access_.Equals(that->access_)) return false; | 6356 if (!this->access_.Equals(that->access_)) return false; |
| 6357 if (this->maps_ == that->maps_) return true; | 6357 if (this->maps_ == that->maps_) return true; |
| 6358 return (this->maps_ != NULL && | 6358 return (this->maps_ != NULL && |
| 6359 that->maps_ != NULL && | 6359 that->maps_ != NULL && |
| 6360 this->maps_->Equals(that->maps_)); | 6360 this->maps_->Equals(that->maps_)); |
| 6361 } | 6361 } |
| 6362 | 6362 |
| 6363 private: | 6363 private: |
| 6364 HLoadNamedField(HValue* object, | 6364 HLoadNamedField(HValue* object, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6408 SetOperandAt(0, object); | 6408 SetOperandAt(0, object); |
| 6409 SetOperandAt(1, dependency ? dependency : object); | 6409 SetOperandAt(1, dependency ? dependency : object); |
| 6410 | 6410 |
| 6411 DCHECK(access.representation().IsHeapObject()); | 6411 DCHECK(access.representation().IsHeapObject()); |
| 6412 DCHECK(type.IsHeapObject()); | 6412 DCHECK(type.IsHeapObject()); |
| 6413 set_representation(Representation::Tagged()); | 6413 set_representation(Representation::Tagged()); |
| 6414 | 6414 |
| 6415 access.SetGVNFlags(this, LOAD); | 6415 access.SetGVNFlags(this, LOAD); |
| 6416 } | 6416 } |
| 6417 | 6417 |
| 6418 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 6418 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 6419 | 6419 |
| 6420 HObjectAccess access_; | 6420 HObjectAccess access_; |
| 6421 const UniqueSet<Map>* maps_; | 6421 const UniqueSet<Map>* maps_; |
| 6422 }; | 6422 }; |
| 6423 | 6423 |
| 6424 | 6424 |
| 6425 class HLoadNamedGeneric V8_FINAL : public HTemplateInstruction<2> { | 6425 class HLoadNamedGeneric FINAL : public HTemplateInstruction<2> { |
| 6426 public: | 6426 public: |
| 6427 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HLoadNamedGeneric, HValue*, | 6427 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HLoadNamedGeneric, HValue*, |
| 6428 Handle<Object>); | 6428 Handle<Object>); |
| 6429 | 6429 |
| 6430 HValue* context() const { return OperandAt(0); } | 6430 HValue* context() const { return OperandAt(0); } |
| 6431 HValue* object() const { return OperandAt(1); } | 6431 HValue* object() const { return OperandAt(1); } |
| 6432 Handle<Object> name() const { return name_; } | 6432 Handle<Object> name() const { return name_; } |
| 6433 | 6433 |
| 6434 int slot() const { | 6434 int slot() const { |
| 6435 DCHECK(FLAG_vector_ics && | 6435 DCHECK(FLAG_vector_ics && |
| 6436 slot_ != FeedbackSlotInterface::kInvalidFeedbackSlot); | 6436 slot_ != FeedbackSlotInterface::kInvalidFeedbackSlot); |
| 6437 return slot_; | 6437 return slot_; |
| 6438 } | 6438 } |
| 6439 Handle<FixedArray> feedback_vector() const { return feedback_vector_; } | 6439 Handle<FixedArray> feedback_vector() const { return feedback_vector_; } |
| 6440 void SetVectorAndSlot(Handle<FixedArray> vector, int slot) { | 6440 void SetVectorAndSlot(Handle<FixedArray> vector, int slot) { |
| 6441 DCHECK(FLAG_vector_ics); | 6441 DCHECK(FLAG_vector_ics); |
| 6442 feedback_vector_ = vector; | 6442 feedback_vector_ = vector; |
| 6443 slot_ = slot; | 6443 slot_ = slot; |
| 6444 } | 6444 } |
| 6445 | 6445 |
| 6446 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6446 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 6447 return Representation::Tagged(); | 6447 return Representation::Tagged(); |
| 6448 } | 6448 } |
| 6449 | 6449 |
| 6450 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 6450 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 6451 | 6451 |
| 6452 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric) | 6452 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric) |
| 6453 | 6453 |
| 6454 private: | 6454 private: |
| 6455 HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name) | 6455 HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name) |
| 6456 : name_(name), | 6456 : name_(name), |
| 6457 slot_(FeedbackSlotInterface::kInvalidFeedbackSlot) { | 6457 slot_(FeedbackSlotInterface::kInvalidFeedbackSlot) { |
| 6458 SetOperandAt(0, context); | 6458 SetOperandAt(0, context); |
| 6459 SetOperandAt(1, object); | 6459 SetOperandAt(1, object); |
| 6460 set_representation(Representation::Tagged()); | 6460 set_representation(Representation::Tagged()); |
| 6461 SetAllSideEffects(); | 6461 SetAllSideEffects(); |
| 6462 } | 6462 } |
| 6463 | 6463 |
| 6464 Handle<Object> name_; | 6464 Handle<Object> name_; |
| 6465 Handle<FixedArray> feedback_vector_; | 6465 Handle<FixedArray> feedback_vector_; |
| 6466 int slot_; | 6466 int slot_; |
| 6467 }; | 6467 }; |
| 6468 | 6468 |
| 6469 | 6469 |
| 6470 class HLoadFunctionPrototype V8_FINAL : public HUnaryOperation { | 6470 class HLoadFunctionPrototype FINAL : public HUnaryOperation { |
| 6471 public: | 6471 public: |
| 6472 DECLARE_INSTRUCTION_FACTORY_P1(HLoadFunctionPrototype, HValue*); | 6472 DECLARE_INSTRUCTION_FACTORY_P1(HLoadFunctionPrototype, HValue*); |
| 6473 | 6473 |
| 6474 HValue* function() { return OperandAt(0); } | 6474 HValue* function() { return OperandAt(0); } |
| 6475 | 6475 |
| 6476 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6476 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 6477 return Representation::Tagged(); | 6477 return Representation::Tagged(); |
| 6478 } | 6478 } |
| 6479 | 6479 |
| 6480 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype) | 6480 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype) |
| 6481 | 6481 |
| 6482 protected: | 6482 protected: |
| 6483 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 6483 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 6484 | 6484 |
| 6485 private: | 6485 private: |
| 6486 explicit HLoadFunctionPrototype(HValue* function) | 6486 explicit HLoadFunctionPrototype(HValue* function) |
| 6487 : HUnaryOperation(function) { | 6487 : HUnaryOperation(function) { |
| 6488 set_representation(Representation::Tagged()); | 6488 set_representation(Representation::Tagged()); |
| 6489 SetFlag(kUseGVN); | 6489 SetFlag(kUseGVN); |
| 6490 SetDependsOnFlag(kCalls); | 6490 SetDependsOnFlag(kCalls); |
| 6491 } | 6491 } |
| 6492 }; | 6492 }; |
| 6493 | 6493 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 6510 | 6510 |
| 6511 | 6511 |
| 6512 static const int kDefaultKeyedHeaderOffsetSentinel = -1; | 6512 static const int kDefaultKeyedHeaderOffsetSentinel = -1; |
| 6513 | 6513 |
| 6514 enum LoadKeyedHoleMode { | 6514 enum LoadKeyedHoleMode { |
| 6515 NEVER_RETURN_HOLE, | 6515 NEVER_RETURN_HOLE, |
| 6516 ALLOW_RETURN_HOLE | 6516 ALLOW_RETURN_HOLE |
| 6517 }; | 6517 }; |
| 6518 | 6518 |
| 6519 | 6519 |
| 6520 class HLoadKeyed V8_FINAL | 6520 class HLoadKeyed FINAL |
| 6521 : public HTemplateInstruction<3>, public ArrayInstructionInterface { | 6521 : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
| 6522 public: | 6522 public: |
| 6523 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*, | 6523 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*, |
| 6524 ElementsKind); | 6524 ElementsKind); |
| 6525 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, | 6525 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, |
| 6526 ElementsKind, LoadKeyedHoleMode); | 6526 ElementsKind, LoadKeyedHoleMode); |
| 6527 DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*, | 6527 DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*, |
| 6528 ElementsKind, LoadKeyedHoleMode, int); | 6528 ElementsKind, LoadKeyedHoleMode, int); |
| 6529 | 6529 |
| 6530 bool is_external() const { | 6530 bool is_external() const { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 6544 } | 6544 } |
| 6545 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } | 6545 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } |
| 6546 uint32_t base_offset() const { return BaseOffsetField::decode(bit_field_); } | 6546 uint32_t base_offset() const { return BaseOffsetField::decode(bit_field_); } |
| 6547 bool TryIncreaseBaseOffset(uint32_t increase_by_value); | 6547 bool TryIncreaseBaseOffset(uint32_t increase_by_value); |
| 6548 HValue* GetKey() { return key(); } | 6548 HValue* GetKey() { return key(); } |
| 6549 void SetKey(HValue* key) { SetOperandAt(1, key); } | 6549 void SetKey(HValue* key) { SetOperandAt(1, key); } |
| 6550 bool IsDehoisted() const { return IsDehoistedField::decode(bit_field_); } | 6550 bool IsDehoisted() const { return IsDehoistedField::decode(bit_field_); } |
| 6551 void SetDehoisted(bool is_dehoisted) { | 6551 void SetDehoisted(bool is_dehoisted) { |
| 6552 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); | 6552 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); |
| 6553 } | 6553 } |
| 6554 virtual ElementsKind elements_kind() const V8_OVERRIDE { | 6554 virtual ElementsKind elements_kind() const OVERRIDE { |
| 6555 return ElementsKindField::decode(bit_field_); | 6555 return ElementsKindField::decode(bit_field_); |
| 6556 } | 6556 } |
| 6557 LoadKeyedHoleMode hole_mode() const { | 6557 LoadKeyedHoleMode hole_mode() const { |
| 6558 return HoleModeField::decode(bit_field_); | 6558 return HoleModeField::decode(bit_field_); |
| 6559 } | 6559 } |
| 6560 | 6560 |
| 6561 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6561 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 6562 // kind_fast: tagged[int32] (none) | 6562 // kind_fast: tagged[int32] (none) |
| 6563 // kind_double: tagged[int32] (none) | 6563 // kind_double: tagged[int32] (none) |
| 6564 // kind_fixed_typed_array: tagged[int32] (none) | 6564 // kind_fixed_typed_array: tagged[int32] (none) |
| 6565 // kind_external: external[int32] (none) | 6565 // kind_external: external[int32] (none) |
| 6566 if (index == 0) { | 6566 if (index == 0) { |
| 6567 return is_external() ? Representation::External() | 6567 return is_external() ? Representation::External() |
| 6568 : Representation::Tagged(); | 6568 : Representation::Tagged(); |
| 6569 } | 6569 } |
| 6570 if (index == 1) { | 6570 if (index == 1) { |
| 6571 return ArrayInstructionInterface::KeyedAccessIndexRequirement( | 6571 return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
| 6572 OperandAt(1)->representation()); | 6572 OperandAt(1)->representation()); |
| 6573 } | 6573 } |
| 6574 return Representation::None(); | 6574 return Representation::None(); |
| 6575 } | 6575 } |
| 6576 | 6576 |
| 6577 virtual Representation observed_input_representation(int index) V8_OVERRIDE { | 6577 virtual Representation observed_input_representation(int index) OVERRIDE { |
| 6578 return RequiredInputRepresentation(index); | 6578 return RequiredInputRepresentation(index); |
| 6579 } | 6579 } |
| 6580 | 6580 |
| 6581 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 6581 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 6582 | 6582 |
| 6583 bool UsesMustHandleHole() const; | 6583 bool UsesMustHandleHole() const; |
| 6584 bool AllUsesCanTreatHoleAsNaN() const; | 6584 bool AllUsesCanTreatHoleAsNaN() const; |
| 6585 bool RequiresHoleCheck() const; | 6585 bool RequiresHoleCheck() const; |
| 6586 | 6586 |
| 6587 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 6587 virtual Range* InferRange(Zone* zone) OVERRIDE; |
| 6588 | 6588 |
| 6589 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed) | 6589 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed) |
| 6590 | 6590 |
| 6591 protected: | 6591 protected: |
| 6592 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 6592 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 6593 if (!other->IsLoadKeyed()) return false; | 6593 if (!other->IsLoadKeyed()) return false; |
| 6594 HLoadKeyed* other_load = HLoadKeyed::cast(other); | 6594 HLoadKeyed* other_load = HLoadKeyed::cast(other); |
| 6595 | 6595 |
| 6596 if (IsDehoisted() && base_offset() != other_load->base_offset()) | 6596 if (IsDehoisted() && base_offset() != other_load->base_offset()) |
| 6597 return false; | 6597 return false; |
| 6598 return elements_kind() == other_load->elements_kind(); | 6598 return elements_kind() == other_load->elements_kind(); |
| 6599 } | 6599 } |
| 6600 | 6600 |
| 6601 private: | 6601 private: |
| 6602 HLoadKeyed(HValue* obj, | 6602 HLoadKeyed(HValue* obj, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6659 } else { | 6659 } else { |
| 6660 UNREACHABLE(); | 6660 UNREACHABLE(); |
| 6661 } | 6661 } |
| 6662 // Native code could change the specialized array. | 6662 // Native code could change the specialized array. |
| 6663 SetDependsOnFlag(kCalls); | 6663 SetDependsOnFlag(kCalls); |
| 6664 } | 6664 } |
| 6665 | 6665 |
| 6666 SetFlag(kUseGVN); | 6666 SetFlag(kUseGVN); |
| 6667 } | 6667 } |
| 6668 | 6668 |
| 6669 virtual bool IsDeletable() const V8_OVERRIDE { | 6669 virtual bool IsDeletable() const OVERRIDE { |
| 6670 return !RequiresHoleCheck(); | 6670 return !RequiresHoleCheck(); |
| 6671 } | 6671 } |
| 6672 | 6672 |
| 6673 // Establish some checks around our packed fields | 6673 // Establish some checks around our packed fields |
| 6674 enum LoadKeyedBits { | 6674 enum LoadKeyedBits { |
| 6675 kBitsForElementsKind = 5, | 6675 kBitsForElementsKind = 5, |
| 6676 kBitsForHoleMode = 1, | 6676 kBitsForHoleMode = 1, |
| 6677 kBitsForBaseOffset = 25, | 6677 kBitsForBaseOffset = 25, |
| 6678 kBitsForIsDehoisted = 1, | 6678 kBitsForIsDehoisted = 1, |
| 6679 | 6679 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 6695 class BaseOffsetField: | 6695 class BaseOffsetField: |
| 6696 public BitField<uint32_t, kStartBaseOffset, kBitsForBaseOffset> | 6696 public BitField<uint32_t, kStartBaseOffset, kBitsForBaseOffset> |
| 6697 {}; // NOLINT | 6697 {}; // NOLINT |
| 6698 class IsDehoistedField: | 6698 class IsDehoistedField: |
| 6699 public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted> | 6699 public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted> |
| 6700 {}; // NOLINT | 6700 {}; // NOLINT |
| 6701 uint32_t bit_field_; | 6701 uint32_t bit_field_; |
| 6702 }; | 6702 }; |
| 6703 | 6703 |
| 6704 | 6704 |
| 6705 class HLoadKeyedGeneric V8_FINAL : public HTemplateInstruction<3> { | 6705 class HLoadKeyedGeneric FINAL : public HTemplateInstruction<3> { |
| 6706 public: | 6706 public: |
| 6707 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HLoadKeyedGeneric, HValue*, | 6707 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HLoadKeyedGeneric, HValue*, |
| 6708 HValue*); | 6708 HValue*); |
| 6709 HValue* object() const { return OperandAt(0); } | 6709 HValue* object() const { return OperandAt(0); } |
| 6710 HValue* key() const { return OperandAt(1); } | 6710 HValue* key() const { return OperandAt(1); } |
| 6711 HValue* context() const { return OperandAt(2); } | 6711 HValue* context() const { return OperandAt(2); } |
| 6712 int slot() const { | 6712 int slot() const { |
| 6713 DCHECK(FLAG_vector_ics && | 6713 DCHECK(FLAG_vector_ics && |
| 6714 slot_ != FeedbackSlotInterface::kInvalidFeedbackSlot); | 6714 slot_ != FeedbackSlotInterface::kInvalidFeedbackSlot); |
| 6715 return slot_; | 6715 return slot_; |
| 6716 } | 6716 } |
| 6717 Handle<FixedArray> feedback_vector() const { return feedback_vector_; } | 6717 Handle<FixedArray> feedback_vector() const { return feedback_vector_; } |
| 6718 void SetVectorAndSlot(Handle<FixedArray> vector, int slot) { | 6718 void SetVectorAndSlot(Handle<FixedArray> vector, int slot) { |
| 6719 DCHECK(FLAG_vector_ics); | 6719 DCHECK(FLAG_vector_ics); |
| 6720 feedback_vector_ = vector; | 6720 feedback_vector_ = vector; |
| 6721 slot_ = slot; | 6721 slot_ = slot; |
| 6722 } | 6722 } |
| 6723 | 6723 |
| 6724 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 6724 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 6725 | 6725 |
| 6726 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6726 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 6727 // tagged[tagged] | 6727 // tagged[tagged] |
| 6728 return Representation::Tagged(); | 6728 return Representation::Tagged(); |
| 6729 } | 6729 } |
| 6730 | 6730 |
| 6731 virtual HValue* Canonicalize() V8_OVERRIDE; | 6731 virtual HValue* Canonicalize() OVERRIDE; |
| 6732 | 6732 |
| 6733 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) | 6733 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) |
| 6734 | 6734 |
| 6735 private: | 6735 private: |
| 6736 HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) | 6736 HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) |
| 6737 : slot_(FeedbackSlotInterface::kInvalidFeedbackSlot) { | 6737 : slot_(FeedbackSlotInterface::kInvalidFeedbackSlot) { |
| 6738 set_representation(Representation::Tagged()); | 6738 set_representation(Representation::Tagged()); |
| 6739 SetOperandAt(0, obj); | 6739 SetOperandAt(0, obj); |
| 6740 SetOperandAt(1, key); | 6740 SetOperandAt(1, key); |
| 6741 SetOperandAt(2, context); | 6741 SetOperandAt(2, context); |
| 6742 SetAllSideEffects(); | 6742 SetAllSideEffects(); |
| 6743 } | 6743 } |
| 6744 | 6744 |
| 6745 Handle<FixedArray> feedback_vector_; | 6745 Handle<FixedArray> feedback_vector_; |
| 6746 int slot_; | 6746 int slot_; |
| 6747 }; | 6747 }; |
| 6748 | 6748 |
| 6749 | 6749 |
| 6750 // Indicates whether the store is a store to an entry that was previously | 6750 // Indicates whether the store is a store to an entry that was previously |
| 6751 // initialized or not. | 6751 // initialized or not. |
| 6752 enum StoreFieldOrKeyedMode { | 6752 enum StoreFieldOrKeyedMode { |
| 6753 // The entry could be either previously initialized or not. | 6753 // The entry could be either previously initialized or not. |
| 6754 INITIALIZING_STORE, | 6754 INITIALIZING_STORE, |
| 6755 // At the time of this store it is guaranteed that the entry is already | 6755 // At the time of this store it is guaranteed that the entry is already |
| 6756 // initialized. | 6756 // initialized. |
| 6757 STORE_TO_INITIALIZED_ENTRY | 6757 STORE_TO_INITIALIZED_ENTRY |
| 6758 }; | 6758 }; |
| 6759 | 6759 |
| 6760 | 6760 |
| 6761 class HStoreNamedField V8_FINAL : public HTemplateInstruction<3> { | 6761 class HStoreNamedField FINAL : public HTemplateInstruction<3> { |
| 6762 public: | 6762 public: |
| 6763 DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*, | 6763 DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*, |
| 6764 HObjectAccess, HValue*); | 6764 HObjectAccess, HValue*); |
| 6765 DECLARE_INSTRUCTION_FACTORY_P4(HStoreNamedField, HValue*, | 6765 DECLARE_INSTRUCTION_FACTORY_P4(HStoreNamedField, HValue*, |
| 6766 HObjectAccess, HValue*, StoreFieldOrKeyedMode); | 6766 HObjectAccess, HValue*, StoreFieldOrKeyedMode); |
| 6767 | 6767 |
| 6768 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) | 6768 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) |
| 6769 | 6769 |
| 6770 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { | 6770 virtual bool HasEscapingOperandAt(int index) OVERRIDE { |
| 6771 return index == 1; | 6771 return index == 1; |
| 6772 } | 6772 } |
| 6773 virtual bool HasOutOfBoundsAccess(int size) V8_OVERRIDE { | 6773 virtual bool HasOutOfBoundsAccess(int size) OVERRIDE { |
| 6774 return !access().IsInobject() || access().offset() >= size; | 6774 return !access().IsInobject() || access().offset() >= size; |
| 6775 } | 6775 } |
| 6776 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6776 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 6777 if (index == 0 && access().IsExternalMemory()) { | 6777 if (index == 0 && access().IsExternalMemory()) { |
| 6778 // object must be external in case of external memory access | 6778 // object must be external in case of external memory access |
| 6779 return Representation::External(); | 6779 return Representation::External(); |
| 6780 } else if (index == 1) { | 6780 } else if (index == 1) { |
| 6781 if (field_representation().IsInteger8() || | 6781 if (field_representation().IsInteger8() || |
| 6782 field_representation().IsUInteger8() || | 6782 field_representation().IsUInteger8() || |
| 6783 field_representation().IsInteger16() || | 6783 field_representation().IsInteger16() || |
| 6784 field_representation().IsUInteger16() || | 6784 field_representation().IsUInteger16() || |
| 6785 field_representation().IsInteger32()) { | 6785 field_representation().IsInteger32()) { |
| 6786 return Representation::Integer32(); | 6786 return Representation::Integer32(); |
| 6787 } else if (field_representation().IsDouble()) { | 6787 } else if (field_representation().IsDouble()) { |
| 6788 return field_representation(); | 6788 return field_representation(); |
| 6789 } else if (field_representation().IsSmi()) { | 6789 } else if (field_representation().IsSmi()) { |
| 6790 if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) { | 6790 if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) { |
| 6791 return Representation::Integer32(); | 6791 return Representation::Integer32(); |
| 6792 } | 6792 } |
| 6793 return field_representation(); | 6793 return field_representation(); |
| 6794 } else if (field_representation().IsExternal()) { | 6794 } else if (field_representation().IsExternal()) { |
| 6795 return Representation::External(); | 6795 return Representation::External(); |
| 6796 } | 6796 } |
| 6797 } | 6797 } |
| 6798 return Representation::Tagged(); | 6798 return Representation::Tagged(); |
| 6799 } | 6799 } |
| 6800 virtual bool HandleSideEffectDominator(GVNFlag side_effect, | 6800 virtual bool HandleSideEffectDominator(GVNFlag side_effect, |
| 6801 HValue* dominator) V8_OVERRIDE { | 6801 HValue* dominator) OVERRIDE { |
| 6802 DCHECK(side_effect == kNewSpacePromotion); | 6802 DCHECK(side_effect == kNewSpacePromotion); |
| 6803 if (!FLAG_use_write_barrier_elimination) return false; | 6803 if (!FLAG_use_write_barrier_elimination) return false; |
| 6804 dominator_ = dominator; | 6804 dominator_ = dominator; |
| 6805 return false; | 6805 return false; |
| 6806 } | 6806 } |
| 6807 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 6807 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 6808 | 6808 |
| 6809 HValue* object() const { return OperandAt(0); } | 6809 HValue* object() const { return OperandAt(0); } |
| 6810 HValue* value() const { return OperandAt(1); } | 6810 HValue* value() const { return OperandAt(1); } |
| 6811 HValue* transition() const { return OperandAt(2); } | 6811 HValue* transition() const { return OperandAt(2); } |
| 6812 | 6812 |
| 6813 HObjectAccess access() const { return access_; } | 6813 HObjectAccess access() const { return access_; } |
| 6814 HValue* dominator() const { return dominator_; } | 6814 HValue* dominator() const { return dominator_; } |
| 6815 bool has_transition() const { return has_transition_; } | 6815 bool has_transition() const { return has_transition_; } |
| 6816 StoreFieldOrKeyedMode store_mode() const { return store_mode_; } | 6816 StoreFieldOrKeyedMode store_mode() const { return store_mode_; } |
| 6817 | 6817 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6896 access.SetGVNFlags(this, STORE); | 6896 access.SetGVNFlags(this, STORE); |
| 6897 } | 6897 } |
| 6898 | 6898 |
| 6899 HObjectAccess access_; | 6899 HObjectAccess access_; |
| 6900 HValue* dominator_; | 6900 HValue* dominator_; |
| 6901 bool has_transition_ : 1; | 6901 bool has_transition_ : 1; |
| 6902 StoreFieldOrKeyedMode store_mode_ : 1; | 6902 StoreFieldOrKeyedMode store_mode_ : 1; |
| 6903 }; | 6903 }; |
| 6904 | 6904 |
| 6905 | 6905 |
| 6906 class HStoreNamedGeneric V8_FINAL : public HTemplateInstruction<3> { | 6906 class HStoreNamedGeneric FINAL : public HTemplateInstruction<3> { |
| 6907 public: | 6907 public: |
| 6908 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreNamedGeneric, HValue*, | 6908 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreNamedGeneric, HValue*, |
| 6909 Handle<String>, HValue*, | 6909 Handle<String>, HValue*, |
| 6910 StrictMode); | 6910 StrictMode); |
| 6911 HValue* object() const { return OperandAt(0); } | 6911 HValue* object() const { return OperandAt(0); } |
| 6912 HValue* value() const { return OperandAt(1); } | 6912 HValue* value() const { return OperandAt(1); } |
| 6913 HValue* context() const { return OperandAt(2); } | 6913 HValue* context() const { return OperandAt(2); } |
| 6914 Handle<String> name() const { return name_; } | 6914 Handle<String> name() const { return name_; } |
| 6915 StrictMode strict_mode() const { return strict_mode_; } | 6915 StrictMode strict_mode() const { return strict_mode_; } |
| 6916 | 6916 |
| 6917 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 6917 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 6918 | 6918 |
| 6919 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6919 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 6920 return Representation::Tagged(); | 6920 return Representation::Tagged(); |
| 6921 } | 6921 } |
| 6922 | 6922 |
| 6923 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) | 6923 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) |
| 6924 | 6924 |
| 6925 private: | 6925 private: |
| 6926 HStoreNamedGeneric(HValue* context, | 6926 HStoreNamedGeneric(HValue* context, |
| 6927 HValue* object, | 6927 HValue* object, |
| 6928 Handle<String> name, | 6928 Handle<String> name, |
| 6929 HValue* value, | 6929 HValue* value, |
| 6930 StrictMode strict_mode) | 6930 StrictMode strict_mode) |
| 6931 : name_(name), | 6931 : name_(name), |
| 6932 strict_mode_(strict_mode) { | 6932 strict_mode_(strict_mode) { |
| 6933 SetOperandAt(0, object); | 6933 SetOperandAt(0, object); |
| 6934 SetOperandAt(1, value); | 6934 SetOperandAt(1, value); |
| 6935 SetOperandAt(2, context); | 6935 SetOperandAt(2, context); |
| 6936 SetAllSideEffects(); | 6936 SetAllSideEffects(); |
| 6937 } | 6937 } |
| 6938 | 6938 |
| 6939 Handle<String> name_; | 6939 Handle<String> name_; |
| 6940 StrictMode strict_mode_; | 6940 StrictMode strict_mode_; |
| 6941 }; | 6941 }; |
| 6942 | 6942 |
| 6943 | 6943 |
| 6944 class HStoreKeyed V8_FINAL | 6944 class HStoreKeyed FINAL |
| 6945 : public HTemplateInstruction<3>, public ArrayInstructionInterface { | 6945 : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
| 6946 public: | 6946 public: |
| 6947 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*, | 6947 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*, |
| 6948 ElementsKind); | 6948 ElementsKind); |
| 6949 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*, | 6949 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*, |
| 6950 ElementsKind, StoreFieldOrKeyedMode); | 6950 ElementsKind, StoreFieldOrKeyedMode); |
| 6951 DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*, | 6951 DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*, |
| 6952 ElementsKind, StoreFieldOrKeyedMode, int); | 6952 ElementsKind, StoreFieldOrKeyedMode, int); |
| 6953 | 6953 |
| 6954 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6954 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 6955 // kind_fast: tagged[int32] = tagged | 6955 // kind_fast: tagged[int32] = tagged |
| 6956 // kind_double: tagged[int32] = double | 6956 // kind_double: tagged[int32] = double |
| 6957 // kind_smi : tagged[int32] = smi | 6957 // kind_smi : tagged[int32] = smi |
| 6958 // kind_fixed_typed_array: tagged[int32] = (double | int32) | 6958 // kind_fixed_typed_array: tagged[int32] = (double | int32) |
| 6959 // kind_external: external[int32] = (double | int32) | 6959 // kind_external: external[int32] = (double | int32) |
| 6960 if (index == 0) { | 6960 if (index == 0) { |
| 6961 return is_external() ? Representation::External() | 6961 return is_external() ? Representation::External() |
| 6962 : Representation::Tagged(); | 6962 : Representation::Tagged(); |
| 6963 } else if (index == 1) { | 6963 } else if (index == 1) { |
| 6964 return ArrayInstructionInterface::KeyedAccessIndexRequirement( | 6964 return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
| (...skipping 30 matching lines...) Expand all Loading... |
| 6995 } | 6995 } |
| 6996 | 6996 |
| 6997 bool is_fixed_typed_array() const { | 6997 bool is_fixed_typed_array() const { |
| 6998 return IsFixedTypedArrayElementsKind(elements_kind()); | 6998 return IsFixedTypedArrayElementsKind(elements_kind()); |
| 6999 } | 6999 } |
| 7000 | 7000 |
| 7001 bool is_typed_elements() const { | 7001 bool is_typed_elements() const { |
| 7002 return is_external() || is_fixed_typed_array(); | 7002 return is_external() || is_fixed_typed_array(); |
| 7003 } | 7003 } |
| 7004 | 7004 |
| 7005 virtual Representation observed_input_representation(int index) V8_OVERRIDE { | 7005 virtual Representation observed_input_representation(int index) OVERRIDE { |
| 7006 if (index < 2) return RequiredInputRepresentation(index); | 7006 if (index < 2) return RequiredInputRepresentation(index); |
| 7007 if (IsUninitialized()) { | 7007 if (IsUninitialized()) { |
| 7008 return Representation::None(); | 7008 return Representation::None(); |
| 7009 } | 7009 } |
| 7010 Representation r = RequiredValueRepresentation(elements_kind_, store_mode_); | 7010 Representation r = RequiredValueRepresentation(elements_kind_, store_mode_); |
| 7011 // For fast object elements kinds, don't assume anything. | 7011 // For fast object elements kinds, don't assume anything. |
| 7012 if (r.IsTagged()) return Representation::None(); | 7012 if (r.IsTagged()) return Representation::None(); |
| 7013 return r; | 7013 return r; |
| 7014 } | 7014 } |
| 7015 | 7015 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 7030 bool IsUninitialized() { return is_uninitialized_; } | 7030 bool IsUninitialized() { return is_uninitialized_; } |
| 7031 void SetUninitialized(bool is_uninitialized) { | 7031 void SetUninitialized(bool is_uninitialized) { |
| 7032 is_uninitialized_ = is_uninitialized; | 7032 is_uninitialized_ = is_uninitialized; |
| 7033 } | 7033 } |
| 7034 | 7034 |
| 7035 bool IsConstantHoleStore() { | 7035 bool IsConstantHoleStore() { |
| 7036 return value()->IsConstant() && HConstant::cast(value())->IsTheHole(); | 7036 return value()->IsConstant() && HConstant::cast(value())->IsTheHole(); |
| 7037 } | 7037 } |
| 7038 | 7038 |
| 7039 virtual bool HandleSideEffectDominator(GVNFlag side_effect, | 7039 virtual bool HandleSideEffectDominator(GVNFlag side_effect, |
| 7040 HValue* dominator) V8_OVERRIDE { | 7040 HValue* dominator) OVERRIDE { |
| 7041 DCHECK(side_effect == kNewSpacePromotion); | 7041 DCHECK(side_effect == kNewSpacePromotion); |
| 7042 dominator_ = dominator; | 7042 dominator_ = dominator; |
| 7043 return false; | 7043 return false; |
| 7044 } | 7044 } |
| 7045 | 7045 |
| 7046 HValue* dominator() const { return dominator_; } | 7046 HValue* dominator() const { return dominator_; } |
| 7047 | 7047 |
| 7048 bool NeedsWriteBarrier() { | 7048 bool NeedsWriteBarrier() { |
| 7049 if (value_is_smi()) { | 7049 if (value_is_smi()) { |
| 7050 return false; | 7050 return false; |
| 7051 } else { | 7051 } else { |
| 7052 return StoringValueNeedsWriteBarrier(value()) && | 7052 return StoringValueNeedsWriteBarrier(value()) && |
| 7053 ReceiverObjectNeedsWriteBarrier(elements(), value(), dominator()); | 7053 ReceiverObjectNeedsWriteBarrier(elements(), value(), dominator()); |
| 7054 } | 7054 } |
| 7055 } | 7055 } |
| 7056 | 7056 |
| 7057 PointersToHereCheck PointersToHereCheckForValue() const { | 7057 PointersToHereCheck PointersToHereCheckForValue() const { |
| 7058 return PointersToHereCheckForObject(value(), dominator()); | 7058 return PointersToHereCheckForObject(value(), dominator()); |
| 7059 } | 7059 } |
| 7060 | 7060 |
| 7061 bool NeedsCanonicalization(); | 7061 bool NeedsCanonicalization(); |
| 7062 | 7062 |
| 7063 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 7063 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 7064 | 7064 |
| 7065 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) | 7065 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) |
| 7066 | 7066 |
| 7067 private: | 7067 private: |
| 7068 HStoreKeyed(HValue* obj, HValue* key, HValue* val, | 7068 HStoreKeyed(HValue* obj, HValue* key, HValue* val, |
| 7069 ElementsKind elements_kind, | 7069 ElementsKind elements_kind, |
| 7070 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE, | 7070 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE, |
| 7071 int offset = kDefaultKeyedHeaderOffsetSentinel) | 7071 int offset = kDefaultKeyedHeaderOffsetSentinel) |
| 7072 : elements_kind_(elements_kind), | 7072 : elements_kind_(elements_kind), |
| 7073 base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel | 7073 base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7110 | 7110 |
| 7111 ElementsKind elements_kind_; | 7111 ElementsKind elements_kind_; |
| 7112 uint32_t base_offset_; | 7112 uint32_t base_offset_; |
| 7113 bool is_dehoisted_ : 1; | 7113 bool is_dehoisted_ : 1; |
| 7114 bool is_uninitialized_ : 1; | 7114 bool is_uninitialized_ : 1; |
| 7115 StoreFieldOrKeyedMode store_mode_: 1; | 7115 StoreFieldOrKeyedMode store_mode_: 1; |
| 7116 HValue* dominator_; | 7116 HValue* dominator_; |
| 7117 }; | 7117 }; |
| 7118 | 7118 |
| 7119 | 7119 |
| 7120 class HStoreKeyedGeneric V8_FINAL : public HTemplateInstruction<4> { | 7120 class HStoreKeyedGeneric FINAL : public HTemplateInstruction<4> { |
| 7121 public: | 7121 public: |
| 7122 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*, | 7122 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*, |
| 7123 HValue*, HValue*, StrictMode); | 7123 HValue*, HValue*, StrictMode); |
| 7124 | 7124 |
| 7125 HValue* object() const { return OperandAt(0); } | 7125 HValue* object() const { return OperandAt(0); } |
| 7126 HValue* key() const { return OperandAt(1); } | 7126 HValue* key() const { return OperandAt(1); } |
| 7127 HValue* value() const { return OperandAt(2); } | 7127 HValue* value() const { return OperandAt(2); } |
| 7128 HValue* context() const { return OperandAt(3); } | 7128 HValue* context() const { return OperandAt(3); } |
| 7129 StrictMode strict_mode() const { return strict_mode_; } | 7129 StrictMode strict_mode() const { return strict_mode_; } |
| 7130 | 7130 |
| 7131 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7131 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7132 // tagged[tagged] = tagged | 7132 // tagged[tagged] = tagged |
| 7133 return Representation::Tagged(); | 7133 return Representation::Tagged(); |
| 7134 } | 7134 } |
| 7135 | 7135 |
| 7136 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 7136 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 7137 | 7137 |
| 7138 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) | 7138 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) |
| 7139 | 7139 |
| 7140 private: | 7140 private: |
| 7141 HStoreKeyedGeneric(HValue* context, | 7141 HStoreKeyedGeneric(HValue* context, |
| 7142 HValue* object, | 7142 HValue* object, |
| 7143 HValue* key, | 7143 HValue* key, |
| 7144 HValue* value, | 7144 HValue* value, |
| 7145 StrictMode strict_mode) | 7145 StrictMode strict_mode) |
| 7146 : strict_mode_(strict_mode) { | 7146 : strict_mode_(strict_mode) { |
| 7147 SetOperandAt(0, object); | 7147 SetOperandAt(0, object); |
| 7148 SetOperandAt(1, key); | 7148 SetOperandAt(1, key); |
| 7149 SetOperandAt(2, value); | 7149 SetOperandAt(2, value); |
| 7150 SetOperandAt(3, context); | 7150 SetOperandAt(3, context); |
| 7151 SetAllSideEffects(); | 7151 SetAllSideEffects(); |
| 7152 } | 7152 } |
| 7153 | 7153 |
| 7154 StrictMode strict_mode_; | 7154 StrictMode strict_mode_; |
| 7155 }; | 7155 }; |
| 7156 | 7156 |
| 7157 | 7157 |
| 7158 class HTransitionElementsKind V8_FINAL : public HTemplateInstruction<2> { | 7158 class HTransitionElementsKind FINAL : public HTemplateInstruction<2> { |
| 7159 public: | 7159 public: |
| 7160 inline static HTransitionElementsKind* New(Zone* zone, | 7160 inline static HTransitionElementsKind* New(Zone* zone, |
| 7161 HValue* context, | 7161 HValue* context, |
| 7162 HValue* object, | 7162 HValue* object, |
| 7163 Handle<Map> original_map, | 7163 Handle<Map> original_map, |
| 7164 Handle<Map> transitioned_map) { | 7164 Handle<Map> transitioned_map) { |
| 7165 return new(zone) HTransitionElementsKind(context, object, | 7165 return new(zone) HTransitionElementsKind(context, object, |
| 7166 original_map, transitioned_map); | 7166 original_map, transitioned_map); |
| 7167 } | 7167 } |
| 7168 | 7168 |
| 7169 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7169 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7170 return Representation::Tagged(); | 7170 return Representation::Tagged(); |
| 7171 } | 7171 } |
| 7172 | 7172 |
| 7173 HValue* object() const { return OperandAt(0); } | 7173 HValue* object() const { return OperandAt(0); } |
| 7174 HValue* context() const { return OperandAt(1); } | 7174 HValue* context() const { return OperandAt(1); } |
| 7175 Unique<Map> original_map() const { return original_map_; } | 7175 Unique<Map> original_map() const { return original_map_; } |
| 7176 Unique<Map> transitioned_map() const { return transitioned_map_; } | 7176 Unique<Map> transitioned_map() const { return transitioned_map_; } |
| 7177 ElementsKind from_kind() const { return from_kind_; } | 7177 ElementsKind from_kind() const { return from_kind_; } |
| 7178 ElementsKind to_kind() const { return to_kind_; } | 7178 ElementsKind to_kind() const { return to_kind_; } |
| 7179 | 7179 |
| 7180 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 7180 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 7181 | 7181 |
| 7182 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) | 7182 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) |
| 7183 | 7183 |
| 7184 protected: | 7184 protected: |
| 7185 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 7185 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 7186 HTransitionElementsKind* instr = HTransitionElementsKind::cast(other); | 7186 HTransitionElementsKind* instr = HTransitionElementsKind::cast(other); |
| 7187 return original_map_ == instr->original_map_ && | 7187 return original_map_ == instr->original_map_ && |
| 7188 transitioned_map_ == instr->transitioned_map_; | 7188 transitioned_map_ == instr->transitioned_map_; |
| 7189 } | 7189 } |
| 7190 | 7190 |
| 7191 virtual int RedefinedOperandIndex() { return 0; } | 7191 virtual int RedefinedOperandIndex() { return 0; } |
| 7192 | 7192 |
| 7193 private: | 7193 private: |
| 7194 HTransitionElementsKind(HValue* context, | 7194 HTransitionElementsKind(HValue* context, |
| 7195 HValue* object, | 7195 HValue* object, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 7210 set_representation(Representation::Tagged()); | 7210 set_representation(Representation::Tagged()); |
| 7211 } | 7211 } |
| 7212 | 7212 |
| 7213 Unique<Map> original_map_; | 7213 Unique<Map> original_map_; |
| 7214 Unique<Map> transitioned_map_; | 7214 Unique<Map> transitioned_map_; |
| 7215 ElementsKind from_kind_; | 7215 ElementsKind from_kind_; |
| 7216 ElementsKind to_kind_; | 7216 ElementsKind to_kind_; |
| 7217 }; | 7217 }; |
| 7218 | 7218 |
| 7219 | 7219 |
| 7220 class HStringAdd V8_FINAL : public HBinaryOperation { | 7220 class HStringAdd FINAL : public HBinaryOperation { |
| 7221 public: | 7221 public: |
| 7222 static HInstruction* New(Zone* zone, | 7222 static HInstruction* New(Zone* zone, |
| 7223 HValue* context, | 7223 HValue* context, |
| 7224 HValue* left, | 7224 HValue* left, |
| 7225 HValue* right, | 7225 HValue* right, |
| 7226 PretenureFlag pretenure_flag = NOT_TENURED, | 7226 PretenureFlag pretenure_flag = NOT_TENURED, |
| 7227 StringAddFlags flags = STRING_ADD_CHECK_BOTH, | 7227 StringAddFlags flags = STRING_ADD_CHECK_BOTH, |
| 7228 Handle<AllocationSite> allocation_site = | 7228 Handle<AllocationSite> allocation_site = |
| 7229 Handle<AllocationSite>::null()); | 7229 Handle<AllocationSite>::null()); |
| 7230 | 7230 |
| 7231 StringAddFlags flags() const { return flags_; } | 7231 StringAddFlags flags() const { return flags_; } |
| 7232 PretenureFlag pretenure_flag() const { return pretenure_flag_; } | 7232 PretenureFlag pretenure_flag() const { return pretenure_flag_; } |
| 7233 | 7233 |
| 7234 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7234 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7235 return Representation::Tagged(); | 7235 return Representation::Tagged(); |
| 7236 } | 7236 } |
| 7237 | 7237 |
| 7238 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 7238 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 7239 | 7239 |
| 7240 DECLARE_CONCRETE_INSTRUCTION(StringAdd) | 7240 DECLARE_CONCRETE_INSTRUCTION(StringAdd) |
| 7241 | 7241 |
| 7242 protected: | 7242 protected: |
| 7243 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 7243 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 7244 return flags_ == HStringAdd::cast(other)->flags_ && | 7244 return flags_ == HStringAdd::cast(other)->flags_ && |
| 7245 pretenure_flag_ == HStringAdd::cast(other)->pretenure_flag_; | 7245 pretenure_flag_ == HStringAdd::cast(other)->pretenure_flag_; |
| 7246 } | 7246 } |
| 7247 | 7247 |
| 7248 private: | 7248 private: |
| 7249 HStringAdd(HValue* context, | 7249 HStringAdd(HValue* context, |
| 7250 HValue* left, | 7250 HValue* left, |
| 7251 HValue* right, | 7251 HValue* right, |
| 7252 PretenureFlag pretenure_flag, | 7252 PretenureFlag pretenure_flag, |
| 7253 StringAddFlags flags, | 7253 StringAddFlags flags, |
| 7254 Handle<AllocationSite> allocation_site) | 7254 Handle<AllocationSite> allocation_site) |
| 7255 : HBinaryOperation(context, left, right, HType::String()), | 7255 : HBinaryOperation(context, left, right, HType::String()), |
| 7256 flags_(flags), pretenure_flag_(pretenure_flag) { | 7256 flags_(flags), pretenure_flag_(pretenure_flag) { |
| 7257 set_representation(Representation::Tagged()); | 7257 set_representation(Representation::Tagged()); |
| 7258 SetFlag(kUseGVN); | 7258 SetFlag(kUseGVN); |
| 7259 SetDependsOnFlag(kMaps); | 7259 SetDependsOnFlag(kMaps); |
| 7260 SetChangesFlag(kNewSpacePromotion); | 7260 SetChangesFlag(kNewSpacePromotion); |
| 7261 if (FLAG_trace_pretenuring) { | 7261 if (FLAG_trace_pretenuring) { |
| 7262 PrintF("HStringAdd with AllocationSite %p %s\n", | 7262 PrintF("HStringAdd with AllocationSite %p %s\n", |
| 7263 allocation_site.is_null() | 7263 allocation_site.is_null() |
| 7264 ? static_cast<void*>(NULL) | 7264 ? static_cast<void*>(NULL) |
| 7265 : static_cast<void*>(*allocation_site), | 7265 : static_cast<void*>(*allocation_site), |
| 7266 pretenure_flag == TENURED ? "tenured" : "not tenured"); | 7266 pretenure_flag == TENURED ? "tenured" : "not tenured"); |
| 7267 } | 7267 } |
| 7268 } | 7268 } |
| 7269 | 7269 |
| 7270 // No side-effects except possible allocation: | 7270 // No side-effects except possible allocation: |
| 7271 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7271 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 7272 | 7272 |
| 7273 const StringAddFlags flags_; | 7273 const StringAddFlags flags_; |
| 7274 const PretenureFlag pretenure_flag_; | 7274 const PretenureFlag pretenure_flag_; |
| 7275 }; | 7275 }; |
| 7276 | 7276 |
| 7277 | 7277 |
| 7278 class HStringCharCodeAt V8_FINAL : public HTemplateInstruction<3> { | 7278 class HStringCharCodeAt FINAL : public HTemplateInstruction<3> { |
| 7279 public: | 7279 public: |
| 7280 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HStringCharCodeAt, | 7280 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HStringCharCodeAt, |
| 7281 HValue*, | 7281 HValue*, |
| 7282 HValue*); | 7282 HValue*); |
| 7283 | 7283 |
| 7284 virtual Representation RequiredInputRepresentation(int index) { | 7284 virtual Representation RequiredInputRepresentation(int index) { |
| 7285 // The index is supposed to be Integer32. | 7285 // The index is supposed to be Integer32. |
| 7286 return index == 2 | 7286 return index == 2 |
| 7287 ? Representation::Integer32() | 7287 ? Representation::Integer32() |
| 7288 : Representation::Tagged(); | 7288 : Representation::Tagged(); |
| 7289 } | 7289 } |
| 7290 | 7290 |
| 7291 HValue* context() const { return OperandAt(0); } | 7291 HValue* context() const { return OperandAt(0); } |
| 7292 HValue* string() const { return OperandAt(1); } | 7292 HValue* string() const { return OperandAt(1); } |
| 7293 HValue* index() const { return OperandAt(2); } | 7293 HValue* index() const { return OperandAt(2); } |
| 7294 | 7294 |
| 7295 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt) | 7295 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt) |
| 7296 | 7296 |
| 7297 protected: | 7297 protected: |
| 7298 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 7298 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 7299 | 7299 |
| 7300 virtual Range* InferRange(Zone* zone) V8_OVERRIDE { | 7300 virtual Range* InferRange(Zone* zone) OVERRIDE { |
| 7301 return new(zone) Range(0, String::kMaxUtf16CodeUnit); | 7301 return new(zone) Range(0, String::kMaxUtf16CodeUnit); |
| 7302 } | 7302 } |
| 7303 | 7303 |
| 7304 private: | 7304 private: |
| 7305 HStringCharCodeAt(HValue* context, HValue* string, HValue* index) { | 7305 HStringCharCodeAt(HValue* context, HValue* string, HValue* index) { |
| 7306 SetOperandAt(0, context); | 7306 SetOperandAt(0, context); |
| 7307 SetOperandAt(1, string); | 7307 SetOperandAt(1, string); |
| 7308 SetOperandAt(2, index); | 7308 SetOperandAt(2, index); |
| 7309 set_representation(Representation::Integer32()); | 7309 set_representation(Representation::Integer32()); |
| 7310 SetFlag(kUseGVN); | 7310 SetFlag(kUseGVN); |
| 7311 SetDependsOnFlag(kMaps); | 7311 SetDependsOnFlag(kMaps); |
| 7312 SetDependsOnFlag(kStringChars); | 7312 SetDependsOnFlag(kStringChars); |
| 7313 SetChangesFlag(kNewSpacePromotion); | 7313 SetChangesFlag(kNewSpacePromotion); |
| 7314 } | 7314 } |
| 7315 | 7315 |
| 7316 // No side effects: runtime function assumes string + number inputs. | 7316 // No side effects: runtime function assumes string + number inputs. |
| 7317 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7317 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 7318 }; | 7318 }; |
| 7319 | 7319 |
| 7320 | 7320 |
| 7321 class HStringCharFromCode V8_FINAL : public HTemplateInstruction<2> { | 7321 class HStringCharFromCode FINAL : public HTemplateInstruction<2> { |
| 7322 public: | 7322 public: |
| 7323 static HInstruction* New(Zone* zone, | 7323 static HInstruction* New(Zone* zone, |
| 7324 HValue* context, | 7324 HValue* context, |
| 7325 HValue* char_code); | 7325 HValue* char_code); |
| 7326 | 7326 |
| 7327 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7327 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7328 return index == 0 | 7328 return index == 0 |
| 7329 ? Representation::Tagged() | 7329 ? Representation::Tagged() |
| 7330 : Representation::Integer32(); | 7330 : Representation::Integer32(); |
| 7331 } | 7331 } |
| 7332 | 7332 |
| 7333 HValue* context() const { return OperandAt(0); } | 7333 HValue* context() const { return OperandAt(0); } |
| 7334 HValue* value() const { return OperandAt(1); } | 7334 HValue* value() const { return OperandAt(1); } |
| 7335 | 7335 |
| 7336 virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } | 7336 virtual bool DataEquals(HValue* other) OVERRIDE { return true; } |
| 7337 | 7337 |
| 7338 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) | 7338 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) |
| 7339 | 7339 |
| 7340 private: | 7340 private: |
| 7341 HStringCharFromCode(HValue* context, HValue* char_code) | 7341 HStringCharFromCode(HValue* context, HValue* char_code) |
| 7342 : HTemplateInstruction<2>(HType::String()) { | 7342 : HTemplateInstruction<2>(HType::String()) { |
| 7343 SetOperandAt(0, context); | 7343 SetOperandAt(0, context); |
| 7344 SetOperandAt(1, char_code); | 7344 SetOperandAt(1, char_code); |
| 7345 set_representation(Representation::Tagged()); | 7345 set_representation(Representation::Tagged()); |
| 7346 SetFlag(kUseGVN); | 7346 SetFlag(kUseGVN); |
| 7347 SetChangesFlag(kNewSpacePromotion); | 7347 SetChangesFlag(kNewSpacePromotion); |
| 7348 } | 7348 } |
| 7349 | 7349 |
| 7350 virtual bool IsDeletable() const V8_OVERRIDE { | 7350 virtual bool IsDeletable() const OVERRIDE { |
| 7351 return !value()->ToNumberCanBeObserved(); | 7351 return !value()->ToNumberCanBeObserved(); |
| 7352 } | 7352 } |
| 7353 }; | 7353 }; |
| 7354 | 7354 |
| 7355 | 7355 |
| 7356 template <int V> | 7356 template <int V> |
| 7357 class HMaterializedLiteral : public HTemplateInstruction<V> { | 7357 class HMaterializedLiteral : public HTemplateInstruction<V> { |
| 7358 public: | 7358 public: |
| 7359 HMaterializedLiteral<V>(int index, int depth, AllocationSiteMode mode) | 7359 HMaterializedLiteral<V>(int index, int depth, AllocationSiteMode mode) |
| 7360 : literal_index_(index), depth_(depth), allocation_site_mode_(mode) { | 7360 : literal_index_(index), depth_(depth), allocation_site_mode_(mode) { |
| 7361 this->set_representation(Representation::Tagged()); | 7361 this->set_representation(Representation::Tagged()); |
| 7362 } | 7362 } |
| 7363 | 7363 |
| 7364 HMaterializedLiteral<V>(int index, int depth) | 7364 HMaterializedLiteral<V>(int index, int depth) |
| 7365 : literal_index_(index), depth_(depth), | 7365 : literal_index_(index), depth_(depth), |
| 7366 allocation_site_mode_(DONT_TRACK_ALLOCATION_SITE) { | 7366 allocation_site_mode_(DONT_TRACK_ALLOCATION_SITE) { |
| 7367 this->set_representation(Representation::Tagged()); | 7367 this->set_representation(Representation::Tagged()); |
| 7368 } | 7368 } |
| 7369 | 7369 |
| 7370 int literal_index() const { return literal_index_; } | 7370 int literal_index() const { return literal_index_; } |
| 7371 int depth() const { return depth_; } | 7371 int depth() const { return depth_; } |
| 7372 AllocationSiteMode allocation_site_mode() const { | 7372 AllocationSiteMode allocation_site_mode() const { |
| 7373 return allocation_site_mode_; | 7373 return allocation_site_mode_; |
| 7374 } | 7374 } |
| 7375 | 7375 |
| 7376 private: | 7376 private: |
| 7377 virtual bool IsDeletable() const V8_FINAL V8_OVERRIDE { return true; } | 7377 virtual bool IsDeletable() const FINAL OVERRIDE { return true; } |
| 7378 | 7378 |
| 7379 int literal_index_; | 7379 int literal_index_; |
| 7380 int depth_; | 7380 int depth_; |
| 7381 AllocationSiteMode allocation_site_mode_; | 7381 AllocationSiteMode allocation_site_mode_; |
| 7382 }; | 7382 }; |
| 7383 | 7383 |
| 7384 | 7384 |
| 7385 class HRegExpLiteral V8_FINAL : public HMaterializedLiteral<1> { | 7385 class HRegExpLiteral FINAL : public HMaterializedLiteral<1> { |
| 7386 public: | 7386 public: |
| 7387 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HRegExpLiteral, | 7387 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HRegExpLiteral, |
| 7388 Handle<FixedArray>, | 7388 Handle<FixedArray>, |
| 7389 Handle<String>, | 7389 Handle<String>, |
| 7390 Handle<String>, | 7390 Handle<String>, |
| 7391 int); | 7391 int); |
| 7392 | 7392 |
| 7393 HValue* context() { return OperandAt(0); } | 7393 HValue* context() { return OperandAt(0); } |
| 7394 Handle<FixedArray> literals() { return literals_; } | 7394 Handle<FixedArray> literals() { return literals_; } |
| 7395 Handle<String> pattern() { return pattern_; } | 7395 Handle<String> pattern() { return pattern_; } |
| 7396 Handle<String> flags() { return flags_; } | 7396 Handle<String> flags() { return flags_; } |
| 7397 | 7397 |
| 7398 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7398 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7399 return Representation::Tagged(); | 7399 return Representation::Tagged(); |
| 7400 } | 7400 } |
| 7401 | 7401 |
| 7402 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral) | 7402 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral) |
| 7403 | 7403 |
| 7404 private: | 7404 private: |
| 7405 HRegExpLiteral(HValue* context, | 7405 HRegExpLiteral(HValue* context, |
| 7406 Handle<FixedArray> literals, | 7406 Handle<FixedArray> literals, |
| 7407 Handle<String> pattern, | 7407 Handle<String> pattern, |
| 7408 Handle<String> flags, | 7408 Handle<String> flags, |
| 7409 int literal_index) | 7409 int literal_index) |
| 7410 : HMaterializedLiteral<1>(literal_index, 0), | 7410 : HMaterializedLiteral<1>(literal_index, 0), |
| 7411 literals_(literals), | 7411 literals_(literals), |
| 7412 pattern_(pattern), | 7412 pattern_(pattern), |
| 7413 flags_(flags) { | 7413 flags_(flags) { |
| 7414 SetOperandAt(0, context); | 7414 SetOperandAt(0, context); |
| 7415 SetAllSideEffects(); | 7415 SetAllSideEffects(); |
| 7416 set_type(HType::JSObject()); | 7416 set_type(HType::JSObject()); |
| 7417 } | 7417 } |
| 7418 | 7418 |
| 7419 Handle<FixedArray> literals_; | 7419 Handle<FixedArray> literals_; |
| 7420 Handle<String> pattern_; | 7420 Handle<String> pattern_; |
| 7421 Handle<String> flags_; | 7421 Handle<String> flags_; |
| 7422 }; | 7422 }; |
| 7423 | 7423 |
| 7424 | 7424 |
| 7425 class HFunctionLiteral V8_FINAL : public HTemplateInstruction<1> { | 7425 class HFunctionLiteral FINAL : public HTemplateInstruction<1> { |
| 7426 public: | 7426 public: |
| 7427 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HFunctionLiteral, | 7427 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HFunctionLiteral, |
| 7428 Handle<SharedFunctionInfo>, | 7428 Handle<SharedFunctionInfo>, |
| 7429 bool); | 7429 bool); |
| 7430 HValue* context() { return OperandAt(0); } | 7430 HValue* context() { return OperandAt(0); } |
| 7431 | 7431 |
| 7432 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7432 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7433 return Representation::Tagged(); | 7433 return Representation::Tagged(); |
| 7434 } | 7434 } |
| 7435 | 7435 |
| 7436 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) | 7436 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) |
| 7437 | 7437 |
| 7438 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } | 7438 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } |
| 7439 bool pretenure() const { return pretenure_; } | 7439 bool pretenure() const { return pretenure_; } |
| 7440 bool has_no_literals() const { return has_no_literals_; } | 7440 bool has_no_literals() const { return has_no_literals_; } |
| 7441 bool is_generator() const { return is_generator_; } | 7441 bool is_generator() const { return is_generator_; } |
| 7442 StrictMode strict_mode() const { return strict_mode_; } | 7442 StrictMode strict_mode() const { return strict_mode_; } |
| 7443 | 7443 |
| 7444 private: | 7444 private: |
| 7445 HFunctionLiteral(HValue* context, | 7445 HFunctionLiteral(HValue* context, |
| 7446 Handle<SharedFunctionInfo> shared, | 7446 Handle<SharedFunctionInfo> shared, |
| 7447 bool pretenure) | 7447 bool pretenure) |
| 7448 : HTemplateInstruction<1>(HType::JSObject()), | 7448 : HTemplateInstruction<1>(HType::JSObject()), |
| 7449 shared_info_(shared), | 7449 shared_info_(shared), |
| 7450 pretenure_(pretenure), | 7450 pretenure_(pretenure), |
| 7451 has_no_literals_(shared->num_literals() == 0), | 7451 has_no_literals_(shared->num_literals() == 0), |
| 7452 is_generator_(shared->is_generator()), | 7452 is_generator_(shared->is_generator()), |
| 7453 strict_mode_(shared->strict_mode()) { | 7453 strict_mode_(shared->strict_mode()) { |
| 7454 SetOperandAt(0, context); | 7454 SetOperandAt(0, context); |
| 7455 set_representation(Representation::Tagged()); | 7455 set_representation(Representation::Tagged()); |
| 7456 SetChangesFlag(kNewSpacePromotion); | 7456 SetChangesFlag(kNewSpacePromotion); |
| 7457 } | 7457 } |
| 7458 | 7458 |
| 7459 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7459 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 7460 | 7460 |
| 7461 Handle<SharedFunctionInfo> shared_info_; | 7461 Handle<SharedFunctionInfo> shared_info_; |
| 7462 bool pretenure_ : 1; | 7462 bool pretenure_ : 1; |
| 7463 bool has_no_literals_ : 1; | 7463 bool has_no_literals_ : 1; |
| 7464 bool is_generator_ : 1; | 7464 bool is_generator_ : 1; |
| 7465 StrictMode strict_mode_; | 7465 StrictMode strict_mode_; |
| 7466 }; | 7466 }; |
| 7467 | 7467 |
| 7468 | 7468 |
| 7469 class HTypeof V8_FINAL : public HTemplateInstruction<2> { | 7469 class HTypeof FINAL : public HTemplateInstruction<2> { |
| 7470 public: | 7470 public: |
| 7471 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HTypeof, HValue*); | 7471 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HTypeof, HValue*); |
| 7472 | 7472 |
| 7473 HValue* context() const { return OperandAt(0); } | 7473 HValue* context() const { return OperandAt(0); } |
| 7474 HValue* value() const { return OperandAt(1); } | 7474 HValue* value() const { return OperandAt(1); } |
| 7475 | 7475 |
| 7476 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 7476 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 7477 | 7477 |
| 7478 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7478 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7479 return Representation::Tagged(); | 7479 return Representation::Tagged(); |
| 7480 } | 7480 } |
| 7481 | 7481 |
| 7482 DECLARE_CONCRETE_INSTRUCTION(Typeof) | 7482 DECLARE_CONCRETE_INSTRUCTION(Typeof) |
| 7483 | 7483 |
| 7484 private: | 7484 private: |
| 7485 explicit HTypeof(HValue* context, HValue* value) { | 7485 explicit HTypeof(HValue* context, HValue* value) { |
| 7486 SetOperandAt(0, context); | 7486 SetOperandAt(0, context); |
| 7487 SetOperandAt(1, value); | 7487 SetOperandAt(1, value); |
| 7488 set_representation(Representation::Tagged()); | 7488 set_representation(Representation::Tagged()); |
| 7489 } | 7489 } |
| 7490 | 7490 |
| 7491 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7491 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 7492 }; | 7492 }; |
| 7493 | 7493 |
| 7494 | 7494 |
| 7495 class HTrapAllocationMemento V8_FINAL : public HTemplateInstruction<1> { | 7495 class HTrapAllocationMemento FINAL : public HTemplateInstruction<1> { |
| 7496 public: | 7496 public: |
| 7497 DECLARE_INSTRUCTION_FACTORY_P1(HTrapAllocationMemento, HValue*); | 7497 DECLARE_INSTRUCTION_FACTORY_P1(HTrapAllocationMemento, HValue*); |
| 7498 | 7498 |
| 7499 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7499 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7500 return Representation::Tagged(); | 7500 return Representation::Tagged(); |
| 7501 } | 7501 } |
| 7502 | 7502 |
| 7503 HValue* object() { return OperandAt(0); } | 7503 HValue* object() { return OperandAt(0); } |
| 7504 | 7504 |
| 7505 DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento) | 7505 DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento) |
| 7506 | 7506 |
| 7507 private: | 7507 private: |
| 7508 explicit HTrapAllocationMemento(HValue* obj) { | 7508 explicit HTrapAllocationMemento(HValue* obj) { |
| 7509 SetOperandAt(0, obj); | 7509 SetOperandAt(0, obj); |
| 7510 } | 7510 } |
| 7511 }; | 7511 }; |
| 7512 | 7512 |
| 7513 | 7513 |
| 7514 class HToFastProperties V8_FINAL : public HUnaryOperation { | 7514 class HToFastProperties FINAL : public HUnaryOperation { |
| 7515 public: | 7515 public: |
| 7516 DECLARE_INSTRUCTION_FACTORY_P1(HToFastProperties, HValue*); | 7516 DECLARE_INSTRUCTION_FACTORY_P1(HToFastProperties, HValue*); |
| 7517 | 7517 |
| 7518 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7518 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7519 return Representation::Tagged(); | 7519 return Representation::Tagged(); |
| 7520 } | 7520 } |
| 7521 | 7521 |
| 7522 DECLARE_CONCRETE_INSTRUCTION(ToFastProperties) | 7522 DECLARE_CONCRETE_INSTRUCTION(ToFastProperties) |
| 7523 | 7523 |
| 7524 private: | 7524 private: |
| 7525 explicit HToFastProperties(HValue* value) : HUnaryOperation(value) { | 7525 explicit HToFastProperties(HValue* value) : HUnaryOperation(value) { |
| 7526 set_representation(Representation::Tagged()); | 7526 set_representation(Representation::Tagged()); |
| 7527 SetChangesFlag(kNewSpacePromotion); | 7527 SetChangesFlag(kNewSpacePromotion); |
| 7528 | 7528 |
| 7529 // This instruction is not marked as kChangesMaps, but does | 7529 // This instruction is not marked as kChangesMaps, but does |
| 7530 // change the map of the input operand. Use it only when creating | 7530 // change the map of the input operand. Use it only when creating |
| 7531 // object literals via a runtime call. | 7531 // object literals via a runtime call. |
| 7532 DCHECK(value->IsCallRuntime()); | 7532 DCHECK(value->IsCallRuntime()); |
| 7533 #ifdef DEBUG | 7533 #ifdef DEBUG |
| 7534 const Runtime::Function* function = HCallRuntime::cast(value)->function(); | 7534 const Runtime::Function* function = HCallRuntime::cast(value)->function(); |
| 7535 DCHECK(function->function_id == Runtime::kCreateObjectLiteral); | 7535 DCHECK(function->function_id == Runtime::kCreateObjectLiteral); |
| 7536 #endif | 7536 #endif |
| 7537 } | 7537 } |
| 7538 | 7538 |
| 7539 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7539 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 7540 }; | 7540 }; |
| 7541 | 7541 |
| 7542 | 7542 |
| 7543 class HDateField V8_FINAL : public HUnaryOperation { | 7543 class HDateField FINAL : public HUnaryOperation { |
| 7544 public: | 7544 public: |
| 7545 DECLARE_INSTRUCTION_FACTORY_P2(HDateField, HValue*, Smi*); | 7545 DECLARE_INSTRUCTION_FACTORY_P2(HDateField, HValue*, Smi*); |
| 7546 | 7546 |
| 7547 Smi* index() const { return index_; } | 7547 Smi* index() const { return index_; } |
| 7548 | 7548 |
| 7549 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7549 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7550 return Representation::Tagged(); | 7550 return Representation::Tagged(); |
| 7551 } | 7551 } |
| 7552 | 7552 |
| 7553 DECLARE_CONCRETE_INSTRUCTION(DateField) | 7553 DECLARE_CONCRETE_INSTRUCTION(DateField) |
| 7554 | 7554 |
| 7555 private: | 7555 private: |
| 7556 HDateField(HValue* date, Smi* index) | 7556 HDateField(HValue* date, Smi* index) |
| 7557 : HUnaryOperation(date), index_(index) { | 7557 : HUnaryOperation(date), index_(index) { |
| 7558 set_representation(Representation::Tagged()); | 7558 set_representation(Representation::Tagged()); |
| 7559 } | 7559 } |
| 7560 | 7560 |
| 7561 Smi* index_; | 7561 Smi* index_; |
| 7562 }; | 7562 }; |
| 7563 | 7563 |
| 7564 | 7564 |
| 7565 class HSeqStringGetChar V8_FINAL : public HTemplateInstruction<2> { | 7565 class HSeqStringGetChar FINAL : public HTemplateInstruction<2> { |
| 7566 public: | 7566 public: |
| 7567 static HInstruction* New(Zone* zone, | 7567 static HInstruction* New(Zone* zone, |
| 7568 HValue* context, | 7568 HValue* context, |
| 7569 String::Encoding encoding, | 7569 String::Encoding encoding, |
| 7570 HValue* string, | 7570 HValue* string, |
| 7571 HValue* index); | 7571 HValue* index); |
| 7572 | 7572 |
| 7573 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7573 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7574 return (index == 0) ? Representation::Tagged() | 7574 return (index == 0) ? Representation::Tagged() |
| 7575 : Representation::Integer32(); | 7575 : Representation::Integer32(); |
| 7576 } | 7576 } |
| 7577 | 7577 |
| 7578 String::Encoding encoding() const { return encoding_; } | 7578 String::Encoding encoding() const { return encoding_; } |
| 7579 HValue* string() const { return OperandAt(0); } | 7579 HValue* string() const { return OperandAt(0); } |
| 7580 HValue* index() const { return OperandAt(1); } | 7580 HValue* index() const { return OperandAt(1); } |
| 7581 | 7581 |
| 7582 DECLARE_CONCRETE_INSTRUCTION(SeqStringGetChar) | 7582 DECLARE_CONCRETE_INSTRUCTION(SeqStringGetChar) |
| 7583 | 7583 |
| 7584 protected: | 7584 protected: |
| 7585 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 7585 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 7586 return encoding() == HSeqStringGetChar::cast(other)->encoding(); | 7586 return encoding() == HSeqStringGetChar::cast(other)->encoding(); |
| 7587 } | 7587 } |
| 7588 | 7588 |
| 7589 virtual Range* InferRange(Zone* zone) V8_OVERRIDE { | 7589 virtual Range* InferRange(Zone* zone) OVERRIDE { |
| 7590 if (encoding() == String::ONE_BYTE_ENCODING) { | 7590 if (encoding() == String::ONE_BYTE_ENCODING) { |
| 7591 return new(zone) Range(0, String::kMaxOneByteCharCode); | 7591 return new(zone) Range(0, String::kMaxOneByteCharCode); |
| 7592 } else { | 7592 } else { |
| 7593 DCHECK_EQ(String::TWO_BYTE_ENCODING, encoding()); | 7593 DCHECK_EQ(String::TWO_BYTE_ENCODING, encoding()); |
| 7594 return new(zone) Range(0, String::kMaxUtf16CodeUnit); | 7594 return new(zone) Range(0, String::kMaxUtf16CodeUnit); |
| 7595 } | 7595 } |
| 7596 } | 7596 } |
| 7597 | 7597 |
| 7598 private: | 7598 private: |
| 7599 HSeqStringGetChar(String::Encoding encoding, | 7599 HSeqStringGetChar(String::Encoding encoding, |
| 7600 HValue* string, | 7600 HValue* string, |
| 7601 HValue* index) : encoding_(encoding) { | 7601 HValue* index) : encoding_(encoding) { |
| 7602 SetOperandAt(0, string); | 7602 SetOperandAt(0, string); |
| 7603 SetOperandAt(1, index); | 7603 SetOperandAt(1, index); |
| 7604 set_representation(Representation::Integer32()); | 7604 set_representation(Representation::Integer32()); |
| 7605 SetFlag(kUseGVN); | 7605 SetFlag(kUseGVN); |
| 7606 SetDependsOnFlag(kStringChars); | 7606 SetDependsOnFlag(kStringChars); |
| 7607 } | 7607 } |
| 7608 | 7608 |
| 7609 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7609 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 7610 | 7610 |
| 7611 String::Encoding encoding_; | 7611 String::Encoding encoding_; |
| 7612 }; | 7612 }; |
| 7613 | 7613 |
| 7614 | 7614 |
| 7615 class HSeqStringSetChar V8_FINAL : public HTemplateInstruction<4> { | 7615 class HSeqStringSetChar FINAL : public HTemplateInstruction<4> { |
| 7616 public: | 7616 public: |
| 7617 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4( | 7617 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4( |
| 7618 HSeqStringSetChar, String::Encoding, | 7618 HSeqStringSetChar, String::Encoding, |
| 7619 HValue*, HValue*, HValue*); | 7619 HValue*, HValue*, HValue*); |
| 7620 | 7620 |
| 7621 String::Encoding encoding() { return encoding_; } | 7621 String::Encoding encoding() { return encoding_; } |
| 7622 HValue* context() { return OperandAt(0); } | 7622 HValue* context() { return OperandAt(0); } |
| 7623 HValue* string() { return OperandAt(1); } | 7623 HValue* string() { return OperandAt(1); } |
| 7624 HValue* index() { return OperandAt(2); } | 7624 HValue* index() { return OperandAt(2); } |
| 7625 HValue* value() { return OperandAt(3); } | 7625 HValue* value() { return OperandAt(3); } |
| 7626 | 7626 |
| 7627 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7627 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7628 return (index <= 1) ? Representation::Tagged() | 7628 return (index <= 1) ? Representation::Tagged() |
| 7629 : Representation::Integer32(); | 7629 : Representation::Integer32(); |
| 7630 } | 7630 } |
| 7631 | 7631 |
| 7632 DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar) | 7632 DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar) |
| 7633 | 7633 |
| 7634 private: | 7634 private: |
| 7635 HSeqStringSetChar(HValue* context, | 7635 HSeqStringSetChar(HValue* context, |
| 7636 String::Encoding encoding, | 7636 String::Encoding encoding, |
| 7637 HValue* string, | 7637 HValue* string, |
| 7638 HValue* index, | 7638 HValue* index, |
| 7639 HValue* value) : encoding_(encoding) { | 7639 HValue* value) : encoding_(encoding) { |
| 7640 SetOperandAt(0, context); | 7640 SetOperandAt(0, context); |
| 7641 SetOperandAt(1, string); | 7641 SetOperandAt(1, string); |
| 7642 SetOperandAt(2, index); | 7642 SetOperandAt(2, index); |
| 7643 SetOperandAt(3, value); | 7643 SetOperandAt(3, value); |
| 7644 set_representation(Representation::Tagged()); | 7644 set_representation(Representation::Tagged()); |
| 7645 SetChangesFlag(kStringChars); | 7645 SetChangesFlag(kStringChars); |
| 7646 } | 7646 } |
| 7647 | 7647 |
| 7648 String::Encoding encoding_; | 7648 String::Encoding encoding_; |
| 7649 }; | 7649 }; |
| 7650 | 7650 |
| 7651 | 7651 |
| 7652 class HCheckMapValue V8_FINAL : public HTemplateInstruction<2> { | 7652 class HCheckMapValue FINAL : public HTemplateInstruction<2> { |
| 7653 public: | 7653 public: |
| 7654 DECLARE_INSTRUCTION_FACTORY_P2(HCheckMapValue, HValue*, HValue*); | 7654 DECLARE_INSTRUCTION_FACTORY_P2(HCheckMapValue, HValue*, HValue*); |
| 7655 | 7655 |
| 7656 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7656 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7657 return Representation::Tagged(); | 7657 return Representation::Tagged(); |
| 7658 } | 7658 } |
| 7659 | 7659 |
| 7660 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 7660 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 7661 | 7661 |
| 7662 virtual HType CalculateInferredType() V8_OVERRIDE { | 7662 virtual HType CalculateInferredType() OVERRIDE { |
| 7663 if (value()->type().IsHeapObject()) return value()->type(); | 7663 if (value()->type().IsHeapObject()) return value()->type(); |
| 7664 return HType::HeapObject(); | 7664 return HType::HeapObject(); |
| 7665 } | 7665 } |
| 7666 | 7666 |
| 7667 HValue* value() const { return OperandAt(0); } | 7667 HValue* value() const { return OperandAt(0); } |
| 7668 HValue* map() const { return OperandAt(1); } | 7668 HValue* map() const { return OperandAt(1); } |
| 7669 | 7669 |
| 7670 virtual HValue* Canonicalize() V8_OVERRIDE; | 7670 virtual HValue* Canonicalize() OVERRIDE; |
| 7671 | 7671 |
| 7672 DECLARE_CONCRETE_INSTRUCTION(CheckMapValue) | 7672 DECLARE_CONCRETE_INSTRUCTION(CheckMapValue) |
| 7673 | 7673 |
| 7674 protected: | 7674 protected: |
| 7675 virtual int RedefinedOperandIndex() { return 0; } | 7675 virtual int RedefinedOperandIndex() { return 0; } |
| 7676 | 7676 |
| 7677 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 7677 virtual bool DataEquals(HValue* other) OVERRIDE { |
| 7678 return true; | 7678 return true; |
| 7679 } | 7679 } |
| 7680 | 7680 |
| 7681 private: | 7681 private: |
| 7682 HCheckMapValue(HValue* value, HValue* map) | 7682 HCheckMapValue(HValue* value, HValue* map) |
| 7683 : HTemplateInstruction<2>(HType::HeapObject()) { | 7683 : HTemplateInstruction<2>(HType::HeapObject()) { |
| 7684 SetOperandAt(0, value); | 7684 SetOperandAt(0, value); |
| 7685 SetOperandAt(1, map); | 7685 SetOperandAt(1, map); |
| 7686 set_representation(Representation::Tagged()); | 7686 set_representation(Representation::Tagged()); |
| 7687 SetFlag(kUseGVN); | 7687 SetFlag(kUseGVN); |
| 7688 SetDependsOnFlag(kMaps); | 7688 SetDependsOnFlag(kMaps); |
| 7689 SetDependsOnFlag(kElementsKind); | 7689 SetDependsOnFlag(kElementsKind); |
| 7690 } | 7690 } |
| 7691 }; | 7691 }; |
| 7692 | 7692 |
| 7693 | 7693 |
| 7694 class HForInPrepareMap V8_FINAL : public HTemplateInstruction<2> { | 7694 class HForInPrepareMap FINAL : public HTemplateInstruction<2> { |
| 7695 public: | 7695 public: |
| 7696 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HForInPrepareMap, HValue*); | 7696 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HForInPrepareMap, HValue*); |
| 7697 | 7697 |
| 7698 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7698 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7699 return Representation::Tagged(); | 7699 return Representation::Tagged(); |
| 7700 } | 7700 } |
| 7701 | 7701 |
| 7702 HValue* context() const { return OperandAt(0); } | 7702 HValue* context() const { return OperandAt(0); } |
| 7703 HValue* enumerable() const { return OperandAt(1); } | 7703 HValue* enumerable() const { return OperandAt(1); } |
| 7704 | 7704 |
| 7705 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 7705 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 7706 | 7706 |
| 7707 virtual HType CalculateInferredType() V8_OVERRIDE { | 7707 virtual HType CalculateInferredType() OVERRIDE { |
| 7708 return HType::Tagged(); | 7708 return HType::Tagged(); |
| 7709 } | 7709 } |
| 7710 | 7710 |
| 7711 DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap); | 7711 DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap); |
| 7712 | 7712 |
| 7713 private: | 7713 private: |
| 7714 HForInPrepareMap(HValue* context, | 7714 HForInPrepareMap(HValue* context, |
| 7715 HValue* object) { | 7715 HValue* object) { |
| 7716 SetOperandAt(0, context); | 7716 SetOperandAt(0, context); |
| 7717 SetOperandAt(1, object); | 7717 SetOperandAt(1, object); |
| 7718 set_representation(Representation::Tagged()); | 7718 set_representation(Representation::Tagged()); |
| 7719 SetAllSideEffects(); | 7719 SetAllSideEffects(); |
| 7720 } | 7720 } |
| 7721 }; | 7721 }; |
| 7722 | 7722 |
| 7723 | 7723 |
| 7724 class HForInCacheArray V8_FINAL : public HTemplateInstruction<2> { | 7724 class HForInCacheArray FINAL : public HTemplateInstruction<2> { |
| 7725 public: | 7725 public: |
| 7726 DECLARE_INSTRUCTION_FACTORY_P3(HForInCacheArray, HValue*, HValue*, int); | 7726 DECLARE_INSTRUCTION_FACTORY_P3(HForInCacheArray, HValue*, HValue*, int); |
| 7727 | 7727 |
| 7728 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7728 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7729 return Representation::Tagged(); | 7729 return Representation::Tagged(); |
| 7730 } | 7730 } |
| 7731 | 7731 |
| 7732 HValue* enumerable() const { return OperandAt(0); } | 7732 HValue* enumerable() const { return OperandAt(0); } |
| 7733 HValue* map() const { return OperandAt(1); } | 7733 HValue* map() const { return OperandAt(1); } |
| 7734 int idx() const { return idx_; } | 7734 int idx() const { return idx_; } |
| 7735 | 7735 |
| 7736 HForInCacheArray* index_cache() { | 7736 HForInCacheArray* index_cache() { |
| 7737 return index_cache_; | 7737 return index_cache_; |
| 7738 } | 7738 } |
| 7739 | 7739 |
| 7740 void set_index_cache(HForInCacheArray* index_cache) { | 7740 void set_index_cache(HForInCacheArray* index_cache) { |
| 7741 index_cache_ = index_cache; | 7741 index_cache_ = index_cache; |
| 7742 } | 7742 } |
| 7743 | 7743 |
| 7744 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 7744 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 7745 | 7745 |
| 7746 virtual HType CalculateInferredType() V8_OVERRIDE { | 7746 virtual HType CalculateInferredType() OVERRIDE { |
| 7747 return HType::Tagged(); | 7747 return HType::Tagged(); |
| 7748 } | 7748 } |
| 7749 | 7749 |
| 7750 DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray); | 7750 DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray); |
| 7751 | 7751 |
| 7752 private: | 7752 private: |
| 7753 HForInCacheArray(HValue* enumerable, | 7753 HForInCacheArray(HValue* enumerable, |
| 7754 HValue* keys, | 7754 HValue* keys, |
| 7755 int idx) : idx_(idx) { | 7755 int idx) : idx_(idx) { |
| 7756 SetOperandAt(0, enumerable); | 7756 SetOperandAt(0, enumerable); |
| 7757 SetOperandAt(1, keys); | 7757 SetOperandAt(1, keys); |
| 7758 set_representation(Representation::Tagged()); | 7758 set_representation(Representation::Tagged()); |
| 7759 } | 7759 } |
| 7760 | 7760 |
| 7761 int idx_; | 7761 int idx_; |
| 7762 HForInCacheArray* index_cache_; | 7762 HForInCacheArray* index_cache_; |
| 7763 }; | 7763 }; |
| 7764 | 7764 |
| 7765 | 7765 |
| 7766 class HLoadFieldByIndex V8_FINAL : public HTemplateInstruction<2> { | 7766 class HLoadFieldByIndex FINAL : public HTemplateInstruction<2> { |
| 7767 public: | 7767 public: |
| 7768 DECLARE_INSTRUCTION_FACTORY_P2(HLoadFieldByIndex, HValue*, HValue*); | 7768 DECLARE_INSTRUCTION_FACTORY_P2(HLoadFieldByIndex, HValue*, HValue*); |
| 7769 | 7769 |
| 7770 HLoadFieldByIndex(HValue* object, | 7770 HLoadFieldByIndex(HValue* object, |
| 7771 HValue* index) { | 7771 HValue* index) { |
| 7772 SetOperandAt(0, object); | 7772 SetOperandAt(0, object); |
| 7773 SetOperandAt(1, index); | 7773 SetOperandAt(1, index); |
| 7774 SetChangesFlag(kNewSpacePromotion); | 7774 SetChangesFlag(kNewSpacePromotion); |
| 7775 set_representation(Representation::Tagged()); | 7775 set_representation(Representation::Tagged()); |
| 7776 } | 7776 } |
| 7777 | 7777 |
| 7778 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 7778 virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
| 7779 if (index == 1) { | 7779 if (index == 1) { |
| 7780 return Representation::Smi(); | 7780 return Representation::Smi(); |
| 7781 } else { | 7781 } else { |
| 7782 return Representation::Tagged(); | 7782 return Representation::Tagged(); |
| 7783 } | 7783 } |
| 7784 } | 7784 } |
| 7785 | 7785 |
| 7786 HValue* object() const { return OperandAt(0); } | 7786 HValue* object() const { return OperandAt(0); } |
| 7787 HValue* index() const { return OperandAt(1); } | 7787 HValue* index() const { return OperandAt(1); } |
| 7788 | 7788 |
| 7789 virtual OStream& PrintDataTo(OStream& os) const V8_OVERRIDE; // NOLINT | 7789 virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT |
| 7790 | 7790 |
| 7791 virtual HType CalculateInferredType() V8_OVERRIDE { | 7791 virtual HType CalculateInferredType() OVERRIDE { |
| 7792 return HType::Tagged(); | 7792 return HType::Tagged(); |
| 7793 } | 7793 } |
| 7794 | 7794 |
| 7795 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); | 7795 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); |
| 7796 | 7796 |
| 7797 private: | 7797 private: |
| 7798 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7798 virtual bool IsDeletable() const OVERRIDE { return true; } |
| 7799 }; | 7799 }; |
| 7800 | 7800 |
| 7801 | 7801 |
| 7802 class HStoreFrameContext: public HUnaryOperation { | 7802 class HStoreFrameContext: public HUnaryOperation { |
| 7803 public: | 7803 public: |
| 7804 DECLARE_INSTRUCTION_FACTORY_P1(HStoreFrameContext, HValue*); | 7804 DECLARE_INSTRUCTION_FACTORY_P1(HStoreFrameContext, HValue*); |
| 7805 | 7805 |
| 7806 HValue* context() { return OperandAt(0); } | 7806 HValue* context() { return OperandAt(0); } |
| 7807 | 7807 |
| 7808 virtual Representation RequiredInputRepresentation(int index) { | 7808 virtual Representation RequiredInputRepresentation(int index) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7849 }; | 7849 }; |
| 7850 | 7850 |
| 7851 | 7851 |
| 7852 | 7852 |
| 7853 #undef DECLARE_INSTRUCTION | 7853 #undef DECLARE_INSTRUCTION |
| 7854 #undef DECLARE_CONCRETE_INSTRUCTION | 7854 #undef DECLARE_CONCRETE_INSTRUCTION |
| 7855 | 7855 |
| 7856 } } // namespace v8::internal | 7856 } } // namespace v8::internal |
| 7857 | 7857 |
| 7858 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 7858 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |