OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 HValue* hydrogen_value() const { return hydrogen_value_; } | 254 HValue* hydrogen_value() const { return hydrogen_value_; } |
255 | 255 |
256 virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) { } | 256 virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) { } |
257 | 257 |
258 void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); } | 258 void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); } |
259 bool IsCall() const { return IsCallBits::decode(bit_field_); } | 259 bool IsCall() const { return IsCallBits::decode(bit_field_); } |
260 | 260 |
261 // Interface to the register allocator and iterators. | 261 // Interface to the register allocator and iterators. |
262 bool ClobbersTemps() const { return IsCall(); } | 262 bool ClobbersTemps() const { return IsCall(); } |
263 bool ClobbersRegisters() const { return IsCall(); } | 263 bool ClobbersRegisters() const { return IsCall(); } |
264 virtual bool ClobbersDoubleRegisters() const { | 264 virtual bool ClobbersDoubleRegisters(Isolate* isolate) const V8_OVERRIDE { |
265 return IsCall() || | 265 return IsCall() || |
266 // We only have rudimentary X87Stack tracking, thus in general | 266 // We only have rudimentary X87Stack tracking, thus in general |
267 // cannot handle phi-nodes. | 267 // cannot handle phi-nodes. |
268 (!CpuFeatures::IsSafeForSnapshot(SSE2) && IsControl()); | 268 (!CpuFeatures::IsSafeForSnapshot(isolate, SSE2) && IsControl()); |
269 } | 269 } |
270 | 270 |
271 virtual bool HasResult() const = 0; | 271 virtual bool HasResult() const = 0; |
272 virtual LOperand* result() const = 0; | 272 virtual LOperand* result() const = 0; |
273 | 273 |
274 bool HasDoubleRegisterResult(); | 274 bool HasDoubleRegisterResult(); |
275 bool HasDoubleRegisterInput(); | 275 bool HasDoubleRegisterInput(); |
276 bool IsDoubleInput(X87Register reg, LCodeGen* cgen); | 276 bool IsDoubleInput(X87Register reg, LCodeGen* cgen); |
277 | 277 |
278 LOperand* FirstInput() { return InputAt(0); } | 278 LOperand* FirstInput() { return InputAt(0); } |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 virtual bool HasInterestingComment(LCodeGen* gen) const V8_OVERRIDE { | 393 virtual bool HasInterestingComment(LCodeGen* gen) const V8_OVERRIDE { |
394 return !IsRedundant(); | 394 return !IsRedundant(); |
395 } | 395 } |
396 | 396 |
397 DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap") | 397 DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap") |
398 }; | 398 }; |
399 | 399 |
400 | 400 |
401 class LClobberDoubles V8_FINAL : public LTemplateInstruction<0, 0, 0> { | 401 class LClobberDoubles V8_FINAL : public LTemplateInstruction<0, 0, 0> { |
402 public: | 402 public: |
403 LClobberDoubles() { ASSERT(!CpuFeatures::IsSafeForSnapshot(SSE2)); } | 403 explicit LClobberDoubles(Isolate* isolate) { |
| 404 ASSERT(!CpuFeatures::IsSafeForSnapshot(isolate, SSE2)); |
| 405 } |
404 | 406 |
405 virtual bool ClobbersDoubleRegisters() const { return true; } | 407 virtual bool ClobbersDoubleRegisters(Isolate* isolate) const V8_OVERRIDE { |
| 408 return true; |
| 409 } |
406 | 410 |
407 DECLARE_CONCRETE_INSTRUCTION(ClobberDoubles, "clobber-d") | 411 DECLARE_CONCRETE_INSTRUCTION(ClobberDoubles, "clobber-d") |
408 }; | 412 }; |
409 | 413 |
410 | 414 |
411 class LGoto V8_FINAL : public LTemplateInstruction<0, 0, 0> { | 415 class LGoto V8_FINAL : public LTemplateInstruction<0, 0, 0> { |
412 public: | 416 public: |
413 explicit LGoto(HBasicBlock* block) : block_(block) { } | 417 explicit LGoto(HBasicBlock* block) : block_(block) { } |
414 | 418 |
415 virtual bool HasInterestingComment(LCodeGen* gen) const V8_OVERRIDE; | 419 virtual bool HasInterestingComment(LCodeGen* gen) const V8_OVERRIDE; |
416 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto") | 420 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto") |
417 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 421 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
418 virtual bool IsControl() const V8_OVERRIDE { return true; } | 422 virtual bool IsControl() const V8_OVERRIDE { return true; } |
419 | 423 |
420 int block_id() const { return block_->block_id(); } | 424 int block_id() const { return block_->block_id(); } |
421 virtual bool ClobbersDoubleRegisters() const { return false; } | 425 virtual bool ClobbersDoubleRegisters(Isolate* isolate) const V8_OVERRIDE { |
| 426 return false; |
| 427 } |
422 | 428 |
423 bool jumps_to_join() const { return block_->predecessors()->length() > 1; } | 429 bool jumps_to_join() const { return block_->predecessors()->length() > 1; } |
424 | 430 |
425 private: | 431 private: |
426 HBasicBlock* block_; | 432 HBasicBlock* block_; |
427 }; | 433 }; |
428 | 434 |
429 | 435 |
430 class LLazyBailout V8_FINAL : public LTemplateInstruction<0, 0, 0> { | 436 class LLazyBailout V8_FINAL : public LTemplateInstruction<0, 0, 0> { |
431 public: | 437 public: |
(...skipping 1572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2004 public: | 2010 public: |
2005 explicit LCallRuntime(LOperand* context) { | 2011 explicit LCallRuntime(LOperand* context) { |
2006 inputs_[0] = context; | 2012 inputs_[0] = context; |
2007 } | 2013 } |
2008 | 2014 |
2009 LOperand* context() { return inputs_[0]; } | 2015 LOperand* context() { return inputs_[0]; } |
2010 | 2016 |
2011 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime") | 2017 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime") |
2012 DECLARE_HYDROGEN_ACCESSOR(CallRuntime) | 2018 DECLARE_HYDROGEN_ACCESSOR(CallRuntime) |
2013 | 2019 |
2014 virtual bool ClobbersDoubleRegisters() const V8_OVERRIDE { | 2020 virtual bool ClobbersDoubleRegisters(Isolate* isolate) const V8_OVERRIDE { |
2015 return save_doubles() == kDontSaveFPRegs; | 2021 return save_doubles() == kDontSaveFPRegs; |
2016 } | 2022 } |
2017 | 2023 |
2018 const Runtime::Function* function() const { return hydrogen()->function(); } | 2024 const Runtime::Function* function() const { return hydrogen()->function(); } |
2019 int arity() const { return hydrogen()->argument_count(); } | 2025 int arity() const { return hydrogen()->argument_count(); } |
2020 SaveFPRegsMode save_doubles() const { return hydrogen()->save_doubles(); } | 2026 SaveFPRegsMode save_doubles() const { return hydrogen()->save_doubles(); } |
2021 }; | 2027 }; |
2022 | 2028 |
2023 | 2029 |
2024 class LInteger32ToDouble V8_FINAL : public LTemplateInstruction<1, 1, 0> { | 2030 class LInteger32ToDouble V8_FINAL : public LTemplateInstruction<1, 1, 0> { |
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2741 : LChunkBuilderBase(graph->zone()), | 2747 : LChunkBuilderBase(graph->zone()), |
2742 chunk_(NULL), | 2748 chunk_(NULL), |
2743 info_(info), | 2749 info_(info), |
2744 graph_(graph), | 2750 graph_(graph), |
2745 status_(UNUSED), | 2751 status_(UNUSED), |
2746 current_instruction_(NULL), | 2752 current_instruction_(NULL), |
2747 current_block_(NULL), | 2753 current_block_(NULL), |
2748 next_block_(NULL), | 2754 next_block_(NULL), |
2749 allocator_(allocator) { } | 2755 allocator_(allocator) { } |
2750 | 2756 |
| 2757 Isolate* isolate() const { return graph_->isolate(); } |
| 2758 |
2751 // Build the sequence for the graph. | 2759 // Build the sequence for the graph. |
2752 LPlatformChunk* Build(); | 2760 LPlatformChunk* Build(); |
2753 | 2761 |
2754 LInstruction* CheckElideControlInstruction(HControlInstruction* instr); | 2762 LInstruction* CheckElideControlInstruction(HControlInstruction* instr); |
2755 | 2763 |
2756 // Declare methods that deal with the individual node types. | 2764 // Declare methods that deal with the individual node types. |
2757 #define DECLARE_DO(type) LInstruction* Do##type(H##type* node); | 2765 #define DECLARE_DO(type) LInstruction* Do##type(H##type* node); |
2758 HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO) | 2766 HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO) |
2759 #undef DECLARE_DO | 2767 #undef DECLARE_DO |
2760 | 2768 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2902 | 2910 |
2903 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder); | 2911 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder); |
2904 }; | 2912 }; |
2905 | 2913 |
2906 #undef DECLARE_HYDROGEN_ACCESSOR | 2914 #undef DECLARE_HYDROGEN_ACCESSOR |
2907 #undef DECLARE_CONCRETE_INSTRUCTION | 2915 #undef DECLARE_CONCRETE_INSTRUCTION |
2908 | 2916 |
2909 } } // namespace v8::internal | 2917 } } // namespace v8::internal |
2910 | 2918 |
2911 #endif // V8_IA32_LITHIUM_IA32_H_ | 2919 #endif // V8_IA32_LITHIUM_IA32_H_ |
OLD | NEW |