1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===-- AArch64BaseInfo.h - Top level definitions for AArch64 ---*- C++ -*-===//
272062f5744557e270a38192554c3126ea5f97434Tim Northover//
372062f5744557e270a38192554c3126ea5f97434Tim Northover//                     The LLVM Compiler Infrastructure
472062f5744557e270a38192554c3126ea5f97434Tim Northover//
572062f5744557e270a38192554c3126ea5f97434Tim Northover// This file is distributed under the University of Illinois Open Source
672062f5744557e270a38192554c3126ea5f97434Tim Northover// License. See LICENSE.TXT for details.
772062f5744557e270a38192554c3126ea5f97434Tim Northover//
872062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===//
972062f5744557e270a38192554c3126ea5f97434Tim Northover//
1072062f5744557e270a38192554c3126ea5f97434Tim Northover// This file contains small standalone helper functions and enum definitions for
1172062f5744557e270a38192554c3126ea5f97434Tim Northover// the AArch64 target useful for the compiler back-end and the MC libraries.
1272062f5744557e270a38192554c3126ea5f97434Tim Northover// As such, it deliberately does not include references to LLVM core
1372062f5744557e270a38192554c3126ea5f97434Tim Northover// code gen types, passes, etc..
1472062f5744557e270a38192554c3126ea5f97434Tim Northover//
1572062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===//
1672062f5744557e270a38192554c3126ea5f97434Tim Northover
17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#ifndef AArch64BASEINFO_H
18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define AArch64BASEINFO_H
1972062f5744557e270a38192554c3126ea5f97434Tim Northover
20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// FIXME: Is it easiest to fix this layering violation by moving the .inc
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// #includes from AArch64MCTargetDesc.h to here?
22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "MCTargetDesc/AArch64MCTargetDesc.h" // For AArch64::X0 and friends.
2372062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/ADT/STLExtras.h"
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/StringSwitch.h"
2572062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/Support/ErrorHandling.h"
2672062f5744557e270a38192554c3126ea5f97434Tim Northover
2772062f5744557e270a38192554c3126ea5f97434Tim Northovernamespace llvm {
2872062f5744557e270a38192554c3126ea5f97434Tim Northover
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesinline static unsigned getWRegFromXReg(unsigned Reg) {
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  switch (Reg) {
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X0: return AArch64::W0;
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X1: return AArch64::W1;
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X2: return AArch64::W2;
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X3: return AArch64::W3;
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X4: return AArch64::W4;
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X5: return AArch64::W5;
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X6: return AArch64::W6;
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X7: return AArch64::W7;
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X8: return AArch64::W8;
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X9: return AArch64::W9;
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X10: return AArch64::W10;
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X11: return AArch64::W11;
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X12: return AArch64::W12;
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X13: return AArch64::W13;
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X14: return AArch64::W14;
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X15: return AArch64::W15;
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X16: return AArch64::W16;
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X17: return AArch64::W17;
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X18: return AArch64::W18;
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X19: return AArch64::W19;
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X20: return AArch64::W20;
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X21: return AArch64::W21;
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X22: return AArch64::W22;
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X23: return AArch64::W23;
55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X24: return AArch64::W24;
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X25: return AArch64::W25;
57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X26: return AArch64::W26;
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X27: return AArch64::W27;
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::X28: return AArch64::W28;
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::FP: return AArch64::W29;
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::LR: return AArch64::W30;
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::SP: return AArch64::WSP;
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::XZR: return AArch64::WZR;
64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // For anything else, return it unchanged.
66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return Reg;
67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
6872062f5744557e270a38192554c3126ea5f97434Tim Northover
69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesinline static unsigned getXRegFromWReg(unsigned Reg) {
70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  switch (Reg) {
71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W0: return AArch64::X0;
72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W1: return AArch64::X1;
73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W2: return AArch64::X2;
74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W3: return AArch64::X3;
75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W4: return AArch64::X4;
76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W5: return AArch64::X5;
77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W6: return AArch64::X6;
78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W7: return AArch64::X7;
79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W8: return AArch64::X8;
80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W9: return AArch64::X9;
81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W10: return AArch64::X10;
82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W11: return AArch64::X11;
83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W12: return AArch64::X12;
84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W13: return AArch64::X13;
85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W14: return AArch64::X14;
86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W15: return AArch64::X15;
87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W16: return AArch64::X16;
88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W17: return AArch64::X17;
89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W18: return AArch64::X18;
90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W19: return AArch64::X19;
91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W20: return AArch64::X20;
92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W21: return AArch64::X21;
93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W22: return AArch64::X22;
94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W23: return AArch64::X23;
95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W24: return AArch64::X24;
96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W25: return AArch64::X25;
97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W26: return AArch64::X26;
98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W27: return AArch64::X27;
99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W28: return AArch64::X28;
100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W29: return AArch64::FP;
101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::W30: return AArch64::LR;
102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::WSP: return AArch64::SP;
103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::WZR: return AArch64::XZR;
104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // For anything else, return it unchanged.
106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return Reg;
107dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
10872062f5744557e270a38192554c3126ea5f97434Tim Northover
109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic inline unsigned getBRegFromDReg(unsigned Reg) {
110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  switch (Reg) {
111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D0:  return AArch64::B0;
112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D1:  return AArch64::B1;
113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D2:  return AArch64::B2;
114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D3:  return AArch64::B3;
115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D4:  return AArch64::B4;
116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D5:  return AArch64::B5;
117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D6:  return AArch64::B6;
118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D7:  return AArch64::B7;
119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D8:  return AArch64::B8;
120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D9:  return AArch64::B9;
121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D10: return AArch64::B10;
122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D11: return AArch64::B11;
123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D12: return AArch64::B12;
124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D13: return AArch64::B13;
125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D14: return AArch64::B14;
126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D15: return AArch64::B15;
127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D16: return AArch64::B16;
128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D17: return AArch64::B17;
129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D18: return AArch64::B18;
130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D19: return AArch64::B19;
131dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D20: return AArch64::B20;
132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D21: return AArch64::B21;
133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D22: return AArch64::B22;
134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D23: return AArch64::B23;
135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D24: return AArch64::B24;
136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D25: return AArch64::B25;
137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D26: return AArch64::B26;
138dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D27: return AArch64::B27;
139dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D28: return AArch64::B28;
140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D29: return AArch64::B29;
141dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D30: return AArch64::B30;
142dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::D31: return AArch64::B31;
14372062f5744557e270a38192554c3126ea5f97434Tim Northover  }
144dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // For anything else, return it unchanged.
145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return Reg;
14672062f5744557e270a38192554c3126ea5f97434Tim Northover}
14772062f5744557e270a38192554c3126ea5f97434Tim Northover
148dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
149dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic inline unsigned getDRegFromBReg(unsigned Reg) {
150dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  switch (Reg) {
151dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B0:  return AArch64::D0;
152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B1:  return AArch64::D1;
153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B2:  return AArch64::D2;
154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B3:  return AArch64::D3;
155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B4:  return AArch64::D4;
156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B5:  return AArch64::D5;
157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B6:  return AArch64::D6;
158dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B7:  return AArch64::D7;
159dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B8:  return AArch64::D8;
160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B9:  return AArch64::D9;
161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B10: return AArch64::D10;
162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B11: return AArch64::D11;
163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B12: return AArch64::D12;
164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B13: return AArch64::D13;
165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B14: return AArch64::D14;
166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B15: return AArch64::D15;
167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B16: return AArch64::D16;
168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B17: return AArch64::D17;
169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B18: return AArch64::D18;
170dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B19: return AArch64::D19;
171dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B20: return AArch64::D20;
172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B21: return AArch64::D21;
173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B22: return AArch64::D22;
174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B23: return AArch64::D23;
175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B24: return AArch64::D24;
176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B25: return AArch64::D25;
177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B26: return AArch64::D26;
178dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B27: return AArch64::D27;
179dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B28: return AArch64::D28;
180dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B29: return AArch64::D29;
181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B30: return AArch64::D30;
182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64::B31: return AArch64::D31;
183dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
184dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // For anything else, return it unchanged.
185dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return Reg;
18672062f5744557e270a38192554c3126ea5f97434Tim Northover}
18772062f5744557e270a38192554c3126ea5f97434Tim Northover
188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace AArch64CC {
189dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
190dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// The CondCodes constants map directly to the 4-bit encoding of the condition
191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// field for predicated instructions.
192dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesenum CondCode {  // Meaning (integer)          Meaning (floating-point)
193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EQ = 0x0,      // Equal                      Equal
194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  NE = 0x1,      // Not equal                  Not equal, or unordered
195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  HS = 0x2,      // Unsigned higher or same    >, ==, or unordered
196dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LO = 0x3,      // Unsigned lower             Less than
197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MI = 0x4,      // Minus, negative            Less than
198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  PL = 0x5,      // Plus, positive or zero     >, ==, or unordered
199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  VS = 0x6,      // Overflow                   Unordered
200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  VC = 0x7,      // No overflow                Not unordered
201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  HI = 0x8,      // Unsigned higher            Greater than, or unordered
202dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LS = 0x9,      // Unsigned lower or same     Less than or equal
203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  GE = 0xa,      // Greater than or equal      Greater than or equal
204dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LT = 0xb,      // Less than                  Less than, or unordered
205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  GT = 0xc,      // Greater than               Greater than
206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LE = 0xd,      // Less than or equal         <, ==, or unordered
207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  AL = 0xe,      // Always (unconditional)     Always (unconditional)
208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  NV = 0xf,      // Always (unconditional)     Always (unconditional)
209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Note the NV exists purely to disassemble 0b1111. Execution is "always".
210dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Invalid
211dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
21272062f5744557e270a38192554c3126ea5f97434Tim Northover
213dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesinline static const char *getCondCodeName(CondCode Code) {
214dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  switch (Code) {
215dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  default: llvm_unreachable("Unknown condition code");
216dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case EQ:  return "eq";
217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NE:  return "ne";
218dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case HS:  return "hs";
219dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case LO:  return "lo";
220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case MI:  return "mi";
221dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case PL:  return "pl";
222dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case VS:  return "vs";
223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case VC:  return "vc";
224dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case HI:  return "hi";
225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case LS:  return "ls";
226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case GE:  return "ge";
227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case LT:  return "lt";
228dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case GT:  return "gt";
229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case LE:  return "le";
230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AL:  return "al";
231dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NV:  return "nv";
232dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
233dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
235dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesinline static CondCode getInvertedCondCode(CondCode Code) {
236cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // To reverse a condition it's necessary to only invert the low bit:
237cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
238cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return static_cast<CondCode>(static_cast<unsigned>(Code) ^ 0x1);
23972062f5744557e270a38192554c3126ea5f97434Tim Northover}
24072062f5744557e270a38192554c3126ea5f97434Tim Northover
241dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// Given a condition code, return NZCV flags that would satisfy that condition.
242dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// The flag bits are in the format expected by the ccmp instructions.
243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// Note that many different flag settings can satisfy a given condition code,
244dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// this function just returns one of them.
245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesinline static unsigned getNZCVToSatisfyCondCode(CondCode Code) {
246dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // NZCV flags encoded as expected by ccmp instructions, ARMv8 ISA 5.5.7.
247dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  enum { N = 8, Z = 4, C = 2, V = 1 };
248dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  switch (Code) {
249dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  default: llvm_unreachable("Unknown condition code");
250dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case EQ: return Z; // Z == 1
251dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case NE: return 0; // Z == 0
252dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case HS: return C; // C == 1
253dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case LO: return 0; // C == 0
254dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case MI: return N; // N == 1
255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case PL: return 0; // N == 0
256dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case VS: return V; // V == 1
257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case VC: return 0; // V == 0
258dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case HI: return C; // C == 1 && Z == 0
259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case LS: return 0; // C == 0 || Z == 1
260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case GE: return 0; // N == V
261dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case LT: return N; // N != V
262dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case GT: return 0; // Z == 0 && N == V
263dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case LE: return Z; // Z == 1 || N != V
264dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
265dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
266dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} // end namespace AArch64CC
267dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
26872062f5744557e270a38192554c3126ea5f97434Tim Northover/// Instances of this class can perform bidirectional mapping from random
26972062f5744557e270a38192554c3126ea5f97434Tim Northover/// identifier strings to operand encodings. For example "MSR" takes a named
27072062f5744557e270a38192554c3126ea5f97434Tim Northover/// system-register which must be encoded somehow and decoded for printing. This
27172062f5744557e270a38192554c3126ea5f97434Tim Northover/// central location means that the information for those transformations is not
27272062f5744557e270a38192554c3126ea5f97434Tim Northover/// duplicated and remains in sync.
27372062f5744557e270a38192554c3126ea5f97434Tim Northover///
27472062f5744557e270a38192554c3126ea5f97434Tim Northover/// FIXME: currently the algorithm is a completely unoptimised linear
27572062f5744557e270a38192554c3126ea5f97434Tim Northover/// search. Obviously this could be improved, but we would probably want to work
27672062f5744557e270a38192554c3126ea5f97434Tim Northover/// out just how often these instructions are emitted before working on it. It
27772062f5744557e270a38192554c3126ea5f97434Tim Northover/// might even be optimal to just reorder the tables for the common instructions
27872062f5744557e270a38192554c3126ea5f97434Tim Northover/// rather than changing the algorithm.
279dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstruct AArch64NamedImmMapper {
28072062f5744557e270a38192554c3126ea5f97434Tim Northover  struct Mapping {
28172062f5744557e270a38192554c3126ea5f97434Tim Northover    const char *Name;
28272062f5744557e270a38192554c3126ea5f97434Tim Northover    uint32_t Value;
28372062f5744557e270a38192554c3126ea5f97434Tim Northover  };
28472062f5744557e270a38192554c3126ea5f97434Tim Northover
28572062f5744557e270a38192554c3126ea5f97434Tim Northover  template<int N>
286dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  AArch64NamedImmMapper(const Mapping (&Pairs)[N], uint32_t TooBigImm)
28772062f5744557e270a38192554c3126ea5f97434Tim Northover    : Pairs(&Pairs[0]), NumPairs(N), TooBigImm(TooBigImm) {}
28872062f5744557e270a38192554c3126ea5f97434Tim Northover
28972062f5744557e270a38192554c3126ea5f97434Tim Northover  StringRef toString(uint32_t Value, bool &Valid) const;
29072062f5744557e270a38192554c3126ea5f97434Tim Northover  uint32_t fromString(StringRef Name, bool &Valid) const;
29172062f5744557e270a38192554c3126ea5f97434Tim Northover
29272062f5744557e270a38192554c3126ea5f97434Tim Northover  /// Many of the instructions allow an alternative assembly form consisting of
29372062f5744557e270a38192554c3126ea5f97434Tim Northover  /// a simple immediate. Currently the only valid forms are ranges [0, N) where
29472062f5744557e270a38192554c3126ea5f97434Tim Northover  /// N being 0 indicates no immediate syntax-form is allowed.
29572062f5744557e270a38192554c3126ea5f97434Tim Northover  bool validImm(uint32_t Value) const;
29672062f5744557e270a38192554c3126ea5f97434Tim Northoverprotected:
29772062f5744557e270a38192554c3126ea5f97434Tim Northover  const Mapping *Pairs;
29872062f5744557e270a38192554c3126ea5f97434Tim Northover  size_t NumPairs;
29972062f5744557e270a38192554c3126ea5f97434Tim Northover  uint32_t TooBigImm;
30072062f5744557e270a38192554c3126ea5f97434Tim Northover};
30172062f5744557e270a38192554c3126ea5f97434Tim Northover
302dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace AArch64AT {
30372062f5744557e270a38192554c3126ea5f97434Tim Northover  enum ATValues {
30472062f5744557e270a38192554c3126ea5f97434Tim Northover    Invalid = -1,    // Op0 Op1  CRn   CRm   Op2
30572062f5744557e270a38192554c3126ea5f97434Tim Northover    S1E1R = 0x43c0,  // 01  000  0111  1000  000
30672062f5744557e270a38192554c3126ea5f97434Tim Northover    S1E2R = 0x63c0,  // 01  100  0111  1000  000
30772062f5744557e270a38192554c3126ea5f97434Tim Northover    S1E3R = 0x73c0,  // 01  110  0111  1000  000
30872062f5744557e270a38192554c3126ea5f97434Tim Northover    S1E1W = 0x43c1,  // 01  000  0111  1000  001
30972062f5744557e270a38192554c3126ea5f97434Tim Northover    S1E2W = 0x63c1,  // 01  100  0111  1000  001
31072062f5744557e270a38192554c3126ea5f97434Tim Northover    S1E3W = 0x73c1,  // 01  110  0111  1000  001
31172062f5744557e270a38192554c3126ea5f97434Tim Northover    S1E0R = 0x43c2,  // 01  000  0111  1000  010
31272062f5744557e270a38192554c3126ea5f97434Tim Northover    S1E0W = 0x43c3,  // 01  000  0111  1000  011
31372062f5744557e270a38192554c3126ea5f97434Tim Northover    S12E1R = 0x63c4, // 01  100  0111  1000  100
31472062f5744557e270a38192554c3126ea5f97434Tim Northover    S12E1W = 0x63c5, // 01  100  0111  1000  101
31572062f5744557e270a38192554c3126ea5f97434Tim Northover    S12E0R = 0x63c6, // 01  100  0111  1000  110
31672062f5744557e270a38192554c3126ea5f97434Tim Northover    S12E0W = 0x63c7  // 01  100  0111  1000  111
31772062f5744557e270a38192554c3126ea5f97434Tim Northover  };
31872062f5744557e270a38192554c3126ea5f97434Tim Northover
319dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  struct ATMapper : AArch64NamedImmMapper {
32072062f5744557e270a38192554c3126ea5f97434Tim Northover    const static Mapping ATPairs[];
32172062f5744557e270a38192554c3126ea5f97434Tim Northover
32272062f5744557e270a38192554c3126ea5f97434Tim Northover    ATMapper();
32372062f5744557e270a38192554c3126ea5f97434Tim Northover  };
32472062f5744557e270a38192554c3126ea5f97434Tim Northover
32572062f5744557e270a38192554c3126ea5f97434Tim Northover}
326dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace AArch64DB {
32772062f5744557e270a38192554c3126ea5f97434Tim Northover  enum DBValues {
32872062f5744557e270a38192554c3126ea5f97434Tim Northover    Invalid = -1,
32972062f5744557e270a38192554c3126ea5f97434Tim Northover    OSHLD = 0x1,
33072062f5744557e270a38192554c3126ea5f97434Tim Northover    OSHST = 0x2,
33172062f5744557e270a38192554c3126ea5f97434Tim Northover    OSH =   0x3,
33272062f5744557e270a38192554c3126ea5f97434Tim Northover    NSHLD = 0x5,
33372062f5744557e270a38192554c3126ea5f97434Tim Northover    NSHST = 0x6,
33472062f5744557e270a38192554c3126ea5f97434Tim Northover    NSH =   0x7,
33572062f5744557e270a38192554c3126ea5f97434Tim Northover    ISHLD = 0x9,
33672062f5744557e270a38192554c3126ea5f97434Tim Northover    ISHST = 0xa,
33772062f5744557e270a38192554c3126ea5f97434Tim Northover    ISH =   0xb,
33872062f5744557e270a38192554c3126ea5f97434Tim Northover    LD =    0xd,
33972062f5744557e270a38192554c3126ea5f97434Tim Northover    ST =    0xe,
34072062f5744557e270a38192554c3126ea5f97434Tim Northover    SY =    0xf
34172062f5744557e270a38192554c3126ea5f97434Tim Northover  };
34272062f5744557e270a38192554c3126ea5f97434Tim Northover
343dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  struct DBarrierMapper : AArch64NamedImmMapper {
34472062f5744557e270a38192554c3126ea5f97434Tim Northover    const static Mapping DBarrierPairs[];
34572062f5744557e270a38192554c3126ea5f97434Tim Northover
34672062f5744557e270a38192554c3126ea5f97434Tim Northover    DBarrierMapper();
34772062f5744557e270a38192554c3126ea5f97434Tim Northover  };
34872062f5744557e270a38192554c3126ea5f97434Tim Northover}
34972062f5744557e270a38192554c3126ea5f97434Tim Northover
350dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace  AArch64DC {
35172062f5744557e270a38192554c3126ea5f97434Tim Northover  enum DCValues {
35272062f5744557e270a38192554c3126ea5f97434Tim Northover    Invalid = -1,   // Op1  CRn   CRm   Op2
35372062f5744557e270a38192554c3126ea5f97434Tim Northover    ZVA   = 0x5ba1, // 01  011  0111  0100  001
35472062f5744557e270a38192554c3126ea5f97434Tim Northover    IVAC  = 0x43b1, // 01  000  0111  0110  001
35572062f5744557e270a38192554c3126ea5f97434Tim Northover    ISW   = 0x43b2, // 01  000  0111  0110  010
35672062f5744557e270a38192554c3126ea5f97434Tim Northover    CVAC  = 0x5bd1, // 01  011  0111  1010  001
35772062f5744557e270a38192554c3126ea5f97434Tim Northover    CSW   = 0x43d2, // 01  000  0111  1010  010
35872062f5744557e270a38192554c3126ea5f97434Tim Northover    CVAU  = 0x5bd9, // 01  011  0111  1011  001
35972062f5744557e270a38192554c3126ea5f97434Tim Northover    CIVAC = 0x5bf1, // 01  011  0111  1110  001
36072062f5744557e270a38192554c3126ea5f97434Tim Northover    CISW  = 0x43f2  // 01  000  0111  1110  010
36172062f5744557e270a38192554c3126ea5f97434Tim Northover  };
36272062f5744557e270a38192554c3126ea5f97434Tim Northover
363dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  struct DCMapper : AArch64NamedImmMapper {
36472062f5744557e270a38192554c3126ea5f97434Tim Northover    const static Mapping DCPairs[];
36572062f5744557e270a38192554c3126ea5f97434Tim Northover
36672062f5744557e270a38192554c3126ea5f97434Tim Northover    DCMapper();
36772062f5744557e270a38192554c3126ea5f97434Tim Northover  };
36872062f5744557e270a38192554c3126ea5f97434Tim Northover
36972062f5744557e270a38192554c3126ea5f97434Tim Northover}
37072062f5744557e270a38192554c3126ea5f97434Tim Northover
371dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace  AArch64IC {
37272062f5744557e270a38192554c3126ea5f97434Tim Northover  enum ICValues {
37372062f5744557e270a38192554c3126ea5f97434Tim Northover    Invalid = -1,     // Op1  CRn   CRm   Op2
37472062f5744557e270a38192554c3126ea5f97434Tim Northover    IALLUIS = 0x0388, // 000  0111  0001  000
37572062f5744557e270a38192554c3126ea5f97434Tim Northover    IALLU = 0x03a8,   // 000  0111  0101  000
37672062f5744557e270a38192554c3126ea5f97434Tim Northover    IVAU = 0x1ba9     // 011  0111  0101  001
37772062f5744557e270a38192554c3126ea5f97434Tim Northover  };
37872062f5744557e270a38192554c3126ea5f97434Tim Northover
37972062f5744557e270a38192554c3126ea5f97434Tim Northover
380dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  struct ICMapper : AArch64NamedImmMapper {
38172062f5744557e270a38192554c3126ea5f97434Tim Northover    const static Mapping ICPairs[];
38272062f5744557e270a38192554c3126ea5f97434Tim Northover
38372062f5744557e270a38192554c3126ea5f97434Tim Northover    ICMapper();
38472062f5744557e270a38192554c3126ea5f97434Tim Northover  };
38572062f5744557e270a38192554c3126ea5f97434Tim Northover
38672062f5744557e270a38192554c3126ea5f97434Tim Northover  static inline bool NeedsRegister(ICValues Val) {
38772062f5744557e270a38192554c3126ea5f97434Tim Northover    return Val == IVAU;
38872062f5744557e270a38192554c3126ea5f97434Tim Northover  }
38972062f5744557e270a38192554c3126ea5f97434Tim Northover}
39072062f5744557e270a38192554c3126ea5f97434Tim Northover
391dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace  AArch64ISB {
39272062f5744557e270a38192554c3126ea5f97434Tim Northover  enum ISBValues {
39372062f5744557e270a38192554c3126ea5f97434Tim Northover    Invalid = -1,
39472062f5744557e270a38192554c3126ea5f97434Tim Northover    SY = 0xf
39572062f5744557e270a38192554c3126ea5f97434Tim Northover  };
396dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  struct ISBMapper : AArch64NamedImmMapper {
39772062f5744557e270a38192554c3126ea5f97434Tim Northover    const static Mapping ISBPairs[];
39872062f5744557e270a38192554c3126ea5f97434Tim Northover
39972062f5744557e270a38192554c3126ea5f97434Tim Northover    ISBMapper();
40072062f5744557e270a38192554c3126ea5f97434Tim Northover  };
40172062f5744557e270a38192554c3126ea5f97434Tim Northover}
40272062f5744557e270a38192554c3126ea5f97434Tim Northover
403dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace AArch64PRFM {
40472062f5744557e270a38192554c3126ea5f97434Tim Northover  enum PRFMValues {
40572062f5744557e270a38192554c3126ea5f97434Tim Northover    Invalid = -1,
40672062f5744557e270a38192554c3126ea5f97434Tim Northover    PLDL1KEEP = 0x00,
40772062f5744557e270a38192554c3126ea5f97434Tim Northover    PLDL1STRM = 0x01,
40872062f5744557e270a38192554c3126ea5f97434Tim Northover    PLDL2KEEP = 0x02,
40972062f5744557e270a38192554c3126ea5f97434Tim Northover    PLDL2STRM = 0x03,
41072062f5744557e270a38192554c3126ea5f97434Tim Northover    PLDL3KEEP = 0x04,
41172062f5744557e270a38192554c3126ea5f97434Tim Northover    PLDL3STRM = 0x05,
4129e3b31345f0d17b757e183a8384db92616256926Tim Northover    PLIL1KEEP = 0x08,
4139e3b31345f0d17b757e183a8384db92616256926Tim Northover    PLIL1STRM = 0x09,
4149e3b31345f0d17b757e183a8384db92616256926Tim Northover    PLIL2KEEP = 0x0a,
4159e3b31345f0d17b757e183a8384db92616256926Tim Northover    PLIL2STRM = 0x0b,
4169e3b31345f0d17b757e183a8384db92616256926Tim Northover    PLIL3KEEP = 0x0c,
4179e3b31345f0d17b757e183a8384db92616256926Tim Northover    PLIL3STRM = 0x0d,
41872062f5744557e270a38192554c3126ea5f97434Tim Northover    PSTL1KEEP = 0x10,
41972062f5744557e270a38192554c3126ea5f97434Tim Northover    PSTL1STRM = 0x11,
42072062f5744557e270a38192554c3126ea5f97434Tim Northover    PSTL2KEEP = 0x12,
42172062f5744557e270a38192554c3126ea5f97434Tim Northover    PSTL2STRM = 0x13,
42272062f5744557e270a38192554c3126ea5f97434Tim Northover    PSTL3KEEP = 0x14,
42372062f5744557e270a38192554c3126ea5f97434Tim Northover    PSTL3STRM = 0x15
42472062f5744557e270a38192554c3126ea5f97434Tim Northover  };
42572062f5744557e270a38192554c3126ea5f97434Tim Northover
426dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  struct PRFMMapper : AArch64NamedImmMapper {
42772062f5744557e270a38192554c3126ea5f97434Tim Northover    const static Mapping PRFMPairs[];
42872062f5744557e270a38192554c3126ea5f97434Tim Northover
42972062f5744557e270a38192554c3126ea5f97434Tim Northover    PRFMMapper();
43072062f5744557e270a38192554c3126ea5f97434Tim Northover  };
43172062f5744557e270a38192554c3126ea5f97434Tim Northover}
43272062f5744557e270a38192554c3126ea5f97434Tim Northover
433dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace AArch64PState {
43472062f5744557e270a38192554c3126ea5f97434Tim Northover  enum PStateValues {
43572062f5744557e270a38192554c3126ea5f97434Tim Northover    Invalid = -1,
43672062f5744557e270a38192554c3126ea5f97434Tim Northover    SPSel = 0x05,
43772062f5744557e270a38192554c3126ea5f97434Tim Northover    DAIFSet = 0x1e,
43872062f5744557e270a38192554c3126ea5f97434Tim Northover    DAIFClr = 0x1f
43972062f5744557e270a38192554c3126ea5f97434Tim Northover  };
44072062f5744557e270a38192554c3126ea5f97434Tim Northover
441dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  struct PStateMapper : AArch64NamedImmMapper {
44272062f5744557e270a38192554c3126ea5f97434Tim Northover    const static Mapping PStatePairs[];
44372062f5744557e270a38192554c3126ea5f97434Tim Northover
44472062f5744557e270a38192554c3126ea5f97434Tim Northover    PStateMapper();
44572062f5744557e270a38192554c3126ea5f97434Tim Northover  };
44672062f5744557e270a38192554c3126ea5f97434Tim Northover
44772062f5744557e270a38192554c3126ea5f97434Tim Northover}
44872062f5744557e270a38192554c3126ea5f97434Tim Northover
449dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace AArch64SE {
45072062f5744557e270a38192554c3126ea5f97434Tim Northover    enum ShiftExtSpecifiers {
45172062f5744557e270a38192554c3126ea5f97434Tim Northover        Invalid = -1,
45272062f5744557e270a38192554c3126ea5f97434Tim Northover        LSL,
45387773c318fcee853fb34a80a10c4347d523bdafbTim Northover        MSL,
45472062f5744557e270a38192554c3126ea5f97434Tim Northover        LSR,
45572062f5744557e270a38192554c3126ea5f97434Tim Northover        ASR,
45672062f5744557e270a38192554c3126ea5f97434Tim Northover        ROR,
45772062f5744557e270a38192554c3126ea5f97434Tim Northover
45872062f5744557e270a38192554c3126ea5f97434Tim Northover        UXTB,
45972062f5744557e270a38192554c3126ea5f97434Tim Northover        UXTH,
46072062f5744557e270a38192554c3126ea5f97434Tim Northover        UXTW,
46172062f5744557e270a38192554c3126ea5f97434Tim Northover        UXTX,
46272062f5744557e270a38192554c3126ea5f97434Tim Northover
46372062f5744557e270a38192554c3126ea5f97434Tim Northover        SXTB,
46472062f5744557e270a38192554c3126ea5f97434Tim Northover        SXTH,
46572062f5744557e270a38192554c3126ea5f97434Tim Northover        SXTW,
46672062f5744557e270a38192554c3126ea5f97434Tim Northover        SXTX
46772062f5744557e270a38192554c3126ea5f97434Tim Northover    };
46872062f5744557e270a38192554c3126ea5f97434Tim Northover}
46972062f5744557e270a38192554c3126ea5f97434Tim Northover
470dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace AArch64Layout {
4716a5a667517160ca1b557002a29d08868ae029451Hao Liu    enum VectorLayout {
4726a5a667517160ca1b557002a29d08868ae029451Hao Liu        Invalid = -1,
4739add5c2d4b282f7cae583ece5cea3f83d33c488bBill Wendling        VL_8B,
4749add5c2d4b282f7cae583ece5cea3f83d33c488bBill Wendling        VL_4H,
4759add5c2d4b282f7cae583ece5cea3f83d33c488bBill Wendling        VL_2S,
4769add5c2d4b282f7cae583ece5cea3f83d33c488bBill Wendling        VL_1D,
4776a5a667517160ca1b557002a29d08868ae029451Hao Liu
4789add5c2d4b282f7cae583ece5cea3f83d33c488bBill Wendling        VL_16B,
4799add5c2d4b282f7cae583ece5cea3f83d33c488bBill Wendling        VL_8H,
4809add5c2d4b282f7cae583ece5cea3f83d33c488bBill Wendling        VL_4S,
4819add5c2d4b282f7cae583ece5cea3f83d33c488bBill Wendling        VL_2D,
48236c7806f4eacd676932ba630246f88e0e37b1cd4Hao Liu
48336c7806f4eacd676932ba630246f88e0e37b1cd4Hao Liu        // Bare layout for the 128-bit vector
48436c7806f4eacd676932ba630246f88e0e37b1cd4Hao Liu        // (only show ".b", ".h", ".s", ".d" without vector number)
4859add5c2d4b282f7cae583ece5cea3f83d33c488bBill Wendling        VL_B,
4869add5c2d4b282f7cae583ece5cea3f83d33c488bBill Wendling        VL_H,
4879add5c2d4b282f7cae583ece5cea3f83d33c488bBill Wendling        VL_S,
4889add5c2d4b282f7cae583ece5cea3f83d33c488bBill Wendling        VL_D
4896a5a667517160ca1b557002a29d08868ae029451Hao Liu    };
4906a5a667517160ca1b557002a29d08868ae029451Hao Liu}
4916a5a667517160ca1b557002a29d08868ae029451Hao Liu
4926a5a667517160ca1b557002a29d08868ae029451Hao Liuinline static const char *
493dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesAArch64VectorLayoutToString(AArch64Layout::VectorLayout Layout) {
4946a5a667517160ca1b557002a29d08868ae029451Hao Liu  switch (Layout) {
495dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64Layout::VL_8B:  return ".8b";
496dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64Layout::VL_4H:  return ".4h";
497dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64Layout::VL_2S:  return ".2s";
498dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64Layout::VL_1D:  return ".1d";
499dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64Layout::VL_16B:  return ".16b";
500dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64Layout::VL_8H:  return ".8h";
501dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64Layout::VL_4S:  return ".4s";
502dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64Layout::VL_2D:  return ".2d";
503dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64Layout::VL_B:  return ".b";
504dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64Layout::VL_H:  return ".h";
505dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64Layout::VL_S:  return ".s";
506dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case AArch64Layout::VL_D:  return ".d";
5076a5a667517160ca1b557002a29d08868ae029451Hao Liu  default: llvm_unreachable("Unknown Vector Layout");
5086a5a667517160ca1b557002a29d08868ae029451Hao Liu  }
5096a5a667517160ca1b557002a29d08868ae029451Hao Liu}
5106a5a667517160ca1b557002a29d08868ae029451Hao Liu
511dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesinline static AArch64Layout::VectorLayout
512dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesAArch64StringToVectorLayout(StringRef LayoutStr) {
513dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return StringSwitch<AArch64Layout::VectorLayout>(LayoutStr)
514dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Case(".8b", AArch64Layout::VL_8B)
515dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Case(".4h", AArch64Layout::VL_4H)
516dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Case(".2s", AArch64Layout::VL_2S)
517dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Case(".1d", AArch64Layout::VL_1D)
518dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Case(".16b", AArch64Layout::VL_16B)
519dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Case(".8h", AArch64Layout::VL_8H)
520dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Case(".4s", AArch64Layout::VL_4S)
521dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Case(".2d", AArch64Layout::VL_2D)
522dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Case(".b", AArch64Layout::VL_B)
523dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Case(".h", AArch64Layout::VL_H)
524dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Case(".s", AArch64Layout::VL_S)
525dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Case(".d", AArch64Layout::VL_D)
526dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             .Default(AArch64Layout::Invalid);
5276a5a667517160ca1b557002a29d08868ae029451Hao Liu}
5286a5a667517160ca1b557002a29d08868ae029451Hao Liu
529dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace AArch64SysReg {
53072062f5744557e270a38192554c3126ea5f97434Tim Northover  enum SysRegROValues {
53172062f5744557e270a38192554c3126ea5f97434Tim Northover    MDCCSR_EL0        = 0x9808, // 10  011  0000  0001  000
53272062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGDTRRX_EL0      = 0x9828, // 10  011  0000  0101  000
53372062f5744557e270a38192554c3126ea5f97434Tim Northover    MDRAR_EL1         = 0x8080, // 10  000  0001  0000  000
53472062f5744557e270a38192554c3126ea5f97434Tim Northover    OSLSR_EL1         = 0x808c, // 10  000  0001  0001  100
53572062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGAUTHSTATUS_EL1 = 0x83f6, // 10  000  0111  1110  110
53672062f5744557e270a38192554c3126ea5f97434Tim Northover    PMCEID0_EL0       = 0xdce6, // 11  011  1001  1100  110
53772062f5744557e270a38192554c3126ea5f97434Tim Northover    PMCEID1_EL0       = 0xdce7, // 11  011  1001  1100  111
53872062f5744557e270a38192554c3126ea5f97434Tim Northover    MIDR_EL1          = 0xc000, // 11  000  0000  0000  000
53972062f5744557e270a38192554c3126ea5f97434Tim Northover    CCSIDR_EL1        = 0xc800, // 11  001  0000  0000  000
54072062f5744557e270a38192554c3126ea5f97434Tim Northover    CLIDR_EL1         = 0xc801, // 11  001  0000  0000  001
54172062f5744557e270a38192554c3126ea5f97434Tim Northover    CTR_EL0           = 0xd801, // 11  011  0000  0000  001
54272062f5744557e270a38192554c3126ea5f97434Tim Northover    MPIDR_EL1         = 0xc005, // 11  000  0000  0000  101
54372062f5744557e270a38192554c3126ea5f97434Tim Northover    REVIDR_EL1        = 0xc006, // 11  000  0000  0000  110
54472062f5744557e270a38192554c3126ea5f97434Tim Northover    AIDR_EL1          = 0xc807, // 11  001  0000  0000  111
54572062f5744557e270a38192554c3126ea5f97434Tim Northover    DCZID_EL0         = 0xd807, // 11  011  0000  0000  111
54672062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_PFR0_EL1       = 0xc008, // 11  000  0000  0001  000
54772062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_PFR1_EL1       = 0xc009, // 11  000  0000  0001  001
54872062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_DFR0_EL1       = 0xc00a, // 11  000  0000  0001  010
54972062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_AFR0_EL1       = 0xc00b, // 11  000  0000  0001  011
55072062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_MMFR0_EL1      = 0xc00c, // 11  000  0000  0001  100
55172062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_MMFR1_EL1      = 0xc00d, // 11  000  0000  0001  101
55272062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_MMFR2_EL1      = 0xc00e, // 11  000  0000  0001  110
55372062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_MMFR3_EL1      = 0xc00f, // 11  000  0000  0001  111
55472062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_ISAR0_EL1      = 0xc010, // 11  000  0000  0010  000
55572062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_ISAR1_EL1      = 0xc011, // 11  000  0000  0010  001
55672062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_ISAR2_EL1      = 0xc012, // 11  000  0000  0010  010
55772062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_ISAR3_EL1      = 0xc013, // 11  000  0000  0010  011
55872062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_ISAR4_EL1      = 0xc014, // 11  000  0000  0010  100
55972062f5744557e270a38192554c3126ea5f97434Tim Northover    ID_ISAR5_EL1      = 0xc015, // 11  000  0000  0010  101
560dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ID_A64PFR0_EL1    = 0xc020, // 11  000  0000  0100  000
561dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ID_A64PFR1_EL1    = 0xc021, // 11  000  0000  0100  001
562dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ID_A64DFR0_EL1    = 0xc028, // 11  000  0000  0101  000
563dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ID_A64DFR1_EL1    = 0xc029, // 11  000  0000  0101  001
564dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ID_A64AFR0_EL1    = 0xc02c, // 11  000  0000  0101  100
565dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ID_A64AFR1_EL1    = 0xc02d, // 11  000  0000  0101  101
566dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ID_A64ISAR0_EL1   = 0xc030, // 11  000  0000  0110  000
567dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ID_A64ISAR1_EL1   = 0xc031, // 11  000  0000  0110  001
568dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ID_A64MMFR0_EL1   = 0xc038, // 11  000  0000  0111  000
569dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ID_A64MMFR1_EL1   = 0xc039, // 11  000  0000  0111  001
57072062f5744557e270a38192554c3126ea5f97434Tim Northover    MVFR0_EL1         = 0xc018, // 11  000  0000  0011  000
57172062f5744557e270a38192554c3126ea5f97434Tim Northover    MVFR1_EL1         = 0xc019, // 11  000  0000  0011  001
57272062f5744557e270a38192554c3126ea5f97434Tim Northover    MVFR2_EL1         = 0xc01a, // 11  000  0000  0011  010
57372062f5744557e270a38192554c3126ea5f97434Tim Northover    RVBAR_EL1         = 0xc601, // 11  000  1100  0000  001
57472062f5744557e270a38192554c3126ea5f97434Tim Northover    RVBAR_EL2         = 0xe601, // 11  100  1100  0000  001
57572062f5744557e270a38192554c3126ea5f97434Tim Northover    RVBAR_EL3         = 0xf601, // 11  110  1100  0000  001
57672062f5744557e270a38192554c3126ea5f97434Tim Northover    ISR_EL1           = 0xc608, // 11  000  1100  0001  000
57772062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTPCT_EL0        = 0xdf01, // 11  011  1110  0000  001
57842a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    CNTVCT_EL0        = 0xdf02,  // 11  011  1110  0000  010
57942a1b2f0b196633c0327801e810fc98849a00c47Tim Northover
5804385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    // Trace registers
5814385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSTATR          = 0x8818, // 10  001  0000  0011  000
5824385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR8           = 0x8806, // 10  001  0000  0000  110
5834385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR9           = 0x880e, // 10  001  0000  0001  110
5844385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR10          = 0x8816, // 10  001  0000  0010  110
5854385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR11          = 0x881e, // 10  001  0000  0011  110
5864385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR12          = 0x8826, // 10  001  0000  0100  110
5874385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR13          = 0x882e, // 10  001  0000  0101  110
5884385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR0           = 0x8847, // 10  001  0000  1000  111
5894385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR1           = 0x884f, // 10  001  0000  1001  111
5904385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR2           = 0x8857, // 10  001  0000  1010  111
5914385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR3           = 0x885f, // 10  001  0000  1011  111
5924385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR4           = 0x8867, // 10  001  0000  1100  111
5934385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR5           = 0x886f, // 10  001  0000  1101  111
5944385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR6           = 0x8877, // 10  001  0000  1110  111
5954385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIDR7           = 0x887f, // 10  001  0000  1111  111
5964385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCOSLSR          = 0x888c, // 10  001  0001  0001  100
5974385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCPDSR           = 0x88ac, // 10  001  0001  0101  100
5984385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDEVAFF0        = 0x8bd6, // 10  001  0111  1010  110
5994385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDEVAFF1        = 0x8bde, // 10  001  0111  1011  110
6004385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCLSR            = 0x8bee, // 10  001  0111  1101  110
6014385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCAUTHSTATUS     = 0x8bf6, // 10  001  0111  1110  110
6024385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDEVARCH        = 0x8bfe, // 10  001  0111  1111  110
6034385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDEVID          = 0x8b97, // 10  001  0111  0010  111
6044385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDEVTYPE        = 0x8b9f, // 10  001  0111  0011  111
6054385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCPIDR4          = 0x8ba7, // 10  001  0111  0100  111
6064385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCPIDR5          = 0x8baf, // 10  001  0111  0101  111
6074385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCPIDR6          = 0x8bb7, // 10  001  0111  0110  111
6084385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCPIDR7          = 0x8bbf, // 10  001  0111  0111  111
6094385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCPIDR0          = 0x8bc7, // 10  001  0111  1000  111
6104385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCPIDR1          = 0x8bcf, // 10  001  0111  1001  111
6114385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCPIDR2          = 0x8bd7, // 10  001  0111  1010  111
6124385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCPIDR3          = 0x8bdf, // 10  001  0111  1011  111
6134385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDR0          = 0x8be7, // 10  001  0111  1100  111
6144385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDR1          = 0x8bef, // 10  001  0111  1101  111
6154385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDR2          = 0x8bf7, // 10  001  0111  1110  111
6164385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDR3          = 0x8bff, // 10  001  0111  1111  111
6174385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover
61842a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    // GICv3 registers
61942a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_IAR1_EL1      = 0xc660, // 11  000  1100  1100  000
62042a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_IAR0_EL1      = 0xc640, // 11  000  1100  1000  000
62142a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_HPPIR1_EL1    = 0xc662, // 11  000  1100  1100  010
62242a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_HPPIR0_EL1    = 0xc642, // 11  000  1100  1000  010
62342a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_RPR_EL1       = 0xc65b, // 11  000  1100  1011  011
62442a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_VTR_EL2       = 0xe659, // 11  100  1100  1011  001
62542a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_EISR_EL2      = 0xe65b, // 11  100  1100  1011  011
62642a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_ELSR_EL2      = 0xe65d  // 11  100  1100  1011  101
62772062f5744557e270a38192554c3126ea5f97434Tim Northover  };
62872062f5744557e270a38192554c3126ea5f97434Tim Northover
62972062f5744557e270a38192554c3126ea5f97434Tim Northover  enum SysRegWOValues {
63072062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGDTRTX_EL0      = 0x9828, // 10  011  0000  0101  000
63172062f5744557e270a38192554c3126ea5f97434Tim Northover    OSLAR_EL1         = 0x8084, // 10  000  0001  0000  100
63242a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    PMSWINC_EL0       = 0xdce4,  // 11  011  1001  1100  100
63342a1b2f0b196633c0327801e810fc98849a00c47Tim Northover
6344385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    // Trace Registers
6354385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCOSLAR          = 0x8884, // 10  001  0001  0000  100
6364385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCLAR            = 0x8be6, // 10  001  0111  1100  110
6374385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover
63842a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    // GICv3 registers
63942a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_EOIR1_EL1     = 0xc661, // 11  000  1100  1100  001
64042a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_EOIR0_EL1     = 0xc641, // 11  000  1100  1000  001
64142a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_DIR_EL1       = 0xc659, // 11  000  1100  1011  001
64242a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_SGI1R_EL1     = 0xc65d, // 11  000  1100  1011  101
64342a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_ASGI1R_EL1    = 0xc65e, // 11  000  1100  1011  110
64442a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_SGI0R_EL1     = 0xc65f  // 11  000  1100  1011  111
64572062f5744557e270a38192554c3126ea5f97434Tim Northover  };
64672062f5744557e270a38192554c3126ea5f97434Tim Northover
64772062f5744557e270a38192554c3126ea5f97434Tim Northover  enum SysRegValues {
64872062f5744557e270a38192554c3126ea5f97434Tim Northover    Invalid = -1,               // Op0 Op1  CRn   CRm   Op2
64972062f5744557e270a38192554c3126ea5f97434Tim Northover    OSDTRRX_EL1       = 0x8002, // 10  000  0000  0000  010
65072062f5744557e270a38192554c3126ea5f97434Tim Northover    OSDTRTX_EL1       = 0x801a, // 10  000  0000  0011  010
65172062f5744557e270a38192554c3126ea5f97434Tim Northover    TEECR32_EL1       = 0x9000, // 10  010  0000  0000  000
65272062f5744557e270a38192554c3126ea5f97434Tim Northover    MDCCINT_EL1       = 0x8010, // 10  000  0000  0010  000
65372062f5744557e270a38192554c3126ea5f97434Tim Northover    MDSCR_EL1         = 0x8012, // 10  000  0000  0010  010
65472062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGDTR_EL0        = 0x9820, // 10  011  0000  0100  000
65572062f5744557e270a38192554c3126ea5f97434Tim Northover    OSECCR_EL1        = 0x8032, // 10  000  0000  0110  010
65672062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGVCR32_EL2      = 0xa038, // 10  100  0000  0111  000
65772062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR0_EL1       = 0x8004, // 10  000  0000  0000  100
65872062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR1_EL1       = 0x800c, // 10  000  0000  0001  100
65972062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR2_EL1       = 0x8014, // 10  000  0000  0010  100
66072062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR3_EL1       = 0x801c, // 10  000  0000  0011  100
66172062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR4_EL1       = 0x8024, // 10  000  0000  0100  100
66272062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR5_EL1       = 0x802c, // 10  000  0000  0101  100
66372062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR6_EL1       = 0x8034, // 10  000  0000  0110  100
66472062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR7_EL1       = 0x803c, // 10  000  0000  0111  100
66572062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR8_EL1       = 0x8044, // 10  000  0000  1000  100
66672062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR9_EL1       = 0x804c, // 10  000  0000  1001  100
66772062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR10_EL1      = 0x8054, // 10  000  0000  1010  100
66872062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR11_EL1      = 0x805c, // 10  000  0000  1011  100
66972062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR12_EL1      = 0x8064, // 10  000  0000  1100  100
67072062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR13_EL1      = 0x806c, // 10  000  0000  1101  100
67172062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR14_EL1      = 0x8074, // 10  000  0000  1110  100
67272062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBVR15_EL1      = 0x807c, // 10  000  0000  1111  100
67372062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR0_EL1       = 0x8005, // 10  000  0000  0000  101
67472062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR1_EL1       = 0x800d, // 10  000  0000  0001  101
67572062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR2_EL1       = 0x8015, // 10  000  0000  0010  101
67672062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR3_EL1       = 0x801d, // 10  000  0000  0011  101
67772062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR4_EL1       = 0x8025, // 10  000  0000  0100  101
67872062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR5_EL1       = 0x802d, // 10  000  0000  0101  101
67972062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR6_EL1       = 0x8035, // 10  000  0000  0110  101
68072062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR7_EL1       = 0x803d, // 10  000  0000  0111  101
68172062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR8_EL1       = 0x8045, // 10  000  0000  1000  101
68272062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR9_EL1       = 0x804d, // 10  000  0000  1001  101
68372062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR10_EL1      = 0x8055, // 10  000  0000  1010  101
68472062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR11_EL1      = 0x805d, // 10  000  0000  1011  101
68572062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR12_EL1      = 0x8065, // 10  000  0000  1100  101
68672062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR13_EL1      = 0x806d, // 10  000  0000  1101  101
68772062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR14_EL1      = 0x8075, // 10  000  0000  1110  101
68872062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGBCR15_EL1      = 0x807d, // 10  000  0000  1111  101
68972062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR0_EL1       = 0x8006, // 10  000  0000  0000  110
69072062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR1_EL1       = 0x800e, // 10  000  0000  0001  110
69172062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR2_EL1       = 0x8016, // 10  000  0000  0010  110
69272062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR3_EL1       = 0x801e, // 10  000  0000  0011  110
69372062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR4_EL1       = 0x8026, // 10  000  0000  0100  110
69472062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR5_EL1       = 0x802e, // 10  000  0000  0101  110
69572062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR6_EL1       = 0x8036, // 10  000  0000  0110  110
69672062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR7_EL1       = 0x803e, // 10  000  0000  0111  110
69772062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR8_EL1       = 0x8046, // 10  000  0000  1000  110
69872062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR9_EL1       = 0x804e, // 10  000  0000  1001  110
69972062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR10_EL1      = 0x8056, // 10  000  0000  1010  110
70072062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR11_EL1      = 0x805e, // 10  000  0000  1011  110
70172062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR12_EL1      = 0x8066, // 10  000  0000  1100  110
70272062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR13_EL1      = 0x806e, // 10  000  0000  1101  110
70372062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR14_EL1      = 0x8076, // 10  000  0000  1110  110
70472062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWVR15_EL1      = 0x807e, // 10  000  0000  1111  110
70572062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR0_EL1       = 0x8007, // 10  000  0000  0000  111
70672062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR1_EL1       = 0x800f, // 10  000  0000  0001  111
70772062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR2_EL1       = 0x8017, // 10  000  0000  0010  111
70872062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR3_EL1       = 0x801f, // 10  000  0000  0011  111
70972062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR4_EL1       = 0x8027, // 10  000  0000  0100  111
71072062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR5_EL1       = 0x802f, // 10  000  0000  0101  111
71172062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR6_EL1       = 0x8037, // 10  000  0000  0110  111
71272062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR7_EL1       = 0x803f, // 10  000  0000  0111  111
71372062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR8_EL1       = 0x8047, // 10  000  0000  1000  111
71472062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR9_EL1       = 0x804f, // 10  000  0000  1001  111
71572062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR10_EL1      = 0x8057, // 10  000  0000  1010  111
71672062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR11_EL1      = 0x805f, // 10  000  0000  1011  111
71772062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR12_EL1      = 0x8067, // 10  000  0000  1100  111
71872062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR13_EL1      = 0x806f, // 10  000  0000  1101  111
71972062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR14_EL1      = 0x8077, // 10  000  0000  1110  111
72072062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGWCR15_EL1      = 0x807f, // 10  000  0000  1111  111
72172062f5744557e270a38192554c3126ea5f97434Tim Northover    TEEHBR32_EL1      = 0x9080, // 10  010  0001  0000  000
72272062f5744557e270a38192554c3126ea5f97434Tim Northover    OSDLR_EL1         = 0x809c, // 10  000  0001  0011  100
72372062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGPRCR_EL1       = 0x80a4, // 10  000  0001  0100  100
72472062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGCLAIMSET_EL1   = 0x83c6, // 10  000  0111  1000  110
72572062f5744557e270a38192554c3126ea5f97434Tim Northover    DBGCLAIMCLR_EL1   = 0x83ce, // 10  000  0111  1001  110
72672062f5744557e270a38192554c3126ea5f97434Tim Northover    CSSELR_EL1        = 0xd000, // 11  010  0000  0000  000
72772062f5744557e270a38192554c3126ea5f97434Tim Northover    VPIDR_EL2         = 0xe000, // 11  100  0000  0000  000
72872062f5744557e270a38192554c3126ea5f97434Tim Northover    VMPIDR_EL2        = 0xe005, // 11  100  0000  0000  101
72972062f5744557e270a38192554c3126ea5f97434Tim Northover    CPACR_EL1         = 0xc082, // 11  000  0001  0000  010
73072062f5744557e270a38192554c3126ea5f97434Tim Northover    SCTLR_EL1         = 0xc080, // 11  000  0001  0000  000
73172062f5744557e270a38192554c3126ea5f97434Tim Northover    SCTLR_EL2         = 0xe080, // 11  100  0001  0000  000
73272062f5744557e270a38192554c3126ea5f97434Tim Northover    SCTLR_EL3         = 0xf080, // 11  110  0001  0000  000
73372062f5744557e270a38192554c3126ea5f97434Tim Northover    ACTLR_EL1         = 0xc081, // 11  000  0001  0000  001
73472062f5744557e270a38192554c3126ea5f97434Tim Northover    ACTLR_EL2         = 0xe081, // 11  100  0001  0000  001
73572062f5744557e270a38192554c3126ea5f97434Tim Northover    ACTLR_EL3         = 0xf081, // 11  110  0001  0000  001
73672062f5744557e270a38192554c3126ea5f97434Tim Northover    HCR_EL2           = 0xe088, // 11  100  0001  0001  000
73772062f5744557e270a38192554c3126ea5f97434Tim Northover    SCR_EL3           = 0xf088, // 11  110  0001  0001  000
73872062f5744557e270a38192554c3126ea5f97434Tim Northover    MDCR_EL2          = 0xe089, // 11  100  0001  0001  001
73972062f5744557e270a38192554c3126ea5f97434Tim Northover    SDER32_EL3        = 0xf089, // 11  110  0001  0001  001
74072062f5744557e270a38192554c3126ea5f97434Tim Northover    CPTR_EL2          = 0xe08a, // 11  100  0001  0001  010
74172062f5744557e270a38192554c3126ea5f97434Tim Northover    CPTR_EL3          = 0xf08a, // 11  110  0001  0001  010
74272062f5744557e270a38192554c3126ea5f97434Tim Northover    HSTR_EL2          = 0xe08b, // 11  100  0001  0001  011
74372062f5744557e270a38192554c3126ea5f97434Tim Northover    HACR_EL2          = 0xe08f, // 11  100  0001  0001  111
74472062f5744557e270a38192554c3126ea5f97434Tim Northover    MDCR_EL3          = 0xf099, // 11  110  0001  0011  001
74572062f5744557e270a38192554c3126ea5f97434Tim Northover    TTBR0_EL1         = 0xc100, // 11  000  0010  0000  000
74672062f5744557e270a38192554c3126ea5f97434Tim Northover    TTBR0_EL2         = 0xe100, // 11  100  0010  0000  000
74772062f5744557e270a38192554c3126ea5f97434Tim Northover    TTBR0_EL3         = 0xf100, // 11  110  0010  0000  000
74872062f5744557e270a38192554c3126ea5f97434Tim Northover    TTBR1_EL1         = 0xc101, // 11  000  0010  0000  001
74972062f5744557e270a38192554c3126ea5f97434Tim Northover    TCR_EL1           = 0xc102, // 11  000  0010  0000  010
75072062f5744557e270a38192554c3126ea5f97434Tim Northover    TCR_EL2           = 0xe102, // 11  100  0010  0000  010
75172062f5744557e270a38192554c3126ea5f97434Tim Northover    TCR_EL3           = 0xf102, // 11  110  0010  0000  010
75272062f5744557e270a38192554c3126ea5f97434Tim Northover    VTTBR_EL2         = 0xe108, // 11  100  0010  0001  000
75372062f5744557e270a38192554c3126ea5f97434Tim Northover    VTCR_EL2          = 0xe10a, // 11  100  0010  0001  010
75472062f5744557e270a38192554c3126ea5f97434Tim Northover    DACR32_EL2        = 0xe180, // 11  100  0011  0000  000
75572062f5744557e270a38192554c3126ea5f97434Tim Northover    SPSR_EL1          = 0xc200, // 11  000  0100  0000  000
75672062f5744557e270a38192554c3126ea5f97434Tim Northover    SPSR_EL2          = 0xe200, // 11  100  0100  0000  000
75772062f5744557e270a38192554c3126ea5f97434Tim Northover    SPSR_EL3          = 0xf200, // 11  110  0100  0000  000
75872062f5744557e270a38192554c3126ea5f97434Tim Northover    ELR_EL1           = 0xc201, // 11  000  0100  0000  001
75972062f5744557e270a38192554c3126ea5f97434Tim Northover    ELR_EL2           = 0xe201, // 11  100  0100  0000  001
76072062f5744557e270a38192554c3126ea5f97434Tim Northover    ELR_EL3           = 0xf201, // 11  110  0100  0000  001
76172062f5744557e270a38192554c3126ea5f97434Tim Northover    SP_EL0            = 0xc208, // 11  000  0100  0001  000
76272062f5744557e270a38192554c3126ea5f97434Tim Northover    SP_EL1            = 0xe208, // 11  100  0100  0001  000
76372062f5744557e270a38192554c3126ea5f97434Tim Northover    SP_EL2            = 0xf208, // 11  110  0100  0001  000
76472062f5744557e270a38192554c3126ea5f97434Tim Northover    SPSel             = 0xc210, // 11  000  0100  0010  000
76572062f5744557e270a38192554c3126ea5f97434Tim Northover    NZCV              = 0xda10, // 11  011  0100  0010  000
76672062f5744557e270a38192554c3126ea5f97434Tim Northover    DAIF              = 0xda11, // 11  011  0100  0010  001
76772062f5744557e270a38192554c3126ea5f97434Tim Northover    CurrentEL         = 0xc212, // 11  000  0100  0010  010
76872062f5744557e270a38192554c3126ea5f97434Tim Northover    SPSR_irq          = 0xe218, // 11  100  0100  0011  000
76972062f5744557e270a38192554c3126ea5f97434Tim Northover    SPSR_abt          = 0xe219, // 11  100  0100  0011  001
77072062f5744557e270a38192554c3126ea5f97434Tim Northover    SPSR_und          = 0xe21a, // 11  100  0100  0011  010
77172062f5744557e270a38192554c3126ea5f97434Tim Northover    SPSR_fiq          = 0xe21b, // 11  100  0100  0011  011
77272062f5744557e270a38192554c3126ea5f97434Tim Northover    FPCR              = 0xda20, // 11  011  0100  0100  000
77372062f5744557e270a38192554c3126ea5f97434Tim Northover    FPSR              = 0xda21, // 11  011  0100  0100  001
77472062f5744557e270a38192554c3126ea5f97434Tim Northover    DSPSR_EL0         = 0xda28, // 11  011  0100  0101  000
77572062f5744557e270a38192554c3126ea5f97434Tim Northover    DLR_EL0           = 0xda29, // 11  011  0100  0101  001
77672062f5744557e270a38192554c3126ea5f97434Tim Northover    IFSR32_EL2        = 0xe281, // 11  100  0101  0000  001
77772062f5744557e270a38192554c3126ea5f97434Tim Northover    AFSR0_EL1         = 0xc288, // 11  000  0101  0001  000
77872062f5744557e270a38192554c3126ea5f97434Tim Northover    AFSR0_EL2         = 0xe288, // 11  100  0101  0001  000
77972062f5744557e270a38192554c3126ea5f97434Tim Northover    AFSR0_EL3         = 0xf288, // 11  110  0101  0001  000
78072062f5744557e270a38192554c3126ea5f97434Tim Northover    AFSR1_EL1         = 0xc289, // 11  000  0101  0001  001
78172062f5744557e270a38192554c3126ea5f97434Tim Northover    AFSR1_EL2         = 0xe289, // 11  100  0101  0001  001
78272062f5744557e270a38192554c3126ea5f97434Tim Northover    AFSR1_EL3         = 0xf289, // 11  110  0101  0001  001
78372062f5744557e270a38192554c3126ea5f97434Tim Northover    ESR_EL1           = 0xc290, // 11  000  0101  0010  000
78472062f5744557e270a38192554c3126ea5f97434Tim Northover    ESR_EL2           = 0xe290, // 11  100  0101  0010  000
78572062f5744557e270a38192554c3126ea5f97434Tim Northover    ESR_EL3           = 0xf290, // 11  110  0101  0010  000
78672062f5744557e270a38192554c3126ea5f97434Tim Northover    FPEXC32_EL2       = 0xe298, // 11  100  0101  0011  000
78772062f5744557e270a38192554c3126ea5f97434Tim Northover    FAR_EL1           = 0xc300, // 11  000  0110  0000  000
78872062f5744557e270a38192554c3126ea5f97434Tim Northover    FAR_EL2           = 0xe300, // 11  100  0110  0000  000
78972062f5744557e270a38192554c3126ea5f97434Tim Northover    FAR_EL3           = 0xf300, // 11  110  0110  0000  000
79072062f5744557e270a38192554c3126ea5f97434Tim Northover    HPFAR_EL2         = 0xe304, // 11  100  0110  0000  100
79172062f5744557e270a38192554c3126ea5f97434Tim Northover    PAR_EL1           = 0xc3a0, // 11  000  0111  0100  000
79272062f5744557e270a38192554c3126ea5f97434Tim Northover    PMCR_EL0          = 0xdce0, // 11  011  1001  1100  000
79372062f5744557e270a38192554c3126ea5f97434Tim Northover    PMCNTENSET_EL0    = 0xdce1, // 11  011  1001  1100  001
79472062f5744557e270a38192554c3126ea5f97434Tim Northover    PMCNTENCLR_EL0    = 0xdce2, // 11  011  1001  1100  010
79572062f5744557e270a38192554c3126ea5f97434Tim Northover    PMOVSCLR_EL0      = 0xdce3, // 11  011  1001  1100  011
79672062f5744557e270a38192554c3126ea5f97434Tim Northover    PMSELR_EL0        = 0xdce5, // 11  011  1001  1100  101
79772062f5744557e270a38192554c3126ea5f97434Tim Northover    PMCCNTR_EL0       = 0xdce8, // 11  011  1001  1101  000
79872062f5744557e270a38192554c3126ea5f97434Tim Northover    PMXEVTYPER_EL0    = 0xdce9, // 11  011  1001  1101  001
79972062f5744557e270a38192554c3126ea5f97434Tim Northover    PMXEVCNTR_EL0     = 0xdcea, // 11  011  1001  1101  010
80072062f5744557e270a38192554c3126ea5f97434Tim Northover    PMUSERENR_EL0     = 0xdcf0, // 11  011  1001  1110  000
80172062f5744557e270a38192554c3126ea5f97434Tim Northover    PMINTENSET_EL1    = 0xc4f1, // 11  000  1001  1110  001
80272062f5744557e270a38192554c3126ea5f97434Tim Northover    PMINTENCLR_EL1    = 0xc4f2, // 11  000  1001  1110  010
80372062f5744557e270a38192554c3126ea5f97434Tim Northover    PMOVSSET_EL0      = 0xdcf3, // 11  011  1001  1110  011
80472062f5744557e270a38192554c3126ea5f97434Tim Northover    MAIR_EL1          = 0xc510, // 11  000  1010  0010  000
80572062f5744557e270a38192554c3126ea5f97434Tim Northover    MAIR_EL2          = 0xe510, // 11  100  1010  0010  000
80672062f5744557e270a38192554c3126ea5f97434Tim Northover    MAIR_EL3          = 0xf510, // 11  110  1010  0010  000
80772062f5744557e270a38192554c3126ea5f97434Tim Northover    AMAIR_EL1         = 0xc518, // 11  000  1010  0011  000
80872062f5744557e270a38192554c3126ea5f97434Tim Northover    AMAIR_EL2         = 0xe518, // 11  100  1010  0011  000
80972062f5744557e270a38192554c3126ea5f97434Tim Northover    AMAIR_EL3         = 0xf518, // 11  110  1010  0011  000
81072062f5744557e270a38192554c3126ea5f97434Tim Northover    VBAR_EL1          = 0xc600, // 11  000  1100  0000  000
81172062f5744557e270a38192554c3126ea5f97434Tim Northover    VBAR_EL2          = 0xe600, // 11  100  1100  0000  000
81272062f5744557e270a38192554c3126ea5f97434Tim Northover    VBAR_EL3          = 0xf600, // 11  110  1100  0000  000
81372062f5744557e270a38192554c3126ea5f97434Tim Northover    RMR_EL1           = 0xc602, // 11  000  1100  0000  010
81472062f5744557e270a38192554c3126ea5f97434Tim Northover    RMR_EL2           = 0xe602, // 11  100  1100  0000  010
81572062f5744557e270a38192554c3126ea5f97434Tim Northover    RMR_EL3           = 0xf602, // 11  110  1100  0000  010
81672062f5744557e270a38192554c3126ea5f97434Tim Northover    CONTEXTIDR_EL1    = 0xc681, // 11  000  1101  0000  001
81772062f5744557e270a38192554c3126ea5f97434Tim Northover    TPIDR_EL0         = 0xde82, // 11  011  1101  0000  010
81872062f5744557e270a38192554c3126ea5f97434Tim Northover    TPIDR_EL2         = 0xe682, // 11  100  1101  0000  010
81972062f5744557e270a38192554c3126ea5f97434Tim Northover    TPIDR_EL3         = 0xf682, // 11  110  1101  0000  010
82072062f5744557e270a38192554c3126ea5f97434Tim Northover    TPIDRRO_EL0       = 0xde83, // 11  011  1101  0000  011
82172062f5744557e270a38192554c3126ea5f97434Tim Northover    TPIDR_EL1         = 0xc684, // 11  000  1101  0000  100
82272062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTFRQ_EL0        = 0xdf00, // 11  011  1110  0000  000
82372062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTVOFF_EL2       = 0xe703, // 11  100  1110  0000  011
82472062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTKCTL_EL1       = 0xc708, // 11  000  1110  0001  000
82572062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTHCTL_EL2       = 0xe708, // 11  100  1110  0001  000
82672062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTP_TVAL_EL0     = 0xdf10, // 11  011  1110  0010  000
82772062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTHP_TVAL_EL2    = 0xe710, // 11  100  1110  0010  000
82872062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTPS_TVAL_EL1    = 0xff10, // 11  111  1110  0010  000
82972062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTP_CTL_EL0      = 0xdf11, // 11  011  1110  0010  001
83072062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTHP_CTL_EL2     = 0xe711, // 11  100  1110  0010  001
83172062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTPS_CTL_EL1     = 0xff11, // 11  111  1110  0010  001
83272062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTP_CVAL_EL0     = 0xdf12, // 11  011  1110  0010  010
83372062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTHP_CVAL_EL2    = 0xe712, // 11  100  1110  0010  010
83472062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTPS_CVAL_EL1    = 0xff12, // 11  111  1110  0010  010
83572062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTV_TVAL_EL0     = 0xdf18, // 11  011  1110  0011  000
83672062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTV_CTL_EL0      = 0xdf19, // 11  011  1110  0011  001
83772062f5744557e270a38192554c3126ea5f97434Tim Northover    CNTV_CVAL_EL0     = 0xdf1a, // 11  011  1110  0011  010
83872062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR0_EL0     = 0xdf40, // 11  011  1110  1000  000
83972062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR1_EL0     = 0xdf41, // 11  011  1110  1000  001
84072062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR2_EL0     = 0xdf42, // 11  011  1110  1000  010
84172062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR3_EL0     = 0xdf43, // 11  011  1110  1000  011
84272062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR4_EL0     = 0xdf44, // 11  011  1110  1000  100
84372062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR5_EL0     = 0xdf45, // 11  011  1110  1000  101
84472062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR6_EL0     = 0xdf46, // 11  011  1110  1000  110
84572062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR7_EL0     = 0xdf47, // 11  011  1110  1000  111
84672062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR8_EL0     = 0xdf48, // 11  011  1110  1001  000
84772062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR9_EL0     = 0xdf49, // 11  011  1110  1001  001
84872062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR10_EL0    = 0xdf4a, // 11  011  1110  1001  010
84972062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR11_EL0    = 0xdf4b, // 11  011  1110  1001  011
85072062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR12_EL0    = 0xdf4c, // 11  011  1110  1001  100
85172062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR13_EL0    = 0xdf4d, // 11  011  1110  1001  101
85272062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR14_EL0    = 0xdf4e, // 11  011  1110  1001  110
85372062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR15_EL0    = 0xdf4f, // 11  011  1110  1001  111
85472062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR16_EL0    = 0xdf50, // 11  011  1110  1010  000
85572062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR17_EL0    = 0xdf51, // 11  011  1110  1010  001
85672062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR18_EL0    = 0xdf52, // 11  011  1110  1010  010
85772062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR19_EL0    = 0xdf53, // 11  011  1110  1010  011
85872062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR20_EL0    = 0xdf54, // 11  011  1110  1010  100
85972062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR21_EL0    = 0xdf55, // 11  011  1110  1010  101
86072062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR22_EL0    = 0xdf56, // 11  011  1110  1010  110
86172062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR23_EL0    = 0xdf57, // 11  011  1110  1010  111
86272062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR24_EL0    = 0xdf58, // 11  011  1110  1011  000
86372062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR25_EL0    = 0xdf59, // 11  011  1110  1011  001
86472062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR26_EL0    = 0xdf5a, // 11  011  1110  1011  010
86572062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR27_EL0    = 0xdf5b, // 11  011  1110  1011  011
86672062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR28_EL0    = 0xdf5c, // 11  011  1110  1011  100
86772062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR29_EL0    = 0xdf5d, // 11  011  1110  1011  101
86872062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVCNTR30_EL0    = 0xdf5e, // 11  011  1110  1011  110
86972062f5744557e270a38192554c3126ea5f97434Tim Northover    PMCCFILTR_EL0     = 0xdf7f, // 11  011  1110  1111  111
87072062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER0_EL0    = 0xdf60, // 11  011  1110  1100  000
87172062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER1_EL0    = 0xdf61, // 11  011  1110  1100  001
87272062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER2_EL0    = 0xdf62, // 11  011  1110  1100  010
87372062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER3_EL0    = 0xdf63, // 11  011  1110  1100  011
87472062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER4_EL0    = 0xdf64, // 11  011  1110  1100  100
87572062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER5_EL0    = 0xdf65, // 11  011  1110  1100  101
87672062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER6_EL0    = 0xdf66, // 11  011  1110  1100  110
87772062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER7_EL0    = 0xdf67, // 11  011  1110  1100  111
87872062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER8_EL0    = 0xdf68, // 11  011  1110  1101  000
87972062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER9_EL0    = 0xdf69, // 11  011  1110  1101  001
88072062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER10_EL0   = 0xdf6a, // 11  011  1110  1101  010
88172062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER11_EL0   = 0xdf6b, // 11  011  1110  1101  011
88272062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER12_EL0   = 0xdf6c, // 11  011  1110  1101  100
88372062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER13_EL0   = 0xdf6d, // 11  011  1110  1101  101
88472062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER14_EL0   = 0xdf6e, // 11  011  1110  1101  110
88572062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER15_EL0   = 0xdf6f, // 11  011  1110  1101  111
88672062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER16_EL0   = 0xdf70, // 11  011  1110  1110  000
88772062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER17_EL0   = 0xdf71, // 11  011  1110  1110  001
88872062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER18_EL0   = 0xdf72, // 11  011  1110  1110  010
88972062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER19_EL0   = 0xdf73, // 11  011  1110  1110  011
89072062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER20_EL0   = 0xdf74, // 11  011  1110  1110  100
89172062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER21_EL0   = 0xdf75, // 11  011  1110  1110  101
89272062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER22_EL0   = 0xdf76, // 11  011  1110  1110  110
89372062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER23_EL0   = 0xdf77, // 11  011  1110  1110  111
89472062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER24_EL0   = 0xdf78, // 11  011  1110  1111  000
89572062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER25_EL0   = 0xdf79, // 11  011  1110  1111  001
89672062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER26_EL0   = 0xdf7a, // 11  011  1110  1111  010
89772062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER27_EL0   = 0xdf7b, // 11  011  1110  1111  011
89872062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER28_EL0   = 0xdf7c, // 11  011  1110  1111  100
89972062f5744557e270a38192554c3126ea5f97434Tim Northover    PMEVTYPER29_EL0   = 0xdf7d, // 11  011  1110  1111  101
90042a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    PMEVTYPER30_EL0   = 0xdf7e, // 11  011  1110  1111  110
90142a1b2f0b196633c0327801e810fc98849a00c47Tim Northover
9024385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    // Trace registers
9034385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCPRGCTLR        = 0x8808, // 10  001  0000  0001  000
9044385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCPROCSELR       = 0x8810, // 10  001  0000  0010  000
9054385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCONFIGR        = 0x8820, // 10  001  0000  0100  000
9064385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCAUXCTLR        = 0x8830, // 10  001  0000  0110  000
9074385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCEVENTCTL0R     = 0x8840, // 10  001  0000  1000  000
9084385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCEVENTCTL1R     = 0x8848, // 10  001  0000  1001  000
9094385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSTALLCTLR      = 0x8858, // 10  001  0000  1011  000
9104385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCTSCTLR         = 0x8860, // 10  001  0000  1100  000
9114385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSYNCPR         = 0x8868, // 10  001  0000  1101  000
9124385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCCCTLR         = 0x8870, // 10  001  0000  1110  000
9134385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCBBCTLR         = 0x8878, // 10  001  0000  1111  000
9144385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCTRACEIDR       = 0x8801, // 10  001  0000  0000  001
9154385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCQCTLR          = 0x8809, // 10  001  0000  0001  001
9164385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVICTLR         = 0x8802, // 10  001  0000  0000  010
9174385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVIIECTLR       = 0x880a, // 10  001  0000  0001  010
9184385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVISSCTLR       = 0x8812, // 10  001  0000  0010  010
9194385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVIPCSSCTLR     = 0x881a, // 10  001  0000  0011  010
9204385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVDCTLR         = 0x8842, // 10  001  0000  1000  010
9214385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVDSACCTLR      = 0x884a, // 10  001  0000  1001  010
9224385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVDARCCTLR      = 0x8852, // 10  001  0000  1010  010
9234385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSEQEVR0        = 0x8804, // 10  001  0000  0000  100
9244385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSEQEVR1        = 0x880c, // 10  001  0000  0001  100
9254385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSEQEVR2        = 0x8814, // 10  001  0000  0010  100
9264385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSEQRSTEVR      = 0x8834, // 10  001  0000  0110  100
9274385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSEQSTR         = 0x883c, // 10  001  0000  0111  100
9284385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCEXTINSELR      = 0x8844, // 10  001  0000  1000  100
9294385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCNTRLDVR0      = 0x8805, // 10  001  0000  0000  101
9304385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCNTRLDVR1      = 0x880d, // 10  001  0000  0001  101
9314385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCNTRLDVR2      = 0x8815, // 10  001  0000  0010  101
9324385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCNTRLDVR3      = 0x881d, // 10  001  0000  0011  101
9334385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCNTCTLR0       = 0x8825, // 10  001  0000  0100  101
9344385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCNTCTLR1       = 0x882d, // 10  001  0000  0101  101
9354385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCNTCTLR2       = 0x8835, // 10  001  0000  0110  101
9364385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCNTCTLR3       = 0x883d, // 10  001  0000  0111  101
9374385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCNTVR0         = 0x8845, // 10  001  0000  1000  101
9384385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCNTVR1         = 0x884d, // 10  001  0000  1001  101
9394385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCNTVR2         = 0x8855, // 10  001  0000  1010  101
9404385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCNTVR3         = 0x885d, // 10  001  0000  1011  101
9414385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIMSPEC0        = 0x8807, // 10  001  0000  0000  111
9424385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIMSPEC1        = 0x880f, // 10  001  0000  0001  111
9434385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIMSPEC2        = 0x8817, // 10  001  0000  0010  111
9444385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIMSPEC3        = 0x881f, // 10  001  0000  0011  111
9454385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIMSPEC4        = 0x8827, // 10  001  0000  0100  111
9464385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIMSPEC5        = 0x882f, // 10  001  0000  0101  111
9474385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIMSPEC6        = 0x8837, // 10  001  0000  0110  111
9484385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCIMSPEC7        = 0x883f, // 10  001  0000  0111  111
9494385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR2        = 0x8890, // 10  001  0001  0010  000
9504385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR3        = 0x8898, // 10  001  0001  0011  000
9514385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR4        = 0x88a0, // 10  001  0001  0100  000
9524385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR5        = 0x88a8, // 10  001  0001  0101  000
9534385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR6        = 0x88b0, // 10  001  0001  0110  000
9544385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR7        = 0x88b8, // 10  001  0001  0111  000
9554385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR8        = 0x88c0, // 10  001  0001  1000  000
9564385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR9        = 0x88c8, // 10  001  0001  1001  000
9574385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR10       = 0x88d0, // 10  001  0001  1010  000
9584385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR11       = 0x88d8, // 10  001  0001  1011  000
9594385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR12       = 0x88e0, // 10  001  0001  1100  000
9604385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR13       = 0x88e8, // 10  001  0001  1101  000
9614385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR14       = 0x88f0, // 10  001  0001  1110  000
9624385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR15       = 0x88f8, // 10  001  0001  1111  000
9634385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR16       = 0x8881, // 10  001  0001  0000  001
9644385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR17       = 0x8889, // 10  001  0001  0001  001
9654385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR18       = 0x8891, // 10  001  0001  0010  001
9664385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR19       = 0x8899, // 10  001  0001  0011  001
9674385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR20       = 0x88a1, // 10  001  0001  0100  001
9684385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR21       = 0x88a9, // 10  001  0001  0101  001
9694385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR22       = 0x88b1, // 10  001  0001  0110  001
9704385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR23       = 0x88b9, // 10  001  0001  0111  001
9714385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR24       = 0x88c1, // 10  001  0001  1000  001
9724385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR25       = 0x88c9, // 10  001  0001  1001  001
9734385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR26       = 0x88d1, // 10  001  0001  1010  001
9744385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR27       = 0x88d9, // 10  001  0001  1011  001
9754385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR28       = 0x88e1, // 10  001  0001  1100  001
9764385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR29       = 0x88e9, // 10  001  0001  1101  001
9774385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR30       = 0x88f1, // 10  001  0001  1110  001
9784385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCRSCTLR31       = 0x88f9, // 10  001  0001  1111  001
9794385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCCR0         = 0x8882, // 10  001  0001  0000  010
9804385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCCR1         = 0x888a, // 10  001  0001  0001  010
9814385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCCR2         = 0x8892, // 10  001  0001  0010  010
9824385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCCR3         = 0x889a, // 10  001  0001  0011  010
9834385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCCR4         = 0x88a2, // 10  001  0001  0100  010
9844385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCCR5         = 0x88aa, // 10  001  0001  0101  010
9854385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCCR6         = 0x88b2, // 10  001  0001  0110  010
9864385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCCR7         = 0x88ba, // 10  001  0001  0111  010
9874385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCSR0         = 0x88c2, // 10  001  0001  1000  010
9884385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCSR1         = 0x88ca, // 10  001  0001  1001  010
9894385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCSR2         = 0x88d2, // 10  001  0001  1010  010
9904385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCSR3         = 0x88da, // 10  001  0001  1011  010
9914385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCSR4         = 0x88e2, // 10  001  0001  1100  010
9924385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCSR5         = 0x88ea, // 10  001  0001  1101  010
9934385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCSR6         = 0x88f2, // 10  001  0001  1110  010
9944385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSCSR7         = 0x88fa, // 10  001  0001  1111  010
9954385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSPCICR0       = 0x8883, // 10  001  0001  0000  011
9964385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSPCICR1       = 0x888b, // 10  001  0001  0001  011
9974385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSPCICR2       = 0x8893, // 10  001  0001  0010  011
9984385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSPCICR3       = 0x889b, // 10  001  0001  0011  011
9994385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSPCICR4       = 0x88a3, // 10  001  0001  0100  011
10004385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSPCICR5       = 0x88ab, // 10  001  0001  0101  011
10014385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSPCICR6       = 0x88b3, // 10  001  0001  0110  011
10024385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCSSPCICR7       = 0x88bb, // 10  001  0001  0111  011
10034385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCPDCR           = 0x88a4, // 10  001  0001  0100  100
10044385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR0          = 0x8900, // 10  001  0010  0000  000
10054385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR1          = 0x8910, // 10  001  0010  0010  000
10064385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR2          = 0x8920, // 10  001  0010  0100  000
10074385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR3          = 0x8930, // 10  001  0010  0110  000
10084385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR4          = 0x8940, // 10  001  0010  1000  000
10094385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR5          = 0x8950, // 10  001  0010  1010  000
10104385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR6          = 0x8960, // 10  001  0010  1100  000
10114385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR7          = 0x8970, // 10  001  0010  1110  000
10124385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR8          = 0x8901, // 10  001  0010  0000  001
10134385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR9          = 0x8911, // 10  001  0010  0010  001
10144385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR10         = 0x8921, // 10  001  0010  0100  001
10154385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR11         = 0x8931, // 10  001  0010  0110  001
10164385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR12         = 0x8941, // 10  001  0010  1000  001
10174385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR13         = 0x8951, // 10  001  0010  1010  001
10184385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR14         = 0x8961, // 10  001  0010  1100  001
10194385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACVR15         = 0x8971, // 10  001  0010  1110  001
10204385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR0         = 0x8902, // 10  001  0010  0000  010
10214385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR1         = 0x8912, // 10  001  0010  0010  010
10224385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR2         = 0x8922, // 10  001  0010  0100  010
10234385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR3         = 0x8932, // 10  001  0010  0110  010
10244385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR4         = 0x8942, // 10  001  0010  1000  010
10254385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR5         = 0x8952, // 10  001  0010  1010  010
10264385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR6         = 0x8962, // 10  001  0010  1100  010
10274385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR7         = 0x8972, // 10  001  0010  1110  010
10284385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR8         = 0x8903, // 10  001  0010  0000  011
10294385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR9         = 0x8913, // 10  001  0010  0010  011
10304385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR10        = 0x8923, // 10  001  0010  0100  011
10314385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR11        = 0x8933, // 10  001  0010  0110  011
10324385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR12        = 0x8943, // 10  001  0010  1000  011
10334385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR13        = 0x8953, // 10  001  0010  1010  011
10344385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR14        = 0x8963, // 10  001  0010  1100  011
10354385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCACATR15        = 0x8973, // 10  001  0010  1110  011
10364385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCVR0         = 0x8904, // 10  001  0010  0000  100
10374385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCVR1         = 0x8924, // 10  001  0010  0100  100
10384385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCVR2         = 0x8944, // 10  001  0010  1000  100
10394385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCVR3         = 0x8964, // 10  001  0010  1100  100
10404385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCVR4         = 0x8905, // 10  001  0010  0000  101
10414385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCVR5         = 0x8925, // 10  001  0010  0100  101
10424385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCVR6         = 0x8945, // 10  001  0010  1000  101
10434385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCVR7         = 0x8965, // 10  001  0010  1100  101
10444385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCMR0         = 0x8906, // 10  001  0010  0000  110
10454385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCMR1         = 0x8926, // 10  001  0010  0100  110
10464385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCMR2         = 0x8946, // 10  001  0010  1000  110
10474385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCMR3         = 0x8966, // 10  001  0010  1100  110
10484385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCMR4         = 0x8907, // 10  001  0010  0000  111
10494385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCMR5         = 0x8927, // 10  001  0010  0100  111
10504385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCMR6         = 0x8947, // 10  001  0010  1000  111
10514385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCDVCMR7         = 0x8967, // 10  001  0010  1100  111
10524385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDCVR0        = 0x8980, // 10  001  0011  0000  000
10534385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDCVR1        = 0x8990, // 10  001  0011  0010  000
10544385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDCVR2        = 0x89a0, // 10  001  0011  0100  000
10554385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDCVR3        = 0x89b0, // 10  001  0011  0110  000
10564385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDCVR4        = 0x89c0, // 10  001  0011  1000  000
10574385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDCVR5        = 0x89d0, // 10  001  0011  1010  000
10584385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDCVR6        = 0x89e0, // 10  001  0011  1100  000
10594385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDCVR7        = 0x89f0, // 10  001  0011  1110  000
10604385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVMIDCVR0       = 0x8981, // 10  001  0011  0000  001
10614385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVMIDCVR1       = 0x8991, // 10  001  0011  0010  001
10624385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVMIDCVR2       = 0x89a1, // 10  001  0011  0100  001
10634385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVMIDCVR3       = 0x89b1, // 10  001  0011  0110  001
10644385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVMIDCVR4       = 0x89c1, // 10  001  0011  1000  001
10654385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVMIDCVR5       = 0x89d1, // 10  001  0011  1010  001
10664385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVMIDCVR6       = 0x89e1, // 10  001  0011  1100  001
10674385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVMIDCVR7       = 0x89f1, // 10  001  0011  1110  001
10684385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDCCTLR0      = 0x8982, // 10  001  0011  0000  010
10694385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCIDCCTLR1      = 0x898a, // 10  001  0011  0001  010
10704385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVMIDCCTLR0     = 0x8992, // 10  001  0011  0010  010
10714385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCVMIDCCTLR1     = 0x899a, // 10  001  0011  0011  010
10724385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCITCTRL         = 0x8b84, // 10  001  0111  0000  100
10734385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCLAIMSET       = 0x8bc6, // 10  001  0111  1000  110
10744385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover    TRCCLAIMCLR       = 0x8bce, // 10  001  0111  1001  110
10754385f5dfced4e14bc59dfedb1f75116c0aabbc36Tim Northover
107642a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    // GICv3 registers
107742a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_BPR1_EL1      = 0xc663, // 11  000  1100  1100  011
107842a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_BPR0_EL1      = 0xc643, // 11  000  1100  1000  011
107942a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_PMR_EL1       = 0xc230, // 11  000  0100  0110  000
108042a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_CTLR_EL1      = 0xc664, // 11  000  1100  1100  100
108142a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_CTLR_EL3      = 0xf664, // 11  110  1100  1100  100
108242a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_SRE_EL1       = 0xc665, // 11  000  1100  1100  101
108342a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_SRE_EL2       = 0xe64d, // 11  100  1100  1001  101
108442a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_SRE_EL3       = 0xf665, // 11  110  1100  1100  101
108542a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_IGRPEN0_EL1   = 0xc666, // 11  000  1100  1100  110
108642a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_IGRPEN1_EL1   = 0xc667, // 11  000  1100  1100  111
108742a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_IGRPEN1_EL3   = 0xf667, // 11  110  1100  1100  111
108842a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_SEIEN_EL1     = 0xc668, // 11  000  1100  1101  000
108942a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_AP0R0_EL1     = 0xc644, // 11  000  1100  1000  100
109042a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_AP0R1_EL1     = 0xc645, // 11  000  1100  1000  101
109142a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_AP0R2_EL1     = 0xc646, // 11  000  1100  1000  110
109242a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_AP0R3_EL1     = 0xc647, // 11  000  1100  1000  111
109342a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_AP1R0_EL1     = 0xc648, // 11  000  1100  1001  000
109442a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_AP1R1_EL1     = 0xc649, // 11  000  1100  1001  001
109542a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_AP1R2_EL1     = 0xc64a, // 11  000  1100  1001  010
109642a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICC_AP1R3_EL1     = 0xc64b, // 11  000  1100  1001  011
109742a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_AP0R0_EL2     = 0xe640, // 11  100  1100  1000  000
109842a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_AP0R1_EL2     = 0xe641, // 11  100  1100  1000  001
109942a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_AP0R2_EL2     = 0xe642, // 11  100  1100  1000  010
110042a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_AP0R3_EL2     = 0xe643, // 11  100  1100  1000  011
110142a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_AP1R0_EL2     = 0xe648, // 11  100  1100  1001  000
110242a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_AP1R1_EL2     = 0xe649, // 11  100  1100  1001  001
110342a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_AP1R2_EL2     = 0xe64a, // 11  100  1100  1001  010
110442a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_AP1R3_EL2     = 0xe64b, // 11  100  1100  1001  011
110542a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_HCR_EL2       = 0xe658, // 11  100  1100  1011  000
110642a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_MISR_EL2      = 0xe65a, // 11  100  1100  1011  010
110742a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_VMCR_EL2      = 0xe65f, // 11  100  1100  1011  111
110842a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_VSEIR_EL2     = 0xe64c, // 11  100  1100  1001  100
110942a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR0_EL2       = 0xe660, // 11  100  1100  1100  000
111042a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR1_EL2       = 0xe661, // 11  100  1100  1100  001
111142a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR2_EL2       = 0xe662, // 11  100  1100  1100  010
111242a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR3_EL2       = 0xe663, // 11  100  1100  1100  011
111342a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR4_EL2       = 0xe664, // 11  100  1100  1100  100
111442a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR5_EL2       = 0xe665, // 11  100  1100  1100  101
111542a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR6_EL2       = 0xe666, // 11  100  1100  1100  110
111642a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR7_EL2       = 0xe667, // 11  100  1100  1100  111
111742a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR8_EL2       = 0xe668, // 11  100  1100  1101  000
111842a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR9_EL2       = 0xe669, // 11  100  1100  1101  001
111942a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR10_EL2      = 0xe66a, // 11  100  1100  1101  010
112042a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR11_EL2      = 0xe66b, // 11  100  1100  1101  011
112142a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR12_EL2      = 0xe66c, // 11  100  1100  1101  100
112242a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR13_EL2      = 0xe66d, // 11  100  1100  1101  101
112342a1b2f0b196633c0327801e810fc98849a00c47Tim Northover    ICH_LR14_EL2      = 0xe66e, // 11  100  1100  1101  110
1124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ICH_LR15_EL2      = 0xe66f, // 11  100  1100  1101  111
1125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  };
1126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Cyclone specific system registers
1128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  enum CycloneSysRegValues {
1129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    CPM_IOACC_CTL_EL3 = 0xff90
113072062f5744557e270a38192554c3126ea5f97434Tim Northover  };
113172062f5744557e270a38192554c3126ea5f97434Tim Northover
1132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Note that these do not inherit from AArch64NamedImmMapper. This class is
113372062f5744557e270a38192554c3126ea5f97434Tim Northover  // sufficiently different in its behaviour that I don't believe it's worth
1134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // burdening the common AArch64NamedImmMapper with abstractions only needed in
113572062f5744557e270a38192554c3126ea5f97434Tim Northover  // this one case.
113672062f5744557e270a38192554c3126ea5f97434Tim Northover  struct SysRegMapper {
1137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    static const AArch64NamedImmMapper::Mapping SysRegPairs[];
1138dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    static const AArch64NamedImmMapper::Mapping CycloneSysRegPairs[];
113972062f5744557e270a38192554c3126ea5f97434Tim Northover
1140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const AArch64NamedImmMapper::Mapping *InstPairs;
114172062f5744557e270a38192554c3126ea5f97434Tim Northover    size_t NumInstPairs;
1142dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    uint64_t FeatureBits;
114372062f5744557e270a38192554c3126ea5f97434Tim Northover
1144dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SysRegMapper(uint64_t FeatureBits) : FeatureBits(FeatureBits) { }
114572062f5744557e270a38192554c3126ea5f97434Tim Northover    uint32_t fromString(StringRef Name, bool &Valid) const;
114672062f5744557e270a38192554c3126ea5f97434Tim Northover    std::string toString(uint32_t Bits, bool &Valid) const;
114772062f5744557e270a38192554c3126ea5f97434Tim Northover  };
114872062f5744557e270a38192554c3126ea5f97434Tim Northover
114972062f5744557e270a38192554c3126ea5f97434Tim Northover  struct MSRMapper : SysRegMapper {
1150dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    static const AArch64NamedImmMapper::Mapping MSRPairs[];
1151dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MSRMapper(uint64_t FeatureBits);
115272062f5744557e270a38192554c3126ea5f97434Tim Northover  };
115372062f5744557e270a38192554c3126ea5f97434Tim Northover
115472062f5744557e270a38192554c3126ea5f97434Tim Northover  struct MRSMapper : SysRegMapper {
1155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    static const AArch64NamedImmMapper::Mapping MRSPairs[];
1156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MRSMapper(uint64_t FeatureBits);
115772062f5744557e270a38192554c3126ea5f97434Tim Northover  };
115872062f5744557e270a38192554c3126ea5f97434Tim Northover
115972062f5744557e270a38192554c3126ea5f97434Tim Northover  uint32_t ParseGenericRegister(StringRef Name, bool &Valid);
116072062f5744557e270a38192554c3126ea5f97434Tim Northover}
116172062f5744557e270a38192554c3126ea5f97434Tim Northover
1162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace AArch64TLBI {
116372062f5744557e270a38192554c3126ea5f97434Tim Northover  enum TLBIValues {
116472062f5744557e270a38192554c3126ea5f97434Tim Northover    Invalid = -1,          // Op0 Op1  CRn   CRm   Op2
116572062f5744557e270a38192554c3126ea5f97434Tim Northover    IPAS2E1IS    = 0x6401, // 01  100  1000  0000  001
116672062f5744557e270a38192554c3126ea5f97434Tim Northover    IPAS2LE1IS   = 0x6405, // 01  100  1000  0000  101
116772062f5744557e270a38192554c3126ea5f97434Tim Northover    VMALLE1IS    = 0x4418, // 01  000  1000  0011  000
116872062f5744557e270a38192554c3126ea5f97434Tim Northover    ALLE2IS      = 0x6418, // 01  100  1000  0011  000
116972062f5744557e270a38192554c3126ea5f97434Tim Northover    ALLE3IS      = 0x7418, // 01  110  1000  0011  000
117072062f5744557e270a38192554c3126ea5f97434Tim Northover    VAE1IS       = 0x4419, // 01  000  1000  0011  001
117172062f5744557e270a38192554c3126ea5f97434Tim Northover    VAE2IS       = 0x6419, // 01  100  1000  0011  001
117272062f5744557e270a38192554c3126ea5f97434Tim Northover    VAE3IS       = 0x7419, // 01  110  1000  0011  001
117372062f5744557e270a38192554c3126ea5f97434Tim Northover    ASIDE1IS     = 0x441a, // 01  000  1000  0011  010
117472062f5744557e270a38192554c3126ea5f97434Tim Northover    VAAE1IS      = 0x441b, // 01  000  1000  0011  011
117572062f5744557e270a38192554c3126ea5f97434Tim Northover    ALLE1IS      = 0x641c, // 01  100  1000  0011  100
117672062f5744557e270a38192554c3126ea5f97434Tim Northover    VALE1IS      = 0x441d, // 01  000  1000  0011  101
117772062f5744557e270a38192554c3126ea5f97434Tim Northover    VALE2IS      = 0x641d, // 01  100  1000  0011  101
117872062f5744557e270a38192554c3126ea5f97434Tim Northover    VALE3IS      = 0x741d, // 01  110  1000  0011  101
117972062f5744557e270a38192554c3126ea5f97434Tim Northover    VMALLS12E1IS = 0x641e, // 01  100  1000  0011  110
118072062f5744557e270a38192554c3126ea5f97434Tim Northover    VAALE1IS     = 0x441f, // 01  000  1000  0011  111
118172062f5744557e270a38192554c3126ea5f97434Tim Northover    IPAS2E1      = 0x6421, // 01  100  1000  0100  001
118272062f5744557e270a38192554c3126ea5f97434Tim Northover    IPAS2LE1     = 0x6425, // 01  100  1000  0100  101
118372062f5744557e270a38192554c3126ea5f97434Tim Northover    VMALLE1      = 0x4438, // 01  000  1000  0111  000
118472062f5744557e270a38192554c3126ea5f97434Tim Northover    ALLE2        = 0x6438, // 01  100  1000  0111  000
118572062f5744557e270a38192554c3126ea5f97434Tim Northover    ALLE3        = 0x7438, // 01  110  1000  0111  000
118672062f5744557e270a38192554c3126ea5f97434Tim Northover    VAE1         = 0x4439, // 01  000  1000  0111  001
118772062f5744557e270a38192554c3126ea5f97434Tim Northover    VAE2         = 0x6439, // 01  100  1000  0111  001
118872062f5744557e270a38192554c3126ea5f97434Tim Northover    VAE3         = 0x7439, // 01  110  1000  0111  001
118972062f5744557e270a38192554c3126ea5f97434Tim Northover    ASIDE1       = 0x443a, // 01  000  1000  0111  010
119072062f5744557e270a38192554c3126ea5f97434Tim Northover    VAAE1        = 0x443b, // 01  000  1000  0111  011
119172062f5744557e270a38192554c3126ea5f97434Tim Northover    ALLE1        = 0x643c, // 01  100  1000  0111  100
119272062f5744557e270a38192554c3126ea5f97434Tim Northover    VALE1        = 0x443d, // 01  000  1000  0111  101
119372062f5744557e270a38192554c3126ea5f97434Tim Northover    VALE2        = 0x643d, // 01  100  1000  0111  101
119472062f5744557e270a38192554c3126ea5f97434Tim Northover    VALE3        = 0x743d, // 01  110  1000  0111  101
119572062f5744557e270a38192554c3126ea5f97434Tim Northover    VMALLS12E1   = 0x643e, // 01  100  1000  0111  110
119672062f5744557e270a38192554c3126ea5f97434Tim Northover    VAALE1       = 0x443f  // 01  000  1000  0111  111
119772062f5744557e270a38192554c3126ea5f97434Tim Northover  };
119872062f5744557e270a38192554c3126ea5f97434Tim Northover
1199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  struct TLBIMapper : AArch64NamedImmMapper {
120072062f5744557e270a38192554c3126ea5f97434Tim Northover    const static Mapping TLBIPairs[];
120172062f5744557e270a38192554c3126ea5f97434Tim Northover
120272062f5744557e270a38192554c3126ea5f97434Tim Northover    TLBIMapper();
120372062f5744557e270a38192554c3126ea5f97434Tim Northover  };
120472062f5744557e270a38192554c3126ea5f97434Tim Northover
120572062f5744557e270a38192554c3126ea5f97434Tim Northover  static inline bool NeedsRegister(TLBIValues Val) {
120672062f5744557e270a38192554c3126ea5f97434Tim Northover    switch (Val) {
120772062f5744557e270a38192554c3126ea5f97434Tim Northover    case VMALLE1IS:
120872062f5744557e270a38192554c3126ea5f97434Tim Northover    case ALLE2IS:
120972062f5744557e270a38192554c3126ea5f97434Tim Northover    case ALLE3IS:
121072062f5744557e270a38192554c3126ea5f97434Tim Northover    case ALLE1IS:
121172062f5744557e270a38192554c3126ea5f97434Tim Northover    case VMALLS12E1IS:
121272062f5744557e270a38192554c3126ea5f97434Tim Northover    case VMALLE1:
121372062f5744557e270a38192554c3126ea5f97434Tim Northover    case ALLE2:
121472062f5744557e270a38192554c3126ea5f97434Tim Northover    case ALLE3:
121572062f5744557e270a38192554c3126ea5f97434Tim Northover    case ALLE1:
121672062f5744557e270a38192554c3126ea5f97434Tim Northover    case VMALLS12E1:
121772062f5744557e270a38192554c3126ea5f97434Tim Northover      return false;
121872062f5744557e270a38192554c3126ea5f97434Tim Northover    default:
121972062f5744557e270a38192554c3126ea5f97434Tim Northover      return true;
122072062f5744557e270a38192554c3126ea5f97434Tim Northover    }
122172062f5744557e270a38192554c3126ea5f97434Tim Northover  }
1222dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
122372062f5744557e270a38192554c3126ea5f97434Tim Northover
122472062f5744557e270a38192554c3126ea5f97434Tim Northovernamespace AArch64II {
1225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Target Operand Flag enum.
122672062f5744557e270a38192554c3126ea5f97434Tim Northover  enum TOF {
1227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    //===------------------------------------------------------------------===//
122872062f5744557e270a38192554c3126ea5f97434Tim Northover    // AArch64 Specific MachineOperand flags.
122972062f5744557e270a38192554c3126ea5f97434Tim Northover
123072062f5744557e270a38192554c3126ea5f97434Tim Northover    MO_NO_FLAG,
123172062f5744557e270a38192554c3126ea5f97434Tim Northover
1232dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MO_FRAGMENT = 0x7,
1233dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// MO_PAGE - A symbol operand with this flag represents the pc-relative
1235dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// offset of the 4K page containing the symbol.  This is used with the
1236dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// ADRP instruction.
1237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MO_PAGE = 1,
1238dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1239dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// MO_PAGEOFF - A symbol operand with this flag represents the offset of
1240dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// that symbol within a 4K page.  This offset is added to the page address
1241dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// to produce the complete address.
1242dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MO_PAGEOFF = 2,
1243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1244dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// MO_G3 - A symbol operand with this flag (granule 3) represents the high
1245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// 16-bits of a 64-bit address, used in a MOVZ or MOVK instruction
1246dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MO_G3 = 3,
1247dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1248dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// MO_G2 - A symbol operand with this flag (granule 2) represents the bits
1249dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// 32-47 of a 64-bit address, used in a MOVZ or MOVK instruction
1250dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MO_G2 = 4,
1251dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1252dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// MO_G1 - A symbol operand with this flag (granule 1) represents the bits
1253dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// 16-31 of a 64-bit address, used in a MOVZ or MOVK instruction
1254dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MO_G1 = 5,
1255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1256dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// MO_G0 - A symbol operand with this flag (granule 0) represents the bits
1257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// 0-15 of a 64-bit address, used in a MOVZ or MOVK instruction
1258dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MO_G0 = 6,
1259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// MO_GOT - This flag indicates that a symbol operand represents the
1261dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// address of the GOT entry for the symbol, rather than the address of
1262dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// the symbol itself.
1263dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MO_GOT = 8,
1264dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1265dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// MO_NC - Indicates whether the linker is expected to check the symbol
1266dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// reference for overflow. For example in an ADRP/ADD pair of relocations
1267dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// the ADRP usually does check, but not the ADD.
1268dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MO_NC = 0x10,
1269dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1270dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// MO_TLS - Indicates that the operand being accessed is some kind of
1271dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// thread-local symbol. On Darwin, only one type of thread-local access
1272dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// exists (pre linker-relaxation), but on ELF the TLSModel used for the
1273dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// referee will affect interpretation.
1274dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MO_TLS = 0x20
127572062f5744557e270a38192554c3126ea5f97434Tim Northover  };
1276dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} // end namespace AArch64II
127772062f5744557e270a38192554c3126ea5f97434Tim Northover
1278dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} // end namespace llvm
127972062f5744557e270a38192554c3126ea5f97434Tim Northover
128072062f5744557e270a38192554c3126ea5f97434Tim Northover#endif
1281