InstEmitIntegerMinMax.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 ImnmxR(EmitterContext context)
  11. {
  12. InstImnmxR op = context.GetOp<InstImnmxR>();
  13. var srcA = GetSrcReg(context, op.SrcA);
  14. var srcB = GetSrcReg(context, op.SrcB);
  15. var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
  16. EmitImnmx(context, srcA, srcB, srcPred, op.Dest, op.Signed, op.WriteCC);
  17. }
  18. public static void ImnmxI(EmitterContext context)
  19. {
  20. InstImnmxI op = context.GetOp<InstImnmxI>();
  21. var srcA = GetSrcReg(context, op.SrcA);
  22. var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20));
  23. var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
  24. EmitImnmx(context, srcA, srcB, srcPred, op.Dest, op.Signed, op.WriteCC);
  25. }
  26. public static void ImnmxC(EmitterContext context)
  27. {
  28. InstImnmxC op = context.GetOp<InstImnmxC>();
  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. EmitImnmx(context, srcA, srcB, srcPred, op.Dest, op.Signed, op.WriteCC);
  33. }
  34. private static void EmitImnmx(
  35. EmitterContext context,
  36. Operand srcA,
  37. Operand srcB,
  38. Operand srcPred,
  39. int rd,
  40. bool isSignedInt,
  41. bool writeCC)
  42. {
  43. Operand resMin = isSignedInt
  44. ? context.IMinimumS32(srcA, srcB)
  45. : context.IMinimumU32(srcA, srcB);
  46. Operand resMax = isSignedInt
  47. ? context.IMaximumS32(srcA, srcB)
  48. : context.IMaximumU32(srcA, srcB);
  49. Operand res = context.ConditionalSelect(srcPred, resMin, resMax);
  50. context.Copy(GetDest(rd), res);
  51. SetZnFlags(context, res, writeCC);
  52. // TODO: X flags.
  53. }
  54. }
  55. }