Index: src/arm/full-codegen-arm.cc |
=================================================================== |
--- src/arm/full-codegen-arm.cc (revision 6957) |
+++ src/arm/full-codegen-arm.cc (working copy) |
@@ -574,25 +574,35 @@ |
void FullCodeGenerator::DoTest(Label* if_true, |
Label* if_false, |
Label* fall_through) { |
- // Emit the inlined tests assumed by the stub. |
- __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); |
- __ cmp(result_register(), ip); |
- __ b(eq, if_false); |
- __ LoadRoot(ip, Heap::kTrueValueRootIndex); |
- __ cmp(result_register(), ip); |
- __ b(eq, if_true); |
- __ LoadRoot(ip, Heap::kFalseValueRootIndex); |
- __ cmp(result_register(), ip); |
- __ b(eq, if_false); |
- STATIC_ASSERT(kSmiTag == 0); |
- __ tst(result_register(), result_register()); |
- __ b(eq, if_false); |
- __ JumpIfSmi(result_register(), if_true); |
+ if (CpuFeatures::IsSupported(VFP3)) { |
+ CpuFeatures::Scope scope(VFP3); |
+ // Emit the inlined tests assumed by the stub. |
+ __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); |
+ __ cmp(result_register(), ip); |
+ __ b(eq, if_false); |
+ __ LoadRoot(ip, Heap::kTrueValueRootIndex); |
+ __ cmp(result_register(), ip); |
+ __ b(eq, if_true); |
+ __ LoadRoot(ip, Heap::kFalseValueRootIndex); |
+ __ cmp(result_register(), ip); |
+ __ b(eq, if_false); |
+ STATIC_ASSERT(kSmiTag == 0); |
+ __ tst(result_register(), result_register()); |
+ __ b(eq, if_false); |
+ __ JumpIfSmi(result_register(), if_true); |
- // Call the ToBoolean stub for all other cases. |
- ToBooleanStub stub(result_register()); |
- __ CallStub(&stub); |
- __ tst(result_register(), result_register()); |
+ // Call the ToBoolean stub for all other cases. |
+ ToBooleanStub stub(result_register()); |
+ __ CallStub(&stub); |
+ __ tst(result_register(), result_register()); |
+ } else { |
+ // Call the runtime to find the boolean value of the source and then |
+ // translate it into control flow to the pair of labels. |
+ __ push(result_register()); |
+ __ CallRuntime(Runtime::kToBool, 1); |
+ __ LoadRoot(ip, Heap::kFalseValueRootIndex); |
+ __ cmp(r0, ip); |
+ } |
// The stub returns nonzero for true. |
Split(ne, if_true, if_false, fall_through); |