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
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
|
| `AArch64TMStart t ->
("TMStart", [translate_reg "t" t], [])
| `AArch64TMCommit -> ("TMCommit", [], [])
| `AArch64TMAbort (retry,reason) ->
("TMAbort",
[ translate_boolean "retry" retry;
translate_bit5 "reason" reason],
[])
| `AArch64TMTest -> ("TMTest", [], [])
| `AArch64ImplementationDefinedStopFetching ->
("ImplementationDefinedStopFetching",
[],
[])
| `AArch64ImplementationDefinedThreadStart ->
("ImplementationDefinedThreadStart",
[],
[])
| `AArch64ImplementationDefinedTestBeginEnd(isEnd) ->
("ImplementationDefinedTestBeginEnd",
[translate_boolean "isEnd" isEnd],
[])
| `AArch64AddSubCarry(d,n,m,datasize,sub_op,setflags) ->
("AddSubCarry",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg "m" m;
translate_reg_size "datasize" datasize;
translate_boolean "sub_op" sub_op;
translate_boolean "setflags" setflags],
[])
| `AArch64AddSubExtendRegister (d,n,m,datasize,sub_op,setflags,extend_type,shift) ->
("AddSubExtendRegister",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg "m" m;
translate_reg_size "datasize" datasize;
translate_boolean "sub_op" sub_op;
translate_boolean "setflags" setflags;
translate_extendType "extend_type" extend_type;
translate_range0_7 "shift" shift],
[])
| `AArch64AddSubShiftedRegister (d,n,m,datasize,sub_op,setflags,shift_type,shift_amount) ->
("AddSubShiftedRegister",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg "m" m;
translate_reg_size "datasize" datasize;
translate_boolean "sub_op" sub_op;
translate_boolean "setflags" setflags;
translate_shiftType "shift_type" shift_type;
translate_range0_63 "shift_amount" shift_amount],
[])
| `AArch64AddSubImmediate (d,n,datasize,sub_op,setflags,imm) ->
("AddSubImmediate",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg_size "datasize" datasize;
translate_boolean "sub_op" sub_op;
translate_boolean "setflags" setflags;
translate_reg_size_bits "imm" imm],
[])
| `AArch64Address (d,page,imm) ->
("Address",
[translate_reg "d" d;
translate_boolean "page" page;
translate_bit64 "imm" imm],
[])
| `AArch64LogicalImmediate (d,n,datasize,setflags,op,imm) ->
("LogicalImmediate",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg_size "datasize" datasize;
translate_boolean "setflags" setflags;
translate_logicalOp "op" op;
translate_reg_size_bits "imm" imm],
[])
| `AArch64LogicalShiftedRegister (d,n,m,datasize,setflags,op,shift_type,shift_amount,invert) ->
("LogicalShiftedRegister",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg "m" m;
translate_reg_size "datasize" datasize;
translate_boolean "setflags" setflags;
translate_logicalOp "op" op;
translate_shiftType "shift_type" shift_type;
translate_range0_63 "shift_amount" shift_amount;
translate_boolean "invert" invert],
[])
| `AArch64Shift (d,n,m,datasize,shift_type) ->
("Shift",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg "m" m;
translate_reg_size "datasize" datasize;
translate_shiftType "shift_type" shift_type],
[])
| `AArch64BranchConditional (offset,condition) ->
("BranchConditional",
[translate_bit64 "offset" offset;
translate_bit4 "condition" condition],
[])
| `AArch64BranchImmediate (branch_type,offset) ->
("BranchImmediate",
[translate_branchType "branch_type" branch_type;
translate_bit64 "offset" offset],
[])
| `AArch64BitfieldMove (d,n,datasize,inzero,extend,_R,_S,wmask,tmask) ->
("BitfieldMove",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg_size "datasize" datasize;
translate_boolean "inzero" inzero;
translate_boolean "extend" extend;
translate_uinteger "_R" _R;
translate_uinteger "_S" _S;
translate_reg_size_bits "wmask" wmask;
translate_reg_size_bits "tmask" tmask],
[])
| `AArch64BranchRegister (n,branch_type) ->
("BranchRegister",
[translate_reg "n" n;
translate_branchType "branch_type" branch_type],
[])
| `AArch64CompareAndBranch (t,datasize,iszero,offset) ->
("CompareAndBranch",
[translate_reg "t" t;
translate_reg_size "datasize" datasize;
translate_boolean "iszero" iszero;
translate_bit64 "offset" offset],
[])
| `AArch64ConditionalCompareImmediate (n,datasize,sub_op,condition,flags,imm) ->
("ConditionalCompareImmediate",
[translate_reg "n" n;
translate_reg_size "datasize" datasize;
translate_boolean "sub_op" sub_op;
translate_bit4 "condition" condition;
translate_bit4 "flags" flags;
translate_reg_size_bits "imm" imm],
[])
| `AArch64ConditionalCompareRegister (n,m,datasize,sub_op,condition,flags) ->
("ConditionalCompareRegister",
[translate_reg "n" n;
translate_reg "m" m;
translate_reg_size "datasize" datasize;
translate_boolean "sub_op" sub_op;
translate_bit4 "condition" condition;
translate_bit4 "flags" flags],
[])
| `AArch64ClearExclusiveMonitor (imm) ->
("ClearExclusiveMonitor",
[translate_uinteger "imm" imm],
[])
| `AArch64CountLeading (d,n,datasize,opcode) ->
("CountLeading",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg_size "datasize" datasize;
translate_countOp "opcode" opcode],
[])
| `AArch64CRC (d,n,m,size,crc32c) ->
("CRC",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg "m" m;
translate_data_size "size" size;
translate_boolean "crc32c" crc32c],
[])
| `AArch64ConditionalSelect (d,n,m,datasize,condition,else_inv,else_inc) ->
("ConditionalSelect",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg "m" m;
translate_reg_size "datasize" datasize;
translate_bit4 "condition" condition;
translate_boolean "else_inv" else_inv;
translate_boolean "else_inc" else_inc],
[])
| `AArch64Barrier (op,domain,types) ->
("Barrier",
[translate_memBarrierOp "op" op;
translate_mBReqDomain "domain" domain;
translate_mBReqTypes "types" types],
[])
| `AArch64ExtractRegister (d,n,m,datasize,lsb) ->
("ExtractRegister",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg "m" m;
translate_reg_size "datasize" datasize;
translate_uinteger "lsb" lsb],
[])
| `AArch64Hint (op) ->
("Hint",
[translate_systemHintOp "op" op],
[])
| `AArch64LoadStoreAcqExc (n,t,t2,s,acctype,excl,pair,memop,elsize,regsize,datasize) ->
("LoadStoreAcqExc",
[translate_reg "n" n;
translate_reg "t" t;
translate_reg "t2" t2;
translate_reg "s" s;
translate_accType "acctype" acctype;
translate_boolean "excl" excl;
translate_boolean "pair" pair;
translate_memOp "memop" memop;
translate_uinteger "elsize" elsize;
translate_reg_size "regsize" regsize;
translate_data_size "datasize" datasize],
[])
| `AArch64LoadStorePair (wback,postindex,n,t,t2,acctype,memop,signed,datasize,offset) ->
("LoadStorePair",
[translate_boolean "wback" wback;
translate_boolean "postindex" postindex;
translate_reg "n" n;
translate_reg "t" t;
translate_reg "t2" t2;
translate_accType "acctype" acctype;
translate_memOp "memop" memop;
translate_boolean "signed" signed;
translate_data_size "datasize" datasize;
translate_bit64 "offset" offset],
[])
| `AArch64LoadImmediate (n,t,acctype,memop,signed,wback,postindex,offset,regsize,datasize) ->
("LoadImmediate",
[translate_reg "n" n;
translate_reg "t" t;
translate_accType "acctype" acctype;
translate_memOp "memop" memop;
translate_boolean "signed" signed;
translate_boolean "wback" wback;
translate_boolean "postindex" postindex;
translate_bit64 "offset" offset;
translate_reg_size "regsize" regsize;
translate_data_size "datasize" datasize],
[])
| `AArch64LoadLiteral (t,memop,signed,size,offset,datasize) ->
("LoadLiteral",
[translate_reg "t" t;
translate_memOp "memop" memop;
translate_boolean "signed" signed;
translate_uinteger "size" size;
translate_bit64 "offset" offset;
translate_data_size "datasize" datasize;],
[])
| `AArch64LoadRegister (n,t,m,acctype,memop,signed,wback,postindex,extend_type,shift,regsize,datasize) ->
("LoadRegister",
[translate_reg "n" n;
translate_reg "t" t;
translate_reg "m" m;
translate_accType "acctype" acctype;
translate_memOp "memop" memop;
translate_boolean "signed" signed;
translate_boolean "wback" wback;
translate_boolean "postindex" postindex;
translate_extendType "extend_type" extend_type;
translate_uinteger "shift" shift;
translate_reg_size "regsize" regsize;
translate_data_size "datasize" datasize],
[])
| `AArch64MultiplyAddSub (d,n,m,a,destsize,datasize,sub_op) ->
("MultiplyAddSub",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg "m" m;
translate_reg "a" a;
translate_reg_size "destsize" destsize;
translate_data_size "datasize" datasize;
translate_boolean "sub_op" sub_op],
[])
| `AArch64MoveWide (d,datasize,imm,pos,opcode) ->
("MoveWide",
[translate_reg "d" d;
translate_reg_size "datasize" datasize;
translate_bit16 "imm" imm;
translate_uinteger "pos" pos;
translate_moveWideOp "opcode" opcode],
[])
| `AArch64Reverse (d,n,datasize,op) ->
("Reverse",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg_size "datasize" datasize;
translate_revOp "op" op],
[])
| `AArch64Division (d,n,m,datasize,unsigned) ->
("Division",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg "m" m;
translate_reg_size "datasize" datasize;
translate_boolean "unsigned" unsigned],
[])
| `AArch64MultiplyAddSubLong (d,n,m,a,destsize,datasize,sub_op,unsigned) ->
("MultiplyAddSubLong",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg "m" m;
translate_reg "a" a;
translate_reg_size "destsize" destsize;
translate_data_size "datasize" datasize;
translate_boolean "sub_op" sub_op;
translate_boolean "unsigned" unsigned],
[])
| `AArch64MultiplyHigh (d,n,m,a,destsize,datasize,unsigned) ->
("MultiplyHigh",
[translate_reg "d" d;
translate_reg "n" n;
translate_reg "m" m;
translate_reg "a" a;
translate_reg_size "destsize" destsize;
translate_data_size "datasize" datasize;
translate_boolean "unsigned" unsigned],
[])
| `AArch64TestBitAndBranch (t,datasize,bit_pos,bit_val,offset) ->
("TestBitAndBranch",
[translate_reg "t" t;
translate_reg_size "datasize" datasize;
translate_uinteger "bit_pos" bit_pos;
translate_bit "bit_val" bit_val;
translate_bit64 "offset" offset],
[])
| `AArch64MoveSystemRegister (t,sys_op0,sys_op1,sys_op2,sys_crn,sys_crm,read) ->
("MoveSystemRegister",
[translate_reg "t" t;
translate_uinteger "sys_op0" sys_op0;
translate_uinteger "sys_op1" sys_op1;
translate_uinteger "sys_op2" sys_op2;
translate_uinteger "sys_crn" sys_crn;
translate_uinteger "sys_crm" sys_crm;
translate_boolean "read" read],
[])
| `AArch64MoveSystemImmediate (operand,field) ->
("MoveSystemImmediate",
[translate_bit4 "operand" operand;
translate_pSTATEField "field" field],
[])
|