From 34290d38e28c93b86572b05faa648f2acb95410e Mon Sep 17 00:00:00 2001 From: merry Date: Fri, 11 Feb 2022 21:04:28 +0000 Subject: [PATCH] T16: Implement PUSH, POP --- ARMeilleure/Decoders/IOpCode32MemMult.cs | 2 + ARMeilleure/Decoders/OpCodeT16MemStack.cs | 41 ++++++++++++++++++++ ARMeilleure/Decoders/OpCodeTable.cs | 4 +- ARMeilleure/Instructions/InstEmitMemory32.cs | 4 +- ARMeilleure/Instructions/InstName.cs | 2 + 5 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 ARMeilleure/Decoders/OpCodeT16MemStack.cs diff --git a/ARMeilleure/Decoders/IOpCode32MemMult.cs b/ARMeilleure/Decoders/IOpCode32MemMult.cs index 18fd3f6bf..4b891bc1b 100644 --- a/ARMeilleure/Decoders/IOpCode32MemMult.cs +++ b/ARMeilleure/Decoders/IOpCode32MemMult.cs @@ -9,5 +9,7 @@ namespace ARMeilleure.Decoders int PostOffset { get; } bool IsLoad { get; } + + int Offset { get; } } } \ No newline at end of file diff --git a/ARMeilleure/Decoders/OpCodeT16MemStack.cs b/ARMeilleure/Decoders/OpCodeT16MemStack.cs new file mode 100644 index 000000000..1b5c4125c --- /dev/null +++ b/ARMeilleure/Decoders/OpCodeT16MemStack.cs @@ -0,0 +1,41 @@ +using ARMeilleure.Instructions; +using System; +using System.Numerics; + +namespace ARMeilleure.Decoders +{ + class OpCodeT16MemStack : OpCodeT16, IOpCode32MemMult + { + public int Rn => 13; + public int RegisterMask { get; } + public int PostOffset { get; } + public bool IsLoad { get; } + public int Offset { get; } + + public new static OpCode Create(InstDescriptor inst, ulong address, int opCode, bool inITBlock) => new OpCodeT16MemStack(inst, address, opCode, inITBlock); + + public OpCodeT16MemStack(InstDescriptor inst, ulong address, int opCode, bool inITBlock) : base(inst, address, opCode, inITBlock) + { + int extra = (opCode >> 8) & 1; + int regCount = BitOperations.PopCount((uint)opCode & 0x1ff); + + switch (inst.Name) + { + case InstName.Push: + RegisterMask = (opCode & 0xff) | (extra << 14); + IsLoad = false; + Offset = -4 * regCount; + PostOffset = -4 * regCount; + break; + case InstName.Pop: + RegisterMask = (opCode & 0xff) | (extra << 15); + IsLoad = true; + Offset = 0; + PostOffset = 4 * regCount; + break; + default: + throw new InvalidOperationException(); + } + } + } +} \ No newline at end of file diff --git a/ARMeilleure/Decoders/OpCodeTable.cs b/ARMeilleure/Decoders/OpCodeTable.cs index 98dc869d4..731787238 100644 --- a/ARMeilleure/Decoders/OpCodeTable.cs +++ b/ARMeilleure/Decoders/OpCodeTable.cs @@ -1030,8 +1030,10 @@ namespace ARMeilleure.Decoders SetT16("1011001010xxxxxx", InstName.Uxth, InstEmit32.Uxth, OpCodeT16AluUx.Create); SetT16("1011001011xxxxxx", InstName.Uxtb, InstEmit32.Uxtb, OpCodeT16AluUx.Create); SetT16("101100x1xxxxxxxx", InstName.Cbz, InstEmit32.Cbz, OpCodeT16BImmCmp.Create); + SetT16("1011010xxxxxxxxx", InstName.Push, InstEmit32.Stm, OpCodeT16MemStack.Create); SetT16("101110x1xxxxxxxx", InstName.Cbnz, InstEmit32.Cbnz, OpCodeT16BImmCmp.Create); -#endregion + SetT16("1011110xxxxxxxxx", InstName.Pop, InstEmit32.Ldm, OpCodeT16MemStack.Create); + #endregion FillFastLookupTable(InstA32FastLookup, AllInstA32, ToFastLookupIndexA); FillFastLookupTable(InstT32FastLookup, AllInstT32, ToFastLookupIndexT); diff --git a/ARMeilleure/Instructions/InstEmitMemory32.cs b/ARMeilleure/Instructions/InstEmitMemory32.cs index 1405070a2..e15f6a5b1 100644 --- a/ARMeilleure/Instructions/InstEmitMemory32.cs +++ b/ARMeilleure/Instructions/InstEmitMemory32.cs @@ -32,7 +32,7 @@ namespace ARMeilleure.Instructions public static void Ldm(ArmEmitterContext context) { - OpCode32MemMult op = (OpCode32MemMult)context.CurrOp; + IOpCode32MemMult op = (IOpCode32MemMult)context.CurrOp; Operand n = GetIntA32(context, op.Rn); @@ -95,7 +95,7 @@ namespace ARMeilleure.Instructions public static void Stm(ArmEmitterContext context) { - OpCode32MemMult op = (OpCode32MemMult)context.CurrOp; + IOpCode32MemMult op = (IOpCode32MemMult)context.CurrOp; Operand n = context.Copy(GetIntA32(context, op.Rn)); diff --git a/ARMeilleure/Instructions/InstName.cs b/ARMeilleure/Instructions/InstName.cs index 3e0164958..224d5222e 100644 --- a/ARMeilleure/Instructions/InstName.cs +++ b/ARMeilleure/Instructions/InstName.cs @@ -512,6 +512,8 @@ namespace ARMeilleure.Instructions Mvn, Pkh, Pld, + Pop, + Push, Rev, Revsh, Rsb,