summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorSintendo <3380580+Sintendo@users.noreply.github.com>2024-12-28 20:18:09 +0100
committerSintendo <3380580+Sintendo@users.noreply.github.com>2024-12-28 20:18:14 +0100
commitfa13457abbf4bf194b4c5b8b0d5ff86fc2862ae7 (patch)
tree36e741935d65ba180e92bead1077c21f12d88668 /Source/Core
parent18dd3f69f15f8659f74a7b69627db924b9d169df (diff)
JitArm64_Integer: subfex - Optimize InHostCarry case for -1
The result is either -1 or 0 depending on the state of the carry flag. This can be done with a csetm instruction. Before: 0x1280001a mov w26, #-0x1 ; =-1 0x1a1f035a adc w26, w26, wzr After: 0x5a9f23fa csetm w26, lo
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
index 3b6aef8788..ed59599cff 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
@@ -1244,8 +1244,18 @@ void JitArm64::subfex(UGeckoInstruction inst)
{
gpr.BindToRegister(d, false);
ARM64Reg RD = gpr.R(d);
- MOVI2R(RD, imm);
- ADC(RD, RD, ARM64Reg::WZR);
+ if (is_all_ones)
+ {
+ // RD = -1 + carry = carry ? 0 : -1
+ // CSETM sets the destination to -1 if the condition is true, 0
+ // otherwise. Hence, the condition must be carry clear.
+ CSETM(RD, CC_CC);
+ }
+ else
+ {
+ MOVI2R(RD, imm);
+ ADC(RD, RD, ARM64Reg::WZR);
+ }
break;
}
case CarryFlag::ConstantTrue: