Index: src/arm/code-stubs-arm.cc |
=================================================================== |
--- src/arm/code-stubs-arm.cc (revision 6471) |
+++ src/arm/code-stubs-arm.cc (working copy) |
@@ -2433,6 +2433,46 @@ |
} |
+void TypeRecordingBinaryOpStub::GenerateOptimisticSmiOperation( |
+ MacroAssembler* masm) { |
+ Register left = r1; |
+ Register right = r0; |
+ |
+ ASSERT(right.is(r0)); |
+ |
+ switch (op_) { |
+ case Token::ADD: |
+ __ add(right, left, Operand(right), SetCC); // Add optimistically. |
+ __ Ret(vc); |
+ __ sub(right, right, Operand(left)); // Revert optimistic add. |
+ break; |
+ case Token::SUB: |
+ __ sub(right, left, Operand(right), SetCC); // Subtract optimistically. |
+ __ Ret(vc); |
+ __ sub(right, left, Operand(right)); // Revert optimistic subtract. |
Alexandre
2011/01/25 16:51:15
Shouldn't it be an add(right, right, Operand(left)
Alexandre
2011/01/25 16:54:45
Sorry I messed up with these right and left.
On 20
|
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+} |
+ |
+ |
+void TypeRecordingBinaryOpStub::GenerateVFPOperation( |
+ MacroAssembler* masm) { |
+ switch (op_) { |
+ case Token::ADD: |
+ __ vadd(d5, d6, d7); |
+ break; |
+ case Token::SUB: |
+ __ vsub(d5, d6, d7); |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+ |
+} |
+ |
+ |
// Generate the smi code. If the operation on smis are successful this return is |
// generated. If the result is not a smi and heap number allocation is not |
// requested the code falls through. If number allocation is requested but a |
@@ -2442,7 +2482,7 @@ |
SmiCodeGenerateHeapNumberResults allow_heapnumber_results) { |
Label not_smis; |
- ASSERT(op_ == Token::ADD); |
+ ASSERT(op_ == Token::ADD || op_ == Token::SUB); |
Register left = r1; |
Register right = r0; |
@@ -2455,15 +2495,8 @@ |
__ tst(scratch1, Operand(kSmiTagMask)); |
__ b(ne, ¬_smis); |
- __ add(right, right, Operand(left), SetCC); // Add optimistically. |
+ GenerateOptimisticSmiOperation(masm); |
- // Return smi result if no overflow (r0 is the result). |
- ASSERT(right.is(r0)); |
- __ Ret(vc); |
- |
- // Result is not a smi. Revert the optimistic add. |
- __ sub(right, right, Operand(left)); |
- |
// If heap number results are possible generate the result in an allocated |
// heap number. |
if (allow_heapnumber_results == ALLOW_HEAPNUMBER_RESULTS) { |
@@ -2489,7 +2522,7 @@ |
// d6: Left value |
// d7: Right value |
CpuFeatures::Scope scope(VFP3); |
- __ vadd(d5, d6, d7); |
+ GenerateVFPOperation(masm); |
__ sub(r0, heap_number, Operand(kHeapObjectTag)); |
__ vstr(d5, r0, HeapNumber::kValueOffset); |
@@ -2530,7 +2563,7 @@ |
void TypeRecordingBinaryOpStub::GenerateSmiStub(MacroAssembler* masm) { |
Label not_smis, call_runtime; |
- ASSERT(op_ == Token::ADD); |
+ ASSERT(op_ == Token::ADD || op_ == Token::SUB); |
if (result_type_ == TRBinaryOpIC::UNINITIALIZED || |
result_type_ == TRBinaryOpIC::SMI) { |
@@ -2562,7 +2595,7 @@ |
void TypeRecordingBinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) { |
- ASSERT(op_ == Token::ADD); |
+ ASSERT(op_ == Token::ADD || op_ == Token::SUB); |
ASSERT(operands_type_ == TRBinaryOpIC::INT32); |
@@ -2571,7 +2604,7 @@ |
void TypeRecordingBinaryOpStub::GenerateHeapNumberStub(MacroAssembler* masm) { |
- ASSERT(op_ == Token::ADD); |
+ ASSERT(op_ == Token::ADD || op_ == Token::SUB); |
Register scratch1 = r7; |
Register scratch2 = r9; |
@@ -2597,7 +2630,7 @@ |
if (destination == FloatingPointHelper::kVFPRegisters) { |
// Use floating point instructions for the binary operation. |
CpuFeatures::Scope scope(VFP3); |
- __ vadd(d5, d6, d7); |
+ GenerateVFPOperation(masm); |
// Get a heap number object for the result - might be left or right if one |
// of these are overwritable. |
@@ -2651,7 +2684,7 @@ |
void TypeRecordingBinaryOpStub::GenerateGeneric(MacroAssembler* masm) { |
- ASSERT(op_ == Token::ADD); |
+ ASSERT(op_ == Token::ADD || op_ == Token::SUB); |
Label call_runtime; |
@@ -2695,11 +2728,14 @@ |
void TypeRecordingBinaryOpStub::GenerateCallRuntime(MacroAssembler* masm) { |
+ GenerateRegisterArgsPush(masm); |
switch (op_) { |
case Token::ADD: |
- GenerateRegisterArgsPush(masm); |
__ InvokeBuiltin(Builtins::ADD, JUMP_JS); |
break; |
+ case Token::SUB: |
+ __ InvokeBuiltin(Builtins::SUB, JUMP_JS); |
+ break; |
default: |
UNREACHABLE(); |
} |