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.
- nervapy/__init__.py +50 -0
- nervapy/abi.py +91 -0
- nervapy/arm/__init__.py +124 -0
- nervapy/arm/__main__.py +0 -0
- nervapy/arm/abi.py +138 -0
- nervapy/arm/formats.py +49 -0
- nervapy/arm/function.py +2465 -0
- nervapy/arm/generic.py +10796 -0
- nervapy/arm/instructions.py +519 -0
- nervapy/arm/isa.py +409 -0
- nervapy/arm/literal_pool.py +331 -0
- nervapy/arm/microarchitecture.py +211 -0
- nervapy/arm/pseudo.py +652 -0
- nervapy/arm/registers.py +1458 -0
- nervapy/arm/vfpneon.py +4092 -0
- nervapy/arm.py +13 -0
- nervapy/c/__init__.py +1 -0
- nervapy/c/types.py +436 -0
- nervapy/codegen.py +99 -0
- nervapy/common/__init__.py +4 -0
- nervapy/common/function.py +5 -0
- nervapy/common/regalloc.py +121 -0
- nervapy/constant_data.py +282 -0
- nervapy/encoder.py +246 -0
- nervapy/formats/__init__.py +2 -0
- nervapy/formats/elf/__init__.py +4 -0
- nervapy/formats/elf/file.py +178 -0
- nervapy/formats/elf/image.py +106 -0
- nervapy/formats/elf/section.py +422 -0
- nervapy/formats/elf/symbol.py +281 -0
- nervapy/formats/macho/__init__.py +2 -0
- nervapy/formats/macho/file.py +123 -0
- nervapy/formats/macho/image.py +143 -0
- nervapy/formats/macho/section.py +322 -0
- nervapy/formats/macho/symbol.py +158 -0
- nervapy/formats/mscoff/__init__.py +8 -0
- nervapy/formats/mscoff/image.py +132 -0
- nervapy/formats/mscoff/section.py +181 -0
- nervapy/formats/mscoff/symbol.py +148 -0
- nervapy/function.py +136 -0
- nervapy/literal.py +731 -0
- nervapy/loader.py +188 -0
- nervapy/name.py +159 -0
- nervapy/parse.py +52 -0
- nervapy/stream.py +58 -0
- nervapy/util.py +126 -0
- nervapy/writer.py +518 -0
- nervapy/x86_64/__init__.py +324 -0
- nervapy/x86_64/__main__.py +407 -0
- nervapy/x86_64/abi.py +517 -0
- nervapy/x86_64/amd.py +6464 -0
- nervapy/x86_64/avx.py +102029 -0
- nervapy/x86_64/crypto.py +1533 -0
- nervapy/x86_64/encoding.py +424 -0
- nervapy/x86_64/fma.py +19138 -0
- nervapy/x86_64/function.py +2707 -0
- nervapy/x86_64/generic.py +23384 -0
- nervapy/x86_64/instructions.py +500 -0
- nervapy/x86_64/isa.py +476 -0
- nervapy/x86_64/lower.py +126 -0
- nervapy/x86_64/mask.py +2593 -0
- nervapy/x86_64/meta.py +143 -0
- nervapy/x86_64/mmxsse.py +17265 -0
- nervapy/x86_64/nacl.py +327 -0
- nervapy/x86_64/operand.py +1204 -0
- nervapy/x86_64/options.py +21 -0
- nervapy/x86_64/pseudo.py +686 -0
- nervapy/x86_64/registers.py +1225 -0
- nervapy/x86_64/types.py +17 -0
- nervapy/x86_64/uarch.py +580 -0
- pynerva-0.0.7.dist-info/METADATA +310 -0
- pynerva-0.0.7.dist-info/RECORD +74 -0
- pynerva-0.0.7.dist-info/WHEEL +4 -0
- pynerva-0.0.7.dist-info/licenses/LICENSE.rst +15 -0
nervapy/arm/registers.py
ADDED
|
@@ -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()
|