Chromium Code Reviews| Index: runtime/vm/assembler_arm64.cc |
| =================================================================== |
| --- runtime/vm/assembler_arm64.cc (revision 35373) |
| +++ runtime/vm/assembler_arm64.cc (working copy) |
| @@ -561,30 +561,29 @@ |
| } |
| -void Assembler::LoadFromOffset(Register dest, Register base, int32_t offset) { |
| +void Assembler::LoadFromOffset( |
| + Register dest, Register base, int32_t offset, OperandSize sz) { |
| ASSERT(base != TMP2); |
| if (Address::CanHoldOffset(offset)) { |
| - ldr(dest, Address(base, offset)); |
| + ldr(dest, Address(base, offset), sz); |
| } else { |
| // Since offset is 32-bits, it won't be loaded from the pool. |
| AddImmediate(TMP2, base, offset, kNoRegister); |
| - ldr(dest, Address(TMP2)); |
| + ldr(dest, Address(TMP2), sz); |
| } |
| } |
| -void Assembler::StoreToOffset(Register src, Register base, int32_t offset) { |
| +void Assembler::StoreToOffset( |
| + Register src, Register base, int32_t offset, OperandSize sz) { |
| ASSERT(src != TMP2); |
| ASSERT(base != TMP2); |
| if (Address::CanHoldOffset(offset)) { |
| - str(src, Address(base, offset)); |
| - } else if (Address::CanHoldOffset(offset, Address::PreIndex)) { |
| - mov(TMP2, base); |
| - str(src, Address(TMP2, offset, Address::PreIndex)); |
| + str(src, Address(base, offset), sz); |
| } else { |
| // Since offset is 32-bits, it won't be loaded from the pool. |
| AddImmediate(TMP2, base, offset, kNoRegister); |
| - str(src, Address(TMP2)); |
| + str(src, Address(TMP2), sz); |
| } |
| } |
| @@ -818,6 +817,24 @@ |
| entry.Call(this, argument_count); |
| } |
| + |
| +void Assembler::EnterStubFrame(bool load_pp) { |
| + EnterFrame(0); |
| + Push(ZR); // Push 0 in the saved PC area for stub frames. |
| + PushPP(); // Save caller's pool pointer |
| + if (load_pp) { |
| + LoadPoolPointer(PP); |
| + } |
| +} |
| + |
| + |
| +void Assembler::LeaveStubFrame() { |
| + // Restore and untag PP. |
| + LoadFromOffset(PP, FP, kSavedCallerPpSlotFromFp * kWordSize); |
| + sub(PP, PP, Operand(kHeapObjectTag)); |
|
regis
2014/04/24 16:20:07
It is surprising to see this untag operation when
zra
2014/04/24 16:29:01
Done.
|
| + LeaveFrame(); |
| +} |
| + |
| } // namespace dart |
| #endif // defined TARGET_ARCH_ARM64 |