InstEmitSimdLogical32.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using ARMeilleure.Decoders;
  2. using ARMeilleure.Translation;
  3. using static ARMeilleure.Instructions.InstEmitSimdHelper32;
  4. namespace ARMeilleure.Instructions
  5. {
  6. static partial class InstEmit32
  7. {
  8. public static void Vand_I(ArmEmitterContext context)
  9. {
  10. EmitVectorBinaryOpZx32(context, (op1, op2) => context.BitwiseAnd(op1, op2));
  11. }
  12. public static void Vbif(ArmEmitterContext context)
  13. {
  14. EmitBifBit(context, true);
  15. }
  16. public static void Vbit(ArmEmitterContext context)
  17. {
  18. EmitBifBit(context, false);
  19. }
  20. public static void Vbsl(ArmEmitterContext context)
  21. {
  22. EmitVectorTernaryOpZx32(context, (op1, op2, op3) =>
  23. {
  24. return context.BitwiseExclusiveOr(
  25. context.BitwiseAnd(op1,
  26. context.BitwiseExclusiveOr(op2, op3)), op3);
  27. });
  28. }
  29. public static void Vorr_I(ArmEmitterContext context)
  30. {
  31. EmitVectorBinaryOpZx32(context, (op1, op2) => context.BitwiseOr(op1, op2));
  32. }
  33. private static void EmitBifBit(ArmEmitterContext context, bool notRm)
  34. {
  35. OpCode32SimdReg op = (OpCode32SimdReg)context.CurrOp;
  36. EmitVectorTernaryOpZx32(context, (d, n, m) =>
  37. {
  38. if (notRm)
  39. {
  40. m = context.BitwiseNot(m);
  41. }
  42. return context.BitwiseExclusiveOr(
  43. context.BitwiseAnd(m,
  44. context.BitwiseExclusiveOr(d, n)), d);
  45. });
  46. }
  47. }
  48. }