From d78009877bc61073cff8386abc9d0d7a2253145f Mon Sep 17 00:00:00 2001 From: Markus Wick Date: Fri, 11 Aug 2017 23:41:15 +0200 Subject: [PATCH] JitArm64: Fix LSL/LSR/ROR/ASR wrappers. The other method has a latency of 2 cycles. This also improves the throughput a lot. --- Source/Core/Common/Arm64Emitter.cpp | 11 +++++++---- Source/Core/Common/Arm64Emitter.h | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Source/Core/Common/Arm64Emitter.cpp b/Source/Core/Common/Arm64Emitter.cpp index f719d9aef6..91ad58d9f0 100644 --- a/Source/Core/Common/Arm64Emitter.cpp +++ b/Source/Core/Common/Arm64Emitter.cpp @@ -1542,19 +1542,22 @@ void ARM64XEmitter::MVN(ARM64Reg Rd, ARM64Reg Rm) } void ARM64XEmitter::LSL(ARM64Reg Rd, ARM64Reg Rm, int shift) { - ORR(Rd, Is64Bit(Rd) ? ZR : WZR, Rm, ArithOption(Rm, ST_LSL, shift)); + int bits = Is64Bit(Rd) ? 64 : 32; + UBFM(Rd, Rm, (bits - shift) & (bits - 1), bits - shift - 1); } void ARM64XEmitter::LSR(ARM64Reg Rd, ARM64Reg Rm, int shift) { - ORR(Rd, Is64Bit(Rd) ? ZR : WZR, Rm, ArithOption(Rm, ST_LSR, shift)); + int bits = Is64Bit(Rd) ? 64 : 32; + UBFM(Rd, Rm, shift, bits - 1); } void ARM64XEmitter::ASR(ARM64Reg Rd, ARM64Reg Rm, int shift) { - ORR(Rd, Is64Bit(Rd) ? ZR : WZR, Rm, ArithOption(Rm, ST_ASR, shift)); + int bits = Is64Bit(Rd) ? 64 : 32; + SBFM(Rd, Rm, shift, bits - 1); } void ARM64XEmitter::ROR(ARM64Reg Rd, ARM64Reg Rm, int shift) { - ORR(Rd, Is64Bit(Rd) ? ZR : WZR, Rm, ArithOption(Rm, ST_ROR, shift)); + EXTR(Rd, Rm, Rm, shift); } // Logical (immediate) diff --git a/Source/Core/Common/Arm64Emitter.h b/Source/Core/Common/Arm64Emitter.h index fa77737161..4b5bc9f137 100644 --- a/Source/Core/Common/Arm64Emitter.h +++ b/Source/Core/Common/Arm64Emitter.h @@ -721,7 +721,7 @@ public: void MOV(ARM64Reg Rd, ARM64Reg Rm); void MVN(ARM64Reg Rd, ARM64Reg Rm); - // TODO: These are "slow" as they use arith+shift, should be replaced with UBFM/EXTR variants. + // Convenience wrappers around UBFM/EXTR. void LSR(ARM64Reg Rd, ARM64Reg Rm, int shift); void LSL(ARM64Reg Rd, ARM64Reg Rm, int shift); void ASR(ARM64Reg Rd, ARM64Reg Rm, int shift);