PyNerva 0.0.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. nervapy/__init__.py +50 -0
  2. nervapy/abi.py +91 -0
  3. nervapy/arm/__init__.py +124 -0
  4. nervapy/arm/__main__.py +0 -0
  5. nervapy/arm/abi.py +138 -0
  6. nervapy/arm/formats.py +49 -0
  7. nervapy/arm/function.py +2465 -0
  8. nervapy/arm/generic.py +10796 -0
  9. nervapy/arm/instructions.py +519 -0
  10. nervapy/arm/isa.py +409 -0
  11. nervapy/arm/literal_pool.py +331 -0
  12. nervapy/arm/microarchitecture.py +211 -0
  13. nervapy/arm/pseudo.py +652 -0
  14. nervapy/arm/registers.py +1458 -0
  15. nervapy/arm/vfpneon.py +4092 -0
  16. nervapy/arm.py +13 -0
  17. nervapy/c/__init__.py +1 -0
  18. nervapy/c/types.py +436 -0
  19. nervapy/codegen.py +99 -0
  20. nervapy/common/__init__.py +4 -0
  21. nervapy/common/function.py +5 -0
  22. nervapy/common/regalloc.py +121 -0
  23. nervapy/constant_data.py +282 -0
  24. nervapy/encoder.py +246 -0
  25. nervapy/formats/__init__.py +2 -0
  26. nervapy/formats/elf/__init__.py +4 -0
  27. nervapy/formats/elf/file.py +178 -0
  28. nervapy/formats/elf/image.py +106 -0
  29. nervapy/formats/elf/section.py +422 -0
  30. nervapy/formats/elf/symbol.py +281 -0
  31. nervapy/formats/macho/__init__.py +2 -0
  32. nervapy/formats/macho/file.py +123 -0
  33. nervapy/formats/macho/image.py +143 -0
  34. nervapy/formats/macho/section.py +322 -0
  35. nervapy/formats/macho/symbol.py +158 -0
  36. nervapy/formats/mscoff/__init__.py +8 -0
  37. nervapy/formats/mscoff/image.py +132 -0
  38. nervapy/formats/mscoff/section.py +181 -0
  39. nervapy/formats/mscoff/symbol.py +148 -0
  40. nervapy/function.py +136 -0
  41. nervapy/literal.py +731 -0
  42. nervapy/loader.py +188 -0
  43. nervapy/name.py +159 -0
  44. nervapy/parse.py +52 -0
  45. nervapy/stream.py +58 -0
  46. nervapy/util.py +126 -0
  47. nervapy/writer.py +518 -0
  48. nervapy/x86_64/__init__.py +324 -0
  49. nervapy/x86_64/__main__.py +407 -0
  50. nervapy/x86_64/abi.py +517 -0
  51. nervapy/x86_64/amd.py +6464 -0
  52. nervapy/x86_64/avx.py +102029 -0
  53. nervapy/x86_64/crypto.py +1533 -0
  54. nervapy/x86_64/encoding.py +424 -0
  55. nervapy/x86_64/fma.py +19138 -0
  56. nervapy/x86_64/function.py +2707 -0
  57. nervapy/x86_64/generic.py +23384 -0
  58. nervapy/x86_64/instructions.py +500 -0
  59. nervapy/x86_64/isa.py +476 -0
  60. nervapy/x86_64/lower.py +126 -0
  61. nervapy/x86_64/mask.py +2593 -0
  62. nervapy/x86_64/meta.py +143 -0
  63. nervapy/x86_64/mmxsse.py +17265 -0
  64. nervapy/x86_64/nacl.py +327 -0
  65. nervapy/x86_64/operand.py +1204 -0
  66. nervapy/x86_64/options.py +21 -0
  67. nervapy/x86_64/pseudo.py +686 -0
  68. nervapy/x86_64/registers.py +1225 -0
  69. nervapy/x86_64/types.py +17 -0
  70. nervapy/x86_64/uarch.py +580 -0
  71. pynerva-0.0.7.dist-info/METADATA +310 -0
  72. pynerva-0.0.7.dist-info/RECORD +74 -0
  73. pynerva-0.0.7.dist-info/WHEEL +4 -0
  74. pynerva-0.0.7.dist-info/licenses/LICENSE.rst +15 -0
@@ -0,0 +1,1458 @@
1
+ # This file is part of PeachPy package and is licensed under the Simplified BSD license.
2
+ # See license.rst for the full text of the license.
3
+
4
+
5
+ import six
6
+
7
+
8
+ class Register(object):
9
+ GPType = 1
10
+ WMMXType = 2
11
+ VFPType = 3
12
+
13
+ def __init__(self):
14
+ super(Register, self).__init__()
15
+ self.number = None
16
+ self.size = None
17
+
18
+ def __lt__(self, other):
19
+ return self.number < other.number
20
+
21
+ def __le__(self, other):
22
+ return self.number <= other.number
23
+
24
+ def __eq__(self, other):
25
+ return isinstance(other, Register) and self.number == other.number
26
+
27
+ def __ne__(self, other):
28
+ return not isinstance(other, Register) or self.number != other.number
29
+
30
+ def __gt__(self, other):
31
+ return self.number > other.number
32
+
33
+ def __ge__(self, other):
34
+ return self.number >= other.number
35
+
36
+ def __contains__(self, register):
37
+ if self.id == register.id:
38
+ register_mask = register.get_mask()
39
+ return (self.mask & register_mask) == register_mask
40
+ else:
41
+ return False
42
+
43
+ def __hash__(self):
44
+ return self.number
45
+
46
+ @property
47
+ def id(self):
48
+ return self.number >> 12
49
+
50
+ @property
51
+ def mask(self):
52
+ return self.number & 0xFFF
53
+
54
+ @property
55
+ def bitboard(self):
56
+ assert not self.is_virtual
57
+ if (
58
+ isinstance(self, GeneralPurposeRegister)
59
+ or isinstance(self, WMMXRegister)
60
+ or isinstance(self, SRegister)
61
+ ):
62
+ return 0x1 << self.get_physical_number()
63
+ elif isinstance(self, DRegister):
64
+ return 0x3 << (self.get_physical_number() * 2)
65
+ elif isinstance(self, QRegister):
66
+ return 0xF << (self.get_physical_number() * 4)
67
+
68
+ @staticmethod
69
+ def from_parts(id, mask, expand=False):
70
+ if mask == 0x001:
71
+ # General-purpose register
72
+ return GeneralPurposeRegister((id << 12) | mask)
73
+ elif mask == 0x002:
74
+ # WMMX register
75
+ return WMMXRegister((id << 12) | 0x002)
76
+ elif (mask & ~0x7F0) == 0x000:
77
+ # VFP or NEON register
78
+ if (mask & 0x7F0) == 0x0F0:
79
+ return QRegister((id << 12) | mask)
80
+ elif (
81
+ ((mask & 0x7F0) == 0x030)
82
+ or ((mask & 0x7F0) == 0x0C0)
83
+ or ((mask & 0x7F0) == 0x300)
84
+ ):
85
+ return DRegister((id << 12) | mask)
86
+ elif (mask & (mask - 1)) == 0:
87
+ return SRegister((id << 12) | mask)
88
+ else:
89
+ if expand and ((mask & ~0x0F0) == 0):
90
+ return QRegister((id << 12) | 0x0F0)
91
+ else:
92
+ raise ValueError("Invalid register mask %s" % hex(mask))
93
+ else:
94
+ raise ValueError("Invalid register mask %s" % hex(mask))
95
+
96
+ @staticmethod
97
+ def from_bitboard(bitboard, regtype):
98
+ if regtype == Register.GPType:
99
+ return {
100
+ 0x0001: r0,
101
+ 0x0002: r1,
102
+ 0x0004: r2,
103
+ 0x0008: r3,
104
+ 0x0010: r4,
105
+ 0x0020: r5,
106
+ 0x0040: r6,
107
+ 0x0080: r7,
108
+ 0x0100: r8,
109
+ 0x0200: r9,
110
+ 0x0400: r10,
111
+ 0x0800: r11,
112
+ 0x1000: r12,
113
+ 0x2000: sp,
114
+ 0x4000: lr,
115
+ 0x8000: pc,
116
+ }[bitboard]
117
+ elif regtype == Register.WMMXType:
118
+ return {
119
+ 0x0001: wr0,
120
+ 0x0002: wr1,
121
+ 0x0004: wr2,
122
+ 0x0008: wr3,
123
+ 0x0010: wr4,
124
+ 0x0020: wr5,
125
+ 0x0040: wr6,
126
+ 0x0080: wr7,
127
+ 0x0100: wr8,
128
+ 0x0200: wr9,
129
+ 0x0400: wr10,
130
+ 0x0800: wr11,
131
+ 0x1000: wr12,
132
+ 0x2000: wr13,
133
+ 0x4000: wr14,
134
+ 0x8000: wr15,
135
+ }[bitboard]
136
+ elif regtype == Register.VFPType:
137
+ return {
138
+ 0x00000001: s0,
139
+ 0x00000002: s1,
140
+ 0x00000004: s2,
141
+ 0x00000008: s3,
142
+ 0x00000010: s4,
143
+ 0x00000020: s5,
144
+ 0x00000040: s6,
145
+ 0x00000080: s7,
146
+ 0x00000100: s8,
147
+ 0x00000200: s9,
148
+ 0x00000400: s10,
149
+ 0x00000800: s11,
150
+ 0x00001000: s12,
151
+ 0x00002000: s13,
152
+ 0x00004000: s14,
153
+ 0x00008000: s15,
154
+ 0x00010000: s16,
155
+ 0x00020000: s17,
156
+ 0x00040000: s18,
157
+ 0x00080000: s19,
158
+ 0x00100000: s20,
159
+ 0x00200000: s21,
160
+ 0x00400000: s22,
161
+ 0x00800000: s23,
162
+ 0x01000000: s24,
163
+ 0x02000000: s25,
164
+ 0x04000000: s26,
165
+ 0x08000000: s27,
166
+ 0x10000000: s28,
167
+ 0x20000000: s29,
168
+ 0x40000000: s30,
169
+ 0x80000000: s31,
170
+ 0x0000000000000003: d0,
171
+ 0x000000000000000C: d1,
172
+ 0x0000000000000030: d2,
173
+ 0x00000000000000C0: d3,
174
+ 0x0000000000000300: d4,
175
+ 0x0000000000000C00: d5,
176
+ 0x0000000000003000: d6,
177
+ 0x000000000000C000: d7,
178
+ 0x0000000000030000: d8,
179
+ 0x00000000000C0000: d9,
180
+ 0x0000000000300000: d10,
181
+ 0x0000000000C00000: d11,
182
+ 0x0000000003000000: d12,
183
+ 0x000000000C000000: d13,
184
+ 0x0000000030000000: d14,
185
+ 0x00000000C0000000: d15,
186
+ 0x0000000300000000: d16,
187
+ 0x0000000C00000000: d17,
188
+ 0x0000003000000000: d18,
189
+ 0x000000C000000000: d19,
190
+ 0x0000030000000000: d20,
191
+ 0x00000C0000000000: d21,
192
+ 0x0000300000000000: d22,
193
+ 0x0000C00000000000: d23,
194
+ 0x0003000000000000: d24,
195
+ 0x000C000000000000: d25,
196
+ 0x0030000000000000: d26,
197
+ 0x00C0000000000000: d27,
198
+ 0x0300000000000000: d28,
199
+ 0x0C00000000000000: d29,
200
+ 0x3000000000000000: d30,
201
+ 0xC000000000000000: d31,
202
+ 0x000000000000000F: q0,
203
+ 0x00000000000000F0: q1,
204
+ 0x0000000000000F00: q2,
205
+ 0x000000000000F000: q3,
206
+ 0x00000000000F0000: q4,
207
+ 0x0000000000F00000: q5,
208
+ 0x000000000F000000: q6,
209
+ 0x00000000F0000000: q7,
210
+ 0x0000000F00000000: q8,
211
+ 0x000000F000000000: q9,
212
+ 0x00000F0000000000: q10,
213
+ 0x0000F00000000000: q11,
214
+ 0x000F000000000000: q12,
215
+ 0x00F0000000000000: q13,
216
+ 0x0F00000000000000: q14,
217
+ 0xF000000000000000: q15,
218
+ }[bitboard]
219
+
220
+ def extend_bitboard(self, bitboard):
221
+ physical_register = Register.from_bitboard(bitboard, self.type)
222
+ if isinstance(self, SRegister) and self.parent and self.parent.parent:
223
+ physical_register = physical_register.get_parent().get_parent()
224
+ elif (
225
+ isinstance(self, SRegister) or isinstance(self, DRegister)
226
+ ) and self.parent:
227
+ physical_register = physical_register.get_parent()
228
+ return physical_register.get_bitboard()
229
+
230
+ @property
231
+ def is_virtual(self):
232
+ return self.number >= 0x40000
233
+
234
+ def bind(self, register):
235
+ assert self.is_virtual
236
+ assert not register.is_virtual
237
+ if isinstance(register, GeneralPurposeRegister) or isinstance(
238
+ register, WMMXRegister
239
+ ):
240
+ self.number = (self.number & 0xFFF) | (register.id << 12)
241
+ elif isinstance(register, SRegister):
242
+ self.number = register.number
243
+ elif isinstance(register, DRegister):
244
+ if isinstance(self, DRegister):
245
+ self.number = register.number
246
+ elif isinstance(self, SRegister):
247
+ if register.mask == 0x030 and self.mask == 0x100:
248
+ self.number = (register.id << 12) | 0x010
249
+ elif register.mask == 0x030 and self.mask == 0x200:
250
+ self.number = (register.id << 12) | 0x020
251
+ elif register.mask == 0x0C0 and self.mask == 0x100:
252
+ self.number = (register.id << 12) | 0x040
253
+ elif register.mask == 0x0C0 and self.mask == 0x200:
254
+ self.number = (register.id << 12) | 0x080
255
+ else:
256
+ assert False
257
+ else:
258
+ assert False
259
+ elif isinstance(register, QRegister):
260
+ if isinstance(self, QRegister):
261
+ self.number = register.number
262
+ elif isinstance(self, DRegister):
263
+ self.number = (register.id << 12) | self.mask
264
+ elif isinstance(self, SRegister):
265
+ self.number = (register.id << 12) | self.mask
266
+ else:
267
+ assert False
268
+ assert not self.is_virtual
269
+
270
+
271
+ class GeneralPurposeRegister(Register):
272
+ _name_to_number_map = {
273
+ "r0": 0x20001,
274
+ "r1": 0x21001,
275
+ "r2": 0x22001,
276
+ "r3": 0x23001,
277
+ "r4": 0x24001,
278
+ "r5": 0x25001,
279
+ "r6": 0x26001,
280
+ "r7": 0x27001,
281
+ "r8": 0x28001,
282
+ "r9": 0x29001,
283
+ "r10": 0x2A001,
284
+ "r11": 0x2B001,
285
+ "r12": 0x2C001,
286
+ "sp": 0x2D001,
287
+ "lr": 0x2E001,
288
+ "pc": 0x2F001,
289
+ }
290
+
291
+ _number_to_name_map = {
292
+ 0x20001: "r0",
293
+ 0x21001: "r1",
294
+ 0x22001: "r2",
295
+ 0x23001: "r3",
296
+ 0x24001: "r4",
297
+ 0x25001: "r5",
298
+ 0x26001: "r6",
299
+ 0x27001: "r7",
300
+ 0x28001: "r8",
301
+ 0x29001: "r9",
302
+ 0x2A001: "r10",
303
+ 0x2B001: "r11",
304
+ 0x2C001: "r12",
305
+ 0x2D001: "sp",
306
+ 0x2E001: "lr",
307
+ 0x2F001: "pc",
308
+ }
309
+
310
+ def __init__(self, id=None):
311
+ super(GeneralPurposeRegister, self).__init__()
312
+ if id is None:
313
+ from nervapy.arm.function import active_function
314
+
315
+ self.number = active_function.allocate_general_purpose_register()
316
+ self.type = Register.GPType
317
+ self.size = 4
318
+ elif isinstance(id, int):
319
+ self.number = id
320
+ self.type = Register.GPType
321
+ self.size = 4
322
+ elif isinstance(id, str):
323
+ if id in GeneralPurposeRegister._name_to_number_map:
324
+ self.number = GeneralPurposeRegister._name_to_number_map[id]
325
+ self.type = Register.GPType
326
+ self.size = 4
327
+ else:
328
+ raise ValueError("Unknown register name: {0}".format(id))
329
+ elif isinstance(id, GeneralPurposeRegister):
330
+ self.number = id.number
331
+ self.type = id.type
332
+ self.size = id.size
333
+ else:
334
+ raise TypeError("Invalid register id")
335
+
336
+ def get_physical_number(self):
337
+ return {
338
+ 0x20001: 0,
339
+ 0x21001: 1,
340
+ 0x22001: 2,
341
+ 0x23001: 3,
342
+ 0x24001: 4,
343
+ 0x25001: 5,
344
+ 0x26001: 6,
345
+ 0x27001: 7,
346
+ 0x28001: 8,
347
+ 0x29001: 9,
348
+ 0x2A001: 10,
349
+ 0x2B001: 11,
350
+ 0x2C001: 12,
351
+ 0x2D001: 13,
352
+ 0x2E001: 14,
353
+ 0x2F001: 15,
354
+ }[self.number]
355
+
356
+ @staticmethod
357
+ def is_compatible_bitboard(bitboard):
358
+ return bitboard in {
359
+ 0x0001,
360
+ 0x0002,
361
+ 0x0004,
362
+ 0x0008,
363
+ 0x0010,
364
+ 0x0020,
365
+ 0x0040,
366
+ 0x0080,
367
+ 0x0100,
368
+ 0x0200,
369
+ 0x0400,
370
+ 0x0800,
371
+ 0x1000,
372
+ 0x2000,
373
+ 0x4000,
374
+ 0x8000,
375
+ }
376
+
377
+ def __str__(self):
378
+ if self.is_virtual:
379
+ return "gp-vreg<{0}>".format((self.number - 0x40000) >> 12)
380
+ else:
381
+ return GeneralPurposeRegister._number_to_name_map[self.number]
382
+
383
+ def __neg__(self):
384
+ return NegatedGeneralPurposeRegister(self)
385
+
386
+ def wb(self):
387
+ return GeneralPurposeRegisterWriteback(self)
388
+
389
+ def LSL(self, shift):
390
+ return ShiftedGeneralPurposeRegister(self, "LSL", shift)
391
+
392
+ def LSR(self, shift):
393
+ return ShiftedGeneralPurposeRegister(self, "LSR", shift)
394
+
395
+ def ASR(self, shift):
396
+ return ShiftedGeneralPurposeRegister(self, "ASR", shift)
397
+
398
+ def ROR(self, shift):
399
+ return ShiftedGeneralPurposeRegister(self, "ROR", shift)
400
+
401
+ def RRX(self):
402
+ return ShiftedGeneralPurposeRegister(self, "RRX")
403
+
404
+
405
+ r0 = GeneralPurposeRegister("r0")
406
+ r1 = GeneralPurposeRegister("r1")
407
+ r2 = GeneralPurposeRegister("r2")
408
+ r3 = GeneralPurposeRegister("r3")
409
+ r4 = GeneralPurposeRegister("r4")
410
+ r5 = GeneralPurposeRegister("r5")
411
+ r6 = GeneralPurposeRegister("r6")
412
+ r7 = GeneralPurposeRegister("r7")
413
+ r8 = GeneralPurposeRegister("r8")
414
+ r9 = GeneralPurposeRegister("r9")
415
+ r10 = GeneralPurposeRegister("r10")
416
+ r11 = GeneralPurposeRegister("r11")
417
+ r12 = GeneralPurposeRegister("r12")
418
+ sp = GeneralPurposeRegister("sp")
419
+ lr = GeneralPurposeRegister("lr")
420
+ pc = GeneralPurposeRegister("pc")
421
+
422
+
423
+ class GeneralPurposeRegisterWriteback(GeneralPurposeRegister):
424
+ def __init__(self, register):
425
+ if isinstance(register, GeneralPurposeRegister):
426
+ super(GeneralPurposeRegisterWriteback, self).__init__(register)
427
+ self.register = register
428
+ else:
429
+ raise TypeError(
430
+ "Register parameter is not an instance of GeneralPurposeRegister"
431
+ )
432
+
433
+ def __str__(self):
434
+ return str(self.register) + "!"
435
+
436
+
437
+ class NegatedGeneralPurposeRegister:
438
+ def __init__(self, register):
439
+ if isinstance(register, GeneralPurposeRegister):
440
+ self.register = register
441
+ else:
442
+ raise TypeError(
443
+ "Register parameter is not an instance of GeneralPurposeRegister"
444
+ )
445
+
446
+ def __str__(self):
447
+ return "-" + str(self.register)
448
+
449
+
450
+ class ShiftedGeneralPurposeRegister:
451
+ def __init__(self, register, kind, shift=None):
452
+ if isinstance(register, GeneralPurposeRegister):
453
+ self.register = register
454
+ if kind in {"LSR", "ASR"}:
455
+ if 1 <= shift <= 32:
456
+ self.shift = int(shift)
457
+ self.type = kind
458
+ else:
459
+ raise ValueError("Shift is beyond the allowed range (1 to 32)")
460
+ elif kind in {"LSL", "ROR"}:
461
+ if 1 <= shift <= 31:
462
+ self.shift = int(shift)
463
+ self.type = kind
464
+ else:
465
+ raise ValueError("Shift is beyond the allowed range (1 to 31)")
466
+ elif kind == "RRX":
467
+ if shift is None:
468
+ self.shift = shift
469
+ self.type = kind
470
+ else:
471
+ raise ValueError(
472
+ "Shift parameter is not allowed for RRX modificator"
473
+ )
474
+ else:
475
+ raise ValueError("Illegal shift kind %s" % kind)
476
+ else:
477
+ raise TypeError("Register parameter must be a general-purpose register")
478
+
479
+ def __str__(self):
480
+ if self.type != "RRX":
481
+ return str(self.register) + ", " + self.type + " #" + str(self.shift)
482
+ else:
483
+ return str(self.register) + ", " + self.type
484
+
485
+
486
+ class WMMXRegister(Register):
487
+ _name_to_number_map = {
488
+ "wr0": 0x10002,
489
+ "wr1": 0x11002,
490
+ "wr2": 0x12002,
491
+ "wr3": 0x13002,
492
+ "wr4": 0x14002,
493
+ "wr5": 0x15002,
494
+ "wr6": 0x16002,
495
+ "wr7": 0x17002,
496
+ "wr8": 0x18002,
497
+ "wr9": 0x19002,
498
+ "wr10": 0x1A002,
499
+ "wr11": 0x1B002,
500
+ "wr12": 0x1C002,
501
+ "wr13": 0x1D002,
502
+ "wr14": 0x1E002,
503
+ "wr15": 0x1F002,
504
+ }
505
+
506
+ _number_to_name_map = {
507
+ 0x10002: "wr0",
508
+ 0x11002: "wr1",
509
+ 0x12002: "wr2",
510
+ 0x13002: "wr3",
511
+ 0x14002: "wr4",
512
+ 0x15002: "wr5",
513
+ 0x16002: "wr6",
514
+ 0x17002: "wr7",
515
+ 0x18002: "wr8",
516
+ 0x19002: "wr9",
517
+ 0x1A002: "wr10",
518
+ 0x1B002: "wr11",
519
+ 0x1C002: "wr12",
520
+ 0x1D002: "wr13",
521
+ 0x1E002: "wr14",
522
+ 0x1F002: "wr15",
523
+ }
524
+
525
+ def __init__(self, id=None):
526
+ super(WMMXRegister, self).__init__()
527
+ if id is None:
528
+ from nervapy.arm.function import active_function
529
+
530
+ self.number = active_function.allocate_wmmx_register()
531
+ self.regtype = Register.WMMXType
532
+ self.size = 8
533
+ elif isinstance(id, int):
534
+ self.number = id
535
+ self.regtype = Register.WMMXType
536
+ self.size = 8
537
+ elif isinstance(id, str):
538
+ if id in WMMXRegister._name_to_number_map:
539
+ self.number = WMMXRegister._name_to_number_map[id]
540
+ self.regtype = Register.WMMXType
541
+ self.size = 8
542
+ else:
543
+ raise ValueError("Unknown register name: {0}".format(id))
544
+ elif isinstance(id, WMMXRegister):
545
+ self.number = id.number
546
+ self.regtype = id.regtype
547
+ self.size = id.size
548
+ else:
549
+ raise TypeError(
550
+ "Register id is neither a name of an architectural mmx register, nor an id of a virtual register"
551
+ )
552
+
553
+ @staticmethod
554
+ def is_compatible_bitboard(bitboard):
555
+ return bitboard in {
556
+ 0x0001,
557
+ 0x0002,
558
+ 0x0004,
559
+ 0x0008,
560
+ 0x0010,
561
+ 0x0020,
562
+ 0x0040,
563
+ 0x0080,
564
+ 0x0100,
565
+ 0x0200,
566
+ 0x0400,
567
+ 0x0800,
568
+ 0x1000,
569
+ 0x2000,
570
+ 0x4000,
571
+ 0x8000,
572
+ }
573
+
574
+ def __str__(self):
575
+ if self.is_virtual:
576
+ return "wmmx-vreg<{0}>".format((self.number - 0x40000) >> 12)
577
+ else:
578
+ return WMMXRegister._number_to_name_map[self.number]
579
+
580
+
581
+ wr0 = WMMXRegister("wr0")
582
+ wr1 = WMMXRegister("wr1")
583
+ wr2 = WMMXRegister("wr2")
584
+ wr3 = WMMXRegister("wr3")
585
+ wr4 = WMMXRegister("wr4")
586
+ wr5 = WMMXRegister("wr5")
587
+ wr6 = WMMXRegister("wr6")
588
+ wr7 = WMMXRegister("wr7")
589
+ wr8 = WMMXRegister("wr8")
590
+ wr9 = WMMXRegister("wr9")
591
+ wr10 = WMMXRegister("wr10")
592
+ wr11 = WMMXRegister("wr11")
593
+ wr12 = WMMXRegister("wr12")
594
+ wr13 = WMMXRegister("wr13")
595
+ wr14 = WMMXRegister("wr14")
596
+ wr15 = WMMXRegister("wr15")
597
+
598
+
599
+ class SRegister(Register):
600
+ _name_to_number_map = {
601
+ "s0": 0x00010,
602
+ "s1": 0x00020,
603
+ "s2": 0x00040,
604
+ "s3": 0x00080,
605
+ "s4": 0x01010,
606
+ "s5": 0x01020,
607
+ "s6": 0x01040,
608
+ "s7": 0x01080,
609
+ "s8": 0x02010,
610
+ "s9": 0x02020,
611
+ "s10": 0x02040,
612
+ "s11": 0x02080,
613
+ "s12": 0x03010,
614
+ "s13": 0x03020,
615
+ "s14": 0x03040,
616
+ "s15": 0x03080,
617
+ "s16": 0x04010,
618
+ "s17": 0x04020,
619
+ "s18": 0x04040,
620
+ "s19": 0x04080,
621
+ "s20": 0x05010,
622
+ "s21": 0x05020,
623
+ "s22": 0x05040,
624
+ "s23": 0x05080,
625
+ "s24": 0x06010,
626
+ "s25": 0x06020,
627
+ "s26": 0x06040,
628
+ "s27": 0x06080,
629
+ "s28": 0x07010,
630
+ "s29": 0x07020,
631
+ "s30": 0x07040,
632
+ "s31": 0x07080,
633
+ }
634
+
635
+ _number_to_name_map = {
636
+ 0x00010: "s0",
637
+ 0x00020: "s1",
638
+ 0x00040: "s2",
639
+ 0x00080: "s3",
640
+ 0x01010: "s4",
641
+ 0x01020: "s5",
642
+ 0x01040: "s6",
643
+ 0x01080: "s7",
644
+ 0x02010: "s8",
645
+ 0x02020: "s9",
646
+ 0x02040: "s10",
647
+ 0x02080: "s11",
648
+ 0x03010: "s12",
649
+ 0x03020: "s13",
650
+ 0x03040: "s14",
651
+ 0x03080: "s15",
652
+ 0x04010: "s16",
653
+ 0x04020: "s17",
654
+ 0x04040: "s18",
655
+ 0x04080: "s19",
656
+ 0x05010: "s20",
657
+ 0x05020: "s21",
658
+ 0x05040: "s22",
659
+ 0x05080: "s23",
660
+ 0x06010: "s24",
661
+ 0x06020: "s25",
662
+ 0x06040: "s26",
663
+ 0x06080: "s27",
664
+ 0x07010: "s28",
665
+ 0x07020: "s29",
666
+ 0x07040: "s30",
667
+ 0x07080: "s31",
668
+ }
669
+
670
+ def __init__(self, id=None):
671
+ super(SRegister, self).__init__()
672
+ if id is None:
673
+ from nervapy.arm.function import active_function
674
+
675
+ self.number = active_function.allocate_s_register()
676
+ self.type = Register.VFPType
677
+ self.size = 4
678
+ elif isinstance(id, int):
679
+ self.number = id
680
+ self.type = Register.VFPType
681
+ self.size = 4
682
+ elif isinstance(id, str):
683
+ if id in SRegister._name_to_number_map:
684
+ self.number = SRegister._name_to_number_map[id]
685
+ self.type = Register.VFPType
686
+ self.size = 4
687
+ else:
688
+ raise ValueError("Unknown register name: {0}".format(id))
689
+ elif isinstance(id, SRegister):
690
+ self.number = id.number
691
+ self.type = id.type
692
+ self.size = id.size
693
+ else:
694
+ raise TypeError(
695
+ "Register id is neither a name of an architectural S register, nor an id of a virtual register"
696
+ )
697
+
698
+ def get_physical_number(self):
699
+ assert not self.is_virtual
700
+ return {
701
+ 0x00010: 0,
702
+ 0x00020: 1,
703
+ 0x00040: 2,
704
+ 0x00080: 3,
705
+ 0x01010: 4,
706
+ 0x01020: 5,
707
+ 0x01040: 6,
708
+ 0x01080: 7,
709
+ 0x02010: 8,
710
+ 0x02020: 9,
711
+ 0x02040: 10,
712
+ 0x02080: 11,
713
+ 0x03010: 12,
714
+ 0x03020: 13,
715
+ 0x03040: 14,
716
+ 0x03080: 15,
717
+ 0x04010: 16,
718
+ 0x04020: 17,
719
+ 0x04040: 18,
720
+ 0x04080: 19,
721
+ 0x05010: 20,
722
+ 0x05020: 21,
723
+ 0x05040: 22,
724
+ 0x05080: 23,
725
+ 0x06010: 24,
726
+ 0x06020: 25,
727
+ 0x06040: 26,
728
+ 0x06080: 27,
729
+ 0x07010: 28,
730
+ 0x07020: 29,
731
+ 0x07040: 30,
732
+ 0x07080: 31,
733
+ }[self.number]
734
+
735
+ def is_compatible_bitboard(self, bitboard):
736
+ if self.mask == 0x400:
737
+ return bitboard in {
738
+ 0x00000001,
739
+ 0x00000002,
740
+ 0x00000004,
741
+ 0x00000008,
742
+ 0x00000010,
743
+ 0x00000020,
744
+ 0x00000040,
745
+ 0x00000080,
746
+ 0x00000100,
747
+ 0x00000200,
748
+ 0x00000400,
749
+ 0x00000800,
750
+ 0x00001000,
751
+ 0x00002000,
752
+ 0x00004000,
753
+ 0x00008000,
754
+ 0x00010000,
755
+ 0x00020000,
756
+ 0x00040000,
757
+ 0x00080000,
758
+ 0x00100000,
759
+ 0x00200000,
760
+ 0x00400000,
761
+ 0x00800000,
762
+ 0x01000000,
763
+ 0x02000000,
764
+ 0x04000000,
765
+ 0x08000000,
766
+ 0x10000000,
767
+ 0x20000000,
768
+ 0x40000000,
769
+ 0x80000000,
770
+ }
771
+ elif self.mask == 0x200:
772
+ return bitboard in {
773
+ 0x00000002,
774
+ 0x00000008,
775
+ 0x00000020,
776
+ 0x00000080,
777
+ 0x00000200,
778
+ 0x00000800,
779
+ 0x00002000,
780
+ 0x00008000,
781
+ 0x00020000,
782
+ 0x00080000,
783
+ 0x00200000,
784
+ 0x00800000,
785
+ 0x02000000,
786
+ 0x08000000,
787
+ 0x20000000,
788
+ 0x80000000,
789
+ }
790
+ elif self.mask == 0x100:
791
+ return bitboard in {
792
+ 0x00000001,
793
+ 0x00000004,
794
+ 0x00000010,
795
+ 0x00000040,
796
+ 0x00000100,
797
+ 0x00000400,
798
+ 0x00001000,
799
+ 0x00004000,
800
+ 0x00010000,
801
+ 0x00040000,
802
+ 0x00100000,
803
+ 0x00400000,
804
+ 0x01000000,
805
+ 0x04000000,
806
+ 0x10000000,
807
+ 0x40000000,
808
+ }
809
+ elif self.mask == 0x080:
810
+ return bitboard in {
811
+ 0x00000008,
812
+ 0x00000080,
813
+ 0x00000800,
814
+ 0x00008000,
815
+ 0x00080000,
816
+ 0x00800000,
817
+ 0x08000000,
818
+ 0x80000000,
819
+ }
820
+ elif self.mask == 0x040:
821
+ return bitboard in {
822
+ 0x00000004,
823
+ 0x00000040,
824
+ 0x00000400,
825
+ 0x00004000,
826
+ 0x00040000,
827
+ 0x00400000,
828
+ 0x04000000,
829
+ 0x40000000,
830
+ }
831
+ elif self.mask == 0x020:
832
+ return bitboard in {
833
+ 0x00000002,
834
+ 0x00000020,
835
+ 0x00000200,
836
+ 0x00002000,
837
+ 0x00020000,
838
+ 0x00200000,
839
+ 0x02000000,
840
+ 0x20000000,
841
+ }
842
+ elif self.mask == 0x010:
843
+ return bitboard in {
844
+ 0x00000001,
845
+ 0x00000010,
846
+ 0x00000100,
847
+ 0x00001000,
848
+ 0x00010000,
849
+ 0x00100000,
850
+ 0x01000000,
851
+ 0x10000000,
852
+ }
853
+ else:
854
+ assert False
855
+
856
+ def __str__(self):
857
+ if self.is_virtual:
858
+ return "s-vreg<{0}>".format((self.number - 0x40000) >> 12)
859
+ else:
860
+ return SRegister._number_to_name_map[self.number]
861
+
862
+ @property
863
+ def parent(self):
864
+ mask = self.mask
865
+ parent_mask = {
866
+ 0x400: None,
867
+ 0x200: 0x300,
868
+ 0x100: 0x300,
869
+ 0x080: 0x0C0,
870
+ 0x040: 0x0C0,
871
+ 0x020: 0x030,
872
+ 0x010: 0x030,
873
+ }[mask]
874
+ if parent_mask:
875
+ return DRegister(self.number | parent_mask)
876
+
877
+
878
+ s0 = SRegister("s0")
879
+ s1 = SRegister("s1")
880
+ s2 = SRegister("s2")
881
+ s3 = SRegister("s3")
882
+ s4 = SRegister("s4")
883
+ s5 = SRegister("s5")
884
+ s6 = SRegister("s6")
885
+ s7 = SRegister("s7")
886
+ s8 = SRegister("s8")
887
+ s9 = SRegister("s9")
888
+ s10 = SRegister("s10")
889
+ s11 = SRegister("s11")
890
+ s12 = SRegister("s12")
891
+ s13 = SRegister("s13")
892
+ s14 = SRegister("s14")
893
+ s15 = SRegister("s15")
894
+ s16 = SRegister("s16")
895
+ s17 = SRegister("s17")
896
+ s18 = SRegister("s18")
897
+ s19 = SRegister("s19")
898
+ s20 = SRegister("s20")
899
+ s21 = SRegister("s21")
900
+ s22 = SRegister("s22")
901
+ s23 = SRegister("s23")
902
+ s24 = SRegister("s24")
903
+ s25 = SRegister("s25")
904
+ s26 = SRegister("s26")
905
+ s27 = SRegister("s27")
906
+ s28 = SRegister("s28")
907
+ s29 = SRegister("s29")
908
+ s30 = SRegister("s30")
909
+ s31 = SRegister("s31")
910
+
911
+
912
+ class DRegister(Register):
913
+ _name_to_number_map = {
914
+ "d0": 0x00030,
915
+ "d1": 0x000C0,
916
+ "d2": 0x01030,
917
+ "d3": 0x010C0,
918
+ "d4": 0x02030,
919
+ "d5": 0x020C0,
920
+ "d6": 0x03030,
921
+ "d7": 0x030C0,
922
+ "d8": 0x04030,
923
+ "d9": 0x040C0,
924
+ "d10": 0x05030,
925
+ "d11": 0x050C0,
926
+ "d12": 0x06030,
927
+ "d13": 0x060C0,
928
+ "d14": 0x07030,
929
+ "d15": 0x070C0,
930
+ "d16": 0x08030,
931
+ "d17": 0x080C0,
932
+ "d18": 0x09030,
933
+ "d19": 0x090C0,
934
+ "d20": 0x0A030,
935
+ "d21": 0x0A0C0,
936
+ "d22": 0x0B030,
937
+ "d23": 0x0B0C0,
938
+ "d24": 0x0C030,
939
+ "d25": 0x0C0C0,
940
+ "d26": 0x0D030,
941
+ "d27": 0x0D0C0,
942
+ "d28": 0x0E030,
943
+ "d29": 0x0E0C0,
944
+ "d30": 0x0F030,
945
+ "d31": 0x0F0C0,
946
+ }
947
+
948
+ _number_to_name_map = {
949
+ 0x00030: "d0",
950
+ 0x000C0: "d1",
951
+ 0x01030: "d2",
952
+ 0x010C0: "d3",
953
+ 0x02030: "d4",
954
+ 0x020C0: "d5",
955
+ 0x03030: "d6",
956
+ 0x030C0: "d7",
957
+ 0x04030: "d8",
958
+ 0x040C0: "d9",
959
+ 0x05030: "d10",
960
+ 0x050C0: "d11",
961
+ 0x06030: "d12",
962
+ 0x060C0: "d13",
963
+ 0x07030: "d14",
964
+ 0x070C0: "d15",
965
+ 0x08030: "d16",
966
+ 0x080C0: "d17",
967
+ 0x09030: "d18",
968
+ 0x090C0: "d19",
969
+ 0x0A030: "d20",
970
+ 0x0A0C0: "d21",
971
+ 0x0B030: "d22",
972
+ 0x0B0C0: "d23",
973
+ 0x0C030: "d24",
974
+ 0x0C0C0: "d25",
975
+ 0x0D030: "d26",
976
+ 0x0D0C0: "d27",
977
+ 0x0E030: "d28",
978
+ 0x0E0C0: "d29",
979
+ 0x0F030: "d30",
980
+ 0x0F0C0: "d31",
981
+ }
982
+
983
+ def __init__(self, id=None):
984
+ super(DRegister, self).__init__()
985
+ if id is None:
986
+ from nervapy.arm.function import active_function
987
+
988
+ self.number = active_function.allocate_d_register()
989
+ self.type = Register.VFPType
990
+ self.size = 8
991
+ elif isinstance(id, int):
992
+ self.number = id
993
+ self.type = Register.VFPType
994
+ self.size = 8
995
+ elif isinstance(id, str):
996
+ if id in DRegister._name_to_number_map:
997
+ self.number = DRegister._name_to_number_map[id]
998
+ self.type = Register.VFPType
999
+ self.size = 8
1000
+ else:
1001
+ raise ValueError("Unknown register name: {0}".format(id))
1002
+ elif isinstance(id, DRegister):
1003
+ self.number = id.number
1004
+ self.type = id.type
1005
+ self.size = id.size
1006
+ else:
1007
+ raise TypeError(
1008
+ "Register id is neither a name of an architectural D register, nor an id of a virtual register"
1009
+ )
1010
+
1011
+ def get_physical_number(self):
1012
+ assert not self.is_virtual
1013
+ return {
1014
+ 0x00030: 0,
1015
+ 0x000C0: 1,
1016
+ 0x01030: 2,
1017
+ 0x010C0: 3,
1018
+ 0x02030: 4,
1019
+ 0x020C0: 5,
1020
+ 0x03030: 6,
1021
+ 0x030C0: 7,
1022
+ 0x04030: 8,
1023
+ 0x040C0: 9,
1024
+ 0x05030: 10,
1025
+ 0x050C0: 11,
1026
+ 0x06030: 12,
1027
+ 0x060C0: 13,
1028
+ 0x07030: 14,
1029
+ 0x070C0: 15,
1030
+ 0x08030: 16,
1031
+ 0x080C0: 17,
1032
+ 0x09030: 18,
1033
+ 0x090C0: 19,
1034
+ 0x0A030: 20,
1035
+ 0x0A0C0: 21,
1036
+ 0x0B030: 22,
1037
+ 0x0B0C0: 23,
1038
+ 0x0C030: 24,
1039
+ 0x0C0C0: 25,
1040
+ 0x0D030: 26,
1041
+ 0x0D0C0: 27,
1042
+ 0x0E030: 28,
1043
+ 0x0E0C0: 29,
1044
+ 0x0F030: 30,
1045
+ 0x0F0C0: 31,
1046
+ }[self.number]
1047
+
1048
+ @property
1049
+ def is_extended(self):
1050
+ return self.number >= 0x08000
1051
+
1052
+ def is_compatible_bitboard(self, bitboard):
1053
+ if self.mask == 0x300:
1054
+ return bitboard in {
1055
+ 0x0000000000000003,
1056
+ 0x000000000000000C,
1057
+ 0x0000000000000030,
1058
+ 0x00000000000000C0,
1059
+ 0x0000000000000300,
1060
+ 0x0000000000000C00,
1061
+ 0x0000000000003000,
1062
+ 0x000000000000C000,
1063
+ 0x0000000000030000,
1064
+ 0x00000000000C0000,
1065
+ 0x0000000000300000,
1066
+ 0x0000000000C00000,
1067
+ 0x0000000003000000,
1068
+ 0x000000000C000000,
1069
+ 0x0000000030000000,
1070
+ 0x00000000C0000000,
1071
+ 0x0000000300000000,
1072
+ 0x0000000C00000000,
1073
+ 0x0000003000000000,
1074
+ 0x000000C000000000,
1075
+ 0x0000030000000000,
1076
+ 0x00000C0000000000,
1077
+ 0x0000300000000000,
1078
+ 0x0000C00000000000,
1079
+ 0x0003000000000000,
1080
+ 0x000C000000000000,
1081
+ 0x0030000000000000,
1082
+ 0x00C0000000000000,
1083
+ 0x0300000000000000,
1084
+ 0x0C00000000000000,
1085
+ 0x3000000000000000,
1086
+ 0xC000000000000000,
1087
+ }
1088
+ elif self.mask == 0x0C0:
1089
+ return bitboard in {
1090
+ 0x000000000000000C,
1091
+ 0x00000000000000C0,
1092
+ 0x0000000000000C00,
1093
+ 0x000000000000C000,
1094
+ 0x00000000000C0000,
1095
+ 0x0000000000C00000,
1096
+ 0x000000000C000000,
1097
+ 0x00000000C0000000,
1098
+ 0x0000000C00000000,
1099
+ 0x000000C000000000,
1100
+ 0x00000C0000000000,
1101
+ 0x0000C00000000000,
1102
+ 0x000C000000000000,
1103
+ 0x00C0000000000000,
1104
+ 0x0C00000000000000,
1105
+ 0xC000000000000000,
1106
+ }
1107
+ elif self.mask == 0x030:
1108
+ return bitboard in {
1109
+ 0x0000000000000003,
1110
+ 0x0000000000000030,
1111
+ 0x0000000000000300,
1112
+ 0x0000000000003000,
1113
+ 0x0000000000030000,
1114
+ 0x0000000000300000,
1115
+ 0x0000000003000000,
1116
+ 0x0000000030000000,
1117
+ 0x0000000300000000,
1118
+ 0x0000003000000000,
1119
+ 0x0000030000000000,
1120
+ 0x0000300000000000,
1121
+ 0x0003000000000000,
1122
+ 0x0030000000000000,
1123
+ 0x0300000000000000,
1124
+ 0x3000000000000000,
1125
+ }
1126
+ else:
1127
+ assert False
1128
+
1129
+ def __str__(self):
1130
+ if self.is_virtual:
1131
+ return "d-vreg<{0}>".format((self.number - 0x40000) >> 12)
1132
+ else:
1133
+ return DRegister._number_to_name_map[self.number]
1134
+
1135
+ def __getitem__(self, key):
1136
+ if (
1137
+ isinstance(key, slice)
1138
+ and key.start is None
1139
+ and key.stop is None
1140
+ and key.step is None
1141
+ ):
1142
+ return DRegisterLanes(self)
1143
+ else:
1144
+ raise ValueError("Illegal subscript value %s" % key)
1145
+
1146
+ @property
1147
+ def parent(self):
1148
+ if self.mask != 0x300:
1149
+ return QRegister(self.number | 0x0F0)
1150
+
1151
+ @property
1152
+ def low_part(self):
1153
+ if (self.number & ~0xFFF) == 0x300:
1154
+ return SRegister((self.number & ~0xFFF) | 0x100)
1155
+ elif (self.number & ~0xFFF) == 0x0C0:
1156
+ return SRegister((self.number & ~0xFFF) | 0x040)
1157
+ else:
1158
+ return SRegister((self.number & ~0xFFF) | 0x010)
1159
+
1160
+ @property
1161
+ def high_part(self):
1162
+ if (self.number & ~0xFFF) == 0x300:
1163
+ return SRegister((self.number & ~0xFFF) | 0x200)
1164
+ elif (self.number & ~0xFFF) == 0x0C0:
1165
+ return SRegister((self.number & ~0xFFF) | 0x080)
1166
+ else:
1167
+ return SRegister((self.number & ~0xFFF) | 0x020)
1168
+
1169
+
1170
+ d0 = DRegister("d0")
1171
+ d1 = DRegister("d1")
1172
+ d2 = DRegister("d2")
1173
+ d3 = DRegister("d3")
1174
+ d4 = DRegister("d4")
1175
+ d5 = DRegister("d5")
1176
+ d6 = DRegister("d6")
1177
+ d7 = DRegister("d7")
1178
+ d8 = DRegister("d8")
1179
+ d9 = DRegister("d9")
1180
+ d10 = DRegister("d10")
1181
+ d11 = DRegister("d11")
1182
+ d12 = DRegister("d12")
1183
+ d13 = DRegister("d13")
1184
+ d14 = DRegister("d14")
1185
+ d15 = DRegister("d15")
1186
+ d16 = DRegister("d16")
1187
+ d17 = DRegister("d17")
1188
+ d18 = DRegister("d18")
1189
+ d19 = DRegister("d19")
1190
+ d20 = DRegister("d20")
1191
+ d21 = DRegister("d21")
1192
+ d22 = DRegister("d22")
1193
+ d23 = DRegister("d23")
1194
+ d24 = DRegister("d24")
1195
+ d25 = DRegister("d25")
1196
+ d26 = DRegister("d26")
1197
+ d27 = DRegister("d27")
1198
+ d28 = DRegister("d28")
1199
+ d29 = DRegister("d29")
1200
+ d30 = DRegister("d30")
1201
+ d31 = DRegister("d31")
1202
+
1203
+
1204
+ class DRegisterLanes:
1205
+ def __init__(self, register):
1206
+ if isinstance(register, DRegister):
1207
+ self.register = register
1208
+ else:
1209
+ raise TypeError("Register parameter is not an instance of DRegister")
1210
+
1211
+ def __str__(self):
1212
+ return str(self.register) + "[]"
1213
+
1214
+
1215
+ class QRegister(Register):
1216
+ name_to_number_map = {
1217
+ "q0": 0x000F0,
1218
+ "q1": 0x010F0,
1219
+ "q2": 0x020F0,
1220
+ "q3": 0x030F0,
1221
+ "q4": 0x040F0,
1222
+ "q5": 0x050F0,
1223
+ "q6": 0x060F0,
1224
+ "q7": 0x070F0,
1225
+ "q8": 0x080F0,
1226
+ "q9": 0x090F0,
1227
+ "q10": 0x0A0F0,
1228
+ "q11": 0x0B0F0,
1229
+ "q12": 0x0C0F0,
1230
+ "q13": 0x0D0F0,
1231
+ "q14": 0x0E0F0,
1232
+ "q15": 0x0F0F0,
1233
+ }
1234
+
1235
+ number_to_name_map = {
1236
+ 0x000F0: "q0",
1237
+ 0x010F0: "q1",
1238
+ 0x020F0: "q2",
1239
+ 0x030F0: "q3",
1240
+ 0x040F0: "q4",
1241
+ 0x050F0: "q5",
1242
+ 0x060F0: "q6",
1243
+ 0x070F0: "q7",
1244
+ 0x080F0: "q8",
1245
+ 0x090F0: "q9",
1246
+ 0x0A0F0: "q10",
1247
+ 0x0B0F0: "q11",
1248
+ 0x0C0F0: "q12",
1249
+ 0x0D0F0: "q13",
1250
+ 0x0E0F0: "q14",
1251
+ 0x0F0F0: "q15",
1252
+ }
1253
+
1254
+ def __init__(self, id=None):
1255
+ super(QRegister, self).__init__()
1256
+ if id is None:
1257
+ from nervapy.arm.function import active_function
1258
+
1259
+ self.number = active_function.allocate_q_register()
1260
+ self.type = Register.VFPType
1261
+ self.size = 16
1262
+ elif isinstance(id, int):
1263
+ self.number = id
1264
+ self.type = Register.VFPType
1265
+ self.size = 16
1266
+ elif isinstance(id, str):
1267
+ if id in QRegister.name_to_number_map:
1268
+ self.number = QRegister.name_to_number_map[id]
1269
+ self.type = Register.VFPType
1270
+ self.size = 16
1271
+ else:
1272
+ raise ValueError("Unknown register name: {0}".format(id))
1273
+ elif isinstance(id, QRegister):
1274
+ self.number = id.number
1275
+ self.type = id.type
1276
+ self.size = id.size
1277
+ else:
1278
+ raise TypeError(
1279
+ "Register id is neither a name of an architectural Q register, nor an id of a virtual register"
1280
+ )
1281
+
1282
+ def get_physical_number(self):
1283
+ assert not self.is_virtual
1284
+ return {
1285
+ 0x000F0: 0,
1286
+ 0x010F0: 1,
1287
+ 0x020F0: 2,
1288
+ 0x030F0: 3,
1289
+ 0x040F0: 4,
1290
+ 0x050F0: 5,
1291
+ 0x060F0: 6,
1292
+ 0x070F0: 7,
1293
+ 0x080F0: 8,
1294
+ 0x090F0: 9,
1295
+ 0x0A0F0: 10,
1296
+ 0x0B0F0: 11,
1297
+ 0x0C0F0: 12,
1298
+ 0x0D0F0: 13,
1299
+ 0x0E0F0: 14,
1300
+ 0x0F0F0: 15,
1301
+ }[self.number]
1302
+
1303
+ def is_compatible_bitboard(self, bitboard):
1304
+ if self.mask == 0x0F0:
1305
+ return bitboard in {
1306
+ 0x000000000000000F,
1307
+ 0x00000000000000F0,
1308
+ 0x0000000000000F00,
1309
+ 0x000000000000F000,
1310
+ 0x00000000000F0000,
1311
+ 0x0000000000F00000,
1312
+ 0x000000000F000000,
1313
+ 0x00000000F0000000,
1314
+ 0x0000000F00000000,
1315
+ 0x000000F000000000,
1316
+ 0x00000F0000000000,
1317
+ 0x0000F00000000000,
1318
+ 0x000F000000000000,
1319
+ 0x00F0000000000000,
1320
+ 0x0F00000000000000,
1321
+ 0xF000000000000000,
1322
+ }
1323
+ else:
1324
+ assert False
1325
+
1326
+ @property
1327
+ def is_extended(self):
1328
+ return self.number >= 0x08000
1329
+
1330
+ def __str__(self):
1331
+ if self.is_virtual:
1332
+ return "q-vreg<{0}>".format((self.number - 0x40000) >> 12)
1333
+ else:
1334
+ return QRegister.number_to_name_map[self.number]
1335
+
1336
+ @property
1337
+ def low_part(self):
1338
+ return DRegister((self.number & ~0xFFF) | 0x030)
1339
+
1340
+ @property
1341
+ def high_part(self):
1342
+ return DRegister((self.number & ~0xFFF) | 0x0C0)
1343
+
1344
+
1345
+ q0 = QRegister("q0")
1346
+ q1 = QRegister("q1")
1347
+ q2 = QRegister("q2")
1348
+ q3 = QRegister("q3")
1349
+ q4 = QRegister("q4")
1350
+ q5 = QRegister("q5")
1351
+ q6 = QRegister("q6")
1352
+ q7 = QRegister("q7")
1353
+ q8 = QRegister("q8")
1354
+ q9 = QRegister("q9")
1355
+ q10 = QRegister("q10")
1356
+ q11 = QRegister("q11")
1357
+ q12 = QRegister("q12")
1358
+ q13 = QRegister("q13")
1359
+ q14 = QRegister("q14")
1360
+ q15 = QRegister("q15")
1361
+
1362
+
1363
+ class PRegister(Register):
1364
+ """MVE/Helium Predicate Register (P0-P7)"""
1365
+ MVEPredicateType = 4
1366
+
1367
+ _name_to_number_map = {
1368
+ "p0": 0x30001,
1369
+ "p1": 0x31001,
1370
+ "p2": 0x32001,
1371
+ "p3": 0x33001,
1372
+ "p4": 0x34001,
1373
+ "p5": 0x35001,
1374
+ "p6": 0x36001,
1375
+ "p7": 0x37001,
1376
+ }
1377
+
1378
+ _number_to_name_map = {
1379
+ 0x30001: "p0",
1380
+ 0x31001: "p1",
1381
+ 0x32001: "p2",
1382
+ 0x33001: "p3",
1383
+ 0x34001: "p4",
1384
+ 0x35001: "p5",
1385
+ 0x36001: "p6",
1386
+ 0x37001: "p7",
1387
+ }
1388
+
1389
+ def __init__(self, id=None):
1390
+ super(PRegister, self).__init__()
1391
+ if id is None:
1392
+ from nervapy.arm.function import active_function
1393
+
1394
+ self.number = active_function.allocate_p_register()
1395
+ self.type = PRegister.MVEPredicateType
1396
+ self.size = 2
1397
+ elif isinstance(id, int):
1398
+ self.number = id
1399
+ self.type = PRegister.MVEPredicateType
1400
+ self.size = 2
1401
+ elif isinstance(id, str):
1402
+ if id in PRegister._name_to_number_map:
1403
+ self.number = PRegister._name_to_number_map[id]
1404
+ self.type = PRegister.MVEPredicateType
1405
+ self.size = 2
1406
+ else:
1407
+ raise ValueError("Unknown register name: {0}".format(id))
1408
+ elif isinstance(id, PRegister):
1409
+ self.number = id.number
1410
+ self.type = id.type
1411
+ self.size = id.size
1412
+ else:
1413
+ raise TypeError("Invalid predicate register id")
1414
+
1415
+ def get_physical_number(self):
1416
+ return {
1417
+ 0x30001: 0,
1418
+ 0x31001: 1,
1419
+ 0x32001: 2,
1420
+ 0x33001: 3,
1421
+ 0x34001: 4,
1422
+ 0x35001: 5,
1423
+ 0x36001: 6,
1424
+ 0x37001: 7,
1425
+ }[self.number]
1426
+
1427
+ def __str__(self):
1428
+ if self.is_virtual:
1429
+ return "p-vreg<{0}>".format((self.number - 0x40000) >> 12)
1430
+ else:
1431
+ return PRegister._number_to_name_map[self.number]
1432
+
1433
+
1434
+ p0 = PRegister("p0")
1435
+ p1 = PRegister("p1")
1436
+ p2 = PRegister("p2")
1437
+ p3 = PRegister("p3")
1438
+ p4 = PRegister("p4")
1439
+ p5 = PRegister("p5")
1440
+ p6 = PRegister("p6")
1441
+ p7 = PRegister("p7")
1442
+
1443
+
1444
+ class VPRRegister(Register):
1445
+ """MVE/Helium Vector Predicate Register (VPR)"""
1446
+ MVEVectorPredicateType = 5
1447
+
1448
+ def __init__(self):
1449
+ super(VPRRegister, self).__init__()
1450
+ self.number = 0x40001
1451
+ self.type = VPRRegister.MVEVectorPredicateType
1452
+ self.size = 4
1453
+
1454
+ def __str__(self):
1455
+ return "vpr"
1456
+
1457
+
1458
+ vpr = VPRRegister()