AInstEmitSimdLogical.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using ChocolArm64.Decoder;
  2. using ChocolArm64.State;
  3. using ChocolArm64.Translation;
  4. using System.Reflection.Emit;
  5. using static ChocolArm64.Instruction.AInstEmitSimdHelper;
  6. namespace ChocolArm64.Instruction
  7. {
  8. static partial class AInstEmit
  9. {
  10. public static void And_V(AILEmitterCtx Context)
  11. {
  12. EmitVectorBinaryOpZx(Context, () => Context.Emit(OpCodes.And));
  13. }
  14. public static void Bic_V(AILEmitterCtx Context)
  15. {
  16. EmitVectorBinaryOpZx(Context, () =>
  17. {
  18. Context.Emit(OpCodes.Not);
  19. Context.Emit(OpCodes.And);
  20. });
  21. }
  22. public static void Bic_Vi(AILEmitterCtx Context)
  23. {
  24. EmitVectorImmBinaryOp(Context, () =>
  25. {
  26. Context.Emit(OpCodes.Not);
  27. Context.Emit(OpCodes.And);
  28. });
  29. }
  30. public static void Bsl_V(AILEmitterCtx Context)
  31. {
  32. EmitVectorTernaryOpZx(Context, () =>
  33. {
  34. Context.EmitSttmp();
  35. Context.EmitLdtmp();
  36. Context.Emit(OpCodes.Xor);
  37. Context.Emit(OpCodes.And);
  38. Context.EmitLdtmp();
  39. Context.Emit(OpCodes.Xor);
  40. });
  41. }
  42. public static void Eor_V(AILEmitterCtx Context)
  43. {
  44. EmitVectorBinaryOpZx(Context, () => Context.Emit(OpCodes.Xor));
  45. }
  46. public static void Not_V(AILEmitterCtx Context)
  47. {
  48. EmitVectorUnaryOpZx(Context, () => Context.Emit(OpCodes.Not));
  49. }
  50. public static void Orr_V(AILEmitterCtx Context)
  51. {
  52. EmitVectorBinaryOpZx(Context, () => Context.Emit(OpCodes.Or));
  53. }
  54. public static void Orr_Vi(AILEmitterCtx Context)
  55. {
  56. EmitVectorImmBinaryOp(Context, () => Context.Emit(OpCodes.Or));
  57. }
  58. public static void Rev64_V(AILEmitterCtx Context)
  59. {
  60. AOpCodeSimd Op = (AOpCodeSimd)Context.CurrOp;
  61. int Bytes = Context.CurrOp.GetBitsCount() >> 3;
  62. int Elems = Bytes >> Op.Size;
  63. int RevIndex = Elems - 1;
  64. for (int Index = 0; Index < (Bytes >> Op.Size); Index++)
  65. {
  66. EmitVectorExtractZx(Context, Op.Rn, RevIndex--, Op.Size);
  67. EmitVectorInsert(Context, Op.Rd, Index, Op.Size);
  68. }
  69. if (Op.RegisterSize == ARegisterSize.SIMD64)
  70. {
  71. EmitVectorZeroUpper(Context, Op.Rd);
  72. }
  73. }
  74. }
  75. }