Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index e7e032701e2c6c99c0038d614b674d881cbd9e2c..753a66142b39dce594703200abd611f1acab602d 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -423,6 +423,8 @@ bool LCodeGen::GenerateDeferredCode() { |
if (deferred_.length() > 0) { |
for (int i = 0; !is_aborted() && i < deferred_.length(); i++) { |
LDeferredCode* code = deferred_[i]; |
+ X87Stack copy(code->x87_stack()); |
+ x87_stack_ = copy; |
int pos = instructions_->at(code->instruction_index())->position(); |
RecordAndUpdatePosition(pos); |
@@ -503,6 +505,7 @@ void LCodeGen::X87LoadForUsage(X87Register reg) { |
void LCodeGen::X87Stack::Fxch(X87Register reg, int other_slot) { |
+ ASSERT(is_mutable_); |
ASSERT(Contains(reg) && stack_depth_ > other_slot); |
int i = ArrayIndex(reg); |
int st = st2idx(i); |
@@ -547,6 +550,7 @@ bool LCodeGen::X87Stack::Contains(X87Register reg) { |
void LCodeGen::X87Stack::Free(X87Register reg) { |
+ ASSERT(is_mutable_); |
ASSERT(Contains(reg)); |
int i = ArrayIndex(reg); |
int st = st2idx(i); |
@@ -606,6 +610,7 @@ void LCodeGen::X87Mov(Operand dst, X87Register src, X87OperandType opts) { |
void LCodeGen::X87Stack::PrepareToWrite(X87Register reg) { |
+ ASSERT(is_mutable_); |
if (Contains(reg)) { |
Free(reg); |
} |
@@ -615,6 +620,7 @@ void LCodeGen::X87Stack::PrepareToWrite(X87Register reg) { |
void LCodeGen::X87Stack::CommitWrite(X87Register reg) { |
+ ASSERT(is_mutable_); |
// Assert the reg is prepared to write, but not on the virtual stack yet |
ASSERT(!Contains(reg) && stack_[stack_depth_].is(reg) && |
stack_depth_ < X87Register::kNumAllocatableRegisters); |
@@ -2841,8 +2847,9 @@ void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) { |
class DeferredInstanceOfKnownGlobal V8_FINAL : public LDeferredCode { |
public: |
DeferredInstanceOfKnownGlobal(LCodeGen* codegen, |
- LInstanceOfKnownGlobal* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
+ LInstanceOfKnownGlobal* instr, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr) { } |
virtual void Generate() V8_OVERRIDE { |
codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_); |
} |
@@ -2854,7 +2861,7 @@ void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) { |
}; |
DeferredInstanceOfKnownGlobal* deferred; |
- deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr); |
+ deferred = new(zone()) DeferredInstanceOfKnownGlobal(this, instr, x87_stack_); |
Label done, false_result; |
Register object = ToRegister(instr->value()); |
@@ -3808,8 +3815,10 @@ void LCodeGen::DoMathAbs(LMathAbs* instr) { |
// Class for deferred case. |
class DeferredMathAbsTaggedHeapNumber V8_FINAL : public LDeferredCode { |
public: |
- DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen, LMathAbs* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
+ DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen, |
+ LMathAbs* instr, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr) { } |
virtual void Generate() V8_OVERRIDE { |
codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_); |
} |
@@ -3832,7 +3841,7 @@ void LCodeGen::DoMathAbs(LMathAbs* instr) { |
EmitIntegerMathAbs(instr); |
} else { // Tagged case. |
DeferredMathAbsTaggedHeapNumber* deferred = |
- new(zone()) DeferredMathAbsTaggedHeapNumber(this, instr); |
+ new(zone()) DeferredMathAbsTaggedHeapNumber(this, instr, x87_stack_); |
Register input_reg = ToRegister(instr->value()); |
// Smi check. |
__ JumpIfNotSmi(input_reg, deferred->entry()); |
@@ -4048,15 +4057,18 @@ void LCodeGen::DoPower(LPower* instr) { |
void LCodeGen::DoRandom(LRandom* instr) { |
class DeferredDoRandom V8_FINAL : public LDeferredCode { |
public: |
- DeferredDoRandom(LCodeGen* codegen, LRandom* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
+ DeferredDoRandom(LCodeGen* codegen, |
+ LRandom* instr, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr) { } |
virtual void Generate() V8_OVERRIDE { codegen()->DoDeferredRandom(instr_); } |
virtual LInstruction* instr() V8_OVERRIDE { return instr_; } |
private: |
LRandom* instr_; |
}; |
- DeferredDoRandom* deferred = new(zone()) DeferredDoRandom(this, instr); |
+ DeferredDoRandom* deferred = |
+ new(zone()) DeferredDoRandom(this, instr, x87_stack_); |
CpuFeatureScope scope(masm(), SSE2); |
// Having marked this instruction as a call we can use any |
@@ -4791,8 +4803,10 @@ void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) { |
void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { |
class DeferredStringCharCodeAt V8_FINAL : public LDeferredCode { |
public: |
- DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
+ DeferredStringCharCodeAt(LCodeGen* codegen, |
+ LStringCharCodeAt* instr, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr) { } |
virtual void Generate() V8_OVERRIDE { |
codegen()->DoDeferredStringCharCodeAt(instr_); |
} |
@@ -4802,7 +4816,7 @@ void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { |
}; |
DeferredStringCharCodeAt* deferred = |
- new(zone()) DeferredStringCharCodeAt(this, instr); |
+ new(zone()) DeferredStringCharCodeAt(this, instr, x87_stack_); |
StringCharLoadGenerator::Generate(masm(), |
factory(), |
@@ -4848,8 +4862,10 @@ void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) { |
void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { |
class DeferredStringCharFromCode V8_FINAL : public LDeferredCode { |
public: |
- DeferredStringCharFromCode(LCodeGen* codegen, LStringCharFromCode* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
+ DeferredStringCharFromCode(LCodeGen* codegen, |
+ LStringCharFromCode* instr, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr) { } |
virtual void Generate() V8_OVERRIDE { |
codegen()->DoDeferredStringCharFromCode(instr_); |
} |
@@ -4859,7 +4875,7 @@ void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { |
}; |
DeferredStringCharFromCode* deferred = |
- new(zone()) DeferredStringCharFromCode(this, instr); |
+ new(zone()) DeferredStringCharFromCode(this, instr, x87_stack_); |
ASSERT(instr->hydrogen()->value()->representation().IsInteger32()); |
Register char_code = ToRegister(instr->char_code()); |
@@ -4947,8 +4963,10 @@ void LCodeGen::DoUint32ToDouble(LUint32ToDouble* instr) { |
void LCodeGen::DoNumberTagI(LNumberTagI* instr) { |
class DeferredNumberTagI V8_FINAL : public LDeferredCode { |
public: |
- DeferredNumberTagI(LCodeGen* codegen, LNumberTagI* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
+ DeferredNumberTagI(LCodeGen* codegen, |
+ LNumberTagI* instr, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr) { } |
virtual void Generate() V8_OVERRIDE { |
codegen()->DoDeferredNumberTagI(instr_, instr_->value(), SIGNED_INT32); |
} |
@@ -4961,7 +4979,8 @@ void LCodeGen::DoNumberTagI(LNumberTagI* instr) { |
ASSERT(input->IsRegister() && input->Equals(instr->result())); |
Register reg = ToRegister(input); |
- DeferredNumberTagI* deferred = new(zone()) DeferredNumberTagI(this, instr); |
+ DeferredNumberTagI* deferred = |
+ new(zone()) DeferredNumberTagI(this, instr, x87_stack_); |
__ SmiTag(reg); |
__ j(overflow, deferred->entry()); |
__ bind(deferred->exit()); |
@@ -4971,8 +4990,10 @@ void LCodeGen::DoNumberTagI(LNumberTagI* instr) { |
void LCodeGen::DoNumberTagU(LNumberTagU* instr) { |
class DeferredNumberTagU V8_FINAL : public LDeferredCode { |
public: |
- DeferredNumberTagU(LCodeGen* codegen, LNumberTagU* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
+ DeferredNumberTagU(LCodeGen* codegen, |
+ LNumberTagU* instr, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr) { } |
virtual void Generate() V8_OVERRIDE { |
codegen()->DoDeferredNumberTagI(instr_, instr_->value(), UNSIGNED_INT32); |
} |
@@ -4985,7 +5006,8 @@ void LCodeGen::DoNumberTagU(LNumberTagU* instr) { |
ASSERT(input->IsRegister() && input->Equals(instr->result())); |
Register reg = ToRegister(input); |
- DeferredNumberTagU* deferred = new(zone()) DeferredNumberTagU(this, instr); |
+ DeferredNumberTagU* deferred = |
+ new(zone()) DeferredNumberTagU(this, instr, x87_stack_); |
__ cmp(reg, Immediate(Smi::kMaxValue)); |
__ j(above, deferred->entry()); |
__ SmiTag(reg); |
@@ -5074,8 +5096,10 @@ void LCodeGen::DoDeferredNumberTagI(LInstruction* instr, |
void LCodeGen::DoNumberTagD(LNumberTagD* instr) { |
class DeferredNumberTagD V8_FINAL : public LDeferredCode { |
public: |
- DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
+ DeferredNumberTagD(LCodeGen* codegen, |
+ LNumberTagD* instr, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr) { } |
virtual void Generate() V8_OVERRIDE { |
codegen()->DoDeferredNumberTagD(instr_); |
} |
@@ -5093,7 +5117,8 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) { |
X87LoadForUsage(src); |
} |
- DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr); |
+ DeferredNumberTagD* deferred = |
+ new(zone()) DeferredNumberTagD(this, instr, x87_stack_); |
if (FLAG_inline_new) { |
Register tmp = ToRegister(instr->temp()); |
__ AllocateHeapNumber(reg, tmp, no_reg, deferred->entry()); |
@@ -5375,8 +5400,10 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) { |
void LCodeGen::DoTaggedToI(LTaggedToI* instr) { |
class DeferredTaggedToI V8_FINAL : public LDeferredCode { |
public: |
- DeferredTaggedToI(LCodeGen* codegen, LTaggedToI* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
+ DeferredTaggedToI(LCodeGen* codegen, |
+ LTaggedToI* instr, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr) { } |
virtual void Generate() V8_OVERRIDE { |
codegen()->DoDeferredTaggedToI(instr_); |
} |
@@ -5390,7 +5417,8 @@ void LCodeGen::DoTaggedToI(LTaggedToI* instr) { |
Register input_reg = ToRegister(input); |
ASSERT(input_reg.is(ToRegister(instr->result()))); |
- DeferredTaggedToI* deferred = new(zone()) DeferredTaggedToI(this, instr); |
+ DeferredTaggedToI* deferred = |
+ new(zone()) DeferredTaggedToI(this, instr, x87_stack_); |
__ JumpIfNotSmi(input_reg, deferred->entry()); |
__ SmiUntag(input_reg); |
@@ -5536,8 +5564,10 @@ void LCodeGen::DoDeferredTaggedToINoSSE2(LTaggedToINoSSE2* instr) { |
void LCodeGen::DoTaggedToINoSSE2(LTaggedToINoSSE2* instr) { |
class DeferredTaggedToINoSSE2 V8_FINAL : public LDeferredCode { |
public: |
- DeferredTaggedToINoSSE2(LCodeGen* codegen, LTaggedToINoSSE2* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
+ DeferredTaggedToINoSSE2(LCodeGen* codegen, |
+ LTaggedToINoSSE2* instr, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr) { } |
virtual void Generate() V8_OVERRIDE { |
codegen()->DoDeferredTaggedToINoSSE2(instr_); |
} |
@@ -5552,7 +5582,7 @@ void LCodeGen::DoTaggedToINoSSE2(LTaggedToINoSSE2* instr) { |
ASSERT(input_reg.is(ToRegister(instr->result()))); |
DeferredTaggedToINoSSE2* deferred = |
- new(zone()) DeferredTaggedToINoSSE2(this, instr); |
+ new(zone()) DeferredTaggedToINoSSE2(this, instr, x87_stack_); |
// Smi check. |
__ JumpIfNotSmi(input_reg, deferred->entry()); |
@@ -5832,8 +5862,11 @@ void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { |
void LCodeGen::DoCheckMaps(LCheckMaps* instr) { |
class DeferredCheckMaps V8_FINAL : public LDeferredCode { |
public: |
- DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object) |
- : LDeferredCode(codegen), instr_(instr), object_(object) { |
+ DeferredCheckMaps(LCodeGen* codegen, |
+ LCheckMaps* instr, |
+ Register object, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr), object_(object) { |
SetExit(check_maps()); |
} |
virtual void Generate() V8_OVERRIDE { |
@@ -5857,7 +5890,7 @@ void LCodeGen::DoCheckMaps(LCheckMaps* instr) { |
DeferredCheckMaps* deferred = NULL; |
if (instr->hydrogen()->has_migration_target()) { |
- deferred = new(zone()) DeferredCheckMaps(this, instr, reg); |
+ deferred = new(zone()) DeferredCheckMaps(this, instr, reg, x87_stack_); |
__ bind(deferred->check_maps()); |
} |
@@ -6055,8 +6088,10 @@ void LCodeGen::DoClampTToUint8NoSSE2(LClampTToUint8NoSSE2* instr) { |
void LCodeGen::DoAllocate(LAllocate* instr) { |
class DeferredAllocate V8_FINAL : public LDeferredCode { |
public: |
- DeferredAllocate(LCodeGen* codegen, LAllocate* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
+ DeferredAllocate(LCodeGen* codegen, |
+ LAllocate* instr, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr) { } |
virtual void Generate() V8_OVERRIDE { |
codegen()->DoDeferredAllocate(instr_); |
} |
@@ -6066,7 +6101,7 @@ void LCodeGen::DoAllocate(LAllocate* instr) { |
}; |
DeferredAllocate* deferred = |
- new(zone()) DeferredAllocate(this, instr); |
+ new(zone()) DeferredAllocate(this, instr, x87_stack_); |
Register result = ToRegister(instr->result()); |
Register temp = ToRegister(instr->temp()); |
@@ -6406,8 +6441,10 @@ void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { |
void LCodeGen::DoStackCheck(LStackCheck* instr) { |
class DeferredStackCheck V8_FINAL : public LDeferredCode { |
public: |
- DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr) |
- : LDeferredCode(codegen), instr_(instr) { } |
+ DeferredStackCheck(LCodeGen* codegen, |
+ LStackCheck* instr, |
+ const X87Stack& x87_stack) |
+ : LDeferredCode(codegen, x87_stack), instr_(instr) { } |
virtual void Generate() V8_OVERRIDE { |
codegen()->DoDeferredStackCheck(instr_); |
} |
@@ -6440,7 +6477,7 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) { |
ASSERT(instr->hydrogen()->is_backwards_branch()); |
// Perform stack overflow check if this goto needs it before jumping. |
DeferredStackCheck* deferred_stack_check = |
- new(zone()) DeferredStackCheck(this, instr); |
+ new(zone()) DeferredStackCheck(this, instr, x87_stack_); |
ExternalReference stack_limit = |
ExternalReference::address_of_stack_limit(isolate()); |
__ cmp(esp, Operand::StaticVariable(stack_limit)); |