OpCodeT32MemMult.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using System.Numerics;
  2. namespace ARMeilleure.Decoders
  3. {
  4. class OpCodeT32MemMult : OpCodeT32, IOpCode32MemMult
  5. {
  6. public int Rn { get; }
  7. public int RegisterMask { get; }
  8. public int Offset { get; }
  9. public int PostOffset { get; }
  10. public bool IsLoad { get; }
  11. public new static OpCode Create(InstDescriptor inst, ulong address, int opCode) => new OpCodeT32MemMult(inst, address, opCode);
  12. public OpCodeT32MemMult(InstDescriptor inst, ulong address, int opCode) : base(inst, address, opCode)
  13. {
  14. Rn = (opCode >> 16) & 0xf;
  15. bool isLoad = (opCode & (1 << 20)) != 0;
  16. bool w = (opCode & (1 << 21)) != 0;
  17. bool u = (opCode & (1 << 23)) != 0;
  18. bool p = (opCode & (1 << 24)) != 0;
  19. RegisterMask = opCode & 0xffff;
  20. int regsSize = BitOperations.PopCount((uint)RegisterMask) * 4;
  21. if (!u)
  22. {
  23. Offset -= regsSize;
  24. }
  25. if (u == p)
  26. {
  27. Offset += 4;
  28. }
  29. if (w)
  30. {
  31. PostOffset = u ? regsSize : -regsSize;
  32. }
  33. else
  34. {
  35. PostOffset = 0;
  36. }
  37. IsLoad = isLoad;
  38. }
  39. }
  40. }