InstEmitFloatMinMax.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. namespace Ryujinx.Graphics.Shader.Instructions
  7. {
  8. static partial class InstEmit
  9. {
  10. public static void FmnmxR(EmitterContext context)
  11. {
  12. InstFmnmxR op = context.GetOp<InstFmnmxR>();
  13. var srcA = GetSrcReg(context, op.SrcA);
  14. var srcB = GetSrcReg(context, op.SrcB);
  15. var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
  16. EmitFmnmx(context, srcA, srcB, srcPred, op.Dest, op.AbsA, op.AbsB, op.NegA, op.NegB, op.WriteCC);
  17. }
  18. public static void FmnmxI(EmitterContext context)
  19. {
  20. InstFmnmxI op = context.GetOp<InstFmnmxI>();
  21. var srcA = GetSrcReg(context, op.SrcA);
  22. var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20));
  23. var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
  24. EmitFmnmx(context, srcA, srcB, srcPred, op.Dest, op.AbsA, op.AbsB, op.NegA, op.NegB, op.WriteCC);
  25. }
  26. public static void FmnmxC(EmitterContext context)
  27. {
  28. InstFmnmxC op = context.GetOp<InstFmnmxC>();
  29. var srcA = GetSrcReg(context, op.SrcA);
  30. var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset);
  31. var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
  32. EmitFmnmx(context, srcA, srcB, srcPred, op.Dest, op.AbsA, op.AbsB, op.NegA, op.NegB, op.WriteCC);
  33. }
  34. private static void EmitFmnmx(
  35. EmitterContext context,
  36. Operand srcA,
  37. Operand srcB,
  38. Operand srcPred,
  39. int rd,
  40. bool absoluteA,
  41. bool absoluteB,
  42. bool negateA,
  43. bool negateB,
  44. bool writeCC)
  45. {
  46. srcA = context.FPAbsNeg(srcA, absoluteA, negateA);
  47. srcB = context.FPAbsNeg(srcB, absoluteB, negateB);
  48. Operand resMin = context.FPMinimum(srcA, srcB);
  49. Operand resMax = context.FPMaximum(srcA, srcB);
  50. Operand dest = GetDest(rd);
  51. context.Copy(dest, context.ConditionalSelect(srcPred, resMin, resMax));
  52. SetFPZnFlags(context, dest, writeCC);
  53. }
  54. }
  55. }