summaryrefslogtreecommitdiff
path: root/aarch64_small/gen/lexer.hgen
blob: 6ff24317691f5d3733bc419d3707b37c23fec779 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
(* instructions: *)

  "TSTART" , TSTART  {txt="TSTART"} ;
  "TCOMMIT", TCOMMIT {txt="TCOMMIT"} ;
  "TABORT" , TABORT  {txt="TABORT"} ;
  "TTEST"  , TTEST   {txt="TTEST"} ;

  "ADC"  , ADCSBC {txt="ADC";  sub_op = false; setflags = false} ;
  "SBC"  , ADCSBC {txt="SBC";  sub_op = true;  setflags = false} ;
  "ADCS" , ADCSBC {txt="ADCS"; sub_op = false; setflags = true} ;
  "SBCS" , ADCSBC {txt="SBCS"; sub_op = true;  setflags = true} ;

  "ADD"  , ADDSUB {txt="ADD";  sub_op=false; setflags=false} ;
  "SUB"  , ADDSUB {txt="SUB";  sub_op=true;  setflags=false} ;
  "ADDS" , ADDSUB {txt="ADDS"; sub_op=false; setflags=true} ;
  "SUBS" , ADDSUB {txt="SUBS"; sub_op=true;  setflags=true} ;

  "ADR"  , ADR {txt="ADR";  page=false} ;
  "ADRP" , ADR {txt="ADRP"; page=true} ;

  "AND"  , LOGOP {txt="AND";  op = LogicalOp_AND; setflags = false; invert = false} ;
  "ANDS" , LOGOP {txt="ANDS"; op = LogicalOp_AND; setflags = true;  invert = false} ;
  "EOR"  , LOGOP {txt="EOR";  op = LogicalOp_EOR; setflags = false; invert = false} ;
  "ORR"  , LOGOP {txt="ORR";  op = LogicalOp_ORR; setflags = false; invert = false} ;
  "BIC"  , LOGOP {txt="BIC";  op = LogicalOp_AND; setflags = false; invert = true} ;
  "BICS" , LOGOP {txt="BICS"; op = LogicalOp_AND; setflags = true;  invert = true} ;
  "EON"  , LOGOP {txt="EON";  op = LogicalOp_EOR; setflags = false; invert = true} ;
  "ORN"  , LOGOP {txt="ORN";  op = LogicalOp_ORR; setflags = false; invert = true} ;

  "ASRV" , SHIFTOP {txt="ASRV"; shift_type=ShiftType_ASR} ;
  "LSLV" , SHIFTOP {txt="LSLV"; shift_type=ShiftType_LSL} ;
  "LSRV" , SHIFTOP {txt="LSRV"; shift_type=ShiftType_LSR} ;
  "RORV" , SHIFTOP {txt="RORV"; shift_type=ShiftType_ROR} ;

  "B.EQ" , BCOND {txt="B.EQ"; condition=0b0000} ;
  "B.NE" , BCOND {txt="B.NE"; condition=0b0001} ;
  "B.CS" , BCOND {txt="B.CS"; condition=0b0010} ;
  "B.HS" , BCOND {txt="B.CS"; condition=0b0010} ;
  "B.CC" , BCOND {txt="B.CC"; condition=0b0011} ;
  "B.LO" , BCOND {txt="B.CC"; condition=0b0011} ;
  "B.MI" , BCOND {txt="B.MI"; condition=0b0100} ;
  "B.PL" , BCOND {txt="B.PL"; condition=0b0101} ;
  "B.VS" , BCOND {txt="B.VS"; condition=0b0110} ;
  "B.VC" , BCOND {txt="B.VC"; condition=0b0111} ;
  "B.HI" , BCOND {txt="B.HI"; condition=0b1000} ;
  "B.LS" , BCOND {txt="B.LS"; condition=0b1001} ;
  "B.GE" , BCOND {txt="B.GE"; condition=0b1010} ;
  "B.LT" , BCOND {txt="B.LT"; condition=0b1011} ;
  "B.GT" , BCOND {txt="B.GT"; condition=0b1100} ;
  "B.LE" , BCOND {txt="B.LE"; condition=0b1101} ;
  "B.AL" , BCOND {txt="B.AL"; condition=0b1110} ;
  "B.NV" , BCOND {txt="B.NV"; condition=0b1111} ; (* ARM: exists only to provide a valid disassembly
                                                     of the 0b1111 encoding, otherwise its
                                                     behavior is identical to AL *)

  "B"    , B {txt="B";  branch_type=BranchType_JMP} ;
  "BL"   , B {txt="BL"; branch_type=BranchType_CALL} ;

  "BR"   , BR {txt="BR";  branch_type=BranchType_JMP} ;
  "BLR"  , BR {txt="BLR"; branch_type=BranchType_CALL} ;

  "CBZ"  , CBZ {txt="CBZ";  iszero=true} ;
  "CBNZ" , CBZ {txt="CBNZ"; iszero=false} ;

  "BFM"  , BFM {txt="BFM";  inzero=false; extend=false} ;
  "SBFM" , BFM {txt="SBFM"; inzero=true;  extend=true} ;
  "UBFM" , BFM {txt="UBFM"; inzero=true;  extend=false} ;

  "CCMN" , CCM {txt="CCMN"; sub_op=false} ;
  "CCMP" , CCM {txt="CCMP"; sub_op=true} ;

  "CMN" , CM {txt="CMN"; sub_op=false} ;
  "CMP" , CM {txt="CMP"; sub_op=true} ;

  "CLS" , CL {txt="CLS"; opcode=CountOp_CLS} ;
  "CLZ" , CL {txt="CLZ"; opcode=CountOp_CLZ} ;

  "CRC32B"  , CRC {txt="CRC32B";  size = DataSize8;  crc32c = false} ;
  "CRC32H"  , CRC {txt="CRC32H";  size = DataSize16; crc32c = false} ;
  "CRC32W"  , CRC {txt="CRC32W";  size = DataSize32; crc32c = false} ;
  "CRC32CB" , CRC {txt="CRC32CB"; size = DataSize8;  crc32c = true} ;
  "CRC32CH" , CRC {txt="CRC32CH"; size = DataSize16; crc32c = true} ;
  "CRC32CW" , CRC {txt="CRC32CW"; size = DataSize32; crc32c = true} ;

  "CRC32X"  , CRC32X {txt="CRC32X";  crc32c=false} ;
  "CRC32CX" , CRC32X {txt="CRC32CX"; crc32c=true} ;

  "CSEL"  , CSEL {txt="CSEL";  else_inv = false; else_inc = false} ;
  "CSINC" , CSEL {txt="CSINC"; else_inv = false; else_inc = true} ;
  "CSINV" , CSEL {txt="CSINV"; else_inv = true;  else_inc = false} ;
  "CSNEG" , CSEL {txt="CSNEG"; else_inv = true;  else_inc = true} ;

  "CSET"  , CSET  {txt="CSET";  else_inv = false; else_inc = true} ;
  "CSETM" , CSETM {txt="CSETM"; else_inv = true;  else_inc = false} ;

  "CINC"  , CON {txt="CINC"; else_inv = false; else_inc = true} ;
  "CINV"  , CON {txt="CINV"; else_inv = true;  else_inc = false} ;
  "CNEG"  , CON {txt="CNEG"; else_inv = true;  else_inc = true} ;

  "DMB" , MEMBARR {txt="DMB"; op=MemBarrierOp_DMB} ;
  "DSB" , MEMBARR {txt="DSB"; op=MemBarrierOp_DSB} ;

  "LDAR"    , LDAXR {txt="LDAR";   acctype=AccType_ORDERED; excl=false; memop=MemOp_LOAD;  var32={elsize=32; datasize=DataSize32}; var64=true} ;
  "LDARB"   , LDAXR {txt="LDARB";  acctype=AccType_ORDERED; excl=false; memop=MemOp_LOAD;  var32={elsize=8;  datasize=DataSize8};  var64=false} ;
  "LDARH"   , LDAXR {txt="LDARH";  acctype=AccType_ORDERED; excl=false; memop=MemOp_LOAD;  var32={elsize=16; datasize=DataSize16}; var64=false} ;
  "LDAXR"   , LDAXR {txt="LDAXR";  acctype=AccType_ORDERED; excl=true;  memop=MemOp_LOAD;  var32={elsize=32; datasize=DataSize32}; var64=true} ;
  "LDAXRB"  , LDAXR {txt="LDAXRB"; acctype=AccType_ORDERED; excl=true;  memop=MemOp_LOAD;  var32={elsize=8;  datasize=DataSize8};  var64=false} ;
  "LDAXRH"  , LDAXR {txt="LDAXRH"; acctype=AccType_ORDERED; excl=true;  memop=MemOp_LOAD;  var32={elsize=16; datasize=DataSize16}; var64=false} ;
  "LDXR"    , LDAXR {txt="LDXR";   acctype=AccType_ATOMIC;  excl=true;  memop=MemOp_LOAD;  var32={elsize=32; datasize=DataSize32}; var64=true} ;
  "LDXRB"   , LDAXR {txt="LDXRB";  acctype=AccType_ATOMIC;  excl=true;  memop=MemOp_LOAD;  var32={elsize=8;  datasize=DataSize8};  var64=false} ;
  "LDXRH"   , LDAXR {txt="LDXRH";  acctype=AccType_ATOMIC;  excl=true;  memop=MemOp_LOAD;  var32={elsize=16; datasize=DataSize16}; var64=false} ;
  "STLR"    , LDAXR {txt="STLR";   acctype=AccType_ORDERED; excl=false; memop=MemOp_STORE; var32={elsize=32; datasize=DataSize32}; var64=true} ;
  "STLRB"   , LDAXR {txt="STLRB";  acctype=AccType_ORDERED; excl=false; memop=MemOp_STORE; var32={elsize=8;  datasize=DataSize8};  var64=false} ;
  "STLRH"   , LDAXR {txt="STLRH";  acctype=AccType_ORDERED; excl=false; memop=MemOp_STORE; var32={elsize=16; datasize=DataSize16}; var64=false} ;

  "STLXR"   , STLXR {txt="STLXR";  acctype=AccType_ORDERED; var32={elsize=32; datasize=DataSize32}; var64=true} ;
  "STLXRB"  , STLXR {txt="STLXRB"; acctype=AccType_ORDERED; var32={elsize=8;  datasize=DataSize8};  var64=false} ;
  "STLXRH"  , STLXR {txt="STLXRH"; acctype=AccType_ORDERED; var32={elsize=16; datasize=DataSize16}; var64=false} ;
  "STXR"    , STLXR {txt="STXR";   acctype=AccType_ATOMIC;  var32={elsize=32; datasize=DataSize32}; var64=true} ;
  "STXRB"   , STLXR {txt="STXRB";  acctype=AccType_ATOMIC;  var32={elsize=8;  datasize=DataSize8};  var64=false} ;
  "STXRH"   , STLXR {txt="STXRH";  acctype=AccType_ATOMIC;  var32={elsize=16; datasize=DataSize16}; var64=false} ;


  "LDAXP"   , LDXP {txt="LDAXP"; acctype=AccType_ORDERED} ;
  "LDXP"    , LDXP {txt="LDXP";  acctype=AccType_ATOMIC} ;

  "STLXP"   , STXP {txt="STLXP"; acctype=AccType_ORDERED} ;
  "STXP"    , STXP {txt="STXP";  acctype=AccType_ATOMIC} ;

  "LDR"    , LDSTR {txt="LDR";   memop=MemOp_LOAD; signed=false;  lit32=true;  var32=Some {datasize=DataSize32}; var64=Some {datasize=DataSize64}; lit64=Some {datasize=DataSize64; size=8}} ;
  "LDRB"   , LDSTR {txt="LDRB";  memop=MemOp_LOAD; signed=false;  lit32=false; var32=Some {datasize=DataSize8};  var64=None;                       lit64=None} ;
  "LDRH"   , LDSTR {txt="LDRH";  memop=MemOp_LOAD; signed=false;  lit32=false; var32=Some {datasize=DataSize16}; var64=None;                       lit64=None} ;
  "LDRSB"  , LDSTR {txt="LDRSB"; memop=MemOp_LOAD; signed=true;   lit32=false; var32=Some {datasize=DataSize8};  var64=Some {datasize=DataSize8};  lit64=None} ;
  "LDRSH"  , LDSTR {txt="LDRSH"; memop=MemOp_LOAD; signed=true;   lit32=false; var32=Some {datasize=DataSize16}; var64=Some {datasize=DataSize16}; lit64=None} ;
  "LDRSW"  , LDSTR {txt="LDRSW"; memop=MemOp_LOAD; signed=true;   lit32=false; var32=None;                       var64=Some {datasize=DataSize32}; lit64=Some {datasize=DataSize32; size=4}} ;
  "STR"    , LDSTR {txt="STR";   memop=MemOp_STORE; signed=false; lit32=false; var32=Some {datasize=DataSize32}; var64=Some {datasize=DataSize64}; lit64=None} ;
  "STRB"   , LDSTR {txt="STRB";  memop=MemOp_STORE; signed=false; lit32=false; var32=Some {datasize=DataSize8};  var64=None;                       lit64=None} ;
  "STRH"   , LDSTR {txt="STRH";  memop=MemOp_STORE; signed=false; lit32=false; var32=Some {datasize=DataSize16}; var64=None;                       lit64=None} ;

  "LDTR"    , LDSTTUR {txt="LDTR";   memop=MemOp_LOAD; acctype=AccType_UNPRIV; signed=false; off32=Some {datasize=DataSize32}; off64=Some {datasize=DataSize64}} ;
  "LDTRB"   , LDSTTUR {txt="LDTRB";  memop=MemOp_LOAD; acctype=AccType_UNPRIV; signed=false; off32=Some {datasize=DataSize8};  off64=None} ;
  "LDTRH"   , LDSTTUR {txt="LDTRH";  memop=MemOp_LOAD; acctype=AccType_UNPRIV; signed=false; off32=Some {datasize=DataSize16}; off64=None} ;
  "LDTRSB"  , LDSTTUR {txt="LDTRSB"; memop=MemOp_LOAD; acctype=AccType_UNPRIV; signed=true;  off32=Some {datasize=DataSize8};  off64=Some {datasize=DataSize8}} ;
  "LDTRSH"  , LDSTTUR {txt="LDTRSH"; memop=MemOp_LOAD; acctype=AccType_UNPRIV; signed=true;  off32=Some {datasize=DataSize16}; off64=Some {datasize=DataSize16}} ;
  "LDTRSW"  , LDSTTUR {txt="LDTRSW"; memop=MemOp_LOAD; acctype=AccType_UNPRIV; signed=true;  off32=None;                         off64=Some {datasize=DataSize32}} ;
  "LDUR"    , LDSTTUR {txt="LDUR";   memop=MemOp_LOAD; acctype=AccType_NORMAL; signed=false; off32=Some {datasize=DataSize32}; off64=Some {datasize=DataSize64}} ;
  "LDURB"   , LDSTTUR {txt="LDURB";  memop=MemOp_LOAD; acctype=AccType_NORMAL; signed=false; off32=Some {datasize=DataSize8};  off64=None} ;
  "LDURH"   , LDSTTUR {txt="LDURH";  memop=MemOp_LOAD; acctype=AccType_NORMAL; signed=false; off32=Some {datasize=DataSize16}; off64=None} ;
  "LDURSB"  , LDSTTUR {txt="LDURSB"; memop=MemOp_LOAD; acctype=AccType_NORMAL; signed=true;  off32=Some {datasize=DataSize8};  off64=Some {datasize=DataSize8}} ;
  "LDURSH"  , LDSTTUR {txt="LDURSH"; memop=MemOp_LOAD; acctype=AccType_NORMAL; signed=true;  off32=Some {datasize=DataSize16}; off64=Some {datasize=DataSize16}} ;
  "LDURSW"  , LDSTTUR {txt="LDURSW"; memop=MemOp_LOAD; acctype=AccType_NORMAL; signed=true;  off32=None;                         off64=Some {datasize=DataSize32}} ;
  "STTR"    , LDSTTUR {txt="STTR";   memop=MemOp_STORE; acctype=AccType_UNPRIV; signed=false; off32=Some {datasize=DataSize32}; off64=Some {datasize=DataSize64}} ;
  "STTRB"   , LDSTTUR {txt="STTRB";  memop=MemOp_STORE; acctype=AccType_UNPRIV; signed=false; off32=Some {datasize=DataSize8};  off64=None} ;
  "STTRH"   , LDSTTUR {txt="STTRH";  memop=MemOp_STORE; acctype=AccType_UNPRIV; signed=false; off32=Some {datasize=DataSize16}; off64=None} ;
  "STUR"    , LDSTTUR {txt="STUR";   memop=MemOp_STORE; acctype=AccType_NORMAL; signed=false; off32=Some {datasize=DataSize32}; off64=Some {datasize=DataSize64}} ;
  "STURB"   , LDSTTUR {txt="STURB";  memop=MemOp_STORE; acctype=AccType_NORMAL; signed=false; off32=Some {datasize=DataSize8};  off64=None} ;
  "STURH"   , LDSTTUR {txt="STURH";  memop=MemOp_STORE; acctype=AccType_NORMAL; signed=false; off32=Some {datasize=DataSize16}; off64=None} ;

  "MADD" , MADDSUB {txt="MADD"; sub_op=false} ;
  "MSUB" , MADDSUB {txt="MSUB"; sub_op=true} ;

  "MUL"  , MUL {txt="MUL";  sub_op=false} ;
  "MNEG" , MUL {txt="MNEG"; sub_op=true} ;

  "MOVK" , MOVWIDE {txt="MOVK"; opcode=MoveWideOp_K} ;
  "MOVN" , MOVWIDE {txt="MOVN"; opcode=MoveWideOp_N} ;
  "MOVZ" , MOVWIDE {txt="MOVZ"; opcode=MoveWideOp_Z} ;

  "NEG"  , NEG {txt="NEG";  setflags=false} ;
  "NEGS" , NEG {txt="NEGS"; setflags=true} ;

  "NGC"  , NGC {txt="NGC";  setflags=false} ;
  "NGCS" , NGC {txt="NGCS"; setflags=true} ;

  "RBIT"  , REV {txt="RBIT";  op32=Some RevOp_RBIT;  op64=RevOp_RBIT} ;
  "REV"   , REV {txt="REV";   op32=Some RevOp_REV32; op64=RevOp_REV64} ;
  "REV16" , REV {txt="REV16"; op32=Some RevOp_REV16; op64=RevOp_REV16} ;
  "REV32" , REV {txt="REV32"; op32=None;             op64=RevOp_REV32} ;

  "SDIV" , DIV {txt="SDIV"; unsigned=false} ;
  "UDIV" , DIV {txt="UDIV"; unsigned=true} ;

  "SMADDL" , MADDSUBL {txt="SMADDL"; sub_op=false; unsigned=false} ;
  "SMSUBL" , MADDSUBL {txt="SMSUBL"; sub_op=true;  unsigned=false} ;
  "UMADDL" , MADDSUBL {txt="UMADDL"; sub_op=false; unsigned=true} ;
  "UMSUBL" , MADDSUBL {txt="UMSUBL"; sub_op=true;  unsigned=true} ;

  "SMULH" , MULH {txt="SMULH"; unsigned=false} ;
  "UMULH" , MULH {txt="UMULH"; unsigned=true} ;

  "SMULL" , MULL {txt="SMULL"; unsigned=false} ;
  "UMULL" , MULL {txt="UMULL"; unsigned=true} ;

  "LDP" , LDSTP {txt="LDP"; memop=MemOp_LOAD} ;
  "STP" , LDSTP {txt="STP"; memop=MemOp_STORE} ;

  "TBZ"  , TBZ {txt="TBZ";  bit_val=false} ;
  "TBNZ" , TBZ {txt="TBNZ"; bit_val=true} ;

  "SBFIZ" , BFIZ {txt="SBFIZ"; extend=true} ;
  "UBFIZ" , BFIZ {txt="UBFIZ"; extend=false} ;

  "SBFX" , BFX {txt="SBFX"; extend=true} ;
  "UBFX" , BFX {txt="UBFX"; extend=false} ;

  "SMNEGL" , MNEGL {txt="SMNEGL"; unsigned=false} ;
  "UMNEGL" , MNEGL {txt="UMNEGL"; unsigned=true} ;

  "BFI" , BFI {txt="BFI"} ;
  "BFXIL" , BFXIL {txt="BFXIL"} ;
  "CLREX" , CLREX {txt="CLREX"} ;
  "EXTR" , EXTR {txt="EXTR"} ;
  "HINT" , HINT {txt="HINT"} ;
  "ISB" , ISB {txt="ISB"} ;
  "LDPSW" , LDPSW {txt="LDPSW"} ;
  "MOV" , MOV {txt="MOV"} ;
  "MVN" , MVN {txt="MVN"} ;
  "NOP" , NOP {txt="NOP"} ;
  "PRFM" , PRFM {txt="PRFM"} ;
  "PRFUM" , PRFUM {txt="PRFUM"} ;
  "RET" , RET {txt="RET"} ;
  "TST" , TST {txt="TST"} ;
  "MRS" , MRS {txt="MRS"} ;
  "MSR" , MSR {txt="MSR"} ;


(*** instructions/operands ***)

  "LSL"   , SHIFT {txt="LSL"; shift_type=ShiftType_LSL} ;
  "LSR"   , SHIFT {txt="LSR"; shift_type=ShiftType_LSR} ;
  "ASR"   , SHIFT {txt="ASR"; shift_type=ShiftType_ASR} ;
  "ROR"   , SHIFT {txt="ROR"; shift_type=ShiftType_ROR} ;

  "UXTB"  , EXTEND {txt="UXTB"; _type=ExtendType_UXTB; inst=Some {extend=false; imms=7}} ;
  "UXTH"  , EXTEND {txt="UXTH"; _type=ExtendType_UXTH; inst=Some {extend=false; imms=15}} ;
  "UXTW"  , EXTEND {txt="UXTW"; _type=ExtendType_UXTW; inst=None} ;
  "UXTX"  , EXTEND {txt="UXTX"; _type=ExtendType_UXTX; inst=None} ;
  "SXTB"  , EXTEND {txt="SXTB"; _type=ExtendType_SXTB; inst=Some {extend=true; imms=7}} ;
  "SXTH"  , EXTEND {txt="SXTH"; _type=ExtendType_SXTH; inst=Some {extend=true; imms=15}} ;
  "SXTW"  , EXTEND {txt="SXTW"; _type=ExtendType_SXTW; inst=Some {extend=true; imms=31}} ;
  "SXTX"  , EXTEND {txt="SXTX"; _type=ExtendType_SXTX; inst=None} ;

(*** operands: ***)

  "EQ" , COND 0b0000 ;
  "NE" , COND 0b0001 ;
  "CS" , COND 0b0010 ;
  "HS" , COND 0b0010 ;
  "CC" , COND 0b0011 ;
  "LO" , COND 0b0011 ;
  "MI" , COND 0b0100 ;
  "PL" , COND 0b0101 ;
  "VS" , COND 0b0110 ;
  "VC" , COND 0b0111 ;
  "HI" , COND 0b1000 ;
  "LS" , COND 0b1001 ;
  "GE" , COND 0b1010 ;
  "LT" , COND 0b1011 ;
  "GT" , COND 0b1100 ;
  "LE" , COND 0b1101 ;
  "AL" , COND 0b1110 ;
  "NV" , COND 0b1111 ; (* ARM: exists only to provide a valid disassembly
                               of the 0b1111 encoding, otherwise its
                               behavior is identical to AL *)

  "OSHLD" , BARROP {domain=MBReqDomain_OuterShareable; types=MBReqTypes_Reads} ;
  "OSHST" , BARROP {domain=MBReqDomain_OuterShareable; types=MBReqTypes_Writes} ;
  "OSH"   , BARROP {domain=MBReqDomain_OuterShareable; types=MBReqTypes_All} ;
  "NSHLD" , BARROP {domain=MBReqDomain_Nonshareable;   types=MBReqTypes_Reads} ;
  "NSHST" , BARROP {domain=MBReqDomain_Nonshareable;   types=MBReqTypes_Writes} ;
  "NSH"   , BARROP {domain=MBReqDomain_Nonshareable;   types=MBReqTypes_All} ;
  "ISHLD" , BARROP {domain=MBReqDomain_InnerShareable; types=MBReqTypes_Reads} ;
  "ISHST" , BARROP {domain=MBReqDomain_InnerShareable; types=MBReqTypes_Writes} ;
  "ISH"   , BARROP {domain=MBReqDomain_InnerShareable; types=MBReqTypes_All} ;
  "LD"    , BARROP {domain=MBReqDomain_FullSystem;     types=MBReqTypes_Reads} ;
  "ST"    , BARROP {domain=MBReqDomain_FullSystem;     types=MBReqTypes_Writes} ;
  "SY"    , BARROP {domain=MBReqDomain_FullSystem;     types=MBReqTypes_All} ;

  "PLDL1KEEP" , PRFOP (X (Ireg R0)) ;
  "PLDL1STRM" , PRFOP (X (Ireg R1)) ;
  "PLDL2KEEP" , PRFOP (X (Ireg R2)) ;
  "PLDL2STRM" , PRFOP (X (Ireg R3)) ;
  "PLDL3KEEP" , PRFOP (X (Ireg R4)) ;
  "PLDL3STRM" , PRFOP (X (Ireg R5)) ;

  "PLIL1KEEP" , PRFOP (X (Ireg R8)) ;
  "PLIL1STRM" , PRFOP (X (Ireg R9)) ;
  "PLIL2KEEP" , PRFOP (X (Ireg R10)) ;
  "PLIL2STRM" , PRFOP (X (Ireg R11)) ;
  "PLIL3KEEP" , PRFOP (X (Ireg R12)) ;
  "PLIL3STRM" , PRFOP (X (Ireg R13)) ;

  "PSTL1KEEP" , PRFOP (X (Ireg R16)) ;
  "PSTL1STRM" , PRFOP (X (Ireg R17)) ;
  "PSTL2KEEP" , PRFOP (X (Ireg R18)) ;
  "PSTL2STRM" , PRFOP (X (Ireg R19)) ;
  "PSTL3KEEP" , PRFOP (X (Ireg R20)) ;
  "PSTL3STRM" , PRFOP (X (Ireg R21)) ;

  "NZCV" , SYSREG {sys_op0=0b11; sys_op1=0b011; sys_op2=0b000; sys_crn=0b0100; sys_crm=0b0010} ;
  "DAIF" , SYSREG {sys_op0=0b11; sys_op1=0b011; sys_op2=0b001; sys_crn=0b0100; sys_crm=0b0010} ;
  "TPIDR_EL0" , SYSREG {sys_op0=0b11; sys_op1=0b011; sys_op2=0b010; sys_crn=0b1101; sys_crm=0b0000} ;
  "TPIDR_EL1" , SYSREG {sys_op0=0b11; sys_op1=0b000; sys_op2=0b100; sys_crn=0b1101; sys_crm=0b0000} ;
  "TPIDR_EL2" , SYSREG {sys_op0=0b11; sys_op1=0b100; sys_op2=0b010; sys_crn=0b1101; sys_crm=0b0000} ;
  "TPIDR_EL3" , SYSREG {sys_op0=0b11; sys_op1=0b011; sys_op2=0b011; sys_crn=0b1101; sys_crm=0b0000} ;

  "SPSel"   , PSTATEFIELD (PSTATEField_SP) ;
  "DAIFSet" , PSTATEFIELD (PSTATEField_DAIFSet) ;
  "DAIFClr" , PSTATEFIELD (PSTATEField_DAIFClr) ;