From ce32b76be341601336d1cb3856d2173ec1457938 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 22 Aug 2015 00:35:30 -0500 Subject: [PATCH] [AArch64] Implement frspx Improves performance in povray bench by 2% --- Source/Core/Core/PowerPC/JitArm64/Jit.h | 1 + .../PowerPC/JitArm64/JitArm64_FloatingPoint.cpp | 16 ++++++++++++++++ .../Core/PowerPC/JitArm64/JitArm64_Tables.cpp | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.h b/Source/Core/Core/PowerPC/JitArm64/Jit.h index 3a6ad6b842..3d31c202de 100644 --- a/Source/Core/Core/PowerPC/JitArm64/Jit.h +++ b/Source/Core/Core/PowerPC/JitArm64/Jit.h @@ -145,6 +145,7 @@ public: void fsubsx(UGeckoInstruction inst); void fsubx(UGeckoInstruction inst); void fcmpx(UGeckoInstruction inst); + void frspx(UGeckoInstruction inst); // Paired void ps_abs(UGeckoInstruction inst); diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp index 287057fad4..690adcc983 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp @@ -458,6 +458,22 @@ void JitArm64::fsubx(UGeckoInstruction inst) } } +void JitArm64::frspx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff); + + u32 b = inst.FB, d = inst.FD; + fpr.BindToRegister(d, d == b, false); + + ARM64Reg VB = fpr.R(b); + ARM64Reg VD = fpr.R(d, false); + + m_float_emit.FCVTN(32, EncodeRegToDouble(VD), EncodeRegToDouble(VB)); + m_float_emit.FCVTL(64, EncodeRegToDouble(VD), EncodeRegToDouble(VD)); + m_float_emit.INS(64, VD, 1, VD, 0); +} + void JitArm64::fcmpx(UGeckoInstruction inst) { INSTRUCTION_START diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp index 048bad5eaf..34fd5b2ed9 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp @@ -334,7 +334,7 @@ static GekkoOPTemplate table63[] = {72, &JitArm64::fmrx}, // fmrx {136, &JitArm64::fnabsx}, // fnabsx {40, &JitArm64::fnegx}, // fnegx - {12, &JitArm64::FallBackToInterpreter}, // frspx + {12, &JitArm64::frspx}, // frspx {64, &JitArm64::FallBackToInterpreter}, // mcrfs {583, &JitArm64::FallBackToInterpreter}, // mffsx