OLD | NEW |
1 #! /usr/bin/env python | 1 #! /usr/bin/env python |
2 # x86 instructions and prefixes data and code generation | 2 # x86 instructions and prefixes data and code generation |
3 # | 3 # |
4 # Copyright (C) 2002-2007 Peter Johnson | 4 # Copyright (C) 2002-2007 Peter Johnson |
5 # | 5 # |
6 # Redistribution and use in source and binary forms, with or without | 6 # Redistribution and use in source and binary forms, with or without |
7 # modification, are permitted provided that the following conditions | 7 # modification, are permitted provided that the following conditions |
8 # are met: | 8 # are met: |
9 # 1. Redistributions of source code must retain the above copyright | 9 # 1. Redistributions of source code must retain the above copyright |
10 # notice, this list of conditions and the following disclaimer. | 10 # notice, this list of conditions and the following disclaimer. |
11 # 2. Redistributions in binary form must reproduce the above copyright | 11 # 2. Redistributions in binary form must reproduce the above copyright |
12 # notice, this list of conditions and the following disclaimer in the | 12 # notice, this list of conditions and the following disclaimer in the |
13 # documentation and/or other materials provided with the distribution. | 13 # documentation and/or other materials provided with the distribution. |
14 # | 14 # |
15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' | 15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' |
16 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 16 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
18 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE | 18 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE |
19 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 19 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
25 # POSSIBILITY OF SUCH DAMAGE. | 25 # POSSIBILITY OF SUCH DAMAGE. |
26 # | 26 # |
27 # NOTE: operands are arranged in NASM / Intel order (e.g. dest, src) | 27 # NOTE: operands are arranged in NASM / Intel order (e.g. dest, src) |
28 rcstag = "$Id: gen_x86_insn.py 2193 2009-04-04 23:03:41Z peter $" | 28 |
| 29 from sys import stdout, version_info |
| 30 |
| 31 rcstag = "$Id: gen_x86_insn.py 2346 2010-08-01 01:37:37Z peter $" |
29 | 32 |
30 import os | 33 import os |
31 import sys | 34 import sys |
32 | 35 |
33 try: | 36 try: |
34 scriptname = rcstag.split()[1] | 37 scriptname = rcstag.split()[1] |
35 scriptrev = rcstag.split()[2] | 38 scriptrev = rcstag.split()[2] |
36 except IndexError: | 39 except IndexError: |
37 scriptname = "gen_x86_insn.py" | 40 scriptname = "gen_x86_insn.py" |
38 scriptrev = "HEAD" | 41 scriptrev = "HEAD" |
39 | 42 |
40 ordered_cpus = [ | 43 ordered_cpus = [ |
41 "086", "186", "286", "386", "486", "586", "686", "K6", "Athlon", "P3", | 44 "086", "186", "286", "386", "486", "586", "686", "K6", "Athlon", "P3", |
42 "P4", "IA64", "Hammer"] | 45 "P4", "IA64", "Hammer"] |
43 ordered_cpu_features = [ | 46 ordered_cpu_features = [ |
44 "FPU", "Cyrix", "AMD", "MMX", "3DNow", "SMM", "SSE", "SSE2", | 47 "FPU", "Cyrix", "AMD", "MMX", "3DNow", "SMM", "SSE", "SSE2", |
45 "SSE3", "SVM", "PadLock", "SSSE3", "SSE41", "SSE42", "SSE4a", "SSE5", | 48 "SSE3", "SVM", "PadLock", "SSSE3", "SSE41", "SSE42", "SSE4a", "SSE5", |
46 "AVX", "FMA", "AES", "CLMUL"] | 49 "AVX", "FMA", "AES", "CLMUL", "MOVBE", "XOP", "FMA4", "F16C", |
| 50 "FSGSBASE", "RDRAND", "XSAVEOPT", "EPTVPID", "SMX"] |
47 unordered_cpu_features = ["Priv", "Prot", "Undoc", "Obs"] | 51 unordered_cpu_features = ["Priv", "Prot", "Undoc", "Obs"] |
48 | 52 |
49 # Predefined VEX prefix field values | 53 # Predefined VEX prefix field values |
50 VEXW0 = 0xC0 | 54 VEXW0 = 0xC0 |
51 VEXW1 = 0xC8 | 55 VEXW1 = 0xC8 |
52 VEXL0 = 0xC0 | 56 VEXL0 = 0xC0 |
53 VEXL1 = 0xC4 | 57 VEXL1 = 0xC4 |
54 VEXpp = 0xC0 # OR with value | 58 VEXpp = 0xC0 # OR with value |
55 | 59 |
| 60 # Predefined XOP prefix field values |
| 61 XOPW0 = 0x80 |
| 62 XOPW1 = 0x88 |
| 63 XOPL0 = 0x80 |
| 64 XOPL1 = 0x84 |
| 65 XOPpp = 0x80 # OR with value |
| 66 |
| 67 def lprint(s, f = stdout, e = '\n') : |
| 68 f.write(s + e) |
| 69 |
56 def cpu_lcd(cpu1, cpu2): | 70 def cpu_lcd(cpu1, cpu2): |
57 """Find the lowest common denominator of two CPU sets.""" | 71 """Find the lowest common denominator of two CPU sets.""" |
58 retval = set() | 72 retval = set() |
59 | 73 |
60 # CPU | 74 # CPU |
61 cpu1cpus = set(ordered_cpus) & set(cpu1) | 75 cpu1cpus = set(ordered_cpus) & set(cpu1) |
62 if not cpu1cpus: | 76 if not cpu1cpus: |
63 cpu1cpus.add("086") | 77 cpu1cpus.add("086") |
64 cpu1mincpu = min(ordered_cpus.index(x) for x in cpu1cpus) | 78 cpu1mincpu = min(ordered_cpus.index(x) for x in cpu1cpus) |
65 cpu2cpus = set(ordered_cpus) & set(cpu2) | 79 cpu2cpus = set(ordered_cpus) & set(cpu2) |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 def __init__(self, **kwargs): | 116 def __init__(self, **kwargs): |
103 self.type = kwargs.pop("type") | 117 self.type = kwargs.pop("type") |
104 self.size = kwargs.pop("size", "Any") | 118 self.size = kwargs.pop("size", "Any") |
105 self.relaxed = kwargs.pop("relaxed", False) | 119 self.relaxed = kwargs.pop("relaxed", False) |
106 self.dest = kwargs.pop("dest", None) | 120 self.dest = kwargs.pop("dest", None) |
107 self.tmod = kwargs.pop("tmod", None) | 121 self.tmod = kwargs.pop("tmod", None) |
108 self.opt = kwargs.pop("opt", None) | 122 self.opt = kwargs.pop("opt", None) |
109 | 123 |
110 if kwargs: | 124 if kwargs: |
111 for arg in kwargs: | 125 for arg in kwargs: |
112 print "Warning: unrecognized arg %s" % arg | 126 lprint("Warning: unrecognized arg %s" % arg) |
113 | 127 |
114 def __str__(self): | 128 def __str__(self): |
115 return "{"+ ", ".join(["OPT_%s" % self.type, | 129 return "{"+ ", ".join(["OPT_%s" % self.type, |
116 "OPS_%s" % self.size, | 130 "OPS_%s" % self.size, |
117 "%d" % self.relaxed, | 131 "%d" % self.relaxed, |
118 self.dest == "EA64" and "1" or "0", | 132 self.dest == "EA64" and "1" or "0", |
119 "OPTM_%s" % self.tmod, | 133 "OPTM_%s" % self.tmod, |
120 "OPA_%s" % (self.dest == "EA64" | 134 "OPA_%s" % (self.dest == "EA64" |
121 and "EA" or self.dest), | 135 and "EA" or self.dest), |
122 "OPAP_%s" % self.opt]) + "}" | 136 "OPAP_%s" % self.opt]) + "}" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 | 182 |
169 # Default operation size in 64-bit mode | 183 # Default operation size in 64-bit mode |
170 self.def_opersize_64 = kwargs.pop("def_opersize_64", 0) | 184 self.def_opersize_64 = kwargs.pop("def_opersize_64", 0) |
171 | 185 |
172 # GAS suffix | 186 # GAS suffix |
173 self.gen_suffix = kwargs.pop("gen_suffix", True) | 187 self.gen_suffix = kwargs.pop("gen_suffix", True) |
174 self.suffixes = kwargs.pop("suffixes", None) | 188 self.suffixes = kwargs.pop("suffixes", None) |
175 suffix = kwargs.pop("suffix", None) | 189 suffix = kwargs.pop("suffix", None) |
176 if suffix is not None: | 190 if suffix is not None: |
177 self.suffixes = [suffix] | 191 self.suffixes = [suffix] |
| 192 |
| 193 req_suffix = kwargs.pop("req_suffix", False) |
| 194 if not req_suffix: |
| 195 if self.suffixes is None: |
| 196 self.suffixes = ["Z"] |
| 197 else: |
| 198 self.suffixes.append("Z") |
| 199 |
178 if self.suffixes is not None: | 200 if self.suffixes is not None: |
179 self.suffixes = set(x.upper() for x in self.suffixes) | 201 self.suffixes = set(x.upper() for x in self.suffixes) |
180 | 202 |
181 # Special instruction prefix | 203 # Special instruction prefix |
182 self.special_prefix = "0" | 204 self.special_prefix = "0" |
183 if "prefix" in kwargs: | 205 if "prefix" in kwargs: |
184 self.special_prefix = "0x%02X" % kwargs.pop("prefix") | 206 self.special_prefix = "0x%02X" % kwargs.pop("prefix") |
185 | 207 |
186 # VEX prefix | 208 # VEX prefix |
187 if "vex" in kwargs: | 209 if "vex" in kwargs: |
(...skipping 17 matching lines...) Expand all Loading... |
205 elif self.special_prefix == "0xF3": | 227 elif self.special_prefix == "0xF3": |
206 vexpp = 2 | 228 vexpp = 2 |
207 elif self.special_prefix == "0xF2": | 229 elif self.special_prefix == "0xF2": |
208 vexpp = 3 | 230 vexpp = 3 |
209 else: | 231 else: |
210 raise ValueError("Cannot combine VEX and special prefix %s" | 232 raise ValueError("Cannot combine VEX and special prefix %s" |
211 % self.special_prefix) | 233 % self.special_prefix) |
212 | 234 |
213 self.special_prefix = "0x%02X" % (0xC0 + vexW*8 + vexL*4 + vexpp) | 235 self.special_prefix = "0x%02X" % (0xC0 + vexW*8 + vexL*4 + vexpp) |
214 | 236 |
| 237 # XOP prefix |
| 238 if "xop" in kwargs: |
| 239 xopW = kwargs.pop("xopw", 0) |
| 240 if xopW not in [0, 1]: |
| 241 raise ValueError("XOP.W must be 0 or 1") |
| 242 |
| 243 xopL = kwargs.pop("xop") |
| 244 if xopL == 128 or xopL == 0: |
| 245 xopL = 0 |
| 246 elif xopL == 256: |
| 247 xopL = 1 |
| 248 else: |
| 249 raise ValueError("XOP.L must be 128 or 256") |
| 250 |
| 251 # XOPpp is currently reserved (0) |
| 252 xoppp = 0 |
| 253 if self.special_prefix not in ["0", "0x00"]: |
| 254 raise ValueError("Cannot combine XOP and special prefix %s" |
| 255 % self.special_prefix) |
| 256 self.special_prefix = "0x%02X" % (0x80 + xopW*8 + xopL*4 + xoppp) |
| 257 |
215 # Spare value | 258 # Spare value |
216 self.spare = kwargs.pop("spare", 0) | 259 self.spare = kwargs.pop("spare", 0) |
217 | 260 |
218 # Build opcodes string (C array initializer) | 261 # Build opcodes string (C array initializer) |
219 if "opcode" in kwargs: | 262 if "opcode" in kwargs: |
220 # Usual case, just a single opcode | 263 # Usual case, just a single opcode |
221 self.opcode = kwargs.pop("opcode") | 264 self.opcode = kwargs.pop("opcode") |
222 self.opcode_len = len(self.opcode) | 265 self.opcode_len = len(self.opcode) |
223 elif "opcode1" in kwargs and "opcode2" in kwargs: | 266 elif "opcode1" in kwargs and "opcode2" in kwargs: |
224 # Two opcode case; the first opcode is the "optimized" opcode, | 267 # Two opcode case; the first opcode is the "optimized" opcode, |
225 # the second is the "relaxed" opcode. For this to work, an | 268 # the second is the "relaxed" opcode. For this to work, an |
226 # opt="foo" must be set for one of the operands. | 269 # opt="foo" must be set for one of the operands. |
227 self.opcode1 = kwargs.pop("opcode1") | 270 self.opcode1 = kwargs.pop("opcode1") |
228 self.opcode2 = kwargs.pop("opcode2") | 271 self.opcode2 = kwargs.pop("opcode2") |
229 self.opcode_len = len(self.opcode1) | 272 self.opcode_len = len(self.opcode1) |
230 else: | 273 else: |
231 raise KeyError("missing opcode") | 274 raise KeyError("missing opcode") |
232 | 275 |
233 # DREX opcode0 field | |
234 self.drex_oc0 = kwargs.pop("drex_oc0", 0) and 0x08 or 0 | |
235 | |
236 # Build operands string (C array initializer) | 276 # Build operands string (C array initializer) |
237 self.operands = kwargs.pop("operands") | 277 self.operands = kwargs.pop("operands") |
238 for op in self.operands: | 278 for op in self.operands: |
239 if op.type in ["Reg", "RM", "Areg", "Creg", "Dreg"]: | 279 if op.type in ["Reg", "RM", "Areg", "Creg", "Dreg"]: |
240 if op.size == 64: | 280 if op.size == 64: |
241 self.misc_flags.add("ONLY_64") | 281 self.misc_flags.add("ONLY_64") |
242 elif op.size == 32 and "ONLY_64" not in self.misc_flags: | 282 elif op.size == 32 and "ONLY_64" not in self.misc_flags: |
243 self.cpu.add("386") | 283 self.cpu.add("386") |
244 if op.type in ["Imm", "ImmNotSegOff"]: | 284 if op.type in ["Imm", "ImmNotSegOff"]: |
245 if op.size == 64: | 285 if op.size == 64: |
246 self.misc_flags.add("ONLY_64") | 286 self.misc_flags.add("ONLY_64") |
247 elif op.size == 32 and "ONLY_64" not in self.misc_flags: | 287 elif op.size == 32 and "ONLY_64" not in self.misc_flags: |
248 self.cpu.add("386") | 288 self.cpu.add("386") |
249 if op.type in ["FS", "GS"] and "ONLY_64" not in self.misc_flags: | 289 if op.type in ["FS", "GS"] and "ONLY_64" not in self.misc_flags: |
250 self.cpu.add("386") | 290 self.cpu.add("386") |
251 if op.type in ["CR4"] and "ONLY_64" not in self.misc_flags: | 291 if op.type in ["CR4"] and "ONLY_64" not in self.misc_flags: |
252 self.cpu.add("586") | 292 self.cpu.add("586") |
253 if op.dest == "EA64": | 293 if op.dest == "EA64": |
254 self.misc_flags.add("ONLY_64") | 294 self.misc_flags.add("ONLY_64") |
255 if op.dest == "DREX": | |
256 self.drex_oc0 |= 0x80 | |
257 | 295 |
258 # Modifiers | 296 # Modifiers |
259 self.modifiers = kwargs.pop("modifiers", []) | 297 self.modifiers = kwargs.pop("modifiers", []) |
260 | 298 |
261 # GAS flags | 299 # GAS flags |
262 self.gas_only = ("nasm" not in self.parsers) | 300 self.gas_only = ("nasm" not in self.parsers) |
263 self.gas_illegal = ("gas" not in self.parsers) | 301 self.gas_illegal = ("gas" not in self.parsers) |
264 self.gas_no_rev = (kwargs.pop("gas_no_reverse", False) or | 302 self.gas_no_rev = (kwargs.pop("gas_no_reverse", False) or |
265 kwargs.pop("gas_no_rev", False)) | 303 kwargs.pop("gas_no_rev", False)) |
266 | 304 |
267 # CPU feature flags finalization | 305 # CPU feature flags finalization |
268 # Remove redundancies | 306 # Remove redundancies |
269 maxcpu = -1 | 307 maxcpu = -1 |
270 maxcpu_set = self.cpu & set(ordered_cpus) | 308 maxcpu_set = self.cpu & set(ordered_cpus) |
271 if maxcpu_set: | 309 if maxcpu_set: |
272 maxcpu = max(ordered_cpus.index(x) for x in maxcpu_set) | 310 maxcpu = max(ordered_cpus.index(x) for x in maxcpu_set) |
273 if maxcpu != -1: | 311 if maxcpu != -1: |
274 for cpu in ordered_cpus[0:maxcpu]: | 312 for cpu in ordered_cpus[0:maxcpu]: |
275 self.cpu.discard(cpu) | 313 self.cpu.discard(cpu) |
276 | 314 |
277 if kwargs: | 315 if kwargs: |
278 for arg in kwargs: | 316 for arg in kwargs: |
279 print "Warning: unrecognized arg %s" % arg | 317 lprint("Warning: unrecognized arg %s" % arg) |
280 | 318 |
281 def __str__(self): | 319 def __str__(self): |
282 if hasattr(self, "opcode"): | 320 if hasattr(self, "opcode"): |
283 opcodes_str = ["0x%02X" % x for x in self.opcode] | 321 opcodes_str = ["0x%02X" % x for x in self.opcode] |
284 elif hasattr(self, "opcode1") and hasattr(self, "opcode2"): | 322 elif hasattr(self, "opcode1") and hasattr(self, "opcode2"): |
285 opcodes_str = ["0x%02X" % x for x in self.opcode1] | 323 opcodes_str = ["0x%02X" % x for x in self.opcode1] |
286 opcodes_str.extend("0x%02X" % x for x in self.opcode2) | 324 opcodes_str.extend("0x%02X" % x for x in self.opcode2) |
287 # Ensure opcodes initializer string is 3 long | 325 # Ensure opcodes initializer string is 3 long |
288 opcodes_str.extend(["0", "0", "0"]) | 326 opcodes_str.extend(["0", "0", "0"]) |
289 opcodes_str = "{" + ', '.join(opcodes_str[0:3]) + "}" | 327 opcodes_str = "{" + ', '.join(opcodes_str[0:3]) + "}" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 # Build instruction info structure initializer | 362 # Build instruction info structure initializer |
325 return "{ "+ ", ".join([gas_flags or "0", | 363 return "{ "+ ", ".join([gas_flags or "0", |
326 "|".join(self.misc_flags) or "0", | 364 "|".join(self.misc_flags) or "0", |
327 cpus_str[0], | 365 cpus_str[0], |
328 cpus_str[1], | 366 cpus_str[1], |
329 cpus_str[2], | 367 cpus_str[2], |
330 mod_str, | 368 mod_str, |
331 "%d" % (self.opersize or 0), | 369 "%d" % (self.opersize or 0), |
332 "%d" % (self.def_opersize_64 or 0), | 370 "%d" % (self.def_opersize_64 or 0), |
333 self.special_prefix or "0", | 371 self.special_prefix or "0", |
334 self.drex_oc0 and | |
335 ("0x%02X" % self.drex_oc0) or "0", | |
336 "%d" % self.opcode_len, | 372 "%d" % self.opcode_len, |
337 opcodes_str, | 373 opcodes_str, |
338 "%d" % (self.spare or 0), | 374 "%d" % (self.spare or 0), |
339 "%d" % len(self.operands), | 375 "%d" % len(self.operands), |
340 "%d" % self.all_operands_index]) + " }" | 376 "%d" % self.all_operands_index]) + " }" |
341 | 377 |
342 groups = {} | 378 groups = {} |
343 groupnames_ordered = [] | 379 groupnames_ordered = [] |
344 def add_group(name, **kwargs): | 380 def add_group(name, **kwargs): |
345 forms = groups.setdefault(name, []) | 381 forms = groups.setdefault(name, []) |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 def copy(self): | 464 def copy(self): |
429 """Return a shallow copy.""" | 465 """Return a shallow copy.""" |
430 return Insn(self.groupname, | 466 return Insn(self.groupname, |
431 suffix=self.suffix, | 467 suffix=self.suffix, |
432 modifiers=self.modifiers, | 468 modifiers=self.modifiers, |
433 cpu=self.cpu, | 469 cpu=self.cpu, |
434 misc_flags=self.misc_flags) | 470 misc_flags=self.misc_flags) |
435 | 471 |
436 def __str__(self): | 472 def __str__(self): |
437 if self.suffix is None: | 473 if self.suffix is None: |
438 suffix_str = "NONE" | 474 suffix_str = "SUF_Z" |
439 elif len(self.suffix) == 1: | 475 elif len(self.suffix) == 1: |
440 suffix_str = "SUF_" + self.suffix | 476 suffix_str = "SUF_" + self.suffix |
441 else: | 477 else: |
442 suffix_str = self.suffix | 478 suffix_str = self.suffix |
443 | 479 |
444 cpus_str = [] | 480 cpus_str = [] |
445 if self.cpu is not None: | 481 if self.cpu is not None: |
446 if len(self.cpu) > 3: | 482 if len(self.cpu) > 3: |
447 raise ValueError("too many CPUs: %s" % (self.cpu,)) | 483 raise ValueError("too many CPUs: %s" % (self.cpu,)) |
448 cpus_str.extend("CPU_%s" % x for x in sorted(self.cpu)) | 484 cpus_str.extend("CPU_%s" % x for x in sorted(self.cpu)) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 | 532 |
497 def add_prefix(name, groupname, value, parser=None, **kwargs): | 533 def add_prefix(name, groupname, value, parser=None, **kwargs): |
498 prefix = Prefix(groupname, value, **kwargs) | 534 prefix = Prefix(groupname, value, **kwargs) |
499 if parser is None or parser == "gas": | 535 if parser is None or parser == "gas": |
500 gas_insns[name] = prefix | 536 gas_insns[name] = prefix |
501 if parser is None or parser == "nasm": | 537 if parser is None or parser == "nasm": |
502 nasm_insns[name] = prefix | 538 nasm_insns[name] = prefix |
503 | 539 |
504 def finalize_insns(): | 540 def finalize_insns(): |
505 unused_groups = set(groups.keys()) | 541 unused_groups = set(groups.keys()) |
506 for name, opts in insns.iteritems(): | 542 for name in insns: |
507 for insn in opts: | 543 for insn in insns[name]: |
508 group = groups[insn.groupname] | 544 group = groups[insn.groupname] |
509 unused_groups.discard(insn.groupname) | 545 unused_groups.discard(insn.groupname) |
510 | 546 |
511 parsers = set() | 547 parsers = set() |
512 for form in group: | 548 for form in group: |
513 parsers |= form.parsers | 549 parsers |= form.parsers |
514 if insn.parsers is not None: | 550 if insn.parsers is not None: |
515 parsers &= insn.parsers | 551 parsers &= insn.parsers |
516 | 552 |
517 if "gas" in parsers: | 553 if "gas" in parsers: |
518 keyword = name | 554 suffixes = set() |
519 if keyword in gas_insns: | |
520 raise ValueError("duplicate gas instruction %s" % keyword) | |
521 newinsn = insn.copy() | |
522 newinsn.auto_cpu("gas") | |
523 newinsn.auto_misc_flags("gas") | |
524 gas_insns[keyword] = newinsn | |
525 | |
526 if insn.suffix is None: | 555 if insn.suffix is None: |
527 suffixes = set() | |
528 for form in group: | 556 for form in group: |
529 if form.gen_suffix and form.suffixes is not None: | 557 if form.gen_suffix and form.suffixes is not None: |
530 suffixes |= form.suffixes | 558 suffixes |= form.suffixes |
531 | 559 |
532 for suffix in suffixes: | 560 if not suffixes: |
| 561 suffixes.add("Z") |
| 562 for suffix in suffixes: |
| 563 if suffix == "Z": |
| 564 keyword = name |
| 565 else: |
533 keyword = name+suffix | 566 keyword = name+suffix |
534 if keyword in gas_insns: | 567 if keyword in gas_insns: |
535 raise ValueError("duplicate gas instruction %s" % | 568 raise ValueError("duplicate gas instruction %s" % |
536 keyword) | 569 keyword) |
537 newinsn = insn.copy() | 570 newinsn = insn.copy() |
538 newinsn.suffix = suffix | 571 newinsn.suffix = suffix |
539 newinsn.auto_cpu("gas") | 572 newinsn.auto_cpu("gas") |
540 newinsn.auto_misc_flags("gas") | 573 newinsn.auto_misc_flags("gas") |
541 gas_insns[keyword] = newinsn | 574 gas_insns[keyword] = newinsn |
542 | 575 |
543 if "nasm" in parsers: | 576 if "nasm" in parsers: |
544 keyword = name | 577 keyword = name |
545 if keyword in nasm_insns: | 578 if keyword in nasm_insns: |
546 raise ValueError("duplicate nasm instruction %s" % keyword) | 579 raise ValueError("duplicate nasm instruction %s" % keyword) |
547 newinsn = insn.copy() | 580 newinsn = insn.copy() |
548 newinsn.auto_cpu("nasm") | 581 newinsn.auto_cpu("nasm") |
549 newinsn.auto_misc_flags("nasm") | 582 newinsn.auto_misc_flags("nasm") |
550 nasm_insns[keyword] = newinsn | 583 nasm_insns[keyword] = newinsn |
551 | 584 |
552 unused_groups.discard("empty") | 585 unused_groups.discard("empty") |
553 unused_groups.discard("not64") | 586 unused_groups.discard("not64") |
554 if unused_groups: | 587 if unused_groups: |
555 print "warning: unused groups: %s" % ", ".join(unused_groups) | 588 lprint("warning: unused groups: %s" % ", ".join(unused_groups)) |
556 | 589 |
557 def output_insns(f, parser, insns): | 590 def output_insns(f, parser, insns): |
558 print >>f, "/* Generated by %s r%s, do not edit */" % \ | 591 lprint("/* Generated by %s r%s, do not edit */" % \ |
559 (scriptname, scriptrev) | 592 (scriptname, scriptrev), f) |
560 print >>f, """%%ignore-case | 593 lprint("""%%ignore-case |
561 %%language=ANSI-C | 594 %%language=ANSI-C |
562 %%compare-strncmp | 595 %%compare-strncmp |
563 %%readonly-tables | 596 %%readonly-tables |
564 %%enum | 597 %%enum |
565 %%struct-type | 598 %%struct-type |
566 %%define hash-function-name insnprefix_%s_hash | 599 %%define hash-function-name insnprefix_%s_hash |
567 %%define lookup-function-name insnprefix_%s_find | 600 %%define lookup-function-name insnprefix_%s_find |
568 struct insnprefix_parse_data; | 601 struct insnprefix_parse_data; |
569 %%%%""" % (parser, parser) | 602 %%%%""" % (parser, parser), f) |
570 for keyword in sorted(insns): | 603 for keyword in sorted(insns): |
571 print >>f, "%s,\t%s" % (keyword.lower(), insns[keyword]) | 604 lprint("%s,\t%s" % (keyword.lower(), insns[keyword]), f) |
572 | 605 |
573 def output_gas_insns(f): | 606 def output_gas_insns(f): |
574 output_insns(f, "gas", gas_insns) | 607 output_insns(f, "gas", gas_insns) |
575 | 608 |
576 def output_nasm_insns(f): | 609 def output_nasm_insns(f): |
577 output_insns(f, "nasm", nasm_insns) | 610 output_insns(f, "nasm", nasm_insns) |
578 | 611 |
579 def output_groups(f): | 612 def output_groups(f): |
580 # Merge all operand lists into single list | 613 # Merge all operand lists into single list |
581 # Sort by number of operands to shorten output | 614 # Sort by number of operands to shorten output |
582 all_operands = [] | 615 all_operands = [] |
583 for form in sorted((form for g in groups.itervalues() for form in g), | 616 if version_info[0] == 2: |
| 617 gi = groups.itervalues() |
| 618 else: |
| 619 gi = groups.values() |
| 620 for form in sorted((form for g in gi for form in g), |
584 key=lambda x:len(x.operands), reverse=True): | 621 key=lambda x:len(x.operands), reverse=True): |
585 num_operands = len(form.operands) | 622 num_operands = len(form.operands) |
586 for i in xrange(len(all_operands)): | 623 for i in range(len(all_operands)): |
587 if all_operands[i:i+num_operands] == form.operands: | 624 if all_operands[i:i+num_operands] == form.operands: |
588 form.all_operands_index = i | 625 form.all_operands_index = i |
589 break | 626 break |
590 else: | 627 else: |
591 form.all_operands_index = len(all_operands) | 628 form.all_operands_index = len(all_operands) |
592 all_operands.extend(form.operands) | 629 all_operands.extend(form.operands) |
593 | 630 |
594 # Output operands list | 631 # Output operands list |
595 print >>f, "/* Generated by %s r%s, do not edit */" % \ | 632 lprint("/* Generated by %s r%s, do not edit */" % \ |
596 (scriptname, scriptrev) | 633 (scriptname, scriptrev), f) |
597 print >>f, "static const x86_info_operand insn_operands[] = {" | 634 lprint("static const x86_info_operand insn_operands[] = {", f) |
598 print >>f, " ", | 635 lprint(" ", f, '') |
599 print >>f, ",\n ".join(str(x) for x in all_operands) | 636 lprint(",\n ".join(str(x) for x in all_operands), f) |
600 print >>f, "};\n" | 637 lprint("};\n", f) |
601 | 638 |
602 # Output groups | 639 # Output groups |
603 seen = set() | 640 seen = set() |
604 for name in groupnames_ordered: | 641 for name in groupnames_ordered: |
605 if name in seen: | 642 if name in seen: |
606 continue | 643 continue |
607 seen.add(name) | 644 seen.add(name) |
608 print >>f, "static const x86_insn_info %s_insn[] = {" % name | 645 lprint("static const x86_insn_info %s_insn[] = {" % name, f) |
609 print >>f, " ", | 646 lprint(" ", f, '') |
610 print >>f, ",\n ".join(str(x) for x in groups[name]) | 647 lprint(",\n ".join(str(x) for x in groups[name]), f) |
611 print >>f, "};\n" | 648 lprint("};\n", f) |
612 | 649 |
613 ##################################################################### | 650 ##################################################################### |
614 # General instruction groupings | 651 # General instruction groupings |
615 ##################################################################### | 652 ##################################################################### |
616 | 653 |
617 # | 654 # |
618 # Empty instruction | 655 # Empty instruction |
619 # | 656 # |
620 add_group("empty", opcode=[], operands=[]) | 657 add_group("empty", opcode=[], operands=[]) |
621 | 658 |
(...skipping 1560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2182 ##################################################################### | 2219 ##################################################################### |
2183 # Control transfer instructions (unconditional) | 2220 # Control transfer instructions (unconditional) |
2184 ##################################################################### | 2221 ##################################################################### |
2185 # | 2222 # |
2186 # call | 2223 # call |
2187 # | 2224 # |
2188 add_group("call", | 2225 add_group("call", |
2189 opcode=[], | 2226 opcode=[], |
2190 operands=[Operand(type="ImmNotSegOff", dest="JmpRel")]) | 2227 operands=[Operand(type="ImmNotSegOff", dest="JmpRel")]) |
2191 add_group("call", | 2228 add_group("call", |
| 2229 suffix="w", |
2192 opersize=16, | 2230 opersize=16, |
2193 opcode=[], | 2231 opcode=[], |
2194 operands=[Operand(type="ImmNotSegOff", size=16, dest="JmpRel")]) | 2232 operands=[Operand(type="ImmNotSegOff", size=16, dest="JmpRel")]) |
2195 add_group("call", | 2233 add_group("call", |
| 2234 suffix="l", |
2196 not64=True, | 2235 not64=True, |
2197 opersize=32, | 2236 opersize=32, |
2198 opcode=[], | 2237 opcode=[], |
2199 operands=[Operand(type="ImmNotSegOff", size=32, dest="JmpRel")]) | 2238 operands=[Operand(type="ImmNotSegOff", size=32, dest="JmpRel")]) |
2200 add_group("call", | 2239 add_group("call", |
| 2240 suffixes=["l", "q"], |
2201 only64=True, | 2241 only64=True, |
2202 opersize=64, | 2242 opersize=64, |
2203 opcode=[], | 2243 opcode=[], |
2204 operands=[Operand(type="ImmNotSegOff", size=32, dest="JmpRel")]) | 2244 operands=[Operand(type="ImmNotSegOff", size=32, dest="JmpRel")]) |
2205 | 2245 |
2206 add_group("call", | 2246 add_group("call", |
2207 opersize=16, | 2247 opersize=16, |
2208 def_opersize_64=64, | 2248 def_opersize_64=64, |
2209 opcode=[0xE8], | 2249 opcode=[0xE8], |
2210 operands=[Operand(type="Imm", size=16, tmod="Near", dest="JmpRel")]) | 2250 operands=[Operand(type="Imm", size=16, tmod="Near", dest="JmpRel")]) |
2211 add_group("call", | 2251 add_group("call", |
2212 not64=True, | 2252 not64=True, |
2213 opersize=32, | 2253 opersize=32, |
2214 opcode=[0xE8], | 2254 opcode=[0xE8], |
2215 operands=[Operand(type="Imm", size=32, tmod="Near", dest="JmpRel")]) | 2255 operands=[Operand(type="Imm", size=32, tmod="Near", dest="JmpRel")]) |
2216 add_group("call", | 2256 add_group("call", |
2217 only64=True, | 2257 only64=True, |
2218 opersize=64, | 2258 opersize=64, |
2219 def_opersize_64=64, | 2259 def_opersize_64=64, |
2220 opcode=[0xE8], | 2260 opcode=[0xE8], |
2221 operands=[Operand(type="Imm", size=32, tmod="Near", dest="JmpRel")]) | 2261 operands=[Operand(type="Imm", size=32, tmod="Near", dest="JmpRel")]) |
2222 add_group("call", | 2262 add_group("call", |
2223 def_opersize_64=64, | 2263 def_opersize_64=64, |
2224 opcode=[0xE8], | 2264 opcode=[0xE8], |
2225 operands=[Operand(type="Imm", tmod="Near", dest="JmpRel")]) | 2265 operands=[Operand(type="Imm", tmod="Near", dest="JmpRel")]) |
2226 | 2266 |
2227 add_group("call", | 2267 add_group("call", |
| 2268 suffix="w", |
| 2269 req_suffix=True, |
2228 opersize=16, | 2270 opersize=16, |
2229 opcode=[0xFF], | 2271 opcode=[0xFF], |
2230 spare=2, | 2272 spare=2, |
2231 operands=[Operand(type="RM", size=16, dest="EA")]) | 2273 operands=[Operand(type="RM", size=16, dest="EA")]) |
2232 add_group("call", | 2274 add_group("call", |
| 2275 suffix="l", |
| 2276 req_suffix=True, |
2233 not64=True, | 2277 not64=True, |
2234 opersize=32, | 2278 opersize=32, |
2235 opcode=[0xFF], | 2279 opcode=[0xFF], |
2236 spare=2, | 2280 spare=2, |
2237 operands=[Operand(type="RM", size=32, dest="EA")]) | 2281 operands=[Operand(type="RM", size=32, dest="EA")]) |
2238 add_group("call", | 2282 add_group("call", |
| 2283 suffix="q", |
| 2284 req_suffix=True, |
2239 opersize=64, | 2285 opersize=64, |
2240 def_opersize_64=64, | 2286 def_opersize_64=64, |
2241 opcode=[0xFF], | 2287 opcode=[0xFF], |
2242 spare=2, | 2288 spare=2, |
2243 operands=[Operand(type="RM", size=64, dest="EA")]) | 2289 operands=[Operand(type="RM", size=64, dest="EA")]) |
2244 add_group("call", | 2290 add_group("call", |
| 2291 parsers=["gas"], |
| 2292 def_opersize_64=64, |
| 2293 opcode=[0xFF], |
| 2294 spare=2, |
| 2295 operands=[Operand(type="Reg", size="BITS", dest="EA")]) |
| 2296 add_group("call", |
2245 def_opersize_64=64, | 2297 def_opersize_64=64, |
2246 opcode=[0xFF], | 2298 opcode=[0xFF], |
2247 spare=2, | 2299 spare=2, |
2248 operands=[Operand(type="Mem", dest="EA")]) | 2300 operands=[Operand(type="Mem", dest="EA")]) |
2249 add_group("call", | 2301 add_group("call", |
| 2302 parsers=["nasm"], |
2250 opersize=16, | 2303 opersize=16, |
2251 def_opersize_64=64, | 2304 def_opersize_64=64, |
2252 opcode=[0xFF], | 2305 opcode=[0xFF], |
2253 spare=2, | 2306 spare=2, |
2254 operands=[Operand(type="RM", size=16, tmod="Near", dest="EA")]) | 2307 operands=[Operand(type="RM", size=16, tmod="Near", dest="EA")]) |
2255 add_group("call", | 2308 add_group("call", |
| 2309 parsers=["nasm"], |
2256 not64=True, | 2310 not64=True, |
2257 opersize=32, | 2311 opersize=32, |
2258 opcode=[0xFF], | 2312 opcode=[0xFF], |
2259 spare=2, | 2313 spare=2, |
2260 operands=[Operand(type="RM", size=32, tmod="Near", dest="EA")]) | 2314 operands=[Operand(type="RM", size=32, tmod="Near", dest="EA")]) |
2261 add_group("call", | 2315 add_group("call", |
| 2316 parsers=["nasm"], |
2262 opersize=64, | 2317 opersize=64, |
2263 def_opersize_64=64, | 2318 def_opersize_64=64, |
2264 opcode=[0xFF], | 2319 opcode=[0xFF], |
2265 spare=2, | 2320 spare=2, |
2266 operands=[Operand(type="RM", size=64, tmod="Near", dest="EA")]) | 2321 operands=[Operand(type="RM", size=64, tmod="Near", dest="EA")]) |
2267 add_group("call", | 2322 add_group("call", |
| 2323 parsers=["nasm"], |
2268 def_opersize_64=64, | 2324 def_opersize_64=64, |
2269 opcode=[0xFF], | 2325 opcode=[0xFF], |
2270 spare=2, | 2326 spare=2, |
2271 operands=[Operand(type="Mem", tmod="Near", dest="EA")]) | 2327 operands=[Operand(type="Mem", tmod="Near", dest="EA")]) |
2272 | 2328 |
2273 # Far indirect (through memory). Needs explicit FAR override. | 2329 # Far indirect (through memory). Needs explicit FAR override (NASM only) |
2274 for sz in [16, 32, 64]: | 2330 for sz in [16, 32, 64]: |
2275 add_group("call", | 2331 add_group("call", |
| 2332 parsers=["nasm"], |
2276 opersize=sz, | 2333 opersize=sz, |
2277 opcode=[0xFF], | 2334 opcode=[0xFF], |
2278 spare=3, | 2335 spare=3, |
2279 operands=[Operand(type="Mem", size=sz, tmod="Far", dest="EA")]) | 2336 operands=[Operand(type="Mem", size=sz, tmod="Far", dest="EA")]) |
2280 add_group("call", | 2337 add_group("call", |
| 2338 parsers=["nasm"], |
2281 opcode=[0xFF], | 2339 opcode=[0xFF], |
2282 spare=3, | 2340 spare=3, |
2283 operands=[Operand(type="Mem", tmod="Far", dest="EA")]) | 2341 operands=[Operand(type="Mem", tmod="Far", dest="EA")]) |
2284 | 2342 |
2285 # With explicit FAR override | 2343 # With explicit FAR override |
2286 for sz in [16, 32]: | 2344 for sz in [16, 32]: |
2287 add_group("call", | 2345 add_group("call", |
| 2346 parsers=["nasm"], |
2288 not64=True, | 2347 not64=True, |
2289 opersize=sz, | 2348 opersize=sz, |
2290 opcode=[0x9A], | 2349 opcode=[0x9A], |
2291 spare=3, | |
2292 operands=[Operand(type="Imm", size=sz, tmod="Far", dest="JmpFar")]) | 2350 operands=[Operand(type="Imm", size=sz, tmod="Far", dest="JmpFar")]) |
2293 add_group("call", | 2351 add_group("call", |
| 2352 parsers=["nasm"], |
2294 not64=True, | 2353 not64=True, |
2295 opcode=[0x9A], | 2354 opcode=[0x9A], |
2296 spare=3, | |
2297 operands=[Operand(type="Imm", tmod="Far", dest="JmpFar")]) | 2355 operands=[Operand(type="Imm", tmod="Far", dest="JmpFar")]) |
2298 | 2356 |
2299 # Since not caught by first ImmNotSegOff group, implicitly FAR. | 2357 # Since not caught by first ImmNotSegOff group, implicitly FAR (in NASM). |
2300 for sz in [16, 32]: | 2358 for sz in [16, 32]: |
2301 add_group("call", | 2359 add_group("call", |
| 2360 parsers=["nasm"], |
2302 not64=True, | 2361 not64=True, |
2303 opersize=sz, | 2362 opersize=sz, |
2304 opcode=[0x9A], | 2363 opcode=[0x9A], |
2305 spare=3, | |
2306 operands=[Operand(type="Imm", size=sz, dest="JmpFar")]) | 2364 operands=[Operand(type="Imm", size=sz, dest="JmpFar")]) |
2307 add_group("call", | 2365 add_group("call", |
| 2366 parsers=["nasm"], |
2308 not64=True, | 2367 not64=True, |
2309 opcode=[0x9A], | 2368 opcode=[0x9A], |
2310 spare=3, | |
2311 operands=[Operand(type="Imm", dest="JmpFar")]) | 2369 operands=[Operand(type="Imm", dest="JmpFar")]) |
2312 | 2370 |
| 2371 # Two-operand FAR (GAS only) |
| 2372 for sfx, sz in zip("wl", [16, 32]): |
| 2373 add_group("call", |
| 2374 suffix=sfx, |
| 2375 req_suffix=True, |
| 2376 parsers=["gas"], |
| 2377 not64=True, |
| 2378 gas_no_reverse=True, |
| 2379 opersize=sz, |
| 2380 opcode=[0x9A], |
| 2381 operands=[Operand(type="Imm", size=16, relaxed=True, dest="JmpFar"), |
| 2382 Operand(type="Imm", size=sz, relaxed=True, dest="JmpFar")]) |
| 2383 add_group("call", |
| 2384 parsers=["gas"], |
| 2385 not64=True, |
| 2386 gas_no_reverse=True, |
| 2387 opcode=[0x9A], |
| 2388 operands=[Operand(type="Imm", size=16, relaxed=True, dest="JmpFar"), |
| 2389 Operand(type="Imm", size="BITS", relaxed=True, dest="JmpFar")]) |
| 2390 |
2313 add_insn("call", "call") | 2391 add_insn("call", "call") |
2314 add_insn("calll", "call", parser="gas", not64=True) | |
2315 add_insn("callq", "call", parser="gas", only64=True) | |
2316 | 2392 |
2317 # | 2393 # |
2318 # jmp | 2394 # jmp |
2319 # | 2395 # |
2320 add_group("jmp", | 2396 add_group("jmp", |
2321 opcode=[], | 2397 opcode=[], |
2322 operands=[Operand(type="ImmNotSegOff", dest="JmpRel")]) | 2398 operands=[Operand(type="ImmNotSegOff", dest="JmpRel")]) |
2323 add_group("jmp", | 2399 add_group("jmp", |
| 2400 suffix="w", |
2324 opersize=16, | 2401 opersize=16, |
2325 opcode=[], | 2402 opcode=[], |
2326 operands=[Operand(type="ImmNotSegOff", size=16, dest="JmpRel")]) | 2403 operands=[Operand(type="ImmNotSegOff", size=16, dest="JmpRel")]) |
2327 add_group("jmp", | 2404 add_group("jmp", |
| 2405 suffix="l", |
2328 not64=True, | 2406 not64=True, |
2329 opersize=32, | 2407 opersize=32, |
2330 opcode=[0x00], | 2408 opcode=[0x00], |
2331 operands=[Operand(type="ImmNotSegOff", size=32, dest="JmpRel")]) | 2409 operands=[Operand(type="ImmNotSegOff", size=32, dest="JmpRel")]) |
2332 add_group("jmp", | 2410 add_group("jmp", |
| 2411 suffixes=["l", "q"], |
2333 only64=True, | 2412 only64=True, |
2334 opersize=64, | 2413 opersize=64, |
2335 opcode=[0x00], | 2414 opcode=[0x00], |
2336 operands=[Operand(type="ImmNotSegOff", size=32, dest="JmpRel")]) | 2415 operands=[Operand(type="ImmNotSegOff", size=32, dest="JmpRel")]) |
2337 | 2416 |
2338 add_group("jmp", | 2417 add_group("jmp", |
2339 def_opersize_64=64, | 2418 def_opersize_64=64, |
2340 opcode=[0xEB], | 2419 opcode=[0xEB], |
2341 operands=[Operand(type="Imm", tmod="Short", dest="JmpRel")]) | 2420 operands=[Operand(type="Imm", tmod="Short", dest="JmpRel")]) |
2342 add_group("jmp", | 2421 add_group("jmp", |
(...skipping 12 matching lines...) Expand all Loading... |
2355 opersize=64, | 2434 opersize=64, |
2356 def_opersize_64=64, | 2435 def_opersize_64=64, |
2357 opcode=[0xE9], | 2436 opcode=[0xE9], |
2358 operands=[Operand(type="Imm", size=32, tmod="Near", dest="JmpRel")]) | 2437 operands=[Operand(type="Imm", size=32, tmod="Near", dest="JmpRel")]) |
2359 add_group("jmp", | 2438 add_group("jmp", |
2360 def_opersize_64=64, | 2439 def_opersize_64=64, |
2361 opcode=[0xE9], | 2440 opcode=[0xE9], |
2362 operands=[Operand(type="Imm", tmod="Near", dest="JmpRel")]) | 2441 operands=[Operand(type="Imm", tmod="Near", dest="JmpRel")]) |
2363 | 2442 |
2364 add_group("jmp", | 2443 add_group("jmp", |
| 2444 suffix="w", |
| 2445 req_suffix=True, |
2365 opersize=16, | 2446 opersize=16, |
2366 def_opersize_64=64, | 2447 def_opersize_64=64, |
2367 opcode=[0xFF], | 2448 opcode=[0xFF], |
2368 spare=4, | 2449 spare=4, |
2369 operands=[Operand(type="RM", size=16, dest="EA")]) | 2450 operands=[Operand(type="RM", size=16, dest="EA")]) |
2370 add_group("jmp", | 2451 add_group("jmp", |
| 2452 suffix="l", |
| 2453 req_suffix=True, |
2371 not64=True, | 2454 not64=True, |
2372 opersize=32, | 2455 opersize=32, |
2373 opcode=[0xFF], | 2456 opcode=[0xFF], |
2374 spare=4, | 2457 spare=4, |
2375 operands=[Operand(type="RM", size=32, dest="EA")]) | 2458 operands=[Operand(type="RM", size=32, dest="EA")]) |
2376 add_group("jmp", | 2459 add_group("jmp", |
| 2460 suffix="q", |
| 2461 req_suffix=True, |
2377 opersize=64, | 2462 opersize=64, |
2378 def_opersize_64=64, | 2463 def_opersize_64=64, |
2379 opcode=[0xFF], | 2464 opcode=[0xFF], |
2380 spare=4, | 2465 spare=4, |
2381 operands=[Operand(type="RM", size=64, dest="EA")]) | 2466 operands=[Operand(type="RM", size=64, dest="EA")]) |
2382 add_group("jmp", | 2467 add_group("jmp", |
| 2468 parsers=["gas"], |
| 2469 def_opersize_64=64, |
| 2470 opcode=[0xFF], |
| 2471 spare=4, |
| 2472 operands=[Operand(type="Reg", size="BITS", dest="EA")]) |
| 2473 add_group("jmp", |
2383 def_opersize_64=64, | 2474 def_opersize_64=64, |
2384 opcode=[0xFF], | 2475 opcode=[0xFF], |
2385 spare=4, | 2476 spare=4, |
2386 operands=[Operand(type="Mem", dest="EA")]) | 2477 operands=[Operand(type="Mem", dest="EA")]) |
2387 add_group("jmp", | 2478 add_group("jmp", |
| 2479 parsers=["nasm"], |
2388 opersize=16, | 2480 opersize=16, |
2389 def_opersize_64=64, | 2481 def_opersize_64=64, |
2390 opcode=[0xFF], | 2482 opcode=[0xFF], |
2391 spare=4, | 2483 spare=4, |
2392 operands=[Operand(type="RM", size=16, tmod="Near", dest="EA")]) | 2484 operands=[Operand(type="RM", size=16, tmod="Near", dest="EA")]) |
2393 add_group("jmp", | 2485 add_group("jmp", |
| 2486 parsers=["nasm"], |
2394 not64=True, | 2487 not64=True, |
2395 cpu=["386"], | 2488 cpu=["386"], |
2396 opersize=32, | 2489 opersize=32, |
2397 opcode=[0xFF], | 2490 opcode=[0xFF], |
2398 spare=4, | 2491 spare=4, |
2399 operands=[Operand(type="RM", size=32, tmod="Near", dest="EA")]) | 2492 operands=[Operand(type="RM", size=32, tmod="Near", dest="EA")]) |
2400 add_group("jmp", | 2493 add_group("jmp", |
| 2494 parsers=["nasm"], |
2401 opersize=64, | 2495 opersize=64, |
2402 def_opersize_64=64, | 2496 def_opersize_64=64, |
2403 opcode=[0xFF], | 2497 opcode=[0xFF], |
2404 spare=4, | 2498 spare=4, |
2405 operands=[Operand(type="RM", size=64, tmod="Near", dest="EA")]) | 2499 operands=[Operand(type="RM", size=64, tmod="Near", dest="EA")]) |
2406 add_group("jmp", | 2500 add_group("jmp", |
| 2501 parsers=["nasm"], |
2407 def_opersize_64=64, | 2502 def_opersize_64=64, |
2408 opcode=[0xFF], | 2503 opcode=[0xFF], |
2409 spare=4, | 2504 spare=4, |
2410 operands=[Operand(type="Mem", tmod="Near", dest="EA")]) | 2505 operands=[Operand(type="Mem", tmod="Near", dest="EA")]) |
2411 | 2506 |
2412 # Far indirect (through memory). Needs explicit FAR override. | 2507 # Far indirect (through memory). Needs explicit FAR override. |
2413 for sz in [16, 32, 64]: | 2508 for sz in [16, 32, 64]: |
2414 add_group("jmp", | 2509 add_group("jmp", |
2415 opersize=sz, | 2510 opersize=sz, |
2416 opcode=[0xFF], | 2511 opcode=[0xFF], |
2417 spare=5, | 2512 spare=5, |
2418 operands=[Operand(type="Mem", size=sz, tmod="Far", dest="EA")]) | 2513 operands=[Operand(type="Mem", size=sz, tmod="Far", dest="EA")]) |
2419 add_group("jmp", | 2514 add_group("jmp", |
2420 opcode=[0xFF], | 2515 opcode=[0xFF], |
2421 spare=5, | 2516 spare=5, |
2422 operands=[Operand(type="Mem", tmod="Far", dest="EA")]) | 2517 operands=[Operand(type="Mem", tmod="Far", dest="EA")]) |
2423 | 2518 |
2424 # With explicit FAR override | 2519 # With explicit FAR override |
2425 for sz in [16, 32]: | 2520 for sz in [16, 32]: |
2426 add_group("jmp", | 2521 add_group("jmp", |
2427 not64=True, | 2522 not64=True, |
2428 opersize=sz, | 2523 opersize=sz, |
2429 opcode=[0xEA], | 2524 opcode=[0xEA], |
2430 spare=3, | |
2431 operands=[Operand(type="Imm", size=sz, tmod="Far", dest="JmpFar")]) | 2525 operands=[Operand(type="Imm", size=sz, tmod="Far", dest="JmpFar")]) |
2432 add_group("jmp", | 2526 add_group("jmp", |
2433 not64=True, | 2527 not64=True, |
2434 opcode=[0xEA], | 2528 opcode=[0xEA], |
2435 spare=3, | |
2436 operands=[Operand(type="Imm", tmod="Far", dest="JmpFar")]) | 2529 operands=[Operand(type="Imm", tmod="Far", dest="JmpFar")]) |
2437 | 2530 |
2438 # Since not caught by first ImmNotSegOff group, implicitly FAR. | 2531 # Since not caught by first ImmNotSegOff group, implicitly FAR (in NASM). |
2439 for sz in [16, 32]: | 2532 for sz in [16, 32]: |
2440 add_group("jmp", | 2533 add_group("jmp", |
| 2534 parsers=["nasm"], |
2441 not64=True, | 2535 not64=True, |
2442 opersize=sz, | 2536 opersize=sz, |
2443 opcode=[0xEA], | 2537 opcode=[0xEA], |
2444 spare=3, | |
2445 operands=[Operand(type="Imm", size=sz, dest="JmpFar")]) | 2538 operands=[Operand(type="Imm", size=sz, dest="JmpFar")]) |
2446 add_group("jmp", | 2539 add_group("jmp", |
| 2540 parsers=["nasm"], |
2447 not64=True, | 2541 not64=True, |
2448 opcode=[0xEA], | 2542 opcode=[0xEA], |
2449 spare=3, | |
2450 operands=[Operand(type="Imm", dest="JmpFar")]) | 2543 operands=[Operand(type="Imm", dest="JmpFar")]) |
2451 | 2544 |
| 2545 # Two-operand FAR (GAS only) |
| 2546 for sfx, sz in zip("wl", [16, 32]): |
| 2547 add_group("jmp", |
| 2548 parsers=["gas"], |
| 2549 suffix=sfx, |
| 2550 req_suffix=True, |
| 2551 not64=True, |
| 2552 gas_no_reverse=True, |
| 2553 opersize=sz, |
| 2554 opcode=[0xEA], |
| 2555 operands=[Operand(type="Imm", size=16, relaxed=True, dest="JmpFar"), |
| 2556 Operand(type="Imm", size=sz, relaxed=True, dest="JmpFar")]) |
| 2557 add_group("jmp", |
| 2558 parsers=["gas"], |
| 2559 not64=True, |
| 2560 gas_no_reverse=True, |
| 2561 opcode=[0xEA], |
| 2562 operands=[Operand(type="Imm", size=16, relaxed=True, dest="JmpFar"), |
| 2563 Operand(type="Imm", size="BITS", relaxed=True, dest="JmpFar")]) |
| 2564 |
2452 add_insn("jmp", "jmp") | 2565 add_insn("jmp", "jmp") |
2453 | 2566 |
2454 # | 2567 # |
| 2568 # GAS far calls/jumps |
| 2569 # |
| 2570 |
| 2571 # Far indirect (through memory) |
| 2572 for sfx, sz in zip("wlq", [16, 32, 64]): |
| 2573 add_group("ljmpcall", |
| 2574 suffix=sfx, |
| 2575 req_suffix=True, |
| 2576 opersize=sz, |
| 2577 modifiers=["SpAdd"], |
| 2578 opcode=[0xFF], |
| 2579 spare=0, |
| 2580 operands=[Operand(type="Mem", size=sz, relaxed=True, dest="EA")]) |
| 2581 add_group("ljmpcall", |
| 2582 modifiers=["SpAdd"], |
| 2583 opcode=[0xFF], |
| 2584 spare=0, |
| 2585 operands=[Operand(type="Mem", size="BITS", relaxed=True, dest="EA")]) |
| 2586 |
| 2587 # Two-operand far |
| 2588 for sfx, sz in zip("wl", [16, 32]): |
| 2589 add_group("ljmpcall", |
| 2590 not64=True, |
| 2591 gas_no_reverse=True, |
| 2592 suffix=sfx, |
| 2593 req_suffix=True, |
| 2594 opersize=sz, |
| 2595 modifiers=["Gap", "Op0Add"], |
| 2596 opcode=[0x00], |
| 2597 operands=[Operand(type="Imm", size=16, relaxed=True, dest="JmpFar"), |
| 2598 Operand(type="Imm", size=sz, relaxed=True, dest="JmpFar")]) |
| 2599 add_group("ljmpcall", |
| 2600 not64=True, |
| 2601 gas_no_reverse=True, |
| 2602 modifiers=["Gap", "Op0Add"], |
| 2603 opcode=[0x00], |
| 2604 operands=[Operand(type="Imm", size=16, relaxed=True, dest="JmpFar"), |
| 2605 Operand(type="Imm", size="BITS", relaxed=True, dest="JmpFar")]) |
| 2606 |
| 2607 add_insn("ljmp", "ljmpcall", parser="gas", modifiers=[5, 0xEA]) |
| 2608 add_insn("lcall", "ljmpcall", parser="gas", modifiers=[3, 0x9A]) |
| 2609 |
| 2610 # |
2455 # ret | 2611 # ret |
2456 # | 2612 # |
2457 add_group("retnf", | 2613 add_group("retnf", |
2458 not64=True, | 2614 not64=True, |
2459 modifiers=["Op0Add"], | 2615 modifiers=["Op0Add"], |
2460 opcode=[0x01], | 2616 opcode=[0x01], |
2461 operands=[]) | 2617 operands=[]) |
2462 add_group("retnf", | 2618 add_group("retnf", |
2463 not64=True, | 2619 not64=True, |
2464 modifiers=["Op0Add"], | 2620 modifiers=["Op0Add"], |
(...skipping 22 matching lines...) Expand all Loading... |
2487 modifiers=["Op0Add", "OpSizeR"], | 2643 modifiers=["Op0Add", "OpSizeR"], |
2488 opcode=[0x00], | 2644 opcode=[0x00], |
2489 operands=[Operand(type="Imm", size=16, relaxed=True, dest="Imm")]) | 2645 operands=[Operand(type="Imm", size=16, relaxed=True, dest="Imm")]) |
2490 | 2646 |
2491 add_insn("ret", "retnf", modifiers=[0xC2]) | 2647 add_insn("ret", "retnf", modifiers=[0xC2]) |
2492 add_insn("retw", "retnf", parser="gas", modifiers=[0xC2, 16]) | 2648 add_insn("retw", "retnf", parser="gas", modifiers=[0xC2, 16]) |
2493 add_insn("retl", "retnf", parser="gas", modifiers=[0xC2], not64=True) | 2649 add_insn("retl", "retnf", parser="gas", modifiers=[0xC2], not64=True) |
2494 add_insn("retq", "retnf", parser="gas", modifiers=[0xC2], only64=True) | 2650 add_insn("retq", "retnf", parser="gas", modifiers=[0xC2], only64=True) |
2495 add_insn("retn", "retnf", parser="nasm", modifiers=[0xC2]) | 2651 add_insn("retn", "retnf", parser="nasm", modifiers=[0xC2]) |
2496 add_insn("retf", "retnf", parser="nasm", modifiers=[0xCA, 64]) | 2652 add_insn("retf", "retnf", parser="nasm", modifiers=[0xCA, 64]) |
2497 add_insn("lretw", "retnf", parser="gas", modifiers=[0xCA, 16], suffix="NONE") | 2653 add_insn("lret", "retnf", parser="gas", modifiers=[0xCA], suffix="z") |
2498 add_insn("lretl", "retnf", parser="gas", modifiers=[0xCA], suffix="NONE") | 2654 add_insn("lretw", "retnf", parser="gas", modifiers=[0xCA, 16], suffix="w") |
| 2655 add_insn("lretl", "retnf", parser="gas", modifiers=[0xCA], suffix="l") |
2499 add_insn("lretq", "retnf", parser="gas", modifiers=[0xCA, 64], only64=True, | 2656 add_insn("lretq", "retnf", parser="gas", modifiers=[0xCA, 64], only64=True, |
2500 suffix="NONE") | 2657 suffix="q") |
2501 | 2658 |
2502 # | 2659 # |
2503 # enter | 2660 # enter |
2504 # | 2661 # |
2505 add_group("enter", | 2662 add_group("enter", |
2506 suffix="l", | 2663 suffix="l", |
2507 not64=True, | 2664 not64=True, |
2508 cpu=["186"], | 2665 cpu=["186"], |
2509 gas_no_reverse=True, | 2666 gas_no_reverse=True, |
2510 opcode=[0xC8], | 2667 opcode=[0xC8], |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2683 opcode=[0xE0], | 2840 opcode=[0xE0], |
2684 operands=[Operand(type="Imm", tmod="Short", dest="JmpRel"), | 2841 operands=[Operand(type="Imm", tmod="Short", dest="JmpRel"), |
2685 Operand(type="Creg", size=sz, dest="AdSizeR")]) | 2842 Operand(type="Creg", size=sz, dest="AdSizeR")]) |
2686 | 2843 |
2687 add_insn("loop", "loop", modifiers=[2]) | 2844 add_insn("loop", "loop", modifiers=[2]) |
2688 add_insn("loopz", "loop", modifiers=[1]) | 2845 add_insn("loopz", "loop", modifiers=[1]) |
2689 add_insn("loope", "loop", modifiers=[1]) | 2846 add_insn("loope", "loop", modifiers=[1]) |
2690 add_insn("loopnz", "loop", modifiers=[0]) | 2847 add_insn("loopnz", "loop", modifiers=[0]) |
2691 add_insn("loopne", "loop", modifiers=[0]) | 2848 add_insn("loopne", "loop", modifiers=[0]) |
2692 | 2849 |
| 2850 # GAS w/l/q suffixes have to set addrsize via modifiers |
| 2851 for sfx, sz in zip("wlq", [16, 32, 64]): |
| 2852 add_group("loop"+sfx, |
| 2853 not64=(sz == 16), |
| 2854 only64=(sz == 64), |
| 2855 modifiers=["Gap", "AdSizeR"], |
| 2856 def_opersize_64=64, |
| 2857 opcode=[], |
| 2858 operands=[Operand(type="Imm", dest="JmpRel")]) |
| 2859 add_group("loop"+sfx, |
| 2860 not64=(sz == 16), |
| 2861 only64=(sz == 64), |
| 2862 modifiers=["Op0Add", "AdSizeR"], |
| 2863 def_opersize_64=64, |
| 2864 opcode=[0xE0], |
| 2865 operands=[Operand(type="Imm", tmod="Short", dest="JmpRel")]) |
| 2866 |
| 2867 add_group("loop"+sfx, |
| 2868 not64=(sz == 16), |
| 2869 only64=(sz == 64), |
| 2870 def_opersize_64=64, |
| 2871 opcode=[], |
| 2872 operands=[Operand(type="Imm", dest="JmpRel"), |
| 2873 Operand(type="Creg", size=sz, dest="AdSizeR")]) |
| 2874 add_group("loop"+sfx, |
| 2875 not64=(sz == 16), |
| 2876 only64=(sz == 64), |
| 2877 modifiers=["Op0Add"], |
| 2878 def_opersize_64=64, |
| 2879 opcode=[0xE0], |
| 2880 operands=[Operand(type="Imm", tmod="Short", dest="JmpRel"), |
| 2881 Operand(type="Creg", size=sz, dest="AdSizeR")]) |
| 2882 |
| 2883 add_insn("loop"+sfx, "loop"+sfx, parser="gas", modifiers=[2, sz]) |
| 2884 add_insn("loopz"+sfx, "loop"+sfx, parser="gas", modifiers=[1, sz]) |
| 2885 add_insn("loope"+sfx, "loop"+sfx, parser="gas", modifiers=[1, sz]) |
| 2886 add_insn("loopnz"+sfx, "loop"+sfx, parser="gas", modifiers=[0, sz]) |
| 2887 add_insn("loopne"+sfx, "loop"+sfx, parser="gas", modifiers=[0, sz]) |
| 2888 |
2693 ##################################################################### | 2889 ##################################################################### |
2694 # Set byte on flag instructions | 2890 # Set byte on flag instructions |
2695 ##################################################################### | 2891 ##################################################################### |
2696 add_group("setcc", | 2892 add_group("setcc", |
2697 suffix="b", | 2893 suffix="b", |
2698 cpu=["386"], | 2894 cpu=["386"], |
2699 modifiers=["Op1Add"], | 2895 modifiers=["Op1Add"], |
2700 opcode=[0x0F, 0x90], | 2896 opcode=[0x0F, 0x90], |
2701 spare=2, | 2897 spare=2, |
2702 operands=[Operand(type="RM", size=8, relaxed=True, dest="EA")]) | 2898 operands=[Operand(type="RM", size=8, relaxed=True, dest="EA")]) |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3067 add_insn("fstp", "fstp") | 3263 add_insn("fstp", "fstp") |
3068 | 3264 |
3069 # | 3265 # |
3070 # Long memory version of floating point load/store for GAS | 3266 # Long memory version of floating point load/store for GAS |
3071 # | 3267 # |
3072 add_group("fldstpt", | 3268 add_group("fldstpt", |
3073 cpu=["FPU"], | 3269 cpu=["FPU"], |
3074 modifiers=["SpAdd"], | 3270 modifiers=["SpAdd"], |
3075 opcode=[0xDB], | 3271 opcode=[0xDB], |
3076 spare=0, | 3272 spare=0, |
3077 operands=[Operand(type="Mem", size=80, dest="EA")]) | 3273 operands=[Operand(type="Mem", size=80, relaxed=True, dest="EA")]) |
3078 | 3274 |
3079 add_insn("fldt", "fldstpt", suffix="WEAK", modifiers=[5]) | 3275 add_insn("fldt", "fldstpt", modifiers=[5]) |
3080 add_insn("fstpt", "fldstpt", suffix="WEAK", modifiers=[7]) | 3276 add_insn("fstpt", "fldstpt", modifiers=[7]) |
3081 | 3277 |
3082 add_group("fildstp", | 3278 add_group("fildstp", |
3083 suffix="s", | 3279 suffix="s", |
3084 cpu=["FPU"], | 3280 cpu=["FPU"], |
3085 modifiers=["SpAdd"], | 3281 modifiers=["SpAdd"], |
3086 opcode=[0xDF], | 3282 opcode=[0xDF], |
3087 spare=0, | 3283 spare=0, |
3088 operands=[Operand(type="Mem", size=16, dest="EA")]) | 3284 operands=[Operand(type="Mem", size=16, dest="EA")]) |
3089 add_group("fildstp", | 3285 add_group("fildstp", |
3090 suffix="l", | 3286 suffix="l", |
(...skipping 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4653 cpu=["MMX", "P3"], | 4849 cpu=["MMX", "P3"], |
4654 notavx=True, | 4850 notavx=True, |
4655 opcode=[0x0F, 0xC4], | 4851 opcode=[0x0F, 0xC4], |
4656 operands=[Operand(type="SIMDReg", size=64, dest="Spare"), | 4852 operands=[Operand(type="SIMDReg", size=64, dest="Spare"), |
4657 Operand(type="Reg", size=32, dest="EA"), | 4853 Operand(type="Reg", size=32, dest="EA"), |
4658 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 4854 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
4659 add_group("pinsrw", | 4855 add_group("pinsrw", |
4660 suffix="q", | 4856 suffix="q", |
4661 cpu=["MMX", "P3"], | 4857 cpu=["MMX", "P3"], |
4662 notavx=True, | 4858 notavx=True, |
| 4859 def_opersize_64=64, |
4663 opersize=64, | 4860 opersize=64, |
4664 opcode=[0x0F, 0xC4], | 4861 opcode=[0x0F, 0xC4], |
4665 operands=[Operand(type="SIMDReg", size=64, dest="Spare"), | 4862 operands=[Operand(type="SIMDReg", size=64, dest="Spare"), |
4666 Operand(type="Reg", size=64, dest="EA"), | 4863 Operand(type="Reg", size=64, dest="EA"), |
4667 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 4864 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
4668 add_group("pinsrw", | 4865 add_group("pinsrw", |
4669 suffix="l", | 4866 suffix="l", |
4670 cpu=["MMX", "P3"], | 4867 cpu=["MMX", "P3"], |
4671 notavx=True, | 4868 notavx=True, |
4672 opcode=[0x0F, 0xC4], | 4869 opcode=[0x0F, 0xC4], |
4673 operands=[Operand(type="SIMDReg", size=64, dest="Spare"), | 4870 operands=[Operand(type="SIMDReg", size=64, dest="Spare"), |
4674 Operand(type="Mem", size=16, relaxed=True, dest="EA"), | 4871 Operand(type="Mem", size=16, relaxed=True, dest="EA"), |
4675 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 4872 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
4676 add_group("pinsrw", | 4873 add_group("pinsrw", |
4677 suffix="l", | 4874 suffix="l", |
4678 cpu=["SSE2"], | 4875 cpu=["SSE2"], |
4679 modifiers=["SetVEX"], | 4876 modifiers=["SetVEX"], |
4680 prefix=0x66, | 4877 prefix=0x66, |
4681 opcode=[0x0F, 0xC4], | 4878 opcode=[0x0F, 0xC4], |
4682 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), | 4879 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), |
4683 Operand(type="Reg", size=32, dest="EA"), | 4880 Operand(type="Reg", size=32, dest="EA"), |
4684 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 4881 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
4685 add_group("pinsrw", | 4882 add_group("pinsrw", |
4686 suffix="q", | 4883 suffix="q", |
4687 cpu=["SSE2"], | 4884 cpu=["SSE2"], |
4688 modifiers=["SetVEX"], | 4885 modifiers=["SetVEX"], |
| 4886 def_opersize_64=64, |
4689 opersize=64, | 4887 opersize=64, |
4690 prefix=0x66, | 4888 prefix=0x66, |
4691 opcode=[0x0F, 0xC4], | 4889 opcode=[0x0F, 0xC4], |
4692 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), | 4890 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), |
4693 Operand(type="Reg", size=64, dest="EA"), | 4891 Operand(type="Reg", size=64, dest="EA"), |
4694 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 4892 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
4695 add_group("pinsrw", | 4893 add_group("pinsrw", |
4696 suffix="l", | 4894 suffix="l", |
4697 cpu=["SSE2"], | 4895 cpu=["SSE2"], |
4698 modifiers=["SetVEX"], | 4896 modifiers=["SetVEX"], |
4699 prefix=0x66, | 4897 prefix=0x66, |
4700 opcode=[0x0F, 0xC4], | 4898 opcode=[0x0F, 0xC4], |
4701 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), | 4899 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), |
4702 Operand(type="Mem", size=16, relaxed=True, dest="EA"), | 4900 Operand(type="Mem", size=16, relaxed=True, dest="EA"), |
4703 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 4901 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
4704 add_group("pinsrw", | 4902 add_group("pinsrw", |
4705 suffix="l", | 4903 suffix="l", |
4706 cpu=["AVX"], | 4904 cpu=["AVX"], |
4707 vex=128, | 4905 vex=128, |
4708 prefix=0x66, | 4906 prefix=0x66, |
4709 opcode=[0x0F, 0xC4], | 4907 opcode=[0x0F, 0xC4], |
4710 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), | 4908 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
4711 Operand(type="SIMDReg", size=128, dest="VEX"), | 4909 Operand(type="SIMDReg", size=128, dest="VEX"), |
4712 Operand(type="Reg", size=32, dest="EA"), | 4910 Operand(type="Reg", size=32, dest="EA"), |
4713 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 4911 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
4714 add_group("pinsrw", | 4912 add_group("pinsrw", |
4715 suffix="q", | 4913 suffix="q", |
4716 cpu=["AVX"], | 4914 cpu=["AVX"], |
4717 vex=128, | 4915 vex=128, |
| 4916 def_opersize_64=64, |
4718 opersize=64, | 4917 opersize=64, |
4719 prefix=0x66, | 4918 prefix=0x66, |
4720 opcode=[0x0F, 0xC4], | 4919 opcode=[0x0F, 0xC4], |
4721 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), | 4920 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
4722 Operand(type="SIMDReg", size=128, dest="VEX"), | 4921 Operand(type="SIMDReg", size=128, dest="VEX"), |
4723 Operand(type="Reg", size=64, dest="EA"), | 4922 Operand(type="Reg", size=64, dest="EA"), |
4724 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 4923 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
4725 add_group("pinsrw", | 4924 add_group("pinsrw", |
4726 suffix="l", | 4925 suffix="l", |
4727 cpu=["AVX"], | 4926 cpu=["AVX"], |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5070 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), | 5269 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
5071 Operand(type="SIMDReg", size=128, dest="VEX"), | 5270 Operand(type="SIMDReg", size=128, dest="VEX"), |
5072 Operand(type="SIMDReg", size=128, dest="EA")]) | 5271 Operand(type="SIMDReg", size=128, dest="EA")]) |
5073 # movsd is added in string instructions above, so don't re-add_insn() | 5272 # movsd is added in string instructions above, so don't re-add_insn() |
5074 add_insn("vmovsd", "movsd", modifiers=[VEXL0], avx=True) | 5273 add_insn("vmovsd", "movsd", modifiers=[VEXL0], avx=True) |
5075 | 5274 |
5076 ##################################################################### | 5275 ##################################################################### |
5077 # P4 VMX Instructions | 5276 # P4 VMX Instructions |
5078 ##################################################################### | 5277 ##################################################################### |
5079 | 5278 |
| 5279 add_group("eptvpid", |
| 5280 modifiers=["Op2Add"], |
| 5281 suffix="l", |
| 5282 not64=True, |
| 5283 cpu=["EPTVPID"], |
| 5284 opersize=32, |
| 5285 prefix=0x66, |
| 5286 opcode=[0x0F, 0x38, 0x80], |
| 5287 operands=[Operand(type="Reg", size=32, dest="Spare"), |
| 5288 Operand(type="Mem", size=128, relaxed=True, dest="EA")]) |
| 5289 add_group("eptvpid", |
| 5290 modifiers=["Op2Add"], |
| 5291 suffix="q", |
| 5292 cpu=["EPTVPID"], |
| 5293 opersize=64, |
| 5294 prefix=0x66, |
| 5295 opcode=[0x0F, 0x38, 0x80], |
| 5296 operands=[Operand(type="Reg", size=64, dest="Spare"), |
| 5297 Operand(type="Mem", size=128, relaxed=True, dest="EA")]) |
| 5298 add_insn("invept", "eptvpid", modifiers=[0]) |
| 5299 add_insn("invvpid", "eptvpid", modifiers=[1]) |
| 5300 |
5080 add_insn("vmcall", "threebyte", modifiers=[0x0F, 0x01, 0xC1], cpu=["P4"]) | 5301 add_insn("vmcall", "threebyte", modifiers=[0x0F, 0x01, 0xC1], cpu=["P4"]) |
5081 add_insn("vmlaunch", "threebyte", modifiers=[0x0F, 0x01, 0xC2], cpu=["P4"]) | 5302 add_insn("vmlaunch", "threebyte", modifiers=[0x0F, 0x01, 0xC2], cpu=["P4"]) |
5082 add_insn("vmresume", "threebyte", modifiers=[0x0F, 0x01, 0xC3], cpu=["P4"]) | 5303 add_insn("vmresume", "threebyte", modifiers=[0x0F, 0x01, 0xC3], cpu=["P4"]) |
5083 add_insn("vmxoff", "threebyte", modifiers=[0x0F, 0x01, 0xC4], cpu=["P4"]) | 5304 add_insn("vmxoff", "threebyte", modifiers=[0x0F, 0x01, 0xC4], cpu=["P4"]) |
5084 | 5305 |
5085 add_group("vmxmemrd", | 5306 add_group("vmxmemrd", |
5086 suffix="l", | 5307 suffix="l", |
5087 not64=True, | 5308 not64=True, |
5088 cpu=["P4"], | 5309 cpu=["P4"], |
5089 opersize=32, | 5310 opersize=32, |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5130 add_group("vmxthreebytemem", | 5351 add_group("vmxthreebytemem", |
5131 modifiers=["PreAdd"], | 5352 modifiers=["PreAdd"], |
5132 cpu=["P4"], | 5353 cpu=["P4"], |
5133 prefix=0x00, | 5354 prefix=0x00, |
5134 opcode=[0x0F, 0xC7], | 5355 opcode=[0x0F, 0xC7], |
5135 spare=6, | 5356 spare=6, |
5136 operands=[Operand(type="Mem", size=64, relaxed=True, dest="EA")]) | 5357 operands=[Operand(type="Mem", size=64, relaxed=True, dest="EA")]) |
5137 add_insn("vmclear", "vmxthreebytemem", modifiers=[0x66]) | 5358 add_insn("vmclear", "vmxthreebytemem", modifiers=[0x66]) |
5138 add_insn("vmxon", "vmxthreebytemem", modifiers=[0xF3]) | 5359 add_insn("vmxon", "vmxthreebytemem", modifiers=[0xF3]) |
5139 | 5360 |
| 5361 ##################################################################### |
| 5362 # Intel SMX Instructions |
| 5363 ##################################################################### |
| 5364 add_insn("getsec", "twobyte", modifiers=[0x0F, 0x37], cpu=["SMX"]) |
| 5365 |
5140 add_insn("cvttpd2pi", "cvt_mm_xmm", modifiers=[0x66, 0x2C], cpu=["SSE2"]) | 5366 add_insn("cvttpd2pi", "cvt_mm_xmm", modifiers=[0x66, 0x2C], cpu=["SSE2"]) |
5141 add_insn("cvttsd2si", "cvt_rx_xmm64", modifiers=[0xF2, 0x2C], cpu=["SSE2"]) | 5367 add_insn("cvttsd2si", "cvt_rx_xmm64", modifiers=[0xF2, 0x2C], cpu=["SSE2"]) |
5142 add_insn("cvttpd2dq", "xmm_xmm128", modifiers=[0x66, 0xE6], cpu=["SSE2"]) | 5368 add_insn("cvttpd2dq", "xmm_xmm128", modifiers=[0x66, 0xE6], cpu=["SSE2"]) |
5143 add_insn("cvttps2dq", "xmm_xmm128", modifiers=[0xF3, 0x5B], cpu=["SSE2"]) | 5369 add_insn("cvttps2dq", "xmm_xmm128", modifiers=[0xF3, 0x5B], cpu=["SSE2"]) |
5144 add_insn("pmuludq", "mmxsse2", modifiers=[0xF4], cpu=["SSE2"]) | 5370 add_insn("pmuludq", "mmxsse2", modifiers=[0xF4], cpu=["SSE2"]) |
5145 add_insn("pshufd", "xmm_xmm128_imm", modifiers=[0x66, 0x70], cpu=["SSE2"]) | 5371 add_insn("pshufd", "xmm_xmm128_imm", modifiers=[0x66, 0x70], cpu=["SSE2"]) |
5146 add_insn("pshufhw", "xmm_xmm128_imm", modifiers=[0xF3, 0x70], cpu=["SSE2"]) | 5372 add_insn("pshufhw", "xmm_xmm128_imm", modifiers=[0xF3, 0x70], cpu=["SSE2"]) |
5147 add_insn("pshuflw", "xmm_xmm128_imm", modifiers=[0xF2, 0x70], cpu=["SSE2"]) | 5373 add_insn("pshuflw", "xmm_xmm128_imm", modifiers=[0xF2, 0x70], cpu=["SSE2"]) |
5148 add_insn("punpckhqdq", "xmm_xmm128", modifiers=[0x66, 0x6D], cpu=["SSE2"]) | 5374 add_insn("punpckhqdq", "xmm_xmm128", modifiers=[0x66, 0x6D], cpu=["SSE2"]) |
5149 add_insn("punpcklqdq", "xmm_xmm128", modifiers=[0x66, 0x6C], cpu=["SSE2"]) | 5375 add_insn("punpcklqdq", "xmm_xmm128", modifiers=[0x66, 0x6C], cpu=["SSE2"]) |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5577 prefix=0xF2, | 5803 prefix=0xF2, |
5578 opcode=[0x0F, 0x38, 0xF0+(sz!=8)], | 5804 opcode=[0x0F, 0x38, 0xF0+(sz!=8)], |
5579 operands=[Operand(type="Reg", size=64, dest="Spare"), | 5805 operands=[Operand(type="Reg", size=64, dest="Spare"), |
5580 Operand(type="RM", size=sz, relaxed=(sz==64), dest="EA")]) | 5806 Operand(type="RM", size=sz, relaxed=(sz==64), dest="EA")]) |
5581 | 5807 |
5582 add_insn("crc32", "crc32") | 5808 add_insn("crc32", "crc32") |
5583 | 5809 |
5584 add_group("extractps", | 5810 add_group("extractps", |
5585 cpu=["SSE41"], | 5811 cpu=["SSE41"], |
5586 modifiers=["SetVEX"], | 5812 modifiers=["SetVEX"], |
5587 opersize=32, | |
5588 prefix=0x66, | 5813 prefix=0x66, |
5589 opcode=[0x0F, 0x3A, 0x17], | 5814 opcode=[0x0F, 0x3A, 0x17], |
5590 operands=[Operand(type="RM", size=32, relaxed=True, dest="EA"), | 5815 operands=[Operand(type="RM", size=32, relaxed=True, dest="EA"), |
5591 Operand(type="SIMDReg", size=128, dest="Spare"), | 5816 Operand(type="SIMDReg", size=128, dest="Spare"), |
5592 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 5817 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
5593 add_group("extractps", | 5818 add_group("extractps", |
5594 cpu=["SSE41"], | 5819 cpu=["SSE41"], |
5595 modifiers=["SetVEX"], | 5820 modifiers=["SetVEX"], |
5596 opersize=64, | 5821 opersize=64, |
5597 prefix=0x66, | 5822 prefix=0x66, |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5672 add_insn("vpcmpistrm", "sse4pcmpstr", modifiers=[0x62, VEXL0], avx=True) | 5897 add_insn("vpcmpistrm", "sse4pcmpstr", modifiers=[0x62, VEXL0], avx=True) |
5673 | 5898 |
5674 add_group("pextrb", | 5899 add_group("pextrb", |
5675 cpu=["SSE41"], | 5900 cpu=["SSE41"], |
5676 modifiers=["SetVEX"], | 5901 modifiers=["SetVEX"], |
5677 prefix=0x66, | 5902 prefix=0x66, |
5678 opcode=[0x0F, 0x3A, 0x14], | 5903 opcode=[0x0F, 0x3A, 0x14], |
5679 operands=[Operand(type="Mem", size=8, relaxed=True, dest="EA"), | 5904 operands=[Operand(type="Mem", size=8, relaxed=True, dest="EA"), |
5680 Operand(type="SIMDReg", size=128, dest="Spare"), | 5905 Operand(type="SIMDReg", size=128, dest="Spare"), |
5681 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 5906 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
5682 for sz in [32, 64]: | 5907 add_group("pextrb", |
5683 add_group("pextrb", | 5908 cpu=["SSE41"], |
5684 cpu=["SSE41"], | 5909 modifiers=["SetVEX"], |
5685 modifiers=["SetVEX"], | 5910 prefix=0x66, |
5686 opersize=sz, | 5911 opcode=[0x0F, 0x3A, 0x14], |
5687 prefix=0x66, | 5912 operands=[Operand(type="Reg", size=32, dest="EA"), |
5688 opcode=[0x0F, 0x3A, 0x14], | 5913 Operand(type="SIMDReg", size=128, dest="Spare"), |
5689 operands=[Operand(type="Reg", size=sz, dest="EA"), | 5914 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
5690 Operand(type="SIMDReg", size=128, dest="Spare"), | 5915 add_group("pextrb", |
5691 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 5916 cpu=["SSE41"], |
| 5917 modifiers=["SetVEX"], |
| 5918 opersize=64, |
| 5919 prefix=0x66, |
| 5920 opcode=[0x0F, 0x3A, 0x14], |
| 5921 operands=[Operand(type="Reg", size=64, dest="EA"), |
| 5922 Operand(type="SIMDReg", size=128, dest="Spare"), |
| 5923 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
5692 | 5924 |
5693 add_insn("pextrb", "pextrb") | 5925 add_insn("pextrb", "pextrb") |
5694 add_insn("vpextrb", "pextrb", modifiers=[VEXL0], avx=True) | 5926 add_insn("vpextrb", "pextrb", modifiers=[VEXL0], avx=True) |
5695 | 5927 |
5696 add_group("pextrd", | 5928 add_group("pextrd", |
5697 cpu=["SSE41"], | 5929 cpu=["SSE41"], |
5698 modifiers=["SetVEX"], | 5930 modifiers=["SetVEX"], |
5699 opersize=32, | |
5700 prefix=0x66, | 5931 prefix=0x66, |
5701 opcode=[0x0F, 0x3A, 0x16], | 5932 opcode=[0x0F, 0x3A, 0x16], |
5702 operands=[Operand(type="RM", size=32, relaxed=True, dest="EA"), | 5933 operands=[Operand(type="RM", size=32, relaxed=True, dest="EA"), |
5703 Operand(type="SIMDReg", size=128, dest="Spare"), | 5934 Operand(type="SIMDReg", size=128, dest="Spare"), |
5704 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 5935 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
5705 | 5936 |
5706 add_insn("pextrd", "pextrd") | 5937 add_insn("pextrd", "pextrd") |
5707 add_insn("vpextrd", "pextrd", modifiers=[VEXL0], avx=True) | 5938 add_insn("vpextrd", "pextrd", modifiers=[VEXL0], avx=True) |
5708 | 5939 |
5709 add_group("pextrq", | 5940 add_group("pextrq", |
(...skipping 13 matching lines...) Expand all Loading... |
5723 cpu=["SSE41"], | 5954 cpu=["SSE41"], |
5724 modifiers=["SetVEX"], | 5955 modifiers=["SetVEX"], |
5725 prefix=0x66, | 5956 prefix=0x66, |
5726 opcode=[0x0F, 0x3A, 0x20], | 5957 opcode=[0x0F, 0x3A, 0x20], |
5727 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), | 5958 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), |
5728 Operand(type="Mem", size=8, relaxed=True, dest="EA"), | 5959 Operand(type="Mem", size=8, relaxed=True, dest="EA"), |
5729 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 5960 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
5730 add_group("pinsrb", | 5961 add_group("pinsrb", |
5731 cpu=["SSE41"], | 5962 cpu=["SSE41"], |
5732 modifiers=["SetVEX"], | 5963 modifiers=["SetVEX"], |
5733 opersize=32, | |
5734 prefix=0x66, | 5964 prefix=0x66, |
5735 opcode=[0x0F, 0x3A, 0x20], | 5965 opcode=[0x0F, 0x3A, 0x20], |
5736 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), | 5966 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), |
5737 Operand(type="Reg", size=32, dest="EA"), | 5967 Operand(type="Reg", size=32, dest="EA"), |
5738 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 5968 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
5739 add_group("pinsrb", | 5969 add_group("pinsrb", |
5740 cpu=["AVX"], | 5970 cpu=["AVX"], |
5741 vex=128, | 5971 vex=128, |
5742 prefix=0x66, | 5972 prefix=0x66, |
5743 opcode=[0x0F, 0x3A, 0x20], | 5973 opcode=[0x0F, 0x3A, 0x20], |
5744 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), | 5974 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
5745 Operand(type="SIMDReg", size=128, dest="VEX"), | 5975 Operand(type="SIMDReg", size=128, dest="VEX"), |
5746 Operand(type="Mem", size=8, relaxed=True, dest="EA"), | 5976 Operand(type="Mem", size=8, relaxed=True, dest="EA"), |
5747 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 5977 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
5748 add_group("pinsrb", | 5978 add_group("pinsrb", |
5749 cpu=["AVX"], | 5979 cpu=["AVX"], |
5750 vex=128, | 5980 vex=128, |
5751 opersize=32, | |
5752 prefix=0x66, | 5981 prefix=0x66, |
5753 opcode=[0x0F, 0x3A, 0x20], | 5982 opcode=[0x0F, 0x3A, 0x20], |
5754 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), | 5983 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), |
5755 Operand(type="SIMDReg", size=128, dest="VEX"), | 5984 Operand(type="SIMDReg", size=128, dest="VEX"), |
5756 Operand(type="Reg", size=32, dest="EA"), | 5985 Operand(type="Reg", size=32, dest="EA"), |
5757 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 5986 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
5758 | 5987 |
5759 add_insn("pinsrb", "pinsrb") | 5988 add_insn("pinsrb", "pinsrb") |
5760 add_insn("vpinsrb", "pinsrb", modifiers=[VEXL0], avx=True) | 5989 add_insn("vpinsrb", "pinsrb", modifiers=[VEXL0], avx=True) |
5761 | 5990 |
5762 add_group("pinsrd", | 5991 add_group("pinsrd", |
5763 cpu=["SSE41"], | 5992 cpu=["SSE41"], |
5764 modifiers=["SetVEX"], | 5993 modifiers=["SetVEX"], |
5765 opersize=32, | |
5766 prefix=0x66, | 5994 prefix=0x66, |
5767 opcode=[0x0F, 0x3A, 0x22], | 5995 opcode=[0x0F, 0x3A, 0x22], |
5768 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), | 5996 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), |
5769 Operand(type="RM", size=32, relaxed=True, dest="EA"), | 5997 Operand(type="RM", size=32, relaxed=True, dest="EA"), |
5770 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 5998 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
5771 add_group("pinsrd", | 5999 add_group("pinsrd", |
5772 cpu=["AVX"], | 6000 cpu=["AVX"], |
5773 vex=128, | 6001 vex=128, |
5774 opersize=32, | |
5775 prefix=0x66, | 6002 prefix=0x66, |
5776 opcode=[0x0F, 0x3A, 0x22], | 6003 opcode=[0x0F, 0x3A, 0x22], |
5777 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), | 6004 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
5778 Operand(type="SIMDReg", size=128, dest="VEX"), | 6005 Operand(type="SIMDReg", size=128, dest="VEX"), |
5779 Operand(type="RM", size=32, relaxed=True, dest="EA"), | 6006 Operand(type="RM", size=32, relaxed=True, dest="EA"), |
5780 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 6007 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
5781 | 6008 |
5782 add_insn("pinsrd", "pinsrd") | 6009 add_insn("pinsrd", "pinsrd") |
5783 add_insn("vpinsrd", "pinsrd", modifiers=[VEXL0], avx=True) | 6010 add_insn("vpinsrd", "pinsrd", modifiers=[VEXL0], avx=True) |
5784 | 6011 |
(...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6451 add_insn("vaesenc", "aes", modifiers=[0x38, 0xDC, VEXL0], avx=True) | 6678 add_insn("vaesenc", "aes", modifiers=[0x38, 0xDC, VEXL0], avx=True) |
6452 add_insn("vaesenclast", "aes", modifiers=[0x38, 0xDD, VEXL0], avx=True) | 6679 add_insn("vaesenclast", "aes", modifiers=[0x38, 0xDD, VEXL0], avx=True) |
6453 add_insn("vaesdec", "aes", modifiers=[0x38, 0xDE, VEXL0], avx=True) | 6680 add_insn("vaesdec", "aes", modifiers=[0x38, 0xDE, VEXL0], avx=True) |
6454 add_insn("vaesdeclast", "aes", modifiers=[0x38, 0xDF, VEXL0], avx=True) | 6681 add_insn("vaesdeclast", "aes", modifiers=[0x38, 0xDF, VEXL0], avx=True) |
6455 | 6682 |
6456 add_group("aesimc", | 6683 add_group("aesimc", |
6457 cpu=["AES"], | 6684 cpu=["AES"], |
6458 modifiers=["Op1Add", "Op2Add", "SetVEX"], | 6685 modifiers=["Op1Add", "Op2Add", "SetVEX"], |
6459 prefix=0x66, | 6686 prefix=0x66, |
6460 opcode=[0x0F, 0x00, 0x00], | 6687 opcode=[0x0F, 0x00, 0x00], |
6461 operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), | 6688 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
6462 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) | 6689 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
6463 | 6690 |
6464 add_insn("aesimc", "aesimc", modifiers=[0x38, 0xDB]) | 6691 add_insn("aesimc", "aesimc", modifiers=[0x38, 0xDB]) |
6465 add_insn("vaesimc", "aesimc", modifiers=[0x38, 0xDB, VEXL0], avx=True) | 6692 add_insn("vaesimc", "aesimc", modifiers=[0x38, 0xDB, VEXL0], avx=True) |
6466 | 6693 |
6467 | 6694 |
6468 add_group("aes_imm", | 6695 add_group("aes_imm", |
6469 cpu=["AES"], | 6696 cpu=["AES"], |
6470 modifiers=["Op1Add", "Op2Add", "SetVEX"], | 6697 modifiers=["Op1Add", "Op2Add", "SetVEX"], |
6471 prefix=0x66, | 6698 prefix=0x66, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6520 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), | 6747 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
6521 Operand(type="SIMDReg", size=128, dest="VEX"), | 6748 Operand(type="SIMDReg", size=128, dest="VEX"), |
6522 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) | 6749 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
6523 | 6750 |
6524 for comb, combval in zip(["lql","hql","lqh","hqh"], [0x00,0x01,0x10,0x11]): | 6751 for comb, combval in zip(["lql","hql","lqh","hqh"], [0x00,0x01,0x10,0x11]): |
6525 add_insn("pclmul"+comb+"qdq", "pclmulqdq_fixed", modifiers=[combval]) | 6752 add_insn("pclmul"+comb+"qdq", "pclmulqdq_fixed", modifiers=[combval]) |
6526 add_insn("vpclmul"+comb+"qdq", "pclmulqdq_fixed", | 6753 add_insn("vpclmul"+comb+"qdq", "pclmulqdq_fixed", |
6527 modifiers=[combval, VEXL0], avx=True) | 6754 modifiers=[combval, VEXL0], avx=True) |
6528 | 6755 |
6529 ##################################################################### | 6756 ##################################################################### |
| 6757 # AVX Post-32nm instructions |
| 6758 ##################################################################### |
| 6759 |
| 6760 # RDRAND |
| 6761 add_group("rdrand", |
| 6762 cpu=["RDRAND"], |
| 6763 opersize=16, |
| 6764 opcode=[0x0F, 0xC7], |
| 6765 spare=6, |
| 6766 operands=[Operand(type="Reg", size=16, dest="EA")]) |
| 6767 add_group("rdrand", |
| 6768 #suffix="l", |
| 6769 cpu=["RDRAND"], |
| 6770 opersize=32, |
| 6771 opcode=[0x0F, 0xC7], |
| 6772 spare=6, |
| 6773 operands=[Operand(type="Reg", size=32, dest="EA")]) |
| 6774 add_group("rdrand", |
| 6775 cpu=["RDRAND"], |
| 6776 opersize=64, |
| 6777 opcode=[0x0F, 0xC7], |
| 6778 spare=6, |
| 6779 operands=[Operand(type="Reg", size=64, dest="EA")]) |
| 6780 add_insn("rdrand", "rdrand") |
| 6781 |
| 6782 # FSGSBASE instructions |
| 6783 add_group("fs_gs_base", |
| 6784 only64=True, |
| 6785 cpu=["FSGSBASE"], |
| 6786 modifiers=['SpAdd'], |
| 6787 opersize=32, |
| 6788 prefix=0xF3, |
| 6789 opcode=[0x0F, 0xAE], |
| 6790 operands=[Operand(type="Reg", size=32, dest="EA")]) |
| 6791 add_group("fs_gs_base", |
| 6792 only64=True, |
| 6793 cpu=["FSGSBASE"], |
| 6794 opersize=64, |
| 6795 modifiers=['SpAdd'], |
| 6796 prefix=0xF3, |
| 6797 opcode=[0x0F, 0xAE], |
| 6798 operands=[Operand(type="Reg", size=64, dest="EA")]) |
| 6799 |
| 6800 add_insn("rdfsbase", "fs_gs_base", modifiers=[0], only64=True) |
| 6801 add_insn("rdgsbase", "fs_gs_base", modifiers=[1], only64=True) |
| 6802 add_insn("wrfsbase", "fs_gs_base", modifiers=[2], only64=True) |
| 6803 add_insn("wrgsbase", "fs_gs_base", modifiers=[3], only64=True) |
| 6804 |
| 6805 # Float-16 conversion instructions |
| 6806 for g in ['ps2ph', 'ph2ps']: |
| 6807 operands1=[] |
| 6808 operands1.append(Operand(type="SIMDReg", size=128, dest="EA")) |
| 6809 operands1.append(Operand(type="SIMDReg", size=128, dest="Spare")) |
| 6810 |
| 6811 operands2=[] |
| 6812 operands2.append(Operand(type="Mem", size=64, dest="EA")) |
| 6813 operands2.append(Operand(type="SIMDReg", size=128, dest="Spare")) |
| 6814 |
| 6815 operands3=[] |
| 6816 operands3.append(Operand(type="SIMDReg", size=128, dest="EA")) |
| 6817 operands3.append(Operand(type="SIMDReg", size=256, dest="Spare")) |
| 6818 |
| 6819 operands4=[] |
| 6820 operands4.append(Operand(type="Mem", size=128, dest="EA")) |
| 6821 operands4.append(Operand(type="SIMDReg", size=256, dest="Spare")) |
| 6822 |
| 6823 if g == 'ph2ps': |
| 6824 operands1.reverse() |
| 6825 operands2.reverse() |
| 6826 operands3.reverse() |
| 6827 operands4.reverse() |
| 6828 map = 0x38 |
| 6829 elif g == 'ps2ph': |
| 6830 immop = Operand(type="Imm", size=8, relaxed=True, dest="Imm") |
| 6831 operands1.append(immop) |
| 6832 operands2.append(immop) |
| 6833 operands3.append(immop) |
| 6834 operands4.append(immop) |
| 6835 map = 0x3A |
| 6836 |
| 6837 add_group("avx_cvt" + g, |
| 6838 cpu=["F16C", "AVX"], |
| 6839 modifiers=["PreAdd", "Op2Add"], |
| 6840 vex=128, |
| 6841 prefix=0x00, |
| 6842 opcode=[0x0F, map, 0x00], |
| 6843 operands=operands1) |
| 6844 |
| 6845 add_group("avx_cvt" + g, |
| 6846 cpu=["F16C", "AVX"], |
| 6847 modifiers=["PreAdd", "Op2Add"], |
| 6848 vex=128, |
| 6849 prefix=0x00, |
| 6850 opcode=[0x0F, map, 0x00], |
| 6851 operands=operands2) |
| 6852 |
| 6853 add_group("avx_cvt" + g, |
| 6854 cpu=["F16C", "AVX"], |
| 6855 modifiers=["PreAdd", "Op2Add"], |
| 6856 vex=256, |
| 6857 prefix=0x00, |
| 6858 opcode=[0x0F, map, 0x00], |
| 6859 operands=operands3) |
| 6860 |
| 6861 add_group("avx_cvt" + g, |
| 6862 cpu=["F16C", "AVX"], |
| 6863 modifiers=["PreAdd", "Op2Add"], |
| 6864 vex=256, |
| 6865 prefix=0x00, |
| 6866 opcode=[0x0F, map, 0x00], |
| 6867 operands=operands4) |
| 6868 |
| 6869 add_insn("vcvtps2ph", "avx_cvtps2ph", modifiers=[0x66, 0x1D], avx=True) |
| 6870 add_insn("vcvtph2ps", "avx_cvtph2ps", modifiers=[0x66, 0x13], avx=True) |
| 6871 |
| 6872 ##################################################################### |
6530 # AMD SSE4a instructions | 6873 # AMD SSE4a instructions |
6531 ##################################################################### | 6874 ##################################################################### |
6532 | 6875 |
6533 add_group("extrq", | 6876 add_group("extrq", |
6534 cpu=["SSE4a"], | 6877 cpu=["SSE4a"], |
6535 prefix=0x66, | 6878 prefix=0x66, |
6536 opcode=[0x0F, 0x78], | 6879 opcode=[0x0F, 0x78], |
6537 operands=[Operand(type="SIMDReg", size=128, dest="EA"), | 6880 operands=[Operand(type="SIMDReg", size=128, dest="EA"), |
6538 Operand(type="Imm", size=8, relaxed=True, dest="EA"), | 6881 Operand(type="Imm", size=8, relaxed=True, dest="EA"), |
6539 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 6882 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6575 add_group("movntss", | 6918 add_group("movntss", |
6576 cpu=["SSE4a"], | 6919 cpu=["SSE4a"], |
6577 prefix=0xF3, | 6920 prefix=0xF3, |
6578 opcode=[0x0F, 0x2B], | 6921 opcode=[0x0F, 0x2B], |
6579 operands=[Operand(type="Mem", size=32, relaxed=True, dest="EA"), | 6922 operands=[Operand(type="Mem", size=32, relaxed=True, dest="EA"), |
6580 Operand(type="SIMDReg", size=128, dest="Spare")]) | 6923 Operand(type="SIMDReg", size=128, dest="Spare")]) |
6581 | 6924 |
6582 add_insn("movntss", "movntss") | 6925 add_insn("movntss", "movntss") |
6583 | 6926 |
6584 ##################################################################### | 6927 ##################################################################### |
6585 # AMD SSE5 instructions | 6928 # AMD XOP instructions |
6586 ##################################################################### | 6929 ##################################################################### |
6587 | 6930 |
6588 add_group("sse5com", | 6931 add_group("vfrc_pdps", |
6589 cpu=["SSE5"], | 6932 cpu=["XOP"], |
| 6933 modifiers=["Op1Add"], |
| 6934 xop=128, |
| 6935 opcode=[0x09, 0x80], |
| 6936 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 6937 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
| 6938 add_group("vfrc_pdps", |
| 6939 cpu=["XOP"], |
| 6940 modifiers=["Op1Add"], |
| 6941 xop=256, |
| 6942 opcode=[0x09, 0x80], |
| 6943 operands=[Operand(type="SIMDReg", size=256, dest="Spare"), |
| 6944 Operand(type="SIMDRM", size=256, relaxed=True, dest="EA")]) |
| 6945 add_insn("vfrczpd", "vfrc_pdps", modifiers=[0x01]) |
| 6946 add_insn("vfrczps", "vfrc_pdps", modifiers=[0x00]) |
| 6947 |
| 6948 add_group("vfrczsd", |
| 6949 cpu=["XOP"], |
| 6950 xop=128, |
| 6951 opcode=[0x09, 0x83], |
| 6952 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 6953 Operand(type="SIMDReg", size=128, dest="EA")]) |
| 6954 add_group("vfrczsd", |
| 6955 cpu=["XOP"], |
| 6956 xop=128, |
| 6957 opcode=[0x09, 0x83], |
| 6958 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 6959 Operand(type="Mem", size=64, relaxed=True, dest="EA")]) |
| 6960 add_insn("vfrczsd", "vfrczsd") |
| 6961 |
| 6962 add_group("vfrczss", |
| 6963 cpu=["XOP"], |
| 6964 xop=128, |
| 6965 opcode=[0x09, 0x82], |
| 6966 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 6967 Operand(type="SIMDReg", size=128, dest="EA")]) |
| 6968 add_group("vfrczss", |
| 6969 cpu=["XOP"], |
| 6970 xop=128, |
| 6971 opcode=[0x09, 0x82], |
| 6972 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 6973 Operand(type="Mem", size=32, relaxed=True, dest="EA")]) |
| 6974 add_insn("vfrczss", "vfrczss") |
| 6975 |
| 6976 add_group("vpcmov", |
| 6977 cpu=["XOP"], |
| 6978 xop=128, |
| 6979 xopw=0, |
| 6980 opcode=[0x08, 0xA2], |
| 6981 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 6982 Operand(type="SIMDReg", size=128, dest="VEX"), |
| 6983 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
| 6984 Operand(type="SIMDReg", size=128, dest="VEXImmSrc")]) |
| 6985 add_group("vpcmov", |
| 6986 cpu=["XOP"], |
| 6987 xop=128, |
| 6988 xopw=1, |
| 6989 opcode=[0x08, 0xA2], |
| 6990 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 6991 Operand(type="SIMDReg", size=128, dest="VEX"), |
| 6992 Operand(type="SIMDReg", size=128, dest="VEXImmSrc"), |
| 6993 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
| 6994 add_group("vpcmov", |
| 6995 cpu=["XOP"], |
| 6996 xop=256, |
| 6997 xopw=0, |
| 6998 opcode=[0x08, 0xA2], |
| 6999 operands=[Operand(type="SIMDReg", size=256, dest="Spare"), |
| 7000 Operand(type="SIMDReg", size=256, dest="VEX"), |
| 7001 Operand(type="SIMDRM", size=256, relaxed=True, dest="EA"), |
| 7002 Operand(type="SIMDReg", size=256, dest="VEXImmSrc")]) |
| 7003 add_group("vpcmov", |
| 7004 cpu=["XOP"], |
| 7005 xop=256, |
| 7006 xopw=1, |
| 7007 opcode=[0x08, 0xA2], |
| 7008 operands=[Operand(type="SIMDReg", size=256, dest="Spare"), |
| 7009 Operand(type="SIMDReg", size=256, dest="VEX"), |
| 7010 Operand(type="SIMDReg", size=256, dest="VEXImmSrc"), |
| 7011 Operand(type="SIMDRM", size=256, relaxed=True, dest="EA")]) |
| 7012 |
| 7013 add_insn("vpcmov", "vpcmov") |
| 7014 |
| 7015 add_group("vpcom", |
| 7016 cpu=["XOP"], |
| 7017 modifiers=["Op1Add", "Imm8"], |
| 7018 xop=128, |
| 7019 opcode=[0x08, 0x00], |
| 7020 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7021 Operand(type="SIMDReg", size=128, dest="VEX"), |
| 7022 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
| 7023 add_group("vpcom_imm", |
| 7024 cpu=["XOP"], |
| 7025 modifiers=["Op1Add"], |
| 7026 xop=128, |
| 7027 opcode=[0x08, 0x00], |
| 7028 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7029 Operand(type="SIMDReg", size=128, dest="VEX"), |
| 7030 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
| 7031 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
| 7032 |
| 7033 for opc, sfx in [(0xCC, "b"), |
| 7034 (0xCE, "d"), |
| 7035 (0xCD, "w"), |
| 7036 (0xCF, "q"), |
| 7037 (0xEC, "ub"), |
| 7038 (0xEE, "ud"), |
| 7039 (0xEF, "uq"), |
| 7040 (0xED, "uw")]: |
| 7041 add_insn("vpcom"+sfx, "vpcom_imm", modifiers=[opc]) |
| 7042 for ib, cc in enumerate(["lt", "le", "gt", "ge", |
| 7043 "eq", "neq", "false", "true"]): |
| 7044 add_insn("vpcom"+cc+sfx, "vpcom", modifiers=[opc, ib]) |
| 7045 # ne alias for neq |
| 7046 add_insn("vpcomne"+sfx, "vpcom", modifiers=[opc, 5]) |
| 7047 |
| 7048 add_group("vphaddsub", |
| 7049 cpu=["XOP"], |
| 7050 modifiers=["Op1Add"], |
| 7051 xop=128, |
| 7052 opcode=[0x09, 0x00], |
| 7053 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7054 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
| 7055 |
| 7056 add_insn("vphaddbw", "vphaddsub", modifiers=[0xC1]) |
| 7057 add_insn("vphaddbd", "vphaddsub", modifiers=[0xC2]) |
| 7058 add_insn("vphaddbq", "vphaddsub", modifiers=[0xC3]) |
| 7059 add_insn("vphaddwd", "vphaddsub", modifiers=[0xC6]) |
| 7060 add_insn("vphaddwq", "vphaddsub", modifiers=[0xC7]) |
| 7061 add_insn("vphadddq", "vphaddsub", modifiers=[0xCB]) |
| 7062 |
| 7063 add_insn("vphaddubw", "vphaddsub", modifiers=[0xD1]) |
| 7064 add_insn("vphaddubd", "vphaddsub", modifiers=[0xD2]) |
| 7065 add_insn("vphaddubq", "vphaddsub", modifiers=[0xD3]) |
| 7066 add_insn("vphadduwd", "vphaddsub", modifiers=[0xD6]) |
| 7067 add_insn("vphadduwq", "vphaddsub", modifiers=[0xD7]) |
| 7068 add_insn("vphaddudq", "vphaddsub", modifiers=[0xD8]) |
| 7069 |
| 7070 add_insn("vphsubbw", "vphaddsub", modifiers=[0xE1]) |
| 7071 add_insn("vphsubwd", "vphaddsub", modifiers=[0xE2]) |
| 7072 add_insn("vphsubdq", "vphaddsub", modifiers=[0xE3]) |
| 7073 |
| 7074 add_group("vpma", |
| 7075 cpu=["XOP"], |
| 7076 modifiers=["Op1Add"], |
| 7077 xop=128, |
| 7078 opcode=[0x08, 0x00], |
| 7079 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7080 Operand(type="SIMDReg", size=128, dest="VEX"), |
| 7081 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
| 7082 Operand(type="SIMDReg", size=128, dest="VEXImmSrc")]) |
| 7083 |
| 7084 add_insn("vpmacsdd", "vpma", modifiers=[0x9E]) |
| 7085 add_insn("vpmacsdqh", "vpma", modifiers=[0x9F]) |
| 7086 add_insn("vpmacsdql", "vpma", modifiers=[0x97]) |
| 7087 add_insn("vpmacssdd", "vpma", modifiers=[0x8E]) |
| 7088 add_insn("vpmacssdqh", "vpma", modifiers=[0x8F]) |
| 7089 add_insn("vpmacssdql", "vpma", modifiers=[0x87]) |
| 7090 add_insn("vpmacsswd", "vpma", modifiers=[0x86]) |
| 7091 add_insn("vpmacssww", "vpma", modifiers=[0x85]) |
| 7092 add_insn("vpmacswd", "vpma", modifiers=[0x96]) |
| 7093 add_insn("vpmacsww", "vpma", modifiers=[0x95]) |
| 7094 add_insn("vpmadcsswd", "vpma", modifiers=[0xA6]) |
| 7095 add_insn("vpmadcswd", "vpma", modifiers=[0xB6]) |
| 7096 |
| 7097 add_group("vpperm", |
| 7098 cpu=["XOP"], |
| 7099 xop=128, |
| 7100 xopw=0, |
| 7101 opcode=[0x08, 0xA3], |
| 7102 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7103 Operand(type="SIMDReg", size=128, dest="VEX"), |
| 7104 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
| 7105 Operand(type="SIMDReg", size=128, dest="VEXImmSrc")]) |
| 7106 add_group("vpperm", |
| 7107 cpu=["XOP"], |
| 7108 xop=128, |
| 7109 xopw=1, |
| 7110 opcode=[0x08, 0xA3], |
| 7111 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7112 Operand(type="SIMDReg", size=128, dest="VEX"), |
| 7113 Operand(type="SIMDReg", size=128, dest="VEXImmSrc"), |
| 7114 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
| 7115 add_insn("vpperm", "vpperm") |
| 7116 |
| 7117 add_group("vprot", |
| 7118 cpu=["XOP"], |
| 7119 modifiers=["Op1Add"], |
| 7120 xop=128, |
| 7121 xopw=0, |
| 7122 opcode=[0x09, 0x90], |
| 7123 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7124 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
| 7125 Operand(type="SIMDReg", size=128, dest="VEX")]) |
| 7126 add_group("vprot", |
| 7127 cpu=["XOP"], |
| 7128 modifiers=["Op1Add"], |
| 7129 xop=128, |
| 7130 xopw=1, |
| 7131 opcode=[0x09, 0x90], |
| 7132 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7133 Operand(type="SIMDReg", size=128, dest="VEX"), |
| 7134 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
| 7135 add_group("vprot", |
| 7136 cpu=["XOP"], |
| 7137 modifiers=["Op1Add"], |
| 7138 xop=128, |
| 7139 opcode=[0x08, 0xC0], |
| 7140 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7141 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
| 7142 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
| 7143 for opc, sfx in enumerate(["b", "w", "d", "q"]): |
| 7144 add_insn("vprot"+sfx, "vprot", modifiers=[opc]) |
| 7145 |
| 7146 add_group("amd_vpshift", |
| 7147 cpu=["XOP"], |
| 7148 modifiers=["Op1Add"], |
| 7149 xop=128, |
| 7150 xopw=0, |
| 7151 opcode=[0x09, 0x00], |
| 7152 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7153 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
| 7154 Operand(type="SIMDReg", size=128, dest="VEX")]) |
| 7155 add_group("amd_vpshift", |
| 7156 cpu=["XOP"], |
| 7157 modifiers=["Op1Add"], |
| 7158 xop=128, |
| 7159 xopw=1, |
| 7160 opcode=[0x09, 0x00], |
| 7161 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7162 Operand(type="SIMDReg", size=128, dest="VEX"), |
| 7163 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
| 7164 for opc, sfx in enumerate(["b", "w", "d", "q"]): |
| 7165 add_insn("vpsha"+sfx, "amd_vpshift", modifiers=[0x98+opc]) |
| 7166 add_insn("vpshl"+sfx, "amd_vpshift", modifiers=[0x94+opc]) |
| 7167 |
| 7168 ##################################################################### |
| 7169 # AMD FMA4 instructions (same as original Intel FMA instructions) |
| 7170 ##################################################################### |
| 7171 |
| 7172 add_group("fma_128_256", |
| 7173 cpu=["FMA4"], |
6590 modifiers=["Op2Add"], | 7174 modifiers=["Op2Add"], |
6591 opcode=[0x0F, 0x25, 0x00], | 7175 vex=128, |
6592 drex_oc0=0, | 7176 vexw=0, |
6593 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | 7177 prefix=0x66, |
6594 Operand(type="SIMDReg", size=128, dest="Spare"), | 7178 opcode=[0x0F, 0x3A, 0x00], |
6595 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), | 7179 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
6596 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 7180 Operand(type="SIMDReg", size=128, dest="VEX"), |
| 7181 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
| 7182 Operand(type="SIMDReg", size=128, dest="VEXImmSrc")]) |
| 7183 add_group("fma_128_256", |
| 7184 cpu=["FMA4"], |
| 7185 modifiers=["Op2Add"], |
| 7186 vex=128, |
| 7187 vexw=1, |
| 7188 prefix=0x66, |
| 7189 opcode=[0x0F, 0x3A, 0x00], |
| 7190 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7191 Operand(type="SIMDReg", size=128, dest="VEX"), |
| 7192 Operand(type="SIMDReg", size=128, dest="VEXImmSrc"), |
| 7193 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
| 7194 add_group("fma_128_256", |
| 7195 cpu=["FMA4"], |
| 7196 modifiers=["Op2Add"], |
| 7197 vex=256, |
| 7198 vexw=0, |
| 7199 prefix=0x66, |
| 7200 opcode=[0x0F, 0x3A, 0x00], |
| 7201 operands=[Operand(type="SIMDReg", size=256, dest="Spare"), |
| 7202 Operand(type="SIMDReg", size=256, dest="VEX"), |
| 7203 Operand(type="SIMDRM", size=256, relaxed=True, dest="EA"), |
| 7204 Operand(type="SIMDReg", size=256, dest="VEXImmSrc")]) |
| 7205 add_group("fma_128_256", |
| 7206 cpu=["FMA4"], |
| 7207 modifiers=["Op2Add"], |
| 7208 vex=256, |
| 7209 vexw=1, |
| 7210 prefix=0x66, |
| 7211 opcode=[0x0F, 0x3A, 0x00], |
| 7212 operands=[Operand(type="SIMDReg", size=256, dest="Spare"), |
| 7213 Operand(type="SIMDReg", size=256, dest="VEX"), |
| 7214 Operand(type="SIMDReg", size=256, dest="VEXImmSrc"), |
| 7215 Operand(type="SIMDRM", size=256, relaxed=True, dest="EA")]) |
| 7216 |
| 7217 add_insn("vfmaddpd", "fma_128_256", modifiers=[0x69]) |
| 7218 add_insn("vfmaddps", "fma_128_256", modifiers=[0x68]) |
| 7219 add_insn("vfmaddsubpd", "fma_128_256", modifiers=[0x5D]) |
| 7220 add_insn("vfmaddsubps", "fma_128_256", modifiers=[0x5C]) |
| 7221 add_insn("vfmsubaddpd", "fma_128_256", modifiers=[0x5F]) |
| 7222 add_insn("vfmsubaddps", "fma_128_256", modifiers=[0x5E]) |
| 7223 add_insn("vfmsubpd", "fma_128_256", modifiers=[0x6D]) |
| 7224 add_insn("vfmsubps", "fma_128_256", modifiers=[0x6C]) |
| 7225 add_insn("vfnmaddpd", "fma_128_256", modifiers=[0x79]) |
| 7226 add_insn("vfnmaddps", "fma_128_256", modifiers=[0x78]) |
| 7227 add_insn("vfnmsubpd", "fma_128_256", modifiers=[0x7D]) |
| 7228 add_insn("vfnmsubps", "fma_128_256", modifiers=[0x7C]) |
6597 | 7229 |
6598 for sz in [32, 64]: | 7230 for sz in [32, 64]: |
6599 add_group("sse5com%d" % sz, | 7231 add_group("fma_128_m%d" % sz, |
6600 cpu=["SSE5"], | 7232 cpu=["FMA4"], |
6601 modifiers=["Op2Add"], | 7233 modifiers=["Op2Add"], |
6602 opcode=[0x0F, 0x25, 0x00], | 7234 vex=128, |
6603 drex_oc0=0, | 7235 vexw=0, |
6604 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | 7236 prefix=0x66, |
6605 Operand(type="SIMDReg", size=128, dest="Spare"), | 7237 opcode=[0x0F, 0x3A, 0x00], |
| 7238 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7239 Operand(type="SIMDReg", size=128, dest="VEX"), |
6606 Operand(type="SIMDReg", size=128, dest="EA"), | 7240 Operand(type="SIMDReg", size=128, dest="EA"), |
6607 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 7241 Operand(type="SIMDReg", size=128, dest="VEXImmSrc")]) |
6608 add_group("sse5com%d" % sz, | 7242 add_group("fma_128_m%d" % sz, |
6609 cpu=["SSE5"], | 7243 cpu=["FMA4"], |
6610 modifiers=["Op2Add"], | 7244 modifiers=["Op2Add"], |
6611 opcode=[0x0F, 0x25, 0x00], | 7245 vex=128, |
6612 drex_oc0=0, | 7246 vexw=0, |
6613 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | 7247 prefix=0x66, |
6614 Operand(type="SIMDReg", size=128, dest="Spare"), | 7248 opcode=[0x0F, 0x3A, 0x00], |
| 7249 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
| 7250 Operand(type="SIMDReg", size=128, dest="VEX"), |
6615 Operand(type="Mem", size=sz, relaxed=True, dest="EA"), | 7251 Operand(type="Mem", size=sz, relaxed=True, dest="EA"), |
6616 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | 7252 Operand(type="SIMDReg", size=128, dest="VEXImmSrc")]) |
6617 | 7253 add_group("fma_128_m%d" % sz, |
6618 # Condition code versions | 7254 cpu=["FMA4"], |
6619 add_group("sse5comcc", | 7255 modifiers=["Op2Add"], |
6620 cpu=["SSE5"], | 7256 vex=128, |
6621 modifiers=["Op2Add", "Imm8"], | 7257 vexw=1, |
6622 opcode=[0x0F, 0x25, 0x00], | 7258 prefix=0x66, |
6623 drex_oc0=0, | 7259 opcode=[0x0F, 0x3A, 0x00], |
6624 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | 7260 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
6625 Operand(type="SIMDReg", size=128, dest="Spare"), | 7261 Operand(type="SIMDReg", size=128, dest="VEX"), |
6626 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) | 7262 Operand(type="SIMDReg", size=128, dest="VEXImmSrc"), |
6627 | |
6628 for sz in [32, 64]: | |
6629 add_group("sse5comcc%d" % sz, | |
6630 cpu=["SSE5"], | |
6631 modifiers=["Op2Add", "Imm8"], | |
6632 opcode=[0x0F, 0x25, 0x00], | |
6633 drex_oc0=0, | |
6634 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6635 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6636 Operand(type="SIMDReg", size=128, dest="EA")]) | |
6637 add_group("sse5comcc%d" % sz, | |
6638 cpu=["SSE5"], | |
6639 modifiers=["Op2Add", "Imm8"], | |
6640 opcode=[0x0F, 0x25, 0x00], | |
6641 drex_oc0=0, | |
6642 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6643 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6644 Operand(type="Mem", size=sz, relaxed=True, dest="EA")]) | 7263 Operand(type="Mem", size=sz, relaxed=True, dest="EA")]) |
6645 | 7264 |
6646 sse5coms = [(0, ""), | 7265 add_insn("vfmaddsd", "fma_128_m64", modifiers=[0x6B]) |
6647 (0x0, "eq"), | 7266 add_insn("vfmaddss", "fma_128_m32", modifiers=[0x6A]) |
6648 (0x1, "lt"), (0x1, "unge"), | 7267 add_insn("vfmsubsd", "fma_128_m64", modifiers=[0x6F]) |
6649 (0x2, "le"), (0x2, "ungt"), | 7268 add_insn("vfmsubss", "fma_128_m32", modifiers=[0x6E]) |
6650 (0x3, "unord"), | 7269 add_insn("vfnmaddsd", "fma_128_m64", modifiers=[0x7B]) |
6651 (0x4, "ne"), (0x4, "neq"), | 7270 add_insn("vfnmaddss", "fma_128_m32", modifiers=[0x7A]) |
6652 (0x5, "nlt"), (0x5, "uge"), | 7271 add_insn("vfnmsubsd", "fma_128_m64", modifiers=[0x7F]) |
6653 (0x6, "nle"), (0x6, "ugt"), | 7272 add_insn("vfnmsubss", "fma_128_m32", modifiers=[0x7E]) |
6654 (0x7, "ord"), | 7273 |
6655 (0x8, "ueq"), | 7274 ##################################################################### |
6656 (0x9, "ult"), (0x9, "nge"), | 7275 # Intel XSAVE and XSAVEOPT instructions |
6657 (0xa, "ule"), (0xa, "ngt"), | |
6658 (0xb, "false"), | |
6659 (0xc, "une"), (0xc, "uneq"), | |
6660 (0xd, "unlt"), (0xd, "ge"), | |
6661 (0xe, "unle"), (0xe, "gt"), | |
6662 (0xf, "true")] | |
6663 for ib, cc in sse5coms: | |
6664 if cc: | |
6665 iname = "sse5comcc" | |
6666 else: | |
6667 iname = "sse5com" | |
6668 add_insn("com"+cc+"ps", iname, modifiers=[0x2C, ib]) | |
6669 add_insn("com"+cc+"pd", iname, modifiers=[0x2D, ib]) | |
6670 add_insn("com"+cc+"ss", iname+"32", modifiers=[0x2E, ib]) | |
6671 add_insn("com"+cc+"sd", iname+"64", modifiers=[0x2F, ib]) | |
6672 | |
6673 sse5coms = list(enumerate(["lt", "le", "gt", "ge", | |
6674 "eq", "neq", "false", "true"])) | |
6675 sse5coms.append((5, "ne")) | |
6676 sse5coms.append((0, "")) | |
6677 for ib, cc in sse5coms: | |
6678 if cc: | |
6679 iname = "sse5comcc" | |
6680 else: | |
6681 iname = "sse5com" | |
6682 add_insn("pcom"+cc+"b", iname, modifiers=[0x4C, ib]) | |
6683 add_insn("pcom"+cc+"w", iname, modifiers=[0x4D, ib]) | |
6684 add_insn("pcom"+cc+"d", iname, modifiers=[0x4E, ib]) | |
6685 add_insn("pcom"+cc+"q", iname, modifiers=[0x4F, ib]) | |
6686 | |
6687 add_insn("pcom"+cc+"ub", iname, modifiers=[0x6C, ib]) | |
6688 add_insn("pcom"+cc+"uw", iname, modifiers=[0x6D, ib]) | |
6689 add_insn("pcom"+cc+"ud", iname, modifiers=[0x6E, ib]) | |
6690 add_insn("pcom"+cc+"uq", iname, modifiers=[0x6F, ib]) | |
6691 | |
6692 add_group("cvtph2ps", | |
6693 cpu=["SSE5"], | |
6694 opcode=[0x0F, 0x7A, 0x30], | |
6695 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), | |
6696 Operand(type="SIMDReg", size=128, dest="EA")]) | |
6697 add_group("cvtph2ps", | |
6698 cpu=["SSE5"], | |
6699 opcode=[0x0F, 0x7A, 0x30], | |
6700 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), | |
6701 Operand(type="Mem", size=64, relaxed=True, dest="EA")]) | |
6702 | |
6703 add_insn("cvtph2ps", "cvtph2ps") | |
6704 | |
6705 add_group("cvtps2ph", | |
6706 cpu=["SSE5"], | |
6707 opcode=[0x0F, 0x7A, 0x31], | |
6708 operands=[Operand(type="SIMDReg", size=128, dest="EA"), | |
6709 Operand(type="SIMDReg", size=128, dest="Spare")]) | |
6710 add_group("cvtps2ph", | |
6711 cpu=["SSE5"], | |
6712 opcode=[0x0F, 0x7A, 0x31], | |
6713 operands=[Operand(type="Mem", size=64, relaxed=True, dest="EA"), | |
6714 Operand(type="SIMDReg", size=128, dest="Spare")]) | |
6715 | |
6716 add_insn("cvtps2ph", "cvtps2ph") | |
6717 | |
6718 add_group("sse5arith", | |
6719 cpu=["SSE5"], | |
6720 modifiers=["Op2Add"], | |
6721 opcode=[0x0F, 0x24, 0x00], | |
6722 drex_oc0=0, | |
6723 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6724 Operand(type="SIMDRegMatch0", size=128, dest=None), | |
6725 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6726 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) | |
6727 add_group("sse5arith", | |
6728 cpu=["SSE5"], | |
6729 modifiers=["Op2Add"], | |
6730 opcode=[0x0F, 0x24, 0x00], | |
6731 drex_oc0=1, | |
6732 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6733 Operand(type="SIMDRegMatch0", size=128, dest=None), | |
6734 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), | |
6735 Operand(type="SIMDReg", size=128, dest="Spare")]) | |
6736 add_group("sse5arith", | |
6737 cpu=["SSE5"], | |
6738 modifiers=["Op2Add"], | |
6739 opcode=[0x0F, 0x24, 0x04], | |
6740 drex_oc0=0, | |
6741 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6742 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6743 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), | |
6744 Operand(type="SIMDRegMatch0", size=128, dest=None)]) | |
6745 add_group("sse5arith", | |
6746 cpu=["SSE5"], | |
6747 modifiers=["Op2Add"], | |
6748 opcode=[0x0F, 0x24, 0x04], | |
6749 drex_oc0=1, | |
6750 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6751 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), | |
6752 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6753 Operand(type="SIMDRegMatch0", size=128, dest=None)]) | |
6754 | |
6755 for sz in [32, 64]: | |
6756 add_group("sse5arith%d" % sz, | |
6757 cpu=["SSE5"], | |
6758 modifiers=["Op2Add"], | |
6759 opcode=[0x0F, 0x24, 0x00], | |
6760 drex_oc0=0, | |
6761 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6762 Operand(type="SIMDRegMatch0", size=128, dest=None), | |
6763 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6764 Operand(type="SIMDReg", size=128, dest="EA")]) | |
6765 add_group("sse5arith%d" % sz, | |
6766 cpu=["SSE5"], | |
6767 modifiers=["Op2Add"], | |
6768 opcode=[0x0F, 0x24, 0x00], | |
6769 drex_oc0=0, | |
6770 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6771 Operand(type="SIMDRegMatch0", size=128, dest=None), | |
6772 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6773 Operand(type="Mem", size=sz, relaxed=True, dest="EA")]) | |
6774 add_group("sse5arith%d" % sz, | |
6775 cpu=["SSE5"], | |
6776 modifiers=["Op2Add"], | |
6777 opcode=[0x0F, 0x24, 0x00], | |
6778 drex_oc0=1, | |
6779 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6780 Operand(type="SIMDRegMatch0", size=128, dest=None), | |
6781 Operand(type="SIMDReg", size=128, dest="EA"), | |
6782 Operand(type="SIMDReg", size=128, dest="Spare")]) | |
6783 add_group("sse5arith%d" % sz, | |
6784 cpu=["SSE5"], | |
6785 modifiers=["Op2Add"], | |
6786 opcode=[0x0F, 0x24, 0x00], | |
6787 drex_oc0=1, | |
6788 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6789 Operand(type="SIMDRegMatch0", size=128, dest=None), | |
6790 Operand(type="Mem", size=sz, relaxed=True, dest="EA"), | |
6791 Operand(type="SIMDReg", size=128, dest="Spare")]) | |
6792 add_group("sse5arith%d" % sz, | |
6793 cpu=["SSE5"], | |
6794 modifiers=["Op2Add"], | |
6795 opcode=[0x0F, 0x24, 0x04], | |
6796 drex_oc0=0, | |
6797 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6798 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6799 Operand(type="SIMDReg", size=128, dest="EA"), | |
6800 Operand(type="SIMDRegMatch0", size=128, dest=None)]) | |
6801 add_group("sse5arith%d" % sz, | |
6802 cpu=["SSE5"], | |
6803 modifiers=["Op2Add"], | |
6804 opcode=[0x0F, 0x24, 0x04], | |
6805 drex_oc0=0, | |
6806 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6807 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6808 Operand(type="Mem", size=sz, relaxed=True, dest="EA"), | |
6809 Operand(type="SIMDRegMatch0", size=128, dest=None)]) | |
6810 add_group("sse5arith%d" % sz, | |
6811 cpu=["SSE5"], | |
6812 modifiers=["Op2Add"], | |
6813 opcode=[0x0F, 0x24, 0x04], | |
6814 drex_oc0=1, | |
6815 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6816 Operand(type="SIMDReg", size=128, dest="EA"), | |
6817 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6818 Operand(type="SIMDRegMatch0", size=128, dest=None)]) | |
6819 add_group("sse5arith%d" % sz, | |
6820 cpu=["SSE5"], | |
6821 modifiers=["Op2Add"], | |
6822 opcode=[0x0F, 0x24, 0x04], | |
6823 drex_oc0=1, | |
6824 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6825 Operand(type="Mem", size=sz, relaxed=True, dest="EA"), | |
6826 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6827 Operand(type="SIMDRegMatch0", size=128, dest=None)]) | |
6828 | |
6829 add_insn("fmaddps", "sse5arith", modifiers=[0x00]) | |
6830 add_insn("fmaddpd", "sse5arith", modifiers=[0x01]) | |
6831 add_insn("fmaddss", "sse5arith32", modifiers=[0x02]) | |
6832 add_insn("fmaddsd", "sse5arith64", modifiers=[0x03]) | |
6833 | |
6834 add_insn("fmsubps", "sse5arith", modifiers=[0x08]) | |
6835 add_insn("fmsubpd", "sse5arith", modifiers=[0x09]) | |
6836 add_insn("fmsubss", "sse5arith32", modifiers=[0x0A]) | |
6837 add_insn("fmsubsd", "sse5arith64", modifiers=[0x0B]) | |
6838 | |
6839 add_insn("fnmaddps", "sse5arith", modifiers=[0x10]) | |
6840 add_insn("fnmaddpd", "sse5arith", modifiers=[0x11]) | |
6841 add_insn("fnmaddss", "sse5arith32", modifiers=[0x12]) | |
6842 add_insn("fnmaddsd", "sse5arith64", modifiers=[0x13]) | |
6843 | |
6844 add_insn("fnmsubps", "sse5arith", modifiers=[0x18]) | |
6845 add_insn("fnmsubpd", "sse5arith", modifiers=[0x19]) | |
6846 add_insn("fnmsubss", "sse5arith32", modifiers=[0x1A]) | |
6847 add_insn("fnmsubsd", "sse5arith64", modifiers=[0x1B]) | |
6848 | |
6849 add_insn("pcmov", "sse5arith", modifiers=[0x22]) | |
6850 | |
6851 add_insn("permps", "sse5arith", modifiers=[0x20]) | |
6852 add_insn("permpd", "sse5arith", modifiers=[0x21]) | |
6853 add_insn("pperm", "sse5arith", modifiers=[0x23]) | |
6854 | |
6855 add_group("sse5two", | |
6856 cpu=["SSE5"], | |
6857 modifiers=["Op2Add"], | |
6858 opcode=[0x0F, 0x7A, 0x00], | |
6859 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), | |
6860 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) | |
6861 for sz in [32, 64]: | |
6862 add_group("sse5two%d" % sz, | |
6863 cpu=["SSE5"], | |
6864 modifiers=["Op2Add"], | |
6865 opcode=[0x0F, 0x7A, 0x00], | |
6866 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), | |
6867 Operand(type="SIMDReg", size=128, dest="EA")]) | |
6868 add_group("sse5two%d" % sz, | |
6869 cpu=["SSE5"], | |
6870 modifiers=["Op2Add"], | |
6871 opcode=[0x0F, 0x7A, 0x00], | |
6872 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), | |
6873 Operand(type="Mem", size=sz, relaxed=True, dest="EA")]) | |
6874 | |
6875 add_insn("frczps", "sse5two", modifiers=[0x10]) | |
6876 add_insn("frczpd", "sse5two", modifiers=[0x11]) | |
6877 add_insn("frczss", "sse5two32", modifiers=[0x12]) | |
6878 add_insn("frczsd", "sse5two64", modifiers=[0x13]) | |
6879 | |
6880 add_insn("phaddbw", "sse5two", modifiers=[0x41]) | |
6881 add_insn("phaddbd", "sse5two", modifiers=[0x42]) | |
6882 add_insn("phaddbq", "sse5two", modifiers=[0x43]) | |
6883 add_insn("phaddwd", "sse5two", modifiers=[0x46]) | |
6884 add_insn("phaddwq", "sse5two", modifiers=[0x47]) | |
6885 add_insn("phadddq", "sse5two", modifiers=[0x4B]) | |
6886 | |
6887 add_insn("phaddubw", "sse5two", modifiers=[0x51]) | |
6888 add_insn("phaddubd", "sse5two", modifiers=[0x52]) | |
6889 add_insn("phaddubq", "sse5two", modifiers=[0x53]) | |
6890 add_insn("phadduwd", "sse5two", modifiers=[0x56]) | |
6891 add_insn("phadduwq", "sse5two", modifiers=[0x57]) | |
6892 add_insn("phaddudq", "sse5two", modifiers=[0x5B]) | |
6893 | |
6894 add_insn("phsubbw", "sse5two", modifiers=[0x61]) | |
6895 add_insn("phsubwd", "sse5two", modifiers=[0x62]) | |
6896 add_insn("phsubdq", "sse5two", modifiers=[0x63]) | |
6897 | |
6898 add_group("sse5pmacs", | |
6899 cpu=["SSE5"], | |
6900 modifiers=["Op2Add"], | |
6901 opcode=[0x0F, 0x24, 0x00], | |
6902 drex_oc0=0, | |
6903 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6904 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6905 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), | |
6906 Operand(type="SIMDRegMatch0", size=128, dest=None)]) | |
6907 | |
6908 add_insn("pmacsww", "sse5pmacs", modifiers=[0x95]) | |
6909 add_insn("pmacswd", "sse5pmacs", modifiers=[0x96]) | |
6910 add_insn("pmacsdql", "sse5pmacs", modifiers=[0x97]) | |
6911 add_insn("pmacsdd", "sse5pmacs", modifiers=[0x9E]) | |
6912 add_insn("pmacsdqh", "sse5pmacs", modifiers=[0x9F]) | |
6913 | |
6914 add_insn("pmacssww", "sse5pmacs", modifiers=[0x85]) | |
6915 add_insn("pmacsswd", "sse5pmacs", modifiers=[0x86]) | |
6916 add_insn("pmacssdql", "sse5pmacs", modifiers=[0x87]) | |
6917 add_insn("pmacssdd", "sse5pmacs", modifiers=[0x8E]) | |
6918 add_insn("pmacssdqh", "sse5pmacs", modifiers=[0x8F]) | |
6919 | |
6920 add_insn("pmadcsswd", "sse5pmacs", modifiers=[0xA6]) | |
6921 add_insn("pmadcswd", "sse5pmacs", modifiers=[0xB6]) | |
6922 | |
6923 add_group("sse5prot", | |
6924 cpu=["SSE5"], | |
6925 modifiers=["Op2Add"], | |
6926 opcode=[0x0F, 0x24, 0x40], | |
6927 drex_oc0=0, | |
6928 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6929 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6930 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) | |
6931 add_group("sse5prot", | |
6932 cpu=["SSE5"], | |
6933 modifiers=["Op2Add"], | |
6934 opcode=[0x0F, 0x24, 0x40], | |
6935 drex_oc0=1, | |
6936 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6937 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), | |
6938 Operand(type="SIMDReg", size=128, dest="Spare")]) | |
6939 add_group("sse5prot", | |
6940 cpu=["SSE5"], | |
6941 modifiers=["Op2Add"], | |
6942 opcode=[0x0F, 0x7B, 0x40], | |
6943 operands=[Operand(type="SIMDReg", size=128, dest="Spare"), | |
6944 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), | |
6945 Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) | |
6946 | |
6947 add_insn("protb", "sse5prot", modifiers=[0x00]) | |
6948 add_insn("protw", "sse5prot", modifiers=[0x01]) | |
6949 add_insn("protd", "sse5prot", modifiers=[0x02]) | |
6950 add_insn("protq", "sse5prot", modifiers=[0x03]) | |
6951 | |
6952 add_group("sse5psh", | |
6953 cpu=["SSE5"], | |
6954 modifiers=["Op2Add"], | |
6955 opcode=[0x0F, 0x24, 0x44], | |
6956 drex_oc0=0, | |
6957 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6958 Operand(type="SIMDReg", size=128, dest="Spare"), | |
6959 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) | |
6960 add_group("sse5psh", | |
6961 cpu=["SSE5"], | |
6962 modifiers=["Op2Add"], | |
6963 opcode=[0x0F, 0x24, 0x44], | |
6964 drex_oc0=1, | |
6965 operands=[Operand(type="SIMDReg", size=128, dest="DREX"), | |
6966 Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), | |
6967 Operand(type="SIMDReg", size=128, dest="Spare")]) | |
6968 | |
6969 add_insn("pshlb", "sse5psh", modifiers=[0x00]) | |
6970 add_insn("pshlw", "sse5psh", modifiers=[0x01]) | |
6971 add_insn("pshld", "sse5psh", modifiers=[0x02]) | |
6972 add_insn("pshlq", "sse5psh", modifiers=[0x03]) | |
6973 | |
6974 add_insn("pshab", "sse5psh", modifiers=[0x04]) | |
6975 add_insn("pshaw", "sse5psh", modifiers=[0x05]) | |
6976 add_insn("pshad", "sse5psh", modifiers=[0x06]) | |
6977 add_insn("pshaq", "sse5psh", modifiers=[0x07]) | |
6978 | |
6979 # roundps, roundpd, roundss, roundsd, ptest are in SSE4.1 | |
6980 | |
6981 ##################################################################### | |
6982 # Intel XSAVE instructions | |
6983 ##################################################################### | 7276 ##################################################################### |
6984 add_insn("xgetbv", "threebyte", modifiers=[0x0F, 0x01, 0xD0], | 7277 add_insn("xgetbv", "threebyte", modifiers=[0x0F, 0x01, 0xD0], |
6985 cpu=["XSAVE", "386"]) | 7278 cpu=["XSAVE", "386"]) |
6986 add_insn("xsetbv", "threebyte", modifiers=[0x0F, 0x01, 0xD1], | 7279 add_insn("xsetbv", "threebyte", modifiers=[0x0F, 0x01, 0xD1], |
6987 cpu=["XSAVE", "386", "Priv"]) | 7280 cpu=["XSAVE", "386", "Priv"]) |
6988 add_insn("xsave", "twobytemem", modifiers=[4, 0x0F, 0xAE], | 7281 add_insn("xsave", "twobytemem", modifiers=[4, 0x0F, 0xAE], |
6989 cpu=["XSAVE", "386"]) | 7282 cpu=["XSAVE", "386"]) |
6990 add_insn("xrstor", "twobytemem", modifiers=[5, 0x0F, 0xAE], | 7283 add_insn("xrstor", "twobytemem", modifiers=[5, 0x0F, 0xAE], |
6991 cpu=["XSAVE", "386"]) | 7284 cpu=["XSAVE", "386"]) |
6992 | 7285 |
| 7286 add_insn("xsaveopt", "twobytemem", modifiers=[6, 0x0F, 0xAE], |
| 7287 cpu=["XSAVEOPT"]) |
| 7288 |
| 7289 add_group("xsaveopt64", |
| 7290 modifiers=["SpAdd", "Op0Add", "Op1Add"], |
| 7291 opcode=[0x00, 0x00], |
| 7292 spare=0, |
| 7293 opersize=64, |
| 7294 operands=[Operand(type="Mem", relaxed=True, dest="EA")]) |
| 7295 add_insn("xsaveopt64", "xsaveopt64", modifiers=[6, 0x0F, 0xAE], |
| 7296 cpu=["XSAVEOPT"], only64=True) |
| 7297 |
6993 ##################################################################### | 7298 ##################################################################### |
6994 # Intel MOVBE instruction | 7299 # Intel MOVBE instruction |
6995 ##################################################################### | 7300 ##################################################################### |
6996 for sz in (16, 32, 64): | 7301 for sz in (16, 32, 64): |
6997 add_group("movbe", | 7302 add_group("movbe", |
6998 cpu=["MOVBE"], | 7303 cpu=["MOVBE"], |
6999 opersize=sz, | 7304 opersize=sz, |
7000 opcode=[0x0F, 0x38, 0xF0], | 7305 opcode=[0x0F, 0x38, 0xF0], |
7001 operands=[Operand(type="Reg", size=sz, dest="Spare"), | 7306 operands=[Operand(type="Reg", size=sz, dest="Spare"), |
7002 Operand(type="Mem", size=sz, relaxed=True, dest="EA")]) | 7307 Operand(type="Mem", size=sz, relaxed=True, dest="EA")]) |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7337 # Output generation | 7642 # Output generation |
7338 ##################################################################### | 7643 ##################################################################### |
7339 | 7644 |
7340 out_dir = "" | 7645 out_dir = "" |
7341 if len(sys.argv) > 1: | 7646 if len(sys.argv) > 1: |
7342 out_dir = sys.argv[1] | 7647 out_dir = sys.argv[1] |
7343 | 7648 |
7344 output_groups(file(os.path.join(out_dir, "x86insns.c"), "wt")) | 7649 output_groups(file(os.path.join(out_dir, "x86insns.c"), "wt")) |
7345 output_gas_insns(file(os.path.join(out_dir, "x86insn_gas.gperf"), "wt")) | 7650 output_gas_insns(file(os.path.join(out_dir, "x86insn_gas.gperf"), "wt")) |
7346 output_nasm_insns(file(os.path.join(out_dir, "x86insn_nasm.gperf"), "wt")) | 7651 output_nasm_insns(file(os.path.join(out_dir, "x86insn_nasm.gperf"), "wt")) |
OLD | NEW |