OpCode32MemMult.cs 1.4 KB

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