InstEmitIntegerMinMax.cs
1 using Ryujinx.Graphics.Shader.Decoders; 2 using Ryujinx.Graphics.Shader.IntermediateRepresentation; 3 using Ryujinx.Graphics.Shader.Translation; 4 5 using static Ryujinx.Graphics.Shader.Instructions.InstEmitAluHelper; 6 using static Ryujinx.Graphics.Shader.Instructions.InstEmitHelper; 7 8 namespace Ryujinx.Graphics.Shader.Instructions 9 { 10 static partial class InstEmit 11 { 12 public static void ImnmxR(EmitterContext context) 13 { 14 InstImnmxR op = context.GetOp<InstImnmxR>(); 15 16 var srcA = GetSrcReg(context, op.SrcA); 17 var srcB = GetSrcReg(context, op.SrcB); 18 var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); 19 20 EmitImnmx(context, srcA, srcB, srcPred, op.Dest, op.Signed, op.WriteCC); 21 } 22 23 public static void ImnmxI(EmitterContext context) 24 { 25 InstImnmxI op = context.GetOp<InstImnmxI>(); 26 27 var srcA = GetSrcReg(context, op.SrcA); 28 var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); 29 var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); 30 31 EmitImnmx(context, srcA, srcB, srcPred, op.Dest, op.Signed, op.WriteCC); 32 } 33 34 public static void ImnmxC(EmitterContext context) 35 { 36 InstImnmxC op = context.GetOp<InstImnmxC>(); 37 38 var srcA = GetSrcReg(context, op.SrcA); 39 var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); 40 var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); 41 42 EmitImnmx(context, srcA, srcB, srcPred, op.Dest, op.Signed, op.WriteCC); 43 } 44 45 private static void EmitImnmx( 46 EmitterContext context, 47 Operand srcA, 48 Operand srcB, 49 Operand srcPred, 50 int rd, 51 bool isSignedInt, 52 bool writeCC) 53 { 54 Operand resMin = isSignedInt 55 ? context.IMinimumS32(srcA, srcB) 56 : context.IMinimumU32(srcA, srcB); 57 58 Operand resMax = isSignedInt 59 ? context.IMaximumS32(srcA, srcB) 60 : context.IMaximumU32(srcA, srcB); 61 62 Operand res = context.ConditionalSelect(srcPred, resMin, resMax); 63 64 context.Copy(GetDest(rd), res); 65 66 SetZnFlags(context, res, writeCC); 67 68 // TODO: X flags. 69 } 70 } 71 }