From 596b29017757aefd90b5c8fb39006f70ec060752 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sat, 16 Aug 2025 18:19:08 +0200 Subject: [PATCH 1/2] JitArm64: Add missing ORR pattern in MOVI2RImpl We should attempt to use not only mirrored versions of the immediate as an ORR base, but also the immediate itself. This lets us emit certain 64-bit constants using fewer instructions. --- Source/Core/Common/Arm64Emitter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/Common/Arm64Emitter.cpp b/Source/Core/Common/Arm64Emitter.cpp index 88d4109979d..cbc114da5f2 100644 --- a/Source/Core/Common/Arm64Emitter.cpp +++ b/Source/Core/Common/Arm64Emitter.cpp @@ -1908,7 +1908,7 @@ void ARM64XEmitter::MOVI2RImpl(ARM64Reg Rd, T imm) { if constexpr (sizeof(T) == 8) { - for (u64 orr_imm : {(imm << 32) | (imm & 0x0000'0000'FFFF'FFFF), + for (u64 orr_imm : {imm, (imm << 32) | (imm & 0x0000'0000'FFFF'FFFF), (imm & 0xFFFF'FFFF'0000'0000) | (imm >> 32), (imm << 48) | (imm & 0x0000'FFFF'FFFF'0000) | (imm >> 48)}) { From c553344282fb8ae43c8ead70a5bfe639dc0412d1 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sat, 16 Aug 2025 18:20:12 +0200 Subject: [PATCH 2/2] JitArm64: Add early exit in MOVI2RImpl ORR loop Just for performance. --- Source/Core/Common/Arm64Emitter.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/Core/Common/Arm64Emitter.cpp b/Source/Core/Common/Arm64Emitter.cpp index cbc114da5f2..3edf14d45e8 100644 --- a/Source/Core/Common/Arm64Emitter.cpp +++ b/Source/Core/Common/Arm64Emitter.cpp @@ -1913,7 +1913,12 @@ void ARM64XEmitter::MOVI2RImpl(ARM64Reg Rd, T imm) (imm << 48) | (imm & 0x0000'FFFF'FFFF'0000) | (imm >> 48)}) { if (LogicalImm(orr_imm, GPRSize::B64)) + { try_base(orr_imm, Approach::ORRBase, false); + + if (instructions_required(best_parts, best_approach) <= 1) + break; + } } } else