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

Reply via email to