Register.cs 6.5 KB

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