aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormerry <git@mary.rs>2022-02-11 20:51:03 +0000
committerGitHub <noreply@github.com>2022-02-11 17:51:03 -0300
commitce71f9144e1575c432bb009755f01466cd685fbf (patch)
tree3f8355b47553388367ec4f0d478e1a70d37fd493
parentf861f0bca2767f74478bc444a7a057d05cc96638 (diff)
InstEmitMemory32: Literal loads always have word-aligned PC (#3104)1.1.26
-rw-r--r--ARMeilleure/Instructions/InstEmitHelper.cs14
-rw-r--r--ARMeilleure/Instructions/InstEmitMemory32.cs2
2 files changed, 15 insertions, 1 deletions
diff --git a/ARMeilleure/Instructions/InstEmitHelper.cs b/ARMeilleure/Instructions/InstEmitHelper.cs
index 0479c380..d1b9de84 100644
--- a/ARMeilleure/Instructions/InstEmitHelper.cs
+++ b/ARMeilleure/Instructions/InstEmitHelper.cs
@@ -47,6 +47,20 @@ namespace ARMeilleure.Instructions
}
}
+ public static Operand GetIntA32AlignedPC(ArmEmitterContext context, int regIndex)
+ {
+ if (regIndex == RegisterAlias.Aarch32Pc)
+ {
+ OpCode32 op = (OpCode32)context.CurrOp;
+
+ return Const((int)(op.GetPc() & 0xfffffffc));
+ }
+ else
+ {
+ return Register(GetRegisterAlias(context.Mode, regIndex), RegisterType.Integer, OperandType.I32);
+ }
+ }
+
public static Operand GetVecA32(int regIndex)
{
return Register(regIndex, RegisterType.Vector, OperandType.V128);
diff --git a/ARMeilleure/Instructions/InstEmitMemory32.cs b/ARMeilleure/Instructions/InstEmitMemory32.cs
index 64189134..af9eaf1a 100644
--- a/ARMeilleure/Instructions/InstEmitMemory32.cs
+++ b/ARMeilleure/Instructions/InstEmitMemory32.cs
@@ -153,7 +153,7 @@ namespace ARMeilleure.Instructions
{
OpCode32Mem op = (OpCode32Mem)context.CurrOp;
- Operand n = context.Copy(GetIntA32(context, op.Rn));
+ Operand n = context.Copy(GetIntA32AlignedPC(context, op.Rn));
Operand m = GetMemM(context, setCarry: false);
Operand temp = default;