Chromium Code Reviews| Index: runtime/vm/assembler_arm.cc |
| =================================================================== |
| --- runtime/vm/assembler_arm.cc (revision 19272) |
| +++ runtime/vm/assembler_arm.cc (working copy) |
| @@ -7,6 +7,7 @@ |
| #include "vm/assembler.h" |
| +#include "vm/runtime_entry.h" |
| #include "vm/stub_code.h" |
| namespace dart { |
| @@ -1047,6 +1048,14 @@ |
| } |
| +void Assembler::Drop(intptr_t stack_elements) { |
|
zra
2013/03/01 17:32:49
Maybe change name to DropFromStack?
srdjan
2013/03/01 17:46:28
We are already using the name Drop for other archi
regis
2013/03/04 17:52:18
Not changing the name, but not too fond of it eith
|
| + ASSERT(stack_elements >= 0); |
| + if (stack_elements > 0) { |
| + AddImmediate(SP, SP, stack_elements * kWordSize); |
| + } |
| +} |
| + |
| + |
| void Assembler::LoadObject(Register rd, const Object& object) { |
| if (object.IsNull() || |
| object.IsSmi() || |
| @@ -1583,11 +1592,46 @@ |
| // the C++ world. |
| AddImmediate(SP, -frame_space); |
| if (OS::ActivationFrameAlignment() > 0) { |
| - and_(SP, SP, ShifterOperand(~(OS::ActivationFrameAlignment() - 1))); |
| + bic(SP, SP, ShifterOperand(OS::ActivationFrameAlignment() - 1)); |
| } |
| } |
| +void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) { |
| + // Preserve volatile CPU registers. |
| + EnterFrame(kDartVolatileCpuRegs | (1 << FP), 0); |
| + |
| + // Preserve all volatile FPU registers. |
| + // TODO(regis): Use vstmd instruction once supported. |
| + // vstmd(DB_W, SP, kDartFirstVolatileFpuReg, kDartLastVolatileFpuReg); |
| + |
| + ReserveAlignedFrameSpace(frame_space); |
| +} |
| + |
| + |
| +void Assembler::LeaveCallRuntimeFrame() { |
| + // SP might have been modified to reserve space for arguments |
| + // and ensure proper alignment of the stack frame. |
| + // We need to restore it before restoring registers. |
| + const intptr_t kPushedRegistersSize = |
| + kDartVolatileCpuRegCount * kWordSize; |
| + // TODO(regis): + kDartVolatileFpuRegCount * 2 * kWordSize; |
| + AddImmediate(SP, FP, -kPushedRegistersSize); |
| + |
| + // Restore all volatile FPU registers. |
| + // TODO(regis): Use vldmd instruction once supported. |
| + // vldmd(IA_W, SP, kDartFirstVolatileFpuReg, kDartLastVolatileFpuReg); |
| + |
| + // Restore volatile CPU registers. |
| + LeaveFrame(kDartVolatileCpuRegs | (1 << FP)); |
| +} |
| + |
| + |
| +void Assembler::CallRuntime(const RuntimeEntry& entry) { |
| + entry.Call(this); |
| +} |
| + |
| + |
| void Assembler::Stop(const char* message) { |
| if (FLAG_print_stop_message) { |
| PushList((1 << R0) | (1 << IP) | (1 << LR)); // Preserve R0, IP, LR. |