1
2
3
4
5 package main
6
7 import (
8 "log"
9 "slices"
10 "strings"
11 )
12
13
14
15
16
17
18
19
20
21
22
23
24 var genericOps = []opData{
25
26 {name: "Last", argLength: -1},
27
28
29
30
31 {name: "Add8", argLength: 2, commutative: true, earlyOk: true},
32 {name: "Add16", argLength: 2, commutative: true, earlyOk: true},
33 {name: "Add32", argLength: 2, commutative: true, earlyOk: true},
34 {name: "Add64", argLength: 2, commutative: true, earlyOk: true},
35 {name: "AddPtr", argLength: 2},
36 {name: "Add32F", argLength: 2, commutative: true, earlyOk: true},
37 {name: "Add64F", argLength: 2, commutative: true, earlyOk: true},
38
39 {name: "Sub8", argLength: 2, earlyOk: true},
40 {name: "Sub16", argLength: 2, earlyOk: true},
41 {name: "Sub32", argLength: 2, earlyOk: true},
42 {name: "Sub64", argLength: 2, earlyOk: true},
43 {name: "SubPtr", argLength: 2},
44 {name: "Sub32F", argLength: 2, earlyOk: true},
45 {name: "Sub64F", argLength: 2, earlyOk: true},
46
47 {name: "Mul8", argLength: 2, commutative: true, earlyOk: true},
48 {name: "Mul16", argLength: 2, commutative: true, earlyOk: true},
49 {name: "Mul32", argLength: 2, commutative: true, earlyOk: true},
50 {name: "Mul64", argLength: 2, commutative: true, earlyOk: true},
51 {name: "Mul32F", argLength: 2, commutative: true, earlyOk: true},
52 {name: "Mul64F", argLength: 2, commutative: true, earlyOk: true},
53
54 {name: "Div32F", argLength: 2},
55 {name: "Div64F", argLength: 2},
56
57 {name: "Hmul32", argLength: 2, commutative: true, earlyOk: true},
58 {name: "Hmul32u", argLength: 2, commutative: true, earlyOk: true},
59 {name: "Hmul64", argLength: 2, commutative: true, earlyOk: true},
60 {name: "Hmul64u", argLength: 2, commutative: true, earlyOk: true},
61
62 {name: "Mul32uhilo", argLength: 2, typ: "(UInt32,UInt32)", commutative: true, earlyOk: true},
63 {name: "Mul64uhilo", argLength: 2, typ: "(UInt64,UInt64)", commutative: true, earlyOk: true},
64
65 {name: "Mul32uover", argLength: 2, typ: "(UInt32,Bool)", commutative: true, earlyOk: true},
66 {name: "Mul64uover", argLength: 2, typ: "(UInt64,Bool)", commutative: true, earlyOk: true},
67
68
69
70
71
72
73 {name: "Avg32u", argLength: 2, typ: "UInt32", earlyOk: true},
74 {name: "Avg64u", argLength: 2, typ: "UInt64", earlyOk: true},
75
76
77
78 {name: "Div8", argLength: 2},
79 {name: "Div8u", argLength: 2},
80 {name: "Div16", argLength: 2, aux: "Bool"},
81 {name: "Div16u", argLength: 2},
82 {name: "Div32", argLength: 2, aux: "Bool"},
83 {name: "Div32u", argLength: 2},
84 {name: "Div64", argLength: 2, aux: "Bool"},
85 {name: "Div64u", argLength: 2},
86 {name: "Div128u", argLength: 3},
87
88
89 {name: "Mod8", argLength: 2},
90 {name: "Mod8u", argLength: 2},
91 {name: "Mod16", argLength: 2, aux: "Bool"},
92 {name: "Mod16u", argLength: 2},
93 {name: "Mod32", argLength: 2, aux: "Bool"},
94 {name: "Mod32u", argLength: 2},
95 {name: "Mod64", argLength: 2, aux: "Bool"},
96 {name: "Mod64u", argLength: 2},
97
98 {name: "And8", argLength: 2, commutative: true, earlyOk: true},
99 {name: "And16", argLength: 2, commutative: true, earlyOk: true},
100 {name: "And32", argLength: 2, commutative: true, earlyOk: true},
101 {name: "And64", argLength: 2, commutative: true, earlyOk: true},
102
103 {name: "Or8", argLength: 2, commutative: true, earlyOk: true},
104 {name: "Or16", argLength: 2, commutative: true, earlyOk: true},
105 {name: "Or32", argLength: 2, commutative: true, earlyOk: true},
106 {name: "Or64", argLength: 2, commutative: true, earlyOk: true},
107
108 {name: "Xor8", argLength: 2, commutative: true, earlyOk: true},
109 {name: "Xor16", argLength: 2, commutative: true, earlyOk: true},
110 {name: "Xor32", argLength: 2, commutative: true, earlyOk: true},
111 {name: "Xor64", argLength: 2, commutative: true, earlyOk: true},
112
113
114
115
116
117
118 {name: "Lsh8x8", argLength: 2, aux: "Bool", earlyOk: true},
119 {name: "Lsh8x16", argLength: 2, aux: "Bool", earlyOk: true},
120 {name: "Lsh8x32", argLength: 2, aux: "Bool", earlyOk: true},
121 {name: "Lsh8x64", argLength: 2, aux: "Bool", earlyOk: true},
122 {name: "Lsh16x8", argLength: 2, aux: "Bool", earlyOk: true},
123 {name: "Lsh16x16", argLength: 2, aux: "Bool", earlyOk: true},
124 {name: "Lsh16x32", argLength: 2, aux: "Bool", earlyOk: true},
125 {name: "Lsh16x64", argLength: 2, aux: "Bool", earlyOk: true},
126 {name: "Lsh32x8", argLength: 2, aux: "Bool", earlyOk: true},
127 {name: "Lsh32x16", argLength: 2, aux: "Bool", earlyOk: true},
128 {name: "Lsh32x32", argLength: 2, aux: "Bool", earlyOk: true},
129 {name: "Lsh32x64", argLength: 2, aux: "Bool", earlyOk: true},
130 {name: "Lsh64x8", argLength: 2, aux: "Bool", earlyOk: true},
131 {name: "Lsh64x16", argLength: 2, aux: "Bool", earlyOk: true},
132 {name: "Lsh64x32", argLength: 2, aux: "Bool", earlyOk: true},
133 {name: "Lsh64x64", argLength: 2, aux: "Bool", earlyOk: true},
134
135 {name: "Rsh8x8", argLength: 2, aux: "Bool", earlyOk: true},
136 {name: "Rsh8x16", argLength: 2, aux: "Bool", earlyOk: true},
137 {name: "Rsh8x32", argLength: 2, aux: "Bool", earlyOk: true},
138 {name: "Rsh8x64", argLength: 2, aux: "Bool", earlyOk: true},
139 {name: "Rsh16x8", argLength: 2, aux: "Bool", earlyOk: true},
140 {name: "Rsh16x16", argLength: 2, aux: "Bool", earlyOk: true},
141 {name: "Rsh16x32", argLength: 2, aux: "Bool", earlyOk: true},
142 {name: "Rsh16x64", argLength: 2, aux: "Bool", earlyOk: true},
143 {name: "Rsh32x8", argLength: 2, aux: "Bool", earlyOk: true},
144 {name: "Rsh32x16", argLength: 2, aux: "Bool", earlyOk: true},
145 {name: "Rsh32x32", argLength: 2, aux: "Bool", earlyOk: true},
146 {name: "Rsh32x64", argLength: 2, aux: "Bool", earlyOk: true},
147 {name: "Rsh64x8", argLength: 2, aux: "Bool", earlyOk: true},
148 {name: "Rsh64x16", argLength: 2, aux: "Bool", earlyOk: true},
149 {name: "Rsh64x32", argLength: 2, aux: "Bool", earlyOk: true},
150 {name: "Rsh64x64", argLength: 2, aux: "Bool", earlyOk: true},
151
152 {name: "Rsh8Ux8", argLength: 2, aux: "Bool", earlyOk: true},
153 {name: "Rsh8Ux16", argLength: 2, aux: "Bool", earlyOk: true},
154 {name: "Rsh8Ux32", argLength: 2, aux: "Bool", earlyOk: true},
155 {name: "Rsh8Ux64", argLength: 2, aux: "Bool", earlyOk: true},
156 {name: "Rsh16Ux8", argLength: 2, aux: "Bool", earlyOk: true},
157 {name: "Rsh16Ux16", argLength: 2, aux: "Bool", earlyOk: true},
158 {name: "Rsh16Ux32", argLength: 2, aux: "Bool", earlyOk: true},
159 {name: "Rsh16Ux64", argLength: 2, aux: "Bool", earlyOk: true},
160 {name: "Rsh32Ux8", argLength: 2, aux: "Bool", earlyOk: true},
161 {name: "Rsh32Ux16", argLength: 2, aux: "Bool", earlyOk: true},
162 {name: "Rsh32Ux32", argLength: 2, aux: "Bool", earlyOk: true},
163 {name: "Rsh32Ux64", argLength: 2, aux: "Bool", earlyOk: true},
164 {name: "Rsh64Ux8", argLength: 2, aux: "Bool", earlyOk: true},
165 {name: "Rsh64Ux16", argLength: 2, aux: "Bool", earlyOk: true},
166 {name: "Rsh64Ux32", argLength: 2, aux: "Bool", earlyOk: true},
167 {name: "Rsh64Ux64", argLength: 2, aux: "Bool", earlyOk: true},
168
169
170 {name: "Eq8", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
171 {name: "Eq16", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
172 {name: "Eq32", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
173 {name: "Eq64", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
174 {name: "EqPtr", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
175 {name: "EqInter", argLength: 2, typ: "Bool", earlyOk: true},
176 {name: "EqSlice", argLength: 2, typ: "Bool", earlyOk: true},
177 {name: "Eq32F", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
178 {name: "Eq64F", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
179
180 {name: "Neq8", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
181 {name: "Neq16", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
182 {name: "Neq32", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
183 {name: "Neq64", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
184 {name: "NeqPtr", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
185 {name: "NeqInter", argLength: 2, typ: "Bool", earlyOk: true},
186 {name: "NeqSlice", argLength: 2, typ: "Bool", earlyOk: true},
187 {name: "Neq32F", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
188 {name: "Neq64F", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
189
190 {name: "Less8", argLength: 2, typ: "Bool", earlyOk: true},
191 {name: "Less8U", argLength: 2, typ: "Bool", earlyOk: true},
192 {name: "Less16", argLength: 2, typ: "Bool", earlyOk: true},
193 {name: "Less16U", argLength: 2, typ: "Bool", earlyOk: true},
194 {name: "Less32", argLength: 2, typ: "Bool", earlyOk: true},
195 {name: "Less32U", argLength: 2, typ: "Bool", earlyOk: true},
196 {name: "Less64", argLength: 2, typ: "Bool", earlyOk: true},
197 {name: "Less64U", argLength: 2, typ: "Bool", earlyOk: true},
198 {name: "Less32F", argLength: 2, typ: "Bool", earlyOk: true},
199 {name: "Less64F", argLength: 2, typ: "Bool", earlyOk: true},
200
201 {name: "Leq8", argLength: 2, typ: "Bool", earlyOk: true},
202 {name: "Leq8U", argLength: 2, typ: "Bool", earlyOk: true},
203 {name: "Leq16", argLength: 2, typ: "Bool", earlyOk: true},
204 {name: "Leq16U", argLength: 2, typ: "Bool", earlyOk: true},
205 {name: "Leq32", argLength: 2, typ: "Bool", earlyOk: true},
206 {name: "Leq32U", argLength: 2, typ: "Bool", earlyOk: true},
207 {name: "Leq64", argLength: 2, typ: "Bool", earlyOk: true},
208 {name: "Leq64U", argLength: 2, typ: "Bool", earlyOk: true},
209 {name: "Leq32F", argLength: 2, typ: "Bool", earlyOk: true},
210 {name: "Leq64F", argLength: 2, typ: "Bool", earlyOk: true},
211
212
213
214
215 {name: "CondSelect", argLength: 3, earlyOk: true},
216
217
218 {name: "AndB", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
219 {name: "OrB", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
220 {name: "EqB", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
221 {name: "NeqB", argLength: 2, commutative: true, typ: "Bool", earlyOk: true},
222 {name: "Not", argLength: 1, typ: "Bool", earlyOk: true},
223
224
225 {name: "Neg8", argLength: 1, earlyOk: true},
226 {name: "Neg16", argLength: 1, earlyOk: true},
227 {name: "Neg32", argLength: 1, earlyOk: true},
228 {name: "Neg64", argLength: 1, earlyOk: true},
229 {name: "Neg32F", argLength: 1, earlyOk: true},
230 {name: "Neg64F", argLength: 1, earlyOk: true},
231
232 {name: "Com8", argLength: 1, earlyOk: true},
233 {name: "Com16", argLength: 1, earlyOk: true},
234 {name: "Com32", argLength: 1, earlyOk: true},
235 {name: "Com64", argLength: 1, earlyOk: true},
236
237 {name: "Ctz8", argLength: 1},
238 {name: "Ctz16", argLength: 1},
239 {name: "Ctz32", argLength: 1},
240 {name: "Ctz64", argLength: 1},
241 {name: "Ctz64On32", argLength: 2},
242 {name: "Ctz8NonZero", argLength: 1},
243 {name: "Ctz16NonZero", argLength: 1},
244 {name: "Ctz32NonZero", argLength: 1},
245 {name: "Ctz64NonZero", argLength: 1},
246 {name: "BitLen8", argLength: 1},
247 {name: "BitLen16", argLength: 1},
248 {name: "BitLen32", argLength: 1},
249 {name: "BitLen64", argLength: 1},
250
251 {name: "Bswap16", argLength: 1},
252 {name: "Bswap32", argLength: 1},
253 {name: "Bswap64", argLength: 1},
254
255 {name: "BitRev8", argLength: 1},
256 {name: "BitRev16", argLength: 1},
257 {name: "BitRev32", argLength: 1},
258 {name: "BitRev64", argLength: 1},
259
260 {name: "PopCount8", argLength: 1},
261 {name: "PopCount16", argLength: 1},
262 {name: "PopCount32", argLength: 1},
263 {name: "PopCount64", argLength: 1},
264
265
266
267
268
269 {name: "RotateLeft64", argLength: 2, earlyOk: true},
270 {name: "RotateLeft32", argLength: 2, earlyOk: true},
271 {name: "RotateLeft16", argLength: 2, earlyOk: true},
272 {name: "RotateLeft8", argLength: 2, earlyOk: true},
273
274
275
276
277
278
279
280 {name: "Sqrt", argLength: 1},
281 {name: "Sqrt32", argLength: 1},
282
283
284
285
286
287
288 {name: "Floor", argLength: 1},
289 {name: "Ceil", argLength: 1},
290 {name: "Trunc", argLength: 1},
291 {name: "Round", argLength: 1},
292 {name: "RoundToEven", argLength: 1},
293
294
295 {name: "Abs", argLength: 1},
296 {name: "Copysign", argLength: 2},
297
298
299 {name: "Min64", argLength: 2},
300 {name: "Max64", argLength: 2},
301 {name: "Min64u", argLength: 2},
302 {name: "Max64u", argLength: 2},
303
304
305 {name: "Min64F", argLength: 2},
306 {name: "Min32F", argLength: 2},
307 {name: "Max64F", argLength: 2},
308 {name: "Max32F", argLength: 2},
309
310
311
312
313
314
315 {name: "Min64FSel", argLength: 2},
316 {name: "Min32FSel", argLength: 2},
317 {name: "Max64FSel", argLength: 2},
318 {name: "Max32FSel", argLength: 2},
319
320
321
322
323
324
325
326
327
328
329
330
331
332 {name: "FMA", argLength: 3},
333
334
335 {name: "Phi", argLength: -1, zeroWidth: true},
336 {name: "Copy", argLength: 1},
337
338
339
340
341
342
343
344
345 {name: "Convert", argLength: 2, zeroWidth: true, resultInArg0: true},
346
347
348
349 {name: "ConstBool", aux: "Bool", earlyOk: true},
350 {name: "ConstString", aux: "String", earlyOk: true},
351 {name: "ConstNil", typ: "BytePtr", earlyOk: true},
352 {name: "Const8", aux: "Int8", earlyOk: true},
353 {name: "Const16", aux: "Int16", earlyOk: true},
354 {name: "Const32", aux: "Int32", earlyOk: true},
355
356
357 {name: "Const64", aux: "Int64", earlyOk: true},
358
359
360
361
362
363 {name: "Const32F", aux: "Float32", earlyOk: true},
364 {name: "Const64F", aux: "Float64", earlyOk: true},
365 {name: "ConstInterface", earlyOk: true},
366 {name: "ConstSlice", earlyOk: true},
367
368
369 {name: "InitMem", zeroWidth: true},
370 {name: "Arg", aux: "SymOff", symEffect: "Read", zeroWidth: true},
371
372
373
374 {name: "ArgIntReg", aux: "NameOffsetInt8", zeroWidth: true},
375 {name: "ArgFloatReg", aux: "NameOffsetInt8", zeroWidth: true},
376
377
378
379
380
381
382 {name: "Addr", argLength: 1, aux: "Sym", symEffect: "Addr", earlyOk: true},
383 {name: "LocalAddr", argLength: 2, aux: "Sym", symEffect: "Addr", earlyOk: true},
384
385 {name: "SP", zeroWidth: true, fixedReg: true, earlyOk: true},
386 {name: "SB", typ: "Uintptr", zeroWidth: true, fixedReg: true, earlyOk: true},
387 {name: "Invalid"},
388 {name: "SPanchored", typ: "Uintptr", argLength: 2, zeroWidth: true},
389
390
391 {name: "Load", argLength: 2},
392 {name: "Dereference", argLength: 2},
393 {name: "Store", argLength: 3, typ: "Mem", aux: "Typ"},
394
395
396
397 {name: "LoadMasked8", argLength: 3},
398 {name: "LoadMasked16", argLength: 3},
399 {name: "LoadMasked32", argLength: 3},
400 {name: "LoadMasked64", argLength: 3},
401 {name: "StoreMasked8", argLength: 4, typ: "Mem", aux: "Typ"},
402 {name: "StoreMasked16", argLength: 4, typ: "Mem", aux: "Typ"},
403 {name: "StoreMasked32", argLength: 4, typ: "Mem", aux: "Typ"},
404 {name: "StoreMasked64", argLength: 4, typ: "Mem", aux: "Typ"},
405
406
407
408
409
410
411
412
413
414
415
416
417
418 {name: "Move", argLength: 3, typ: "Mem", aux: "TypSize"},
419 {name: "Zero", argLength: 2, typ: "Mem", aux: "TypSize"},
420
421
422
423 {name: "StoreWB", argLength: 3, typ: "Mem", aux: "Typ"},
424 {name: "MoveWB", argLength: 3, typ: "Mem", aux: "TypSize"},
425 {name: "ZeroWB", argLength: 2, typ: "Mem", aux: "TypSize"},
426 {name: "WBend", argLength: 1, typ: "Mem"},
427
428
429
430
431
432 {name: "WB", argLength: 1, typ: "(BytePtr,Mem)", aux: "Int64"},
433
434 {name: "HasCPUFeature", argLength: 0, typ: "bool", aux: "Sym", symEffect: "None"},
435
436
437
438
439
440
441 {name: "PanicBounds", argLength: 3, aux: "Int64", typ: "Mem", call: true},
442 {name: "PanicExtend", argLength: 4, aux: "Int64", typ: "Mem", call: true},
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468 {name: "ClosureCall", argLength: -1, aux: "CallOff", call: true},
469 {name: "StaticCall", argLength: -1, aux: "CallOff", call: true},
470 {name: "InterCall", argLength: -1, aux: "CallOff", call: true},
471 {name: "TailCall", argLength: -1, aux: "CallOff", call: true},
472 {name: "TailCallInter", argLength: -1, aux: "CallOff", call: true},
473
474 {name: "ClosureLECall", argLength: -1, aux: "CallOff", call: true},
475 {name: "StaticLECall", argLength: -1, aux: "CallOff", call: true},
476 {name: "InterLECall", argLength: -1, aux: "CallOff", call: true},
477 {name: "TailLECall", argLength: -1, aux: "CallOff", call: true},
478 {name: "TailLECallInter", argLength: -1, aux: "CallOff", call: true},
479
480
481 {name: "SignExt8to16", argLength: 1, typ: "Int16", earlyOk: true},
482 {name: "SignExt8to32", argLength: 1, typ: "Int32", earlyOk: true},
483 {name: "SignExt8to64", argLength: 1, typ: "Int64", earlyOk: true},
484 {name: "SignExt16to32", argLength: 1, typ: "Int32", earlyOk: true},
485 {name: "SignExt16to64", argLength: 1, typ: "Int64", earlyOk: true},
486 {name: "SignExt32to64", argLength: 1, typ: "Int64", earlyOk: true},
487 {name: "ZeroExt8to16", argLength: 1, typ: "UInt16", earlyOk: true},
488 {name: "ZeroExt8to32", argLength: 1, typ: "UInt32", earlyOk: true},
489 {name: "ZeroExt8to64", argLength: 1, typ: "UInt64", earlyOk: true},
490 {name: "ZeroExt16to32", argLength: 1, typ: "UInt32", earlyOk: true},
491 {name: "ZeroExt16to64", argLength: 1, typ: "UInt64", earlyOk: true},
492 {name: "ZeroExt32to64", argLength: 1, typ: "UInt64", earlyOk: true},
493 {name: "Trunc16to8", argLength: 1, earlyOk: true},
494 {name: "Trunc32to8", argLength: 1, earlyOk: true},
495 {name: "Trunc32to16", argLength: 1, earlyOk: true},
496 {name: "Trunc64to8", argLength: 1, earlyOk: true},
497 {name: "Trunc64to16", argLength: 1, earlyOk: true},
498 {name: "Trunc64to32", argLength: 1, earlyOk: true},
499
500 {name: "Cvt32to32F", argLength: 1, earlyOk: true},
501 {name: "Cvt32to64F", argLength: 1, earlyOk: true},
502 {name: "Cvt64to32F", argLength: 1, earlyOk: true},
503 {name: "Cvt64to64F", argLength: 1, earlyOk: true},
504 {name: "Cvt32Fto32", argLength: 1, earlyOk: true},
505 {name: "Cvt32Fto64", argLength: 1, earlyOk: true},
506 {name: "Cvt64Fto32", argLength: 1, earlyOk: true},
507 {name: "Cvt64Fto64", argLength: 1, earlyOk: true},
508 {name: "Cvt32Fto64F", argLength: 1, earlyOk: true},
509 {name: "Cvt64Fto32F", argLength: 1, earlyOk: true},
510 {name: "CvtBoolToUint8", argLength: 1, earlyOk: true},
511
512
513 {name: "Round32F", argLength: 1, earlyOk: true},
514 {name: "Round64F", argLength: 1, earlyOk: true},
515
516
517 {name: "IsNonNil", argLength: 1, typ: "Bool"},
518 {name: "IsInBounds", argLength: 2, typ: "Bool"},
519 {name: "IsSliceInBounds", argLength: 2, typ: "Bool"},
520 {name: "NilCheck", argLength: 2, nilCheck: true},
521
522
523 {name: "GetG", argLength: 1, zeroWidth: true},
524 {name: "GetClosurePtr", earlyOk: true},
525 {name: "GetCallerPC", earlyOk: true},
526 {name: "GetCallerSP", argLength: 1},
527
528
529 {name: "PtrIndex", argLength: 2, earlyOk: true},
530 {name: "OffPtr", argLength: 1, aux: "Int64", earlyOk: true},
531
532
533 {name: "SliceMake", argLength: 3},
534 {name: "SlicePtr", argLength: 1, typ: "BytePtr"},
535 {name: "SliceLen", argLength: 1},
536 {name: "SliceCap", argLength: 1},
537
538
539
540 {name: "SlicePtrUnchecked", argLength: 1},
541
542
543 {name: "ComplexMake", argLength: 2},
544 {name: "ComplexReal", argLength: 1},
545 {name: "ComplexImag", argLength: 1},
546
547
548 {name: "StringMake", argLength: 2},
549 {name: "StringPtr", argLength: 1, typ: "BytePtr"},
550 {name: "StringLen", argLength: 1, typ: "Int"},
551
552
553 {name: "IMake", argLength: 2},
554 {name: "ITab", argLength: 1, typ: "Uintptr"},
555 {name: "IData", argLength: 1},
556
557
558 {name: "StructMake", argLength: -1},
559 {name: "StructSelect", argLength: 1, aux: "Int64"},
560
561
562 {name: "ArrayMake1", argLength: 1},
563 {name: "ArraySelect", argLength: 1, aux: "Int64"},
564
565
566
567
568
569 {name: "StoreReg", argLength: 1},
570 {name: "LoadReg", argLength: 1},
571
572
573 {name: "FwdRef", aux: "Sym", symEffect: "None"},
574
575
576 {name: "Unknown"},
577
578 {name: "VarDef", argLength: 1, aux: "Sym", typ: "Mem", symEffect: "None", zeroWidth: true},
579
580 {name: "VarLive", argLength: 1, aux: "Sym", symEffect: "Read", zeroWidth: true},
581 {name: "KeepAlive", argLength: 2, typ: "Mem", zeroWidth: true},
582
583
584
585 {name: "InlMark", argLength: 1, aux: "Int32", typ: "Void", earlyOk: true},
586
587
588 {name: "Int64Make", argLength: 2, typ: "UInt64"},
589 {name: "Int64Hi", argLength: 1, typ: "UInt32"},
590 {name: "Int64Lo", argLength: 1, typ: "UInt32"},
591
592 {name: "Add32carry", argLength: 2, commutative: true, typ: "(UInt32,Flags)"},
593 {name: "Add32withcarry", argLength: 3, commutative: true},
594 {name: "Add32carrywithcarry", argLength: 3, commutative: true, typ: "(UInt32,Flags)"},
595
596 {name: "Sub32carry", argLength: 2, typ: "(UInt32,Flags)"},
597 {name: "Sub32withcarry", argLength: 3},
598
599 {name: "Add64carry", argLength: 3, commutative: true, typ: "(UInt64,UInt64)"},
600 {name: "Sub64borrow", argLength: 3, typ: "(UInt64,UInt64)"},
601
602 {name: "Signmask", argLength: 1, typ: "Int32"},
603 {name: "Zeromask", argLength: 1, typ: "UInt32"},
604 {name: "Slicemask", argLength: 1},
605
606 {name: "SpectreIndex", argLength: 2},
607 {name: "SpectreSliceIndex", argLength: 2},
608
609 {name: "Cvt32Uto32F", argLength: 1},
610 {name: "Cvt32Uto64F", argLength: 1},
611 {name: "Cvt32Fto32U", argLength: 1},
612 {name: "Cvt64Fto32U", argLength: 1},
613 {name: "Cvt64Uto32F", argLength: 1},
614 {name: "Cvt64Uto64F", argLength: 1},
615 {name: "Cvt32Fto64U", argLength: 1},
616 {name: "Cvt64Fto64U", argLength: 1},
617
618
619 {name: "Select0", argLength: 1, zeroWidth: true},
620 {name: "Select1", argLength: 1, zeroWidth: true},
621 {name: "MakeTuple", argLength: 2},
622 {name: "SelectN", argLength: 1, aux: "Int64"},
623 {name: "SelectNAddr", argLength: 1, aux: "Int64"},
624 {name: "MakeResult", argLength: -1},
625
626
627
628
629
630 {name: "AtomicLoad8", argLength: 2, typ: "(UInt8,Mem)"},
631 {name: "AtomicLoad32", argLength: 2, typ: "(UInt32,Mem)"},
632 {name: "AtomicLoad64", argLength: 2, typ: "(UInt64,Mem)"},
633 {name: "AtomicLoadPtr", argLength: 2, typ: "(BytePtr,Mem)"},
634 {name: "AtomicLoadAcq32", argLength: 2, typ: "(UInt32,Mem)"},
635 {name: "AtomicLoadAcq64", argLength: 2, typ: "(UInt64,Mem)"},
636 {name: "AtomicStore8", argLength: 3, typ: "Mem", hasSideEffects: true},
637 {name: "AtomicStore32", argLength: 3, typ: "Mem", hasSideEffects: true},
638 {name: "AtomicStore64", argLength: 3, typ: "Mem", hasSideEffects: true},
639 {name: "AtomicStorePtrNoWB", argLength: 3, typ: "Mem", hasSideEffects: true},
640 {name: "AtomicStoreRel32", argLength: 3, typ: "Mem", hasSideEffects: true},
641 {name: "AtomicStoreRel64", argLength: 3, typ: "Mem", hasSideEffects: true},
642 {name: "AtomicExchange8", argLength: 3, typ: "(UInt8,Mem)", hasSideEffects: true},
643 {name: "AtomicExchange32", argLength: 3, typ: "(UInt32,Mem)", hasSideEffects: true},
644 {name: "AtomicExchange64", argLength: 3, typ: "(UInt64,Mem)", hasSideEffects: true},
645 {name: "AtomicAdd32", argLength: 3, typ: "(UInt32,Mem)", hasSideEffects: true},
646 {name: "AtomicAdd64", argLength: 3, typ: "(UInt64,Mem)", hasSideEffects: true},
647 {name: "AtomicCompareAndSwap32", argLength: 4, typ: "(Bool,Mem)", hasSideEffects: true},
648 {name: "AtomicCompareAndSwap64", argLength: 4, typ: "(Bool,Mem)", hasSideEffects: true},
649 {name: "AtomicCompareAndSwapRel32", argLength: 4, typ: "(Bool,Mem)", hasSideEffects: true},
650
651
652 {name: "AtomicAnd8", argLength: 3, typ: "Mem", hasSideEffects: true},
653 {name: "AtomicOr8", argLength: 3, typ: "Mem", hasSideEffects: true},
654 {name: "AtomicAnd32", argLength: 3, typ: "Mem", hasSideEffects: true},
655 {name: "AtomicOr32", argLength: 3, typ: "Mem", hasSideEffects: true},
656
657
658 {name: "AtomicAnd64value", argLength: 3, typ: "(Uint64, Mem)", hasSideEffects: true},
659 {name: "AtomicAnd32value", argLength: 3, typ: "(Uint32, Mem)", hasSideEffects: true},
660 {name: "AtomicAnd8value", argLength: 3, typ: "(Uint8, Mem)", hasSideEffects: true},
661 {name: "AtomicOr64value", argLength: 3, typ: "(Uint64, Mem)", hasSideEffects: true},
662 {name: "AtomicOr32value", argLength: 3, typ: "(Uint32, Mem)", hasSideEffects: true},
663 {name: "AtomicOr8value", argLength: 3, typ: "(Uint8, Mem)", hasSideEffects: true},
664
665
666
667
668
669
670 {name: "AtomicStore8Variant", argLength: 3, typ: "Mem", hasSideEffects: true},
671 {name: "AtomicStore32Variant", argLength: 3, typ: "Mem", hasSideEffects: true},
672 {name: "AtomicStore64Variant", argLength: 3, typ: "Mem", hasSideEffects: true},
673
674 {name: "AtomicAdd32Variant", argLength: 3, typ: "(UInt32,Mem)", hasSideEffects: true},
675 {name: "AtomicAdd64Variant", argLength: 3, typ: "(UInt64,Mem)", hasSideEffects: true},
676 {name: "AtomicExchange8Variant", argLength: 3, typ: "(UInt8,Mem)", hasSideEffects: true},
677 {name: "AtomicExchange32Variant", argLength: 3, typ: "(UInt32,Mem)", hasSideEffects: true},
678 {name: "AtomicExchange64Variant", argLength: 3, typ: "(UInt64,Mem)", hasSideEffects: true},
679 {name: "AtomicCompareAndSwap32Variant", argLength: 4, typ: "(Bool,Mem)", hasSideEffects: true},
680 {name: "AtomicCompareAndSwap64Variant", argLength: 4, typ: "(Bool,Mem)", hasSideEffects: true},
681 {name: "AtomicAnd64valueVariant", argLength: 3, typ: "(Uint64, Mem)", hasSideEffects: true},
682 {name: "AtomicOr64valueVariant", argLength: 3, typ: "(Uint64, Mem)", hasSideEffects: true},
683 {name: "AtomicAnd32valueVariant", argLength: 3, typ: "(Uint32, Mem)", hasSideEffects: true},
684 {name: "AtomicOr32valueVariant", argLength: 3, typ: "(Uint32, Mem)", hasSideEffects: true},
685 {name: "AtomicAnd8valueVariant", argLength: 3, typ: "(Uint8, Mem)", hasSideEffects: true},
686 {name: "AtomicOr8valueVariant", argLength: 3, typ: "(Uint8, Mem)", hasSideEffects: true},
687
688
689 {name: "PubBarrier", argLength: 1, hasSideEffects: true},
690
691
692 {name: "Clobber", argLength: 0, typ: "Void", aux: "SymOff", symEffect: "None"},
693 {name: "ClobberReg", argLength: 0, typ: "Void"},
694
695
696 {name: "PrefetchCache", argLength: 2, hasSideEffects: true},
697 {name: "PrefetchCacheStreamed", argLength: 2, hasSideEffects: true},
698
699
700 {name: "MemEq", argLength: 4, commutative: true, typ: "Bool"},
701
702
703 {name: "Empty", argLength: 0, earlyOk: true},
704
705
706 {name: "ZeroSIMD", argLength: 0},
707
708
709 {name: "Cvt16toMask8x16", argLength: 1},
710 {name: "Cvt32toMask8x32", argLength: 1},
711 {name: "Cvt64toMask8x64", argLength: 1},
712 {name: "Cvt8toMask16x8", argLength: 1},
713 {name: "Cvt16toMask16x16", argLength: 1},
714 {name: "Cvt32toMask16x32", argLength: 1},
715 {name: "Cvt8toMask32x4", argLength: 1},
716 {name: "Cvt8toMask32x8", argLength: 1},
717 {name: "Cvt16toMask32x16", argLength: 1},
718 {name: "Cvt8toMask64x2", argLength: 1},
719 {name: "Cvt8toMask64x4", argLength: 1},
720 {name: "Cvt8toMask64x8", argLength: 1},
721
722
723 {name: "CvtMask8x16to16", argLength: 1},
724 {name: "CvtMask8x32to32", argLength: 1},
725 {name: "CvtMask8x64to64", argLength: 1},
726 {name: "CvtMask16x8to8", argLength: 1},
727 {name: "CvtMask16x16to16", argLength: 1},
728 {name: "CvtMask16x32to32", argLength: 1},
729 {name: "CvtMask32x4to8", argLength: 1},
730 {name: "CvtMask32x8to8", argLength: 1},
731 {name: "CvtMask32x16to16", argLength: 1},
732 {name: "CvtMask64x2to8", argLength: 1},
733 {name: "CvtMask64x4to8", argLength: 1},
734 {name: "CvtMask64x8to8", argLength: 1},
735
736
737 {name: "IsZeroVec", argLength: 1},
738
739
740 {name: "IsNaNFloat32x4", argLength: 1},
741 {name: "IsNaNFloat32x8", argLength: 1},
742 {name: "IsNaNFloat32x16", argLength: 1},
743 {name: "IsNaNFloat64x2", argLength: 1},
744 {name: "IsNaNFloat64x4", argLength: 1},
745 {name: "IsNaNFloat64x8", argLength: 1},
746
747 {name: "ScalableVectorLen", argLength: 0},
748 {name: "Count8s", argLength: 1},
749
750
751
752
753
754
755 {name: "IfElseInt8s", argLength: 3},
756 {name: "IfElseUint8s", argLength: 3},
757 {name: "IfElseInt16s", argLength: 3},
758 {name: "IfElseUint16s", argLength: 3},
759 {name: "IfElseInt32s", argLength: 3},
760 {name: "IfElseUint32s", argLength: 3},
761 {name: "IfElseFloat32s", argLength: 3},
762 {name: "IfElseInt64s", argLength: 3},
763 {name: "IfElseUint64s", argLength: 3},
764 {name: "IfElseFloat64s", argLength: 3},
765
766
767
768
769
770
771
772 {name: "I32AsF32", argLength: 1, typ: "Float32"},
773 {name: "F32AsI32", argLength: 1, typ: "Int32"},
774 {name: "I64AsF64", argLength: 1, typ: "Float64"},
775 {name: "F64AsI64", argLength: 1, typ: "Int64"},
776 }
777
778
779
780
781
782
783
784
785
786
787
788
789 var genericBlocks = []blockData{
790 {name: "Plain"},
791 {name: "If", controls: 1},
792 {name: "Defer", controls: 1},
793 {name: "Ret", controls: 1},
794 {name: "RetJmp", controls: 1},
795 {name: "Exit", controls: 1},
796 {name: "JumpTable", controls: 1},
797
798
799 {name: "First"},
800 }
801
802 var additionalGenericOps = make(map[string][]opData)
803
804 func compareOpData(a, b opData) int {
805 return strings.Compare(a.name, b.name)
806 }
807
808 func merge(a, b []opData) []opData {
809 m := make([]opData, 0, len(a)+len(b))
810 i, j := 0, 0
811 for i < len(a) && j < len(b) {
812 x, y := a[i], b[j]
813 c := compareOpData(x, y)
814 if c < 0 {
815 m = append(m, x)
816 i++
817 continue
818 }
819 if c > 0 {
820 m = append(m, y)
821 j++
822 continue
823 }
824 if x.comparableOpData == y.comparableOpData {
825 m = append(m, x)
826 i++
827 j++
828 continue
829 }
830 log.Fatalf("Two generic ops have same name but unequal attributes, %v, %v", x, y)
831 }
832 m = append(m, a[i:]...)
833 m = append(m, b[j:]...)
834 return m
835 }
836
837 func moreGenericOps() []opData {
838 var keys []string
839 for k := range additionalGenericOps {
840 keys = append(keys, k)
841 }
842 g := simdGenericOps()
843 slices.SortFunc(g, compareOpData)
844 for _, k := range keys {
845 s := additionalGenericOps[k]
846 slices.SortFunc(s, compareOpData)
847 g = merge(g, s)
848 }
849 return g
850 }
851
852 func genericInit() {
853 genericOps = append(genericOps, moreGenericOps()...)
854
855
856
857
858 archs = append(archs, arch{
859 name: "generic",
860 ops: genericOps,
861 blocks: genericBlocks,
862 generic: true,
863 })
864 }
865
View as plain text