OpCodeT16MemMult.cs 1.0 KB

12345678910111213141516171819202122232425262728293031323334
  1. using ARMeilleure.Instructions;
  2. using System;
  3. using System.Numerics;
  4. namespace ARMeilleure.Decoders
  5. {
  6. class OpCodeT16MemMult : OpCodeT16, IOpCode32MemMult
  7. {
  8. public int Rn { get; }
  9. public int RegisterMask { get; }
  10. public int PostOffset { get; }
  11. public bool IsLoad { get; }
  12. public int Offset { get; }
  13. public new static OpCode Create(InstDescriptor inst, ulong address, int opCode) => new OpCodeT16MemMult(inst, address, opCode);
  14. public OpCodeT16MemMult(InstDescriptor inst, ulong address, int opCode) : base(inst, address, opCode)
  15. {
  16. RegisterMask = opCode & 0xff;
  17. Rn = (opCode >> 8) & 7;
  18. int regCount = BitOperations.PopCount((uint)RegisterMask);
  19. Offset = 0;
  20. PostOffset = 4 * regCount;
  21. IsLoad = inst.Name switch
  22. {
  23. InstName.Ldm => true,
  24. InstName.Stm => false,
  25. _ => throw new InvalidOperationException()
  26. };
  27. }
  28. }
  29. }