From 31d751b6daafd3a73f9c9194d9cbc5cf1f7342af Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 11 Oct 2023 18:48:47 +0200 Subject: [PATCH] JitArm64: Read X1 in frsqrte normal path Instead of combining X2 (the exponent) and X3 (the mantissa) using an ORR instruction, we can read X1, which already contains both. This requires us to reconstruct X1 in the denormal path, but that's an acceptable price. --- Source/Core/Core/PowerPC/JitArm64/JitAsm.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitAsm.cpp b/Source/Core/Core/PowerPC/JitArm64/JitAsm.cpp index 77d64de300..f424281afd 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitAsm.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitAsm.cpp @@ -337,13 +337,12 @@ void JitArm64::GenerateFrsqrte() LSLV(ARM64Reg::X4, ARM64Reg::X1, ARM64Reg::X4); SUB(ARM64Reg::X2, ARM64Reg::X2, ARM64Reg::X3, ArithOption(ARM64Reg::X3, ShiftType::LSL, 52)); AND(ARM64Reg::X3, ARM64Reg::X4, LogicalImm(Common::DOUBLE_FRAC - 1, 64)); + ORR(ARM64Reg::X1, ARM64Reg::X2, ARM64Reg::X3); SetJumpTarget(normal); - LSR(ARM64Reg::X2, ARM64Reg::X2, 48); - AND(ARM64Reg::X2, ARM64Reg::X2, LogicalImm(0x10, 64)); - MOVP2R(ARM64Reg::X1, &Common::frsqrte_expected); - ORR(ARM64Reg::X2, ARM64Reg::X2, ARM64Reg::X3, ArithOption(ARM64Reg::X3, ShiftType::LSR, 48)); - ADD(ARM64Reg::X2, ARM64Reg::X1, ARM64Reg::X2, ArithOption(ARM64Reg::X2, ShiftType::LSL, 3)); + UBFX(ARM64Reg::X2, ARM64Reg::X1, 48, 5); + MOVP2R(ARM64Reg::X4, &Common::frsqrte_expected); + ADD(ARM64Reg::X2, ARM64Reg::X4, ARM64Reg::X2, ArithOption(ARM64Reg::X2, ShiftType::LSL, 3)); LDP(IndexType::Signed, ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::X2, 0); UBFX(ARM64Reg::X3, ARM64Reg::X3, 37, 11); AND(ARM64Reg::X0, ARM64Reg::X0, LogicalImm(Common::DOUBLE_SIGN | Common::DOUBLE_EXP, 64));