Reviewers: William Hesse,

Description:
X64: Make the ToBoolean inline code do even less if the value is known to be a
smi.

Please review this at http://codereview.chromium.org/2834028/show

Affected files:
  M src/regexp.js
  M src/x64/codegen-x64.cc


Index: src/regexp.js
diff --git a/src/regexp.js b/src/regexp.js
index f0945b34594433675edc14d66768e2de56760264..58e620d9ab69f6923eef8d6fdf23eea4966e28c9 100644
--- a/src/regexp.js
+++ b/src/regexp.js
@@ -296,14 +296,14 @@ function RegExpTest(string) {
     return cache.answer;
   }

-  // Remove irrelevant preceeding '.*' in a test regexp. The expression
-  // checks whether this.source starts with '.*' and that the third
+  // Remove irrelevant preceeding '.*' in a test regexp. The expression
+  // checks whether this.source starts with '.*' and that the third
   // char is not a '?'
   if (%_StringCharCodeAt(this.source,0) == 46 && // '.'
-      %_StringCharCodeAt(this.source,1) == 42 && // '*'
-      %_StringCharCodeAt(this.source,2) != 63) { // '?'
+      %_StringCharCodeAt(this.source,1) == 42 && // '*'
+      %_StringCharCodeAt(this.source,2) != 63) { // '?'
     if (!%_ObjectEquals(regexp_key, this)) {
-      regexp_key = this;
+      regexp_key = this;
regexp_val = new $RegExp(this.source.substring(2, this.source.length),
                                (this.global ? 'g' : '')
                                + (this.ignoreCase ? 'i' : '')
@@ -311,7 +311,7 @@ function RegExpTest(string) {
     }
     if (!regexp_val.test(s)) return false;
   }
-
+
   var length = s.length;
   var i = this.global ? TO_INTEGER(lastIndex) : 0;

Index: src/x64/codegen-x64.cc
diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc
index 0c4cd16ceed6d70646659ffda142dddf57ab8078..09deda8eb88d9e7c3ea5d601e7489204e8863c0b 100644
--- a/src/x64/codegen-x64.cc
+++ b/src/x64/codegen-x64.cc
@@ -5342,13 +5342,18 @@ void CodeGenerator::ToBoolean(ControlDestination* dest) {
     }
     // Smi => false iff zero.
     __ SmiCompare(value.reg(), Smi::FromInt(0));
-    dest->false_target()->Branch(equal);
-    Condition is_smi = masm_->CheckSmi(value.reg());
-    dest->true_target()->Branch(is_smi);
-    __ xorpd(xmm0, xmm0);
-    __ ucomisd(xmm0, FieldOperand(value.reg(), HeapNumber::kValueOffset));
-    value.Unuse();
-    dest->Split(not_zero);
+    if (value.is_smi()) {
+      value.Unuse();
+      dest->Split(not_zero);
+    } else {
+      dest->false_target()->Branch(equal);
+      Condition is_smi = masm_->CheckSmi(value.reg());
+      dest->true_target()->Branch(is_smi);
+      __ xorpd(xmm0, xmm0);
+ __ ucomisd(xmm0, FieldOperand(value.reg(), HeapNumber::kValueOffset));
+      value.Unuse();
+      dest->Split(not_zero);
+    }
   } else {
     // Fast case checks.
     // 'false' => false.


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to