AInstEmitHash.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using ChocolArm64.Decoder;
  2. using ChocolArm64.State;
  3. using ChocolArm64.Translation;
  4. using System.Reflection.Emit;
  5. namespace ChocolArm64.Instruction
  6. {
  7. static partial class AInstEmit
  8. {
  9. public static void Crc32b(AILEmitterCtx Context)
  10. {
  11. EmitCrc32(Context, nameof(ASoftFallback.Crc32b));
  12. }
  13. public static void Crc32h(AILEmitterCtx Context)
  14. {
  15. EmitCrc32(Context, nameof(ASoftFallback.Crc32h));
  16. }
  17. public static void Crc32w(AILEmitterCtx Context)
  18. {
  19. EmitCrc32(Context, nameof(ASoftFallback.Crc32w));
  20. }
  21. public static void Crc32x(AILEmitterCtx Context)
  22. {
  23. EmitCrc32(Context, nameof(ASoftFallback.Crc32x));
  24. }
  25. public static void Crc32cb(AILEmitterCtx Context)
  26. {
  27. EmitCrc32(Context, nameof(ASoftFallback.Crc32cb));
  28. }
  29. public static void Crc32ch(AILEmitterCtx Context)
  30. {
  31. EmitCrc32(Context, nameof(ASoftFallback.Crc32ch));
  32. }
  33. public static void Crc32cw(AILEmitterCtx Context)
  34. {
  35. EmitCrc32(Context, nameof(ASoftFallback.Crc32cw));
  36. }
  37. public static void Crc32cx(AILEmitterCtx Context)
  38. {
  39. EmitCrc32(Context, nameof(ASoftFallback.Crc32cx));
  40. }
  41. private static void EmitCrc32(AILEmitterCtx Context, string Name)
  42. {
  43. AOpCodeAluRs Op = (AOpCodeAluRs)Context.CurrOp;
  44. Context.EmitLdintzr(Op.Rn);
  45. if (Op.RegisterSize != ARegisterSize.Int32)
  46. {
  47. Context.Emit(OpCodes.Conv_U4);
  48. }
  49. Context.EmitLdintzr(Op.Rm);
  50. ASoftFallback.EmitCall(Context, Name);
  51. if (Op.RegisterSize != ARegisterSize.Int32)
  52. {
  53. Context.Emit(OpCodes.Conv_U8);
  54. }
  55. Context.EmitStintzr(Op.Rd);
  56. }
  57. }
  58. }