summaryrefslogtreecommitdiff
path: root/aarch64_small/gen/trans_sail.hgen
blob: 2b176308689836820afc4078468c58b2dc273951 (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
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],
      [])