1
2
3
4
5
6
7
8 package main
9
10
11
12
13
14
15
16
17
18
19
20
21 var genericOps = []opData{
22
23
24
25 {name: "Add8", argLength: 2, commutative: true},
26 {name: "Add16", argLength: 2, commutative: true},
27 {name: "Add32", argLength: 2, commutative: true},
28 {name: "Add64", argLength: 2, commutative: true},
29 {name: "AddPtr", argLength: 2},
30 {name: "Add32F", argLength: 2, commutative: true},
31 {name: "Add64F", argLength: 2, commutative: true},
32
33 {name: "Sub8", argLength: 2},
34 {name: "Sub16", argLength: 2},
35 {name: "Sub32", argLength: 2},
36 {name: "Sub64", argLength: 2},
37 {name: "SubPtr", argLength: 2},
38 {name: "Sub32F", argLength: 2},
39 {name: "Sub64F", argLength: 2},
40
41 {name: "Mul8", argLength: 2, commutative: true},
42 {name: "Mul16", argLength: 2, commutative: true},
43 {name: "Mul32", argLength: 2, commutative: true},
44 {name: "Mul64", argLength: 2, commutative: true},
45 {name: "Mul32F", argLength: 2, commutative: true},
46 {name: "Mul64F", argLength: 2, commutative: true},
47
48 {name: "Div32F", argLength: 2},
49 {name: "Div64F", argLength: 2},
50
51 {name: "Hmul32", argLength: 2, commutative: true},
52 {name: "Hmul32u", argLength: 2, commutative: true},
53 {name: "Hmul64", argLength: 2, commutative: true},
54 {name: "Hmul64u", argLength: 2, commutative: true},
55
56 {name: "Mul32uhilo", argLength: 2, typ: "(UInt32,UInt32)", commutative: true},
57 {name: "Mul64uhilo", argLength: 2, typ: "(UInt64,UInt64)", commutative: true},
58
59 {name: "Mul32uover", argLength: 2, typ: "(UInt32,Bool)", commutative: true},
60 {name: "Mul64uover", argLength: 2, typ: "(UInt64,Bool)", commutative: true},
61
62
63
64
65
66
67 {name: "Avg32u", argLength: 2, typ: "UInt32"},
68 {name: "Avg64u", argLength: 2, typ: "UInt64"},
69
70
71
72 {name: "Div8", argLength: 2},
73 {name: "Div8u", argLength: 2},
74 {name: "Div16", argLength: 2, aux: "Bool"},
75 {name: "Div16u", argLength: 2},
76 {name: "Div32", argLength: 2, aux: "Bool"},
77 {name: "Div32u", argLength: 2},
78 {name: "Div64", argLength: 2, aux: "Bool"},
79 {name: "Div64u", argLength: 2},
80 {name: "Div128u", argLength: 3},
81
82
83 {name: "Mod8", argLength: 2},
84 {name: "Mod8u", argLength: 2},
85 {name: "Mod16", argLength: 2, aux: "Bool"},
86 {name: "Mod16u", argLength: 2},
87 {name: "Mod32", argLength: 2, aux: "Bool"},
88 {name: "Mod32u", argLength: 2},
89 {name: "Mod64", argLength: 2, aux: "Bool"},
90 {name: "Mod64u", argLength: 2},
91
92 {name: "And8", argLength: 2, commutative: true},
93 {name: "And16", argLength: 2, commutative: true},
94 {name: "And32", argLength: 2, commutative: true},
95 {name: "And64", argLength: 2, commutative: true},
96
97 {name: "Or8", argLength: 2, commutative: true},
98 {name: "Or16", argLength: 2, commutative: true},
99 {name: "Or32", argLength: 2, commutative: true},
100 {name: "Or64", argLength: 2, commutative: true},
101
102 {name: "Xor8", argLength: 2, commutative: true},
103 {name: "Xor16", argLength: 2, commutative: true},
104 {name: "Xor32", argLength: 2, commutative: true},
105 {name: "Xor64", argLength: 2, commutative: true},
106
107
108
109
110
111
112 {name: "Lsh8x8", argLength: 2, aux: "Bool"},
113 {name: "Lsh8x16", argLength: 2, aux: "Bool"},
114 {name: "Lsh8x32", argLength: 2, aux: "Bool"},
115 {name: "Lsh8x64", argLength: 2, aux: "Bool"},
116 {name: "Lsh16x8", argLength: 2, aux: "Bool"},
117 {name: "Lsh16x16", argLength: 2, aux: "Bool"},
118 {name: "Lsh16x32", argLength: 2, aux: "Bool"},
119 {name: "Lsh16x64", argLength: 2, aux: "Bool"},
120 {name: "Lsh32x8", argLength: 2, aux: "Bool"},
121 {name: "Lsh32x16", argLength: 2, aux: "Bool"},
122 {name: "Lsh32x32", argLength: 2, aux: "Bool"},
123 {name: "Lsh32x64", argLength: 2, aux: "Bool"},
124 {name: "Lsh64x8", argLength: 2, aux: "Bool"},
125 {name: "Lsh64x16", argLength: 2, aux: "Bool"},
126 {name: "Lsh64x32", argLength: 2, aux: "Bool"},
127 {name: "Lsh64x64", argLength: 2, aux: "Bool"},
128
129 {name: "Rsh8x8", argLength: 2, aux: "Bool"},
130 {name: "Rsh8x16", argLength: 2, aux: "Bool"},
131 {name: "Rsh8x32", argLength: 2, aux: "Bool"},
132 {name: "Rsh8x64", argLength: 2, aux: "Bool"},
133 {name: "Rsh16x8", argLength: 2, aux: "Bool"},
134 {name: "Rsh16x16", argLength: 2, aux: "Bool"},
135 {name: "Rsh16x32", argLength: 2, aux: "Bool"},
136 {name: "Rsh16x64", argLength: 2, aux: "Bool"},
137 {name: "Rsh32x8", argLength: 2, aux: "Bool"},
138 {name: "Rsh32x16", argLength: 2, aux: "Bool"},
139 {name: "Rsh32x32", argLength: 2, aux: "Bool"},
140 {name: "Rsh32x64", argLength: 2, aux: "Bool"},
141 {name: "Rsh64x8", argLength: 2, aux: "Bool"},
142 {name: "Rsh64x16", argLength: 2, aux: "Bool"},
143 {name: "Rsh64x32", argLength: 2, aux: "Bool"},
144 {name: "Rsh64x64", argLength: 2, aux: "Bool"},
145
146 {name: "Rsh8Ux8", argLength: 2, aux: "Bool"},
147 {name: "Rsh8Ux16", argLength: 2, aux: "Bool"},
148 {name: "Rsh8Ux32", argLength: 2, aux: "Bool"},
149 {name: "Rsh8Ux64", argLength: 2, aux: "Bool"},
150 {name: "Rsh16Ux8", argLength: 2, aux: "Bool"},
151 {name: "Rsh16Ux16", argLength: 2, aux: "Bool"},
152 {name: "Rsh16Ux32", argLength: 2, aux: "Bool"},
153 {name: "Rsh16Ux64", argLength: 2, aux: "Bool"},
154 {name: "Rsh32Ux8", argLength: 2, aux: "Bool"},
155 {name: "Rsh32Ux16", argLength: 2, aux: "Bool"},
156 {name: "Rsh32Ux32", argLength: 2, aux: "Bool"},
157 {name: "Rsh32Ux64", argLength: 2, aux: "Bool"},
158 {name: "Rsh64Ux8", argLength: 2, aux: "Bool"},
159 {name: "Rsh64Ux16", argLength: 2, aux: "Bool"},
160 {name: "Rsh64Ux32", argLength: 2, aux: "Bool"},
161 {name: "Rsh64Ux64", argLength: 2, aux: "Bool"},
162
163
164 {name: "Eq8", argLength: 2, commutative: true, typ: "Bool"},
165 {name: "Eq16", argLength: 2, commutative: true, typ: "Bool"},
166 {name: "Eq32", argLength: 2, commutative: true, typ: "Bool"},
167 {name: "Eq64", argLength: 2, commutative: true, typ: "Bool"},
168 {name: "EqPtr", argLength: 2, commutative: true, typ: "Bool"},
169 {name: "EqInter", argLength: 2, typ: "Bool"},
170 {name: "EqSlice", argLength: 2, typ: "Bool"},
171 {name: "Eq32F", argLength: 2, commutative: true, typ: "Bool"},
172 {name: "Eq64F", argLength: 2, commutative: true, typ: "Bool"},
173
174 {name: "Neq8", argLength: 2, commutative: true, typ: "Bool"},
175 {name: "Neq16", argLength: 2, commutative: true, typ: "Bool"},
176 {name: "Neq32", argLength: 2, commutative: true, typ: "Bool"},
177 {name: "Neq64", argLength: 2, commutative: true, typ: "Bool"},
178 {name: "NeqPtr", argLength: 2, commutative: true, typ: "Bool"},
179 {name: "NeqInter", argLength: 2, typ: "Bool"},
180 {name: "NeqSlice", argLength: 2, typ: "Bool"},
181 {name: "Neq32F", argLength: 2, commutative: true, typ: "Bool"},
182 {name: "Neq64F", argLength: 2, commutative: true, typ: "Bool"},
183
184 {name: "Less8", argLength: 2, typ: "Bool"},
185 {name: "Less8U", argLength: 2, typ: "Bool"},
186 {name: "Less16", argLength: 2, typ: "Bool"},
187 {name: "Less16U", argLength: 2, typ: "Bool"},
188 {name: "Less32", argLength: 2, typ: "Bool"},
189 {name: "Less32U", argLength: 2, typ: "Bool"},
190 {name: "Less64", argLength: 2, typ: "Bool"},
191 {name: "Less64U", argLength: 2, typ: "Bool"},
192 {name: "Less32F", argLength: 2, typ: "Bool"},
193 {name: "Less64F", argLength: 2, typ: "Bool"},
194
195 {name: "Leq8", argLength: 2, typ: "Bool"},
196 {name: "Leq8U", argLength: 2, typ: "Bool"},
197 {name: "Leq16", argLength: 2, typ: "Bool"},
198 {name: "Leq16U", argLength: 2, typ: "Bool"},
199 {name: "Leq32", argLength: 2, typ: "Bool"},
200 {name: "Leq32U", argLength: 2, typ: "Bool"},
201 {name: "Leq64", argLength: 2, typ: "Bool"},
202 {name: "Leq64U", argLength: 2, typ: "Bool"},
203 {name: "Leq32F", argLength: 2, typ: "Bool"},
204 {name: "Leq64F", argLength: 2, typ: "Bool"},
205
206
207
208
209 {name: "CondSelect", argLength: 3},
210
211
212 {name: "AndB", argLength: 2, commutative: true, typ: "Bool"},
213 {name: "OrB", argLength: 2, commutative: true, typ: "Bool"},
214 {name: "EqB", argLength: 2, commutative: true, typ: "Bool"},
215 {name: "NeqB", argLength: 2, commutative: true, typ: "Bool"},
216 {name: "Not", argLength: 1, typ: "Bool"},
217
218
219 {name: "Neg8", argLength: 1},
220 {name: "Neg16", argLength: 1},
221 {name: "Neg32", argLength: 1},
222 {name: "Neg64", argLength: 1},
223 {name: "Neg32F", argLength: 1},
224 {name: "Neg64F", argLength: 1},
225
226 {name: "Com8", argLength: 1},
227 {name: "Com16", argLength: 1},
228 {name: "Com32", argLength: 1},
229 {name: "Com64", argLength: 1},
230
231 {name: "Ctz8", argLength: 1},
232 {name: "Ctz16", argLength: 1},
233 {name: "Ctz32", argLength: 1},
234 {name: "Ctz64", argLength: 1},
235 {name: "Ctz8NonZero", argLength: 1},
236 {name: "Ctz16NonZero", argLength: 1},
237 {name: "Ctz32NonZero", argLength: 1},
238 {name: "Ctz64NonZero", argLength: 1},
239 {name: "BitLen8", argLength: 1},
240 {name: "BitLen16", argLength: 1},
241 {name: "BitLen32", argLength: 1},
242 {name: "BitLen64", argLength: 1},
243
244 {name: "Bswap32", argLength: 1},
245 {name: "Bswap64", argLength: 1},
246
247 {name: "BitRev8", argLength: 1},
248 {name: "BitRev16", argLength: 1},
249 {name: "BitRev32", argLength: 1},
250 {name: "BitRev64", argLength: 1},
251
252 {name: "PopCount8", argLength: 1},
253 {name: "PopCount16", argLength: 1},
254 {name: "PopCount32", argLength: 1},
255 {name: "PopCount64", argLength: 1},
256 {name: "RotateLeft8", argLength: 2},
257 {name: "RotateLeft16", argLength: 2},
258 {name: "RotateLeft32", argLength: 2},
259 {name: "RotateLeft64", argLength: 2},
260
261
262
263
264
265
266
267 {name: "Sqrt", argLength: 1},
268 {name: "Sqrt32", argLength: 1},
269
270
271
272
273
274
275 {name: "Floor", argLength: 1},
276 {name: "Ceil", argLength: 1},
277 {name: "Trunc", argLength: 1},
278 {name: "Round", argLength: 1},
279 {name: "RoundToEven", argLength: 1},
280
281
282 {name: "Abs", argLength: 1},
283 {name: "Copysign", argLength: 2},
284
285
286
287
288
289
290
291
292
293
294
295
296
297 {name: "FMA", argLength: 3},
298
299
300 {name: "Phi", argLength: -1, zeroWidth: true},
301 {name: "Copy", argLength: 1},
302
303
304
305
306
307
308
309
310 {name: "Convert", argLength: 2, zeroWidth: true, resultInArg0: true},
311
312
313
314 {name: "ConstBool", aux: "Bool"},
315 {name: "ConstString", aux: "String"},
316 {name: "ConstNil", typ: "BytePtr"},
317 {name: "Const8", aux: "Int8"},
318 {name: "Const16", aux: "Int16"},
319 {name: "Const32", aux: "Int32"},
320
321
322 {name: "Const64", aux: "Int64"},
323
324
325
326
327
328 {name: "Const32F", aux: "Float32"},
329 {name: "Const64F", aux: "Float64"},
330 {name: "ConstInterface"},
331 {name: "ConstSlice"},
332
333
334 {name: "InitMem", zeroWidth: true},
335 {name: "Arg", aux: "SymOff", symEffect: "Read", zeroWidth: true},
336
337
338
339 {name: "ArgIntReg", aux: "NameOffsetInt8", zeroWidth: true},
340 {name: "ArgFloatReg", aux: "NameOffsetInt8", zeroWidth: true},
341
342
343
344
345
346
347 {name: "Addr", argLength: 1, aux: "Sym", symEffect: "Addr"},
348 {name: "LocalAddr", argLength: 2, aux: "Sym", symEffect: "Addr"},
349
350 {name: "SP", zeroWidth: true},
351 {name: "SB", typ: "Uintptr", zeroWidth: true},
352 {name: "Invalid"},
353
354
355 {name: "Load", argLength: 2},
356 {name: "Dereference", argLength: 2},
357 {name: "Store", argLength: 3, typ: "Mem", aux: "Typ"},
358
359
360
361
362
363
364
365
366
367
368 {name: "Move", argLength: 3, typ: "Mem", aux: "TypSize"},
369 {name: "Zero", argLength: 2, typ: "Mem", aux: "TypSize"},
370
371
372
373 {name: "StoreWB", argLength: 3, typ: "Mem", aux: "Typ"},
374 {name: "MoveWB", argLength: 3, typ: "Mem", aux: "TypSize"},
375 {name: "ZeroWB", argLength: 2, typ: "Mem", aux: "TypSize"},
376
377
378
379
380
381 {name: "WB", argLength: 3, typ: "Mem", aux: "Sym", symEffect: "None"},
382
383 {name: "HasCPUFeature", argLength: 0, typ: "bool", aux: "Sym", symEffect: "None"},
384
385
386
387
388
389
390 {name: "PanicBounds", argLength: 3, aux: "Int64", typ: "Mem", call: true},
391 {name: "PanicExtend", argLength: 4, aux: "Int64", typ: "Mem", call: true},
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417 {name: "ClosureCall", argLength: -1, aux: "CallOff", call: true},
418 {name: "StaticCall", argLength: -1, aux: "CallOff", call: true},
419 {name: "InterCall", argLength: -1, aux: "CallOff", call: true},
420 {name: "TailCall", argLength: -1, aux: "CallOff", call: true},
421
422 {name: "ClosureLECall", argLength: -1, aux: "CallOff", call: true},
423 {name: "StaticLECall", argLength: -1, aux: "CallOff", call: true},
424 {name: "InterLECall", argLength: -1, aux: "CallOff", call: true},
425 {name: "TailLECall", argLength: -1, aux: "CallOff", call: true},
426
427
428 {name: "SignExt8to16", argLength: 1, typ: "Int16"},
429 {name: "SignExt8to32", argLength: 1, typ: "Int32"},
430 {name: "SignExt8to64", argLength: 1, typ: "Int64"},
431 {name: "SignExt16to32", argLength: 1, typ: "Int32"},
432 {name: "SignExt16to64", argLength: 1, typ: "Int64"},
433 {name: "SignExt32to64", argLength: 1, typ: "Int64"},
434 {name: "ZeroExt8to16", argLength: 1, typ: "UInt16"},
435 {name: "ZeroExt8to32", argLength: 1, typ: "UInt32"},
436 {name: "ZeroExt8to64", argLength: 1, typ: "UInt64"},
437 {name: "ZeroExt16to32", argLength: 1, typ: "UInt32"},
438 {name: "ZeroExt16to64", argLength: 1, typ: "UInt64"},
439 {name: "ZeroExt32to64", argLength: 1, typ: "UInt64"},
440 {name: "Trunc16to8", argLength: 1},
441 {name: "Trunc32to8", argLength: 1},
442 {name: "Trunc32to16", argLength: 1},
443 {name: "Trunc64to8", argLength: 1},
444 {name: "Trunc64to16", argLength: 1},
445 {name: "Trunc64to32", argLength: 1},
446
447 {name: "Cvt32to32F", argLength: 1},
448 {name: "Cvt32to64F", argLength: 1},
449 {name: "Cvt64to32F", argLength: 1},
450 {name: "Cvt64to64F", argLength: 1},
451 {name: "Cvt32Fto32", argLength: 1},
452 {name: "Cvt32Fto64", argLength: 1},
453 {name: "Cvt64Fto32", argLength: 1},
454 {name: "Cvt64Fto64", argLength: 1},
455 {name: "Cvt32Fto64F", argLength: 1},
456 {name: "Cvt64Fto32F", argLength: 1},
457 {name: "CvtBoolToUint8", argLength: 1},
458
459
460 {name: "Round32F", argLength: 1},
461 {name: "Round64F", argLength: 1},
462
463
464 {name: "IsNonNil", argLength: 1, typ: "Bool"},
465 {name: "IsInBounds", argLength: 2, typ: "Bool"},
466 {name: "IsSliceInBounds", argLength: 2, typ: "Bool"},
467 {name: "NilCheck", argLength: 2, typ: "Void"},
468
469
470 {name: "GetG", argLength: 1, zeroWidth: true},
471 {name: "GetClosurePtr"},
472 {name: "GetCallerPC"},
473 {name: "GetCallerSP"},
474
475
476 {name: "PtrIndex", argLength: 2},
477 {name: "OffPtr", argLength: 1, aux: "Int64"},
478
479
480 {name: "SliceMake", argLength: 3},
481 {name: "SlicePtr", argLength: 1, typ: "BytePtr"},
482 {name: "SliceLen", argLength: 1},
483 {name: "SliceCap", argLength: 1},
484
485
486
487 {name: "SlicePtrUnchecked", argLength: 1},
488
489
490 {name: "ComplexMake", argLength: 2},
491 {name: "ComplexReal", argLength: 1},
492 {name: "ComplexImag", argLength: 1},
493
494
495 {name: "StringMake", argLength: 2},
496 {name: "StringPtr", argLength: 1, typ: "BytePtr"},
497 {name: "StringLen", argLength: 1, typ: "Int"},
498
499
500 {name: "IMake", argLength: 2},
501 {name: "ITab", argLength: 1, typ: "Uintptr"},
502 {name: "IData", argLength: 1},
503
504
505 {name: "StructMake0"},
506 {name: "StructMake1", argLength: 1},
507 {name: "StructMake2", argLength: 2},
508 {name: "StructMake3", argLength: 3},
509 {name: "StructMake4", argLength: 4},
510 {name: "StructSelect", argLength: 1, aux: "Int64"},
511
512
513 {name: "ArrayMake0"},
514 {name: "ArrayMake1", argLength: 1},
515 {name: "ArraySelect", argLength: 1, aux: "Int64"},
516
517
518
519
520
521 {name: "StoreReg", argLength: 1},
522 {name: "LoadReg", argLength: 1},
523
524
525 {name: "FwdRef", aux: "Sym", symEffect: "None"},
526
527
528 {name: "Unknown"},
529
530 {name: "VarDef", argLength: 1, aux: "Sym", typ: "Mem", symEffect: "None", zeroWidth: true},
531 {name: "VarKill", argLength: 1, aux: "Sym", symEffect: "None"},
532
533 {name: "VarLive", argLength: 1, aux: "Sym", symEffect: "Read", zeroWidth: true},
534 {name: "KeepAlive", argLength: 2, typ: "Mem", zeroWidth: true},
535
536
537
538 {name: "InlMark", argLength: 1, aux: "Int32", typ: "Void"},
539
540
541 {name: "Int64Make", argLength: 2, typ: "UInt64"},
542 {name: "Int64Hi", argLength: 1, typ: "UInt32"},
543 {name: "Int64Lo", argLength: 1, typ: "UInt32"},
544
545 {name: "Add32carry", argLength: 2, commutative: true, typ: "(UInt32,Flags)"},
546 {name: "Add32withcarry", argLength: 3, commutative: true},
547
548 {name: "Sub32carry", argLength: 2, typ: "(UInt32,Flags)"},
549 {name: "Sub32withcarry", argLength: 3},
550
551 {name: "Add64carry", argLength: 3, commutative: true, typ: "(UInt64,UInt64)"},
552 {name: "Sub64borrow", argLength: 3, typ: "(UInt64,UInt64)"},
553
554 {name: "Signmask", argLength: 1, typ: "Int32"},
555 {name: "Zeromask", argLength: 1, typ: "UInt32"},
556 {name: "Slicemask", argLength: 1},
557
558 {name: "SpectreIndex", argLength: 2},
559 {name: "SpectreSliceIndex", argLength: 2},
560
561 {name: "Cvt32Uto32F", argLength: 1},
562 {name: "Cvt32Uto64F", argLength: 1},
563 {name: "Cvt32Fto32U", argLength: 1},
564 {name: "Cvt64Fto32U", argLength: 1},
565 {name: "Cvt64Uto32F", argLength: 1},
566 {name: "Cvt64Uto64F", argLength: 1},
567 {name: "Cvt32Fto64U", argLength: 1},
568 {name: "Cvt64Fto64U", argLength: 1},
569
570
571 {name: "Select0", argLength: 1, zeroWidth: true},
572 {name: "Select1", argLength: 1, zeroWidth: true},
573 {name: "SelectN", argLength: 1, aux: "Int64"},
574 {name: "SelectNAddr", argLength: 1, aux: "Int64"},
575 {name: "MakeResult", argLength: -1},
576
577
578
579
580
581 {name: "AtomicLoad8", argLength: 2, typ: "(UInt8,Mem)"},
582 {name: "AtomicLoad32", argLength: 2, typ: "(UInt32,Mem)"},
583 {name: "AtomicLoad64", argLength: 2, typ: "(UInt64,Mem)"},
584 {name: "AtomicLoadPtr", argLength: 2, typ: "(BytePtr,Mem)"},
585 {name: "AtomicLoadAcq32", argLength: 2, typ: "(UInt32,Mem)"},
586 {name: "AtomicLoadAcq64", argLength: 2, typ: "(UInt64,Mem)"},
587 {name: "AtomicStore8", argLength: 3, typ: "Mem", hasSideEffects: true},
588 {name: "AtomicStore32", argLength: 3, typ: "Mem", hasSideEffects: true},
589 {name: "AtomicStore64", argLength: 3, typ: "Mem", hasSideEffects: true},
590 {name: "AtomicStorePtrNoWB", argLength: 3, typ: "Mem", hasSideEffects: true},
591 {name: "AtomicStoreRel32", argLength: 3, typ: "Mem", hasSideEffects: true},
592 {name: "AtomicStoreRel64", argLength: 3, typ: "Mem", hasSideEffects: true},
593 {name: "AtomicExchange32", argLength: 3, typ: "(UInt32,Mem)", hasSideEffects: true},
594 {name: "AtomicExchange64", argLength: 3, typ: "(UInt64,Mem)", hasSideEffects: true},
595 {name: "AtomicAdd32", argLength: 3, typ: "(UInt32,Mem)", hasSideEffects: true},
596 {name: "AtomicAdd64", argLength: 3, typ: "(UInt64,Mem)", hasSideEffects: true},
597 {name: "AtomicCompareAndSwap32", argLength: 4, typ: "(Bool,Mem)", hasSideEffects: true},
598 {name: "AtomicCompareAndSwap64", argLength: 4, typ: "(Bool,Mem)", hasSideEffects: true},
599 {name: "AtomicCompareAndSwapRel32", argLength: 4, typ: "(Bool,Mem)", hasSideEffects: true},
600 {name: "AtomicAnd8", argLength: 3, typ: "Mem", hasSideEffects: true},
601 {name: "AtomicAnd32", argLength: 3, typ: "Mem", hasSideEffects: true},
602 {name: "AtomicOr8", argLength: 3, typ: "Mem", hasSideEffects: true},
603 {name: "AtomicOr32", argLength: 3, typ: "Mem", hasSideEffects: true},
604
605
606
607
608
609 {name: "AtomicAdd32Variant", argLength: 3, typ: "(UInt32,Mem)", hasSideEffects: true},
610 {name: "AtomicAdd64Variant", argLength: 3, typ: "(UInt64,Mem)", hasSideEffects: true},
611 {name: "AtomicExchange32Variant", argLength: 3, typ: "(UInt32,Mem)", hasSideEffects: true},
612 {name: "AtomicExchange64Variant", argLength: 3, typ: "(UInt64,Mem)", hasSideEffects: true},
613 {name: "AtomicCompareAndSwap32Variant", argLength: 4, typ: "(Bool,Mem)", hasSideEffects: true},
614 {name: "AtomicCompareAndSwap64Variant", argLength: 4, typ: "(Bool,Mem)", hasSideEffects: true},
615 {name: "AtomicAnd8Variant", argLength: 3, typ: "Mem", hasSideEffects: true},
616 {name: "AtomicAnd32Variant", argLength: 3, typ: "Mem", hasSideEffects: true},
617 {name: "AtomicOr8Variant", argLength: 3, typ: "Mem", hasSideEffects: true},
618 {name: "AtomicOr32Variant", argLength: 3, typ: "Mem", hasSideEffects: true},
619
620
621 {name: "PubBarrier", argLength: 1, hasSideEffects: true},
622
623
624 {name: "Clobber", argLength: 0, typ: "Void", aux: "SymOff", symEffect: "None"},
625 {name: "ClobberReg", argLength: 0, typ: "Void"},
626
627
628 {name: "PrefetchCache", argLength: 2, hasSideEffects: true},
629 {name: "PrefetchCacheStreamed", argLength: 2, hasSideEffects: true},
630 }
631
632
633
634
635
636
637
638
639
640
641 var genericBlocks = []blockData{
642 {name: "Plain"},
643 {name: "If", controls: 1},
644 {name: "Defer", controls: 1},
645 {name: "Ret", controls: 1},
646 {name: "RetJmp", controls: 1},
647 {name: "Exit", controls: 1},
648
649
650 {name: "First"},
651 }
652
653 func init() {
654 archs = append(archs, arch{
655 name: "generic",
656 ops: genericOps,
657 blocks: genericBlocks,
658 generic: true,
659 })
660 }
661
View as plain text