aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Decoders/OpCodeShuffle.cs
blob: f9f424332c7dc15ea1dd05168fe9642c1692ffb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using Ryujinx.Graphics.Shader.Instructions;

namespace Ryujinx.Graphics.Shader.Decoders
{
    class OpCodeShuffle : OpCode, IOpCodeRd, IOpCodeRa
    {
        public Register Rd { get; }
        public Register Ra { get; }
        public Register Rb { get; }
        public Register Rc { get; }

        public int ImmediateB { get; }
        public int ImmediateC { get; }

        public bool IsBImmediate { get; }
        public bool IsCImmediate { get; }

        public ShuffleType ShuffleType { get; }

        public Register Predicate48 { get; }

        public new static OpCode Create(InstEmitter emitter, ulong address, long opCode) => new OpCodeShuffle(emitter, address, opCode);

        public OpCodeShuffle(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode)
        {
            Rd = new Register(opCode.Extract(0,  8), RegisterType.Gpr);
            Ra = new Register(opCode.Extract(8,  8), RegisterType.Gpr);
            Rb = new Register(opCode.Extract(20, 8), RegisterType.Gpr);
            Rc = new Register(opCode.Extract(39, 8), RegisterType.Gpr);

            ImmediateB = opCode.Extract(20, 5);
            ImmediateC = opCode.Extract(34, 13);

            IsBImmediate = opCode.Extract(28);
            IsCImmediate = opCode.Extract(29);

            ShuffleType = (ShuffleType)opCode.Extract(30, 2);

            Predicate48 = new Register(opCode.Extract(48, 3), RegisterType.Predicate);
        }
    }
}