Revision: 7460
Author:   [email protected]
Date:     Thu Mar 31 06:57:49 2011
Log:      Merge r7396 from bleeding edge.
Review URL: http://codereview.chromium.org/6670121
http://code.google.com/p/v8/source/detail?r=7460

Modified:
 /branches/3.1/src/arm/code-stubs-arm.cc
 /branches/3.1/src/arm/code-stubs-arm.h
 /branches/3.1/src/ia32/code-stubs-ia32.cc
 /branches/3.1/src/ia32/code-stubs-ia32.h
 /branches/3.1/src/ic.cc
 /branches/3.1/src/ic.h
 /branches/3.1/src/version.cc
 /branches/3.1/src/x64/code-stubs-x64.cc
 /branches/3.1/src/x64/code-stubs-x64.h

=======================================
--- /branches/3.1/src/arm/code-stubs-arm.cc     Wed Mar  2 05:43:26 2011
+++ /branches/3.1/src/arm/code-stubs-arm.cc     Thu Mar 31 06:57:49 2011
@@ -2856,6 +2856,9 @@
     case TRBinaryOpIC::HEAP_NUMBER:
       GenerateHeapNumberStub(masm);
       break;
+    case TRBinaryOpIC::ODDBALL:
+      GenerateOddballStub(masm);
+      break;
     case TRBinaryOpIC::STRING:
       GenerateStringStub(masm);
       break;
@@ -3570,12 +3573,45 @@
   __ bind(&call_runtime);
   GenerateCallRuntime(masm);
 }
+
+
+void TypeRecordingBinaryOpStub::GenerateOddballStub(MacroAssembler* masm) {
+  Label call_runtime;
+
+  if (op_ == Token::ADD) {
+    // Handle string addition here, because it is the only operation
+    // that does not do a ToNumber conversion on the operands.
+    GenerateAddStrings(masm);
+  }
+
+  // Convert oddball arguments to numbers.
+  Label check, done;
+  __ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
+  __ cmp(r1, ip);
+  __ b(ne, &check);
+  if (Token::IsBitOp(op_)) {
+    __ mov(r1, Operand(Smi::FromInt(0)));
+  } else {
+    __ LoadRoot(r1, Heap::kNanValueRootIndex);
+  }
+  __ jmp(&done);
+  __ bind(&check);
+  __ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
+  __ cmp(r0, ip);
+  __ b(ne, &done);
+  if (Token::IsBitOp(op_)) {
+    __ mov(r0, Operand(Smi::FromInt(0)));
+  } else {
+    __ LoadRoot(r0, Heap::kNanValueRootIndex);
+  }
+  __ bind(&done);
+
+  GenerateHeapNumberStub(masm);
+}


void TypeRecordingBinaryOpStub::GenerateHeapNumberStub(MacroAssembler* masm) {
   Label not_numbers, call_runtime;
-  ASSERT(operands_type_ == TRBinaryOpIC::HEAP_NUMBER);
-
   GenerateFPOperation(masm, false, &not_numbers, &call_runtime);

   __ bind(&not_numbers);
=======================================
--- /branches/3.1/src/arm/code-stubs-arm.h      Mon Feb 28 05:13:38 2011
+++ /branches/3.1/src/arm/code-stubs-arm.h      Thu Mar 31 06:57:49 2011
@@ -302,6 +302,7 @@
   void GenerateSmiStub(MacroAssembler* masm);
   void GenerateInt32Stub(MacroAssembler* masm);
   void GenerateHeapNumberStub(MacroAssembler* masm);
+  void GenerateOddballStub(MacroAssembler* masm);
   void GenerateStringStub(MacroAssembler* masm);
   void GenerateGenericStub(MacroAssembler* masm);
   void GenerateAddStrings(MacroAssembler* masm);
=======================================
--- /branches/3.1/src/ia32/code-stubs-ia32.cc   Wed Mar  2 05:43:26 2011
+++ /branches/3.1/src/ia32/code-stubs-ia32.cc   Thu Mar 31 06:57:49 2011
@@ -1342,6 +1342,9 @@
     case TRBinaryOpIC::HEAP_NUMBER:
       GenerateHeapNumberStub(masm);
       break;
+    case TRBinaryOpIC::ODDBALL:
+      GenerateOddballStub(masm);
+      break;
     case TRBinaryOpIC::STRING:
       GenerateStringStub(masm);
       break;
@@ -2004,11 +2007,43 @@
       UNREACHABLE();
   }
 }
+
+
+void TypeRecordingBinaryOpStub::GenerateOddballStub(MacroAssembler* masm) {
+  Label call_runtime;
+
+  if (op_ == Token::ADD) {
+    // Handle string addition here, because it is the only operation
+    // that does not do a ToNumber conversion on the operands.
+    GenerateAddStrings(masm);
+  }
+
+  // Convert odd ball arguments to numbers.
+  NearLabel check, done;
+  __ cmp(edx, Factory::undefined_value());
+  __ j(not_equal, &check);
+  if (Token::IsBitOp(op_)) {
+    __ xor_(edx, Operand(edx));
+  } else {
+    __ mov(edx, Immediate(Factory::nan_value()));
+  }
+  __ jmp(&done);
+  __ bind(&check);
+  __ cmp(eax, Factory::undefined_value());
+  __ j(not_equal, &done);
+  if (Token::IsBitOp(op_)) {
+    __ xor_(eax, Operand(eax));
+  } else {
+    __ mov(eax, Immediate(Factory::nan_value()));
+  }
+  __ bind(&done);
+
+  GenerateHeapNumberStub(masm);
+}


void TypeRecordingBinaryOpStub::GenerateHeapNumberStub(MacroAssembler* masm) {
   Label call_runtime;
-  ASSERT(operands_type_ == TRBinaryOpIC::HEAP_NUMBER);

   // Floating point case.
   switch (op_) {
=======================================
--- /branches/3.1/src/ia32/code-stubs-ia32.h    Wed Feb 16 04:32:18 2011
+++ /branches/3.1/src/ia32/code-stubs-ia32.h    Thu Mar 31 06:57:49 2011
@@ -306,6 +306,7 @@
   void GenerateSmiStub(MacroAssembler* masm);
   void GenerateInt32Stub(MacroAssembler* masm);
   void GenerateHeapNumberStub(MacroAssembler* masm);
+  void GenerateOddballStub(MacroAssembler* masm);
   void GenerateStringStub(MacroAssembler* masm);
   void GenerateGenericStub(MacroAssembler* masm);
   void GenerateAddStrings(MacroAssembler* masm);
=======================================
--- /branches/3.1/src/ic.cc     Thu Mar 31 05:17:55 2011
+++ /branches/3.1/src/ic.cc     Thu Mar 31 06:57:49 2011
@@ -2092,6 +2092,7 @@
     case SMI: return "SMI";
     case INT32: return "Int32s";
     case HEAP_NUMBER: return "HeapNumbers";
+    case ODDBALL: return "Oddball";
     case STRING: return "Strings";
     case GENERIC: return "Generic";
     default: return "Invalid";
@@ -2106,6 +2107,7 @@
     case SMI:
     case INT32:
     case HEAP_NUMBER:
+    case ODDBALL:
     case STRING:
       return MONOMORPHIC;
     case GENERIC:
@@ -2152,6 +2154,10 @@
     // arguments is a string.
     return STRING;
   }
+
+  // Check for oddball objects.
+  if (left->IsUndefined() && right->IsNumber()) return ODDBALL;
+  if (left->IsNumber() && right->IsUndefined()) return ODDBALL;

   return GENERIC;
 }
=======================================
--- /branches/3.1/src/ic.h      Wed Mar  2 05:43:26 2011
+++ /branches/3.1/src/ic.h      Thu Mar 31 06:57:49 2011
@@ -576,6 +576,7 @@
     SMI,
     INT32,
     HEAP_NUMBER,
+    ODDBALL,
STRING, // Only used for addition operation. At least one string operand.
     GENERIC
   };
=======================================
--- /branches/3.1/src/version.cc        Thu Mar 31 05:17:55 2011
+++ /branches/3.1/src/version.cc        Thu Mar 31 06:57:49 2011
@@ -35,7 +35,7 @@
 #define MAJOR_VERSION     3
 #define MINOR_VERSION     1
 #define BUILD_NUMBER      8
-#define PATCH_LEVEL       7
+#define PATCH_LEVEL       8
 #define CANDIDATE_VERSION false

 // Define SONAME to have the SCons build the put a specific SONAME into the
=======================================
--- /branches/3.1/src/x64/code-stubs-x64.cc     Wed Mar  2 05:43:26 2011
+++ /branches/3.1/src/x64/code-stubs-x64.cc     Thu Mar 31 06:57:49 2011
@@ -1053,6 +1053,9 @@
     case TRBinaryOpIC::HEAP_NUMBER:
       GenerateHeapNumberStub(masm);
       break;
+    case TRBinaryOpIC::ODDBALL:
+      GenerateOddballStub(masm);
+      break;
     case TRBinaryOpIC::STRING:
       GenerateStringStub(masm);
       break;
@@ -1426,6 +1429,39 @@
   // TRBinaryOpIC type.
   GenerateTypeTransition(masm);
 }
+
+
+void TypeRecordingBinaryOpStub::GenerateOddballStub(MacroAssembler* masm) {
+  Label call_runtime;
+
+  if (op_ == Token::ADD) {
+    // Handle string addition here, because it is the only operation
+    // that does not do a ToNumber conversion on the operands.
+    GenerateStringAddCode(masm);
+  }
+
+  // Convert oddball arguments to numbers.
+  NearLabel check, done;
+  __ CompareRoot(rdx, Heap::kUndefinedValueRootIndex);
+  __ j(not_equal, &check);
+  if (Token::IsBitOp(op_)) {
+    __ xor_(rdx, rdx);
+  } else {
+    __ LoadRoot(rdx, Heap::kNanValueRootIndex);
+  }
+  __ jmp(&done);
+  __ bind(&check);
+  __ CompareRoot(rax, Heap::kUndefinedValueRootIndex);
+  __ j(not_equal, &done);
+  if (Token::IsBitOp(op_)) {
+    __ xor_(rax, rax);
+  } else {
+    __ LoadRoot(rax, Heap::kNanValueRootIndex);
+  }
+  __ bind(&done);
+
+  GenerateHeapNumberStub(masm);
+}


void TypeRecordingBinaryOpStub::GenerateHeapNumberStub(MacroAssembler* masm) {
=======================================
--- /branches/3.1/src/x64/code-stubs-x64.h      Mon Feb 28 05:13:38 2011
+++ /branches/3.1/src/x64/code-stubs-x64.h      Thu Mar 31 06:57:49 2011
@@ -289,6 +289,7 @@
   void GenerateSmiStub(MacroAssembler* masm);
   void GenerateInt32Stub(MacroAssembler* masm);
   void GenerateHeapNumberStub(MacroAssembler* masm);
+  void GenerateOddballStub(MacroAssembler* masm);
   void GenerateStringStub(MacroAssembler* masm);
   void GenerateGenericStub(MacroAssembler* masm);

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

Reply via email to