AOpCodeSimdMemSs.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using ChocolArm64.Instruction;
  2. using ChocolArm64.State;
  3. namespace ChocolArm64.Decoder
  4. {
  5. class AOpCodeSimdMemSs : AOpCode, IAOpCodeSimd
  6. {
  7. public int Rt { get; private set; }
  8. public int Rn { get; private set; }
  9. public int Size { get; private set; }
  10. public int Rm { get; private set; }
  11. public int SElems { get; private set; }
  12. public int Index { get; private set; }
  13. public bool Replicate { get; private set; }
  14. public bool WBack { get; private set; }
  15. public AOpCodeSimdMemSs(AInst Inst, long Position, int OpCode) : base(Inst, Position, OpCode)
  16. {
  17. int Size = (OpCode >> 10) & 3;
  18. int S = (OpCode >> 12) & 1;
  19. int SElems = (OpCode >> 12) & 2;
  20. int Scale = (OpCode >> 14) & 3;
  21. int L = (OpCode >> 22) & 1;
  22. int Q = (OpCode >> 30) & 1;
  23. SElems |= (OpCode >> 21) & 1;
  24. SElems++;
  25. int Index = (Q << 3) | (S << 2) | Size;
  26. switch (Scale)
  27. {
  28. case 0: Index >>= 0; break;
  29. case 1:
  30. {
  31. if ((Index & 1) != 0)
  32. {
  33. Inst = AInst.Undefined;
  34. return;
  35. }
  36. Index >>= 1;
  37. break;
  38. }
  39. case 2:
  40. {
  41. if ((Index & 2) != 0 ||
  42. ((Index & 1) != 0 && S != 0))
  43. {
  44. Inst = AInst.Undefined;
  45. return;
  46. }
  47. if ((Index & 1) != 0)
  48. {
  49. Index >>= 3;
  50. }
  51. else
  52. {
  53. Index >>= 2;
  54. Scale = 3;
  55. }
  56. break;
  57. }
  58. case 3:
  59. {
  60. if (L == 0 || S != 0)
  61. {
  62. Inst = AInst.Undefined;
  63. return;
  64. }
  65. Scale = Size;
  66. Replicate = true;
  67. break;
  68. }
  69. }
  70. this.SElems = SElems;
  71. this.Size = Scale;
  72. Rt = (OpCode >> 0) & 0x1f;
  73. Rn = (OpCode >> 5) & 0x1f;
  74. Rm = (OpCode >> 16) & 0x1f;
  75. WBack = ((OpCode >> 23) & 0x1) != 0;
  76. RegisterSize = Q != 0
  77. ? ARegisterSize.SIMD128
  78. : ARegisterSize.SIMD64;
  79. }
  80. }
  81. }