From 387ebf3ddd1825dbfc1ccf57282deae0e2fef8c1 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 17 Oct 2015 01:20:04 -0700 Subject: [PATCH] arm64: Only clobber HI and LO together. We can't clobber LO if HI is still needed. Fixes a crash in Trails in the Sky on new game (due to a mfhi getting the wrong result.) --- Core/MIPS/ARM64/Arm64RegCache.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Core/MIPS/ARM64/Arm64RegCache.cpp b/Core/MIPS/ARM64/Arm64RegCache.cpp index 9be8678872..51c9f94f97 100644 --- a/Core/MIPS/ARM64/Arm64RegCache.cpp +++ b/Core/MIPS/ARM64/Arm64RegCache.cpp @@ -236,8 +236,15 @@ ARM64Reg Arm64RegCache::FindBestToSpill(bool unusedOnly, bool *clobbered) { // Awesome, a clobbered reg. Let's use it. if (MIPSAnalyst::IsRegisterClobbered(ar[reg].mipsReg, compilerPC_, UNUSED_LOOKAHEAD_OPS)) { - *clobbered = true; - return reg; + bool canClobber = true; + // HI is stored inside the LO reg. They both have to clobber at the same time. + if (ar[reg].mipsReg == MIPS_REG_LO) { + canClobber = MIPSAnalyst::IsRegisterClobbered(MIPS_REG_HI, compilerPC_, UNUSED_LOOKAHEAD_OPS); + } + if (canClobber) { + *clobbered = true; + return reg; + } } // Not awesome. A used reg. Let's try to avoid spilling.