private static void EmitBinaryHalfOp(ShaderIrBlock Block, long OpCode, ShaderIrInst Inst) { bool AbsB = OpCode.Read(30); bool NegB = OpCode.Read(31); bool Sat = OpCode.Read(32); bool AbsA = OpCode.Read(44); ShaderIrOperGpr[] VecA = OpCode.GprHalfVec8(); ShaderIrOperGpr[] VecB = OpCode.GprHalfVec20(); HalfOutputType OutputType = (HalfOutputType)OpCode.Read(49, 3); int Elems = OutputType == HalfOutputType.PackedFp16 ? 2 : 1; int First = OutputType == HalfOutputType.MergeH1 ? 1 : 0; for (int Index = First; Index < Elems; Index++) { ShaderIrNode OperA = GetAluFabs(VecA[Index], AbsA); ShaderIrNode OperB = GetAluFabsFneg(VecB[Index], AbsB, NegB); ShaderIrNode Op = new ShaderIrOp(Inst, OperA, OperB); ShaderIrOperGpr Dst = GetHalfDst(OpCode, OutputType, Index); Block.AddNode(OpCode.PredNode(new ShaderIrAsg(Dst, GetAluFsat(Op, Sat)))); } }
private static void EmitBinaryHalfOp(ShaderIrBlock block, long opCode, ShaderIrInst inst) { bool absB = opCode.Read(30); bool negB = opCode.Read(31); bool sat = opCode.Read(32); bool absA = opCode.Read(44); ShaderIrOperGpr[] vecA = opCode.GprHalfVec8(); ShaderIrOperGpr[] vecB = opCode.GprHalfVec20(); HalfOutputType outputType = (HalfOutputType)opCode.Read(49, 3); int elems = outputType == HalfOutputType.PackedFp16 ? 2 : 1; int first = outputType == HalfOutputType.MergeH1 ? 1 : 0; for (int index = first; index < elems; index++) { ShaderIrNode operA = GetAluFabs(vecA[index], absA); ShaderIrNode operB = GetAluFabsFneg(vecB[index], absB, negB); ShaderIrNode op = new ShaderIrOp(inst, operA, operB); ShaderIrOperGpr dst = GetHalfDst(opCode, outputType, index); block.AddNode(opCode.PredNode(new ShaderIrAsg(dst, GetAluFsat(op, sat)))); } }
private static ShaderIrOperGpr GetHalfDst(long OpCode, HalfOutputType OutputType, int Index) { switch (OutputType) { case HalfOutputType.PackedFp16: return(OpCode.GprHalf0(Index)); case HalfOutputType.Fp32: return(OpCode.Gpr0()); case HalfOutputType.MergeH0: return(OpCode.GprHalf0(0)); case HalfOutputType.MergeH1: return(OpCode.GprHalf0(1)); } throw new ArgumentException(nameof(OutputType)); }