Reviewers: Kevin Millikin, iposva,

Description:
Move implementation of comparisons with constant smis to use
virtual frame constant results, not literal AST nodes.
Drop smi check for comparisons with non-smi constants.

Please review this at http://codereview.chromium.org/20455

SVN Base: http://v8.googlecode.com/svn/branches/experimental/toiger/

Affected files:
   M     src/codegen-ia32.cc


Index: src/codegen-ia32.cc
===================================================================
--- src/codegen-ia32.cc (revision 1301)
+++ src/codegen-ia32.cc (working copy)
@@ -1329,20 +1329,25 @@
        dest->Split(cc);
      }
    } else {  // Neither side is a constant Smi, normal comparison operation.
+    // If either side is a non-smi constant, skip the smi check.
+    bool known_non_smi =
+      left_side.is_constant() && !left_side.handle()->IsSmi() ||
+      right_side.is_constant() && !right_side.handle()->IsSmi();
      left_side.ToRegister();
      right_side.ToRegister();
      ASSERT(left_side.is_valid());
      ASSERT(right_side.is_valid());
-    // Check for the smi case.
      JumpTarget is_smi(this);
-    Result temp = allocator_->Allocate();
-    ASSERT(temp.is_valid());
-    __ mov(temp.reg(), left_side.reg());
-    __ or_(temp.reg(), Operand(right_side.reg()));
-    __ test(temp.reg(), Immediate(kSmiTagMask));
-    temp.Unuse();
-    is_smi.Branch(zero, &left_side, &right_side, taken);
-
+    if (!known_non_smi) {
+      // Check for the smi case.
+      Result temp = allocator_->Allocate();
+      ASSERT(temp.is_valid());
+      __ mov(temp.reg(), left_side.reg());
+      __ or_(temp.reg(), Operand(right_side.reg()));
+      __ test(temp.reg(), Immediate(kSmiTagMask));
+      temp.Unuse();
+      is_smi.Branch(zero, &left_side, &right_side, taken);
+    }
      // When non-smi, call out to the compare stub.  "parameters" setup by
      // calling code in edx and eax and "result" is returned in the flags.
      if (!left_side.reg().is(eax)) {
@@ -1366,16 +1371,19 @@
        __ cmp(answer.reg(), 0);
      }
      answer.Unuse();
-    dest->true_target()->Branch(cc);
-    dest->false_target()->Jump();
-
-    is_smi.Bind(&left_side, &right_side);
-    left_side.ToRegister();
-    right_side.ToRegister();
-    __ cmp(left_side.reg(), Operand(right_side.reg()));
-    right_side.Unuse();
-    left_side.Unuse();
-    dest->Split(cc);
+    if (known_non_smi) {
+      dest->Split(cc);
+    } else {
+      dest->true_target()->Branch(cc);
+      dest->false_target()->Jump();
+      is_smi.Bind(&left_side, &right_side);
+      left_side.ToRegister();
+      right_side.ToRegister();
+      __ cmp(left_side.reg(), Operand(right_side.reg()));
+      right_side.Unuse();
+      left_side.Unuse();
+      dest->Split(cc);
+    }
    }
  }

@@ -4742,20 +4750,9 @@
      default:
        UNREACHABLE();
    }
-
-  // Optimize for the case where (at least) one of the expressions
-  // is a literal small integer.
-  if (IsInlineSmi(left->AsLiteral())) {
-    Load(right);
-    SmiComparison(ReverseCondition(cc), left->AsLiteral()->handle(),  
strict);
-  } else if (IsInlineSmi(right->AsLiteral())) {
-    Load(left);
-    SmiComparison(cc, right->AsLiteral()->handle(), strict);
-  } else {
-    Load(left);
-    Load(right);
-    Comparison(cc, strict, destination());
-  }
+  Load(left);
+  Load(right);
+  Comparison(cc, strict, destination());
  }





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

Reply via email to