Ejemplo n.º 1
0
        public static void Ld_C(ShaderIrBlock Block, long OpCode)
        {
            int Type = (int)(OpCode >> 48) & 7;

            if (Type > 5)
            {
                throw new InvalidOperationException();
            }

            int Count = Type == 5 ? 2 : 1;

            for (int Index = 0; Index < Count; Index++)
            {
                ShaderIrOperCbuf OperA = GetOperCbuf36(OpCode);
                ShaderIrOperGpr  OperD = GetOperGpr0(OpCode);

                OperA.Pos   += Index;
                OperD.Index += Index;

                ShaderIrNode Node = OperA;

                if (Type < 4)
                {
                    //This is a 8 or 16 bits type.
                    bool Signed = (Type & 1) != 0;

                    int Size = 8 << (Type >> 1);

                    Node = ExtendTo32(Node, Signed, Size);
                }

                Block.AddNode(GetPredNode(new ShaderIrAsg(OperD, Node), OpCode));
            }
        }
Ejemplo n.º 2
0
        public static void Ld_C(ShaderIrBlock Block, long OpCode, long Position)
        {
            int CbufPos   = (int)(OpCode >> 22) & 0x3fff;
            int CbufIndex = (int)(OpCode >> 36) & 0x1f;
            int Type      = (int)(OpCode >> 48) & 7;

            if (Type > 5)
            {
                throw new InvalidOperationException();
            }

            ShaderIrOperGpr Temp = ShaderIrOperGpr.MakeTemporary();

            Block.AddNode(new ShaderIrAsg(Temp, GetOperGpr8(OpCode)));

            int Count = Type == 5 ? 2 : 1;

            for (int Index = 0; Index < Count; Index++)
            {
                ShaderIrOperCbuf OperA = new ShaderIrOperCbuf(CbufIndex, CbufPos, Temp);

                ShaderIrOperGpr OperD = GetOperGpr0(OpCode);

                OperA.Pos   += Index;
                OperD.Index += Index;

                if (!OperD.IsValidRegister)
                {
                    break;
                }

                ShaderIrNode Node = OperA;

                if (Type < 4)
                {
                    //This is a 8 or 16 bits type.
                    bool Signed = (Type & 1) != 0;

                    int Size = 8 << (Type >> 1);

                    Node = ExtendTo32(Node, Signed, Size);
                }

                Block.AddNode(GetPredNode(new ShaderIrAsg(OperD, Node), OpCode));
            }
        }
Ejemplo n.º 3
0
        public static void Ld_C(ShaderIrBlock block, long opCode, int position)
        {
            int cbufPos   = opCode.Read(22, 0x3fff);
            int cbufIndex = opCode.Read(36, 0x1f);
            int type      = opCode.Read(48, 7);

            if (type > 5)
            {
                throw new InvalidOperationException();
            }

            ShaderIrOperGpr temp = ShaderIrOperGpr.MakeTemporary();

            block.AddNode(new ShaderIrAsg(temp, opCode.Gpr8()));

            int count = type == 5 ? 2 : 1;

            for (int index = 0; index < count; index++)
            {
                ShaderIrOperCbuf operA = new ShaderIrOperCbuf(cbufIndex, cbufPos, temp);

                ShaderIrOperGpr operD = opCode.Gpr0();

                operA.Pos   += index;
                operD.Index += index;

                if (!operD.IsValidRegister)
                {
                    break;
                }

                ShaderIrNode node = operA;

                if (type < 4)
                {
                    //This is a 8 or 16 bits type.
                    bool signed = (type & 1) != 0;

                    int size = 8 << (type >> 1);

                    node = ExtendTo32(node, signed, size);
                }

                block.AddNode(opCode.PredNode(new ShaderIrAsg(operD, node)));
            }
        }
Ejemplo n.º 4
0
        public static void Mov_C(ShaderIrBlock Block, long OpCode, long Position)
        {
            ShaderIrOperCbuf Cbuf = GetOperCbuf34(OpCode);

            Block.AddNode(GetPredNode(new ShaderIrAsg(GetOperGpr0(OpCode), Cbuf), OpCode));
        }
Ejemplo n.º 5
0
        public static void Mov_C(ShaderIrBlock block, long opCode, int position)
        {
            ShaderIrOperCbuf cbuf = opCode.Cbuf34();

            block.AddNode(opCode.PredNode(new ShaderIrAsg(opCode.Gpr0(), cbuf)));
        }
Ejemplo n.º 6
0
        public static void Mov_C(ShaderIrBlock Block, long OpCode, int Position)
        {
            ShaderIrOperCbuf Cbuf = OpCode.Cbuf34();

            Block.AddNode(OpCode.PredNode(new ShaderIrAsg(OpCode.Gpr0(), Cbuf)));
        }