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