summaryrefslogtreecommitdiff
path: root/compiler/optimizing/code_generator_mips.cc
diff options
context:
space:
mode:
authorAlexey Frunze <Alexey.Frunze@imgtec.com>2017-05-28 19:10:28 -0700
committerAlexey Frunze <Alexey.Frunze@imgtec.com>2017-05-28 20:17:39 -0700
commit6079dca3058e58bb9e12a60a10324a5218a99274 (patch)
tree19e3a8ccf7a8ac831c27658e0470c4f83debef74 /compiler/optimizing/code_generator_mips.cc
parent0a5ace58e973da278049f837bf2cdbaf7b44849c (diff)
MIPS32R2: Fix MethodLoadKind::kBootImageLinkTimePcRelative
This makes MIPS32 boot again. The issue was introduced in commit 6597946d29be9108e2cc51223553d3db9290a3d9: Static invokes in slow paths would sometimes get HMipsComputeBaseMethodAddress from the stack into the same register where the art method pointer would later be loaded (A0) with the former being overwritten in the process of loading the latter. Test: booted MIPS32R2 in QEMU Change-Id: Ib584cf66795574175650f42b191c797fb3b3965f
Diffstat (limited to 'compiler/optimizing/code_generator_mips.cc')
-rw-r--r--compiler/optimizing/code_generator_mips.cc5
1 files changed, 3 insertions, 2 deletions
diff --git a/compiler/optimizing/code_generator_mips.cc b/compiler/optimizing/code_generator_mips.cc
index d8ac99a9a6..1978534112 100644
--- a/compiler/optimizing/code_generator_mips.cc
+++ b/compiler/optimizing/code_generator_mips.cc
@@ -1674,6 +1674,7 @@ Literal* CodeGeneratorMIPS::DeduplicateBootImageAddressLiteral(uint32_t address)
void CodeGeneratorMIPS::EmitPcRelativeAddressPlaceholderHigh(PcRelativePatchInfo* info,
Register out,
Register base) {
+ DCHECK_NE(out, base);
if (GetInstructionSetFeatures().IsR6()) {
DCHECK_EQ(base, ZERO);
__ Bind(&info->high_label);
@@ -7139,8 +7140,8 @@ void CodeGeneratorMIPS::GenerateStaticOrDirectCall(HInvokeStaticOrDirect* invoke
PcRelativePatchInfo* info = NewPcRelativeMethodPatch(invoke->GetTargetMethod());
bool reordering = __ SetReorder(false);
Register temp_reg = temp.AsRegister<Register>();
- EmitPcRelativeAddressPlaceholderHigh(info, temp_reg, base_reg);
- __ Addiu(temp_reg, temp_reg, /* placeholder */ 0x5678);
+ EmitPcRelativeAddressPlaceholderHigh(info, TMP, base_reg);
+ __ Addiu(temp_reg, TMP, /* placeholder */ 0x5678);
__ SetReorder(reordering);
break;
}