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 |