Ryujinx/ARMeilleure/Decoders/OpCodeT16MemMult.cs

35 lines
1 KiB
C#
Raw Normal View History

2022-02-11 21:23:08 +00:00
using ARMeilleure.Instructions;
using System;
using System.Numerics;
namespace ARMeilleure.Decoders
{
class OpCodeT16MemMult : OpCodeT16, IOpCode32MemMult
{
public int Rn { get; }
public int RegisterMask { get; }
public int PostOffset { get; }
public bool IsLoad { get; }
public int Offset { get; }
2022-02-14 21:48:10 +00:00
2022-02-14 21:06:24 +00:00
public new static OpCode Create(InstDescriptor inst, ulong address, int opCode) => new OpCodeT16MemMult(inst, address, opCode);
2022-02-11 21:23:08 +00:00
2022-02-14 21:06:24 +00:00
public OpCodeT16MemMult(InstDescriptor inst, ulong address, int opCode) : base(inst, address, opCode)
2022-02-11 21:23:08 +00:00
{
RegisterMask = opCode & 0xff;
Rn = (opCode >> 8) & 7;
2022-02-15 00:02:36 +00:00
int regCount = BitOperations.PopCount((uint)RegisterMask);
2022-02-14 21:48:10 +00:00
Offset = 0;
PostOffset = 4 * regCount;
IsLoad = inst.Name switch
2022-02-11 21:23:08 +00:00
{
2022-02-14 21:48:10 +00:00
InstName.Ldm => true,
InstName.Stm => false,
_ => throw new InvalidOperationException()
};
2022-02-11 21:23:08 +00:00
}
}
2022-02-14 21:06:24 +00:00
}