summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2023-08-23 22:41:03 +0200
committerJosJuice <josjuice@gmail.com>2025-11-16 09:50:30 +0100
commite8060bd169b6ef17f3a4e197f1b7296af328ecb5 (patch)
treea87b971366d544ead516b7f2cebb4bf1878b4eef /Source/Core
parent2dead5009b593bc17f23eabf62e717be0d7bd01d (diff)
JitArm64: Add function for setting constant overflow
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/Jit.h1
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp19
2 files changed, 20 insertions, 0 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.h b/Source/Core/Core/PowerPC/JitArm64/Jit.h
index 77ba6d0bb3..2d14d634df 100644
--- a/Source/Core/Core/PowerPC/JitArm64/Jit.h
+++ b/Source/Core/Core/PowerPC/JitArm64/Jit.h
@@ -376,6 +376,7 @@ protected:
void ComputeRC0(Arm64Gen::ARM64Reg reg);
void ComputeRC0(u32 imm);
+ void GenerateConstantOverflow(bool overflow);
void ComputeCarry(Arm64Gen::ARM64Reg reg); // reg must contain 0 or 1
void ComputeCarry(bool carry);
void ComputeCarry();
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
index 087a4cd907..fc12676043 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
@@ -39,6 +39,25 @@ void JitArm64::ComputeRC0(u32 imm)
MOVI2R(gpr.CR(0), s64(s32(imm)));
}
+void JitArm64::GenerateConstantOverflow(bool overflow)
+{
+ ARM64Reg WA = gpr.GetReg();
+
+ if (overflow)
+ {
+ MOVI2R(WA, XER_OV_MASK | XER_SO_MASK);
+ STRB(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(xer_so_ov));
+ }
+ else
+ {
+ LDRB(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(xer_so_ov));
+ AND(WA, WA, LogicalImm(~XER_OV_MASK, GPRSize::B32));
+ STRB(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(xer_so_ov));
+ }
+
+ gpr.Unlock(WA);
+}
+
void JitArm64::ComputeCarry(ARM64Reg reg)
{
js.carryFlag = CarryFlag::InPPCState;