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
|
| `AArch64Unallocated -> Unallocated
| `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) ->
Address0
(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) ->
Barrier3
(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)
|