Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/hotspot/gtest/aarch64/aarch64-asmtest.py
41145 views
1
import os
2
import random
3
import subprocess
4
import sys
5
6
AARCH64_AS = "as"
7
AARCH64_OBJDUMP = "objdump"
8
AARCH64_OBJCOPY = "objcopy"
9
10
class Operand(object):
11
12
def generate(self):
13
return self
14
15
class Register(Operand):
16
17
def generate(self):
18
self.number = random.randint(0, 30)
19
if self.number == 18:
20
self.number = 17
21
return self
22
23
def astr(self, prefix):
24
return prefix + str(self.number)
25
26
class FloatRegister(Register):
27
28
def __str__(self):
29
return self.astr("v")
30
31
def nextReg(self):
32
next = FloatRegister()
33
next.number = (self.number + 1) % 32
34
return next
35
36
class GeneralRegister(Register):
37
38
def __str__(self):
39
return self.astr("r")
40
41
class GeneralRegisterOrZr(Register):
42
43
def generate(self):
44
self.number = random.randint(0, 31)
45
if self.number == 18:
46
self.number = 16
47
return self
48
49
def astr(self, prefix = ""):
50
if (self.number == 31):
51
return prefix + "zr"
52
else:
53
return prefix + str(self.number)
54
55
def __str__(self):
56
if (self.number == 31):
57
return self.astr()
58
else:
59
return self.astr("r")
60
61
class GeneralRegisterOrSp(Register):
62
def generate(self):
63
self.number = random.randint(0, 31)
64
if self.number == 18:
65
self.number = 15
66
return self
67
68
def astr(self, prefix = ""):
69
if (self.number == 31):
70
return "sp"
71
else:
72
return prefix + str(self.number)
73
74
def __str__(self):
75
if (self.number == 31):
76
return self.astr()
77
else:
78
return self.astr("r")
79
80
class SVEVectorRegister(FloatRegister):
81
def __str__(self):
82
return self.astr("z")
83
84
class SVEPRegister(Register):
85
def __str__(self):
86
return self.astr("p")
87
88
def generate(self):
89
self.number = random.randint(0, 15)
90
return self
91
92
class SVEGoverningPRegister(Register):
93
def __str__(self):
94
return self.astr("p")
95
def generate(self):
96
self.number = random.randint(0, 7)
97
return self
98
99
class RegVariant(object):
100
def __init__(self, low, high):
101
self.number = random.randint(low, high)
102
103
def astr(self):
104
nameMap = {
105
0: ".b",
106
1: ".h",
107
2: ".s",
108
3: ".d",
109
4: ".q"
110
}
111
return nameMap.get(self.number)
112
113
def cstr(self):
114
nameMap = {
115
0: "__ B",
116
1: "__ H",
117
2: "__ S",
118
3: "__ D",
119
4: "__ Q"
120
}
121
return nameMap.get(self.number)
122
123
class FloatZero(Operand):
124
125
def __str__(self):
126
return "0.0"
127
128
def astr(self, ignored):
129
return "#0.0"
130
131
class OperandFactory:
132
133
_modes = {'x' : GeneralRegister,
134
'w' : GeneralRegister,
135
'b' : FloatRegister,
136
'h' : FloatRegister,
137
's' : FloatRegister,
138
'd' : FloatRegister,
139
'z' : FloatZero,
140
'p' : SVEPRegister,
141
'P' : SVEGoverningPRegister,
142
'Z' : SVEVectorRegister}
143
144
@classmethod
145
def create(cls, mode):
146
return OperandFactory._modes[mode]()
147
148
class ShiftKind:
149
150
def generate(self):
151
self.kind = ["LSL", "LSR", "ASR"][random.randint(0,2)]
152
return self
153
154
def cstr(self):
155
return self.kind
156
157
class Instruction(object):
158
159
def __init__(self, name):
160
self._name = name
161
self.isWord = name.endswith("w") | name.endswith("wi")
162
self.asmRegPrefix = ["x", "w"][self.isWord]
163
164
def aname(self):
165
if (self._name.endswith("wi")):
166
return self._name[:len(self._name)-2]
167
else:
168
if (self._name.endswith("i") | self._name.endswith("w")):
169
return self._name[:len(self._name)-1]
170
else:
171
return self._name
172
173
def emit(self) :
174
pass
175
176
def compare(self) :
177
pass
178
179
def generate(self) :
180
return self
181
182
def cstr(self):
183
return '__ %s(' % self.name()
184
185
def astr(self):
186
return '%s\t' % self.aname()
187
188
def name(self):
189
name = self._name
190
if name == "and":
191
name = "andr" # Special case: the name "and" can't be used
192
# in HotSpot, even for a member.
193
return name
194
195
def multipleForms(self):
196
return 0
197
198
class InstructionWithModes(Instruction):
199
200
def __init__(self, name, mode):
201
Instruction.__init__(self, name)
202
self.mode = mode
203
self.isFloat = (mode == 'd') | (mode == 's')
204
if self.isFloat:
205
self.isWord = mode != 'd'
206
self.asmRegPrefix = ["d", "s"][self.isWord]
207
else:
208
self.isWord = mode != 'x'
209
self.asmRegPrefix = ["x", "w"][self.isWord]
210
211
def name(self):
212
return self._name + (self.mode if self.mode != 'x' else '')
213
214
def aname(self):
215
return (self._name+mode if (mode == 'b' or mode == 'h')
216
else self._name)
217
218
class ThreeRegInstruction(Instruction):
219
220
def generate(self):
221
self.reg = [GeneralRegister().generate(), GeneralRegister().generate(),
222
GeneralRegister().generate()]
223
return self
224
225
226
def cstr(self):
227
return (super(ThreeRegInstruction, self).cstr()
228
+ ('%s, %s, %s'
229
% (self.reg[0],
230
self.reg[1], self.reg[2])))
231
232
def astr(self):
233
prefix = self.asmRegPrefix
234
return (super(ThreeRegInstruction, self).astr()
235
+ ('%s, %s, %s'
236
% (self.reg[0].astr(prefix),
237
self.reg[1].astr(prefix), self.reg[2].astr(prefix))))
238
239
class FourRegInstruction(ThreeRegInstruction):
240
241
def generate(self):
242
self.reg = ThreeRegInstruction.generate(self).reg + [GeneralRegister().generate()]
243
return self
244
245
246
def cstr(self):
247
return (super(FourRegInstruction, self).cstr()
248
+ (', %s' % self.reg[3]))
249
250
def astr(self):
251
prefix = self.asmRegPrefix
252
return (super(FourRegInstruction, self).astr()
253
+ (', %s' % self.reg[3].astr(prefix)))
254
255
class TwoRegInstruction(Instruction):
256
257
def generate(self):
258
self.reg = [GeneralRegister().generate(), GeneralRegister().generate()]
259
return self
260
261
def cstr(self):
262
return (super(TwoRegInstruction, self).cstr()
263
+ '%s, %s' % (self.reg[0],
264
self.reg[1]))
265
266
def astr(self):
267
prefix = self.asmRegPrefix
268
return (super(TwoRegInstruction, self).astr()
269
+ ('%s, %s'
270
% (self.reg[0].astr(prefix),
271
self.reg[1].astr(prefix))))
272
273
class TwoRegImmedInstruction(TwoRegInstruction):
274
275
def generate(self):
276
super(TwoRegImmedInstruction, self).generate()
277
self.immed = random.randint(0, 1<<11 -1)
278
return self
279
280
def cstr(self):
281
return (super(TwoRegImmedInstruction, self).cstr()
282
+ ', %su' % self.immed)
283
284
def astr(self):
285
return (super(TwoRegImmedInstruction, self).astr()
286
+ ', #%s' % self.immed)
287
288
class OneRegOp(Instruction):
289
290
def generate(self):
291
self.reg = GeneralRegister().generate()
292
return self
293
294
def cstr(self):
295
return (super(OneRegOp, self).cstr()
296
+ '%s);' % self.reg)
297
298
def astr(self):
299
return (super(OneRegOp, self).astr()
300
+ '%s' % self.reg.astr(self.asmRegPrefix))
301
302
class ArithOp(ThreeRegInstruction):
303
304
def generate(self):
305
super(ArithOp, self).generate()
306
self.kind = ShiftKind().generate()
307
self.distance = random.randint(0, (1<<5)-1 if self.isWord else (1<<6)-1)
308
return self
309
310
def cstr(self):
311
return ('%s, Assembler::%s, %s);'
312
% (ThreeRegInstruction.cstr(self),
313
self.kind.cstr(), self.distance))
314
315
def astr(self):
316
return ('%s, %s #%s'
317
% (ThreeRegInstruction.astr(self),
318
self.kind.cstr(),
319
self.distance))
320
321
class AddSubCarryOp(ThreeRegInstruction):
322
323
def cstr(self):
324
return ('%s);'
325
% (ThreeRegInstruction.cstr(self)))
326
327
class AddSubExtendedOp(ThreeRegInstruction):
328
329
uxtb, uxth, uxtw, uxtx, sxtb, sxth, sxtw, sxtx = range(8)
330
optNames = ["uxtb", "uxth", "uxtw", "uxtx", "sxtb", "sxth", "sxtw", "sxtx"]
331
332
def generate(self):
333
super(AddSubExtendedOp, self).generate()
334
self.amount = random.randint(1, 4)
335
self.option = random.randint(0, 7)
336
return self
337
338
def cstr(self):
339
return (super(AddSubExtendedOp, self).cstr()
340
+ (", ext::" + AddSubExtendedOp.optNames[self.option]
341
+ ", " + str(self.amount) + ");"))
342
343
def astr(self):
344
return (super(AddSubExtendedOp, self).astr()
345
+ (", " + AddSubExtendedOp.optNames[self.option]
346
+ " #" + str(self.amount)))
347
348
class AddSubImmOp(TwoRegImmedInstruction):
349
350
def cstr(self):
351
return super(AddSubImmOp, self).cstr() + ");"
352
353
class LogicalImmOp(AddSubImmOp):
354
355
# These tables are legal immediate logical operands
356
immediates32 \
357
= [0x1, 0x3f, 0x1f0, 0x7e0,
358
0x1c00, 0x3ff0, 0x8000, 0x1e000,
359
0x3e000, 0x78000, 0xe0000, 0x100000,
360
0x1fffe0, 0x3fe000, 0x780000, 0x7ffff8,
361
0xff8000, 0x1800180, 0x1fffc00, 0x3c003c0,
362
0x3ffff00, 0x7c00000, 0x7fffe00, 0xf000f00,
363
0xfffe000, 0x18181818, 0x1ffc0000, 0x1ffffffe,
364
0x3f003f00, 0x3fffe000, 0x60006000, 0x7f807f80,
365
0x7ffffc00, 0x800001ff, 0x803fffff, 0x9f9f9f9f,
366
0xc0000fff, 0xc0c0c0c0, 0xe0000000, 0xe003e003,
367
0xe3ffffff, 0xf0000fff, 0xf0f0f0f0, 0xf80000ff,
368
0xf83ff83f, 0xfc00007f, 0xfc1fffff, 0xfe0001ff,
369
0xfe3fffff, 0xff003fff, 0xff800003, 0xff87ff87,
370
0xffc00fff, 0xffe0000f, 0xffefffef, 0xfff1fff1,
371
0xfff83fff, 0xfffc0fff, 0xfffe0fff, 0xffff3fff,
372
0xffffc007, 0xffffe1ff, 0xfffff80f, 0xfffffe07,
373
0xffffffbf, 0xfffffffd]
374
375
immediates \
376
= [0x1, 0x1f80, 0x3fff0, 0x3ffffc,
377
0x3fe0000, 0x1ffc0000, 0xf8000000, 0x3ffffc000,
378
0xffffffe00, 0x3ffffff800, 0xffffc00000, 0x3f000000000,
379
0x7fffffff800, 0x1fe000001fe0, 0x3ffffff80000, 0xc00000000000,
380
0x1ffc000000000, 0x3ffff0003ffff, 0x7ffffffe00000, 0xfffffffffc000,
381
0x1ffffffffffc00, 0x3fffffffffff00, 0x7ffffffffffc00, 0xffffffffff8000,
382
0x1ffffffff800000, 0x3fffffc03fffffc, 0x7fffc0000000000, 0xff80ff80ff80ff8,
383
0x1c00000000000000, 0x1fffffffffff0000, 0x3fffff803fffff80, 0x7fc000007fc00000,
384
0x8000000000000000, 0x803fffff803fffff, 0xc000007fc000007f, 0xe00000000000ffff,
385
0xe3ffffffffffffff, 0xf007f007f007f007, 0xf80003ffffffffff, 0xfc000003fc000003,
386
0xfe000000007fffff, 0xff00000000007fff, 0xff800000000003ff, 0xffc00000000000ff,
387
0xffe00000000003ff, 0xfff0000000003fff, 0xfff80000001fffff, 0xfffc0000fffc0000,
388
0xfffe003fffffffff, 0xffff3fffffffffff, 0xffffc0000007ffff, 0xffffe01fffffe01f,
389
0xfffff800000007ff, 0xfffffc0fffffffff, 0xffffff00003fffff, 0xffffffc0000007ff,
390
0xfffffff0000001ff, 0xfffffffc00003fff, 0xffffffff07ffffff, 0xffffffffe003ffff,
391
0xfffffffffc01ffff, 0xffffffffffc00003, 0xfffffffffffc000f, 0xffffffffffffe07f]
392
393
def generate(self):
394
AddSubImmOp.generate(self)
395
self.immed = \
396
self.immediates32[random.randint(0, len(self.immediates32)-1)] \
397
if self.isWord else \
398
self.immediates[random.randint(0, len(self.immediates)-1)]
399
400
return self
401
402
def astr(self):
403
return (super(TwoRegImmedInstruction, self).astr()
404
+ ', #0x%x' % self.immed)
405
406
def cstr(self):
407
return super(AddSubImmOp, self).cstr() + "ll);"
408
409
class MultiOp():
410
411
def multipleForms(self):
412
return 3
413
414
def forms(self):
415
return ["__ pc()", "back", "forth"]
416
417
def aforms(self):
418
return [".", "back", "forth"]
419
420
class AbsOp(MultiOp, Instruction):
421
422
def cstr(self):
423
return super(AbsOp, self).cstr() + "%s);"
424
425
def astr(self):
426
return Instruction.astr(self) + "%s"
427
428
class RegAndAbsOp(MultiOp, Instruction):
429
430
def multipleForms(self):
431
if self.name() == "adrp":
432
# We can only test one form of adrp because anything other
433
# than "adrp ." requires relocs in the assembler output
434
return 1
435
return 3
436
437
def generate(self):
438
Instruction.generate(self)
439
self.reg = GeneralRegister().generate()
440
return self
441
442
def cstr(self):
443
if self.name() == "adrp":
444
return "__ _adrp(" + "%s, %s);" % (self.reg, "%s")
445
return (super(RegAndAbsOp, self).cstr()
446
+ "%s, %s);" % (self.reg, "%s"))
447
448
def astr(self):
449
return (super(RegAndAbsOp, self).astr()
450
+ self.reg.astr(self.asmRegPrefix) + ", %s")
451
452
class RegImmAbsOp(RegAndAbsOp):
453
454
def cstr(self):
455
return (Instruction.cstr(self)
456
+ "%s, %s, %s);" % (self.reg, self.immed, "%s"))
457
458
def astr(self):
459
return (Instruction.astr(self)
460
+ ("%s, #%s, %s"
461
% (self.reg.astr(self.asmRegPrefix), self.immed, "%s")))
462
463
def generate(self):
464
super(RegImmAbsOp, self).generate()
465
self.immed = random.randint(0, 1<<5 -1)
466
return self
467
468
class MoveWideImmOp(RegImmAbsOp):
469
470
def multipleForms(self):
471
return 0
472
473
def cstr(self):
474
return (Instruction.cstr(self)
475
+ "%s, %s, %s);" % (self.reg, self.immed, self.shift))
476
477
def astr(self):
478
return (Instruction.astr(self)
479
+ ("%s, #%s, lsl %s"
480
% (self.reg.astr(self.asmRegPrefix),
481
self.immed, self.shift)))
482
483
def generate(self):
484
super(RegImmAbsOp, self).generate()
485
self.immed = random.randint(0, 1<<16 -1)
486
if self.isWord:
487
self.shift = random.randint(0, 1) * 16
488
else:
489
self.shift = random.randint(0, 3) * 16
490
return self
491
492
class BitfieldOp(TwoRegInstruction):
493
494
def cstr(self):
495
return (Instruction.cstr(self)
496
+ ("%s, %s, %s, %s);"
497
% (self.reg[0], self.reg[1], self.immr, self.imms)))
498
499
def astr(self):
500
return (TwoRegInstruction.astr(self)
501
+ (", #%s, #%s"
502
% (self.immr, self.imms)))
503
504
def generate(self):
505
TwoRegInstruction.generate(self)
506
self.immr = random.randint(0, 31)
507
self.imms = random.randint(0, 31)
508
return self
509
510
class ExtractOp(ThreeRegInstruction):
511
512
def generate(self):
513
super(ExtractOp, self).generate()
514
self.lsb = random.randint(0, (1<<5)-1 if self.isWord else (1<<6)-1)
515
return self
516
517
def cstr(self):
518
return (ThreeRegInstruction.cstr(self)
519
+ (", %s);" % self.lsb))
520
521
def astr(self):
522
return (ThreeRegInstruction.astr(self)
523
+ (", #%s" % self.lsb))
524
525
class CondBranchOp(MultiOp, Instruction):
526
527
def cstr(self):
528
return "__ br(Assembler::" + self.name() + ", %s);"
529
530
def astr(self):
531
return "b." + self.name() + "\t%s"
532
533
class ImmOp(Instruction):
534
535
def cstr(self):
536
return "%s%s);" % (Instruction.cstr(self), self.immed)
537
538
def astr(self):
539
return Instruction.astr(self) + "#" + str(self.immed)
540
541
def generate(self):
542
self.immed = random.randint(0, 1<<16 -1)
543
return self
544
545
class Op(Instruction):
546
547
def cstr(self):
548
return Instruction.cstr(self) + ");"
549
def astr(self):
550
return self.aname();
551
552
class SystemOp(Instruction):
553
554
def __init__(self, op):
555
Instruction.__init__(self, op[0])
556
self.barriers = op[1]
557
558
def generate(self):
559
Instruction.generate(self)
560
self.barrier \
561
= self.barriers[random.randint(0, len(self.barriers)-1)]
562
return self
563
564
def cstr(self):
565
return Instruction.cstr(self) + "Assembler::" + self.barrier + ");"
566
567
def astr(self):
568
return Instruction.astr(self) + self.barrier
569
570
conditionCodes = ["EQ", "NE", "HS", "CS", "LO", "CC", "MI", "PL", "VS", \
571
"VC", "HI", "LS", "GE", "LT", "GT", "LE", "AL", "NV"]
572
573
class ConditionalCompareOp(TwoRegImmedInstruction):
574
575
def generate(self):
576
TwoRegImmedInstruction.generate(self)
577
self.cond = random.randint(0, 15)
578
self.immed = random.randint(0, 15)
579
return self
580
581
def cstr(self):
582
return (super(ConditionalCompareOp, self).cstr() + ", "
583
+ "Assembler::" + conditionCodes[self.cond] + ");")
584
585
def astr(self):
586
return (super(ConditionalCompareOp, self).astr() +
587
", " + conditionCodes[self.cond])
588
589
class ConditionalCompareImmedOp(Instruction):
590
591
def generate(self):
592
self.reg = GeneralRegister().generate()
593
self.cond = random.randint(0, 15)
594
self.immed2 = random.randint(0, 15)
595
self.immed = random.randint(0, 31)
596
return self
597
598
def cstr(self):
599
return (Instruction.cstr(self) + str(self.reg) + ", "
600
+ str(self.immed) + ", "
601
+ str(self.immed2) + ", "
602
+ "Assembler::" + conditionCodes[self.cond] + ");")
603
604
def astr(self):
605
return (Instruction.astr(self)
606
+ self.reg.astr(self.asmRegPrefix)
607
+ ", #" + str(self.immed)
608
+ ", #" + str(self.immed2)
609
+ ", " + conditionCodes[self.cond])
610
611
class TwoRegOp(TwoRegInstruction):
612
613
def cstr(self):
614
return TwoRegInstruction.cstr(self) + ");"
615
616
class ThreeRegOp(ThreeRegInstruction):
617
618
def cstr(self):
619
return ThreeRegInstruction.cstr(self) + ");"
620
621
class FourRegMulOp(FourRegInstruction):
622
623
def cstr(self):
624
return FourRegInstruction.cstr(self) + ");"
625
626
def astr(self):
627
isMaddsub = self.name().startswith("madd") | self.name().startswith("msub")
628
midPrefix = self.asmRegPrefix if isMaddsub else "w"
629
return (Instruction.astr(self)
630
+ self.reg[0].astr(self.asmRegPrefix)
631
+ ", " + self.reg[1].astr(midPrefix)
632
+ ", " + self.reg[2].astr(midPrefix)
633
+ ", " + self.reg[3].astr(self.asmRegPrefix))
634
635
class ConditionalSelectOp(ThreeRegInstruction):
636
637
def generate(self):
638
ThreeRegInstruction.generate(self)
639
self.cond = random.randint(0, 15)
640
return self
641
642
def cstr(self):
643
return (ThreeRegInstruction.cstr(self) + ", "
644
+ "Assembler::" + conditionCodes[self.cond] + ");")
645
646
def astr(self):
647
return (ThreeRegInstruction.astr(self)
648
+ ", " + conditionCodes[self.cond])
649
650
class LoadStoreExclusiveOp(InstructionWithModes):
651
652
def __init__(self, op): # op is a tuple of ["name", "mode", registers]
653
InstructionWithModes.__init__(self, op[0], op[1])
654
self.num_registers = op[2]
655
656
def astr(self):
657
result = self.aname() + '\t'
658
regs = list(self.regs)
659
index = regs.pop() # The last reg is the index register
660
prefix = ('x' if (self.mode == 'x')
661
& ((self.name().startswith("ld"))
662
| (self.name().startswith("stlr"))) # Ewww :-(
663
else 'w')
664
result = result + regs.pop(0).astr(prefix) + ", "
665
for s in regs:
666
result = result + s.astr(self.asmRegPrefix) + ", "
667
result = result + "[" + index.astr("x") + "]"
668
return result
669
670
def cstr(self):
671
result = InstructionWithModes.cstr(self)
672
regs = list(self.regs)
673
index = regs.pop() # The last reg is the index register
674
for s in regs:
675
result = result + str(s) + ", "
676
result = result + str(index) + ");"
677
return result
678
679
def appendUniqueReg(self):
680
result = 0
681
while result == 0:
682
newReg = GeneralRegister().generate()
683
result = 1
684
for i in self.regs:
685
result = result and (i.number != newReg.number)
686
self.regs.append(newReg)
687
688
def generate(self):
689
self.regs = []
690
for i in range(self.num_registers):
691
self.appendUniqueReg()
692
return self
693
694
def name(self):
695
if self.mode == 'x':
696
return self._name
697
else:
698
return self._name + self.mode
699
700
def aname(self):
701
if (self.mode == 'b') | (self.mode == 'h'):
702
return self._name + self.mode
703
else:
704
return self._name
705
706
class Address(object):
707
708
base_plus_unscaled_offset, pre, post, base_plus_reg, \
709
base_plus_scaled_offset, pcrel, post_reg, base_only = range(8)
710
kinds = ["base_plus_unscaled_offset", "pre", "post", "base_plus_reg",
711
"base_plus_scaled_offset", "pcrel", "post_reg", "base_only"]
712
extend_kinds = ["uxtw", "lsl", "sxtw", "sxtx"]
713
714
@classmethod
715
def kindToStr(cls, i):
716
return cls.kinds[i]
717
718
def generate(self, kind, shift_distance):
719
self.kind = kind
720
self.base = GeneralRegister().generate()
721
self.index = GeneralRegister().generate()
722
self.offset = {
723
Address.base_plus_unscaled_offset: random.randint(-1<<8, 1<<8-1) | 1,
724
Address.pre: random.randint(-1<<8, 1<<8-1),
725
Address.post: random.randint(-1<<8, 1<<8-1),
726
Address.pcrel: random.randint(0, 2),
727
Address.base_plus_reg: 0,
728
Address.base_plus_scaled_offset: (random.randint(0, 1<<11-1) | (3 << 9))*8,
729
Address.post_reg: 0,
730
Address.base_only: 0} [kind]
731
self.offset >>= (3 - shift_distance)
732
self.extend_kind = Address.extend_kinds[random.randint(0, 3)]
733
self.shift_distance = random.randint(0, 1) * shift_distance
734
return self
735
736
def __str__(self):
737
result = {
738
Address.base_plus_unscaled_offset: "Address(%s, %s)" \
739
% (str(self.base), self.offset),
740
Address.pre: "Address(__ pre(%s, %s))" % (str(self.base), self.offset),
741
Address.post: "Address(__ post(%s, %s))" % (str(self.base), self.offset),
742
Address.post_reg: "Address(__ post(%s, %s))" % (str(self.base), self.index),
743
Address.base_only: "Address(%s)" % (str(self.base)),
744
Address.pcrel: "",
745
Address.base_plus_reg: "Address(%s, %s, Address::%s(%s))" \
746
% (self.base, self.index, self.extend_kind, self.shift_distance),
747
Address.base_plus_scaled_offset:
748
"Address(%s, %s)" % (self.base, self.offset) } [self.kind]
749
if (self.kind == Address.pcrel):
750
result = ["__ pc()", "back", "forth"][self.offset]
751
return result
752
753
def astr(self, prefix):
754
extend_prefix = prefix
755
if self.kind == Address.base_plus_reg:
756
if self.extend_kind.endswith("w"):
757
extend_prefix = "w"
758
result = {
759
Address.base_plus_unscaled_offset: "[%s, %s]" \
760
% (self.base.astr(prefix), self.offset),
761
Address.pre: "[%s, %s]!" % (self.base.astr(prefix), self.offset),
762
Address.post: "[%s], %s" % (self.base.astr(prefix), self.offset),
763
Address.post_reg: "[%s], %s" % (self.base.astr(prefix), self.index.astr(prefix)),
764
Address.base_only: "[%s]" % (self.base.astr(prefix)),
765
Address.pcrel: "",
766
Address.base_plus_reg: "[%s, %s, %s #%s]" \
767
% (self.base.astr(prefix), self.index.astr(extend_prefix),
768
self.extend_kind, self.shift_distance),
769
Address.base_plus_scaled_offset: \
770
"[%s, %s]" \
771
% (self.base.astr(prefix), self.offset)
772
} [self.kind]
773
if (self.kind == Address.pcrel):
774
result = [".", "back", "forth"][self.offset]
775
return result
776
777
class LoadStoreOp(InstructionWithModes):
778
779
def __init__(self, args):
780
name, self.asmname, self.kind, mode = args
781
InstructionWithModes.__init__(self, name, mode)
782
783
def generate(self):
784
785
# This is something of a kludge, but the offset needs to be
786
# scaled by the memory datamode somehow.
787
shift = 3
788
if (self.mode == 'b') | (self.asmname.endswith("b")):
789
shift = 0
790
elif (self.mode == 'h') | (self.asmname.endswith("h")):
791
shift = 1
792
elif (self.mode == 'w') | (self.asmname.endswith("w")) \
793
| (self.mode == 's') :
794
shift = 2
795
796
self.adr = Address().generate(self.kind, shift)
797
798
isFloat = (self.mode == 'd') | (self.mode == 's')
799
800
regMode = FloatRegister if isFloat else GeneralRegister
801
self.reg = regMode().generate()
802
kindStr = Address.kindToStr(self.kind);
803
if (not isFloat) and (kindStr is "pre" or kindStr is "post"):
804
(self.reg.number, self.adr.base.number) = random.sample(list(set(range(31)) - set([18])), 2)
805
return self
806
807
def cstr(self):
808
if not(self._name.startswith("prfm")):
809
return "%s%s, %s);" % (Instruction.cstr(self), str(self.reg), str(self.adr))
810
else: # No target register for a prefetch
811
return "%s%s);" % (Instruction.cstr(self), str(self.adr))
812
813
def astr(self):
814
if not(self._name.startswith("prfm")):
815
return "%s\t%s, %s" % (self.aname(), self.reg.astr(self.asmRegPrefix),
816
self.adr.astr("x"))
817
else: # No target register for a prefetch
818
return "%s %s" % (self.aname(),
819
self.adr.astr("x"))
820
821
def aname(self):
822
result = self.asmname
823
# if self.kind == Address.base_plus_unscaled_offset:
824
# result = result.replace("ld", "ldu", 1)
825
# result = result.replace("st", "stu", 1)
826
return result
827
828
class LoadStorePairOp(InstructionWithModes):
829
830
numRegs = 2
831
832
def __init__(self, args):
833
name, self.asmname, self.kind, mode = args
834
InstructionWithModes.__init__(self, name, mode)
835
self.offset = random.randint(-1<<4, 1<<4-1) << 4
836
837
def generate(self):
838
self.reg = [OperandFactory.create(self.mode).generate()
839
for i in range(self.numRegs)]
840
self.base = OperandFactory.create('x').generate()
841
kindStr = Address.kindToStr(self.kind);
842
if kindStr is "pre" or kindStr is "post":
843
if self._name.startswith("ld"):
844
(self.reg[0].number, self.reg[1].number, self.base.number) = random.sample(list(set(range(31)) - set([18])), 3)
845
if self._name.startswith("st"):
846
self.base.number = random.choice(list(set(range(31)) - set([self.reg[0].number, self.reg[1].number, 18])))
847
elif self._name.startswith("ld"):
848
(self.reg[0].number, self.reg[1].number) = random.sample(list(set(range(31)) - set([18])), 2)
849
return self
850
851
def astr(self):
852
address = ["[%s, #%s]", "[%s, #%s]!", "[%s], #%s"][self.kind]
853
address = address % (self.base.astr('x'), self.offset)
854
result = "%s\t%s, %s, %s" \
855
% (self.asmname,
856
self.reg[0].astr(self.asmRegPrefix),
857
self.reg[1].astr(self.asmRegPrefix), address)
858
return result
859
860
def cstr(self):
861
address = {
862
Address.base_plus_unscaled_offset: "Address(%s, %s)" \
863
% (str(self.base), self.offset),
864
Address.pre: "Address(__ pre(%s, %s))" % (str(self.base), self.offset),
865
Address.post: "Address(__ post(%s, %s))" % (str(self.base), self.offset),
866
} [self.kind]
867
result = "__ %s(%s, %s, %s);" \
868
% (self.name(), self.reg[0], self.reg[1], address)
869
return result
870
871
class FloatInstruction(Instruction):
872
873
def aname(self):
874
if (self._name.endswith("s") | self._name.endswith("d")):
875
return self._name[:len(self._name)-1]
876
else:
877
return self._name
878
879
def __init__(self, args):
880
name, self.modes = args
881
Instruction.__init__(self, name)
882
883
def generate(self):
884
self.reg = [OperandFactory.create(self.modes[i]).generate()
885
for i in range(self.numRegs)]
886
return self
887
888
def cstr(self):
889
formatStr = "%s%s" + ''.join([", %s" for i in range(1, self.numRegs)] + [");"])
890
return (formatStr
891
% tuple([Instruction.cstr(self)] +
892
[str(self.reg[i]) for i in range(self.numRegs)])) # Yowza
893
894
def astr(self):
895
formatStr = "%s%s" + ''.join([", %s" for i in range(1, self.numRegs)])
896
return (formatStr
897
% tuple([Instruction.astr(self)] +
898
[(self.reg[i].astr(self.modes[i])) for i in range(self.numRegs)]))
899
900
class SVEVectorOp(Instruction):
901
def __init__(self, args):
902
name = args[0]
903
regTypes = args[1]
904
regs = []
905
for c in regTypes:
906
regs.append(OperandFactory.create(c).generate())
907
self.reg = regs
908
self.numRegs = len(regs)
909
if regTypes[0] != "p" and regTypes[1] == 'P':
910
self._isPredicated = True
911
self._merge = "/m"
912
else:
913
self._isPredicated = False
914
self._merge =""
915
916
self._bitwiseop = False
917
if name[0] == 'f':
918
self._width = RegVariant(2, 3)
919
elif not self._isPredicated and (name in ["and", "eor", "orr", "bic"]):
920
self._width = RegVariant(3, 3)
921
self._bitwiseop = True
922
else:
923
self._width = RegVariant(0, 3)
924
if len(args) > 2:
925
self._dnm = args[2]
926
else:
927
self._dnm = None
928
Instruction.__init__(self, name)
929
930
def cstr(self):
931
formatStr = "%s%s" + ''.join([", %s" for i in range(0, self.numRegs)] + [");"])
932
if self._bitwiseop:
933
width = []
934
formatStr = "%s%s" + ''.join([", %s" for i in range(1, self.numRegs)] + [");"])
935
else:
936
width = [self._width.cstr()]
937
return (formatStr
938
% tuple(["__ sve_" + self._name + "("] +
939
[str(self.reg[0])] +
940
width +
941
[str(self.reg[i]) for i in range(1, self.numRegs)]))
942
def astr(self):
943
formatStr = "%s%s" + ''.join([", %s" for i in range(1, self.numRegs)])
944
if self._dnm == 'dn':
945
formatStr += ", %s"
946
dnReg = [str(self.reg[0]) + self._width.astr()]
947
else:
948
dnReg = []
949
950
if self._isPredicated:
951
restRegs = [str(self.reg[1]) + self._merge] + dnReg + [str(self.reg[i]) + self._width.astr() for i in range(2, self.numRegs)]
952
else:
953
restRegs = dnReg + [str(self.reg[i]) + self._width.astr() for i in range(1, self.numRegs)]
954
return (formatStr
955
% tuple([Instruction.astr(self)] +
956
[str(self.reg[0]) + self._width.astr()] +
957
restRegs))
958
def generate(self):
959
return self
960
961
class SVEReductionOp(Instruction):
962
def __init__(self, args):
963
name = args[0]
964
lowRegType = args[1]
965
self.reg = []
966
Instruction.__init__(self, name)
967
self.reg.append(OperandFactory.create('s').generate())
968
self.reg.append(OperandFactory.create('P').generate())
969
self.reg.append(OperandFactory.create('Z').generate())
970
self._width = RegVariant(lowRegType, 3)
971
def cstr(self):
972
return "__ sve_%s(%s, %s, %s, %s);" % (self.name(),
973
str(self.reg[0]),
974
self._width.cstr(),
975
str(self.reg[1]),
976
str(self.reg[2]))
977
def astr(self):
978
if self.name() == "uaddv":
979
dstRegName = "d" + str(self.reg[0].number)
980
else:
981
dstRegName = self._width.astr()[1] + str(self.reg[0].number)
982
formatStr = "%s %s, %s, %s"
983
if self.name() == "fadda":
984
formatStr += ", %s"
985
moreReg = [dstRegName]
986
else:
987
moreReg = []
988
return formatStr % tuple([self.name()] +
989
[dstRegName] +
990
[str(self.reg[1])] +
991
moreReg +
992
[str(self.reg[2]) + self._width.astr()])
993
994
class LdStNEONOp(Instruction):
995
def __init__(self, args):
996
self._name, self.regnum, self.arrangement, self.addresskind = args
997
998
def generate(self):
999
self.address = Address().generate(self.addresskind, 0)
1000
self._firstSIMDreg = FloatRegister().generate()
1001
if (self.addresskind == Address.post):
1002
if (self._name in ["ld1r", "ld2r", "ld3r", "ld4r"]):
1003
elem_size = {"8B" : 1, "16B" : 1, "4H" : 2, "8H" : 2, "2S" : 4, "4S" : 4, "1D" : 8, "2D" : 8} [self.arrangement]
1004
self.address.offset = self.regnum * elem_size
1005
else:
1006
if (self.arrangement in ["8B", "4H", "2S", "1D"]):
1007
self.address.offset = self.regnum * 8
1008
else:
1009
self.address.offset = self.regnum * 16
1010
return self
1011
1012
def cstr(self):
1013
buf = super(LdStNEONOp, self).cstr() + str(self._firstSIMDreg)
1014
current = self._firstSIMDreg
1015
for cnt in range(1, self.regnum):
1016
buf = '%s, %s' % (buf, current.nextReg())
1017
current = current.nextReg()
1018
return '%s, __ T%s, %s);' % (buf, self.arrangement, str(self.address))
1019
1020
def astr(self):
1021
buf = '%s\t{%s.%s' % (self._name, self._firstSIMDreg, self.arrangement)
1022
current = self._firstSIMDreg
1023
for cnt in range(1, self.regnum):
1024
buf = '%s, %s.%s' % (buf, current.nextReg(), self.arrangement)
1025
current = current.nextReg()
1026
return '%s}, %s' % (buf, self.address.astr("x"))
1027
1028
def aname(self):
1029
return self._name
1030
1031
class NEONReduceInstruction(Instruction):
1032
def __init__(self, args):
1033
self._name, self.insname, self.arrangement = args
1034
1035
def generate(self):
1036
current = FloatRegister().generate()
1037
self.dstSIMDreg = current
1038
self.srcSIMDreg = current.nextReg()
1039
return self
1040
1041
def cstr(self):
1042
buf = Instruction.cstr(self) + str(self.dstSIMDreg)
1043
if self._name == "fmaxp" or self._name == "fminp":
1044
buf = '%s, %s, __ %s);' % (buf, self.srcSIMDreg, self.arrangement[1:])
1045
else:
1046
buf = '%s, __ T%s, %s);' % (buf, self.arrangement, self.srcSIMDreg)
1047
return buf
1048
1049
def astr(self):
1050
buf = '%s\t%s' % (self.insname, self.dstSIMDreg.astr(self.arrangement[-1].lower()))
1051
buf = '%s, %s.%s' % (buf, self.srcSIMDreg, self.arrangement)
1052
return buf
1053
1054
def aname(self):
1055
return self._name
1056
1057
class CommonNEONInstruction(Instruction):
1058
def __init__(self, args):
1059
self._name, self.insname, self.arrangement = args
1060
1061
def generate(self):
1062
self._firstSIMDreg = FloatRegister().generate()
1063
return self
1064
1065
def cstr(self):
1066
buf = Instruction.cstr(self) + str(self._firstSIMDreg)
1067
buf = '%s, __ T%s' % (buf, self.arrangement)
1068
current = self._firstSIMDreg
1069
for cnt in range(1, self.numRegs):
1070
buf = '%s, %s' % (buf, current.nextReg())
1071
current = current.nextReg()
1072
return '%s);' % (buf)
1073
1074
def astr(self):
1075
buf = '%s\t%s.%s' % (self.insname, self._firstSIMDreg, self.arrangement)
1076
current = self._firstSIMDreg
1077
for cnt in range(1, self.numRegs):
1078
buf = '%s, %s.%s' % (buf, current.nextReg(), self.arrangement)
1079
current = current.nextReg()
1080
return buf
1081
1082
def aname(self):
1083
return self._name
1084
1085
class SHA512SIMDOp(Instruction):
1086
1087
def generate(self):
1088
if (self._name == 'sha512su0'):
1089
self.reg = [FloatRegister().generate(), FloatRegister().generate()]
1090
else:
1091
self.reg = [FloatRegister().generate(), FloatRegister().generate(),
1092
FloatRegister().generate()]
1093
return self
1094
1095
def cstr(self):
1096
if (self._name == 'sha512su0'):
1097
return (super(SHA512SIMDOp, self).cstr()
1098
+ ('%s, __ T2D, %s);' % (self.reg[0], self.reg[1])))
1099
else:
1100
return (super(SHA512SIMDOp, self).cstr()
1101
+ ('%s, __ T2D, %s, %s);' % (self.reg[0], self.reg[1], self.reg[2])))
1102
1103
def astr(self):
1104
if (self._name == 'sha512su0'):
1105
return (super(SHA512SIMDOp, self).astr()
1106
+ ('\t%s.2D, %s.2D' % (self.reg[0].astr("v"), self.reg[1].astr("v"))))
1107
elif (self._name == 'sha512su1'):
1108
return (super(SHA512SIMDOp, self).astr()
1109
+ ('\t%s.2D, %s.2D, %s.2D' % (self.reg[0].astr("v"),
1110
self.reg[1].astr("v"), self.reg[2].astr("v"))))
1111
else:
1112
return (super(SHA512SIMDOp, self).astr()
1113
+ ('\t%s, %s, %s.2D' % (self.reg[0].astr("q"),
1114
self.reg[1].astr("q"), self.reg[2].astr("v"))))
1115
1116
class SHA3SIMDOp(Instruction):
1117
1118
def generate(self):
1119
if ((self._name == 'eor3') or (self._name == 'bcax')):
1120
self.reg = [FloatRegister().generate(), FloatRegister().generate(),
1121
FloatRegister().generate(), FloatRegister().generate()]
1122
else:
1123
self.reg = [FloatRegister().generate(), FloatRegister().generate(),
1124
FloatRegister().generate()]
1125
if (self._name == 'xar'):
1126
self.imm6 = random.randint(0, 63)
1127
return self
1128
1129
def cstr(self):
1130
if ((self._name == 'eor3') or (self._name == 'bcax')):
1131
return (super(SHA3SIMDOp, self).cstr()
1132
+ ('%s, __ T16B, %s, %s, %s);' % (self.reg[0], self.reg[1], self.reg[2], self.reg[3])))
1133
elif (self._name == 'rax1'):
1134
return (super(SHA3SIMDOp, self).cstr()
1135
+ ('%s, __ T2D, %s, %s);' % (self.reg[0], self.reg[1], self.reg[2])))
1136
else:
1137
return (super(SHA3SIMDOp, self).cstr()
1138
+ ('%s, __ T2D, %s, %s, %s);' % (self.reg[0], self.reg[1], self.reg[2], self.imm6)))
1139
1140
def astr(self):
1141
if ((self._name == 'eor3') or (self._name == 'bcax')):
1142
return (super(SHA3SIMDOp, self).astr()
1143
+ ('\t%s.16B, %s.16B, %s.16B, %s.16B' % (self.reg[0].astr("v"), self.reg[1].astr("v"),
1144
self.reg[2].astr("v"), self.reg[3].astr("v"))))
1145
elif (self._name == 'rax1'):
1146
return (super(SHA3SIMDOp, self).astr()
1147
+ ('\t%s.2D, %s.2D, %s.2D') % (self.reg[0].astr("v"), self.reg[1].astr("v"),
1148
self.reg[2].astr("v")))
1149
else:
1150
return (super(SHA3SIMDOp, self).astr()
1151
+ ('\t%s.2D, %s.2D, %s.2D, #%s') % (self.reg[0].astr("v"), self.reg[1].astr("v"),
1152
self.reg[2].astr("v"), self.imm6))
1153
1154
class LSEOp(Instruction):
1155
def __init__(self, args):
1156
self._name, self.asmname, self.size, self.suffix = args
1157
1158
def generate(self):
1159
self._name = "%s%s" % (self._name, self.suffix)
1160
self.asmname = "%s%s" % (self.asmname, self.suffix)
1161
self.srcReg = GeneralRegisterOrZr().generate()
1162
self.tgtReg = GeneralRegisterOrZr().generate()
1163
self.adrReg = GeneralRegisterOrSp().generate()
1164
1165
return self
1166
1167
def cstr(self):
1168
sizeSpec = {"x" : "Assembler::xword", "w" : "Assembler::word"} [self.size]
1169
return super(LSEOp, self).cstr() + "%s, %s, %s, %s);" % (sizeSpec, self.srcReg, self.tgtReg, self.adrReg)
1170
1171
def astr(self):
1172
return "%s\t%s, %s, [%s]" % (self.asmname, self.srcReg.astr(self.size), self.tgtReg.astr(self.size), self.adrReg.astr("x"))
1173
1174
def aname(self):
1175
return self.asmname
1176
1177
class TwoRegFloatOp(FloatInstruction):
1178
numRegs = 2
1179
1180
class ThreeRegFloatOp(TwoRegFloatOp):
1181
numRegs = 3
1182
1183
class FourRegFloatOp(TwoRegFloatOp):
1184
numRegs = 4
1185
1186
class FloatConvertOp(TwoRegFloatOp):
1187
1188
def __init__(self, args):
1189
self._cname, self._aname, modes = args
1190
TwoRegFloatOp.__init__(self, [self._cname, modes])
1191
1192
def aname(self):
1193
return self._aname
1194
1195
def cname(self):
1196
return self._cname
1197
1198
class TwoRegNEONOp(CommonNEONInstruction):
1199
numRegs = 2
1200
1201
class ThreeRegNEONOp(TwoRegNEONOp):
1202
numRegs = 3
1203
1204
class SpecialCases(Instruction):
1205
def __init__(self, data):
1206
self._name = data[0]
1207
self._cstr = data[1]
1208
self._astr = data[2]
1209
1210
def cstr(self):
1211
return self._cstr
1212
1213
def astr(self):
1214
return self._astr
1215
1216
def generate(kind, names):
1217
outfile.write("# " + kind.__name__ + "\n");
1218
print "\n// " + kind.__name__
1219
for name in names:
1220
for i in range(1):
1221
op = kind(name).generate()
1222
if op.multipleForms():
1223
forms = op.forms()
1224
aforms = op.aforms()
1225
for i in range(op.multipleForms()):
1226
cstr = op.cstr() % forms[i]
1227
astr = op.astr() % aforms[i]
1228
print " %-50s //\t%s" % (cstr, astr)
1229
outfile.write("\t" + astr + "\n")
1230
else:
1231
print " %-50s //\t%s" % (op.cstr(), op.astr())
1232
outfile.write("\t" + op.astr() + "\n")
1233
1234
outfile = open("aarch64ops.s", "w")
1235
1236
# To minimize the changes of assembler test code
1237
random.seed(0)
1238
1239
print "// BEGIN Generated code -- do not edit"
1240
print "// Generated by aarch64-asmtest.py"
1241
1242
print " Label back, forth;"
1243
print " __ bind(back);"
1244
1245
outfile.write("back:\n")
1246
1247
generate (ArithOp,
1248
[ "add", "sub", "adds", "subs",
1249
"addw", "subw", "addsw", "subsw",
1250
"and", "orr", "eor", "ands",
1251
"andw", "orrw", "eorw", "andsw",
1252
"bic", "orn", "eon", "bics",
1253
"bicw", "ornw", "eonw", "bicsw" ])
1254
1255
generate (AddSubImmOp,
1256
[ "addw", "addsw", "subw", "subsw",
1257
"add", "adds", "sub", "subs"])
1258
generate (LogicalImmOp,
1259
[ "andw", "orrw", "eorw", "andsw",
1260
"and", "orr", "eor", "ands"])
1261
1262
generate (AbsOp, [ "b", "bl" ])
1263
1264
generate (RegAndAbsOp, ["cbzw", "cbnzw", "cbz", "cbnz", "adr", "adrp"])
1265
1266
generate (RegImmAbsOp, ["tbz", "tbnz"])
1267
1268
generate (MoveWideImmOp, ["movnw", "movzw", "movkw", "movn", "movz", "movk"])
1269
1270
generate (BitfieldOp, ["sbfm", "bfmw", "ubfmw", "sbfm", "bfm", "ubfm"])
1271
1272
generate (ExtractOp, ["extrw", "extr"])
1273
1274
generate (CondBranchOp, ["EQ", "NE", "HS", "CS", "LO", "CC", "MI", "PL", "VS", "VC",
1275
"HI", "LS", "GE", "LT", "GT", "LE", "AL", "NV" ])
1276
1277
generate (ImmOp, ["svc", "hvc", "smc", "brk", "hlt", # "dcps1", "dcps2", "dcps3"
1278
])
1279
1280
generate (Op, ["nop", "eret", "drps", "isb"])
1281
1282
barriers = ["OSHLD", "OSHST", "OSH", "NSHLD", "NSHST", "NSH",
1283
"ISHLD", "ISHST", "ISH", "LD", "ST", "SY"]
1284
1285
generate (SystemOp, [["dsb", barriers], ["dmb", barriers]])
1286
1287
generate (OneRegOp, ["br", "blr"])
1288
1289
for mode in 'xwhb':
1290
generate (LoadStoreExclusiveOp, [["stxr", mode, 3], ["stlxr", mode, 3],
1291
["ldxr", mode, 2], ["ldaxr", mode, 2],
1292
["stlr", mode, 2], ["ldar", mode, 2]])
1293
1294
for mode in 'xw':
1295
generate (LoadStoreExclusiveOp, [["ldxp", mode, 3], ["ldaxp", mode, 3],
1296
["stxp", mode, 4], ["stlxp", mode, 4]])
1297
1298
for kind in range(6):
1299
sys.stdout.write("\n// " + Address.kindToStr(kind))
1300
if kind != Address.pcrel:
1301
generate (LoadStoreOp,
1302
[["str", "str", kind, "x"], ["str", "str", kind, "w"],
1303
["str", "strb", kind, "b"], ["str", "strh", kind, "h"],
1304
["ldr", "ldr", kind, "x"], ["ldr", "ldr", kind, "w"],
1305
["ldr", "ldrb", kind, "b"], ["ldr", "ldrh", kind, "h"],
1306
["ldrsb", "ldrsb", kind, "x"], ["ldrsh", "ldrsh", kind, "x"],
1307
["ldrsh", "ldrsh", kind, "w"], ["ldrsw", "ldrsw", kind, "x"],
1308
["ldr", "ldr", kind, "d"], ["ldr", "ldr", kind, "s"],
1309
["str", "str", kind, "d"], ["str", "str", kind, "s"],
1310
])
1311
else:
1312
generate (LoadStoreOp,
1313
[["ldr", "ldr", kind, "x"], ["ldr", "ldr", kind, "w"]])
1314
1315
1316
for kind in (Address.base_plus_unscaled_offset, Address.pcrel, Address.base_plus_reg, \
1317
Address.base_plus_scaled_offset):
1318
generate (LoadStoreOp,
1319
[["prfm", "prfm\tPLDL1KEEP,", kind, "x"]])
1320
1321
generate(AddSubCarryOp, ["adcw", "adcsw", "sbcw", "sbcsw", "adc", "adcs", "sbc", "sbcs"])
1322
1323
generate(AddSubExtendedOp, ["addw", "addsw", "sub", "subsw", "add", "adds", "sub", "subs"])
1324
1325
generate(ConditionalCompareOp, ["ccmnw", "ccmpw", "ccmn", "ccmp"])
1326
generate(ConditionalCompareImmedOp, ["ccmnw", "ccmpw", "ccmn", "ccmp"])
1327
generate(ConditionalSelectOp,
1328
["cselw", "csincw", "csinvw", "csnegw", "csel", "csinc", "csinv", "csneg"])
1329
1330
generate(TwoRegOp,
1331
["rbitw", "rev16w", "revw", "clzw", "clsw", "rbit",
1332
"rev16", "rev32", "rev", "clz", "cls"])
1333
generate(ThreeRegOp,
1334
["udivw", "sdivw", "lslvw", "lsrvw", "asrvw", "rorvw", "udiv", "sdiv",
1335
"lslv", "lsrv", "asrv", "rorv", "umulh", "smulh"])
1336
generate(FourRegMulOp,
1337
["maddw", "msubw", "madd", "msub", "smaddl", "smsubl", "umaddl", "umsubl"])
1338
1339
generate(ThreeRegFloatOp,
1340
[["fabds", "sss"], ["fmuls", "sss"], ["fdivs", "sss"], ["fadds", "sss"], ["fsubs", "sss"],
1341
["fabdd", "ddd"], ["fmuld", "ddd"], ["fdivd", "ddd"], ["faddd", "ddd"], ["fsubd", "ddd"],
1342
])
1343
1344
generate(FourRegFloatOp,
1345
[["fmadds", "ssss"], ["fmsubs", "ssss"], ["fnmadds", "ssss"], ["fnmadds", "ssss"],
1346
["fmaddd", "dddd"], ["fmsubd", "dddd"], ["fnmaddd", "dddd"], ["fnmaddd", "dddd"],])
1347
1348
generate(TwoRegFloatOp,
1349
[["fmovs", "ss"], ["fabss", "ss"], ["fnegs", "ss"], ["fsqrts", "ss"],
1350
["fcvts", "ds"],
1351
["fmovd", "dd"], ["fabsd", "dd"], ["fnegd", "dd"], ["fsqrtd", "dd"],
1352
["fcvtd", "sd"],
1353
])
1354
1355
generate(FloatConvertOp, [["fcvtzsw", "fcvtzs", "ws"], ["fcvtzs", "fcvtzs", "xs"],
1356
["fcvtzdw", "fcvtzs", "wd"], ["fcvtzd", "fcvtzs", "xd"],
1357
["scvtfws", "scvtf", "sw"], ["scvtfs", "scvtf", "sx"],
1358
["scvtfwd", "scvtf", "dw"], ["scvtfd", "scvtf", "dx"],
1359
["fmovs", "fmov", "ws"], ["fmovd", "fmov", "xd"],
1360
["fmovs", "fmov", "sw"], ["fmovd", "fmov", "dx"]])
1361
1362
generate(TwoRegFloatOp, [["fcmps", "ss"], ["fcmpd", "dd"],
1363
["fcmps", "sz"], ["fcmpd", "dz"]])
1364
1365
for kind in range(3):
1366
generate(LoadStorePairOp, [["stp", "stp", kind, "w"], ["ldp", "ldp", kind, "w"],
1367
["ldpsw", "ldpsw", kind, "x"],
1368
["stp", "stp", kind, "x"], ["ldp", "ldp", kind, "x"]
1369
])
1370
generate(LoadStorePairOp, [["stnp", "stnp", 0, "w"], ["ldnp", "ldnp", 0, "w"],
1371
["stnp", "stnp", 0, "x"], ["ldnp", "ldnp", 0, "x"]])
1372
1373
generate(LdStNEONOp, [["ld1", 1, "8B", Address.base_only],
1374
["ld1", 2, "16B", Address.post],
1375
["ld1", 3, "1D", Address.post_reg],
1376
["ld1", 4, "8H", Address.post],
1377
["ld1r", 1, "8B", Address.base_only],
1378
["ld1r", 1, "4S", Address.post],
1379
["ld1r", 1, "1D", Address.post_reg],
1380
["ld2", 2, "2D", Address.base_only],
1381
["ld2", 2, "4H", Address.post],
1382
["ld2r", 2, "16B", Address.base_only],
1383
["ld2r", 2, "2S", Address.post],
1384
["ld2r", 2, "2D", Address.post_reg],
1385
["ld3", 3, "4S", Address.post_reg],
1386
["ld3", 3, "2S", Address.base_only],
1387
["ld3r", 3, "8H", Address.base_only],
1388
["ld3r", 3, "4S", Address.post],
1389
["ld3r", 3, "1D", Address.post_reg],
1390
["ld4", 4, "8H", Address.post],
1391
["ld4", 4, "8B", Address.post_reg],
1392
["ld4r", 4, "8B", Address.base_only],
1393
["ld4r", 4, "4H", Address.post],
1394
["ld4r", 4, "2S", Address.post_reg],
1395
])
1396
1397
generate(NEONReduceInstruction,
1398
[["addv", "addv", "8B"], ["addv", "addv", "16B"],
1399
["addv", "addv", "4H"], ["addv", "addv", "8H"],
1400
["addv", "addv", "4S"],
1401
["smaxv", "smaxv", "8B"], ["smaxv", "smaxv", "16B"],
1402
["smaxv", "smaxv", "4H"], ["smaxv", "smaxv", "8H"],
1403
["smaxv", "smaxv", "4S"], ["fmaxv", "fmaxv", "4S"],
1404
["sminv", "sminv", "8B"], ["uminv", "uminv", "8B"],
1405
["sminv", "sminv", "16B"],["uminv", "uminv", "16B"],
1406
["sminv", "sminv", "4H"], ["uminv", "uminv", "4H"],
1407
["sminv", "sminv", "8H"], ["uminv", "uminv", "8H"],
1408
["sminv", "sminv", "4S"], ["uminv", "uminv", "4S"],
1409
["fminv", "fminv", "4S"],
1410
["fmaxp", "fmaxp", "2S"], ["fmaxp", "fmaxp", "2D"],
1411
["fminp", "fminp", "2S"], ["fminp", "fminp", "2D"],
1412
])
1413
1414
generate(TwoRegNEONOp,
1415
[["absr", "abs", "8B"], ["absr", "abs", "16B"],
1416
["absr", "abs", "4H"], ["absr", "abs", "8H"],
1417
["absr", "abs", "2S"], ["absr", "abs", "4S"],
1418
["absr", "abs", "2D"],
1419
["fabs", "fabs", "2S"], ["fabs", "fabs", "4S"],
1420
["fabs", "fabs", "2D"],
1421
["fneg", "fneg", "2S"], ["fneg", "fneg", "4S"],
1422
["fneg", "fneg", "2D"],
1423
["fsqrt", "fsqrt", "2S"], ["fsqrt", "fsqrt", "4S"],
1424
["fsqrt", "fsqrt", "2D"],
1425
["notr", "not", "8B"], ["notr", "not", "16B"],
1426
])
1427
1428
generate(ThreeRegNEONOp,
1429
[["andr", "and", "8B"], ["andr", "and", "16B"],
1430
["orr", "orr", "8B"], ["orr", "orr", "16B"],
1431
["eor", "eor", "8B"], ["eor", "eor", "16B"],
1432
["addv", "add", "8B"], ["addv", "add", "16B"],
1433
["addv", "add", "4H"], ["addv", "add", "8H"],
1434
["addv", "add", "2S"], ["addv", "add", "4S"],
1435
["addv", "add", "2D"],
1436
["fadd", "fadd", "2S"], ["fadd", "fadd", "4S"],
1437
["fadd", "fadd", "2D"],
1438
["subv", "sub", "8B"], ["subv", "sub", "16B"],
1439
["subv", "sub", "4H"], ["subv", "sub", "8H"],
1440
["subv", "sub", "2S"], ["subv", "sub", "4S"],
1441
["subv", "sub", "2D"],
1442
["fsub", "fsub", "2S"], ["fsub", "fsub", "4S"],
1443
["fsub", "fsub", "2D"],
1444
["mulv", "mul", "8B"], ["mulv", "mul", "16B"],
1445
["mulv", "mul", "4H"], ["mulv", "mul", "8H"],
1446
["mulv", "mul", "2S"], ["mulv", "mul", "4S"],
1447
["fabd", "fabd", "2S"], ["fabd", "fabd", "4S"],
1448
["fabd", "fabd", "2D"],
1449
["fmul", "fmul", "2S"], ["fmul", "fmul", "4S"],
1450
["fmul", "fmul", "2D"],
1451
["mlav", "mla", "4H"], ["mlav", "mla", "8H"],
1452
["mlav", "mla", "2S"], ["mlav", "mla", "4S"],
1453
["fmla", "fmla", "2S"], ["fmla", "fmla", "4S"],
1454
["fmla", "fmla", "2D"],
1455
["mlsv", "mls", "4H"], ["mlsv", "mls", "8H"],
1456
["mlsv", "mls", "2S"], ["mlsv", "mls", "4S"],
1457
["fmls", "fmls", "2S"], ["fmls", "fmls", "4S"],
1458
["fmls", "fmls", "2D"],
1459
["fdiv", "fdiv", "2S"], ["fdiv", "fdiv", "4S"],
1460
["fdiv", "fdiv", "2D"],
1461
["maxv", "smax", "8B"], ["maxv", "smax", "16B"],
1462
["maxv", "smax", "4H"], ["maxv", "smax", "8H"],
1463
["maxv", "smax", "2S"], ["maxv", "smax", "4S"],
1464
["smaxp", "smaxp", "8B"], ["smaxp", "smaxp", "16B"],
1465
["smaxp", "smaxp", "4H"], ["smaxp", "smaxp", "8H"],
1466
["smaxp", "smaxp", "2S"], ["smaxp", "smaxp", "4S"],
1467
["fmax", "fmax", "2S"], ["fmax", "fmax", "4S"],
1468
["fmax", "fmax", "2D"],
1469
["minv", "smin", "8B"], ["minv", "smin", "16B"],
1470
["minv", "smin", "4H"], ["minv", "smin", "8H"],
1471
["minv", "smin", "2S"], ["minv", "smin", "4S"],
1472
["sminp", "sminp", "8B"], ["sminp", "sminp", "16B"],
1473
["sminp", "sminp", "4H"], ["sminp", "sminp", "8H"],
1474
["sminp", "sminp", "2S"], ["sminp", "sminp", "4S"],
1475
["fmin", "fmin", "2S"], ["fmin", "fmin", "4S"],
1476
["fmin", "fmin", "2D"],
1477
["cmeq", "cmeq", "8B"], ["cmeq", "cmeq", "16B"],
1478
["cmeq", "cmeq", "4H"], ["cmeq", "cmeq", "8H"],
1479
["cmeq", "cmeq", "2S"], ["cmeq", "cmeq", "4S"],
1480
["cmeq", "cmeq", "2D"],
1481
["fcmeq", "fcmeq", "2S"], ["fcmeq", "fcmeq", "4S"],
1482
["fcmeq", "fcmeq", "2D"],
1483
["cmgt", "cmgt", "8B"], ["cmgt", "cmgt", "16B"],
1484
["cmgt", "cmgt", "4H"], ["cmgt", "cmgt", "8H"],
1485
["cmgt", "cmgt", "2S"], ["cmgt", "cmgt", "4S"],
1486
["cmgt", "cmgt", "2D"],
1487
["fcmgt", "fcmgt", "2S"], ["fcmgt", "fcmgt", "4S"],
1488
["fcmgt", "fcmgt", "2D"],
1489
["cmge", "cmge", "8B"], ["cmge", "cmge", "16B"],
1490
["cmge", "cmge", "4H"], ["cmge", "cmge", "8H"],
1491
["cmge", "cmge", "2S"], ["cmge", "cmge", "4S"],
1492
["cmge", "cmge", "2D"],
1493
["fcmge", "fcmge", "2S"], ["fcmge", "fcmge", "4S"],
1494
["fcmge", "fcmge", "2D"],
1495
])
1496
1497
generate(SpecialCases, [["ccmn", "__ ccmn(zr, zr, 3u, Assembler::LE);", "ccmn\txzr, xzr, #3, LE"],
1498
["ccmnw", "__ ccmnw(zr, zr, 5u, Assembler::EQ);", "ccmn\twzr, wzr, #5, EQ"],
1499
["ccmp", "__ ccmp(zr, 1, 4u, Assembler::NE);", "ccmp\txzr, 1, #4, NE"],
1500
["ccmpw", "__ ccmpw(zr, 2, 2, Assembler::GT);", "ccmp\twzr, 2, #2, GT"],
1501
["extr", "__ extr(zr, zr, zr, 0);", "extr\txzr, xzr, xzr, 0"],
1502
["stlxp", "__ stlxp(r0, zr, zr, sp);", "stlxp\tw0, xzr, xzr, [sp]"],
1503
["stlxpw", "__ stlxpw(r2, zr, zr, r3);", "stlxp\tw2, wzr, wzr, [x3]"],
1504
["stxp", "__ stxp(r4, zr, zr, r5);", "stxp\tw4, xzr, xzr, [x5]"],
1505
["stxpw", "__ stxpw(r6, zr, zr, sp);", "stxp\tw6, wzr, wzr, [sp]"],
1506
["dup", "__ dup(v0, __ T16B, zr);", "dup\tv0.16b, wzr"],
1507
["mov", "__ mov(v1, __ T1D, 0, zr);", "mov\tv1.d[0], xzr"],
1508
["mov", "__ mov(v1, __ T2S, 1, zr);", "mov\tv1.s[1], wzr"],
1509
["mov", "__ mov(v1, __ T4H, 2, zr);", "mov\tv1.h[2], wzr"],
1510
["mov", "__ mov(v1, __ T8B, 3, zr);", "mov\tv1.b[3], wzr"],
1511
["smov", "__ smov(r0, v1, __ S, 0);", "smov\tx0, v1.s[0]"],
1512
["smov", "__ smov(r0, v1, __ H, 1);", "smov\tx0, v1.h[1]"],
1513
["smov", "__ smov(r0, v1, __ B, 2);", "smov\tx0, v1.b[2]"],
1514
["umov", "__ umov(r0, v1, __ D, 0);", "umov\tx0, v1.d[0]"],
1515
["umov", "__ umov(r0, v1, __ S, 1);", "umov\tw0, v1.s[1]"],
1516
["umov", "__ umov(r0, v1, __ H, 2);", "umov\tw0, v1.h[2]"],
1517
["umov", "__ umov(r0, v1, __ B, 3);", "umov\tw0, v1.b[3]"],
1518
["ld1", "__ ld1(v31, v0, __ T2D, Address(__ post(r1, r0)));", "ld1\t{v31.2d, v0.2d}, [x1], x0"],
1519
# SVE instructions
1520
["cpy", "__ sve_cpy(z0, __ S, p0, v1);", "mov\tz0.s, p0/m, s1"],
1521
["inc", "__ sve_inc(r0, __ S);", "incw\tx0"],
1522
["dec", "__ sve_dec(r1, __ H);", "dech\tx1"],
1523
["lsl", "__ sve_lsl(z0, __ B, z1, 7);", "lsl\tz0.b, z1.b, #7"],
1524
["lsl", "__ sve_lsl(z21, __ H, z1, 15);", "lsl\tz21.h, z1.h, #15"],
1525
["lsl", "__ sve_lsl(z0, __ S, z1, 31);", "lsl\tz0.s, z1.s, #31"],
1526
["lsl", "__ sve_lsl(z0, __ D, z1, 63);", "lsl\tz0.d, z1.d, #63"],
1527
["lsr", "__ sve_lsr(z0, __ B, z1, 7);", "lsr\tz0.b, z1.b, #7"],
1528
["asr", "__ sve_asr(z0, __ H, z11, 15);", "asr\tz0.h, z11.h, #15"],
1529
["lsr", "__ sve_lsr(z30, __ S, z1, 31);", "lsr\tz30.s, z1.s, #31"],
1530
["asr", "__ sve_asr(z0, __ D, z1, 63);", "asr\tz0.d, z1.d, #63"],
1531
["addvl", "__ sve_addvl(sp, r0, 31);", "addvl\tsp, x0, #31"],
1532
["addpl", "__ sve_addpl(r1, sp, -32);", "addpl\tx1, sp, -32"],
1533
["cntp", "__ sve_cntp(r8, __ B, p0, p1);", "cntp\tx8, p0, p1.b"],
1534
["dup", "__ sve_dup(z0, __ B, 127);", "dup\tz0.b, 127"],
1535
["dup", "__ sve_dup(z1, __ H, -128);", "dup\tz1.h, -128"],
1536
["dup", "__ sve_dup(z2, __ S, 32512);", "dup\tz2.s, 32512"],
1537
["dup", "__ sve_dup(z7, __ D, -32768);", "dup\tz7.d, -32768"],
1538
["ld1b", "__ sve_ld1b(z0, __ B, p0, Address(sp));", "ld1b\t{z0.b}, p0/z, [sp]"],
1539
["ld1h", "__ sve_ld1h(z10, __ H, p1, Address(sp, -8));", "ld1h\t{z10.h}, p1/z, [sp, #-8, MUL VL]"],
1540
["ld1w", "__ sve_ld1w(z20, __ S, p2, Address(r0, 7));", "ld1w\t{z20.s}, p2/z, [x0, #7, MUL VL]"],
1541
["ld1b", "__ sve_ld1b(z30, __ B, p3, Address(sp, r8));", "ld1b\t{z30.b}, p3/z, [sp, x8]"],
1542
["ld1w", "__ sve_ld1w(z0, __ S, p4, Address(sp, r28));", "ld1w\t{z0.s}, p4/z, [sp, x28, LSL #2]"],
1543
["ld1d", "__ sve_ld1d(z11, __ D, p5, Address(r0, r1));", "ld1d\t{z11.d}, p5/z, [x0, x1, LSL #3]"],
1544
["st1b", "__ sve_st1b(z22, __ B, p6, Address(sp));", "st1b\t{z22.b}, p6, [sp]"],
1545
["st1b", "__ sve_st1b(z31, __ B, p7, Address(sp, -8));", "st1b\t{z31.b}, p7, [sp, #-8, MUL VL]"],
1546
["st1w", "__ sve_st1w(z0, __ S, p1, Address(r0, 7));", "st1w\t{z0.s}, p1, [x0, #7, MUL VL]"],
1547
["st1b", "__ sve_st1b(z0, __ B, p2, Address(sp, r1));", "st1b\t{z0.b}, p2, [sp, x1]"],
1548
["st1h", "__ sve_st1h(z0, __ H, p3, Address(sp, r8));", "st1h\t{z0.h}, p3, [sp, x8, LSL #1]"],
1549
["st1d", "__ sve_st1d(z0, __ D, p4, Address(r0, r17));", "st1d\t{z0.d}, p4, [x0, x17, LSL #3]"],
1550
["ldr", "__ sve_ldr(z0, Address(sp));", "ldr\tz0, [sp]"],
1551
["ldr", "__ sve_ldr(z31, Address(sp, -256));", "ldr\tz31, [sp, #-256, MUL VL]"],
1552
["str", "__ sve_str(z8, Address(r8, 255));", "str\tz8, [x8, #255, MUL VL]"],
1553
])
1554
1555
print "\n// FloatImmediateOp"
1556
for float in ("2.0", "2.125", "4.0", "4.25", "8.0", "8.5", "16.0", "17.0", "0.125",
1557
"0.1328125", "0.25", "0.265625", "0.5", "0.53125", "1.0", "1.0625",
1558
"-2.0", "-2.125", "-4.0", "-4.25", "-8.0", "-8.5", "-16.0", "-17.0",
1559
"-0.125", "-0.1328125", "-0.25", "-0.265625", "-0.5", "-0.53125", "-1.0", "-1.0625"):
1560
astr = "fmov d0, #" + float
1561
cstr = "__ fmovd(v0, " + float + ");"
1562
print " %-50s //\t%s" % (cstr, astr)
1563
outfile.write("\t" + astr + "\n")
1564
1565
# ARMv8.1A
1566
for size in ("x", "w"):
1567
for suffix in ("", "a", "al", "l"):
1568
generate(LSEOp, [["swp", "swp", size, suffix],
1569
["ldadd", "ldadd", size, suffix],
1570
["ldbic", "ldclr", size, suffix],
1571
["ldeor", "ldeor", size, suffix],
1572
["ldorr", "ldset", size, suffix],
1573
["ldsmin", "ldsmin", size, suffix],
1574
["ldsmax", "ldsmax", size, suffix],
1575
["ldumin", "ldumin", size, suffix],
1576
["ldumax", "ldumax", size, suffix]]);
1577
1578
# ARMv8.2A
1579
generate(SHA3SIMDOp, ["bcax", "eor3", "rax1", "xar"])
1580
1581
generate(SHA512SIMDOp, ["sha512h", "sha512h2", "sha512su0", "sha512su1"])
1582
1583
generate(SVEVectorOp, [["add", "ZZZ"],
1584
["sub", "ZZZ"],
1585
["fadd", "ZZZ"],
1586
["fmul", "ZZZ"],
1587
["fsub", "ZZZ"],
1588
["abs", "ZPZ"],
1589
["add", "ZPZ", "dn"],
1590
["asr", "ZPZ", "dn"],
1591
["cnt", "ZPZ"],
1592
["lsl", "ZPZ", "dn"],
1593
["lsr", "ZPZ", "dn"],
1594
["mul", "ZPZ", "dn"],
1595
["neg", "ZPZ"],
1596
["not", "ZPZ"],
1597
["smax", "ZPZ", "dn"],
1598
["smin", "ZPZ", "dn"],
1599
["sub", "ZPZ", "dn"],
1600
["fabs", "ZPZ"],
1601
["fadd", "ZPZ", "dn"],
1602
["fdiv", "ZPZ", "dn"],
1603
["fmax", "ZPZ", "dn"],
1604
["fmin", "ZPZ", "dn"],
1605
["fmul", "ZPZ", "dn"],
1606
["fneg", "ZPZ"],
1607
["frintm", "ZPZ"],
1608
["frintn", "ZPZ"],
1609
["frintp", "ZPZ"],
1610
["fsqrt", "ZPZ"],
1611
["fsub", "ZPZ", "dn"],
1612
["fmla", "ZPZZ"],
1613
["fmls", "ZPZZ"],
1614
["fnmla", "ZPZZ"],
1615
["fnmls", "ZPZZ"],
1616
["mla", "ZPZZ"],
1617
["mls", "ZPZZ"],
1618
["and", "ZZZ"],
1619
["eor", "ZZZ"],
1620
["orr", "ZZZ"],
1621
["bic", "ZZZ"],
1622
])
1623
1624
generate(SVEReductionOp, [["andv", 0], ["orv", 0], ["eorv", 0], ["smaxv", 0], ["sminv", 0],
1625
["fminv", 2], ["fmaxv", 2], ["fadda", 2], ["uaddv", 0]])
1626
1627
print "\n __ bind(forth);"
1628
outfile.write("forth:\n")
1629
1630
outfile.close()
1631
1632
# compile for sve with 8.2 and sha3 because of SHA3 crypto extension.
1633
subprocess.check_call([AARCH64_AS, "-march=armv8.2-a+sha3+sve", "aarch64ops.s", "-o", "aarch64ops.o"])
1634
1635
print
1636
print "/*"
1637
print "*/"
1638
1639
subprocess.check_call([AARCH64_OBJCOPY, "-O", "binary", "-j", ".text", "aarch64ops.o", "aarch64ops.bin"])
1640
1641
infile = open("aarch64ops.bin", "r")
1642
bytes = bytearray(infile.read())
1643
1644
print
1645
print " static const unsigned int insns[] ="
1646
print " {"
1647
1648
i = 0
1649
while i < len(bytes):
1650
print " 0x%02x%02x%02x%02x," % (bytes[i+3], bytes[i+2], bytes[i+1], bytes[i]),
1651
i += 4
1652
if i%16 == 0:
1653
print
1654
print "\n };"
1655
print "// END Generated code -- do not edit"
1656
1657
infile.close()
1658
1659
for f in ["aarch64ops.s", "aarch64ops.o", "aarch64ops.bin"]:
1660
os.remove(f)
1661
1662