From 808803d97a0c06809bf000687c252f960048fcf0 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sun, 7 Apr 2024 18:17:49 -0300 Subject: CPU: Fix PC alignment for ADR thumb instruction (#6613) * Fix PC alignment for ADR thumb instruction * PPTC version bump --- src/ARMeilleure/Instructions/InstEmitAlu32.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/ARMeilleure/Instructions') diff --git a/src/ARMeilleure/Instructions/InstEmitAlu32.cs b/src/ARMeilleure/Instructions/InstEmitAlu32.cs index 3a5e71bc..028ffbeb 100644 --- a/src/ARMeilleure/Instructions/InstEmitAlu32.cs +++ b/src/ARMeilleure/Instructions/InstEmitAlu32.cs @@ -19,6 +19,12 @@ namespace ARMeilleure.Instructions Operand n = GetAluN(context); Operand m = GetAluM(context, setCarry: false); + if (op.Rn == RegisterAlias.Aarch32Pc && op is OpCodeT32AluImm12) + { + // For ADR, PC is always 4 bytes aligned, even in Thumb mode. + n = context.BitwiseAnd(n, Const(~3u)); + } + Operand res = context.Add(n, m); if (ShouldSetFlags(context)) @@ -467,6 +473,12 @@ namespace ARMeilleure.Instructions Operand n = GetAluN(context); Operand m = GetAluM(context, setCarry: false); + if (op.Rn == RegisterAlias.Aarch32Pc && op is OpCodeT32AluImm12) + { + // For ADR, PC is always 4 bytes aligned, even in Thumb mode. + n = context.BitwiseAnd(n, Const(~3u)); + } + Operand res = context.Subtract(n, m); if (ShouldSetFlags(context)) -- cgit v1.2.3