Index: src/arm/cfg-arm.cc |
=================================================================== |
--- src/arm/cfg-arm.cc (revision 2635) |
+++ src/arm/cfg-arm.cc (working copy) |
@@ -108,26 +108,31 @@ |
} |
+void MoveInstr::Compile(MacroAssembler* masm) { |
+ location()->Move(masm, value()); |
+} |
+ |
+ |
void BinaryOpInstr::Compile(MacroAssembler* masm) { |
// The right-hand value should not be on the stack---if it is a |
// compiler-generated temporary it is in the accumulator. |
- ASSERT(!val1_->is_on_stack()); |
+ ASSERT(!value1()->is_on_stack()); |
Comment cmnt(masm, "[ BinaryOpInstr"); |
// We can overwrite one of the operands if it is a temporary. |
OverwriteMode mode = NO_OVERWRITE; |
- if (val0_->is_temporary()) { |
+ if (value0()->is_temporary()) { |
mode = OVERWRITE_LEFT; |
- } else if (val1_->is_temporary()) { |
+ } else if (value1()->is_temporary()) { |
mode = OVERWRITE_RIGHT; |
} |
// Move left to r1 and right to r0. |
- val0_->Get(masm, r1); |
- val1_->Get(masm, r0); |
- GenericBinaryOpStub stub(op_, mode); |
+ value0()->Get(masm, r1); |
+ value1()->Get(masm, r0); |
+ GenericBinaryOpStub stub(op(), mode); |
__ CallStub(&stub); |
- loc_->Set(masm, r0); |
+ location()->Set(masm, r0); |
} |
@@ -167,6 +172,12 @@ |
} |
+void Constant::MoveToSlot(MacroAssembler* masm, SlotLocation* loc) { |
+ __ mov(ip, Operand(handle_)); |
+ __ str(ip, ToMemOperand(loc)); |
+} |
+ |
+ |
void SlotLocation::Get(MacroAssembler* masm, Register reg) { |
__ ldr(reg, ToMemOperand(this)); |
} |
@@ -183,6 +194,18 @@ |
} |
+void SlotLocation::Move(MacroAssembler* masm, Value* value) { |
+ // Double dispatch. |
+ value->MoveToSlot(masm, this); |
+} |
+ |
+ |
+void SlotLocation::MoveToSlot(MacroAssembler* masm, SlotLocation* loc) { |
+ __ ldr(ip, ToMemOperand(this)); |
+ __ str(ip, ToMemOperand(loc)); |
+} |
+ |
+ |
void TempLocation::Get(MacroAssembler* masm, Register reg) { |
switch (where_) { |
case ACCUMULATOR: |
@@ -191,9 +214,8 @@ |
case STACK: |
__ pop(reg); |
break; |
- case NOWHERE: |
+ case NOT_ALLOCATED: |
UNREACHABLE(); |
- break; |
} |
} |
@@ -206,9 +228,8 @@ |
case STACK: |
__ push(reg); |
break; |
- case NOWHERE: |
+ case NOT_ALLOCATED: |
UNREACHABLE(); |
- break; |
} |
} |
@@ -219,13 +240,38 @@ |
__ push(r0); |
break; |
case STACK: |
- case NOWHERE: |
+ case NOT_ALLOCATED: |
UNREACHABLE(); |
+ } |
+} |
+ |
+ |
+void TempLocation::Move(MacroAssembler* masm, Value* value) { |
+ switch (where_) { |
+ case ACCUMULATOR: |
+ value->Get(masm, r0); |
+ case STACK: |
+ value->Push(masm); |
break; |
+ case NOT_ALLOCATED: |
+ UNREACHABLE(); |
} |
} |
+void TempLocation::MoveToSlot(MacroAssembler* masm, SlotLocation* loc) { |
+ switch (where_) { |
+ case ACCUMULATOR: |
+ __ str(r0, ToMemOperand(loc)); |
+ case STACK: |
+ __ pop(ip); |
+ __ str(ip, ToMemOperand(loc)); |
+ break; |
+ case NOT_ALLOCATED: |
+ UNREACHABLE(); |
+ } |
+} |
+ |
#undef __ |
} } // namespace v8::internal |