InstEmitPredicate.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using Ryujinx.Graphics.Shader.Decoders;
  2. using Ryujinx.Graphics.Shader.IntermediateRepresentation;
  3. using Ryujinx.Graphics.Shader.Translation;
  4. using static Ryujinx.Graphics.Shader.Instructions.InstEmitAluHelper;
  5. using static Ryujinx.Graphics.Shader.Instructions.InstEmitHelper;
  6. using static Ryujinx.Graphics.Shader.IntermediateRepresentation.OperandHelper;
  7. namespace Ryujinx.Graphics.Shader.Instructions
  8. {
  9. static partial class InstEmit
  10. {
  11. public static void Pset(EmitterContext context)
  12. {
  13. InstPset op = context.GetOp<InstPset>();
  14. Operand srcA = context.BitwiseNot(Register(op.Src2Pred, RegisterType.Predicate), op.Src2PredInv);
  15. Operand srcB = context.BitwiseNot(Register(op.Src1Pred, RegisterType.Predicate), op.Src1PredInv);
  16. Operand srcC = context.BitwiseNot(Register(op.SrcPred, RegisterType.Predicate), op.SrcPredInv);
  17. Operand res = GetPredLogicalOp(context, op.BoolOpAB, srcA, srcB);
  18. res = GetPredLogicalOp(context, op.BoolOpC, res, srcC);
  19. Operand dest = GetDest(op.Dest);
  20. if (op.BVal)
  21. {
  22. context.Copy(dest, context.ConditionalSelect(res, ConstF(1), Const(0)));
  23. }
  24. else
  25. {
  26. context.Copy(dest, res);
  27. }
  28. }
  29. public static void Psetp(EmitterContext context)
  30. {
  31. InstPsetp op = context.GetOp<InstPsetp>();
  32. Operand srcA = context.BitwiseNot(Register(op.Src2Pred, RegisterType.Predicate), op.Src2PredInv);
  33. Operand srcB = context.BitwiseNot(Register(op.Src1Pred, RegisterType.Predicate), op.Src1PredInv);
  34. Operand p0Res = GetPredLogicalOp(context, op.BoolOpAB, srcA, srcB);
  35. Operand p1Res = context.BitwiseNot(p0Res);
  36. Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
  37. p0Res = GetPredLogicalOp(context, op.BoolOpC, p0Res, srcPred);
  38. p1Res = GetPredLogicalOp(context, op.BoolOpC, p1Res, srcPred);
  39. context.Copy(Register(op.DestPred, RegisterType.Predicate), p0Res);
  40. context.Copy(Register(op.DestPredInv, RegisterType.Predicate), p1Res);
  41. }
  42. }
  43. }