Reviewers: Karl Klose, Description: ARM: Fix the use of the ToBooleanStub when VFP3 is not available
Please review this at http://codereview.chromium.org/6594045/ SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/arm/code-stubs-arm.cc M src/arm/full-codegen-arm.cc Index: src/arm/code-stubs-arm.cc =================================================================== --- src/arm/code-stubs-arm.cc (revision 6957) +++ src/arm/code-stubs-arm.cc (working copy) @@ -1296,6 +1296,9 @@ // This stub does not handle the inlined cases (Smis, Booleans, undefined). // The stub returns zero for false, and a non-zero value for true. void ToBooleanStub::Generate(MacroAssembler* masm) { + // This stub uses VFP3 instructions. + ASSERT(CpuFeatures::IsEnabled(VFP3)); + Label false_result; Label not_heap_number; Register scratch = r9.is(tos_) ? r7 : r9; 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); -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
