InstEmitSimdLogical32.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using ARMeilleure.Decoders;
  2. using ARMeilleure.IntermediateRepresentation;
  3. using ARMeilleure.Translation;
  4. using static ARMeilleure.Instructions.InstEmitSimdHelper32;
  5. namespace ARMeilleure.Instructions
  6. {
  7. static partial class InstEmit32
  8. {
  9. public static void Vand_I(ArmEmitterContext context)
  10. {
  11. if (Optimizations.UseSse2)
  12. {
  13. EmitVectorBinaryOpF32(context, Intrinsic.X86Pand, Intrinsic.X86Pand);
  14. }
  15. else
  16. {
  17. EmitVectorBinaryOpZx32(context, (op1, op2) => context.BitwiseAnd(op1, op2));
  18. }
  19. }
  20. public static void Vbif(ArmEmitterContext context)
  21. {
  22. EmitBifBit(context, true);
  23. }
  24. public static void Vbit(ArmEmitterContext context)
  25. {
  26. EmitBifBit(context, false);
  27. }
  28. public static void Vbsl(ArmEmitterContext context)
  29. {
  30. if (Optimizations.UseSse2)
  31. {
  32. EmitVectorTernaryOpSimd32(context, (d, n, m) =>
  33. {
  34. Operand res = context.AddIntrinsic(Intrinsic.X86Pxor, n, m);
  35. res = context.AddIntrinsic(Intrinsic.X86Pand, res, d);
  36. return context.AddIntrinsic(Intrinsic.X86Pxor, res, m);
  37. });
  38. }
  39. else
  40. {
  41. EmitVectorTernaryOpZx32(context, (op1, op2, op3) =>
  42. {
  43. return context.BitwiseExclusiveOr(
  44. context.BitwiseAnd(op1,
  45. context.BitwiseExclusiveOr(op2, op3)), op3);
  46. });
  47. }
  48. }
  49. public static void Vorr_I(ArmEmitterContext context)
  50. {
  51. if (Optimizations.UseSse2)
  52. {
  53. EmitVectorBinaryOpF32(context, Intrinsic.X86Por, Intrinsic.X86Por);
  54. }
  55. else
  56. {
  57. EmitVectorBinaryOpZx32(context, (op1, op2) => context.BitwiseOr(op1, op2));
  58. }
  59. }
  60. private static void EmitBifBit(ArmEmitterContext context, bool notRm)
  61. {
  62. OpCode32SimdReg op = (OpCode32SimdReg)context.CurrOp;
  63. if (Optimizations.UseSse2)
  64. {
  65. EmitVectorTernaryOpSimd32(context, (d, n, m) =>
  66. {
  67. Operand res = context.AddIntrinsic(Intrinsic.X86Pxor, n, d);
  68. res = context.AddIntrinsic((notRm) ? Intrinsic.X86Pandn : Intrinsic.X86Pand, m, res);
  69. return context.AddIntrinsic(Intrinsic.X86Pxor, d, res);
  70. });
  71. }
  72. else
  73. {
  74. EmitVectorTernaryOpZx32(context, (d, n, m) =>
  75. {
  76. if (notRm)
  77. {
  78. m = context.BitwiseNot(m);
  79. }
  80. return context.BitwiseExclusiveOr(
  81. context.BitwiseAnd(m,
  82. context.BitwiseExclusiveOr(d, n)), d);
  83. });
  84. }
  85. }
  86. }
  87. }