Пример #1
0
        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))));
            }
        }
Пример #2
0
        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))));
            }
        }
Пример #3
0
        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));
        }