Register.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using System;
  2. using System.Reflection;
  3. namespace ChocolArm64.State
  4. {
  5. struct Register
  6. {
  7. public int Index;
  8. public RegisterType Type;
  9. public Register(int index, RegisterType type)
  10. {
  11. Index = index;
  12. Type = type;
  13. }
  14. public override int GetHashCode()
  15. {
  16. return (ushort)Index | ((ushort)Type << 16);
  17. }
  18. public override bool Equals(object obj)
  19. {
  20. return obj is Register reg &&
  21. reg.Index == Index &&
  22. reg.Type == Type;
  23. }
  24. public FieldInfo GetField()
  25. {
  26. switch (Type)
  27. {
  28. case RegisterType.Flag: return GetFieldFlag();
  29. case RegisterType.Int: return GetFieldInt();
  30. case RegisterType.Vector: return GetFieldVector();
  31. }
  32. throw new InvalidOperationException();
  33. }
  34. private FieldInfo GetFieldFlag()
  35. {
  36. switch ((PState)Index)
  37. {
  38. case PState.TBit: return GetField(nameof(CpuThreadState.Thumb));
  39. case PState.EBit: return GetField(nameof(CpuThreadState.BigEndian));
  40. case PState.VBit: return GetField(nameof(CpuThreadState.Overflow));
  41. case PState.CBit: return GetField(nameof(CpuThreadState.Carry));
  42. case PState.ZBit: return GetField(nameof(CpuThreadState.Zero));
  43. case PState.NBit: return GetField(nameof(CpuThreadState.Negative));
  44. }
  45. throw new InvalidOperationException();
  46. }
  47. private FieldInfo GetFieldInt()
  48. {
  49. switch (Index)
  50. {
  51. case 0: return GetField(nameof(CpuThreadState.X0));
  52. case 1: return GetField(nameof(CpuThreadState.X1));
  53. case 2: return GetField(nameof(CpuThreadState.X2));
  54. case 3: return GetField(nameof(CpuThreadState.X3));
  55. case 4: return GetField(nameof(CpuThreadState.X4));
  56. case 5: return GetField(nameof(CpuThreadState.X5));
  57. case 6: return GetField(nameof(CpuThreadState.X6));
  58. case 7: return GetField(nameof(CpuThreadState.X7));
  59. case 8: return GetField(nameof(CpuThreadState.X8));
  60. case 9: return GetField(nameof(CpuThreadState.X9));
  61. case 10: return GetField(nameof(CpuThreadState.X10));
  62. case 11: return GetField(nameof(CpuThreadState.X11));
  63. case 12: return GetField(nameof(CpuThreadState.X12));
  64. case 13: return GetField(nameof(CpuThreadState.X13));
  65. case 14: return GetField(nameof(CpuThreadState.X14));
  66. case 15: return GetField(nameof(CpuThreadState.X15));
  67. case 16: return GetField(nameof(CpuThreadState.X16));
  68. case 17: return GetField(nameof(CpuThreadState.X17));
  69. case 18: return GetField(nameof(CpuThreadState.X18));
  70. case 19: return GetField(nameof(CpuThreadState.X19));
  71. case 20: return GetField(nameof(CpuThreadState.X20));
  72. case 21: return GetField(nameof(CpuThreadState.X21));
  73. case 22: return GetField(nameof(CpuThreadState.X22));
  74. case 23: return GetField(nameof(CpuThreadState.X23));
  75. case 24: return GetField(nameof(CpuThreadState.X24));
  76. case 25: return GetField(nameof(CpuThreadState.X25));
  77. case 26: return GetField(nameof(CpuThreadState.X26));
  78. case 27: return GetField(nameof(CpuThreadState.X27));
  79. case 28: return GetField(nameof(CpuThreadState.X28));
  80. case 29: return GetField(nameof(CpuThreadState.X29));
  81. case 30: return GetField(nameof(CpuThreadState.X30));
  82. case 31: return GetField(nameof(CpuThreadState.X31));
  83. }
  84. throw new InvalidOperationException();
  85. }
  86. private FieldInfo GetFieldVector()
  87. {
  88. switch (Index)
  89. {
  90. case 0: return GetField(nameof(CpuThreadState.V0));
  91. case 1: return GetField(nameof(CpuThreadState.V1));
  92. case 2: return GetField(nameof(CpuThreadState.V2));
  93. case 3: return GetField(nameof(CpuThreadState.V3));
  94. case 4: return GetField(nameof(CpuThreadState.V4));
  95. case 5: return GetField(nameof(CpuThreadState.V5));
  96. case 6: return GetField(nameof(CpuThreadState.V6));
  97. case 7: return GetField(nameof(CpuThreadState.V7));
  98. case 8: return GetField(nameof(CpuThreadState.V8));
  99. case 9: return GetField(nameof(CpuThreadState.V9));
  100. case 10: return GetField(nameof(CpuThreadState.V10));
  101. case 11: return GetField(nameof(CpuThreadState.V11));
  102. case 12: return GetField(nameof(CpuThreadState.V12));
  103. case 13: return GetField(nameof(CpuThreadState.V13));
  104. case 14: return GetField(nameof(CpuThreadState.V14));
  105. case 15: return GetField(nameof(CpuThreadState.V15));
  106. case 16: return GetField(nameof(CpuThreadState.V16));
  107. case 17: return GetField(nameof(CpuThreadState.V17));
  108. case 18: return GetField(nameof(CpuThreadState.V18));
  109. case 19: return GetField(nameof(CpuThreadState.V19));
  110. case 20: return GetField(nameof(CpuThreadState.V20));
  111. case 21: return GetField(nameof(CpuThreadState.V21));
  112. case 22: return GetField(nameof(CpuThreadState.V22));
  113. case 23: return GetField(nameof(CpuThreadState.V23));
  114. case 24: return GetField(nameof(CpuThreadState.V24));
  115. case 25: return GetField(nameof(CpuThreadState.V25));
  116. case 26: return GetField(nameof(CpuThreadState.V26));
  117. case 27: return GetField(nameof(CpuThreadState.V27));
  118. case 28: return GetField(nameof(CpuThreadState.V28));
  119. case 29: return GetField(nameof(CpuThreadState.V29));
  120. case 30: return GetField(nameof(CpuThreadState.V30));
  121. case 31: return GetField(nameof(CpuThreadState.V31));
  122. }
  123. throw new InvalidOperationException();
  124. }
  125. private FieldInfo GetField(string name)
  126. {
  127. return typeof(CpuThreadState).GetField(name);
  128. }
  129. }
  130. }