aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/State/Register.cs
blob: 12c3f5c34c24f3455070dee0a6e119d673eb0fc3 (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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
using System;
using System.Reflection;

namespace ChocolArm64.State
{
    struct Register
    {
        public int Index;

        public RegisterType Type;

        public Register(int index, RegisterType type)
        {
            Index = index;
            Type  = type;
        }

        public override int GetHashCode()
        {
            return (ushort)Index | ((ushort)Type << 16);
        }

        public override bool Equals(object obj)
        {
            return obj is Register reg &&
                   reg.Index == Index &&
                   reg.Type  == Type;
        }

        public FieldInfo GetField()
        {
            switch (Type)
            {
                case RegisterType.Flag:   return GetFieldFlag();
                case RegisterType.Int:    return GetFieldInt();
                case RegisterType.Vector: return GetFieldVector();
            }

            throw new InvalidOperationException();
        }

        private FieldInfo GetFieldFlag()
        {
            switch ((PState)Index)
            {
                case PState.TBit: return GetField(nameof(CpuThreadState.Thumb));
                case PState.EBit: return GetField(nameof(CpuThreadState.BigEndian));

                case PState.VBit: return GetField(nameof(CpuThreadState.Overflow));
                case PState.CBit: return GetField(nameof(CpuThreadState.Carry));
                case PState.ZBit: return GetField(nameof(CpuThreadState.Zero));
                case PState.NBit: return GetField(nameof(CpuThreadState.Negative));
            }

            throw new InvalidOperationException();
        }

        private FieldInfo GetFieldInt()
        {
            switch (Index)
            {
                case 0:  return GetField(nameof(CpuThreadState.X0));
                case 1:  return GetField(nameof(CpuThreadState.X1));
                case 2:  return GetField(nameof(CpuThreadState.X2));
                case 3:  return GetField(nameof(CpuThreadState.X3));
                case 4:  return GetField(nameof(CpuThreadState.X4));
                case 5:  return GetField(nameof(CpuThreadState.X5));
                case 6:  return GetField(nameof(CpuThreadState.X6));
                case 7:  return GetField(nameof(CpuThreadState.X7));
                case 8:  return GetField(nameof(CpuThreadState.X8));
                case 9:  return GetField(nameof(CpuThreadState.X9));
                case 10: return GetField(nameof(CpuThreadState.X10));
                case 11: return GetField(nameof(CpuThreadState.X11));
                case 12: return GetField(nameof(CpuThreadState.X12));
                case 13: return GetField(nameof(CpuThreadState.X13));
                case 14: return GetField(nameof(CpuThreadState.X14));
                case 15: return GetField(nameof(CpuThreadState.X15));
                case 16: return GetField(nameof(CpuThreadState.X16));
                case 17: return GetField(nameof(CpuThreadState.X17));
                case 18: return GetField(nameof(CpuThreadState.X18));
                case 19: return GetField(nameof(CpuThreadState.X19));
                case 20: return GetField(nameof(CpuThreadState.X20));
                case 21: return GetField(nameof(CpuThreadState.X21));
                case 22: return GetField(nameof(CpuThreadState.X22));
                case 23: return GetField(nameof(CpuThreadState.X23));
                case 24: return GetField(nameof(CpuThreadState.X24));
                case 25: return GetField(nameof(CpuThreadState.X25));
                case 26: return GetField(nameof(CpuThreadState.X26));
                case 27: return GetField(nameof(CpuThreadState.X27));
                case 28: return GetField(nameof(CpuThreadState.X28));
                case 29: return GetField(nameof(CpuThreadState.X29));
                case 30: return GetField(nameof(CpuThreadState.X30));
                case 31: return GetField(nameof(CpuThreadState.X31));
            }

            throw new InvalidOperationException();
        }

        private FieldInfo GetFieldVector()
        {
            switch (Index)
            {
                case 0:  return GetField(nameof(CpuThreadState.V0));
                case 1:  return GetField(nameof(CpuThreadState.V1));
                case 2:  return GetField(nameof(CpuThreadState.V2));
                case 3:  return GetField(nameof(CpuThreadState.V3));
                case 4:  return GetField(nameof(CpuThreadState.V4));
                case 5:  return GetField(nameof(CpuThreadState.V5));
                case 6:  return GetField(nameof(CpuThreadState.V6));
                case 7:  return GetField(nameof(CpuThreadState.V7));
                case 8:  return GetField(nameof(CpuThreadState.V8));
                case 9:  return GetField(nameof(CpuThreadState.V9));
                case 10: return GetField(nameof(CpuThreadState.V10));
                case 11: return GetField(nameof(CpuThreadState.V11));
                case 12: return GetField(nameof(CpuThreadState.V12));
                case 13: return GetField(nameof(CpuThreadState.V13));
                case 14: return GetField(nameof(CpuThreadState.V14));
                case 15: return GetField(nameof(CpuThreadState.V15));
                case 16: return GetField(nameof(CpuThreadState.V16));
                case 17: return GetField(nameof(CpuThreadState.V17));
                case 18: return GetField(nameof(CpuThreadState.V18));
                case 19: return GetField(nameof(CpuThreadState.V19));
                case 20: return GetField(nameof(CpuThreadState.V20));
                case 21: return GetField(nameof(CpuThreadState.V21));
                case 22: return GetField(nameof(CpuThreadState.V22));
                case 23: return GetField(nameof(CpuThreadState.V23));
                case 24: return GetField(nameof(CpuThreadState.V24));
                case 25: return GetField(nameof(CpuThreadState.V25));
                case 26: return GetField(nameof(CpuThreadState.V26));
                case 27: return GetField(nameof(CpuThreadState.V27));
                case 28: return GetField(nameof(CpuThreadState.V28));
                case 29: return GetField(nameof(CpuThreadState.V29));
                case 30: return GetField(nameof(CpuThreadState.V30));
                case 31: return GetField(nameof(CpuThreadState.V31));
            }

            throw new InvalidOperationException();
        }

        private FieldInfo GetField(string name)
        {
            return typeof(CpuThreadState).GetField(name);
        }
    }
}