Rework arm64 register codes and fix Arm64ManagedRegister tests.
Change-Id: I81ce3bc8a212c9c35be3a41b182ada87b32391ec
diff --git a/runtime/arch/arm64/context_arm64.cc b/runtime/arch/arm64/context_arm64.cc
index 3eb92c8..0614f1a 100644
--- a/runtime/arch/arm64/context_arm64.cc
+++ b/runtime/arch/arm64/context_arm64.cc
@@ -75,6 +75,7 @@
bool Arm64Context::SetGPR(uint32_t reg, uintptr_t value) {
DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters));
+ DCHECK_NE(reg, static_cast<uint32_t>(XZR));
DCHECK_NE(gprs_[reg], &gZero); // Can't overwrite this static value since they are never reset.
if (gprs_[reg] != nullptr) {
*gprs_[reg] = value;
@@ -146,11 +147,13 @@
extern "C" void art_quick_do_long_jump(uint64_t*, uint64_t*);
void Arm64Context::DoLongJump() {
- uint64_t gprs[32];
+ uint64_t gprs[kNumberOfCoreRegisters];
uint64_t fprs[kNumberOfDRegisters];
- // Do not use kNumberOfCoreRegisters, as this is with the distinction of SP and XZR
- for (size_t i = 0; i < 32; ++i) {
+ // The long jump routine called below expects to find the value for SP at index 31.
+ DCHECK_EQ(SP, 31);
+
+ for (size_t i = 0; i < kNumberOfCoreRegisters; ++i) {
gprs[i] = gprs_[i] != nullptr ? *gprs_[i] : Arm64Context::kBadGprBase + i;
}
for (size_t i = 0; i < kNumberOfDRegisters; ++i) {