Index: src/ia32/codegen-ia32.cc |
=================================================================== |
--- src/ia32/codegen-ia32.cc (revision 3695) |
+++ src/ia32/codegen-ia32.cc (working copy) |
@@ -978,10 +978,8 @@ |
Result answer; |
if (left_is_non_smi || right_is_non_smi) { |
// Go straight to the slow case, with no smi code. |
- frame_->Push(&left); |
- frame_->Push(&right); |
GenericBinaryOpStub stub(op, overwrite_mode, NO_SMI_CODE_IN_STUB); |
- answer = frame_->CallStub(&stub, 2); |
+ answer = stub.GenerateCall(masm_, frame_, &left, &right); |
} else if (right_is_smi) { |
answer = ConstantSmiBinaryOperation(op, &left, right.handle(), |
type, false, overwrite_mode); |
@@ -997,10 +995,8 @@ |
if (loop_nesting() > 0 && (Token::IsBitOp(op) || type->IsLikelySmi())) { |
answer = LikelySmiBinaryOperation(op, &left, &right, overwrite_mode); |
} else { |
- frame_->Push(&left); |
- frame_->Push(&right); |
GenericBinaryOpStub stub(op, overwrite_mode, NO_GENERIC_BINARY_FLAGS); |
- answer = frame_->CallStub(&stub, 2); |
+ answer = stub.GenerateCall(masm_, frame_, &left, &right); |
} |
} |
frame_->Push(&answer); |
@@ -7076,6 +7072,21 @@ |
} |
+Result GenericBinaryOpStub::GenerateCall(MacroAssembler* masm, |
+ VirtualFrame* frame, |
+ Result* left, |
+ Result* right) { |
+ if (ArgsInRegistersSupported()) { |
+ SetArgsInRegisters(); |
+ return frame->CallStub(this, left, right); |
+ } else { |
+ frame->Push(left); |
+ frame->Push(right); |
+ return frame->CallStub(this, 2); |
+ } |
+} |
+ |
+ |
void GenericBinaryOpStub::GenerateSmiCode(MacroAssembler* masm, Label* slow) { |
if (HasArgsInRegisters()) { |
__ mov(ebx, eax); |
@@ -7107,7 +7118,13 @@ |
__ j(overflow, ¬_smis_or_overflow, not_taken); |
break; |
+ case Token::MUL: |
+ __ mov(edi, Operand(eax)); // backup the 1st operand |
Kevin Millikin (Chromium)
2010/01/26 09:07:22
No need for Operand: __ mov(edi, eax).
Comment sh
Vladislav Kaznacheev
2010/01/26 10:21:18
Done.
|
+ break; |
+ |
case Token::DIV: |
+ __ mov(edi, Operand(eax)); // backup the 1st operand |
+ // Fall through. |
case Token::MOD: |
// Sign extend eax into edx:eax. |
__ cdq(); |
@@ -7243,28 +7260,21 @@ |
__ bind(&use_fp_on_smis); |
// Both operands are known to be SMIs but the result does not fit into a SMI. |
switch (op_) { |
+ case Token::MUL: |
+ case Token::DIV: |
+ __ mov(eax, edi); // Restore the 1st operand. |
+ // Fall through. |
case Token::ADD: |
- case Token::SUB: |
- case Token::MUL: |
- case Token::DIV: { |
+ case Token::SUB: { |
Label after_alloc_failure; |
+ __ AllocateHeapNumber(edx, ecx, no_reg, &after_alloc_failure); |
- FloatingPointHelper::ArgLocation arg_location = |
- (op_ == Token::ADD || op_ == Token::SUB) ? |
- FloatingPointHelper::ARGS_IN_REGISTERS : |
- FloatingPointHelper::ARGS_ON_STACK; |
- |
- __ AllocateHeapNumber( |
- edx, |
- ecx, |
- no_reg, |
- arg_location == FloatingPointHelper::ARGS_IN_REGISTERS ? |
- &after_alloc_failure : |
- slow); |
- |
if (CpuFeatures::IsSupported(SSE2)) { |
CpuFeatures::Scope use_sse2(SSE2); |
- FloatingPointHelper::LoadSse2Smis(masm, ecx, arg_location); |
+ FloatingPointHelper::LoadSse2Smis( |
+ masm, |
+ ecx, |
+ FloatingPointHelper::ARGS_IN_REGISTERS); |
Kevin Millikin (Chromium)
2010/01/26 09:07:22
Does LoadSse2Smis need the ArgLocation argument an
Vladislav Kaznacheev
2010/01/26 10:21:18
Removed (also for LoadFloatSmis).
On 2010/01/26 09
|
switch (op_) { |
case Token::ADD: __ addsd(xmm0, xmm1); break; |
case Token::SUB: __ subsd(xmm0, xmm1); break; |
@@ -7274,7 +7284,10 @@ |
} |
__ movdbl(FieldOperand(edx, HeapNumber::kValueOffset), xmm0); |
} else { // SSE2 not available, use FPU. |
- FloatingPointHelper::LoadFloatSmis(masm, ecx, arg_location); |
+ FloatingPointHelper::LoadFloatSmis( |
+ masm, |
+ ecx, |
+ FloatingPointHelper::ARGS_IN_REGISTERS); |
switch (op_) { |
case Token::ADD: __ faddp(1); break; |
case Token::SUB: __ fsubp(1); break; |
@@ -7287,12 +7300,10 @@ |
__ mov(eax, edx); |
GenerateReturn(masm); |
- if (arg_location == FloatingPointHelper::ARGS_IN_REGISTERS) { |
- __ bind(&after_alloc_failure); |
- __ mov(edx, eax); |
- __ mov(eax, ebx); |
- __ jmp(slow); |
- } |
+ __ bind(&after_alloc_failure); |
+ __ mov(edx, eax); |
+ __ mov(eax, ebx); |
+ __ jmp(slow); |
break; |
} |
@@ -7438,7 +7449,7 @@ |
__ bind(&non_smi_result); |
// Allocate a heap number if needed. |
__ mov(ebx, Operand(eax)); // ebx: result |
- Label skip_allocation; |
+ Label skip_allocation; |
switch (mode_) { |
case OVERWRITE_LEFT: |
case OVERWRITE_RIGHT: |