summaryrefslogtreecommitdiff
path: root/aarch64_small/gen/herdtools_ast_to_shallow_ast.hgen
blob: 2d0ac5e23b36b14cff303131f1e0c678b5d9bca4 (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
| `AArch64Unallocated -> Unallocated ()
| `AArch64TMStart t -> TMStart (translate_reg "t" t)

| `AArch64TMCommit -> TMCommit ()

| `AArch64TMAbort (retry,reason) ->
    TMAbort
      (translate_bool "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)