InstEmitSimdCrypto.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using ARMeilleure.Decoders;
  2. using ARMeilleure.IntermediateRepresentation;
  3. using ARMeilleure.Translation;
  4. using static ARMeilleure.Instructions.InstEmitHelper;
  5. namespace ARMeilleure.Instructions
  6. {
  7. static partial class InstEmit
  8. {
  9. public static void Aesd_V(ArmEmitterContext context)
  10. {
  11. OpCodeSimd op = (OpCodeSimd)context.CurrOp;
  12. Operand d = GetVec(op.Rd);
  13. Operand n = GetVec(op.Rn);
  14. Operand res;
  15. if (Optimizations.UseAesni)
  16. {
  17. res = context.AddIntrinsic(Intrinsic.X86Aesdeclast, context.AddIntrinsic(Intrinsic.X86Xorpd, d, n), context.VectorZero());
  18. }
  19. else
  20. {
  21. res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Decrypt)), d, n);
  22. }
  23. context.Copy(d, res);
  24. }
  25. public static void Aese_V(ArmEmitterContext context)
  26. {
  27. OpCodeSimd op = (OpCodeSimd)context.CurrOp;
  28. Operand d = GetVec(op.Rd);
  29. Operand n = GetVec(op.Rn);
  30. Operand res;
  31. if (Optimizations.UseAesni)
  32. {
  33. res = context.AddIntrinsic(Intrinsic.X86Aesenclast, context.AddIntrinsic(Intrinsic.X86Xorpd, d, n), context.VectorZero());
  34. }
  35. else
  36. {
  37. res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Encrypt)), d, n);
  38. }
  39. context.Copy(d, res);
  40. }
  41. public static void Aesimc_V(ArmEmitterContext context)
  42. {
  43. OpCodeSimd op = (OpCodeSimd)context.CurrOp;
  44. Operand n = GetVec(op.Rn);
  45. Operand res;
  46. if (Optimizations.UseAesni)
  47. {
  48. res = context.AddIntrinsic(Intrinsic.X86Aesimc, n);
  49. }
  50. else
  51. {
  52. res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.InverseMixColumns)), n);
  53. }
  54. context.Copy(GetVec(op.Rd), res);
  55. }
  56. public static void Aesmc_V(ArmEmitterContext context)
  57. {
  58. OpCodeSimd op = (OpCodeSimd)context.CurrOp;
  59. Operand n = GetVec(op.Rn);
  60. Operand res;
  61. if (Optimizations.UseAesni)
  62. {
  63. Operand roundKey = context.VectorZero();
  64. // Inverse Shift Rows, Inverse Sub Bytes, xor 0 so nothing happens
  65. res = context.AddIntrinsic(Intrinsic.X86Aesdeclast, n, roundKey);
  66. // Shift Rows, Sub Bytes, Mix Columns (!), xor 0 so nothing happens
  67. res = context.AddIntrinsic(Intrinsic.X86Aesenc, res, roundKey);
  68. }
  69. else
  70. {
  71. res = context.Call(typeof(SoftFallback).GetMethod(nameof(SoftFallback.MixColumns)), n);
  72. }
  73. context.Copy(GetVec(op.Rd), res);
  74. }
  75. }
  76. }