Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: third_party/yasm/patched-yasm/modules/arch/x86/gen_x86_insn.py

Issue 6170009: Update our yasm copy to yasm 1.1.0 (Part 1: yasm side)... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/
Patch Set: Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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"))
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698