Index: src/arm/lithium-codegen-arm.cc |
=================================================================== |
--- src/arm/lithium-codegen-arm.cc (revision 6231) |
+++ src/arm/lithium-codegen-arm.cc (working copy) |
@@ -1076,8 +1076,16 @@ |
EmitBranch(true_block, false_block, nz); |
} else if (r.IsDouble()) { |
DoubleRegister reg = ToDoubleRegister(instr->input()); |
+ Register scratch = scratch0(); |
+ |
+ // Test for the double value. Zero and NaN are false. |
+ // Clear the Invalid cumulative exception flags. |
+ __ ClearFPSCRBits(kVFPInvalidExceptionBit, scratch); |
__ vcmp(reg, 0.0); |
- __ vmrs(pc); // Move vector status bits to normal status bits. |
+ // Retrieve the exception and status flags and |
+ // check for zero or an invalid exception. |
+ __ vmrs(scratch); |
+ __ tst(scratch, Operand(kVFPZConditionFlagBit | kVFPInvalidExceptionBit)); |
EmitBranch(true_block, false_block, ne); |
} else { |
ASSERT(r.IsTagged()); |
@@ -1104,7 +1112,7 @@ |
__ tst(reg, Operand(kSmiTagMask)); |
__ b(eq, true_label); |
- // Test for double values. Zero is false. |
+ // Test for double values. Zero and NaN are false. |
Label call_stub; |
DoubleRegister dbl_scratch = d0; |
Register scratch = scratch0(); |
@@ -1114,9 +1122,14 @@ |
__ b(ne, &call_stub); |
__ sub(ip, reg, Operand(kHeapObjectTag)); |
__ vldr(dbl_scratch, ip, HeapNumber::kValueOffset); |
+ // Clear the Invalid cumulative exception flags. |
+ __ ClearFPSCRBits(kVFPInvalidExceptionBit, scratch); |
__ vcmp(dbl_scratch, 0.0); |
- __ vmrs(pc); // Move vector status bits to normal status bits. |
- __ b(eq, false_label); |
+ // Retrieve the exception and status flags and |
+ // check for zero or an invalid exception. |
+ __ vmrs(scratch); |
+ __ tst(scratch, Operand(kVFPZConditionFlagBit | kVFPInvalidExceptionBit)); |
+ __ b(ne, false_label); |
__ b(true_label); |
// The conversion stub doesn't cause garbage collections so it's |