Fix valgrind error.
Also introduce kLastCpuRegister to define kFakeReturnRegister.
Change-Id: I58cef6186c0452d45b5d2dcba9298cbe07f3552d
diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc
index e60f8a5..8cc0678 100644
--- a/compiler/optimizing/code_generator_x86_64.cc
+++ b/compiler/optimizing/code_generator_x86_64.cc
@@ -45,9 +45,7 @@
static constexpr FloatRegister kRuntimeParameterFpuRegisters[] = { XMM0, XMM1 };
static constexpr size_t kRuntimeParameterFpuRegistersLength =
arraysize(kRuntimeParameterFpuRegisters);
-static constexpr Register kFakeReturnRegister = Register(16);
-static constexpr Register kCoreCalleeSaves[] =
- { RBX, RBP, R12, R13, R14, R15, kFakeReturnRegister };
+static constexpr Register kCoreCalleeSaves[] = { RBX, RBP, R12, R13, R14, R15 };
static constexpr FloatRegister kFpuCalleeSaves[] = { XMM12, XMM13, XMM14, XMM15 };
static constexpr int kC2ConditionMask = 0x400;
@@ -412,13 +410,16 @@
}
static constexpr int kNumberOfCpuRegisterPairs = 0;
+// Use a fake return address register to mimic Quick.
+static constexpr Register kFakeReturnRegister = Register(kLastCpuRegister + 1);
CodeGeneratorX86_64::CodeGeneratorX86_64(HGraph* graph, const CompilerOptions& compiler_options)
: CodeGenerator(graph,
kNumberOfCpuRegisters,
kNumberOfFloatRegisters,
kNumberOfCpuRegisterPairs,
ComputeCalleeSaveMask(reinterpret_cast<const int*>(kCoreCalleeSaves),
- arraysize(kCoreCalleeSaves)),
+ arraysize(kCoreCalleeSaves))
+ | (1 << kFakeReturnRegister),
ComputeCalleeSaveMask(reinterpret_cast<const int*>(kFpuCalleeSaves),
arraysize(kFpuCalleeSaves)),
compiler_options),
@@ -426,7 +427,6 @@
location_builder_(graph, this),
instruction_visitor_(graph, this),
move_resolver_(graph->GetArena(), this) {
- // Use a fake return address register to mimic Quick.
AddAllocatedRegister(Location::RegisterLocation(kFakeReturnRegister));
}
@@ -492,7 +492,7 @@
for (int i = arraysize(kCoreCalleeSaves) - 1; i >= 0; --i) {
Register reg = kCoreCalleeSaves[i];
- if (allocated_registers_.ContainsCoreRegister(reg) && reg != kFakeReturnRegister) {
+ if (allocated_registers_.ContainsCoreRegister(reg)) {
__ pushq(CpuRegister(reg));
}
}
@@ -525,7 +525,7 @@
for (size_t i = 0; i < arraysize(kCoreCalleeSaves); ++i) {
Register reg = kCoreCalleeSaves[i];
- if (allocated_registers_.ContainsCoreRegister(reg) && reg != kFakeReturnRegister) {
+ if (allocated_registers_.ContainsCoreRegister(reg)) {
__ popq(CpuRegister(reg));
}
}
diff --git a/runtime/arch/x86_64/registers_x86_64.h b/runtime/arch/x86_64/registers_x86_64.h
index 8b0dc07..dda1d5f 100644
--- a/runtime/arch/x86_64/registers_x86_64.h
+++ b/runtime/arch/x86_64/registers_x86_64.h
@@ -43,6 +43,7 @@
R13 = 13,
R14 = 14,
R15 = 15,
+ kLastCpuRegister = 15,
kNumberOfCpuRegisters = 16,
kNoRegister = -1 // Signals an illegal register.
};