Reviewers: Vyacheslav Egorov,

Description:
Use static type information on x64 in LikelySmiBinaryOperation

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

SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/

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


Index: src/x64/codegen-x64.cc
===================================================================
--- src/x64/codegen-x64.cc      (revision 4823)
+++ src/x64/codegen-x64.cc      (working copy)
@@ -7142,9 +7142,6 @@
   // Copy the type info because left and right may be overwritten.
   TypeInfo left_type_info = left->type_info();
   TypeInfo right_type_info = right->type_info();
-  USE(left_type_info);
-  USE(right_type_info);
-  // TODO(X64): Use type information in calculations.
   Token::Value op = expr->op();
   Result answer;
   // Special handling of div and mod because they use fixed registers.
@@ -7221,7 +7218,13 @@
                                           left->reg(),
                                           right->reg(),
                                           overwrite_mode);
- __ JumpIfNotBothSmi(left->reg(), right->reg(), deferred->entry_label());
+    if (!left_type_info.IsSmi() && !right_type_info.IsSmi()) {
+ __ JumpIfNotBothSmi(left->reg(), right->reg(), deferred->entry_label());
+    } else if (!left_type_info.IsSmi()) {
+      __ JumpIfNotSmi(left->reg(), deferred->entry_label());
+    } else if (!right_type_info.IsSmi()) {
+      __ JumpIfNotSmi(right->reg(), deferred->entry_label());
+    }

     if (op == Token::DIV) {
       __ SmiDiv(rax, left->reg(), right->reg(), deferred->entry_label());
@@ -7351,7 +7354,13 @@
                                         left->reg(),
                                         right->reg(),
                                         overwrite_mode);
-  __ JumpIfNotBothSmi(left->reg(), right->reg(), deferred->entry_label());
+  if (!left_type_info.IsSmi() && !right_type_info.IsSmi()) {
+ __ JumpIfNotBothSmi(left->reg(), right->reg(), deferred->entry_label());
+  } else if (!left_type_info.IsSmi()) {
+    __ JumpIfNotSmi(left->reg(), deferred->entry_label());
+  } else if (!right_type_info.IsSmi()) {
+    __ JumpIfNotSmi(right->reg(), deferred->entry_label());
+  }

   switch (op) {
     case Token::ADD:


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

Reply via email to