Index: third_party/yasm/patched-yasm/modules/arch/x86/gen_x86_insn.py |
=================================================================== |
--- third_party/yasm/patched-yasm/modules/arch/x86/gen_x86_insn.py (revision 71129) |
+++ third_party/yasm/patched-yasm/modules/arch/x86/gen_x86_insn.py (working copy) |
@@ -25,8 +25,11 @@ |
# POSSIBILITY OF SUCH DAMAGE. |
# |
# NOTE: operands are arranged in NASM / Intel order (e.g. dest, src) |
-rcstag = "$Id: gen_x86_insn.py 2193 2009-04-04 23:03:41Z peter $" |
+from sys import stdout, version_info |
+ |
+rcstag = "$Id: gen_x86_insn.py 2346 2010-08-01 01:37:37Z peter $" |
+ |
import os |
import sys |
@@ -43,7 +46,8 @@ |
ordered_cpu_features = [ |
"FPU", "Cyrix", "AMD", "MMX", "3DNow", "SMM", "SSE", "SSE2", |
"SSE3", "SVM", "PadLock", "SSSE3", "SSE41", "SSE42", "SSE4a", "SSE5", |
- "AVX", "FMA", "AES", "CLMUL"] |
+ "AVX", "FMA", "AES", "CLMUL", "MOVBE", "XOP", "FMA4", "F16C", |
+ "FSGSBASE", "RDRAND", "XSAVEOPT", "EPTVPID", "SMX"] |
unordered_cpu_features = ["Priv", "Prot", "Undoc", "Obs"] |
# Predefined VEX prefix field values |
@@ -53,6 +57,16 @@ |
VEXL1 = 0xC4 |
VEXpp = 0xC0 # OR with value |
+# Predefined XOP prefix field values |
+XOPW0 = 0x80 |
+XOPW1 = 0x88 |
+XOPL0 = 0x80 |
+XOPL1 = 0x84 |
+XOPpp = 0x80 # OR with value |
+ |
+def lprint(s, f = stdout, e = '\n') : |
+ f.write(s + e) |
+ |
def cpu_lcd(cpu1, cpu2): |
"""Find the lowest common denominator of two CPU sets.""" |
retval = set() |
@@ -109,7 +123,7 @@ |
if kwargs: |
for arg in kwargs: |
- print "Warning: unrecognized arg %s" % arg |
+ lprint("Warning: unrecognized arg %s" % arg) |
def __str__(self): |
return "{"+ ", ".join(["OPT_%s" % self.type, |
@@ -175,6 +189,14 @@ |
suffix = kwargs.pop("suffix", None) |
if suffix is not None: |
self.suffixes = [suffix] |
+ |
+ req_suffix = kwargs.pop("req_suffix", False) |
+ if not req_suffix: |
+ if self.suffixes is None: |
+ self.suffixes = ["Z"] |
+ else: |
+ self.suffixes.append("Z") |
+ |
if self.suffixes is not None: |
self.suffixes = set(x.upper() for x in self.suffixes) |
@@ -212,6 +234,27 @@ |
self.special_prefix = "0x%02X" % (0xC0 + vexW*8 + vexL*4 + vexpp) |
+ # XOP prefix |
+ if "xop" in kwargs: |
+ xopW = kwargs.pop("xopw", 0) |
+ if xopW not in [0, 1]: |
+ raise ValueError("XOP.W must be 0 or 1") |
+ |
+ xopL = kwargs.pop("xop") |
+ if xopL == 128 or xopL == 0: |
+ xopL = 0 |
+ elif xopL == 256: |
+ xopL = 1 |
+ else: |
+ raise ValueError("XOP.L must be 128 or 256") |
+ |
+ # XOPpp is currently reserved (0) |
+ xoppp = 0 |
+ if self.special_prefix not in ["0", "0x00"]: |
+ raise ValueError("Cannot combine XOP and special prefix %s" |
+ % self.special_prefix) |
+ self.special_prefix = "0x%02X" % (0x80 + xopW*8 + xopL*4 + xoppp) |
+ |
# Spare value |
self.spare = kwargs.pop("spare", 0) |
@@ -230,9 +273,6 @@ |
else: |
raise KeyError("missing opcode") |
- # DREX opcode0 field |
- self.drex_oc0 = kwargs.pop("drex_oc0", 0) and 0x08 or 0 |
- |
# Build operands string (C array initializer) |
self.operands = kwargs.pop("operands") |
for op in self.operands: |
@@ -252,8 +292,6 @@ |
self.cpu.add("586") |
if op.dest == "EA64": |
self.misc_flags.add("ONLY_64") |
- if op.dest == "DREX": |
- self.drex_oc0 |= 0x80 |
# Modifiers |
self.modifiers = kwargs.pop("modifiers", []) |
@@ -276,7 +314,7 @@ |
if kwargs: |
for arg in kwargs: |
- print "Warning: unrecognized arg %s" % arg |
+ lprint("Warning: unrecognized arg %s" % arg) |
def __str__(self): |
if hasattr(self, "opcode"): |
@@ -331,8 +369,6 @@ |
"%d" % (self.opersize or 0), |
"%d" % (self.def_opersize_64 or 0), |
self.special_prefix or "0", |
- self.drex_oc0 and |
- ("0x%02X" % self.drex_oc0) or "0", |
"%d" % self.opcode_len, |
opcodes_str, |
"%d" % (self.spare or 0), |
@@ -435,7 +471,7 @@ |
def __str__(self): |
if self.suffix is None: |
- suffix_str = "NONE" |
+ suffix_str = "SUF_Z" |
elif len(self.suffix) == 1: |
suffix_str = "SUF_" + self.suffix |
else: |
@@ -503,8 +539,8 @@ |
def finalize_insns(): |
unused_groups = set(groups.keys()) |
- for name, opts in insns.iteritems(): |
- for insn in opts: |
+ for name in insns: |
+ for insn in insns[name]: |
group = groups[insn.groupname] |
unused_groups.discard(insn.groupname) |
@@ -515,30 +551,27 @@ |
parsers &= insn.parsers |
if "gas" in parsers: |
- keyword = name |
- if keyword in gas_insns: |
- raise ValueError("duplicate gas instruction %s" % keyword) |
- newinsn = insn.copy() |
- newinsn.auto_cpu("gas") |
- newinsn.auto_misc_flags("gas") |
- gas_insns[keyword] = newinsn |
- |
+ suffixes = set() |
if insn.suffix is None: |
- suffixes = set() |
for form in group: |
if form.gen_suffix and form.suffixes is not None: |
suffixes |= form.suffixes |
- for suffix in suffixes: |
+ if not suffixes: |
+ suffixes.add("Z") |
+ for suffix in suffixes: |
+ if suffix == "Z": |
+ keyword = name |
+ else: |
keyword = name+suffix |
- if keyword in gas_insns: |
- raise ValueError("duplicate gas instruction %s" % |
- keyword) |
- newinsn = insn.copy() |
- newinsn.suffix = suffix |
- newinsn.auto_cpu("gas") |
- newinsn.auto_misc_flags("gas") |
- gas_insns[keyword] = newinsn |
+ if keyword in gas_insns: |
+ raise ValueError("duplicate gas instruction %s" % |
+ keyword) |
+ newinsn = insn.copy() |
+ newinsn.suffix = suffix |
+ newinsn.auto_cpu("gas") |
+ newinsn.auto_misc_flags("gas") |
+ gas_insns[keyword] = newinsn |
if "nasm" in parsers: |
keyword = name |
@@ -552,12 +585,12 @@ |
unused_groups.discard("empty") |
unused_groups.discard("not64") |
if unused_groups: |
- print "warning: unused groups: %s" % ", ".join(unused_groups) |
+ lprint("warning: unused groups: %s" % ", ".join(unused_groups)) |
def output_insns(f, parser, insns): |
- print >>f, "/* Generated by %s r%s, do not edit */" % \ |
- (scriptname, scriptrev) |
- print >>f, """%%ignore-case |
+ lprint("/* Generated by %s r%s, do not edit */" % \ |
+ (scriptname, scriptrev), f) |
+ lprint("""%%ignore-case |
%%language=ANSI-C |
%%compare-strncmp |
%%readonly-tables |
@@ -566,9 +599,9 @@ |
%%define hash-function-name insnprefix_%s_hash |
%%define lookup-function-name insnprefix_%s_find |
struct insnprefix_parse_data; |
-%%%%""" % (parser, parser) |
+%%%%""" % (parser, parser), f) |
for keyword in sorted(insns): |
- print >>f, "%s,\t%s" % (keyword.lower(), insns[keyword]) |
+ lprint("%s,\t%s" % (keyword.lower(), insns[keyword]), f) |
def output_gas_insns(f): |
output_insns(f, "gas", gas_insns) |
@@ -580,10 +613,14 @@ |
# Merge all operand lists into single list |
# Sort by number of operands to shorten output |
all_operands = [] |
- for form in sorted((form for g in groups.itervalues() for form in g), |
+ if version_info[0] == 2: |
+ gi = groups.itervalues() |
+ else: |
+ gi = groups.values() |
+ for form in sorted((form for g in gi for form in g), |
key=lambda x:len(x.operands), reverse=True): |
num_operands = len(form.operands) |
- for i in xrange(len(all_operands)): |
+ for i in range(len(all_operands)): |
if all_operands[i:i+num_operands] == form.operands: |
form.all_operands_index = i |
break |
@@ -592,12 +629,12 @@ |
all_operands.extend(form.operands) |
# Output operands list |
- print >>f, "/* Generated by %s r%s, do not edit */" % \ |
- (scriptname, scriptrev) |
- print >>f, "static const x86_info_operand insn_operands[] = {" |
- print >>f, " ", |
- print >>f, ",\n ".join(str(x) for x in all_operands) |
- print >>f, "};\n" |
+ lprint("/* Generated by %s r%s, do not edit */" % \ |
+ (scriptname, scriptrev), f) |
+ lprint("static const x86_info_operand insn_operands[] = {", f) |
+ lprint(" ", f, '') |
+ lprint(",\n ".join(str(x) for x in all_operands), f) |
+ lprint("};\n", f) |
# Output groups |
seen = set() |
@@ -605,10 +642,10 @@ |
if name in seen: |
continue |
seen.add(name) |
- print >>f, "static const x86_insn_info %s_insn[] = {" % name |
- print >>f, " ", |
- print >>f, ",\n ".join(str(x) for x in groups[name]) |
- print >>f, "};\n" |
+ lprint("static const x86_insn_info %s_insn[] = {" % name, f) |
+ lprint(" ", f, '') |
+ lprint(",\n ".join(str(x) for x in groups[name]), f) |
+ lprint("};\n", f) |
##################################################################### |
# General instruction groupings |
@@ -2189,15 +2226,18 @@ |
opcode=[], |
operands=[Operand(type="ImmNotSegOff", dest="JmpRel")]) |
add_group("call", |
+ suffix="w", |
opersize=16, |
opcode=[], |
operands=[Operand(type="ImmNotSegOff", size=16, dest="JmpRel")]) |
add_group("call", |
+ suffix="l", |
not64=True, |
opersize=32, |
opcode=[], |
operands=[Operand(type="ImmNotSegOff", size=32, dest="JmpRel")]) |
add_group("call", |
+ suffixes=["l", "q"], |
only64=True, |
opersize=64, |
opcode=[], |
@@ -2225,59 +2265,77 @@ |
operands=[Operand(type="Imm", tmod="Near", dest="JmpRel")]) |
add_group("call", |
+ suffix="w", |
+ req_suffix=True, |
opersize=16, |
opcode=[0xFF], |
spare=2, |
operands=[Operand(type="RM", size=16, dest="EA")]) |
add_group("call", |
+ suffix="l", |
+ req_suffix=True, |
not64=True, |
opersize=32, |
opcode=[0xFF], |
spare=2, |
operands=[Operand(type="RM", size=32, dest="EA")]) |
add_group("call", |
+ suffix="q", |
+ req_suffix=True, |
opersize=64, |
def_opersize_64=64, |
opcode=[0xFF], |
spare=2, |
operands=[Operand(type="RM", size=64, dest="EA")]) |
add_group("call", |
+ parsers=["gas"], |
def_opersize_64=64, |
opcode=[0xFF], |
spare=2, |
+ operands=[Operand(type="Reg", size="BITS", dest="EA")]) |
+add_group("call", |
+ def_opersize_64=64, |
+ opcode=[0xFF], |
+ spare=2, |
operands=[Operand(type="Mem", dest="EA")]) |
add_group("call", |
+ parsers=["nasm"], |
opersize=16, |
def_opersize_64=64, |
opcode=[0xFF], |
spare=2, |
operands=[Operand(type="RM", size=16, tmod="Near", dest="EA")]) |
add_group("call", |
+ parsers=["nasm"], |
not64=True, |
opersize=32, |
opcode=[0xFF], |
spare=2, |
operands=[Operand(type="RM", size=32, tmod="Near", dest="EA")]) |
add_group("call", |
+ parsers=["nasm"], |
opersize=64, |
def_opersize_64=64, |
opcode=[0xFF], |
spare=2, |
operands=[Operand(type="RM", size=64, tmod="Near", dest="EA")]) |
add_group("call", |
+ parsers=["nasm"], |
def_opersize_64=64, |
opcode=[0xFF], |
spare=2, |
operands=[Operand(type="Mem", tmod="Near", dest="EA")]) |
-# Far indirect (through memory). Needs explicit FAR override. |
+# Far indirect (through memory). Needs explicit FAR override (NASM only) |
for sz in [16, 32, 64]: |
add_group("call", |
+ parsers=["nasm"], |
opersize=sz, |
opcode=[0xFF], |
spare=3, |
operands=[Operand(type="Mem", size=sz, tmod="Far", dest="EA")]) |
add_group("call", |
+ parsers=["nasm"], |
opcode=[0xFF], |
spare=3, |
operands=[Operand(type="Mem", tmod="Far", dest="EA")]) |
@@ -2285,34 +2343,52 @@ |
# With explicit FAR override |
for sz in [16, 32]: |
add_group("call", |
+ parsers=["nasm"], |
not64=True, |
opersize=sz, |
opcode=[0x9A], |
- spare=3, |
operands=[Operand(type="Imm", size=sz, tmod="Far", dest="JmpFar")]) |
add_group("call", |
+ parsers=["nasm"], |
not64=True, |
opcode=[0x9A], |
- spare=3, |
operands=[Operand(type="Imm", tmod="Far", dest="JmpFar")]) |
-# Since not caught by first ImmNotSegOff group, implicitly FAR. |
+# Since not caught by first ImmNotSegOff group, implicitly FAR (in NASM). |
for sz in [16, 32]: |
add_group("call", |
+ parsers=["nasm"], |
not64=True, |
opersize=sz, |
opcode=[0x9A], |
- spare=3, |
operands=[Operand(type="Imm", size=sz, dest="JmpFar")]) |
add_group("call", |
+ parsers=["nasm"], |
not64=True, |
opcode=[0x9A], |
- spare=3, |
operands=[Operand(type="Imm", dest="JmpFar")]) |
+# Two-operand FAR (GAS only) |
+for sfx, sz in zip("wl", [16, 32]): |
+ add_group("call", |
+ suffix=sfx, |
+ req_suffix=True, |
+ parsers=["gas"], |
+ not64=True, |
+ gas_no_reverse=True, |
+ opersize=sz, |
+ opcode=[0x9A], |
+ operands=[Operand(type="Imm", size=16, relaxed=True, dest="JmpFar"), |
+ Operand(type="Imm", size=sz, relaxed=True, dest="JmpFar")]) |
+add_group("call", |
+ parsers=["gas"], |
+ not64=True, |
+ gas_no_reverse=True, |
+ opcode=[0x9A], |
+ operands=[Operand(type="Imm", size=16, relaxed=True, dest="JmpFar"), |
+ Operand(type="Imm", size="BITS", relaxed=True, dest="JmpFar")]) |
+ |
add_insn("call", "call") |
-add_insn("calll", "call", parser="gas", not64=True) |
-add_insn("callq", "call", parser="gas", only64=True) |
# |
# jmp |
@@ -2321,15 +2397,18 @@ |
opcode=[], |
operands=[Operand(type="ImmNotSegOff", dest="JmpRel")]) |
add_group("jmp", |
+ suffix="w", |
opersize=16, |
opcode=[], |
operands=[Operand(type="ImmNotSegOff", size=16, dest="JmpRel")]) |
add_group("jmp", |
+ suffix="l", |
not64=True, |
opersize=32, |
opcode=[0x00], |
operands=[Operand(type="ImmNotSegOff", size=32, dest="JmpRel")]) |
add_group("jmp", |
+ suffixes=["l", "q"], |
only64=True, |
opersize=64, |
opcode=[0x00], |
@@ -2362,35 +2441,49 @@ |
operands=[Operand(type="Imm", tmod="Near", dest="JmpRel")]) |
add_group("jmp", |
+ suffix="w", |
+ req_suffix=True, |
opersize=16, |
def_opersize_64=64, |
opcode=[0xFF], |
spare=4, |
operands=[Operand(type="RM", size=16, dest="EA")]) |
add_group("jmp", |
+ suffix="l", |
+ req_suffix=True, |
not64=True, |
opersize=32, |
opcode=[0xFF], |
spare=4, |
operands=[Operand(type="RM", size=32, dest="EA")]) |
add_group("jmp", |
+ suffix="q", |
+ req_suffix=True, |
opersize=64, |
def_opersize_64=64, |
opcode=[0xFF], |
spare=4, |
operands=[Operand(type="RM", size=64, dest="EA")]) |
add_group("jmp", |
+ parsers=["gas"], |
def_opersize_64=64, |
opcode=[0xFF], |
spare=4, |
+ operands=[Operand(type="Reg", size="BITS", dest="EA")]) |
+add_group("jmp", |
+ def_opersize_64=64, |
+ opcode=[0xFF], |
+ spare=4, |
operands=[Operand(type="Mem", dest="EA")]) |
add_group("jmp", |
+ parsers=["nasm"], |
opersize=16, |
def_opersize_64=64, |
opcode=[0xFF], |
spare=4, |
operands=[Operand(type="RM", size=16, tmod="Near", dest="EA")]) |
add_group("jmp", |
+ parsers=["nasm"], |
not64=True, |
cpu=["386"], |
opersize=32, |
@@ -2398,12 +2491,14 @@ |
spare=4, |
operands=[Operand(type="RM", size=32, tmod="Near", dest="EA")]) |
add_group("jmp", |
+ parsers=["nasm"], |
opersize=64, |
def_opersize_64=64, |
opcode=[0xFF], |
spare=4, |
operands=[Operand(type="RM", size=64, tmod="Near", dest="EA")]) |
add_group("jmp", |
+ parsers=["nasm"], |
def_opersize_64=64, |
opcode=[0xFF], |
spare=4, |
@@ -2427,31 +2522,92 @@ |
not64=True, |
opersize=sz, |
opcode=[0xEA], |
- spare=3, |
operands=[Operand(type="Imm", size=sz, tmod="Far", dest="JmpFar")]) |
add_group("jmp", |
not64=True, |
opcode=[0xEA], |
- spare=3, |
operands=[Operand(type="Imm", tmod="Far", dest="JmpFar")]) |
-# Since not caught by first ImmNotSegOff group, implicitly FAR. |
+# Since not caught by first ImmNotSegOff group, implicitly FAR (in NASM). |
for sz in [16, 32]: |
add_group("jmp", |
+ parsers=["nasm"], |
not64=True, |
opersize=sz, |
opcode=[0xEA], |
- spare=3, |
operands=[Operand(type="Imm", size=sz, dest="JmpFar")]) |
add_group("jmp", |
+ parsers=["nasm"], |
not64=True, |
opcode=[0xEA], |
- spare=3, |
operands=[Operand(type="Imm", dest="JmpFar")]) |
+# Two-operand FAR (GAS only) |
+for sfx, sz in zip("wl", [16, 32]): |
+ add_group("jmp", |
+ parsers=["gas"], |
+ suffix=sfx, |
+ req_suffix=True, |
+ not64=True, |
+ gas_no_reverse=True, |
+ opersize=sz, |
+ opcode=[0xEA], |
+ operands=[Operand(type="Imm", size=16, relaxed=True, dest="JmpFar"), |
+ Operand(type="Imm", size=sz, relaxed=True, dest="JmpFar")]) |
+add_group("jmp", |
+ parsers=["gas"], |
+ not64=True, |
+ gas_no_reverse=True, |
+ opcode=[0xEA], |
+ operands=[Operand(type="Imm", size=16, relaxed=True, dest="JmpFar"), |
+ Operand(type="Imm", size="BITS", relaxed=True, dest="JmpFar")]) |
+ |
add_insn("jmp", "jmp") |
# |
+# GAS far calls/jumps |
+# |
+ |
+# Far indirect (through memory) |
+for sfx, sz in zip("wlq", [16, 32, 64]): |
+ add_group("ljmpcall", |
+ suffix=sfx, |
+ req_suffix=True, |
+ opersize=sz, |
+ modifiers=["SpAdd"], |
+ opcode=[0xFF], |
+ spare=0, |
+ operands=[Operand(type="Mem", size=sz, relaxed=True, dest="EA")]) |
+add_group("ljmpcall", |
+ modifiers=["SpAdd"], |
+ opcode=[0xFF], |
+ spare=0, |
+ operands=[Operand(type="Mem", size="BITS", relaxed=True, dest="EA")]) |
+ |
+# Two-operand far |
+for sfx, sz in zip("wl", [16, 32]): |
+ add_group("ljmpcall", |
+ not64=True, |
+ gas_no_reverse=True, |
+ suffix=sfx, |
+ req_suffix=True, |
+ opersize=sz, |
+ modifiers=["Gap", "Op0Add"], |
+ opcode=[0x00], |
+ operands=[Operand(type="Imm", size=16, relaxed=True, dest="JmpFar"), |
+ Operand(type="Imm", size=sz, relaxed=True, dest="JmpFar")]) |
+add_group("ljmpcall", |
+ not64=True, |
+ gas_no_reverse=True, |
+ modifiers=["Gap", "Op0Add"], |
+ opcode=[0x00], |
+ operands=[Operand(type="Imm", size=16, relaxed=True, dest="JmpFar"), |
+ Operand(type="Imm", size="BITS", relaxed=True, dest="JmpFar")]) |
+ |
+add_insn("ljmp", "ljmpcall", parser="gas", modifiers=[5, 0xEA]) |
+add_insn("lcall", "ljmpcall", parser="gas", modifiers=[3, 0x9A]) |
+ |
+# |
# ret |
# |
add_group("retnf", |
@@ -2494,10 +2650,11 @@ |
add_insn("retq", "retnf", parser="gas", modifiers=[0xC2], only64=True) |
add_insn("retn", "retnf", parser="nasm", modifiers=[0xC2]) |
add_insn("retf", "retnf", parser="nasm", modifiers=[0xCA, 64]) |
-add_insn("lretw", "retnf", parser="gas", modifiers=[0xCA, 16], suffix="NONE") |
-add_insn("lretl", "retnf", parser="gas", modifiers=[0xCA], suffix="NONE") |
+add_insn("lret", "retnf", parser="gas", modifiers=[0xCA], suffix="z") |
+add_insn("lretw", "retnf", parser="gas", modifiers=[0xCA, 16], suffix="w") |
+add_insn("lretl", "retnf", parser="gas", modifiers=[0xCA], suffix="l") |
add_insn("lretq", "retnf", parser="gas", modifiers=[0xCA, 64], only64=True, |
- suffix="NONE") |
+ suffix="q") |
# |
# enter |
@@ -2690,6 +2847,45 @@ |
add_insn("loopnz", "loop", modifiers=[0]) |
add_insn("loopne", "loop", modifiers=[0]) |
+# GAS w/l/q suffixes have to set addrsize via modifiers |
+for sfx, sz in zip("wlq", [16, 32, 64]): |
+ add_group("loop"+sfx, |
+ not64=(sz == 16), |
+ only64=(sz == 64), |
+ modifiers=["Gap", "AdSizeR"], |
+ def_opersize_64=64, |
+ opcode=[], |
+ operands=[Operand(type="Imm", dest="JmpRel")]) |
+ add_group("loop"+sfx, |
+ not64=(sz == 16), |
+ only64=(sz == 64), |
+ modifiers=["Op0Add", "AdSizeR"], |
+ def_opersize_64=64, |
+ opcode=[0xE0], |
+ operands=[Operand(type="Imm", tmod="Short", dest="JmpRel")]) |
+ |
+ add_group("loop"+sfx, |
+ not64=(sz == 16), |
+ only64=(sz == 64), |
+ def_opersize_64=64, |
+ opcode=[], |
+ operands=[Operand(type="Imm", dest="JmpRel"), |
+ Operand(type="Creg", size=sz, dest="AdSizeR")]) |
+ add_group("loop"+sfx, |
+ not64=(sz == 16), |
+ only64=(sz == 64), |
+ modifiers=["Op0Add"], |
+ def_opersize_64=64, |
+ opcode=[0xE0], |
+ operands=[Operand(type="Imm", tmod="Short", dest="JmpRel"), |
+ Operand(type="Creg", size=sz, dest="AdSizeR")]) |
+ |
+ add_insn("loop"+sfx, "loop"+sfx, parser="gas", modifiers=[2, sz]) |
+ add_insn("loopz"+sfx, "loop"+sfx, parser="gas", modifiers=[1, sz]) |
+ add_insn("loope"+sfx, "loop"+sfx, parser="gas", modifiers=[1, sz]) |
+ add_insn("loopnz"+sfx, "loop"+sfx, parser="gas", modifiers=[0, sz]) |
+ add_insn("loopne"+sfx, "loop"+sfx, parser="gas", modifiers=[0, sz]) |
+ |
##################################################################### |
# Set byte on flag instructions |
##################################################################### |
@@ -3074,10 +3270,10 @@ |
modifiers=["SpAdd"], |
opcode=[0xDB], |
spare=0, |
- operands=[Operand(type="Mem", size=80, dest="EA")]) |
+ operands=[Operand(type="Mem", size=80, relaxed=True, dest="EA")]) |
-add_insn("fldt", "fldstpt", suffix="WEAK", modifiers=[5]) |
-add_insn("fstpt", "fldstpt", suffix="WEAK", modifiers=[7]) |
+add_insn("fldt", "fldstpt", modifiers=[5]) |
+add_insn("fstpt", "fldstpt", modifiers=[7]) |
add_group("fildstp", |
suffix="s", |
@@ -4660,6 +4856,7 @@ |
suffix="q", |
cpu=["MMX", "P3"], |
notavx=True, |
+ def_opersize_64=64, |
opersize=64, |
opcode=[0x0F, 0xC4], |
operands=[Operand(type="SIMDReg", size=64, dest="Spare"), |
@@ -4686,6 +4883,7 @@ |
suffix="q", |
cpu=["SSE2"], |
modifiers=["SetVEX"], |
+ def_opersize_64=64, |
opersize=64, |
prefix=0x66, |
opcode=[0x0F, 0xC4], |
@@ -4715,6 +4913,7 @@ |
suffix="q", |
cpu=["AVX"], |
vex=128, |
+ def_opersize_64=64, |
opersize=64, |
prefix=0x66, |
opcode=[0x0F, 0xC4], |
@@ -5077,6 +5276,28 @@ |
# P4 VMX Instructions |
##################################################################### |
+add_group("eptvpid", |
+ modifiers=["Op2Add"], |
+ suffix="l", |
+ not64=True, |
+ cpu=["EPTVPID"], |
+ opersize=32, |
+ prefix=0x66, |
+ opcode=[0x0F, 0x38, 0x80], |
+ operands=[Operand(type="Reg", size=32, dest="Spare"), |
+ Operand(type="Mem", size=128, relaxed=True, dest="EA")]) |
+add_group("eptvpid", |
+ modifiers=["Op2Add"], |
+ suffix="q", |
+ cpu=["EPTVPID"], |
+ opersize=64, |
+ prefix=0x66, |
+ opcode=[0x0F, 0x38, 0x80], |
+ operands=[Operand(type="Reg", size=64, dest="Spare"), |
+ Operand(type="Mem", size=128, relaxed=True, dest="EA")]) |
+add_insn("invept", "eptvpid", modifiers=[0]) |
+add_insn("invvpid", "eptvpid", modifiers=[1]) |
+ |
add_insn("vmcall", "threebyte", modifiers=[0x0F, 0x01, 0xC1], cpu=["P4"]) |
add_insn("vmlaunch", "threebyte", modifiers=[0x0F, 0x01, 0xC2], cpu=["P4"]) |
add_insn("vmresume", "threebyte", modifiers=[0x0F, 0x01, 0xC3], cpu=["P4"]) |
@@ -5137,6 +5358,11 @@ |
add_insn("vmclear", "vmxthreebytemem", modifiers=[0x66]) |
add_insn("vmxon", "vmxthreebytemem", modifiers=[0xF3]) |
+##################################################################### |
+# Intel SMX Instructions |
+##################################################################### |
+add_insn("getsec", "twobyte", modifiers=[0x0F, 0x37], cpu=["SMX"]) |
+ |
add_insn("cvttpd2pi", "cvt_mm_xmm", modifiers=[0x66, 0x2C], cpu=["SSE2"]) |
add_insn("cvttsd2si", "cvt_rx_xmm64", modifiers=[0xF2, 0x2C], cpu=["SSE2"]) |
add_insn("cvttpd2dq", "xmm_xmm128", modifiers=[0x66, 0xE6], cpu=["SSE2"]) |
@@ -5584,7 +5810,6 @@ |
add_group("extractps", |
cpu=["SSE41"], |
modifiers=["SetVEX"], |
- opersize=32, |
prefix=0x66, |
opcode=[0x0F, 0x3A, 0x17], |
operands=[Operand(type="RM", size=32, relaxed=True, dest="EA"), |
@@ -5679,16 +5904,23 @@ |
operands=[Operand(type="Mem", size=8, relaxed=True, dest="EA"), |
Operand(type="SIMDReg", size=128, dest="Spare"), |
Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
-for sz in [32, 64]: |
- add_group("pextrb", |
- cpu=["SSE41"], |
- modifiers=["SetVEX"], |
- opersize=sz, |
- prefix=0x66, |
- opcode=[0x0F, 0x3A, 0x14], |
- operands=[Operand(type="Reg", size=sz, dest="EA"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
+add_group("pextrb", |
+ cpu=["SSE41"], |
+ modifiers=["SetVEX"], |
+ prefix=0x66, |
+ opcode=[0x0F, 0x3A, 0x14], |
+ operands=[Operand(type="Reg", size=32, dest="EA"), |
+ Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
+add_group("pextrb", |
+ cpu=["SSE41"], |
+ modifiers=["SetVEX"], |
+ opersize=64, |
+ prefix=0x66, |
+ opcode=[0x0F, 0x3A, 0x14], |
+ operands=[Operand(type="Reg", size=64, dest="EA"), |
+ Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
add_insn("pextrb", "pextrb") |
add_insn("vpextrb", "pextrb", modifiers=[VEXL0], avx=True) |
@@ -5696,7 +5928,6 @@ |
add_group("pextrd", |
cpu=["SSE41"], |
modifiers=["SetVEX"], |
- opersize=32, |
prefix=0x66, |
opcode=[0x0F, 0x3A, 0x16], |
operands=[Operand(type="RM", size=32, relaxed=True, dest="EA"), |
@@ -5730,7 +5961,6 @@ |
add_group("pinsrb", |
cpu=["SSE41"], |
modifiers=["SetVEX"], |
- opersize=32, |
prefix=0x66, |
opcode=[0x0F, 0x3A, 0x20], |
operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), |
@@ -5748,7 +5978,6 @@ |
add_group("pinsrb", |
cpu=["AVX"], |
vex=128, |
- opersize=32, |
prefix=0x66, |
opcode=[0x0F, 0x3A, 0x20], |
operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), |
@@ -5762,7 +5991,6 @@ |
add_group("pinsrd", |
cpu=["SSE41"], |
modifiers=["SetVEX"], |
- opersize=32, |
prefix=0x66, |
opcode=[0x0F, 0x3A, 0x22], |
operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), |
@@ -5771,7 +5999,6 @@ |
add_group("pinsrd", |
cpu=["AVX"], |
vex=128, |
- opersize=32, |
prefix=0x66, |
opcode=[0x0F, 0x3A, 0x22], |
operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
@@ -6458,7 +6685,7 @@ |
modifiers=["Op1Add", "Op2Add", "SetVEX"], |
prefix=0x66, |
opcode=[0x0F, 0x00, 0x00], |
- operands=[Operand(type="SIMDReg", size=128, dest="SpareVEX"), |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
add_insn("aesimc", "aesimc", modifiers=[0x38, 0xDB]) |
@@ -6527,6 +6754,122 @@ |
modifiers=[combval, VEXL0], avx=True) |
##################################################################### |
+# AVX Post-32nm instructions |
+##################################################################### |
+ |
+# RDRAND |
+add_group("rdrand", |
+ cpu=["RDRAND"], |
+ opersize=16, |
+ opcode=[0x0F, 0xC7], |
+ spare=6, |
+ operands=[Operand(type="Reg", size=16, dest="EA")]) |
+add_group("rdrand", |
+ #suffix="l", |
+ cpu=["RDRAND"], |
+ opersize=32, |
+ opcode=[0x0F, 0xC7], |
+ spare=6, |
+ operands=[Operand(type="Reg", size=32, dest="EA")]) |
+add_group("rdrand", |
+ cpu=["RDRAND"], |
+ opersize=64, |
+ opcode=[0x0F, 0xC7], |
+ spare=6, |
+ operands=[Operand(type="Reg", size=64, dest="EA")]) |
+add_insn("rdrand", "rdrand") |
+ |
+# FSGSBASE instructions |
+add_group("fs_gs_base", |
+ only64=True, |
+ cpu=["FSGSBASE"], |
+ modifiers=['SpAdd'], |
+ opersize=32, |
+ prefix=0xF3, |
+ opcode=[0x0F, 0xAE], |
+ operands=[Operand(type="Reg", size=32, dest="EA")]) |
+add_group("fs_gs_base", |
+ only64=True, |
+ cpu=["FSGSBASE"], |
+ opersize=64, |
+ modifiers=['SpAdd'], |
+ prefix=0xF3, |
+ opcode=[0x0F, 0xAE], |
+ operands=[Operand(type="Reg", size=64, dest="EA")]) |
+ |
+add_insn("rdfsbase", "fs_gs_base", modifiers=[0], only64=True) |
+add_insn("rdgsbase", "fs_gs_base", modifiers=[1], only64=True) |
+add_insn("wrfsbase", "fs_gs_base", modifiers=[2], only64=True) |
+add_insn("wrgsbase", "fs_gs_base", modifiers=[3], only64=True) |
+ |
+# Float-16 conversion instructions |
+for g in ['ps2ph', 'ph2ps']: |
+ operands1=[] |
+ operands1.append(Operand(type="SIMDReg", size=128, dest="EA")) |
+ operands1.append(Operand(type="SIMDReg", size=128, dest="Spare")) |
+ |
+ operands2=[] |
+ operands2.append(Operand(type="Mem", size=64, dest="EA")) |
+ operands2.append(Operand(type="SIMDReg", size=128, dest="Spare")) |
+ |
+ operands3=[] |
+ operands3.append(Operand(type="SIMDReg", size=128, dest="EA")) |
+ operands3.append(Operand(type="SIMDReg", size=256, dest="Spare")) |
+ |
+ operands4=[] |
+ operands4.append(Operand(type="Mem", size=128, dest="EA")) |
+ operands4.append(Operand(type="SIMDReg", size=256, dest="Spare")) |
+ |
+ if g == 'ph2ps': |
+ operands1.reverse() |
+ operands2.reverse() |
+ operands3.reverse() |
+ operands4.reverse() |
+ map = 0x38 |
+ elif g == 'ps2ph': |
+ immop = Operand(type="Imm", size=8, relaxed=True, dest="Imm") |
+ operands1.append(immop) |
+ operands2.append(immop) |
+ operands3.append(immop) |
+ operands4.append(immop) |
+ map = 0x3A |
+ |
+ add_group("avx_cvt" + g, |
+ cpu=["F16C", "AVX"], |
+ modifiers=["PreAdd", "Op2Add"], |
+ vex=128, |
+ prefix=0x00, |
+ opcode=[0x0F, map, 0x00], |
+ operands=operands1) |
+ |
+ add_group("avx_cvt" + g, |
+ cpu=["F16C", "AVX"], |
+ modifiers=["PreAdd", "Op2Add"], |
+ vex=128, |
+ prefix=0x00, |
+ opcode=[0x0F, map, 0x00], |
+ operands=operands2) |
+ |
+ add_group("avx_cvt" + g, |
+ cpu=["F16C", "AVX"], |
+ modifiers=["PreAdd", "Op2Add"], |
+ vex=256, |
+ prefix=0x00, |
+ opcode=[0x0F, map, 0x00], |
+ operands=operands3) |
+ |
+ add_group("avx_cvt" + g, |
+ cpu=["F16C", "AVX"], |
+ modifiers=["PreAdd", "Op2Add"], |
+ vex=256, |
+ prefix=0x00, |
+ opcode=[0x0F, map, 0x00], |
+ operands=operands4) |
+ |
+add_insn("vcvtps2ph", "avx_cvtps2ph", modifiers=[0x66, 0x1D], avx=True) |
+add_insn("vcvtph2ps", "avx_cvtph2ps", modifiers=[0x66, 0x13], avx=True) |
+ |
+##################################################################### |
# AMD SSE4a instructions |
##################################################################### |
@@ -6582,404 +6925,354 @@ |
add_insn("movntss", "movntss") |
##################################################################### |
-# AMD SSE5 instructions |
+# AMD XOP instructions |
##################################################################### |
-add_group("sse5com", |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x25, 0x00], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
- Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
- |
-for sz in [32, 64]: |
- add_group("sse5com%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x25, 0x00], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="SIMDReg", size=128, dest="EA"), |
- Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
- add_group("sse5com%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x25, 0x00], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="Mem", size=sz, relaxed=True, dest="EA"), |
- Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
- |
-# Condition code versions |
-add_group("sse5comcc", |
- cpu=["SSE5"], |
- modifiers=["Op2Add", "Imm8"], |
- opcode=[0x0F, 0x25, 0x00], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
+add_group("vfrc_pdps", |
+ cpu=["XOP"], |
+ modifiers=["Op1Add"], |
+ xop=128, |
+ opcode=[0x09, 0x80], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
+add_group("vfrc_pdps", |
+ cpu=["XOP"], |
+ modifiers=["Op1Add"], |
+ xop=256, |
+ opcode=[0x09, 0x80], |
+ operands=[Operand(type="SIMDReg", size=256, dest="Spare"), |
+ Operand(type="SIMDRM", size=256, relaxed=True, dest="EA")]) |
+add_insn("vfrczpd", "vfrc_pdps", modifiers=[0x01]) |
+add_insn("vfrczps", "vfrc_pdps", modifiers=[0x00]) |
-for sz in [32, 64]: |
- add_group("sse5comcc%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add", "Imm8"], |
- opcode=[0x0F, 0x25, 0x00], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="SIMDReg", size=128, dest="EA")]) |
- add_group("sse5comcc%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add", "Imm8"], |
- opcode=[0x0F, 0x25, 0x00], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="Mem", size=sz, relaxed=True, dest="EA")]) |
- |
-sse5coms = [(0, ""), |
- (0x0, "eq"), |
- (0x1, "lt"), (0x1, "unge"), |
- (0x2, "le"), (0x2, "ungt"), |
- (0x3, "unord"), |
- (0x4, "ne"), (0x4, "neq"), |
- (0x5, "nlt"), (0x5, "uge"), |
- (0x6, "nle"), (0x6, "ugt"), |
- (0x7, "ord"), |
- (0x8, "ueq"), |
- (0x9, "ult"), (0x9, "nge"), |
- (0xa, "ule"), (0xa, "ngt"), |
- (0xb, "false"), |
- (0xc, "une"), (0xc, "uneq"), |
- (0xd, "unlt"), (0xd, "ge"), |
- (0xe, "unle"), (0xe, "gt"), |
- (0xf, "true")] |
-for ib, cc in sse5coms: |
- if cc: |
- iname = "sse5comcc" |
- else: |
- iname = "sse5com" |
- add_insn("com"+cc+"ps", iname, modifiers=[0x2C, ib]) |
- add_insn("com"+cc+"pd", iname, modifiers=[0x2D, ib]) |
- add_insn("com"+cc+"ss", iname+"32", modifiers=[0x2E, ib]) |
- add_insn("com"+cc+"sd", iname+"64", modifiers=[0x2F, ib]) |
- |
-sse5coms = list(enumerate(["lt", "le", "gt", "ge", |
- "eq", "neq", "false", "true"])) |
-sse5coms.append((5, "ne")) |
-sse5coms.append((0, "")) |
-for ib, cc in sse5coms: |
- if cc: |
- iname = "sse5comcc" |
- else: |
- iname = "sse5com" |
- add_insn("pcom"+cc+"b", iname, modifiers=[0x4C, ib]) |
- add_insn("pcom"+cc+"w", iname, modifiers=[0x4D, ib]) |
- add_insn("pcom"+cc+"d", iname, modifiers=[0x4E, ib]) |
- add_insn("pcom"+cc+"q", iname, modifiers=[0x4F, ib]) |
- |
- add_insn("pcom"+cc+"ub", iname, modifiers=[0x6C, ib]) |
- add_insn("pcom"+cc+"uw", iname, modifiers=[0x6D, ib]) |
- add_insn("pcom"+cc+"ud", iname, modifiers=[0x6E, ib]) |
- add_insn("pcom"+cc+"uq", iname, modifiers=[0x6F, ib]) |
- |
-add_group("cvtph2ps", |
- cpu=["SSE5"], |
- opcode=[0x0F, 0x7A, 0x30], |
+add_group("vfrczsd", |
+ cpu=["XOP"], |
+ xop=128, |
+ opcode=[0x09, 0x83], |
operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
Operand(type="SIMDReg", size=128, dest="EA")]) |
-add_group("cvtph2ps", |
- cpu=["SSE5"], |
- opcode=[0x0F, 0x7A, 0x30], |
+add_group("vfrczsd", |
+ cpu=["XOP"], |
+ xop=128, |
+ opcode=[0x09, 0x83], |
operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
Operand(type="Mem", size=64, relaxed=True, dest="EA")]) |
+add_insn("vfrczsd", "vfrczsd") |
-add_insn("cvtph2ps", "cvtph2ps") |
+add_group("vfrczss", |
+ cpu=["XOP"], |
+ xop=128, |
+ opcode=[0x09, 0x82], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="EA")]) |
+add_group("vfrczss", |
+ cpu=["XOP"], |
+ xop=128, |
+ opcode=[0x09, 0x82], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="Mem", size=32, relaxed=True, dest="EA")]) |
+add_insn("vfrczss", "vfrczss") |
-add_group("cvtps2ph", |
- cpu=["SSE5"], |
- opcode=[0x0F, 0x7A, 0x31], |
- operands=[Operand(type="SIMDReg", size=128, dest="EA"), |
- Operand(type="SIMDReg", size=128, dest="Spare")]) |
-add_group("cvtps2ph", |
- cpu=["SSE5"], |
- opcode=[0x0F, 0x7A, 0x31], |
- operands=[Operand(type="Mem", size=64, relaxed=True, dest="EA"), |
- Operand(type="SIMDReg", size=128, dest="Spare")]) |
+add_group("vpcmov", |
+ cpu=["XOP"], |
+ xop=128, |
+ xopw=0, |
+ opcode=[0x08, 0xA2], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
+ Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
+ Operand(type="SIMDReg", size=128, dest="VEXImmSrc")]) |
+add_group("vpcmov", |
+ cpu=["XOP"], |
+ xop=128, |
+ xopw=1, |
+ opcode=[0x08, 0xA2], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
+ Operand(type="SIMDReg", size=128, dest="VEXImmSrc"), |
+ Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
+add_group("vpcmov", |
+ cpu=["XOP"], |
+ xop=256, |
+ xopw=0, |
+ opcode=[0x08, 0xA2], |
+ operands=[Operand(type="SIMDReg", size=256, dest="Spare"), |
+ Operand(type="SIMDReg", size=256, dest="VEX"), |
+ Operand(type="SIMDRM", size=256, relaxed=True, dest="EA"), |
+ Operand(type="SIMDReg", size=256, dest="VEXImmSrc")]) |
+add_group("vpcmov", |
+ cpu=["XOP"], |
+ xop=256, |
+ xopw=1, |
+ opcode=[0x08, 0xA2], |
+ operands=[Operand(type="SIMDReg", size=256, dest="Spare"), |
+ Operand(type="SIMDReg", size=256, dest="VEX"), |
+ Operand(type="SIMDReg", size=256, dest="VEXImmSrc"), |
+ Operand(type="SIMDRM", size=256, relaxed=True, dest="EA")]) |
-add_insn("cvtps2ph", "cvtps2ph") |
+add_insn("vpcmov", "vpcmov") |
-add_group("sse5arith", |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x00], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
+add_group("vpcom", |
+ cpu=["XOP"], |
+ modifiers=["Op1Add", "Imm8"], |
+ xop=128, |
+ opcode=[0x08, 0x00], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
-add_group("sse5arith", |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x00], |
- drex_oc0=1, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None), |
+add_group("vpcom_imm", |
+ cpu=["XOP"], |
+ modifiers=["Op1Add"], |
+ xop=128, |
+ opcode=[0x08, 0x00], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
- Operand(type="SIMDReg", size=128, dest="Spare")]) |
-add_group("sse5arith", |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x04], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None)]) |
-add_group("sse5arith", |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x04], |
- drex_oc0=1, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None)]) |
+ Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
-for sz in [32, 64]: |
- add_group("sse5arith%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x00], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="SIMDReg", size=128, dest="EA")]) |
- add_group("sse5arith%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x00], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="Mem", size=sz, relaxed=True, dest="EA")]) |
- add_group("sse5arith%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x00], |
- drex_oc0=1, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None), |
- Operand(type="SIMDReg", size=128, dest="EA"), |
- Operand(type="SIMDReg", size=128, dest="Spare")]) |
- add_group("sse5arith%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x00], |
- drex_oc0=1, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None), |
- Operand(type="Mem", size=sz, relaxed=True, dest="EA"), |
- Operand(type="SIMDReg", size=128, dest="Spare")]) |
- add_group("sse5arith%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x04], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="SIMDReg", size=128, dest="EA"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None)]) |
- add_group("sse5arith%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x04], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="Mem", size=sz, relaxed=True, dest="EA"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None)]) |
- add_group("sse5arith%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x04], |
- drex_oc0=1, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="EA"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None)]) |
- add_group("sse5arith%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x04], |
- drex_oc0=1, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="Mem", size=sz, relaxed=True, dest="EA"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None)]) |
+for opc, sfx in [(0xCC, "b"), |
+ (0xCE, "d"), |
+ (0xCD, "w"), |
+ (0xCF, "q"), |
+ (0xEC, "ub"), |
+ (0xEE, "ud"), |
+ (0xEF, "uq"), |
+ (0xED, "uw")]: |
+ add_insn("vpcom"+sfx, "vpcom_imm", modifiers=[opc]) |
+ for ib, cc in enumerate(["lt", "le", "gt", "ge", |
+ "eq", "neq", "false", "true"]): |
+ add_insn("vpcom"+cc+sfx, "vpcom", modifiers=[opc, ib]) |
+ # ne alias for neq |
+ add_insn("vpcomne"+sfx, "vpcom", modifiers=[opc, 5]) |
-add_insn("fmaddps", "sse5arith", modifiers=[0x00]) |
-add_insn("fmaddpd", "sse5arith", modifiers=[0x01]) |
-add_insn("fmaddss", "sse5arith32", modifiers=[0x02]) |
-add_insn("fmaddsd", "sse5arith64", modifiers=[0x03]) |
+add_group("vphaddsub", |
+ cpu=["XOP"], |
+ modifiers=["Op1Add"], |
+ xop=128, |
+ opcode=[0x09, 0x00], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
-add_insn("fmsubps", "sse5arith", modifiers=[0x08]) |
-add_insn("fmsubpd", "sse5arith", modifiers=[0x09]) |
-add_insn("fmsubss", "sse5arith32", modifiers=[0x0A]) |
-add_insn("fmsubsd", "sse5arith64", modifiers=[0x0B]) |
+add_insn("vphaddbw", "vphaddsub", modifiers=[0xC1]) |
+add_insn("vphaddbd", "vphaddsub", modifiers=[0xC2]) |
+add_insn("vphaddbq", "vphaddsub", modifiers=[0xC3]) |
+add_insn("vphaddwd", "vphaddsub", modifiers=[0xC6]) |
+add_insn("vphaddwq", "vphaddsub", modifiers=[0xC7]) |
+add_insn("vphadddq", "vphaddsub", modifiers=[0xCB]) |
-add_insn("fnmaddps", "sse5arith", modifiers=[0x10]) |
-add_insn("fnmaddpd", "sse5arith", modifiers=[0x11]) |
-add_insn("fnmaddss", "sse5arith32", modifiers=[0x12]) |
-add_insn("fnmaddsd", "sse5arith64", modifiers=[0x13]) |
+add_insn("vphaddubw", "vphaddsub", modifiers=[0xD1]) |
+add_insn("vphaddubd", "vphaddsub", modifiers=[0xD2]) |
+add_insn("vphaddubq", "vphaddsub", modifiers=[0xD3]) |
+add_insn("vphadduwd", "vphaddsub", modifiers=[0xD6]) |
+add_insn("vphadduwq", "vphaddsub", modifiers=[0xD7]) |
+add_insn("vphaddudq", "vphaddsub", modifiers=[0xD8]) |
-add_insn("fnmsubps", "sse5arith", modifiers=[0x18]) |
-add_insn("fnmsubpd", "sse5arith", modifiers=[0x19]) |
-add_insn("fnmsubss", "sse5arith32", modifiers=[0x1A]) |
-add_insn("fnmsubsd", "sse5arith64", modifiers=[0x1B]) |
+add_insn("vphsubbw", "vphaddsub", modifiers=[0xE1]) |
+add_insn("vphsubwd", "vphaddsub", modifiers=[0xE2]) |
+add_insn("vphsubdq", "vphaddsub", modifiers=[0xE3]) |
-add_insn("pcmov", "sse5arith", modifiers=[0x22]) |
+add_group("vpma", |
+ cpu=["XOP"], |
+ modifiers=["Op1Add"], |
+ xop=128, |
+ opcode=[0x08, 0x00], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
+ Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
+ Operand(type="SIMDReg", size=128, dest="VEXImmSrc")]) |
-add_insn("permps", "sse5arith", modifiers=[0x20]) |
-add_insn("permpd", "sse5arith", modifiers=[0x21]) |
-add_insn("pperm", "sse5arith", modifiers=[0x23]) |
+add_insn("vpmacsdd", "vpma", modifiers=[0x9E]) |
+add_insn("vpmacsdqh", "vpma", modifiers=[0x9F]) |
+add_insn("vpmacsdql", "vpma", modifiers=[0x97]) |
+add_insn("vpmacssdd", "vpma", modifiers=[0x8E]) |
+add_insn("vpmacssdqh", "vpma", modifiers=[0x8F]) |
+add_insn("vpmacssdql", "vpma", modifiers=[0x87]) |
+add_insn("vpmacsswd", "vpma", modifiers=[0x86]) |
+add_insn("vpmacssww", "vpma", modifiers=[0x85]) |
+add_insn("vpmacswd", "vpma", modifiers=[0x96]) |
+add_insn("vpmacsww", "vpma", modifiers=[0x95]) |
+add_insn("vpmadcsswd", "vpma", modifiers=[0xA6]) |
+add_insn("vpmadcswd", "vpma", modifiers=[0xB6]) |
-add_group("sse5two", |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x7A, 0x00], |
+add_group("vpperm", |
+ cpu=["XOP"], |
+ xop=128, |
+ xopw=0, |
+ opcode=[0x08, 0xA3], |
operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
+ Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
+ Operand(type="SIMDReg", size=128, dest="VEXImmSrc")]) |
+add_group("vpperm", |
+ cpu=["XOP"], |
+ xop=128, |
+ xopw=1, |
+ opcode=[0x08, 0xA3], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
+ Operand(type="SIMDReg", size=128, dest="VEXImmSrc"), |
Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
-for sz in [32, 64]: |
- add_group("sse5two%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x7A, 0x00], |
- operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="SIMDReg", size=128, dest="EA")]) |
- add_group("sse5two%d" % sz, |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x7A, 0x00], |
- operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="Mem", size=sz, relaxed=True, dest="EA")]) |
+add_insn("vpperm", "vpperm") |
-add_insn("frczps", "sse5two", modifiers=[0x10]) |
-add_insn("frczpd", "sse5two", modifiers=[0x11]) |
-add_insn("frczss", "sse5two32", modifiers=[0x12]) |
-add_insn("frczsd", "sse5two64", modifiers=[0x13]) |
+add_group("vprot", |
+ cpu=["XOP"], |
+ modifiers=["Op1Add"], |
+ xop=128, |
+ xopw=0, |
+ opcode=[0x09, 0x90], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
+ Operand(type="SIMDReg", size=128, dest="VEX")]) |
+add_group("vprot", |
+ cpu=["XOP"], |
+ modifiers=["Op1Add"], |
+ xop=128, |
+ xopw=1, |
+ opcode=[0x09, 0x90], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
+ Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
+add_group("vprot", |
+ cpu=["XOP"], |
+ modifiers=["Op1Add"], |
+ xop=128, |
+ opcode=[0x08, 0xC0], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
+ Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
+for opc, sfx in enumerate(["b", "w", "d", "q"]): |
+ add_insn("vprot"+sfx, "vprot", modifiers=[opc]) |
-add_insn("phaddbw", "sse5two", modifiers=[0x41]) |
-add_insn("phaddbd", "sse5two", modifiers=[0x42]) |
-add_insn("phaddbq", "sse5two", modifiers=[0x43]) |
-add_insn("phaddwd", "sse5two", modifiers=[0x46]) |
-add_insn("phaddwq", "sse5two", modifiers=[0x47]) |
-add_insn("phadddq", "sse5two", modifiers=[0x4B]) |
- |
-add_insn("phaddubw", "sse5two", modifiers=[0x51]) |
-add_insn("phaddubd", "sse5two", modifiers=[0x52]) |
-add_insn("phaddubq", "sse5two", modifiers=[0x53]) |
-add_insn("phadduwd", "sse5two", modifiers=[0x56]) |
-add_insn("phadduwq", "sse5two", modifiers=[0x57]) |
-add_insn("phaddudq", "sse5two", modifiers=[0x5B]) |
- |
-add_insn("phsubbw", "sse5two", modifiers=[0x61]) |
-add_insn("phsubwd", "sse5two", modifiers=[0x62]) |
-add_insn("phsubdq", "sse5two", modifiers=[0x63]) |
- |
-add_group("sse5pmacs", |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x00], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
+add_group("amd_vpshift", |
+ cpu=["XOP"], |
+ modifiers=["Op1Add"], |
+ xop=128, |
+ xopw=0, |
+ opcode=[0x09, 0x00], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
- Operand(type="SIMDRegMatch0", size=128, dest=None)]) |
+ Operand(type="SIMDReg", size=128, dest="VEX")]) |
+add_group("amd_vpshift", |
+ cpu=["XOP"], |
+ modifiers=["Op1Add"], |
+ xop=128, |
+ xopw=1, |
+ opcode=[0x09, 0x00], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
+ Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
+for opc, sfx in enumerate(["b", "w", "d", "q"]): |
+ add_insn("vpsha"+sfx, "amd_vpshift", modifiers=[0x98+opc]) |
+ add_insn("vpshl"+sfx, "amd_vpshift", modifiers=[0x94+opc]) |
-add_insn("pmacsww", "sse5pmacs", modifiers=[0x95]) |
-add_insn("pmacswd", "sse5pmacs", modifiers=[0x96]) |
-add_insn("pmacsdql", "sse5pmacs", modifiers=[0x97]) |
-add_insn("pmacsdd", "sse5pmacs", modifiers=[0x9E]) |
-add_insn("pmacsdqh", "sse5pmacs", modifiers=[0x9F]) |
+##################################################################### |
+# AMD FMA4 instructions (same as original Intel FMA instructions) |
+##################################################################### |
-add_insn("pmacssww", "sse5pmacs", modifiers=[0x85]) |
-add_insn("pmacsswd", "sse5pmacs", modifiers=[0x86]) |
-add_insn("pmacssdql", "sse5pmacs", modifiers=[0x87]) |
-add_insn("pmacssdd", "sse5pmacs", modifiers=[0x8E]) |
-add_insn("pmacssdqh", "sse5pmacs", modifiers=[0x8F]) |
- |
-add_insn("pmadcsswd", "sse5pmacs", modifiers=[0xA6]) |
-add_insn("pmadcswd", "sse5pmacs", modifiers=[0xB6]) |
- |
-add_group("sse5prot", |
- cpu=["SSE5"], |
+add_group("fma_128_256", |
+ cpu=["FMA4"], |
modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x40], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
-add_group("sse5prot", |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x40], |
- drex_oc0=1, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
+ vex=128, |
+ vexw=0, |
+ prefix=0x66, |
+ opcode=[0x0F, 0x3A, 0x00], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
- Operand(type="SIMDReg", size=128, dest="Spare")]) |
-add_group("sse5prot", |
- cpu=["SSE5"], |
+ Operand(type="SIMDReg", size=128, dest="VEXImmSrc")]) |
+add_group("fma_128_256", |
+ cpu=["FMA4"], |
modifiers=["Op2Add"], |
- opcode=[0x0F, 0x7B, 0x40], |
+ vex=128, |
+ vexw=1, |
+ prefix=0x66, |
+ opcode=[0x0F, 0x3A, 0x00], |
operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
- Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
- Operand(type="Imm", size=8, relaxed=True, dest="Imm")]) |
- |
-add_insn("protb", "sse5prot", modifiers=[0x00]) |
-add_insn("protw", "sse5prot", modifiers=[0x01]) |
-add_insn("protd", "sse5prot", modifiers=[0x02]) |
-add_insn("protq", "sse5prot", modifiers=[0x03]) |
- |
-add_group("sse5psh", |
- cpu=["SSE5"], |
- modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x44], |
- drex_oc0=0, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
+ Operand(type="SIMDReg", size=128, dest="VEXImmSrc"), |
Operand(type="SIMDRM", size=128, relaxed=True, dest="EA")]) |
-add_group("sse5psh", |
- cpu=["SSE5"], |
+add_group("fma_128_256", |
+ cpu=["FMA4"], |
modifiers=["Op2Add"], |
- opcode=[0x0F, 0x24, 0x44], |
- drex_oc0=1, |
- operands=[Operand(type="SIMDReg", size=128, dest="DREX"), |
- Operand(type="SIMDRM", size=128, relaxed=True, dest="EA"), |
- Operand(type="SIMDReg", size=128, dest="Spare")]) |
+ vex=256, |
+ vexw=0, |
+ prefix=0x66, |
+ opcode=[0x0F, 0x3A, 0x00], |
+ operands=[Operand(type="SIMDReg", size=256, dest="Spare"), |
+ Operand(type="SIMDReg", size=256, dest="VEX"), |
+ Operand(type="SIMDRM", size=256, relaxed=True, dest="EA"), |
+ Operand(type="SIMDReg", size=256, dest="VEXImmSrc")]) |
+add_group("fma_128_256", |
+ cpu=["FMA4"], |
+ modifiers=["Op2Add"], |
+ vex=256, |
+ vexw=1, |
+ prefix=0x66, |
+ opcode=[0x0F, 0x3A, 0x00], |
+ operands=[Operand(type="SIMDReg", size=256, dest="Spare"), |
+ Operand(type="SIMDReg", size=256, dest="VEX"), |
+ Operand(type="SIMDReg", size=256, dest="VEXImmSrc"), |
+ Operand(type="SIMDRM", size=256, relaxed=True, dest="EA")]) |
-add_insn("pshlb", "sse5psh", modifiers=[0x00]) |
-add_insn("pshlw", "sse5psh", modifiers=[0x01]) |
-add_insn("pshld", "sse5psh", modifiers=[0x02]) |
-add_insn("pshlq", "sse5psh", modifiers=[0x03]) |
+add_insn("vfmaddpd", "fma_128_256", modifiers=[0x69]) |
+add_insn("vfmaddps", "fma_128_256", modifiers=[0x68]) |
+add_insn("vfmaddsubpd", "fma_128_256", modifiers=[0x5D]) |
+add_insn("vfmaddsubps", "fma_128_256", modifiers=[0x5C]) |
+add_insn("vfmsubaddpd", "fma_128_256", modifiers=[0x5F]) |
+add_insn("vfmsubaddps", "fma_128_256", modifiers=[0x5E]) |
+add_insn("vfmsubpd", "fma_128_256", modifiers=[0x6D]) |
+add_insn("vfmsubps", "fma_128_256", modifiers=[0x6C]) |
+add_insn("vfnmaddpd", "fma_128_256", modifiers=[0x79]) |
+add_insn("vfnmaddps", "fma_128_256", modifiers=[0x78]) |
+add_insn("vfnmsubpd", "fma_128_256", modifiers=[0x7D]) |
+add_insn("vfnmsubps", "fma_128_256", modifiers=[0x7C]) |
-add_insn("pshab", "sse5psh", modifiers=[0x04]) |
-add_insn("pshaw", "sse5psh", modifiers=[0x05]) |
-add_insn("pshad", "sse5psh", modifiers=[0x06]) |
-add_insn("pshaq", "sse5psh", modifiers=[0x07]) |
+for sz in [32, 64]: |
+ add_group("fma_128_m%d" % sz, |
+ cpu=["FMA4"], |
+ modifiers=["Op2Add"], |
+ vex=128, |
+ vexw=0, |
+ prefix=0x66, |
+ opcode=[0x0F, 0x3A, 0x00], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
+ Operand(type="SIMDReg", size=128, dest="EA"), |
+ Operand(type="SIMDReg", size=128, dest="VEXImmSrc")]) |
+ add_group("fma_128_m%d" % sz, |
+ cpu=["FMA4"], |
+ modifiers=["Op2Add"], |
+ vex=128, |
+ vexw=0, |
+ prefix=0x66, |
+ opcode=[0x0F, 0x3A, 0x00], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
+ Operand(type="Mem", size=sz, relaxed=True, dest="EA"), |
+ Operand(type="SIMDReg", size=128, dest="VEXImmSrc")]) |
+ add_group("fma_128_m%d" % sz, |
+ cpu=["FMA4"], |
+ modifiers=["Op2Add"], |
+ vex=128, |
+ vexw=1, |
+ prefix=0x66, |
+ opcode=[0x0F, 0x3A, 0x00], |
+ operands=[Operand(type="SIMDReg", size=128, dest="Spare"), |
+ Operand(type="SIMDReg", size=128, dest="VEX"), |
+ Operand(type="SIMDReg", size=128, dest="VEXImmSrc"), |
+ Operand(type="Mem", size=sz, relaxed=True, dest="EA")]) |
-# roundps, roundpd, roundss, roundsd, ptest are in SSE4.1 |
+add_insn("vfmaddsd", "fma_128_m64", modifiers=[0x6B]) |
+add_insn("vfmaddss", "fma_128_m32", modifiers=[0x6A]) |
+add_insn("vfmsubsd", "fma_128_m64", modifiers=[0x6F]) |
+add_insn("vfmsubss", "fma_128_m32", modifiers=[0x6E]) |
+add_insn("vfnmaddsd", "fma_128_m64", modifiers=[0x7B]) |
+add_insn("vfnmaddss", "fma_128_m32", modifiers=[0x7A]) |
+add_insn("vfnmsubsd", "fma_128_m64", modifiers=[0x7F]) |
+add_insn("vfnmsubss", "fma_128_m32", modifiers=[0x7E]) |
##################################################################### |
-# Intel XSAVE instructions |
+# Intel XSAVE and XSAVEOPT instructions |
##################################################################### |
add_insn("xgetbv", "threebyte", modifiers=[0x0F, 0x01, 0xD0], |
cpu=["XSAVE", "386"]) |
@@ -6990,6 +7283,18 @@ |
add_insn("xrstor", "twobytemem", modifiers=[5, 0x0F, 0xAE], |
cpu=["XSAVE", "386"]) |
+add_insn("xsaveopt", "twobytemem", modifiers=[6, 0x0F, 0xAE], |
+ cpu=["XSAVEOPT"]) |
+ |
+add_group("xsaveopt64", |
+ modifiers=["SpAdd", "Op0Add", "Op1Add"], |
+ opcode=[0x00, 0x00], |
+ spare=0, |
+ opersize=64, |
+ operands=[Operand(type="Mem", relaxed=True, dest="EA")]) |
+add_insn("xsaveopt64", "xsaveopt64", modifiers=[6, 0x0F, 0xAE], |
+ cpu=["XSAVEOPT"], only64=True) |
+ |
##################################################################### |
# Intel MOVBE instruction |
##################################################################### |