Просмотр исходного кода

InstEmitMemory32: Literal loads always have word-aligned PC (#3104)

merry 4 лет назад
Родитель
Сommit
ce71f9144e
2 измененных файлов с 15 добавлено и 1 удалено
  1. 14 0
      ARMeilleure/Instructions/InstEmitHelper.cs
  2. 1 1
      ARMeilleure/Instructions/InstEmitMemory32.cs

+ 14 - 0
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)
         public static Operand GetVecA32(int regIndex)
         {
         {
             return Register(regIndex, RegisterType.Vector, OperandType.V128);
             return Register(regIndex, RegisterType.Vector, OperandType.V128);

+ 1 - 1
ARMeilleure/Instructions/InstEmitMemory32.cs

@@ -153,7 +153,7 @@ namespace ARMeilleure.Instructions
         {
         {
             OpCode32Mem op = (OpCode32Mem)context.CurrOp;
             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 m = GetMemM(context, setCarry: false);
 
 
             Operand temp = default;
             Operand temp = default;