PyNerva 0.0.5__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.
Potentially problematic release.
This version of PyNerva might be problematic. Click here for more details.
- 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 +2405 -0
- nervapy/arm/generic.py +10797 -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.5.dist-info/METADATA +310 -0
- pynerva-0.0.5.dist-info/RECORD +74 -0
- pynerva-0.0.5.dist-info/WHEEL +4 -0
- pynerva-0.0.5.dist-info/licenses/LICENSE.rst +15 -0
nervapy/x86_64/mask.py
ADDED
|
@@ -0,0 +1,2593 @@
|
|
|
1
|
+
# This file is auto-generated by /codegen/x86_64.py
|
|
2
|
+
# Instruction data is based on package opcodes 0.3.14
|
|
3
|
+
|
|
4
|
+
import inspect
|
|
5
|
+
|
|
6
|
+
import nervapy.stream
|
|
7
|
+
import nervapy.x86_64.isa
|
|
8
|
+
import nervapy.x86_64.options
|
|
9
|
+
from nervapy.util import is_sint8, is_sint32
|
|
10
|
+
from nervapy.x86_64.encoding import (evex, modrm_sib_disp, optional_rex, rex,
|
|
11
|
+
vex2, vex3)
|
|
12
|
+
from nervapy.x86_64.instructions import BranchInstruction, Instruction
|
|
13
|
+
from nervapy.x86_64.operand import (check_operand, format_operand_type, is_al,
|
|
14
|
+
is_ax, is_cl, is_eax, is_er, is_evex_vmx,
|
|
15
|
+
is_evex_vmy, is_evex_xmm, is_evex_ymm,
|
|
16
|
+
is_imm, is_imm4, is_imm8, is_imm16,
|
|
17
|
+
is_imm32, is_imm64, is_k, is_kk, is_label,
|
|
18
|
+
is_m, is_m8, is_m16, is_m16kz, is_m32,
|
|
19
|
+
is_m32k, is_m32kz, is_m64, is_m64_m32bcst,
|
|
20
|
+
is_m64k, is_m64kz, is_m80, is_m128,
|
|
21
|
+
is_m128_m32bcst, is_m128_m64bcst,
|
|
22
|
+
is_m128kz, is_m256, is_m256_m32bcst,
|
|
23
|
+
is_m256_m64bcst, is_m256kz, is_m512,
|
|
24
|
+
is_m512_m32bcst, is_m512_m64bcst,
|
|
25
|
+
is_m512kz, is_mm, is_r8, is_r8rex, is_r16,
|
|
26
|
+
is_r32, is_r64, is_rax, is_rel8, is_rel32,
|
|
27
|
+
is_sae, is_vmx, is_vmxk, is_vmy, is_vmyk,
|
|
28
|
+
is_vmz, is_vmzk, is_xmm, is_xmm0, is_xmmk,
|
|
29
|
+
is_xmmkz, is_ymm, is_ymmk, is_ymmkz,
|
|
30
|
+
is_zmm, is_zmmk, is_zmmkz)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class KADDB(Instruction):
|
|
34
|
+
"""ADD Two 8-bit Masks"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, *args, **kwargs):
|
|
37
|
+
"""Supported forms:
|
|
38
|
+
|
|
39
|
+
* KADDB(k, k, k) [AVX512DQ]
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
origin = kwargs.get("origin")
|
|
43
|
+
prototype = kwargs.get("prototype")
|
|
44
|
+
if (
|
|
45
|
+
origin is None
|
|
46
|
+
and prototype is None
|
|
47
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
48
|
+
):
|
|
49
|
+
origin = inspect.stack()
|
|
50
|
+
super(KADDB, self).__init__("KADDB", origin=origin, prototype=prototype)
|
|
51
|
+
self.operands = tuple(map(check_operand, args))
|
|
52
|
+
if len(self.operands) != 3:
|
|
53
|
+
raise SyntaxError('Instruction "KADDB" requires 3 operands')
|
|
54
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
55
|
+
self.encodings.append(
|
|
56
|
+
(
|
|
57
|
+
0x40,
|
|
58
|
+
lambda op, vex3=False: vex2(5, 0, None, op[1].hlcode, vex3)
|
|
59
|
+
+ bytearray([0x4A, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
self.in_regs = (False, True, True)
|
|
63
|
+
self.out_regs = (True, False, False)
|
|
64
|
+
self.out_operands = (True, False, False)
|
|
65
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
66
|
+
else:
|
|
67
|
+
raise SyntaxError(
|
|
68
|
+
"Invalid operand types: KADDB "
|
|
69
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
70
|
+
)
|
|
71
|
+
if nervapy.stream.active_stream is not None:
|
|
72
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class KADDW(Instruction):
|
|
76
|
+
"""ADD Two 16-bit Masks"""
|
|
77
|
+
|
|
78
|
+
def __init__(self, *args, **kwargs):
|
|
79
|
+
"""Supported forms:
|
|
80
|
+
|
|
81
|
+
* KADDW(k, k, k) [AVX512DQ]
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
origin = kwargs.get("origin")
|
|
85
|
+
prototype = kwargs.get("prototype")
|
|
86
|
+
if (
|
|
87
|
+
origin is None
|
|
88
|
+
and prototype is None
|
|
89
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
90
|
+
):
|
|
91
|
+
origin = inspect.stack()
|
|
92
|
+
super(KADDW, self).__init__("KADDW", origin=origin, prototype=prototype)
|
|
93
|
+
self.operands = tuple(map(check_operand, args))
|
|
94
|
+
if len(self.operands) != 3:
|
|
95
|
+
raise SyntaxError('Instruction "KADDW" requires 3 operands')
|
|
96
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
97
|
+
self.encodings.append(
|
|
98
|
+
(
|
|
99
|
+
0x40,
|
|
100
|
+
lambda op, vex3=False: vex2(4, 0, None, op[1].hlcode, vex3)
|
|
101
|
+
+ bytearray([0x4A, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
102
|
+
)
|
|
103
|
+
)
|
|
104
|
+
self.in_regs = (False, True, True)
|
|
105
|
+
self.out_regs = (True, False, False)
|
|
106
|
+
self.out_operands = (True, False, False)
|
|
107
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
108
|
+
else:
|
|
109
|
+
raise SyntaxError(
|
|
110
|
+
"Invalid operand types: KADDW "
|
|
111
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
112
|
+
)
|
|
113
|
+
if nervapy.stream.active_stream is not None:
|
|
114
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class KADDD(Instruction):
|
|
118
|
+
"""ADD Two 32-bit Masks"""
|
|
119
|
+
|
|
120
|
+
def __init__(self, *args, **kwargs):
|
|
121
|
+
"""Supported forms:
|
|
122
|
+
|
|
123
|
+
* KADDD(k, k, k) [AVX512BW]
|
|
124
|
+
"""
|
|
125
|
+
|
|
126
|
+
origin = kwargs.get("origin")
|
|
127
|
+
prototype = kwargs.get("prototype")
|
|
128
|
+
if (
|
|
129
|
+
origin is None
|
|
130
|
+
and prototype is None
|
|
131
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
132
|
+
):
|
|
133
|
+
origin = inspect.stack()
|
|
134
|
+
super(KADDD, self).__init__("KADDD", origin=origin, prototype=prototype)
|
|
135
|
+
self.operands = tuple(map(check_operand, args))
|
|
136
|
+
if len(self.operands) != 3:
|
|
137
|
+
raise SyntaxError('Instruction "KADDD" requires 3 operands')
|
|
138
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
139
|
+
self.encodings.append(
|
|
140
|
+
(
|
|
141
|
+
0x00,
|
|
142
|
+
lambda op: bytearray(
|
|
143
|
+
[
|
|
144
|
+
0xC4,
|
|
145
|
+
0xE1,
|
|
146
|
+
0xFD ^ (op[1].hlcode << 3),
|
|
147
|
+
0x4A,
|
|
148
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
149
|
+
]
|
|
150
|
+
),
|
|
151
|
+
)
|
|
152
|
+
)
|
|
153
|
+
self.in_regs = (False, True, True)
|
|
154
|
+
self.out_regs = (True, False, False)
|
|
155
|
+
self.out_operands = (True, False, False)
|
|
156
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
157
|
+
else:
|
|
158
|
+
raise SyntaxError(
|
|
159
|
+
"Invalid operand types: KADDD "
|
|
160
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
161
|
+
)
|
|
162
|
+
if nervapy.stream.active_stream is not None:
|
|
163
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class KADDQ(Instruction):
|
|
167
|
+
"""ADD Two 64-bit Masks"""
|
|
168
|
+
|
|
169
|
+
def __init__(self, *args, **kwargs):
|
|
170
|
+
"""Supported forms:
|
|
171
|
+
|
|
172
|
+
* KADDQ(k, k, k) [AVX512BW]
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
origin = kwargs.get("origin")
|
|
176
|
+
prototype = kwargs.get("prototype")
|
|
177
|
+
if (
|
|
178
|
+
origin is None
|
|
179
|
+
and prototype is None
|
|
180
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
181
|
+
):
|
|
182
|
+
origin = inspect.stack()
|
|
183
|
+
super(KADDQ, self).__init__("KADDQ", origin=origin, prototype=prototype)
|
|
184
|
+
self.operands = tuple(map(check_operand, args))
|
|
185
|
+
if len(self.operands) != 3:
|
|
186
|
+
raise SyntaxError('Instruction "KADDQ" requires 3 operands')
|
|
187
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
188
|
+
self.encodings.append(
|
|
189
|
+
(
|
|
190
|
+
0x00,
|
|
191
|
+
lambda op: bytearray(
|
|
192
|
+
[
|
|
193
|
+
0xC4,
|
|
194
|
+
0xE1,
|
|
195
|
+
0xFC ^ (op[1].hlcode << 3),
|
|
196
|
+
0x4A,
|
|
197
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
198
|
+
]
|
|
199
|
+
),
|
|
200
|
+
)
|
|
201
|
+
)
|
|
202
|
+
self.in_regs = (False, True, True)
|
|
203
|
+
self.out_regs = (True, False, False)
|
|
204
|
+
self.out_operands = (True, False, False)
|
|
205
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
206
|
+
else:
|
|
207
|
+
raise SyntaxError(
|
|
208
|
+
"Invalid operand types: KADDQ "
|
|
209
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
210
|
+
)
|
|
211
|
+
if nervapy.stream.active_stream is not None:
|
|
212
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
class KANDB(Instruction):
|
|
216
|
+
"""Bitwise Logical AND 8-bit Masks"""
|
|
217
|
+
|
|
218
|
+
def __init__(self, *args, **kwargs):
|
|
219
|
+
"""Supported forms:
|
|
220
|
+
|
|
221
|
+
* KANDB(k, k, k) [AVX512DQ]
|
|
222
|
+
"""
|
|
223
|
+
|
|
224
|
+
origin = kwargs.get("origin")
|
|
225
|
+
prototype = kwargs.get("prototype")
|
|
226
|
+
if (
|
|
227
|
+
origin is None
|
|
228
|
+
and prototype is None
|
|
229
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
230
|
+
):
|
|
231
|
+
origin = inspect.stack()
|
|
232
|
+
super(KANDB, self).__init__("KANDB", origin=origin, prototype=prototype)
|
|
233
|
+
self.operands = tuple(map(check_operand, args))
|
|
234
|
+
if len(self.operands) != 3:
|
|
235
|
+
raise SyntaxError('Instruction "KANDB" requires 3 operands')
|
|
236
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
237
|
+
self.encodings.append(
|
|
238
|
+
(
|
|
239
|
+
0x40,
|
|
240
|
+
lambda op, vex3=False: vex2(5, 0, None, op[1].hlcode, vex3)
|
|
241
|
+
+ bytearray([0x41, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
242
|
+
)
|
|
243
|
+
)
|
|
244
|
+
self.in_regs = (False, True, True)
|
|
245
|
+
self.out_regs = (True, False, False)
|
|
246
|
+
self.out_operands = (True, False, False)
|
|
247
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
248
|
+
else:
|
|
249
|
+
raise SyntaxError(
|
|
250
|
+
"Invalid operand types: KANDB "
|
|
251
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
252
|
+
)
|
|
253
|
+
if nervapy.stream.active_stream is not None:
|
|
254
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
class KANDW(Instruction):
|
|
258
|
+
"""Bitwise Logical AND 16-bit Masks"""
|
|
259
|
+
|
|
260
|
+
def __init__(self, *args, **kwargs):
|
|
261
|
+
"""Supported forms:
|
|
262
|
+
|
|
263
|
+
* KANDW(k, k, k) [AVX512F]
|
|
264
|
+
"""
|
|
265
|
+
|
|
266
|
+
origin = kwargs.get("origin")
|
|
267
|
+
prototype = kwargs.get("prototype")
|
|
268
|
+
if (
|
|
269
|
+
origin is None
|
|
270
|
+
and prototype is None
|
|
271
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
272
|
+
):
|
|
273
|
+
origin = inspect.stack()
|
|
274
|
+
super(KANDW, self).__init__("KANDW", origin=origin, prototype=prototype)
|
|
275
|
+
self.operands = tuple(map(check_operand, args))
|
|
276
|
+
if len(self.operands) != 3:
|
|
277
|
+
raise SyntaxError('Instruction "KANDW" requires 3 operands')
|
|
278
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
279
|
+
self.encodings.append(
|
|
280
|
+
(
|
|
281
|
+
0x40,
|
|
282
|
+
lambda op, vex3=False: vex2(4, 0, None, op[1].hlcode, vex3)
|
|
283
|
+
+ bytearray([0x41, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
284
|
+
)
|
|
285
|
+
)
|
|
286
|
+
self.in_regs = (False, True, True)
|
|
287
|
+
self.out_regs = (True, False, False)
|
|
288
|
+
self.out_operands = (True, False, False)
|
|
289
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512f])
|
|
290
|
+
else:
|
|
291
|
+
raise SyntaxError(
|
|
292
|
+
"Invalid operand types: KANDW "
|
|
293
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
294
|
+
)
|
|
295
|
+
if nervapy.stream.active_stream is not None:
|
|
296
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
class KANDD(Instruction):
|
|
300
|
+
"""Bitwise Logical AND 32-bit Masks"""
|
|
301
|
+
|
|
302
|
+
def __init__(self, *args, **kwargs):
|
|
303
|
+
"""Supported forms:
|
|
304
|
+
|
|
305
|
+
* KANDD(k, k, k) [AVX512BW]
|
|
306
|
+
"""
|
|
307
|
+
|
|
308
|
+
origin = kwargs.get("origin")
|
|
309
|
+
prototype = kwargs.get("prototype")
|
|
310
|
+
if (
|
|
311
|
+
origin is None
|
|
312
|
+
and prototype is None
|
|
313
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
314
|
+
):
|
|
315
|
+
origin = inspect.stack()
|
|
316
|
+
super(KANDD, self).__init__("KANDD", origin=origin, prototype=prototype)
|
|
317
|
+
self.operands = tuple(map(check_operand, args))
|
|
318
|
+
if len(self.operands) != 3:
|
|
319
|
+
raise SyntaxError('Instruction "KANDD" requires 3 operands')
|
|
320
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
321
|
+
self.encodings.append(
|
|
322
|
+
(
|
|
323
|
+
0x00,
|
|
324
|
+
lambda op: bytearray(
|
|
325
|
+
[
|
|
326
|
+
0xC4,
|
|
327
|
+
0xE1,
|
|
328
|
+
0xFD ^ (op[1].hlcode << 3),
|
|
329
|
+
0x41,
|
|
330
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
331
|
+
]
|
|
332
|
+
),
|
|
333
|
+
)
|
|
334
|
+
)
|
|
335
|
+
self.in_regs = (False, True, True)
|
|
336
|
+
self.out_regs = (True, False, False)
|
|
337
|
+
self.out_operands = (True, False, False)
|
|
338
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
339
|
+
else:
|
|
340
|
+
raise SyntaxError(
|
|
341
|
+
"Invalid operand types: KANDD "
|
|
342
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
343
|
+
)
|
|
344
|
+
if nervapy.stream.active_stream is not None:
|
|
345
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
class KANDQ(Instruction):
|
|
349
|
+
"""Bitwise Logical AND 64-bit Masks"""
|
|
350
|
+
|
|
351
|
+
def __init__(self, *args, **kwargs):
|
|
352
|
+
"""Supported forms:
|
|
353
|
+
|
|
354
|
+
* KANDQ(k, k, k) [AVX512BW]
|
|
355
|
+
"""
|
|
356
|
+
|
|
357
|
+
origin = kwargs.get("origin")
|
|
358
|
+
prototype = kwargs.get("prototype")
|
|
359
|
+
if (
|
|
360
|
+
origin is None
|
|
361
|
+
and prototype is None
|
|
362
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
363
|
+
):
|
|
364
|
+
origin = inspect.stack()
|
|
365
|
+
super(KANDQ, self).__init__("KANDQ", origin=origin, prototype=prototype)
|
|
366
|
+
self.operands = tuple(map(check_operand, args))
|
|
367
|
+
if len(self.operands) != 3:
|
|
368
|
+
raise SyntaxError('Instruction "KANDQ" requires 3 operands')
|
|
369
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
370
|
+
self.encodings.append(
|
|
371
|
+
(
|
|
372
|
+
0x00,
|
|
373
|
+
lambda op: bytearray(
|
|
374
|
+
[
|
|
375
|
+
0xC4,
|
|
376
|
+
0xE1,
|
|
377
|
+
0xFC ^ (op[1].hlcode << 3),
|
|
378
|
+
0x41,
|
|
379
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
380
|
+
]
|
|
381
|
+
),
|
|
382
|
+
)
|
|
383
|
+
)
|
|
384
|
+
self.in_regs = (False, True, True)
|
|
385
|
+
self.out_regs = (True, False, False)
|
|
386
|
+
self.out_operands = (True, False, False)
|
|
387
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
388
|
+
else:
|
|
389
|
+
raise SyntaxError(
|
|
390
|
+
"Invalid operand types: KANDQ "
|
|
391
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
392
|
+
)
|
|
393
|
+
if nervapy.stream.active_stream is not None:
|
|
394
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
class KANDNB(Instruction):
|
|
398
|
+
"""Bitwise Logical AND NOT 8-bit Masks"""
|
|
399
|
+
|
|
400
|
+
def __init__(self, *args, **kwargs):
|
|
401
|
+
"""Supported forms:
|
|
402
|
+
|
|
403
|
+
* KANDNB(k, k, k) [AVX512DQ]
|
|
404
|
+
"""
|
|
405
|
+
|
|
406
|
+
origin = kwargs.get("origin")
|
|
407
|
+
prototype = kwargs.get("prototype")
|
|
408
|
+
if (
|
|
409
|
+
origin is None
|
|
410
|
+
and prototype is None
|
|
411
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
412
|
+
):
|
|
413
|
+
origin = inspect.stack()
|
|
414
|
+
super(KANDNB, self).__init__("KANDNB", origin=origin, prototype=prototype)
|
|
415
|
+
self.operands = tuple(map(check_operand, args))
|
|
416
|
+
if len(self.operands) != 3:
|
|
417
|
+
raise SyntaxError('Instruction "KANDNB" requires 3 operands')
|
|
418
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
419
|
+
self.encodings.append(
|
|
420
|
+
(
|
|
421
|
+
0x40,
|
|
422
|
+
lambda op, vex3=False: vex2(5, 0, None, op[1].hlcode, vex3)
|
|
423
|
+
+ bytearray([0x42, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
424
|
+
)
|
|
425
|
+
)
|
|
426
|
+
self.in_regs = (False, True, True)
|
|
427
|
+
self.out_regs = (True, False, False)
|
|
428
|
+
self.out_operands = (True, False, False)
|
|
429
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
430
|
+
else:
|
|
431
|
+
raise SyntaxError(
|
|
432
|
+
"Invalid operand types: KANDNB "
|
|
433
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
434
|
+
)
|
|
435
|
+
if nervapy.stream.active_stream is not None:
|
|
436
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
class KANDNW(Instruction):
|
|
440
|
+
"""Bitwise Logical AND NOT 16-bit Masks"""
|
|
441
|
+
|
|
442
|
+
def __init__(self, *args, **kwargs):
|
|
443
|
+
"""Supported forms:
|
|
444
|
+
|
|
445
|
+
* KANDNW(k, k, k) [AVX512F]
|
|
446
|
+
"""
|
|
447
|
+
|
|
448
|
+
origin = kwargs.get("origin")
|
|
449
|
+
prototype = kwargs.get("prototype")
|
|
450
|
+
if (
|
|
451
|
+
origin is None
|
|
452
|
+
and prototype is None
|
|
453
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
454
|
+
):
|
|
455
|
+
origin = inspect.stack()
|
|
456
|
+
super(KANDNW, self).__init__("KANDNW", origin=origin, prototype=prototype)
|
|
457
|
+
self.operands = tuple(map(check_operand, args))
|
|
458
|
+
if len(self.operands) != 3:
|
|
459
|
+
raise SyntaxError('Instruction "KANDNW" requires 3 operands')
|
|
460
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
461
|
+
self.encodings.append(
|
|
462
|
+
(
|
|
463
|
+
0x40,
|
|
464
|
+
lambda op, vex3=False: vex2(4, 0, None, op[1].hlcode, vex3)
|
|
465
|
+
+ bytearray([0x42, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
466
|
+
)
|
|
467
|
+
)
|
|
468
|
+
self.in_regs = (False, True, True)
|
|
469
|
+
self.out_regs = (True, False, False)
|
|
470
|
+
self.out_operands = (True, False, False)
|
|
471
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512f])
|
|
472
|
+
else:
|
|
473
|
+
raise SyntaxError(
|
|
474
|
+
"Invalid operand types: KANDNW "
|
|
475
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
476
|
+
)
|
|
477
|
+
if nervapy.stream.active_stream is not None:
|
|
478
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
class KANDND(Instruction):
|
|
482
|
+
"""Bitwise Logical AND NOT 32-bit Masks"""
|
|
483
|
+
|
|
484
|
+
def __init__(self, *args, **kwargs):
|
|
485
|
+
"""Supported forms:
|
|
486
|
+
|
|
487
|
+
* KANDND(k, k, k) [AVX512BW]
|
|
488
|
+
"""
|
|
489
|
+
|
|
490
|
+
origin = kwargs.get("origin")
|
|
491
|
+
prototype = kwargs.get("prototype")
|
|
492
|
+
if (
|
|
493
|
+
origin is None
|
|
494
|
+
and prototype is None
|
|
495
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
496
|
+
):
|
|
497
|
+
origin = inspect.stack()
|
|
498
|
+
super(KANDND, self).__init__("KANDND", origin=origin, prototype=prototype)
|
|
499
|
+
self.operands = tuple(map(check_operand, args))
|
|
500
|
+
if len(self.operands) != 3:
|
|
501
|
+
raise SyntaxError('Instruction "KANDND" requires 3 operands')
|
|
502
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
503
|
+
self.encodings.append(
|
|
504
|
+
(
|
|
505
|
+
0x00,
|
|
506
|
+
lambda op: bytearray(
|
|
507
|
+
[
|
|
508
|
+
0xC4,
|
|
509
|
+
0xE1,
|
|
510
|
+
0xFD ^ (op[1].hlcode << 3),
|
|
511
|
+
0x42,
|
|
512
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
513
|
+
]
|
|
514
|
+
),
|
|
515
|
+
)
|
|
516
|
+
)
|
|
517
|
+
self.in_regs = (False, True, True)
|
|
518
|
+
self.out_regs = (True, False, False)
|
|
519
|
+
self.out_operands = (True, False, False)
|
|
520
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
521
|
+
else:
|
|
522
|
+
raise SyntaxError(
|
|
523
|
+
"Invalid operand types: KANDND "
|
|
524
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
525
|
+
)
|
|
526
|
+
if nervapy.stream.active_stream is not None:
|
|
527
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
class KANDNQ(Instruction):
|
|
531
|
+
"""Bitwise Logical AND NOT 64-bit Masks"""
|
|
532
|
+
|
|
533
|
+
def __init__(self, *args, **kwargs):
|
|
534
|
+
"""Supported forms:
|
|
535
|
+
|
|
536
|
+
* KANDNQ(k, k, k) [AVX512BW]
|
|
537
|
+
"""
|
|
538
|
+
|
|
539
|
+
origin = kwargs.get("origin")
|
|
540
|
+
prototype = kwargs.get("prototype")
|
|
541
|
+
if (
|
|
542
|
+
origin is None
|
|
543
|
+
and prototype is None
|
|
544
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
545
|
+
):
|
|
546
|
+
origin = inspect.stack()
|
|
547
|
+
super(KANDNQ, self).__init__("KANDNQ", origin=origin, prototype=prototype)
|
|
548
|
+
self.operands = tuple(map(check_operand, args))
|
|
549
|
+
if len(self.operands) != 3:
|
|
550
|
+
raise SyntaxError('Instruction "KANDNQ" requires 3 operands')
|
|
551
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
552
|
+
self.encodings.append(
|
|
553
|
+
(
|
|
554
|
+
0x00,
|
|
555
|
+
lambda op: bytearray(
|
|
556
|
+
[
|
|
557
|
+
0xC4,
|
|
558
|
+
0xE1,
|
|
559
|
+
0xFC ^ (op[1].hlcode << 3),
|
|
560
|
+
0x42,
|
|
561
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
562
|
+
]
|
|
563
|
+
),
|
|
564
|
+
)
|
|
565
|
+
)
|
|
566
|
+
self.in_regs = (False, True, True)
|
|
567
|
+
self.out_regs = (True, False, False)
|
|
568
|
+
self.out_operands = (True, False, False)
|
|
569
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
570
|
+
else:
|
|
571
|
+
raise SyntaxError(
|
|
572
|
+
"Invalid operand types: KANDNQ "
|
|
573
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
574
|
+
)
|
|
575
|
+
if nervapy.stream.active_stream is not None:
|
|
576
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
class KORB(Instruction):
|
|
580
|
+
"""Bitwise Logical OR 8-bit Masks"""
|
|
581
|
+
|
|
582
|
+
def __init__(self, *args, **kwargs):
|
|
583
|
+
"""Supported forms:
|
|
584
|
+
|
|
585
|
+
* KORB(k, k, k) [AVX512DQ]
|
|
586
|
+
"""
|
|
587
|
+
|
|
588
|
+
origin = kwargs.get("origin")
|
|
589
|
+
prototype = kwargs.get("prototype")
|
|
590
|
+
if (
|
|
591
|
+
origin is None
|
|
592
|
+
and prototype is None
|
|
593
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
594
|
+
):
|
|
595
|
+
origin = inspect.stack()
|
|
596
|
+
super(KORB, self).__init__("KORB", origin=origin, prototype=prototype)
|
|
597
|
+
self.operands = tuple(map(check_operand, args))
|
|
598
|
+
if len(self.operands) != 3:
|
|
599
|
+
raise SyntaxError('Instruction "KORB" requires 3 operands')
|
|
600
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
601
|
+
self.encodings.append(
|
|
602
|
+
(
|
|
603
|
+
0x40,
|
|
604
|
+
lambda op, vex3=False: vex2(5, 0, None, op[1].hlcode, vex3)
|
|
605
|
+
+ bytearray([0x45, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
606
|
+
)
|
|
607
|
+
)
|
|
608
|
+
self.in_regs = (False, True, True)
|
|
609
|
+
self.out_regs = (True, False, False)
|
|
610
|
+
self.out_operands = (True, False, False)
|
|
611
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
612
|
+
else:
|
|
613
|
+
raise SyntaxError(
|
|
614
|
+
"Invalid operand types: KORB "
|
|
615
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
616
|
+
)
|
|
617
|
+
if nervapy.stream.active_stream is not None:
|
|
618
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
class KORW(Instruction):
|
|
622
|
+
"""Bitwise Logical OR 16-bit Masks"""
|
|
623
|
+
|
|
624
|
+
def __init__(self, *args, **kwargs):
|
|
625
|
+
"""Supported forms:
|
|
626
|
+
|
|
627
|
+
* KORW(k, k, k) [AVX512F]
|
|
628
|
+
"""
|
|
629
|
+
|
|
630
|
+
origin = kwargs.get("origin")
|
|
631
|
+
prototype = kwargs.get("prototype")
|
|
632
|
+
if (
|
|
633
|
+
origin is None
|
|
634
|
+
and prototype is None
|
|
635
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
636
|
+
):
|
|
637
|
+
origin = inspect.stack()
|
|
638
|
+
super(KORW, self).__init__("KORW", origin=origin, prototype=prototype)
|
|
639
|
+
self.operands = tuple(map(check_operand, args))
|
|
640
|
+
if len(self.operands) != 3:
|
|
641
|
+
raise SyntaxError('Instruction "KORW" requires 3 operands')
|
|
642
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
643
|
+
self.encodings.append(
|
|
644
|
+
(
|
|
645
|
+
0x40,
|
|
646
|
+
lambda op, vex3=False: vex2(4, 0, None, op[1].hlcode, vex3)
|
|
647
|
+
+ bytearray([0x45, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
648
|
+
)
|
|
649
|
+
)
|
|
650
|
+
self.in_regs = (False, True, True)
|
|
651
|
+
self.out_regs = (True, False, False)
|
|
652
|
+
self.out_operands = (True, False, False)
|
|
653
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512f])
|
|
654
|
+
else:
|
|
655
|
+
raise SyntaxError(
|
|
656
|
+
"Invalid operand types: KORW "
|
|
657
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
658
|
+
)
|
|
659
|
+
if nervapy.stream.active_stream is not None:
|
|
660
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
661
|
+
|
|
662
|
+
|
|
663
|
+
class KORD(Instruction):
|
|
664
|
+
"""Bitwise Logical OR 32-bit Masks"""
|
|
665
|
+
|
|
666
|
+
def __init__(self, *args, **kwargs):
|
|
667
|
+
"""Supported forms:
|
|
668
|
+
|
|
669
|
+
* KORD(k, k, k) [AVX512BW]
|
|
670
|
+
"""
|
|
671
|
+
|
|
672
|
+
origin = kwargs.get("origin")
|
|
673
|
+
prototype = kwargs.get("prototype")
|
|
674
|
+
if (
|
|
675
|
+
origin is None
|
|
676
|
+
and prototype is None
|
|
677
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
678
|
+
):
|
|
679
|
+
origin = inspect.stack()
|
|
680
|
+
super(KORD, self).__init__("KORD", origin=origin, prototype=prototype)
|
|
681
|
+
self.operands = tuple(map(check_operand, args))
|
|
682
|
+
if len(self.operands) != 3:
|
|
683
|
+
raise SyntaxError('Instruction "KORD" requires 3 operands')
|
|
684
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
685
|
+
self.encodings.append(
|
|
686
|
+
(
|
|
687
|
+
0x00,
|
|
688
|
+
lambda op: bytearray(
|
|
689
|
+
[
|
|
690
|
+
0xC4,
|
|
691
|
+
0xE1,
|
|
692
|
+
0xFD ^ (op[1].hlcode << 3),
|
|
693
|
+
0x45,
|
|
694
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
695
|
+
]
|
|
696
|
+
),
|
|
697
|
+
)
|
|
698
|
+
)
|
|
699
|
+
self.in_regs = (False, True, True)
|
|
700
|
+
self.out_regs = (True, False, False)
|
|
701
|
+
self.out_operands = (True, False, False)
|
|
702
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
703
|
+
else:
|
|
704
|
+
raise SyntaxError(
|
|
705
|
+
"Invalid operand types: KORD "
|
|
706
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
707
|
+
)
|
|
708
|
+
if nervapy.stream.active_stream is not None:
|
|
709
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
710
|
+
|
|
711
|
+
|
|
712
|
+
class KORQ(Instruction):
|
|
713
|
+
"""Bitwise Logical OR 64-bit Masks"""
|
|
714
|
+
|
|
715
|
+
def __init__(self, *args, **kwargs):
|
|
716
|
+
"""Supported forms:
|
|
717
|
+
|
|
718
|
+
* KORQ(k, k, k) [AVX512BW]
|
|
719
|
+
"""
|
|
720
|
+
|
|
721
|
+
origin = kwargs.get("origin")
|
|
722
|
+
prototype = kwargs.get("prototype")
|
|
723
|
+
if (
|
|
724
|
+
origin is None
|
|
725
|
+
and prototype is None
|
|
726
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
727
|
+
):
|
|
728
|
+
origin = inspect.stack()
|
|
729
|
+
super(KORQ, self).__init__("KORQ", origin=origin, prototype=prototype)
|
|
730
|
+
self.operands = tuple(map(check_operand, args))
|
|
731
|
+
if len(self.operands) != 3:
|
|
732
|
+
raise SyntaxError('Instruction "KORQ" requires 3 operands')
|
|
733
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
734
|
+
self.encodings.append(
|
|
735
|
+
(
|
|
736
|
+
0x00,
|
|
737
|
+
lambda op: bytearray(
|
|
738
|
+
[
|
|
739
|
+
0xC4,
|
|
740
|
+
0xE1,
|
|
741
|
+
0xFC ^ (op[1].hlcode << 3),
|
|
742
|
+
0x45,
|
|
743
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
744
|
+
]
|
|
745
|
+
),
|
|
746
|
+
)
|
|
747
|
+
)
|
|
748
|
+
self.in_regs = (False, True, True)
|
|
749
|
+
self.out_regs = (True, False, False)
|
|
750
|
+
self.out_operands = (True, False, False)
|
|
751
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
752
|
+
else:
|
|
753
|
+
raise SyntaxError(
|
|
754
|
+
"Invalid operand types: KORQ "
|
|
755
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
756
|
+
)
|
|
757
|
+
if nervapy.stream.active_stream is not None:
|
|
758
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
759
|
+
|
|
760
|
+
|
|
761
|
+
class KXNORB(Instruction):
|
|
762
|
+
"""Bitwise Logical XNOR 8-bit Masks"""
|
|
763
|
+
|
|
764
|
+
def __init__(self, *args, **kwargs):
|
|
765
|
+
"""Supported forms:
|
|
766
|
+
|
|
767
|
+
* KXNORB(k, k, k) [AVX512DQ]
|
|
768
|
+
"""
|
|
769
|
+
|
|
770
|
+
origin = kwargs.get("origin")
|
|
771
|
+
prototype = kwargs.get("prototype")
|
|
772
|
+
if (
|
|
773
|
+
origin is None
|
|
774
|
+
and prototype is None
|
|
775
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
776
|
+
):
|
|
777
|
+
origin = inspect.stack()
|
|
778
|
+
super(KXNORB, self).__init__("KXNORB", origin=origin, prototype=prototype)
|
|
779
|
+
self.operands = tuple(map(check_operand, args))
|
|
780
|
+
if len(self.operands) != 3:
|
|
781
|
+
raise SyntaxError('Instruction "KXNORB" requires 3 operands')
|
|
782
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
783
|
+
self.encodings.append(
|
|
784
|
+
(
|
|
785
|
+
0x40,
|
|
786
|
+
lambda op, vex3=False: vex2(5, 0, None, op[1].hlcode, vex3)
|
|
787
|
+
+ bytearray([0x46, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
788
|
+
)
|
|
789
|
+
)
|
|
790
|
+
self.in_regs = (False, True, True)
|
|
791
|
+
self.out_regs = (True, False, False)
|
|
792
|
+
self.out_operands = (True, False, False)
|
|
793
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
794
|
+
else:
|
|
795
|
+
raise SyntaxError(
|
|
796
|
+
"Invalid operand types: KXNORB "
|
|
797
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
798
|
+
)
|
|
799
|
+
if nervapy.stream.active_stream is not None:
|
|
800
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
801
|
+
|
|
802
|
+
|
|
803
|
+
class KXNORW(Instruction):
|
|
804
|
+
"""Bitwise Logical XNOR 16-bit Masks"""
|
|
805
|
+
|
|
806
|
+
def __init__(self, *args, **kwargs):
|
|
807
|
+
"""Supported forms:
|
|
808
|
+
|
|
809
|
+
* KXNORW(k, k, k) [AVX512F]
|
|
810
|
+
"""
|
|
811
|
+
|
|
812
|
+
origin = kwargs.get("origin")
|
|
813
|
+
prototype = kwargs.get("prototype")
|
|
814
|
+
if (
|
|
815
|
+
origin is None
|
|
816
|
+
and prototype is None
|
|
817
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
818
|
+
):
|
|
819
|
+
origin = inspect.stack()
|
|
820
|
+
super(KXNORW, self).__init__("KXNORW", origin=origin, prototype=prototype)
|
|
821
|
+
self.operands = tuple(map(check_operand, args))
|
|
822
|
+
if len(self.operands) != 3:
|
|
823
|
+
raise SyntaxError('Instruction "KXNORW" requires 3 operands')
|
|
824
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
825
|
+
self.encodings.append(
|
|
826
|
+
(
|
|
827
|
+
0x40,
|
|
828
|
+
lambda op, vex3=False: vex2(4, 0, None, op[1].hlcode, vex3)
|
|
829
|
+
+ bytearray([0x46, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
830
|
+
)
|
|
831
|
+
)
|
|
832
|
+
self.in_regs = (False, True, True)
|
|
833
|
+
self.out_regs = (True, False, False)
|
|
834
|
+
self.out_operands = (True, False, False)
|
|
835
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512f])
|
|
836
|
+
else:
|
|
837
|
+
raise SyntaxError(
|
|
838
|
+
"Invalid operand types: KXNORW "
|
|
839
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
840
|
+
)
|
|
841
|
+
if nervapy.stream.active_stream is not None:
|
|
842
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
843
|
+
|
|
844
|
+
|
|
845
|
+
class KXNORD(Instruction):
|
|
846
|
+
"""Bitwise Logical XNOR 32-bit Masks"""
|
|
847
|
+
|
|
848
|
+
def __init__(self, *args, **kwargs):
|
|
849
|
+
"""Supported forms:
|
|
850
|
+
|
|
851
|
+
* KXNORD(k, k, k) [AVX512BW]
|
|
852
|
+
"""
|
|
853
|
+
|
|
854
|
+
origin = kwargs.get("origin")
|
|
855
|
+
prototype = kwargs.get("prototype")
|
|
856
|
+
if (
|
|
857
|
+
origin is None
|
|
858
|
+
and prototype is None
|
|
859
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
860
|
+
):
|
|
861
|
+
origin = inspect.stack()
|
|
862
|
+
super(KXNORD, self).__init__("KXNORD", origin=origin, prototype=prototype)
|
|
863
|
+
self.operands = tuple(map(check_operand, args))
|
|
864
|
+
if len(self.operands) != 3:
|
|
865
|
+
raise SyntaxError('Instruction "KXNORD" requires 3 operands')
|
|
866
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
867
|
+
self.encodings.append(
|
|
868
|
+
(
|
|
869
|
+
0x00,
|
|
870
|
+
lambda op: bytearray(
|
|
871
|
+
[
|
|
872
|
+
0xC4,
|
|
873
|
+
0xE1,
|
|
874
|
+
0xFD ^ (op[1].hlcode << 3),
|
|
875
|
+
0x46,
|
|
876
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
877
|
+
]
|
|
878
|
+
),
|
|
879
|
+
)
|
|
880
|
+
)
|
|
881
|
+
self.in_regs = (False, True, True)
|
|
882
|
+
self.out_regs = (True, False, False)
|
|
883
|
+
self.out_operands = (True, False, False)
|
|
884
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
885
|
+
else:
|
|
886
|
+
raise SyntaxError(
|
|
887
|
+
"Invalid operand types: KXNORD "
|
|
888
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
889
|
+
)
|
|
890
|
+
if nervapy.stream.active_stream is not None:
|
|
891
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
892
|
+
|
|
893
|
+
|
|
894
|
+
class KXNORQ(Instruction):
|
|
895
|
+
"""Bitwise Logical XNOR 64-bit Masks"""
|
|
896
|
+
|
|
897
|
+
def __init__(self, *args, **kwargs):
|
|
898
|
+
"""Supported forms:
|
|
899
|
+
|
|
900
|
+
* KXNORQ(k, k, k) [AVX512BW]
|
|
901
|
+
"""
|
|
902
|
+
|
|
903
|
+
origin = kwargs.get("origin")
|
|
904
|
+
prototype = kwargs.get("prototype")
|
|
905
|
+
if (
|
|
906
|
+
origin is None
|
|
907
|
+
and prototype is None
|
|
908
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
909
|
+
):
|
|
910
|
+
origin = inspect.stack()
|
|
911
|
+
super(KXNORQ, self).__init__("KXNORQ", origin=origin, prototype=prototype)
|
|
912
|
+
self.operands = tuple(map(check_operand, args))
|
|
913
|
+
if len(self.operands) != 3:
|
|
914
|
+
raise SyntaxError('Instruction "KXNORQ" requires 3 operands')
|
|
915
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
916
|
+
self.encodings.append(
|
|
917
|
+
(
|
|
918
|
+
0x00,
|
|
919
|
+
lambda op: bytearray(
|
|
920
|
+
[
|
|
921
|
+
0xC4,
|
|
922
|
+
0xE1,
|
|
923
|
+
0xFC ^ (op[1].hlcode << 3),
|
|
924
|
+
0x46,
|
|
925
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
926
|
+
]
|
|
927
|
+
),
|
|
928
|
+
)
|
|
929
|
+
)
|
|
930
|
+
self.in_regs = (False, True, True)
|
|
931
|
+
self.out_regs = (True, False, False)
|
|
932
|
+
self.out_operands = (True, False, False)
|
|
933
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
934
|
+
else:
|
|
935
|
+
raise SyntaxError(
|
|
936
|
+
"Invalid operand types: KXNORQ "
|
|
937
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
938
|
+
)
|
|
939
|
+
if nervapy.stream.active_stream is not None:
|
|
940
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
941
|
+
|
|
942
|
+
|
|
943
|
+
class KXORB(Instruction):
|
|
944
|
+
"""Bitwise Logical XOR 8-bit Masks"""
|
|
945
|
+
|
|
946
|
+
def __init__(self, *args, **kwargs):
|
|
947
|
+
"""Supported forms:
|
|
948
|
+
|
|
949
|
+
* KXORB(k, k, k) [AVX512DQ]
|
|
950
|
+
"""
|
|
951
|
+
|
|
952
|
+
origin = kwargs.get("origin")
|
|
953
|
+
prototype = kwargs.get("prototype")
|
|
954
|
+
if (
|
|
955
|
+
origin is None
|
|
956
|
+
and prototype is None
|
|
957
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
958
|
+
):
|
|
959
|
+
origin = inspect.stack()
|
|
960
|
+
super(KXORB, self).__init__("KXORB", origin=origin, prototype=prototype)
|
|
961
|
+
self.operands = tuple(map(check_operand, args))
|
|
962
|
+
if len(self.operands) != 3:
|
|
963
|
+
raise SyntaxError('Instruction "KXORB" requires 3 operands')
|
|
964
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
965
|
+
self.encodings.append(
|
|
966
|
+
(
|
|
967
|
+
0x40,
|
|
968
|
+
lambda op, vex3=False: vex2(5, 0, None, op[1].hlcode, vex3)
|
|
969
|
+
+ bytearray([0x47, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
970
|
+
)
|
|
971
|
+
)
|
|
972
|
+
self.in_regs = (False, True, True)
|
|
973
|
+
self.out_regs = (True, False, False)
|
|
974
|
+
self.out_operands = (True, False, False)
|
|
975
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
976
|
+
else:
|
|
977
|
+
raise SyntaxError(
|
|
978
|
+
"Invalid operand types: KXORB "
|
|
979
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
980
|
+
)
|
|
981
|
+
if nervapy.stream.active_stream is not None:
|
|
982
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
983
|
+
|
|
984
|
+
|
|
985
|
+
class KXORW(Instruction):
|
|
986
|
+
"""Bitwise Logical XOR 16-bit Masks"""
|
|
987
|
+
|
|
988
|
+
def __init__(self, *args, **kwargs):
|
|
989
|
+
"""Supported forms:
|
|
990
|
+
|
|
991
|
+
* KXORW(k, k, k) [AVX512F]
|
|
992
|
+
"""
|
|
993
|
+
|
|
994
|
+
origin = kwargs.get("origin")
|
|
995
|
+
prototype = kwargs.get("prototype")
|
|
996
|
+
if (
|
|
997
|
+
origin is None
|
|
998
|
+
and prototype is None
|
|
999
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1000
|
+
):
|
|
1001
|
+
origin = inspect.stack()
|
|
1002
|
+
super(KXORW, self).__init__("KXORW", origin=origin, prototype=prototype)
|
|
1003
|
+
self.operands = tuple(map(check_operand, args))
|
|
1004
|
+
if len(self.operands) != 3:
|
|
1005
|
+
raise SyntaxError('Instruction "KXORW" requires 3 operands')
|
|
1006
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
1007
|
+
self.encodings.append(
|
|
1008
|
+
(
|
|
1009
|
+
0x40,
|
|
1010
|
+
lambda op, vex3=False: vex2(4, 0, None, op[1].hlcode, vex3)
|
|
1011
|
+
+ bytearray([0x47, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
1012
|
+
)
|
|
1013
|
+
)
|
|
1014
|
+
self.in_regs = (False, True, True)
|
|
1015
|
+
self.out_regs = (True, False, False)
|
|
1016
|
+
self.out_operands = (True, False, False)
|
|
1017
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512f])
|
|
1018
|
+
else:
|
|
1019
|
+
raise SyntaxError(
|
|
1020
|
+
"Invalid operand types: KXORW "
|
|
1021
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1022
|
+
)
|
|
1023
|
+
if nervapy.stream.active_stream is not None:
|
|
1024
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1025
|
+
|
|
1026
|
+
|
|
1027
|
+
class KXORD(Instruction):
|
|
1028
|
+
"""Bitwise Logical XOR 32-bit Masks"""
|
|
1029
|
+
|
|
1030
|
+
def __init__(self, *args, **kwargs):
|
|
1031
|
+
"""Supported forms:
|
|
1032
|
+
|
|
1033
|
+
* KXORD(k, k, k) [AVX512BW]
|
|
1034
|
+
"""
|
|
1035
|
+
|
|
1036
|
+
origin = kwargs.get("origin")
|
|
1037
|
+
prototype = kwargs.get("prototype")
|
|
1038
|
+
if (
|
|
1039
|
+
origin is None
|
|
1040
|
+
and prototype is None
|
|
1041
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1042
|
+
):
|
|
1043
|
+
origin = inspect.stack()
|
|
1044
|
+
super(KXORD, self).__init__("KXORD", origin=origin, prototype=prototype)
|
|
1045
|
+
self.operands = tuple(map(check_operand, args))
|
|
1046
|
+
if len(self.operands) != 3:
|
|
1047
|
+
raise SyntaxError('Instruction "KXORD" requires 3 operands')
|
|
1048
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
1049
|
+
self.encodings.append(
|
|
1050
|
+
(
|
|
1051
|
+
0x00,
|
|
1052
|
+
lambda op: bytearray(
|
|
1053
|
+
[
|
|
1054
|
+
0xC4,
|
|
1055
|
+
0xE1,
|
|
1056
|
+
0xFD ^ (op[1].hlcode << 3),
|
|
1057
|
+
0x47,
|
|
1058
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
1059
|
+
]
|
|
1060
|
+
),
|
|
1061
|
+
)
|
|
1062
|
+
)
|
|
1063
|
+
self.in_regs = (False, True, True)
|
|
1064
|
+
self.out_regs = (True, False, False)
|
|
1065
|
+
self.out_operands = (True, False, False)
|
|
1066
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
1067
|
+
else:
|
|
1068
|
+
raise SyntaxError(
|
|
1069
|
+
"Invalid operand types: KXORD "
|
|
1070
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1071
|
+
)
|
|
1072
|
+
if nervapy.stream.active_stream is not None:
|
|
1073
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1074
|
+
|
|
1075
|
+
|
|
1076
|
+
class KXORQ(Instruction):
|
|
1077
|
+
"""Bitwise Logical XOR 64-bit Masks"""
|
|
1078
|
+
|
|
1079
|
+
def __init__(self, *args, **kwargs):
|
|
1080
|
+
"""Supported forms:
|
|
1081
|
+
|
|
1082
|
+
* KXORQ(k, k, k) [AVX512BW]
|
|
1083
|
+
"""
|
|
1084
|
+
|
|
1085
|
+
origin = kwargs.get("origin")
|
|
1086
|
+
prototype = kwargs.get("prototype")
|
|
1087
|
+
if (
|
|
1088
|
+
origin is None
|
|
1089
|
+
and prototype is None
|
|
1090
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1091
|
+
):
|
|
1092
|
+
origin = inspect.stack()
|
|
1093
|
+
super(KXORQ, self).__init__("KXORQ", origin=origin, prototype=prototype)
|
|
1094
|
+
self.operands = tuple(map(check_operand, args))
|
|
1095
|
+
if len(self.operands) != 3:
|
|
1096
|
+
raise SyntaxError('Instruction "KXORQ" requires 3 operands')
|
|
1097
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
1098
|
+
self.encodings.append(
|
|
1099
|
+
(
|
|
1100
|
+
0x00,
|
|
1101
|
+
lambda op: bytearray(
|
|
1102
|
+
[
|
|
1103
|
+
0xC4,
|
|
1104
|
+
0xE1,
|
|
1105
|
+
0xFC ^ (op[1].hlcode << 3),
|
|
1106
|
+
0x47,
|
|
1107
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
1108
|
+
]
|
|
1109
|
+
),
|
|
1110
|
+
)
|
|
1111
|
+
)
|
|
1112
|
+
self.in_regs = (False, True, True)
|
|
1113
|
+
self.out_regs = (True, False, False)
|
|
1114
|
+
self.out_operands = (True, False, False)
|
|
1115
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
1116
|
+
else:
|
|
1117
|
+
raise SyntaxError(
|
|
1118
|
+
"Invalid operand types: KXORQ "
|
|
1119
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1120
|
+
)
|
|
1121
|
+
if nervapy.stream.active_stream is not None:
|
|
1122
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1123
|
+
|
|
1124
|
+
|
|
1125
|
+
class KMOVB(Instruction):
|
|
1126
|
+
"""Move 8-bit Mask"""
|
|
1127
|
+
|
|
1128
|
+
def __init__(self, *args, **kwargs):
|
|
1129
|
+
"""Supported forms:
|
|
1130
|
+
|
|
1131
|
+
* KMOVB(k, k) [AVX512DQ]
|
|
1132
|
+
* KMOVB(k, m8) [AVX512DQ]
|
|
1133
|
+
* KMOVB(k, r32) [AVX512DQ]
|
|
1134
|
+
* KMOVB(m8, k) [AVX512DQ]
|
|
1135
|
+
* KMOVB(r32, k) [AVX512DQ]
|
|
1136
|
+
"""
|
|
1137
|
+
|
|
1138
|
+
origin = kwargs.get("origin")
|
|
1139
|
+
prototype = kwargs.get("prototype")
|
|
1140
|
+
if (
|
|
1141
|
+
origin is None
|
|
1142
|
+
and prototype is None
|
|
1143
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1144
|
+
):
|
|
1145
|
+
origin = inspect.stack()
|
|
1146
|
+
super(KMOVB, self).__init__("KMOVB", origin=origin, prototype=prototype)
|
|
1147
|
+
self.operands = tuple(map(check_operand, args))
|
|
1148
|
+
if len(self.operands) != 2:
|
|
1149
|
+
raise SyntaxError('Instruction "KMOVB" requires 2 operands')
|
|
1150
|
+
self.out_operands = (True, False)
|
|
1151
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
1152
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
1153
|
+
self.encodings.append(
|
|
1154
|
+
(
|
|
1155
|
+
0x40,
|
|
1156
|
+
lambda op, vex3=False: vex2(1, 0, None, 0, vex3)
|
|
1157
|
+
+ bytearray([0x90, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
1158
|
+
)
|
|
1159
|
+
)
|
|
1160
|
+
self.in_regs = (False, True)
|
|
1161
|
+
self.out_regs = (True, False)
|
|
1162
|
+
elif is_k(self.operands[0]) and is_r32(self.operands[1]):
|
|
1163
|
+
self.encodings.append(
|
|
1164
|
+
(
|
|
1165
|
+
0x40,
|
|
1166
|
+
lambda op, vex3=False: vex2(1, 0, op[1], 0, vex3)
|
|
1167
|
+
+ bytearray([0x92, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
1168
|
+
)
|
|
1169
|
+
)
|
|
1170
|
+
self.in_regs = (False, True)
|
|
1171
|
+
self.out_regs = (True, False)
|
|
1172
|
+
elif is_k(self.operands[0]) and is_m8(self.operands[1]):
|
|
1173
|
+
self.encodings.append(
|
|
1174
|
+
(
|
|
1175
|
+
0x50,
|
|
1176
|
+
lambda op, vex3=False, sib=False, min_disp=0: vex2(
|
|
1177
|
+
1, 0, op[1].address, 0, vex3
|
|
1178
|
+
)
|
|
1179
|
+
+ bytearray([0x90])
|
|
1180
|
+
+ modrm_sib_disp(op[0].lcode, op[1].address, sib, min_disp),
|
|
1181
|
+
)
|
|
1182
|
+
)
|
|
1183
|
+
self.in_regs = (False, True)
|
|
1184
|
+
self.out_regs = (True, False)
|
|
1185
|
+
elif is_r32(self.operands[0]) and is_k(self.operands[1]):
|
|
1186
|
+
self.encodings.append(
|
|
1187
|
+
(
|
|
1188
|
+
0x40,
|
|
1189
|
+
lambda op, vex3=False: vex2(1, op[0].hcode, None, 0, vex3)
|
|
1190
|
+
+ bytearray([0x93, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
1191
|
+
)
|
|
1192
|
+
)
|
|
1193
|
+
self.in_regs = (False, True)
|
|
1194
|
+
self.out_regs = (True, False)
|
|
1195
|
+
elif is_m8(self.operands[0]) and is_k(self.operands[1]):
|
|
1196
|
+
self.encodings.append(
|
|
1197
|
+
(
|
|
1198
|
+
0x50,
|
|
1199
|
+
lambda op, vex3=False, sib=False, min_disp=0: vex2(
|
|
1200
|
+
1, 0, op[0].address, 0, vex3
|
|
1201
|
+
)
|
|
1202
|
+
+ bytearray([0x91])
|
|
1203
|
+
+ modrm_sib_disp(op[1].lcode, op[0].address, sib, min_disp),
|
|
1204
|
+
)
|
|
1205
|
+
)
|
|
1206
|
+
self.in_regs = (True, True)
|
|
1207
|
+
self.out_regs = (False, False)
|
|
1208
|
+
else:
|
|
1209
|
+
raise SyntaxError(
|
|
1210
|
+
"Invalid operand types: KMOVB "
|
|
1211
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1212
|
+
)
|
|
1213
|
+
if nervapy.stream.active_stream is not None:
|
|
1214
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
class KMOVW(Instruction):
|
|
1218
|
+
"""Move 16-bit Mask"""
|
|
1219
|
+
|
|
1220
|
+
def __init__(self, *args, **kwargs):
|
|
1221
|
+
"""Supported forms:
|
|
1222
|
+
|
|
1223
|
+
* KMOVW(k, k) [AVX512F]
|
|
1224
|
+
* KMOVW(k, m16) [AVX512F]
|
|
1225
|
+
* KMOVW(k, r32) [AVX512F]
|
|
1226
|
+
* KMOVW(m16, k) [AVX512F]
|
|
1227
|
+
* KMOVW(r32, k) [AVX512F]
|
|
1228
|
+
"""
|
|
1229
|
+
|
|
1230
|
+
origin = kwargs.get("origin")
|
|
1231
|
+
prototype = kwargs.get("prototype")
|
|
1232
|
+
if (
|
|
1233
|
+
origin is None
|
|
1234
|
+
and prototype is None
|
|
1235
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1236
|
+
):
|
|
1237
|
+
origin = inspect.stack()
|
|
1238
|
+
super(KMOVW, self).__init__("KMOVW", origin=origin, prototype=prototype)
|
|
1239
|
+
self.operands = tuple(map(check_operand, args))
|
|
1240
|
+
if len(self.operands) != 2:
|
|
1241
|
+
raise SyntaxError('Instruction "KMOVW" requires 2 operands')
|
|
1242
|
+
self.out_operands = (True, False)
|
|
1243
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512f])
|
|
1244
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
1245
|
+
self.encodings.append(
|
|
1246
|
+
(
|
|
1247
|
+
0x40,
|
|
1248
|
+
lambda op, vex3=False: vex2(0, 0, None, 0, vex3)
|
|
1249
|
+
+ bytearray([0x90, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
1250
|
+
)
|
|
1251
|
+
)
|
|
1252
|
+
self.in_regs = (False, True)
|
|
1253
|
+
self.out_regs = (True, False)
|
|
1254
|
+
elif is_k(self.operands[0]) and is_r32(self.operands[1]):
|
|
1255
|
+
self.encodings.append(
|
|
1256
|
+
(
|
|
1257
|
+
0x40,
|
|
1258
|
+
lambda op, vex3=False: vex2(0, 0, op[1], 0, vex3)
|
|
1259
|
+
+ bytearray([0x92, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
1260
|
+
)
|
|
1261
|
+
)
|
|
1262
|
+
self.in_regs = (False, True)
|
|
1263
|
+
self.out_regs = (True, False)
|
|
1264
|
+
elif is_k(self.operands[0]) and is_m16(self.operands[1]):
|
|
1265
|
+
self.encodings.append(
|
|
1266
|
+
(
|
|
1267
|
+
0x50,
|
|
1268
|
+
lambda op, vex3=False, sib=False, min_disp=0: vex2(
|
|
1269
|
+
0, 0, op[1].address, 0, vex3
|
|
1270
|
+
)
|
|
1271
|
+
+ bytearray([0x90])
|
|
1272
|
+
+ modrm_sib_disp(op[0].lcode, op[1].address, sib, min_disp),
|
|
1273
|
+
)
|
|
1274
|
+
)
|
|
1275
|
+
self.in_regs = (False, True)
|
|
1276
|
+
self.out_regs = (True, False)
|
|
1277
|
+
elif is_r32(self.operands[0]) and is_k(self.operands[1]):
|
|
1278
|
+
self.encodings.append(
|
|
1279
|
+
(
|
|
1280
|
+
0x40,
|
|
1281
|
+
lambda op, vex3=False: vex2(0, op[0].hcode, None, 0, vex3)
|
|
1282
|
+
+ bytearray([0x93, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
1283
|
+
)
|
|
1284
|
+
)
|
|
1285
|
+
self.in_regs = (False, True)
|
|
1286
|
+
self.out_regs = (True, False)
|
|
1287
|
+
elif is_m16(self.operands[0]) and is_k(self.operands[1]):
|
|
1288
|
+
self.encodings.append(
|
|
1289
|
+
(
|
|
1290
|
+
0x50,
|
|
1291
|
+
lambda op, vex3=False, sib=False, min_disp=0: vex2(
|
|
1292
|
+
0, 0, op[0].address, 0, vex3
|
|
1293
|
+
)
|
|
1294
|
+
+ bytearray([0x91])
|
|
1295
|
+
+ modrm_sib_disp(op[1].lcode, op[0].address, sib, min_disp),
|
|
1296
|
+
)
|
|
1297
|
+
)
|
|
1298
|
+
self.in_regs = (True, True)
|
|
1299
|
+
self.out_regs = (False, False)
|
|
1300
|
+
else:
|
|
1301
|
+
raise SyntaxError(
|
|
1302
|
+
"Invalid operand types: KMOVW "
|
|
1303
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1304
|
+
)
|
|
1305
|
+
if nervapy.stream.active_stream is not None:
|
|
1306
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1307
|
+
|
|
1308
|
+
|
|
1309
|
+
class KMOVD(Instruction):
|
|
1310
|
+
"""Move 32-bit Mask"""
|
|
1311
|
+
|
|
1312
|
+
def __init__(self, *args, **kwargs):
|
|
1313
|
+
"""Supported forms:
|
|
1314
|
+
|
|
1315
|
+
* KMOVD(k, k) [AVX512BW]
|
|
1316
|
+
* KMOVD(k, r32/m32) [AVX512BW]
|
|
1317
|
+
* KMOVD(r32/m32, k) [AVX512BW]
|
|
1318
|
+
"""
|
|
1319
|
+
|
|
1320
|
+
origin = kwargs.get("origin")
|
|
1321
|
+
prototype = kwargs.get("prototype")
|
|
1322
|
+
if (
|
|
1323
|
+
origin is None
|
|
1324
|
+
and prototype is None
|
|
1325
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1326
|
+
):
|
|
1327
|
+
origin = inspect.stack()
|
|
1328
|
+
super(KMOVD, self).__init__("KMOVD", origin=origin, prototype=prototype)
|
|
1329
|
+
self.operands = tuple(map(check_operand, args))
|
|
1330
|
+
if len(self.operands) != 2:
|
|
1331
|
+
raise SyntaxError('Instruction "KMOVD" requires 2 operands')
|
|
1332
|
+
self.out_operands = (True, False)
|
|
1333
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
1334
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
1335
|
+
self.encodings.append(
|
|
1336
|
+
(
|
|
1337
|
+
0x00,
|
|
1338
|
+
lambda op: bytearray(
|
|
1339
|
+
[0xC4, 0xE1, 0xF9, 0x90, 0xC0 | op[0].lcode << 3 | op[1].lcode]
|
|
1340
|
+
),
|
|
1341
|
+
)
|
|
1342
|
+
)
|
|
1343
|
+
self.in_regs = (False, True)
|
|
1344
|
+
self.out_regs = (True, False)
|
|
1345
|
+
elif is_k(self.operands[0]) and is_r32(self.operands[1]):
|
|
1346
|
+
self.encodings.append(
|
|
1347
|
+
(
|
|
1348
|
+
0x40,
|
|
1349
|
+
lambda op, vex3=False: vex2(3, 0, op[1], 0, vex3)
|
|
1350
|
+
+ bytearray([0x92, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
1351
|
+
)
|
|
1352
|
+
)
|
|
1353
|
+
self.in_regs = (False, True)
|
|
1354
|
+
self.out_regs = (True, False)
|
|
1355
|
+
elif is_k(self.operands[0]) and is_m32(self.operands[1]):
|
|
1356
|
+
self.encodings.append(
|
|
1357
|
+
(
|
|
1358
|
+
0x10,
|
|
1359
|
+
lambda op, sib=False, min_disp=0: vex3(
|
|
1360
|
+
0xC4, 0b1, 0x81, 0, op[1].address
|
|
1361
|
+
)
|
|
1362
|
+
+ bytearray([0x90])
|
|
1363
|
+
+ modrm_sib_disp(op[0].lcode, op[1].address, sib, min_disp),
|
|
1364
|
+
)
|
|
1365
|
+
)
|
|
1366
|
+
self.in_regs = (False, True)
|
|
1367
|
+
self.out_regs = (True, False)
|
|
1368
|
+
elif is_r32(self.operands[0]) and is_k(self.operands[1]):
|
|
1369
|
+
self.encodings.append(
|
|
1370
|
+
(
|
|
1371
|
+
0x40,
|
|
1372
|
+
lambda op, vex3=False: vex2(3, op[0].hcode, None, 0, vex3)
|
|
1373
|
+
+ bytearray([0x93, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
1374
|
+
)
|
|
1375
|
+
)
|
|
1376
|
+
self.in_regs = (False, True)
|
|
1377
|
+
self.out_regs = (True, False)
|
|
1378
|
+
elif is_m32(self.operands[0]) and is_k(self.operands[1]):
|
|
1379
|
+
self.encodings.append(
|
|
1380
|
+
(
|
|
1381
|
+
0x10,
|
|
1382
|
+
lambda op, sib=False, min_disp=0: vex3(
|
|
1383
|
+
0xC4, 0b1, 0x81, 0, op[0].address
|
|
1384
|
+
)
|
|
1385
|
+
+ bytearray([0x91])
|
|
1386
|
+
+ modrm_sib_disp(op[1].lcode, op[0].address, sib, min_disp),
|
|
1387
|
+
)
|
|
1388
|
+
)
|
|
1389
|
+
self.in_regs = (True, True)
|
|
1390
|
+
self.out_regs = (False, False)
|
|
1391
|
+
else:
|
|
1392
|
+
raise SyntaxError(
|
|
1393
|
+
"Invalid operand types: KMOVD "
|
|
1394
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1395
|
+
)
|
|
1396
|
+
if nervapy.stream.active_stream is not None:
|
|
1397
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1398
|
+
|
|
1399
|
+
|
|
1400
|
+
class KMOVQ(Instruction):
|
|
1401
|
+
"""Move 64-bit Mask"""
|
|
1402
|
+
|
|
1403
|
+
def __init__(self, *args, **kwargs):
|
|
1404
|
+
"""Supported forms:
|
|
1405
|
+
|
|
1406
|
+
* KMOVQ(k, k) [AVX512BW]
|
|
1407
|
+
* KMOVQ(k, r64/m64) [AVX512BW]
|
|
1408
|
+
* KMOVQ(r64/m64, k) [AVX512BW]
|
|
1409
|
+
"""
|
|
1410
|
+
|
|
1411
|
+
origin = kwargs.get("origin")
|
|
1412
|
+
prototype = kwargs.get("prototype")
|
|
1413
|
+
if (
|
|
1414
|
+
origin is None
|
|
1415
|
+
and prototype is None
|
|
1416
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1417
|
+
):
|
|
1418
|
+
origin = inspect.stack()
|
|
1419
|
+
super(KMOVQ, self).__init__("KMOVQ", origin=origin, prototype=prototype)
|
|
1420
|
+
self.operands = tuple(map(check_operand, args))
|
|
1421
|
+
if len(self.operands) != 2:
|
|
1422
|
+
raise SyntaxError('Instruction "KMOVQ" requires 2 operands')
|
|
1423
|
+
self.out_operands = (True, False)
|
|
1424
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
1425
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
1426
|
+
self.encodings.append(
|
|
1427
|
+
(
|
|
1428
|
+
0x00,
|
|
1429
|
+
lambda op: bytearray(
|
|
1430
|
+
[0xC4, 0xE1, 0xF8, 0x90, 0xC0 | op[0].lcode << 3 | op[1].lcode]
|
|
1431
|
+
),
|
|
1432
|
+
)
|
|
1433
|
+
)
|
|
1434
|
+
self.in_regs = (False, True)
|
|
1435
|
+
self.out_regs = (True, False)
|
|
1436
|
+
elif is_k(self.operands[0]) and is_r64(self.operands[1]):
|
|
1437
|
+
self.encodings.append(
|
|
1438
|
+
(
|
|
1439
|
+
0x00,
|
|
1440
|
+
lambda op: bytearray(
|
|
1441
|
+
[
|
|
1442
|
+
0xC4,
|
|
1443
|
+
0xE1 ^ (op[1].hcode << 5),
|
|
1444
|
+
0xFB,
|
|
1445
|
+
0x92,
|
|
1446
|
+
0xC0 | op[0].lcode << 3 | op[1].lcode,
|
|
1447
|
+
]
|
|
1448
|
+
),
|
|
1449
|
+
)
|
|
1450
|
+
)
|
|
1451
|
+
self.in_regs = (False, True)
|
|
1452
|
+
self.out_regs = (True, False)
|
|
1453
|
+
elif is_k(self.operands[0]) and is_m64(self.operands[1]):
|
|
1454
|
+
self.encodings.append(
|
|
1455
|
+
(
|
|
1456
|
+
0x10,
|
|
1457
|
+
lambda op, sib=False, min_disp=0: vex3(
|
|
1458
|
+
0xC4, 0b1, 0x80, 0, op[1].address
|
|
1459
|
+
)
|
|
1460
|
+
+ bytearray([0x90])
|
|
1461
|
+
+ modrm_sib_disp(op[0].lcode, op[1].address, sib, min_disp),
|
|
1462
|
+
)
|
|
1463
|
+
)
|
|
1464
|
+
self.in_regs = (False, True)
|
|
1465
|
+
self.out_regs = (True, False)
|
|
1466
|
+
elif is_r64(self.operands[0]) and is_k(self.operands[1]):
|
|
1467
|
+
self.encodings.append(
|
|
1468
|
+
(
|
|
1469
|
+
0x00,
|
|
1470
|
+
lambda op: bytearray(
|
|
1471
|
+
[
|
|
1472
|
+
0xC4,
|
|
1473
|
+
0xE1 ^ (op[0].hcode << 7),
|
|
1474
|
+
0xFB,
|
|
1475
|
+
0x93,
|
|
1476
|
+
0xC0 | op[0].lcode << 3 | op[1].lcode,
|
|
1477
|
+
]
|
|
1478
|
+
),
|
|
1479
|
+
)
|
|
1480
|
+
)
|
|
1481
|
+
self.in_regs = (False, True)
|
|
1482
|
+
self.out_regs = (True, False)
|
|
1483
|
+
elif is_m64(self.operands[0]) and is_k(self.operands[1]):
|
|
1484
|
+
self.encodings.append(
|
|
1485
|
+
(
|
|
1486
|
+
0x10,
|
|
1487
|
+
lambda op, sib=False, min_disp=0: vex3(
|
|
1488
|
+
0xC4, 0b1, 0x80, 0, op[0].address
|
|
1489
|
+
)
|
|
1490
|
+
+ bytearray([0x91])
|
|
1491
|
+
+ modrm_sib_disp(op[1].lcode, op[0].address, sib, min_disp),
|
|
1492
|
+
)
|
|
1493
|
+
)
|
|
1494
|
+
self.in_regs = (True, True)
|
|
1495
|
+
self.out_regs = (False, False)
|
|
1496
|
+
else:
|
|
1497
|
+
raise SyntaxError(
|
|
1498
|
+
"Invalid operand types: KMOVQ "
|
|
1499
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1500
|
+
)
|
|
1501
|
+
if nervapy.stream.active_stream is not None:
|
|
1502
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1503
|
+
|
|
1504
|
+
|
|
1505
|
+
class KNOTB(Instruction):
|
|
1506
|
+
"""NOT 8-bit Mask Register"""
|
|
1507
|
+
|
|
1508
|
+
def __init__(self, *args, **kwargs):
|
|
1509
|
+
"""Supported forms:
|
|
1510
|
+
|
|
1511
|
+
* KNOTB(k, k) [AVX512DQ]
|
|
1512
|
+
"""
|
|
1513
|
+
|
|
1514
|
+
origin = kwargs.get("origin")
|
|
1515
|
+
prototype = kwargs.get("prototype")
|
|
1516
|
+
if (
|
|
1517
|
+
origin is None
|
|
1518
|
+
and prototype is None
|
|
1519
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1520
|
+
):
|
|
1521
|
+
origin = inspect.stack()
|
|
1522
|
+
super(KNOTB, self).__init__("KNOTB", origin=origin, prototype=prototype)
|
|
1523
|
+
self.operands = tuple(map(check_operand, args))
|
|
1524
|
+
if len(self.operands) != 2:
|
|
1525
|
+
raise SyntaxError('Instruction "KNOTB" requires 2 operands')
|
|
1526
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
1527
|
+
self.encodings.append(
|
|
1528
|
+
(
|
|
1529
|
+
0x40,
|
|
1530
|
+
lambda op, vex3=False: vex2(1, 0, None, 0, vex3)
|
|
1531
|
+
+ bytearray([0x44, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
1532
|
+
)
|
|
1533
|
+
)
|
|
1534
|
+
self.in_regs = (False, True)
|
|
1535
|
+
self.out_regs = (True, False)
|
|
1536
|
+
self.out_operands = (True, False)
|
|
1537
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
1538
|
+
else:
|
|
1539
|
+
raise SyntaxError(
|
|
1540
|
+
"Invalid operand types: KNOTB "
|
|
1541
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1542
|
+
)
|
|
1543
|
+
if nervapy.stream.active_stream is not None:
|
|
1544
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1545
|
+
|
|
1546
|
+
|
|
1547
|
+
class KNOTW(Instruction):
|
|
1548
|
+
"""NOT 16-bit Mask Register"""
|
|
1549
|
+
|
|
1550
|
+
def __init__(self, *args, **kwargs):
|
|
1551
|
+
"""Supported forms:
|
|
1552
|
+
|
|
1553
|
+
* KNOTW(k, k) [AVX512F]
|
|
1554
|
+
"""
|
|
1555
|
+
|
|
1556
|
+
origin = kwargs.get("origin")
|
|
1557
|
+
prototype = kwargs.get("prototype")
|
|
1558
|
+
if (
|
|
1559
|
+
origin is None
|
|
1560
|
+
and prototype is None
|
|
1561
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1562
|
+
):
|
|
1563
|
+
origin = inspect.stack()
|
|
1564
|
+
super(KNOTW, self).__init__("KNOTW", origin=origin, prototype=prototype)
|
|
1565
|
+
self.operands = tuple(map(check_operand, args))
|
|
1566
|
+
if len(self.operands) != 2:
|
|
1567
|
+
raise SyntaxError('Instruction "KNOTW" requires 2 operands')
|
|
1568
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
1569
|
+
self.encodings.append(
|
|
1570
|
+
(
|
|
1571
|
+
0x40,
|
|
1572
|
+
lambda op, vex3=False: vex2(0, 0, None, 0, vex3)
|
|
1573
|
+
+ bytearray([0x44, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
1574
|
+
)
|
|
1575
|
+
)
|
|
1576
|
+
self.in_regs = (False, True)
|
|
1577
|
+
self.out_regs = (True, False)
|
|
1578
|
+
self.out_operands = (True, False)
|
|
1579
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512f])
|
|
1580
|
+
else:
|
|
1581
|
+
raise SyntaxError(
|
|
1582
|
+
"Invalid operand types: KNOTW "
|
|
1583
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1584
|
+
)
|
|
1585
|
+
if nervapy.stream.active_stream is not None:
|
|
1586
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1587
|
+
|
|
1588
|
+
|
|
1589
|
+
class KNOTD(Instruction):
|
|
1590
|
+
"""NOT 32-bit Mask Register"""
|
|
1591
|
+
|
|
1592
|
+
def __init__(self, *args, **kwargs):
|
|
1593
|
+
"""Supported forms:
|
|
1594
|
+
|
|
1595
|
+
* KNOTD(k, k) [AVX512BW]
|
|
1596
|
+
"""
|
|
1597
|
+
|
|
1598
|
+
origin = kwargs.get("origin")
|
|
1599
|
+
prototype = kwargs.get("prototype")
|
|
1600
|
+
if (
|
|
1601
|
+
origin is None
|
|
1602
|
+
and prototype is None
|
|
1603
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1604
|
+
):
|
|
1605
|
+
origin = inspect.stack()
|
|
1606
|
+
super(KNOTD, self).__init__("KNOTD", origin=origin, prototype=prototype)
|
|
1607
|
+
self.operands = tuple(map(check_operand, args))
|
|
1608
|
+
if len(self.operands) != 2:
|
|
1609
|
+
raise SyntaxError('Instruction "KNOTD" requires 2 operands')
|
|
1610
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
1611
|
+
self.encodings.append(
|
|
1612
|
+
(
|
|
1613
|
+
0x00,
|
|
1614
|
+
lambda op: bytearray(
|
|
1615
|
+
[0xC4, 0xE1, 0xF9, 0x44, 0xC0 | op[0].lcode << 3 | op[1].lcode]
|
|
1616
|
+
),
|
|
1617
|
+
)
|
|
1618
|
+
)
|
|
1619
|
+
self.in_regs = (False, True)
|
|
1620
|
+
self.out_regs = (True, False)
|
|
1621
|
+
self.out_operands = (True, False)
|
|
1622
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
1623
|
+
else:
|
|
1624
|
+
raise SyntaxError(
|
|
1625
|
+
"Invalid operand types: KNOTD "
|
|
1626
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1627
|
+
)
|
|
1628
|
+
if nervapy.stream.active_stream is not None:
|
|
1629
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1630
|
+
|
|
1631
|
+
|
|
1632
|
+
class KNOTQ(Instruction):
|
|
1633
|
+
"""NOT 64-bit Mask Register"""
|
|
1634
|
+
|
|
1635
|
+
def __init__(self, *args, **kwargs):
|
|
1636
|
+
"""Supported forms:
|
|
1637
|
+
|
|
1638
|
+
* KNOTQ(k, k) [AVX512BW]
|
|
1639
|
+
"""
|
|
1640
|
+
|
|
1641
|
+
origin = kwargs.get("origin")
|
|
1642
|
+
prototype = kwargs.get("prototype")
|
|
1643
|
+
if (
|
|
1644
|
+
origin is None
|
|
1645
|
+
and prototype is None
|
|
1646
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1647
|
+
):
|
|
1648
|
+
origin = inspect.stack()
|
|
1649
|
+
super(KNOTQ, self).__init__("KNOTQ", origin=origin, prototype=prototype)
|
|
1650
|
+
self.operands = tuple(map(check_operand, args))
|
|
1651
|
+
if len(self.operands) != 2:
|
|
1652
|
+
raise SyntaxError('Instruction "KNOTQ" requires 2 operands')
|
|
1653
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
1654
|
+
self.encodings.append(
|
|
1655
|
+
(
|
|
1656
|
+
0x00,
|
|
1657
|
+
lambda op: bytearray(
|
|
1658
|
+
[0xC4, 0xE1, 0xF8, 0x44, 0xC0 | op[0].lcode << 3 | op[1].lcode]
|
|
1659
|
+
),
|
|
1660
|
+
)
|
|
1661
|
+
)
|
|
1662
|
+
self.in_regs = (False, True)
|
|
1663
|
+
self.out_regs = (True, False)
|
|
1664
|
+
self.out_operands = (True, False)
|
|
1665
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
1666
|
+
else:
|
|
1667
|
+
raise SyntaxError(
|
|
1668
|
+
"Invalid operand types: KNOTQ "
|
|
1669
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1670
|
+
)
|
|
1671
|
+
if nervapy.stream.active_stream is not None:
|
|
1672
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1673
|
+
|
|
1674
|
+
|
|
1675
|
+
class KUNPCKBW(Instruction):
|
|
1676
|
+
"""Unpack and Interleave 8-bit Masks"""
|
|
1677
|
+
|
|
1678
|
+
def __init__(self, *args, **kwargs):
|
|
1679
|
+
"""Supported forms:
|
|
1680
|
+
|
|
1681
|
+
* KUNPCKBW(k, k, k) [AVX512F]
|
|
1682
|
+
"""
|
|
1683
|
+
|
|
1684
|
+
origin = kwargs.get("origin")
|
|
1685
|
+
prototype = kwargs.get("prototype")
|
|
1686
|
+
if (
|
|
1687
|
+
origin is None
|
|
1688
|
+
and prototype is None
|
|
1689
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1690
|
+
):
|
|
1691
|
+
origin = inspect.stack()
|
|
1692
|
+
super(KUNPCKBW, self).__init__("KUNPCKBW", origin=origin, prototype=prototype)
|
|
1693
|
+
self.operands = tuple(map(check_operand, args))
|
|
1694
|
+
if len(self.operands) != 3:
|
|
1695
|
+
raise SyntaxError('Instruction "KUNPCKBW" requires 3 operands')
|
|
1696
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
1697
|
+
self.encodings.append(
|
|
1698
|
+
(
|
|
1699
|
+
0x40,
|
|
1700
|
+
lambda op, vex3=False: vex2(5, 0, None, op[1].hlcode, vex3)
|
|
1701
|
+
+ bytearray([0x4B, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
1702
|
+
)
|
|
1703
|
+
)
|
|
1704
|
+
self.in_regs = (False, True, True)
|
|
1705
|
+
self.out_regs = (True, False, False)
|
|
1706
|
+
self.out_operands = (True, False, False)
|
|
1707
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512f])
|
|
1708
|
+
else:
|
|
1709
|
+
raise SyntaxError(
|
|
1710
|
+
"Invalid operand types: KUNPCKBW "
|
|
1711
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1712
|
+
)
|
|
1713
|
+
if nervapy.stream.active_stream is not None:
|
|
1714
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1715
|
+
|
|
1716
|
+
|
|
1717
|
+
class KUNPCKWD(Instruction):
|
|
1718
|
+
"""Unpack and Interleave 16-bit Masks"""
|
|
1719
|
+
|
|
1720
|
+
def __init__(self, *args, **kwargs):
|
|
1721
|
+
"""Supported forms:
|
|
1722
|
+
|
|
1723
|
+
* KUNPCKWD(k, k, k) [AVX512BW]
|
|
1724
|
+
"""
|
|
1725
|
+
|
|
1726
|
+
origin = kwargs.get("origin")
|
|
1727
|
+
prototype = kwargs.get("prototype")
|
|
1728
|
+
if (
|
|
1729
|
+
origin is None
|
|
1730
|
+
and prototype is None
|
|
1731
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1732
|
+
):
|
|
1733
|
+
origin = inspect.stack()
|
|
1734
|
+
super(KUNPCKWD, self).__init__("KUNPCKWD", origin=origin, prototype=prototype)
|
|
1735
|
+
self.operands = tuple(map(check_operand, args))
|
|
1736
|
+
if len(self.operands) != 3:
|
|
1737
|
+
raise SyntaxError('Instruction "KUNPCKWD" requires 3 operands')
|
|
1738
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
1739
|
+
self.encodings.append(
|
|
1740
|
+
(
|
|
1741
|
+
0x40,
|
|
1742
|
+
lambda op, vex3=False: vex2(4, 0, None, op[1].hlcode, vex3)
|
|
1743
|
+
+ bytearray([0x4B, 0xC0 | op[0].lcode << 3 | op[2].lcode]),
|
|
1744
|
+
)
|
|
1745
|
+
)
|
|
1746
|
+
self.in_regs = (False, True, True)
|
|
1747
|
+
self.out_regs = (True, False, False)
|
|
1748
|
+
self.out_operands = (True, False, False)
|
|
1749
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
1750
|
+
else:
|
|
1751
|
+
raise SyntaxError(
|
|
1752
|
+
"Invalid operand types: KUNPCKWD "
|
|
1753
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1754
|
+
)
|
|
1755
|
+
if nervapy.stream.active_stream is not None:
|
|
1756
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1757
|
+
|
|
1758
|
+
|
|
1759
|
+
class KUNPCKDQ(Instruction):
|
|
1760
|
+
"""Unpack and Interleave 32-bit Masks"""
|
|
1761
|
+
|
|
1762
|
+
def __init__(self, *args, **kwargs):
|
|
1763
|
+
"""Supported forms:
|
|
1764
|
+
|
|
1765
|
+
* KUNPCKDQ(k, k, k) [AVX512BW]
|
|
1766
|
+
"""
|
|
1767
|
+
|
|
1768
|
+
origin = kwargs.get("origin")
|
|
1769
|
+
prototype = kwargs.get("prototype")
|
|
1770
|
+
if (
|
|
1771
|
+
origin is None
|
|
1772
|
+
and prototype is None
|
|
1773
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1774
|
+
):
|
|
1775
|
+
origin = inspect.stack()
|
|
1776
|
+
super(KUNPCKDQ, self).__init__("KUNPCKDQ", origin=origin, prototype=prototype)
|
|
1777
|
+
self.operands = tuple(map(check_operand, args))
|
|
1778
|
+
if len(self.operands) != 3:
|
|
1779
|
+
raise SyntaxError('Instruction "KUNPCKDQ" requires 3 operands')
|
|
1780
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]) and is_k(self.operands[2]):
|
|
1781
|
+
self.encodings.append(
|
|
1782
|
+
(
|
|
1783
|
+
0x00,
|
|
1784
|
+
lambda op: bytearray(
|
|
1785
|
+
[
|
|
1786
|
+
0xC4,
|
|
1787
|
+
0xE1,
|
|
1788
|
+
0xFC ^ (op[1].hlcode << 3),
|
|
1789
|
+
0x4B,
|
|
1790
|
+
0xC0 | op[0].lcode << 3 | op[2].lcode,
|
|
1791
|
+
]
|
|
1792
|
+
),
|
|
1793
|
+
)
|
|
1794
|
+
)
|
|
1795
|
+
self.in_regs = (False, True, True)
|
|
1796
|
+
self.out_regs = (True, False, False)
|
|
1797
|
+
self.out_operands = (True, False, False)
|
|
1798
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
1799
|
+
else:
|
|
1800
|
+
raise SyntaxError(
|
|
1801
|
+
"Invalid operand types: KUNPCKDQ "
|
|
1802
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1803
|
+
)
|
|
1804
|
+
if nervapy.stream.active_stream is not None:
|
|
1805
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1806
|
+
|
|
1807
|
+
|
|
1808
|
+
class KTESTB(Instruction):
|
|
1809
|
+
"""Bit Test 8-bit Masks and Set Flags"""
|
|
1810
|
+
|
|
1811
|
+
def __init__(self, *args, **kwargs):
|
|
1812
|
+
"""Supported forms:
|
|
1813
|
+
|
|
1814
|
+
* KTESTB(k, k) [AVX512DQ]
|
|
1815
|
+
"""
|
|
1816
|
+
|
|
1817
|
+
origin = kwargs.get("origin")
|
|
1818
|
+
prototype = kwargs.get("prototype")
|
|
1819
|
+
if (
|
|
1820
|
+
origin is None
|
|
1821
|
+
and prototype is None
|
|
1822
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1823
|
+
):
|
|
1824
|
+
origin = inspect.stack()
|
|
1825
|
+
super(KTESTB, self).__init__("KTESTB", origin=origin, prototype=prototype)
|
|
1826
|
+
self.operands = tuple(map(check_operand, args))
|
|
1827
|
+
if len(self.operands) != 2:
|
|
1828
|
+
raise SyntaxError('Instruction "KTESTB" requires 2 operands')
|
|
1829
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
1830
|
+
self.encodings.append(
|
|
1831
|
+
(
|
|
1832
|
+
0x40,
|
|
1833
|
+
lambda op, vex3=False: vex2(1, 0, None, 0, vex3)
|
|
1834
|
+
+ bytearray([0x99, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
1835
|
+
)
|
|
1836
|
+
)
|
|
1837
|
+
self.in_regs = (True, True)
|
|
1838
|
+
self.out_regs = (False, False)
|
|
1839
|
+
self.out_operands = (False, False)
|
|
1840
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
1841
|
+
else:
|
|
1842
|
+
raise SyntaxError(
|
|
1843
|
+
"Invalid operand types: KTESTB "
|
|
1844
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1845
|
+
)
|
|
1846
|
+
if nervapy.stream.active_stream is not None:
|
|
1847
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1848
|
+
|
|
1849
|
+
|
|
1850
|
+
class KTESTW(Instruction):
|
|
1851
|
+
"""Bit Test 16-bit Masks and Set Flags"""
|
|
1852
|
+
|
|
1853
|
+
def __init__(self, *args, **kwargs):
|
|
1854
|
+
"""Supported forms:
|
|
1855
|
+
|
|
1856
|
+
* KTESTW(k, k) [AVX512DQ]
|
|
1857
|
+
"""
|
|
1858
|
+
|
|
1859
|
+
origin = kwargs.get("origin")
|
|
1860
|
+
prototype = kwargs.get("prototype")
|
|
1861
|
+
if (
|
|
1862
|
+
origin is None
|
|
1863
|
+
and prototype is None
|
|
1864
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1865
|
+
):
|
|
1866
|
+
origin = inspect.stack()
|
|
1867
|
+
super(KTESTW, self).__init__("KTESTW", origin=origin, prototype=prototype)
|
|
1868
|
+
self.operands = tuple(map(check_operand, args))
|
|
1869
|
+
if len(self.operands) != 2:
|
|
1870
|
+
raise SyntaxError('Instruction "KTESTW" requires 2 operands')
|
|
1871
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
1872
|
+
self.encodings.append(
|
|
1873
|
+
(
|
|
1874
|
+
0x40,
|
|
1875
|
+
lambda op, vex3=False: vex2(0, 0, None, 0, vex3)
|
|
1876
|
+
+ bytearray([0x99, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
1877
|
+
)
|
|
1878
|
+
)
|
|
1879
|
+
self.in_regs = (True, True)
|
|
1880
|
+
self.out_regs = (False, False)
|
|
1881
|
+
self.out_operands = (False, False)
|
|
1882
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
1883
|
+
else:
|
|
1884
|
+
raise SyntaxError(
|
|
1885
|
+
"Invalid operand types: KTESTW "
|
|
1886
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1887
|
+
)
|
|
1888
|
+
if nervapy.stream.active_stream is not None:
|
|
1889
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1890
|
+
|
|
1891
|
+
|
|
1892
|
+
class KTESTD(Instruction):
|
|
1893
|
+
"""Bit Test 32-bit Masks and Set Flags"""
|
|
1894
|
+
|
|
1895
|
+
def __init__(self, *args, **kwargs):
|
|
1896
|
+
"""Supported forms:
|
|
1897
|
+
|
|
1898
|
+
* KTESTD(k, k) [AVX512BW]
|
|
1899
|
+
"""
|
|
1900
|
+
|
|
1901
|
+
origin = kwargs.get("origin")
|
|
1902
|
+
prototype = kwargs.get("prototype")
|
|
1903
|
+
if (
|
|
1904
|
+
origin is None
|
|
1905
|
+
and prototype is None
|
|
1906
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1907
|
+
):
|
|
1908
|
+
origin = inspect.stack()
|
|
1909
|
+
super(KTESTD, self).__init__("KTESTD", origin=origin, prototype=prototype)
|
|
1910
|
+
self.operands = tuple(map(check_operand, args))
|
|
1911
|
+
if len(self.operands) != 2:
|
|
1912
|
+
raise SyntaxError('Instruction "KTESTD" requires 2 operands')
|
|
1913
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
1914
|
+
self.encodings.append(
|
|
1915
|
+
(
|
|
1916
|
+
0x00,
|
|
1917
|
+
lambda op: bytearray(
|
|
1918
|
+
[0xC4, 0xE1, 0xF9, 0x99, 0xC0 | op[0].lcode << 3 | op[1].lcode]
|
|
1919
|
+
),
|
|
1920
|
+
)
|
|
1921
|
+
)
|
|
1922
|
+
self.in_regs = (True, True)
|
|
1923
|
+
self.out_regs = (False, False)
|
|
1924
|
+
self.out_operands = (False, False)
|
|
1925
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
1926
|
+
else:
|
|
1927
|
+
raise SyntaxError(
|
|
1928
|
+
"Invalid operand types: KTESTD "
|
|
1929
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1930
|
+
)
|
|
1931
|
+
if nervapy.stream.active_stream is not None:
|
|
1932
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1933
|
+
|
|
1934
|
+
|
|
1935
|
+
class KTESTQ(Instruction):
|
|
1936
|
+
"""Bit Test 64-bit Masks and Set Flags"""
|
|
1937
|
+
|
|
1938
|
+
def __init__(self, *args, **kwargs):
|
|
1939
|
+
"""Supported forms:
|
|
1940
|
+
|
|
1941
|
+
* KTESTQ(k, k) [AVX512BW]
|
|
1942
|
+
"""
|
|
1943
|
+
|
|
1944
|
+
origin = kwargs.get("origin")
|
|
1945
|
+
prototype = kwargs.get("prototype")
|
|
1946
|
+
if (
|
|
1947
|
+
origin is None
|
|
1948
|
+
and prototype is None
|
|
1949
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1950
|
+
):
|
|
1951
|
+
origin = inspect.stack()
|
|
1952
|
+
super(KTESTQ, self).__init__("KTESTQ", origin=origin, prototype=prototype)
|
|
1953
|
+
self.operands = tuple(map(check_operand, args))
|
|
1954
|
+
if len(self.operands) != 2:
|
|
1955
|
+
raise SyntaxError('Instruction "KTESTQ" requires 2 operands')
|
|
1956
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
1957
|
+
self.encodings.append(
|
|
1958
|
+
(
|
|
1959
|
+
0x00,
|
|
1960
|
+
lambda op: bytearray(
|
|
1961
|
+
[0xC4, 0xE1, 0xF8, 0x99, 0xC0 | op[0].lcode << 3 | op[1].lcode]
|
|
1962
|
+
),
|
|
1963
|
+
)
|
|
1964
|
+
)
|
|
1965
|
+
self.in_regs = (True, True)
|
|
1966
|
+
self.out_regs = (False, False)
|
|
1967
|
+
self.out_operands = (False, False)
|
|
1968
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
1969
|
+
else:
|
|
1970
|
+
raise SyntaxError(
|
|
1971
|
+
"Invalid operand types: KTESTQ "
|
|
1972
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
1973
|
+
)
|
|
1974
|
+
if nervapy.stream.active_stream is not None:
|
|
1975
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
1976
|
+
|
|
1977
|
+
|
|
1978
|
+
class KORTESTB(Instruction):
|
|
1979
|
+
"""OR 8-bit Masks and Set Flags"""
|
|
1980
|
+
|
|
1981
|
+
def __init__(self, *args, **kwargs):
|
|
1982
|
+
"""Supported forms:
|
|
1983
|
+
|
|
1984
|
+
* KORTESTB(k, k) [AVX512DQ]
|
|
1985
|
+
"""
|
|
1986
|
+
|
|
1987
|
+
origin = kwargs.get("origin")
|
|
1988
|
+
prototype = kwargs.get("prototype")
|
|
1989
|
+
if (
|
|
1990
|
+
origin is None
|
|
1991
|
+
and prototype is None
|
|
1992
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
1993
|
+
):
|
|
1994
|
+
origin = inspect.stack()
|
|
1995
|
+
super(KORTESTB, self).__init__("KORTESTB", origin=origin, prototype=prototype)
|
|
1996
|
+
self.operands = tuple(map(check_operand, args))
|
|
1997
|
+
if len(self.operands) != 2:
|
|
1998
|
+
raise SyntaxError('Instruction "KORTESTB" requires 2 operands')
|
|
1999
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
2000
|
+
self.encodings.append(
|
|
2001
|
+
(
|
|
2002
|
+
0x40,
|
|
2003
|
+
lambda op, vex3=False: vex2(1, 0, None, 0, vex3)
|
|
2004
|
+
+ bytearray([0x98, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
2005
|
+
)
|
|
2006
|
+
)
|
|
2007
|
+
self.in_regs = (True, True)
|
|
2008
|
+
self.out_regs = (False, False)
|
|
2009
|
+
self.out_operands = (False, False)
|
|
2010
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
2011
|
+
else:
|
|
2012
|
+
raise SyntaxError(
|
|
2013
|
+
"Invalid operand types: KORTESTB "
|
|
2014
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
2015
|
+
)
|
|
2016
|
+
if nervapy.stream.active_stream is not None:
|
|
2017
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
2018
|
+
|
|
2019
|
+
|
|
2020
|
+
class KORTESTW(Instruction):
|
|
2021
|
+
"""OR 16-bit Masks and Set Flags"""
|
|
2022
|
+
|
|
2023
|
+
def __init__(self, *args, **kwargs):
|
|
2024
|
+
"""Supported forms:
|
|
2025
|
+
|
|
2026
|
+
* KORTESTW(k, k) [AVX512F]
|
|
2027
|
+
"""
|
|
2028
|
+
|
|
2029
|
+
origin = kwargs.get("origin")
|
|
2030
|
+
prototype = kwargs.get("prototype")
|
|
2031
|
+
if (
|
|
2032
|
+
origin is None
|
|
2033
|
+
and prototype is None
|
|
2034
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
2035
|
+
):
|
|
2036
|
+
origin = inspect.stack()
|
|
2037
|
+
super(KORTESTW, self).__init__("KORTESTW", origin=origin, prototype=prototype)
|
|
2038
|
+
self.operands = tuple(map(check_operand, args))
|
|
2039
|
+
if len(self.operands) != 2:
|
|
2040
|
+
raise SyntaxError('Instruction "KORTESTW" requires 2 operands')
|
|
2041
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
2042
|
+
self.encodings.append(
|
|
2043
|
+
(
|
|
2044
|
+
0x40,
|
|
2045
|
+
lambda op, vex3=False: vex2(0, 0, None, 0, vex3)
|
|
2046
|
+
+ bytearray([0x98, 0xC0 | op[0].lcode << 3 | op[1].lcode]),
|
|
2047
|
+
)
|
|
2048
|
+
)
|
|
2049
|
+
self.in_regs = (True, True)
|
|
2050
|
+
self.out_regs = (False, False)
|
|
2051
|
+
self.out_operands = (False, False)
|
|
2052
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512f])
|
|
2053
|
+
else:
|
|
2054
|
+
raise SyntaxError(
|
|
2055
|
+
"Invalid operand types: KORTESTW "
|
|
2056
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
2057
|
+
)
|
|
2058
|
+
if nervapy.stream.active_stream is not None:
|
|
2059
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
2060
|
+
|
|
2061
|
+
|
|
2062
|
+
class KORTESTD(Instruction):
|
|
2063
|
+
"""OR 32-bit Masks and Set Flags"""
|
|
2064
|
+
|
|
2065
|
+
def __init__(self, *args, **kwargs):
|
|
2066
|
+
"""Supported forms:
|
|
2067
|
+
|
|
2068
|
+
* KORTESTD(k, k) [AVX512BW]
|
|
2069
|
+
"""
|
|
2070
|
+
|
|
2071
|
+
origin = kwargs.get("origin")
|
|
2072
|
+
prototype = kwargs.get("prototype")
|
|
2073
|
+
if (
|
|
2074
|
+
origin is None
|
|
2075
|
+
and prototype is None
|
|
2076
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
2077
|
+
):
|
|
2078
|
+
origin = inspect.stack()
|
|
2079
|
+
super(KORTESTD, self).__init__("KORTESTD", origin=origin, prototype=prototype)
|
|
2080
|
+
self.operands = tuple(map(check_operand, args))
|
|
2081
|
+
if len(self.operands) != 2:
|
|
2082
|
+
raise SyntaxError('Instruction "KORTESTD" requires 2 operands')
|
|
2083
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
2084
|
+
self.encodings.append(
|
|
2085
|
+
(
|
|
2086
|
+
0x00,
|
|
2087
|
+
lambda op: bytearray(
|
|
2088
|
+
[0xC4, 0xE1, 0xF9, 0x98, 0xC0 | op[0].lcode << 3 | op[1].lcode]
|
|
2089
|
+
),
|
|
2090
|
+
)
|
|
2091
|
+
)
|
|
2092
|
+
self.in_regs = (True, True)
|
|
2093
|
+
self.out_regs = (False, False)
|
|
2094
|
+
self.out_operands = (False, False)
|
|
2095
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
2096
|
+
else:
|
|
2097
|
+
raise SyntaxError(
|
|
2098
|
+
"Invalid operand types: KORTESTD "
|
|
2099
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
2100
|
+
)
|
|
2101
|
+
if nervapy.stream.active_stream is not None:
|
|
2102
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
2103
|
+
|
|
2104
|
+
|
|
2105
|
+
class KORTESTQ(Instruction):
|
|
2106
|
+
"""OR 64-bit Masks and Set Flags"""
|
|
2107
|
+
|
|
2108
|
+
def __init__(self, *args, **kwargs):
|
|
2109
|
+
"""Supported forms:
|
|
2110
|
+
|
|
2111
|
+
* KORTESTQ(k, k) [AVX512BW]
|
|
2112
|
+
"""
|
|
2113
|
+
|
|
2114
|
+
origin = kwargs.get("origin")
|
|
2115
|
+
prototype = kwargs.get("prototype")
|
|
2116
|
+
if (
|
|
2117
|
+
origin is None
|
|
2118
|
+
and prototype is None
|
|
2119
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
2120
|
+
):
|
|
2121
|
+
origin = inspect.stack()
|
|
2122
|
+
super(KORTESTQ, self).__init__("KORTESTQ", origin=origin, prototype=prototype)
|
|
2123
|
+
self.operands = tuple(map(check_operand, args))
|
|
2124
|
+
if len(self.operands) != 2:
|
|
2125
|
+
raise SyntaxError('Instruction "KORTESTQ" requires 2 operands')
|
|
2126
|
+
if is_k(self.operands[0]) and is_k(self.operands[1]):
|
|
2127
|
+
self.encodings.append(
|
|
2128
|
+
(
|
|
2129
|
+
0x00,
|
|
2130
|
+
lambda op: bytearray(
|
|
2131
|
+
[0xC4, 0xE1, 0xF8, 0x98, 0xC0 | op[0].lcode << 3 | op[1].lcode]
|
|
2132
|
+
),
|
|
2133
|
+
)
|
|
2134
|
+
)
|
|
2135
|
+
self.in_regs = (True, True)
|
|
2136
|
+
self.out_regs = (False, False)
|
|
2137
|
+
self.out_operands = (False, False)
|
|
2138
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
2139
|
+
else:
|
|
2140
|
+
raise SyntaxError(
|
|
2141
|
+
"Invalid operand types: KORTESTQ "
|
|
2142
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
2143
|
+
)
|
|
2144
|
+
if nervapy.stream.active_stream is not None:
|
|
2145
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
2146
|
+
|
|
2147
|
+
|
|
2148
|
+
class KSHIFTLB(Instruction):
|
|
2149
|
+
"""Shift Left 8-bit Masks"""
|
|
2150
|
+
|
|
2151
|
+
def __init__(self, *args, **kwargs):
|
|
2152
|
+
"""Supported forms:
|
|
2153
|
+
|
|
2154
|
+
* KSHIFTLB(k, k, imm8) [AVX512DQ]
|
|
2155
|
+
"""
|
|
2156
|
+
|
|
2157
|
+
origin = kwargs.get("origin")
|
|
2158
|
+
prototype = kwargs.get("prototype")
|
|
2159
|
+
if (
|
|
2160
|
+
origin is None
|
|
2161
|
+
and prototype is None
|
|
2162
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
2163
|
+
):
|
|
2164
|
+
origin = inspect.stack()
|
|
2165
|
+
super(KSHIFTLB, self).__init__("KSHIFTLB", origin=origin, prototype=prototype)
|
|
2166
|
+
self.operands = tuple(map(check_operand, args))
|
|
2167
|
+
if len(self.operands) != 3:
|
|
2168
|
+
raise SyntaxError('Instruction "KSHIFTLB" requires 3 operands')
|
|
2169
|
+
if (
|
|
2170
|
+
is_k(self.operands[0])
|
|
2171
|
+
and is_k(self.operands[1])
|
|
2172
|
+
and is_imm(self.operands[2])
|
|
2173
|
+
):
|
|
2174
|
+
if not is_imm8(self.operands[2]):
|
|
2175
|
+
raise ValueError("Argument #2 can not be encoded as imm8")
|
|
2176
|
+
self.encodings.append(
|
|
2177
|
+
(
|
|
2178
|
+
0x00,
|
|
2179
|
+
lambda op: bytearray(
|
|
2180
|
+
[
|
|
2181
|
+
0xC4,
|
|
2182
|
+
0xE3,
|
|
2183
|
+
0x79,
|
|
2184
|
+
0x32,
|
|
2185
|
+
0xC0 | op[0].lcode << 3 | op[1].lcode,
|
|
2186
|
+
op[2] & 0xFF,
|
|
2187
|
+
]
|
|
2188
|
+
),
|
|
2189
|
+
)
|
|
2190
|
+
)
|
|
2191
|
+
self.in_regs = (False, True, False)
|
|
2192
|
+
self.out_regs = (True, False, False)
|
|
2193
|
+
self.out_operands = (True, False, False)
|
|
2194
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
2195
|
+
else:
|
|
2196
|
+
raise SyntaxError(
|
|
2197
|
+
"Invalid operand types: KSHIFTLB "
|
|
2198
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
2199
|
+
)
|
|
2200
|
+
if nervapy.stream.active_stream is not None:
|
|
2201
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
2202
|
+
|
|
2203
|
+
|
|
2204
|
+
class KSHIFTLW(Instruction):
|
|
2205
|
+
"""Shift Left 16-bit Masks"""
|
|
2206
|
+
|
|
2207
|
+
def __init__(self, *args, **kwargs):
|
|
2208
|
+
"""Supported forms:
|
|
2209
|
+
|
|
2210
|
+
* KSHIFTLW(k, k, imm8) [AVX512F]
|
|
2211
|
+
"""
|
|
2212
|
+
|
|
2213
|
+
origin = kwargs.get("origin")
|
|
2214
|
+
prototype = kwargs.get("prototype")
|
|
2215
|
+
if (
|
|
2216
|
+
origin is None
|
|
2217
|
+
and prototype is None
|
|
2218
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
2219
|
+
):
|
|
2220
|
+
origin = inspect.stack()
|
|
2221
|
+
super(KSHIFTLW, self).__init__("KSHIFTLW", origin=origin, prototype=prototype)
|
|
2222
|
+
self.operands = tuple(map(check_operand, args))
|
|
2223
|
+
if len(self.operands) != 3:
|
|
2224
|
+
raise SyntaxError('Instruction "KSHIFTLW" requires 3 operands')
|
|
2225
|
+
if (
|
|
2226
|
+
is_k(self.operands[0])
|
|
2227
|
+
and is_k(self.operands[1])
|
|
2228
|
+
and is_imm(self.operands[2])
|
|
2229
|
+
):
|
|
2230
|
+
if not is_imm8(self.operands[2]):
|
|
2231
|
+
raise ValueError("Argument #2 can not be encoded as imm8")
|
|
2232
|
+
self.encodings.append(
|
|
2233
|
+
(
|
|
2234
|
+
0x00,
|
|
2235
|
+
lambda op: bytearray(
|
|
2236
|
+
[
|
|
2237
|
+
0xC4,
|
|
2238
|
+
0xE3,
|
|
2239
|
+
0xF9,
|
|
2240
|
+
0x32,
|
|
2241
|
+
0xC0 | op[0].lcode << 3 | op[1].lcode,
|
|
2242
|
+
op[2] & 0xFF,
|
|
2243
|
+
]
|
|
2244
|
+
),
|
|
2245
|
+
)
|
|
2246
|
+
)
|
|
2247
|
+
self.in_regs = (False, True, False)
|
|
2248
|
+
self.out_regs = (True, False, False)
|
|
2249
|
+
self.out_operands = (True, False, False)
|
|
2250
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512f])
|
|
2251
|
+
else:
|
|
2252
|
+
raise SyntaxError(
|
|
2253
|
+
"Invalid operand types: KSHIFTLW "
|
|
2254
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
2255
|
+
)
|
|
2256
|
+
if nervapy.stream.active_stream is not None:
|
|
2257
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
2258
|
+
|
|
2259
|
+
|
|
2260
|
+
class KSHIFTLD(Instruction):
|
|
2261
|
+
"""Shift Left 32-bit Masks"""
|
|
2262
|
+
|
|
2263
|
+
def __init__(self, *args, **kwargs):
|
|
2264
|
+
"""Supported forms:
|
|
2265
|
+
|
|
2266
|
+
* KSHIFTLD(k, k, imm8) [AVX512BW]
|
|
2267
|
+
"""
|
|
2268
|
+
|
|
2269
|
+
origin = kwargs.get("origin")
|
|
2270
|
+
prototype = kwargs.get("prototype")
|
|
2271
|
+
if (
|
|
2272
|
+
origin is None
|
|
2273
|
+
and prototype is None
|
|
2274
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
2275
|
+
):
|
|
2276
|
+
origin = inspect.stack()
|
|
2277
|
+
super(KSHIFTLD, self).__init__("KSHIFTLD", origin=origin, prototype=prototype)
|
|
2278
|
+
self.operands = tuple(map(check_operand, args))
|
|
2279
|
+
if len(self.operands) != 3:
|
|
2280
|
+
raise SyntaxError('Instruction "KSHIFTLD" requires 3 operands')
|
|
2281
|
+
if (
|
|
2282
|
+
is_k(self.operands[0])
|
|
2283
|
+
and is_k(self.operands[1])
|
|
2284
|
+
and is_imm(self.operands[2])
|
|
2285
|
+
):
|
|
2286
|
+
if not is_imm8(self.operands[2]):
|
|
2287
|
+
raise ValueError("Argument #2 can not be encoded as imm8")
|
|
2288
|
+
self.encodings.append(
|
|
2289
|
+
(
|
|
2290
|
+
0x00,
|
|
2291
|
+
lambda op: bytearray(
|
|
2292
|
+
[
|
|
2293
|
+
0xC4,
|
|
2294
|
+
0xE3,
|
|
2295
|
+
0x79,
|
|
2296
|
+
0x33,
|
|
2297
|
+
0xC0 | op[0].lcode << 3 | op[1].lcode,
|
|
2298
|
+
op[2] & 0xFF,
|
|
2299
|
+
]
|
|
2300
|
+
),
|
|
2301
|
+
)
|
|
2302
|
+
)
|
|
2303
|
+
self.in_regs = (False, True, False)
|
|
2304
|
+
self.out_regs = (True, False, False)
|
|
2305
|
+
self.out_operands = (True, False, False)
|
|
2306
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
2307
|
+
else:
|
|
2308
|
+
raise SyntaxError(
|
|
2309
|
+
"Invalid operand types: KSHIFTLD "
|
|
2310
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
2311
|
+
)
|
|
2312
|
+
if nervapy.stream.active_stream is not None:
|
|
2313
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
2314
|
+
|
|
2315
|
+
|
|
2316
|
+
class KSHIFTLQ(Instruction):
|
|
2317
|
+
"""Shift Left 64-bit Masks"""
|
|
2318
|
+
|
|
2319
|
+
def __init__(self, *args, **kwargs):
|
|
2320
|
+
"""Supported forms:
|
|
2321
|
+
|
|
2322
|
+
* KSHIFTLQ(k, k, imm8) [AVX512BW]
|
|
2323
|
+
"""
|
|
2324
|
+
|
|
2325
|
+
origin = kwargs.get("origin")
|
|
2326
|
+
prototype = kwargs.get("prototype")
|
|
2327
|
+
if (
|
|
2328
|
+
origin is None
|
|
2329
|
+
and prototype is None
|
|
2330
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
2331
|
+
):
|
|
2332
|
+
origin = inspect.stack()
|
|
2333
|
+
super(KSHIFTLQ, self).__init__("KSHIFTLQ", origin=origin, prototype=prototype)
|
|
2334
|
+
self.operands = tuple(map(check_operand, args))
|
|
2335
|
+
if len(self.operands) != 3:
|
|
2336
|
+
raise SyntaxError('Instruction "KSHIFTLQ" requires 3 operands')
|
|
2337
|
+
if (
|
|
2338
|
+
is_k(self.operands[0])
|
|
2339
|
+
and is_k(self.operands[1])
|
|
2340
|
+
and is_imm(self.operands[2])
|
|
2341
|
+
):
|
|
2342
|
+
if not is_imm8(self.operands[2]):
|
|
2343
|
+
raise ValueError("Argument #2 can not be encoded as imm8")
|
|
2344
|
+
self.encodings.append(
|
|
2345
|
+
(
|
|
2346
|
+
0x00,
|
|
2347
|
+
lambda op: bytearray(
|
|
2348
|
+
[
|
|
2349
|
+
0xC4,
|
|
2350
|
+
0xE3,
|
|
2351
|
+
0xF9,
|
|
2352
|
+
0x33,
|
|
2353
|
+
0xC0 | op[0].lcode << 3 | op[1].lcode,
|
|
2354
|
+
op[2] & 0xFF,
|
|
2355
|
+
]
|
|
2356
|
+
),
|
|
2357
|
+
)
|
|
2358
|
+
)
|
|
2359
|
+
self.in_regs = (False, True, False)
|
|
2360
|
+
self.out_regs = (True, False, False)
|
|
2361
|
+
self.out_operands = (True, False, False)
|
|
2362
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
2363
|
+
else:
|
|
2364
|
+
raise SyntaxError(
|
|
2365
|
+
"Invalid operand types: KSHIFTLQ "
|
|
2366
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
2367
|
+
)
|
|
2368
|
+
if nervapy.stream.active_stream is not None:
|
|
2369
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
2370
|
+
|
|
2371
|
+
|
|
2372
|
+
class KSHIFTRB(Instruction):
|
|
2373
|
+
"""Shift Right 8-bit Masks"""
|
|
2374
|
+
|
|
2375
|
+
def __init__(self, *args, **kwargs):
|
|
2376
|
+
"""Supported forms:
|
|
2377
|
+
|
|
2378
|
+
* KSHIFTRB(k, k, imm8) [AVX512DQ]
|
|
2379
|
+
"""
|
|
2380
|
+
|
|
2381
|
+
origin = kwargs.get("origin")
|
|
2382
|
+
prototype = kwargs.get("prototype")
|
|
2383
|
+
if (
|
|
2384
|
+
origin is None
|
|
2385
|
+
and prototype is None
|
|
2386
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
2387
|
+
):
|
|
2388
|
+
origin = inspect.stack()
|
|
2389
|
+
super(KSHIFTRB, self).__init__("KSHIFTRB", origin=origin, prototype=prototype)
|
|
2390
|
+
self.operands = tuple(map(check_operand, args))
|
|
2391
|
+
if len(self.operands) != 3:
|
|
2392
|
+
raise SyntaxError('Instruction "KSHIFTRB" requires 3 operands')
|
|
2393
|
+
if (
|
|
2394
|
+
is_k(self.operands[0])
|
|
2395
|
+
and is_k(self.operands[1])
|
|
2396
|
+
and is_imm(self.operands[2])
|
|
2397
|
+
):
|
|
2398
|
+
if not is_imm8(self.operands[2]):
|
|
2399
|
+
raise ValueError("Argument #2 can not be encoded as imm8")
|
|
2400
|
+
self.encodings.append(
|
|
2401
|
+
(
|
|
2402
|
+
0x00,
|
|
2403
|
+
lambda op: bytearray(
|
|
2404
|
+
[
|
|
2405
|
+
0xC4,
|
|
2406
|
+
0xE3,
|
|
2407
|
+
0x79,
|
|
2408
|
+
0x30,
|
|
2409
|
+
0xC0 | op[0].lcode << 3 | op[1].lcode,
|
|
2410
|
+
op[2] & 0xFF,
|
|
2411
|
+
]
|
|
2412
|
+
),
|
|
2413
|
+
)
|
|
2414
|
+
)
|
|
2415
|
+
self.in_regs = (False, True, False)
|
|
2416
|
+
self.out_regs = (True, False, False)
|
|
2417
|
+
self.out_operands = (True, False, False)
|
|
2418
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512dq])
|
|
2419
|
+
else:
|
|
2420
|
+
raise SyntaxError(
|
|
2421
|
+
"Invalid operand types: KSHIFTRB "
|
|
2422
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
2423
|
+
)
|
|
2424
|
+
if nervapy.stream.active_stream is not None:
|
|
2425
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
2426
|
+
|
|
2427
|
+
|
|
2428
|
+
class KSHIFTRW(Instruction):
|
|
2429
|
+
"""Shift Right 16-bit Masks"""
|
|
2430
|
+
|
|
2431
|
+
def __init__(self, *args, **kwargs):
|
|
2432
|
+
"""Supported forms:
|
|
2433
|
+
|
|
2434
|
+
* KSHIFTRW(k, k, imm8) [AVX512F]
|
|
2435
|
+
"""
|
|
2436
|
+
|
|
2437
|
+
origin = kwargs.get("origin")
|
|
2438
|
+
prototype = kwargs.get("prototype")
|
|
2439
|
+
if (
|
|
2440
|
+
origin is None
|
|
2441
|
+
and prototype is None
|
|
2442
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
2443
|
+
):
|
|
2444
|
+
origin = inspect.stack()
|
|
2445
|
+
super(KSHIFTRW, self).__init__("KSHIFTRW", origin=origin, prototype=prototype)
|
|
2446
|
+
self.operands = tuple(map(check_operand, args))
|
|
2447
|
+
if len(self.operands) != 3:
|
|
2448
|
+
raise SyntaxError('Instruction "KSHIFTRW" requires 3 operands')
|
|
2449
|
+
if (
|
|
2450
|
+
is_k(self.operands[0])
|
|
2451
|
+
and is_k(self.operands[1])
|
|
2452
|
+
and is_imm(self.operands[2])
|
|
2453
|
+
):
|
|
2454
|
+
if not is_imm8(self.operands[2]):
|
|
2455
|
+
raise ValueError("Argument #2 can not be encoded as imm8")
|
|
2456
|
+
self.encodings.append(
|
|
2457
|
+
(
|
|
2458
|
+
0x00,
|
|
2459
|
+
lambda op: bytearray(
|
|
2460
|
+
[
|
|
2461
|
+
0xC4,
|
|
2462
|
+
0xE3,
|
|
2463
|
+
0xF9,
|
|
2464
|
+
0x30,
|
|
2465
|
+
0xC0 | op[0].lcode << 3 | op[1].lcode,
|
|
2466
|
+
op[2] & 0xFF,
|
|
2467
|
+
]
|
|
2468
|
+
),
|
|
2469
|
+
)
|
|
2470
|
+
)
|
|
2471
|
+
self.in_regs = (False, True, False)
|
|
2472
|
+
self.out_regs = (True, False, False)
|
|
2473
|
+
self.out_operands = (True, False, False)
|
|
2474
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512f])
|
|
2475
|
+
else:
|
|
2476
|
+
raise SyntaxError(
|
|
2477
|
+
"Invalid operand types: KSHIFTRW "
|
|
2478
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
2479
|
+
)
|
|
2480
|
+
if nervapy.stream.active_stream is not None:
|
|
2481
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
2482
|
+
|
|
2483
|
+
|
|
2484
|
+
class KSHIFTRD(Instruction):
|
|
2485
|
+
"""Shift Right 32-bit Masks"""
|
|
2486
|
+
|
|
2487
|
+
def __init__(self, *args, **kwargs):
|
|
2488
|
+
"""Supported forms:
|
|
2489
|
+
|
|
2490
|
+
* KSHIFTRD(k, k, imm8) [AVX512BW]
|
|
2491
|
+
"""
|
|
2492
|
+
|
|
2493
|
+
origin = kwargs.get("origin")
|
|
2494
|
+
prototype = kwargs.get("prototype")
|
|
2495
|
+
if (
|
|
2496
|
+
origin is None
|
|
2497
|
+
and prototype is None
|
|
2498
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
2499
|
+
):
|
|
2500
|
+
origin = inspect.stack()
|
|
2501
|
+
super(KSHIFTRD, self).__init__("KSHIFTRD", origin=origin, prototype=prototype)
|
|
2502
|
+
self.operands = tuple(map(check_operand, args))
|
|
2503
|
+
if len(self.operands) != 3:
|
|
2504
|
+
raise SyntaxError('Instruction "KSHIFTRD" requires 3 operands')
|
|
2505
|
+
if (
|
|
2506
|
+
is_k(self.operands[0])
|
|
2507
|
+
and is_k(self.operands[1])
|
|
2508
|
+
and is_imm(self.operands[2])
|
|
2509
|
+
):
|
|
2510
|
+
if not is_imm8(self.operands[2]):
|
|
2511
|
+
raise ValueError("Argument #2 can not be encoded as imm8")
|
|
2512
|
+
self.encodings.append(
|
|
2513
|
+
(
|
|
2514
|
+
0x00,
|
|
2515
|
+
lambda op: bytearray(
|
|
2516
|
+
[
|
|
2517
|
+
0xC4,
|
|
2518
|
+
0xE3,
|
|
2519
|
+
0x79,
|
|
2520
|
+
0x31,
|
|
2521
|
+
0xC0 | op[0].lcode << 3 | op[1].lcode,
|
|
2522
|
+
op[2] & 0xFF,
|
|
2523
|
+
]
|
|
2524
|
+
),
|
|
2525
|
+
)
|
|
2526
|
+
)
|
|
2527
|
+
self.in_regs = (False, True, False)
|
|
2528
|
+
self.out_regs = (True, False, False)
|
|
2529
|
+
self.out_operands = (True, False, False)
|
|
2530
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
2531
|
+
else:
|
|
2532
|
+
raise SyntaxError(
|
|
2533
|
+
"Invalid operand types: KSHIFTRD "
|
|
2534
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
2535
|
+
)
|
|
2536
|
+
if nervapy.stream.active_stream is not None:
|
|
2537
|
+
nervapy.stream.active_stream.add_instruction(self)
|
|
2538
|
+
|
|
2539
|
+
|
|
2540
|
+
class KSHIFTRQ(Instruction):
|
|
2541
|
+
"""Shift Right 64-bit Masks"""
|
|
2542
|
+
|
|
2543
|
+
def __init__(self, *args, **kwargs):
|
|
2544
|
+
"""Supported forms:
|
|
2545
|
+
|
|
2546
|
+
* KSHIFTRQ(k, k, imm8) [AVX512BW]
|
|
2547
|
+
"""
|
|
2548
|
+
|
|
2549
|
+
origin = kwargs.get("origin")
|
|
2550
|
+
prototype = kwargs.get("prototype")
|
|
2551
|
+
if (
|
|
2552
|
+
origin is None
|
|
2553
|
+
and prototype is None
|
|
2554
|
+
and nervapy.x86_64.options.get_debug_level() > 0
|
|
2555
|
+
):
|
|
2556
|
+
origin = inspect.stack()
|
|
2557
|
+
super(KSHIFTRQ, self).__init__("KSHIFTRQ", origin=origin, prototype=prototype)
|
|
2558
|
+
self.operands = tuple(map(check_operand, args))
|
|
2559
|
+
if len(self.operands) != 3:
|
|
2560
|
+
raise SyntaxError('Instruction "KSHIFTRQ" requires 3 operands')
|
|
2561
|
+
if (
|
|
2562
|
+
is_k(self.operands[0])
|
|
2563
|
+
and is_k(self.operands[1])
|
|
2564
|
+
and is_imm(self.operands[2])
|
|
2565
|
+
):
|
|
2566
|
+
if not is_imm8(self.operands[2]):
|
|
2567
|
+
raise ValueError("Argument #2 can not be encoded as imm8")
|
|
2568
|
+
self.encodings.append(
|
|
2569
|
+
(
|
|
2570
|
+
0x00,
|
|
2571
|
+
lambda op: bytearray(
|
|
2572
|
+
[
|
|
2573
|
+
0xC4,
|
|
2574
|
+
0xE3,
|
|
2575
|
+
0xF9,
|
|
2576
|
+
0x31,
|
|
2577
|
+
0xC0 | op[0].lcode << 3 | op[1].lcode,
|
|
2578
|
+
op[2] & 0xFF,
|
|
2579
|
+
]
|
|
2580
|
+
),
|
|
2581
|
+
)
|
|
2582
|
+
)
|
|
2583
|
+
self.in_regs = (False, True, False)
|
|
2584
|
+
self.out_regs = (True, False, False)
|
|
2585
|
+
self.out_operands = (True, False, False)
|
|
2586
|
+
self.isa_extensions = frozenset([nervapy.x86_64.isa.avx512bw])
|
|
2587
|
+
else:
|
|
2588
|
+
raise SyntaxError(
|
|
2589
|
+
"Invalid operand types: KSHIFTRQ "
|
|
2590
|
+
+ ", ".join(map(format_operand_type, self.operands))
|
|
2591
|
+
)
|
|
2592
|
+
if nervapy.stream.active_stream is not None:
|
|
2593
|
+
nervapy.stream.active_stream.add_instruction(self)
|