InstEmitHash.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using ARMeilleure.Decoders;
  2. using ARMeilleure.IntermediateRepresentation;
  3. using ARMeilleure.Translation;
  4. using static ARMeilleure.Instructions.InstEmitHashHelper;
  5. using static ARMeilleure.Instructions.InstEmitHelper;
  6. namespace ARMeilleure.Instructions
  7. {
  8. static partial class InstEmit
  9. {
  10. private const int ByteSizeLog2 = 0;
  11. private const int HWordSizeLog2 = 1;
  12. private const int WordSizeLog2 = 2;
  13. private const int DWordSizeLog2 = 3;
  14. public static void Crc32b(ArmEmitterContext context)
  15. {
  16. EmitCrc32Call(context, ByteSizeLog2, false);
  17. }
  18. public static void Crc32h(ArmEmitterContext context)
  19. {
  20. EmitCrc32Call(context, HWordSizeLog2, false);
  21. }
  22. public static void Crc32w(ArmEmitterContext context)
  23. {
  24. EmitCrc32Call(context, WordSizeLog2, false);
  25. }
  26. public static void Crc32x(ArmEmitterContext context)
  27. {
  28. EmitCrc32Call(context, DWordSizeLog2, false);
  29. }
  30. public static void Crc32cb(ArmEmitterContext context)
  31. {
  32. EmitCrc32Call(context, ByteSizeLog2, true);
  33. }
  34. public static void Crc32ch(ArmEmitterContext context)
  35. {
  36. EmitCrc32Call(context, HWordSizeLog2, true);
  37. }
  38. public static void Crc32cw(ArmEmitterContext context)
  39. {
  40. EmitCrc32Call(context, WordSizeLog2, true);
  41. }
  42. public static void Crc32cx(ArmEmitterContext context)
  43. {
  44. EmitCrc32Call(context, DWordSizeLog2, true);
  45. }
  46. private static void EmitCrc32Call(ArmEmitterContext context, int size, bool c)
  47. {
  48. OpCodeAluBinary op = (OpCodeAluBinary)context.CurrOp;
  49. Operand n = GetIntOrZR(context, op.Rn);
  50. Operand m = GetIntOrZR(context, op.Rm);
  51. Operand d = EmitCrc32(context, n, m, size, c);
  52. SetIntOrZR(context, op.Rd, d);
  53. }
  54. }
  55. }