Index: src/ia32/codegen-ia32.cc |
=================================================================== |
--- src/ia32/codegen-ia32.cc (revision 4872) |
+++ src/ia32/codegen-ia32.cc (working copy) |
@@ -604,6 +604,10 @@ |
RegisterFile empty_regs; |
SetFrame(clone, &empty_regs); |
__ bind(&allocation_failed); |
+ if (!CpuFeatures::IsSupported(SSE2)) { |
+ // Pop the value from the floating point stack. |
+ __ fstp(0); |
+ } |
unsafe_bailout_->Jump(); |
done.Bind(value); |
@@ -2991,7 +2995,7 @@ |
¬_numbers); |
LoadComparisonOperandSSE2(masm_, right_side, xmm1, left_side, right_side, |
¬_numbers); |
- __ comisd(xmm0, xmm1); |
+ __ ucomisd(xmm0, xmm1); |
} else { |
Label check_right, compare; |
@@ -7306,7 +7310,7 @@ |
// Since xmm3 is 1 and xmm2 is -0.5 this is simply xmm2 + xmm3. |
__ addsd(xmm2, xmm3); |
// xmm2 now has 0.5. |
- __ comisd(xmm2, xmm1); |
+ __ ucomisd(xmm2, xmm1); |
call_runtime.Branch(not_equal); |
// Calculates square root. |
__ movsd(xmm1, xmm0); |
@@ -11592,7 +11596,7 @@ |
CpuFeatures::Scope fscope(SSE2); |
__ movdbl(xmm0, FieldOperand(object, HeapNumber::kValueOffset)); |
__ movdbl(xmm1, FieldOperand(probe, HeapNumber::kValueOffset)); |
- __ comisd(xmm0, xmm1); |
+ __ ucomisd(xmm0, xmm1); |
} else { |
__ fld_d(FieldOperand(object, HeapNumber::kValueOffset)); |
__ fld_d(FieldOperand(probe, HeapNumber::kValueOffset)); |
@@ -11817,7 +11821,7 @@ |
CpuFeatures::Scope use_cmov(CMOV); |
FloatingPointHelper::LoadSSE2Operands(masm, &non_number_comparison); |
- __ comisd(xmm0, xmm1); |
+ __ ucomisd(xmm0, xmm1); |
// Don't base result on EFLAGS when a NaN is involved. |
__ j(parity_even, &unordered, not_taken); |