diff options
| author | Ryan Houdek <Sonicadvance1@gmail.com> | 2015-08-26 01:21:43 -0500 |
|---|---|---|
| committer | Ryan Houdek <Sonicadvance1@gmail.com> | 2015-08-26 01:21:43 -0500 |
| commit | 4f5f29a0fb4777c5e806c6387a25366ea2f0838d (patch) | |
| tree | a7be8586d0291f70c4c949cdcfe8c71ea2bbee27 /Source/Core | |
| parent | 6015e2d812db80557810aaa39ce473bb1af21056 (diff) | |
[AArch64] Fix a bug in the register cache.
If the register was only a lower pair and it needed the full register, then we need to load the high 64bits.
Which we weren't doing before.
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp index 383e31df41..a2e16ef88a 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp @@ -281,8 +281,23 @@ ARM64Reg Arm64FPRCache::R(u32 preg, bool only_lower) switch (reg.GetType()) { case REG_REG: // already in a reg + return reg.GetReg(); + break; case REG_LOWER_PAIR: + { + if (!only_lower) + { + // Load the high 64bits from the file and insert them in to the high 64bits of the host register + ARM64Reg tmp_reg = GetReg(); + m_float_emit->LDR(64, INDEX_UNSIGNED, tmp_reg, X29, PPCSTATE_OFF(ps[preg][1])); + m_float_emit->INS(64, reg.GetReg(), 1, tmp_reg, 0); + UnlockRegister(tmp_reg); + + // Change it over to a full 128bit register + reg.LoadToReg(reg.GetReg()); + } return reg.GetReg(); + } break; case REG_NOTLOADED: // Register isn't loaded at /all/ { |
