OpCode32MemMult.cs 1.3 KB

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