summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorMarkus Wick <degasus@users.noreply.github.com>2021-07-08 13:43:09 +0200
committerGitHub <noreply@github.com>2021-07-08 13:43:09 +0200
commitf67f0488d2cd3e0339970a41d88a0df14683e495 (patch)
tree550edc4d4fdb63eda706adefc9acaf408b18c979 /Source/Core
parent9df6f6583413ec951b6d29d1314284a964109461 (diff)
parent36798b18e8defed48e2625f011df6c66ee2abaaf (diff)
Merge pull request #9844 from JosJuice/jitarm64-fctiwzx-constant
JitArm64: Improve fctiwzx constant generation in double case
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp20
1 files changed, 11 insertions, 9 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp
index 59ca5325e9..a3411c642e 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp
@@ -479,27 +479,29 @@ void JitArm64::fctiwzx(UGeckoInstruction inst)
const ARM64Reg VB = fpr.R(b, single ? RegType::LowerPairSingle : RegType::LowerPair);
const ARM64Reg VD = fpr.RW(d, RegType::LowerPair);
- const ARM64Reg V0 = fpr.GetReg();
-
- // Generate 0xFFF8000000000000ULL
- m_float_emit.MOVI(64, EncodeRegToDouble(V0), 0xFFFF000000000000ULL);
- m_float_emit.BIC(16, EncodeRegToDouble(V0), 0x7);
-
if (single)
{
+ const ARM64Reg V0 = fpr.GetReg();
+
+ // Generate 0xFFF8'0000'0000'0000ULL
+ m_float_emit.MOVI(64, EncodeRegToDouble(V0), 0xFFFF'0000'0000'0000ULL);
+ m_float_emit.BIC(16, EncodeRegToDouble(V0), 0x7);
+
m_float_emit.FCVTS(EncodeRegToSingle(VD), EncodeRegToSingle(VB), RoundingMode::Z);
+ m_float_emit.ORR(EncodeRegToDouble(VD), EncodeRegToDouble(VD), EncodeRegToDouble(V0));
+
+ fpr.Unlock(V0);
}
else
{
const ARM64Reg WA = gpr.GetReg();
m_float_emit.FCVTS(WA, EncodeRegToDouble(VB), RoundingMode::Z);
- m_float_emit.FMOV(EncodeRegToSingle(VD), WA);
+ ORRI2R(EncodeRegTo64(WA), EncodeRegTo64(WA), 0xFFF8'0000'0000'0000ULL);
+ m_float_emit.FMOV(EncodeRegToDouble(VD), EncodeRegTo64(WA));
gpr.Unlock(WA);
}
- m_float_emit.ORR(EncodeRegToDouble(VD), EncodeRegToDouble(VD), EncodeRegToDouble(V0));
- fpr.Unlock(V0);
ASSERT_MSG(DYNA_REC, b == d || single == fpr.IsSingle(b, true),
"Register allocation turned singles into doubles in the middle of fctiwzx");