AInstEmitSystem.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using ChocolArm64.Decoder;
  2. using ChocolArm64.State;
  3. using ChocolArm64.Translation;
  4. using System;
  5. using System.Reflection;
  6. using System.Reflection.Emit;
  7. namespace ChocolArm64.Instruction
  8. {
  9. static partial class AInstEmit
  10. {
  11. public static void Hint(AILEmitterCtx Context)
  12. {
  13. //Execute as no-op.
  14. }
  15. public static void Mrs(AILEmitterCtx Context)
  16. {
  17. AOpCodeSystem Op = (AOpCodeSystem)Context.CurrOp;
  18. Context.EmitLdarg(ATranslatedSub.StateArgIdx);
  19. string PropName;
  20. switch (GetPackedId(Op))
  21. {
  22. case 0b11_011_0000_0000_001: PropName = nameof(AThreadState.CtrEl0); break;
  23. case 0b11_011_0000_0000_111: PropName = nameof(AThreadState.DczidEl0); break;
  24. case 0b11_011_0100_0100_000: PropName = nameof(AThreadState.Fpcr); break;
  25. case 0b11_011_0100_0100_001: PropName = nameof(AThreadState.Fpsr); break;
  26. case 0b11_011_1101_0000_010: PropName = nameof(AThreadState.TpidrEl0); break;
  27. case 0b11_011_1101_0000_011: PropName = nameof(AThreadState.Tpidr); break;
  28. case 0b11_011_1110_0000_000: PropName = nameof(AThreadState.CntfrqEl0); break;
  29. case 0b11_011_1110_0000_001: PropName = nameof(AThreadState.CntpctEl0); break;
  30. default: throw new NotImplementedException($"Unknown MRS at {Op.Position:x16}");
  31. }
  32. Context.EmitCallPropGet(typeof(AThreadState), PropName);
  33. PropertyInfo PropInfo = typeof(AThreadState).GetProperty(PropName);
  34. if (PropInfo.PropertyType != typeof(long) &&
  35. PropInfo.PropertyType != typeof(ulong))
  36. {
  37. Context.Emit(OpCodes.Conv_U8);
  38. }
  39. Context.EmitStintzr(Op.Rt);
  40. }
  41. public static void Msr(AILEmitterCtx Context)
  42. {
  43. AOpCodeSystem Op = (AOpCodeSystem)Context.CurrOp;
  44. Context.EmitLdarg(ATranslatedSub.StateArgIdx);
  45. Context.EmitLdintzr(Op.Rt);
  46. string PropName;
  47. switch (GetPackedId(Op))
  48. {
  49. case 0b11_011_0100_0100_000: PropName = nameof(AThreadState.Fpcr); break;
  50. case 0b11_011_0100_0100_001: PropName = nameof(AThreadState.Fpsr); break;
  51. case 0b11_011_1101_0000_010: PropName = nameof(AThreadState.TpidrEl0); break;
  52. default: throw new NotImplementedException($"Unknown MSR at {Op.Position:x16}");
  53. }
  54. PropertyInfo PropInfo = typeof(AThreadState).GetProperty(PropName);
  55. if (PropInfo.PropertyType != typeof(long) &&
  56. PropInfo.PropertyType != typeof(ulong))
  57. {
  58. Context.Emit(OpCodes.Conv_U4);
  59. }
  60. Context.EmitCallPropSet(typeof(AThreadState), PropName);
  61. }
  62. public static void Nop(AILEmitterCtx Context)
  63. {
  64. //Do nothing.
  65. }
  66. public static void Sys(AILEmitterCtx Context)
  67. {
  68. //This instruction is used to do some operations on the CPU like cache invalidation,
  69. //address translation and the like.
  70. //We treat it as no-op here since we don't have any cache being emulated anyway.
  71. AOpCodeSystem Op = (AOpCodeSystem)Context.CurrOp;
  72. switch (GetPackedId(Op))
  73. {
  74. case 0b11_011_0111_0100_001:
  75. {
  76. //DC ZVA
  77. for (int Offs = 0; Offs < (4 << AThreadState.DczSizeLog2); Offs += 8)
  78. {
  79. Context.EmitLdarg(ATranslatedSub.MemoryArgIdx);
  80. Context.EmitLdintzr(Op.Rt);
  81. Context.EmitLdc_I(Offs);
  82. Context.Emit(OpCodes.Add);
  83. Context.EmitLdc_I8(0);
  84. AInstEmitMemoryHelper.EmitWriteCall(Context, 3);
  85. }
  86. break;
  87. }
  88. //No-op
  89. case 0b11_011_0111_1110_001: //DC CIVAC
  90. break;
  91. }
  92. }
  93. private static int GetPackedId(AOpCodeSystem Op)
  94. {
  95. int Id;
  96. Id = Op.Op2 << 0;
  97. Id |= Op.CRm << 3;
  98. Id |= Op.CRn << 7;
  99. Id |= Op.Op1 << 11;
  100. Id |= Op.Op0 << 14;
  101. return Id;
  102. }
  103. }
  104. }