| Index: src/ia32/lithium-ia32.h
|
| diff --git a/src/ia32/lithium-ia32.h b/src/ia32/lithium-ia32.h
|
| index 88b1ef01ea04092fc083f07b3b662abb3849af7c..d0f41fb9b36afff0a5e9a66d2b9cb594794dc736 100644
|
| --- a/src/ia32/lithium-ia32.h
|
| +++ b/src/ia32/lithium-ia32.h
|
| @@ -248,7 +248,11 @@ class LInstruction: public ZoneObject {
|
| void MarkAsCall() { is_call_ = true; }
|
|
|
| // Interface to the register allocator and iterators.
|
| - bool IsMarkedAsCall() const { return is_call_; }
|
| + bool ClobbersTemps() const { return is_call_; }
|
| + bool ClobbersRegisters() const { return is_call_; }
|
| + virtual bool ClobbersDoubleRegisters() const {
|
| + return is_call_ || !CpuFeatures::IsSupported(SSE2);
|
| + }
|
|
|
| virtual bool HasResult() const = 0;
|
| virtual LOperand* result() = 0;
|
| @@ -354,6 +358,7 @@ class LGap: public LTemplateInstruction<0, 0, 0> {
|
| class LInstructionGap: public LGap {
|
| public:
|
| explicit LInstructionGap(HBasicBlock* block) : LGap(block) { }
|
| + virtual bool ClobbersDoubleRegisters() const { return false; }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap")
|
| };
|
| @@ -1391,7 +1396,6 @@ class LLoadKeyed: public LTemplateInstruction<1, 2, 0> {
|
| inputs_[0] = elements;
|
| inputs_[1] = key;
|
| }
|
| -
|
| LOperand* elements() { return inputs_[0]; }
|
| LOperand* key() { return inputs_[1]; }
|
| ElementsKind elements_kind() const {
|
| @@ -1401,10 +1405,17 @@ class LLoadKeyed: public LTemplateInstruction<1, 2, 0> {
|
| return hydrogen()->is_external();
|
| }
|
|
|
| + virtual bool ClobbersDoubleRegisters() const {
|
| + return !IsDoubleOrFloatElementsKind(hydrogen()->elements_kind());
|
| + }
|
| +
|
| DECLARE_CONCRETE_INSTRUCTION(LoadKeyed, "load-keyed")
|
| DECLARE_HYDROGEN_ACCESSOR(LoadKeyed)
|
|
|
| uint32_t additional_index() const { return hydrogen()->index_offset(); }
|
| + bool key_is_smi() {
|
| + return hydrogen()->key()->representation().IsTagged();
|
| + }
|
| };
|
|
|
|
|
| @@ -2385,8 +2396,9 @@ class LOsrEntry: public LTemplateInstruction<0, 0, 0> {
|
| // slot, i.e., that must also be restored to the spill slot on OSR entry.
|
| // NULL if the register has no assigned spill slot. Indexed by allocation
|
| // index.
|
| - LOperand* register_spills_[Register::kNumAllocatableRegisters];
|
| - LOperand* double_register_spills_[DoubleRegister::kNumAllocatableRegisters];
|
| + LOperand* register_spills_[Register::kMaxNumAllocatableRegisters];
|
| + LOperand* double_register_spills_[
|
| + DoubleRegister::kMaxNumAllocatableRegisters];
|
| };
|
|
|
|
|
| @@ -2550,6 +2562,7 @@ class LChunkBuilder BASE_EMBEDDED {
|
| // Methods for getting operands for Use / Define / Temp.
|
| LUnallocated* ToUnallocated(Register reg);
|
| LUnallocated* ToUnallocated(XMMRegister reg);
|
| + LUnallocated* ToUnallocated(X87TopOfStackProxyRegister reg);
|
|
|
| // Methods for setting up define-use relationships.
|
| MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
|
| @@ -2610,6 +2623,8 @@ class LChunkBuilder BASE_EMBEDDED {
|
| template<int I, int T>
|
| LInstruction* DefineFixedDouble(LTemplateInstruction<1, I, T>* instr,
|
| XMMRegister reg);
|
| + template<int I, int T>
|
| + LInstruction* DefineX87TOS(LTemplateInstruction<1, I, T>* instr);
|
| // Assigns an environment to an instruction. An instruction which can
|
| // deoptimize must have an environment.
|
| LInstruction* AssignEnvironment(LInstruction* instr);
|
|
|