| Index: src/ia32/lithium-codegen-ia32.cc
|
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
|
| index 98a049b64abed3387a1d5f6c380a48c1fed8c78f..4818b3e234cfcc5125db88876effa10de3d49f9b 100644
|
| --- a/src/ia32/lithium-codegen-ia32.cc
|
| +++ b/src/ia32/lithium-codegen-ia32.cc
|
| @@ -416,6 +416,13 @@ bool LCodeGen::GenerateBody() {
|
| x87_stack_.LeavingBlock(current_block_, LGoto::cast(instr));
|
| } else if (FLAG_debug_code && FLAG_enable_slow_asserts &&
|
| !instr->IsGap() && !instr->IsReturn()) {
|
| + if (instr->ClobbersDoubleRegisters()) {
|
| + if (instr->HasDoubleRegisterResult()) {
|
| + ASSERT_EQ(1, x87_stack_.depth());
|
| + } else {
|
| + ASSERT_EQ(0, x87_stack_.depth());
|
| + }
|
| + }
|
| __ VerifyX87StackDepth(x87_stack_.depth());
|
| }
|
| }
|
| @@ -561,6 +568,16 @@ void LCodeGen::X87LoadForUsage(X87Register reg) {
|
| }
|
|
|
|
|
| +void LCodeGen::X87LoadForUsage(X87Register reg1, X87Register reg2) {
|
| + ASSERT(x87_stack_.Contains(reg1));
|
| + ASSERT(x87_stack_.Contains(reg2));
|
| + x87_stack_.Fxch(reg1, 1);
|
| + x87_stack_.Fxch(reg2);
|
| + x87_stack_.pop();
|
| + x87_stack_.pop();
|
| +}
|
| +
|
| +
|
| void LCodeGen::X87Stack::Fxch(X87Register reg, int other_slot) {
|
| ASSERT(is_mutable_);
|
| ASSERT(Contains(reg) && stack_depth_ > other_slot);
|
| @@ -2572,10 +2589,7 @@ void LCodeGen::DoCompareNumericAndBranch(LCompareNumericAndBranch* instr) {
|
| CpuFeatureScope scope(masm(), SSE2);
|
| __ ucomisd(ToDoubleRegister(left), ToDoubleRegister(right));
|
| } else {
|
| - X87Fxch(ToX87Register(right));
|
| - X87Fxch(ToX87Register(left), 1);
|
| - __ fld(0);
|
| - __ fld(2);
|
| + X87LoadForUsage(ToX87Register(right), ToX87Register(left));
|
| __ FCmp();
|
| }
|
| // Don't base result on EFLAGS when a NaN is involved. Instead
|
|
|