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, ¬_numbers, &call_runtime);
__ bind(¬_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