diff options
author | iximeow <me@iximeow.net> | 2022-07-22 02:15:40 -0700 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2023-01-02 08:50:22 -0800 |
commit | e6e7fabfc907eaf016520d9c2a2e128b0d28f019 (patch) | |
tree | c08280a4dc9cbd3d02926fd8e6476d514c10393d /data | |
parent | 78b40bb12a265d866b01547924defb10aec283a8 (diff) |
yax builds again with opcodes generated by type
Diffstat (limited to 'data')
-rw-r--r-- | data/generate_opcode.py | 318 | ||||
-rw-r--r-- | data/x86_64.json | 3426 |
2 files changed, 3744 insertions, 0 deletions
diff --git a/data/generate_opcode.py b/data/generate_opcode.py new file mode 100644 index 0000000..e02785d --- /dev/null +++ b/data/generate_opcode.py @@ -0,0 +1,318 @@ +import json + +isa_data = json.loads(open("./x86_64.json").read()) + +class IsaData: + def __init__(self, data): + isa_extensions = isa_data['sets'] + microarchitectures = isa_data['uarch'] + + loaded_exts = {} + for ext in isa_extensions: + loaded_exts[ext['name']] = ext + + loaded_uarches = {} + for arch in microarchitectures: + loaded_uarches[arch['name']] = arch + + self.exts = loaded_exts + self.uarches = loaded_uarches + self.referenced_sets = set([]) + + def compile_uarch(self, arch): + uarch = self.uarches[arch] + sets = self.uarch_sets(arch) + + out = { + "name": uarch['name'], + "vendor": uarch['vendor'], + "extensions": list(sets), + "instructions": list(self.sets2instructions(sets)) + } + + return out + + def uarch_sets(self, arch): + sets = set([]) + uarch = self.uarches[arch] + + for item in uarch['sets']: + if item[0] == '/': + continue + elif item[0] == '+': + sets |= self.uarch_sets(item[1:]) + else: + sets.add(item) + + sets = self.resolve_sets(sets) + + self.referenced_sets |= sets + return sets + + def unused_extensions(self): + all_sets = set(self.exts.keys()) + return all_sets - self.referenced_sets + + def used_extensions(self): + return self.referenced_sets + + def sets2instructions(self, sets): + instructions = set([]) + for ext in sets: + ext = self.exts[ext] + for item in ext['new']: + if item[0] != '+': + instructions.add(item) + return instructions + + def resolve_sets(self, sets): + resolved_sets = set(list(sets)) + self.referenced_sets |= resolved_sets + + for ext in sets: + ext = self.exts[ext] + for item in ext['new']: + if item[0] == '/': + continue + elif item[0] == '+': + new_sets = self.resolve_sets(set([item[1:]])) + self.referenced_sets |= new_sets + resolved_sets |= new_sets + + return resolved_sets + +isa_data = IsaData(isa_data) + +for (arch, data) in isa_data.uarches.items(): + arch = isa_data.compile_uarch(arch) +# print("x: {}".format(json.dumps(arch))) + +print("unused sets: {}".format(json.dumps(list(isa_data.unused_extensions())))) +print("used sets: {}".format(json.dumps(list(isa_data.used_extensions())))) + +ROOTS = ["real_mode", "protected_mode", "long_mode", "x86_generic"] + +ALL_INSTRUCTIONS = set([]) +INSTRUCTION_NUMS = {} + +for root in ROOTS: + arch = isa_data.compile_uarch(root) + print("name: {}, {} instructions".format(arch['name'], len(arch['instructions']))) + ALL_INSTRUCTIONS |= set(arch['instructions']) + +print("opcode enum to follow...") + +class Output: + def __init__(self, f): + self.indentation = 0 + self.out = f + self.should_indent = False + + def begin_block(self, content): + self.write(content) + self.write(" {") + self.newline() + self.indent() + + def end_block(self): + self.outdent() + self.write("}") + self.newline() + + def indent(self): + self.indentation += 1 + + def outdent(self): + self.indentation -= 1 + + def write(self, content): + if self.should_indent: + self.out.write(" " * self.indentation) + self.should_indent = False + self.out.write(content) + + def newline(self): + self.out.write("\n") + self.should_indent = True + + def comment(self, content): + if not self.should_indent: + # we've written something on this line. add a space to be reader-friendly. + self.out.write(" ") + self.write("// ") + self.writeline(content) + + def writeline(self, content): + self.write(content) + self.newline() + + def close(self): + self.out.close() + +OPCODE_REPR = "u16" +OPCODE_ANNOTATIONS = [ + "#[allow(non_camel_case_types)]", + "#[derive(Copy, Clone, Debug, Eq, PartialEq)]", + "#[non_exhaustive]", + "#[repr({})]".format(OPCODE_REPR) +] + +f = open("../src/generated/mod.rs", "w") +f = Output(f) +f.writeline("pub(crate) mod opcode;") +f.writeline("pub(crate) mod imp;") +f.newline() + +for root in ROOTS: + if root == "x86_generic": + continue + f.begin_block("pub(crate) mod {}".format(root)) + f.writeline("pub(crate) use super::opcode::{}::Opcode as Opcode;".format(root)) + f.writeline("pub(crate) use super::imp::{}::revise_instruction as revise_instruction;".format(root)) + f.end_block() + +f = open("../src/generated/opcode.rs", "w") +f = Output(f) +for annotation in OPCODE_ANNOTATIONS: + f.writeline(annotation) +f.begin_block("pub enum Opcode") + +insts = list(ALL_INSTRUCTIONS) +insts.sort() +for (i, inst) in enumerate(insts): + INSTRUCTION_NUMS[inst] = i + if inst == "invalid": + f.writeline("Invalid,") + else: + f.writeline("{},".format(str(inst).upper())) +f.end_block() + +f.newline() + +f.writeline("pub(crate) const MNEMONICS: &'static [&'static str] = &[") +f.indent() +for (_i, inst) in enumerate(insts): + f.writeline('"{}",'.format(inst.lower())) +f.outdent() +f.writeline("];") +f.newline() + +for root in ROOTS: + if root == "x86_generic": + continue + f.begin_block("pub(crate) mod {}".format(root)) + + for annotation in OPCODE_ANNOTATIONS: + f.writeline(annotation) + f.begin_block("pub enum Opcode") + arch = isa_data.compile_uarch(root) + insts = arch['instructions'] + insts.sort() + for inst in insts: + if inst == "invalid": + f.writeline("Invalid = super::Opcode::Invalid as {},".format(OPCODE_REPR)) + else: + f.writeline("{} = super::Opcode::{} as {},".format(str(inst).upper(), str(inst).upper(), OPCODE_REPR)) + f.end_block() + f.end_block() + + f.newline() + +f = open("../src/generated/imp.rs", "w") +f = Output(f) + +# f.writeline("fn main() {}\n") + +# f.comment("should be `{}::DecodeError` but i want to compile this on its own while bootstrapping") + +# f.writeline('#[path="/toy/yaxpeax/arch/x86/src/{}/mod.rs"]'.format(root)) +# f.writeline("mod structs;") +# f.writeline("use structs::{InstDecoder, Instruction};") + +# f.begin_block("enum DecodeError") +# f.writeline("InvalidOpcode,") +# f.end_block() + +# f.newline() + + +for root in ROOTS: + if root == "x86_generic": + continue + arch = isa_data.compile_uarch(root) + + f.begin_block("pub(crate) mod {}".format(root)) + f.writeline("use crate::generated::{}::Opcode;".format(root)) + f.writeline("use crate::{}::{{InstDecoder, Instruction, DecodeError}};".format(root)) + + f.begin_block("impl InstDecoder") + for ext in arch['extensions']: + f.begin_block("fn feature_{}(&self) -> bool".format(ext)) + f.writeline("true") + f.end_block() + f.end_block() + + f.begin_block("pub(crate) fn revise_instruction(decoder: &InstDecoder, inst: &mut Instruction) -> Result<(), DecodeError>") + + f.begin_block("if inst.prefixes.evex().is_some()") + f.begin_block("if !decoder.avx512()") + f.writeline("return Err(DecodeError::InvalidOpcode);") + f.outdent() + f.writeline("} else {") + f.indent() + f.writeline("return Ok(());") + f.end_block() + f.end_block() + + f.newline() + + f.comment("for some instructions (tzcnt), not having an extension means the instruction is") + f.comment("interpreted as another, rather than being simply rejected.") + f.comment("we might still reject the alternate instruction later, if the extension adding *it*") + f.comment("is also not supported.") + f.begin_block("if inst.opcode == Opcode::TZCNT") + f.begin_block("if !decoder.bmi1()") + f.comment("tzcnt is only supported if bmi1 is enabled. without bmi1, this decodes as bsf.") + f.writeline("inst.opcode = Opcode::BSF;") + f.end_block() + f.end_block() + + f.newline() + + f.begin_block("match inst.opcode") + f.comment("we'll never be rejecting the instruction `Invalid`") + f.writeline("Opcode::Invalid => {}") + for ext in arch['extensions']: + ext_data = isa_data.exts[ext]['new'] + suffix_needed = False + any_entries = False + for (i, inst) in enumerate(ext_data): + if inst[0] == '+': + continue + + # special-cased `invalid` above; it's always present. + if inst == "invalid": + continue + + if suffix_needed: + f.writeline("|") + + f.write("Opcode::{} ".format(inst.upper())) + suffix_needed = True + any_entries = True + if not any_entries: + print("no entries for ext {}".format(ext)) + continue + f.begin_block("=>") + f.begin_block("if !decoder.feature_{}()".format(ext)) + f.writeline("return Err(DecodeError::InvalidOpcode);\n") + f.end_block() + f.end_block() + f.end_block() + f.writeline("Ok(())") + f.end_block() + f.end_block() + f.newline() + +f.close() + diff --git a/data/x86_64.json b/data/x86_64.json new file mode 100644 index 0000000..f11a297 --- /dev/null +++ b/data/x86_64.json @@ -0,0 +1,3426 @@ +{ + "sets": [ + { + "name": "8086_bcd", + "new": [ + "aaa", + "aad", + "aam", + "aas", + "daa", + "das" + ], + "extended": [ + ] + }, + { + "name": "8086", + "new": [ + "invalid", + "cmc", + "clc", + "stc", + "cli", + "sti", + "cld", + "std", + "add", + "or", + "adc", + "sbb", + "and", + "xor", + "sub", + "cmp", + "sar", + "sal", + "shr", + "shl", + "rcr", + "rcl", + "ror", + "rol", + "inc", + "dec", + "hlt", + "call", + "callf", + "jmp", + "jmpf", + "push", + "pop", + "lea", + "nop", + "xchg", + "popf", + "int", + "into", + "iret", + "iretd", + "iretq", + "retf", + "enter", + "leave", + "mov", + "return", + "pushf", + "wait", + "cbw", + "cwd", + "cqo", + "lods", + "stos", + "cmps", + "scas", + "movs", + "test", + "in", + "out", + "imul", + "jo", + "jno", + "jb", + "jnb", + "jz", + "jnz", + "ja", + "jna", + "js", + "jns", + "jp", + "jnp", + "jl", + "jge", + "jle", + "jg", + "ud0", + "ud1", + "ud2", + "div", + "idiv", + "mul", + "neg", + "not", + "xlat", + + "loopnz", + "loopz", + "loop", + + "salc" + ], + "extended": [ + ] + }, + { + "name": "80186_pusha", + "new": [ + "pusha", + "popa" + ], + "extended": [ + ] + }, + { + "name": "80186_bound", + "remark": "not included in the base 80186 because that set is reused to extend into 64bit, where bound is not", + "new": [ + "bound" + ], + "extended": [ + ] + }, + { + "name": "80286_arpl", + "remark": "not included in the base 80286 because that set is reused to extend into 64bit, where arpl is not", + "new": [ + "arpl" + ], + "extended": [ + ] + }, + { + "name": "80186", + "new": [ + "enter", + "leave", + "ins", + "outs" + ], + "extended": [ + "push", + "imul", + "shl", + "shr", + "sal", + "sar", + "rol", + "ror", + "rcl", + "rcr" + ] + }, + { + "name": "80286", + "new": [ + "clts", + "lar", + "lgdt", + "lidt", + "lldt", + "lmsw", + "lsl", + "sgdt", + "sidt", + "sldt", + "smsw", + "str", + "ltr", + "verr", + "verw" + ], + "extended": [ + ] + }, + { + "name": "80386", + "new": [ + "bsf", + "bsr", + "bt", + "bts", + "btc", + "btr", + "cdq", + "cwde", + "lds", + "les", + "lfs", + "lgs", + "lss", + "movzx", + "movsx", + "seto", + "setno", + "setb", + "setae", + "setz", + "setnz", + "setbe", + "seta", + "sets", + "setns", + "setp", + "setnp", + "setl", + "setge", + "setle", + "setg", + "shld", + "shrd" + ] + }, + { + "name": "jcxz", + "remark": "for 16-bit modes, jcxz is treated as jcxz (e.g. 16-bit ecx test)", + "new": [ + "jcxz" + ] + }, + { + "name": "jecxz", + "remark": "for 32-bit modes, jcxz is treated as jecxz (e.g. 32-bit ecx test)", + "new": [ + "jecxz" + ] + }, + { + "name": "80486", + "new": [ + "bswap", + "cmpxchg", + "invd", + "wbinvd", + "invlpg", + "xadd" + ] + }, + { + "name": "pentium", + "new": [ + "cpuid", + "wrmsr", + "rdtsc", + "rdmsr", + "rsm", + "cmpxchg8b" + ] + }, + { + "name": "pentium_pro", + "new": [ + "+pentium", + "+cmov", + "ud2" + ] + }, + { + "name": "64bit", + "new": [ + "+8086", + "+80186", + "+80286", + "+80386", + "+80486", + "+3dnow", + "+3dnowprefetch", + "+x87", + "+mmx", + "+sse", + "+sse2", + "+pentium_pro", + "+cmpxchg16b", + + "jrcxz", + "cdqe", + "movzx", + "swapgs", + "movsxd", + "+syscall", + "+fsgsbase" + ], + "extended": [ + ] + }, + { + "name": "extra_instructions", + "remark": "real_mode and long_mode had these instructions in their Opcode enums, but these variants could never be constructed. they were included by accident, and so are ''redundant'' with the extension that added them, but are explicitly noted as an error here.", + "new": [ + "swapgs", + "slhd", + "cdqe", + "movsxd", + "cmpxchg16b" + ] + }, + { + "name": "typo_instructions", + "remark": "these instructions never existed, are just transcription errors.", + "new": [ + "+avx512_f_typo", + "slhd" + ] + }, + { + "name": "x86_64_baseline", + "new": [ + "+80386", + "+cmov", + "+x87", + "+mmx", + "+sse", + "+sse2", + "+sse3", + "+fxsr", + "+64bit", + "+typo_instructions" + ], + "extended": [ + ] + }, + { + "name": "mmx", + "new": [ + "rdpmc", + "punpcklbw", + "punpcklwd", + "punpckldq", + "packsswb", + "pcmpgtb", + "pcmpgtd", + "pcmpgtw", + "packuswb", + "punpckhbw", + "punpckhwd", + "punpckhdq", + "packssdw", + "movd", + "movq", + "pcmpeqb", + "pcmpeqd", + "pcmpeqw", + "psrlw", + "psrld", + "psrlq", + "pmullw", + "psubusb", + "psubusw", + "pand", + "paddusb", + "paddusw", + "pandn", + "psraw", + "psrad", + "pmulhw", + "psubsb", + "psubsw", + "por", + "paddsb", + "paddsw", + "pxor", + "psllw", + "pslld", + "psllq", + "pmaddwd", + "psubb", + "psubw", + "psubd", + "paddb", + "paddw", + "paddd", + "emms" + ], + "extended": [ + ] + }, + { + "name": "sse", + "new": [ + "movss", + "addss", + "subss", + "mulss", + "divss", + "minss", + "maxss", + "sqrtss", + "movups", + "movhlps", + "movlps", + "movhps", + "movlhps", + "unpcklps", + "unpckhps", + "prefetchnta", + "prefetch0", + "prefetch1", + "prefetch2", + "movaps", + "cvtpi2ps", + "cvtsi2ss", + "movntps", + "cvttss2si", + "cvttps2pi", + "cvtss2si", + "cvtps2pi", + "ucomiss", + "comiss", + "sqrtps", + "movmskps", + "rsqrtss", + "rsqrtps", + "rcpps", + "rcpss", + "andps", + "andnps", + "xorps", + "orps", + "addps", + "mulps", + "subps", + "minps", + "divps", + "maxps", + "pshufw", + "ldmxcsr", + "stmxcsr", + "sfence", + "cmpps", + "cmpss", + "pinsrw", + "pextrw", + "shufps", + "pmovmskb", + "pminub", + "pmaxub", + "pavgb", + "pavgw", + "pmulhuw", + "movntq", + "pminsw", + "pmaxsw", + "psadbw", + "maskmovq", + "ldmxcsr", + "stmxcsr" + ], + "extended": [ + ] + }, + { + "name": "sse2", + "new": [ + "movupd", + "psrldq", + "pslldq", + "movsd", + "movlpd", + "unpcklpd", + "unpckhpd", + "movhpd", + "movapd", + "movmskpd", + "cvtpi2pd", + "cvtsi2sd", + "movntpd", + "movnti", + "movntdq", + "cvttpd2pi", + "cvttsd2si", + "cvtpd2pi", + "cvtsd2si", + "ucomisd", + "comisd", + "sqrtpd", + "sqrtsd", + "andpd", + "andnpd", + "orpd", + "xorpd", + "addpd", + "addsd", + "mulsd", + "mulpd", + "cvtps2pd", + "cvtpd2ps", + "cvtss2sd", + "cvtsd2ss", + "cvtps2dq", + "cvtdq2ps", + "cvttps2dq", + "subsd", + "subpd", + "minpd", + "minsd", + "divpd", + "divsd", + "maxpd", + "maxsd", + "punpcklqdq", + "punpckhqdq", + "movdqa", + "movdqu", + "pshufhw", + "pshuflw", + "pshufd", + "lfence", + "mfence", + "clflush", + "cmppd", + "cmpps", + "cmpsd", + "shufpd", + "paddq", + "movq2dq", + "movdq2q", + "cvtpd2dq", + "cvttpd2dq", + "cvtdq2pd", + "pmuludq", + "maskmovdqu", + "psubq" + ], + "extended": [ + "punpcklbw", + "punpcklwd", + "punpckldq", + "packsswb", + "pcmpgtb", + "pcmpgtd", + "pcmpgtw", + "packuswb", + "punpckhbw", + "punpckhwd", + "punpckhdq", + "packssdw", + "movd", + "movq", + "pcmpeqb", + "pcmpeqd", + "pcmpeqw", + "psrlw", + "psrld", + "psrlq", + "pmullw", + "psubusb", + "psubusw", + "pand", + "paddusb", + "paddusw", + "pandn", + "psraw", + "psrad", + "pmulhw", + "psubsb", + "psubsw", + "por", + "paddsb", + "paddsw", + "pxor", + "psllw", + "pslld", + "psllq", + "pmaddwd", + "psubb", + "psubw", + "psubd", + "paddb", + "paddw", + "paddd" + ] + }, + { + "name": "sse3", + "new": [ + "addsubpd", + "addsubps", + "hsubpd", + "haddpd", + "movsldup", + "movshdup", + "movddup", + "haddps", + "hsubps", + "lddqu", + "+monitor" + ], + "extended": [ + ] + }, + { + "name": "ssse3", + "new": [ + "palignr", + "psignw", + "psignd", + "psignb", + "pshufb", + "pmulhrsw", + "pmaddubsw", + "pabsd", + "pabsw", + "pabsb", + "phsubsw", + "phsubw", + "phsubd", + "phaddd", + "phaddsw", + "phaddw" + ], + "extended": [ + ] + }, + { + "name": "monitor", + "new": [ + "monitor", + "mwait" + ], + "extended": [ + ] + }, + { + "name": "vmx", + "new": [ + "vmptrld", + "vmptrst", + "vmclear", + "vmread", + "vmwrite", + "vmcall", + "vmlaunch", + "vmresume", + "vmxoff", + "vmxon", + "invept", + "invvpid", + "vmfunc" + ], + "extended": [ + ] + }, + { + "name": "fma3", + "new": [ + "vfmadd132pd", + "vfmadd132ps", + "vfmadd132sd", + "vfmadd132ss", + "vfmadd213pd", + "vfmadd213ps", + "vfmadd213sd", + "vfmadd213ss", + "vfmadd231pd", + "vfmadd231ps", + "vfmadd231sd", + "vfmadd231ss", + "vfmaddsub132pd", + "vfmaddsub132ps", + "vfmaddsub213pd", + "vfmaddsub213ps", + "vfmaddsub231pd", + "vfmaddsub231ps", + "vfmsub132pd", + "vfmsub132ps", + "vfmsub132sd", + "vfmsub132ss", + "vfmsub213pd", + "vfmsub213ps", + "vfmsub213sd", + "vfmsub213ss", + "vfmsub231pd", + "vfmsub231ps", + "vfmsub231sd", + "vfmsub231ss", + "vfmsubadd132pd", + "vfmsubadd132ps", + "vfmsubadd213pd", + "vfmsubadd213ps", + "vfmsubadd231pd", + "vfmsubadd231ps", + "vfnmadd132pd", + "vfnmadd132ps", + "vfnmadd132sd", + "vfnmadd132ss", + "vfnmadd213pd", + "vfnmadd213ps", + "vfnmadd213sd", + "vfnmadd213ss", + "vfnmadd231pd", + "vfnmadd231ps", + "vfnmadd231sd", + "vfnmadd231ss", + "vfnmsub132pd", + "vfnmsub132ps", + "vfnmsub132sd", + "vfnmsub132ss", + "vfnmsub213pd", + "vfnmsub213ps", + "vfnmsub213sd", + "vfnmsub213ss", + "vfnmsub231pd", + "vfnmsub231ps", + "vfnmsub231sd", + "vfnmsub231ss" + ], + "extended": [ + ] + }, + { + "name": "cmpxchg16b", + "remark": "appears to be present in all x86-64 machines, though it's hard to find data to confirm", + "new": [ + "cmpxchg16b" + ], + "extended": [ + ] + }, + { + "name": "sse4_1", + "new": [ + "phminposuw", + "pmuldq", + "pmulld", + "dpps", + "dppd", + "packusdw", + "pcmpeqq", + "ptest", + "movntdqa", + "roundss", + "roundsd", + "roundps", + "roundpd", + "pmaxsb", + "pmaxsd", + "pmaxuw", + "pmaxud", + "pminsd", + "pminsb", + "pminud", + "pminuw", + "blendw", + "pblendw", + "blendvps", + "blendvpd", + "pblendvb", + "blendps", + "blendpd", + "mpsadbw", + "pmovzxdq", + "pmovsxdq", + "pmovzxbd", + "pmovsxbd", + "pmovzxwq", + "pmovsxwq", + "pmovzxbq", + "pmovsxbq", + "pmovsxwd", + "pmovzxwd", + "pextrq", + "pextrd", + "pextrb", + "pmovsxbw", + "pmovzxbw", + "pinsrq", + "pinsrd", + "pinsrb", + "extractps", + "insertps" + ], + "extended": [ + ] + }, + { + "name": "sse4_2", + "new": [ + "crc32", + "pcmpestri", + "pcmpestrm", + "pcmpistri", + "pcmpistrm", + "pcmpgtq" + ], + "extended": [ + ] + }, + { + "name": "movbe", + "new": [ + "movbe" + ], + "extended": [ + ] + }, + { + "name": "popcnt", + "new": [ + "popcnt" + ], + "extended": [ + ] + }, + { + "name": "aesni", + "new": [ + "aeskeygenassist", + "aesimc", + "aesenc", + "aesenclast", + "aesdec", + "aesdeclast" + ], + "extended": [ + ] + }, + { + "name": "sgx", + "new": [ + "encls", + "enclu", + "enclv" + ], + "extended": [ + ] + }, + { + "name": "bmi1", + "new": [ + "andn", + "bextr", + "blsi", + "blsmsk", + "blsr", + "tzcnt" + ], + "extended": [ + ] + }, + { + "name": "bmi2", + "new": [ + "bzhi", + "mulx", + "pdep", + "pext", + "rorx", + "sarx", + "shrx", + "shlx" + ], + "extended": [ + ] + }, + { + "name": "avx", + "new": [ + "vlddqu", + "vpaddb", + "vpaddd", + "vpaddq", + "vpaddw", + "vpabsb", + "vpabsw", + "vpabsd", + "vmaxsd", + "vmaxss", + "vminsd", + "vminss", + "vmulsd", + "vmulss", + "vrcpss", + "vpsubusb", + "vpsubusw", + "vxorpd", + "vxorps", + "vpavgb", + "vpavgw", + "vandnpd", + "vandnps", + "vphaddd", + "vphaddsw", + "vphaddw", + "vandpd", + "vandps", + "vpaddsb", + "vpaddsw", + "vpaddusb", + "vpaddusw", + "vphsubd", + "vphsubsw", + "vphsubw", + "vhaddpd", + "vhaddps", + "vhsubpd", + "vhsubps", + "vorpd", + "vorps", + "vpblendvb", + "vpblendw", + "vaddsubpd", + "vaddsubps", + "vrsqrtps", + "vrsqrtss", + "vpalignr", + "vpsubsb", + "vpsubsw", + "vpmulhuw", + "vpmulhw", + "vpmullw", + "vpshufb", + "vpshufhw", + "vpshuflw", + "vphminposuw", + "vrcpps", + "vmpsadbw", + "vpmaddubsw", + "vpmaddwd", + "vmaskmovdqu", + "vpmovmskb", + "vpsadbw", + + "vpslldq", + "vpsrldq", + + "vdppd", + "vdpps", + + "vldmxcsr", + "vstmxcsr", + + "vmovmskpd", + "vmovmskps", + + "vptest", + "vtestpd", + "vtestps", + "vpextrb", + "vpextrw", + "vpextrd", + "vpextrq", + "vpackssdw", + "vpackusdw", + "vpacksswb", + "vpackuswb", + "vblendpd", + "vblendps", + "vblendvpd", + "vblendvps", + "vpmulhrsw", + + "vpand", + "vpandn", + "vpor", + + "vpcmpeqb", + "vpcmpeqd", + "vpcmpeqq", + "vpcmpeqw", + "vpcmpgtb", + "vpcmpgtd", + "vpcmpgtq", + "vpcmpgtw", + + "vpmaxsb", + "vpmaxsd", + "vpmaxsw", + "vpmaxub", + "vpmaxuw", + "vpminsb", + "vpminsw", + "vpminub", + "vpminuw", + "vpmaxud", + "vpminsd", + "vpsignb", + "vpsignw", + "vpsignd", + "vpinsrb", + "vpinsrw", + "vpinsrd", + "vpinsrq", + + "vpmovsxbd", + "vpmovsxbq", + "vpmovsxbw", + "vpmovsxdq", + "vpmovsxwd", + "vpmovsxwq", + "vpmovzxbd", + "vpmovzxbq", + "vpmovzxbw", + "vpmovzxdq", + "vpmovzxwd", + "vpmovzxwq", + + "vpmuldq", + "vpmullq", + "vpmulld", + "vpmuludq", + "vpshufd", + "vshufpd", + "vshufps", + "vsqrtpd", + "vsqrtps", + "vsqrtss", + "vsqrtsd", + "vsubpd", + "vsubps", + "vsubsd", + "vsubss", + "vucomisd", + "vucomiss", + "vroundpd", + "vroundps", + "vroundsd", + "vroundss", + + "vpslld", + "vpsllq", + "vpsllw", + "vpsrad", + "vpsraw", + "vpsrld", + "vpsrlq", + "vpsrlw", + "vpsubb", + "vpsubw", + "vpsubd", + "vpsubq", + "vpxor", + + "vpunpckhbw", + "vpunpckhwd", + "vpunpckhdq", + "vpunpckhqdq", + "vpunpcklbw", + "vpunpcklwd", + "vpunpckldq", + "vpunpcklqdq", + "vunpckhpd", + "vunpckhps", + "vunpcklpd", + "vunpcklps", + "vpcmpestri", + "vpcmpestrm", + "vpcmpistri", + "vpcmpistrm", + + "vbroadcastss", + "vbroadcastsd", + "vbroadcastf128", + "vbroadcastsd", + "vbroadcastss", + "vinsertf128", + "vextractf128", + "vmaskmovpd", + "vmaskmovps", + "vpermilpd", + "vpermilps", + "vperm2f128", + "vzeroupper", + "vzeroall" + ], + "extended": [ + ] + }, + { + "name": "avx2", + "new": [ + "vbroadcasti128", + "vpbroadcastb", + "vpbroadcastw", + "vpbroadcastd", + "vpbroadcastq", + "vinserti128", + "vextracti128", + "vpmaskmovd", + "vpmaskmovq", + "vpermps", + "vpermd", + "vpermpd", + "vpermq", + "vperm2i128", + "vpblendd", + "vpsllvd", + "vpsllvq", + "vpsrlvd", + "vpsrlvq", + "vpsravd" + ], + "extended": [ + "vpaddb", + "vpaddd", + "vpaddq", + "vpaddw", + "vpabsb", + "vpabsw", + "vpabsd", + "vpand", + "vpandn", + "vpor", + "vpavgb", + "vpavgw", + "vphaddd", + "vphaddsw", + "vphaddw", + "vpmulhrsw", + "vpaddsb", + "vpaddsw", + "vpaddusb", + "vpaddusw", + "vphsubd", + "vphsubsw", + "vphsubw", + "vpblendvb", + "vpblendw", + "vpalignr", + "vpsubsb", + "vpsubsw", + "vpmulhuw", + "vpmulhw", + "vpmullw", + "vpshufb", + "vpshufhw", + "vpshuflw", + "vmpsadbw", + "vpmaddubsw", + "vpmaddwd", + "vpmovmskb", + "vpsadbw", + + "vpslldq", + "vpsrldq", + + "vpcmpeqb", + "vpcmpeqd", + "vpcmpeqq", + "vpcmpeqw", + "vpcmpgtb", + "vpcmpgtd", + "vpcmpgtq", + "vpcmpgtw", + "vpmaxsb", + "vpmaxsd", + "vpmaxsw", + "vpmaxud", + "vpminsd", + "vpminud", + + "vpmovsxbd", + "vpmovsxbq", + "vpmovsxbw", + "vpmovsxdq", + "vpmovsxwd", + "vpmovsxwq", + "vpmovzxbd", + "vpmovzxbq", + "vpmovzxbw", + "vpmovzxdq", + "vpmovzxwd", + "vpmovzxwq", + "vpackssdw", + "vpackusdw", + "vpacksswb", + "vpackuswb", + + "vpmuldq", + "vpmullq", + "vpmulld", + "vpmuludq", + "vpshufd", + "vshufpd", + "vshufps", + "vsqrtpd", + "vsqrtps", + "vsubps", + "vsubpd", + + "vpslld", + "vpsllq", + "vpsllw", + "vpsrad", + "vpsraw", + "vpsrld", + "vpsrlq", + "vpsrlw", + "vpsubb", + "vpsubw", + "vpsubd", + "vpsubq", + "vpxor", + "vpsignb", + "vpsignd", + "vpsignw", + + "vpunpckhbw", + "vpunpckhwd", + "vpunpckhdq", + "vpunpckhqdq", + "vpunpcklbw", + "vpunpcklwd", + "vpunpckldq", + "vpunpcklqdq", + "vunpckhpd", + "vunpckhps", + "vunpcklpd", + "vunpcklps", + + "vbroadcastss", + "vbroadcastsd", + "vbroadcastsd", + "vbroadcastss" + ] + }, + { + "name": "invpcid", + "new": [ + ], + "extended": [ + ] + }, + { + "name": "invlpgb", + "new": [ + "invlpgb", + "tlbsync" + ], + "extended": [ + ] + }, + { + "name": "mpx", + "new": [ + "bndmk", + "bndcl", + "bndcu", + "bndcn", + "bndmov", + "bndldx", + "bndstx" + ], + "extended": [ + ] + }, + { + "name": "avx512_f_typo", + "remark": "these instructions never existed, are just transcription errors.", + "new": [ + "vprorrd", + "vprorrq" + ] + }, + { + "name": "vpclmulqdq", + "new": [ + "vpclmulqdq" + ] + }, + { + "name": "avx_unimplemented", + "remark": "these avx instructions were missed when implementing the various avx* extensions", + "new": [ + "vpmaxub", + "vpmaxub" + ] + }, + { + "name": "avx512_f__vl_unimplemented", + "remark": "these avx512f instructions were missed when implementing avx512", + "new": [ + "vscatterdps", + "vscatterdpd", + "vscatterqps", + "vscatterqpd" + ] + }, + { + "name": "avx512bw_unimplemented", + "remark": "these avx512bw instructions were missed when implementing avx512", + "new": [ + "vpmovq2m" + ] + }, + { + "name": "invpcid_unimplemented", + "new": [ + "invvpid" + ] + }, + + { + "name": "avx512_f_typo", + "new": [ + "vprorrd", + "vprorrq" + ] + }, + + { + "name": "avx512_f", + "new": [ + "+avx512_f__vl_unimplemented", + "vcvtqq2pd", + "vcvtqq2ps", + "vcvtusi2usd", + "vcvtusi2uss", + "vextractf32x4", + "vextractf64x4", + "vextracti32x4", + "vextracti64x4", + "vfixupimmsd", + "vfixupimmss", + "vinserti64x4", + "vmovdqa32", + "vmovdqa64", + "vmovdqu32", + "vmovdqu64", + "vpcompressq", + "vpcompressd", + "vscaledpd", + "vscaledps", + "vscaledsd", + "vscaledss", + "vscatterdd", + "vscatterdq", + "vscatterqd", + "vscatterqq", + + "vaddpd", + "vaddps", + "vcmppd", + "vcmpps", + "vcvtdq2pd", + "vcvtdq2ps", + "vcvtpd2dq", + "vcvtpd2ps", + "vcvtps2dq", + "vcvtps2pd", + "vcvttpd2dq", + "vcvttps2dq", + "vdivpd", + "vdivps", + "vmaxpd", + "vmaxps", + "vminpd", + "vminps", + "vmovapd", + "vmovaps", + "vmovddup", + "vmovdqa", + "vmovdqu", + "vmovntdqa", + "vmovntdq", + "vmovntpd", + "vmovntps", + "vmovshdup", + "vmovsldup", + "vmovupd", + "vmovups", + "vmulpd", + "vmulps", + "vpandd", + "vpandq", + "vpandnd", + "vpandnq", + "vpcmpeqd", + "vpcmpeqq", + "vpcmpgtd", + "vpcmpgtq", + "vpmaxsd", + "vpmaxsq", + "vpmaxud", + "vpmaxuq", + "vpminsd", + "vpminsq", + "vpminud", + "vpminuq", + "vpcmpd", + "vpcmpq", + "vpcmpud", + "vpcmpuq", + + "vpord", + "vporq", + "vpxord", + "vpxorq", + + "vpslld", + "vpsllq", + "vpsllw", + "vpsrad", + "vpsraq", + "valignd", + "valignq", + "vblendmpd", + "vblendmps", + "vprold", + "vprolq", + "vprolvd", + "vprolvq", + "vprord", + "vprorq", + "vprorvd", + "vprorvq", + + "vpunpckhdq", + "vpunpckhqdq", + "vpunpckldq", + "vpunpcklqdq", + "vunpckhpd", + "vunpckhps", + "vunpcklpd", + "vunpcklps", + + "vbroadcastf32x4", + "vbroadcastf64x4", + "vbroadcasti64x4", + "vbroadcasti32x4", + "vinsertf32x4", + "vinserti32x4", + "vshuff32x4", + "vshuff64x2", + "vshufi32x4", + "vshufi64x2", + "vcompressd", + "vcompressq", + "vcompresspd", + "vcompressps", + "vexpandpd", + "vexpandps", + "vcvtpd2udq", + "vcvtps2udq", + "vcvtudq2pd", + "vcvtudq2ps", + "vcvttpd2udq", + "vcvttps2udq", + "vfixupimmpd", + "vfixupimmps", + "vcvtph2ps", + "vcvtps2ph", + + "vfmadd132pd", + "vfmadd132ps", + "vfmadd213pd", + "vfmadd213ps", + "vfmadd231pd", + "vfmadd231ps", + "vfmaddsub132pd", + "vfmaddsub132ps", + "vfmaddsub213pd", + "vfmaddsub213ps", + "vfmaddsub231pd", + "vfmaddsub231ps", + "vfmsub132pd", + "vfmsub132ps", + "vfmsub213pd", + "vfmsub213ps", + "vfmsub231pd", + "vfmsub231ps", + "vfmsubadd132pd", + "vfmsubadd132ps", + "vfmsubadd213pd", + "vfmsubadd213ps", + "vfmsubadd231pd", + "vfmsubadd231ps", + "vfnmadd132pd", + "vfnmadd132ps", + "vfnmadd213pd", + "vfnmadd213ps", + "vfnmadd231pd", + "vfnmadd231ps", + "vfnmsub132pd", + "vfnmsub132ps", + "vfnmsub213pd", + "vfnmsub213ps", + "vfnmsub231pd", + "vfnmsub231ps", + + "vscatterdps", + "vscatterdpd", + "vscatterqps", + "vscatterqpd", + "vgatherdpd", + "vgatherdps", + "vgatherqpd", + "vgatherqps", + "vgetexppd", + "vgetexpps", + "vgetmantpd", + "vgetmantps", + "vpblendmd", + "vpblendmq", + + "vpermd", + "vpermq", + "vpermi2d", + "vpermi2q", + "vpermi2pd", + "vpermi2ps", + "vpermt2d", + "vpermt2q", + "vpermt2pd", + "vpermt2ps", + "vpexpandd", + "vpexpandq", + "vpgatherdd", + "vpgatherdq", + "vpgatherqd", + "vpgatherqq", + "vpscatterdd", + "vpscatterdq", + "vpscatterqd", + "vpscatterqq", + "vpmovdb", + "vpmovsdb", + "vpmovusdb", + "vpmovdw", + "vpmovsdw", + "vpmovusdw", + "vpmovqb", + "vpmovsqb", + "vpmovusqb", + "vpmovqd", + "vpmovsqd", + "vpmovusqd", + "vpmovqw", + "vpmovsqw", + "vpmovusqw", + + "vpsravq", + "vpternlogd", + "vpternlogq", + "vptestmd", + "vptestmq", + "vptestnmd", + "vptestnmq", + "vrcp14pd", + "vrcp14ps", + "vrndscalepd", + "vrndscaleps", + "vrsqrt14pd", + "vrsqrt14ps", + "vscalefps", + "vscalefpd", + "vpabsq", + + "vaddsd", + "vaddss", + "vcmpsd", + "vcmpss", + "vcomisd", + "vcomiss", + "vcvtsd2si", + "vcvtsd2ss", + "vcvtsi2ss", + "vcvtsi2sd", + "vcvtss2sd", + "vcvtss2si", + "vcvttss2si", + "vcvttsd2si", + "vdivsd", + "vdivss", + "vextractps", + "vinsertps", + "vgetmantsd", + "vgetmantss", + + "vmovd", + "vmovq", + "vmovhlps", + "vmovhpd", + "vmovhps", + "vmovlhps", + "vmovlpd", + "vmovlps", + "vmovss", + "vmovsd", + "vsqrtss", + "vsqrtsd", + "vsubsd", + "vsubss", + "vucomisd", + "vucomiss", + "vrcp14sd", + "vrcp14ss", + "vrndscalesd", + "vrndscaless", + "vrsqrt14sd", + "vrsqrt14ss", + "vscalefss", + "vscalefsd", + + "vinsertf64x4", + + "vcvtusi2sd", + "vcvtusi2ss", + "vcvtsd2usi", + "vcvtss2usi", + "vcvttsd2usi", + "vcvttss2usi", + + "kandw", + "kandnw", + "kmovw", + "knotw", + "korw", + "kortestw", + "kshiftlw", + "kshiftrw", + "kunpckbw", + "kxnorw", + "kxorw" + ], + "extended": [ + "vpabsd", + "vpaddd", + "vmaxsd", + "vmaxss", + "vminsd", + "vminss", + "vmulsd", + "vmulss", + + "vfmadd213sd", + "vfmadd213ss", + "vfmadd132sd", + "vfmadd132ss", + "vfmadd231sd", + "vfmadd231ss", + "vfmsub132sd", + "vfmsub132ss", + "vfmsub213sd", + "vfmsub213ss", + "vfmsub231sd", + "vfmsub231ss", + "vfnmsub132sd", + "vfnmsub132ss", + "vfnmsub213sd", + "vfnmsub213ss", + "vfnmsub231sd", + "vfnmsub231ss", + "vfnmadd132sd", + "vfnmadd132ss", + "vfnmadd213sd", + "vfnmadd213ss", + "vfnmadd231sd", + "vfnmadd231ss", + + "vpmovsxbd", + "vpmovsxbq", + "vpmovsxdq", + "vpmovsxwd", + "vpmovsxwq", + "vpmovzxbd", + "vpmovzxbq", + "vpmovzxdq", + "vpmovzxwd", + "vpmovzxwq", + + "vpmuldq", + "vpmulld", + "vpmuludq", + "vpshufd", + "vshufpd", + "vshufps", + "vsqrtpd", + "vsqrtps", + + "vpslld", + "vpsllq", + "vpsrad", + "vpsrld", + "vpsrlq", + "vpsubd", + "vpsubq", + "vsubpd", + "vsubps", + + "vpbroadcastd", + "vpbroadcastq", + "vpermilpd", + "vpermilps", + "vpermpd", + "vpermps", + "vpsllvd", + "vpsllvq", + "vpsravd", + "vpsrlvd", + "vpsrlvq" + ] + }, + { + "name": "avx512_dq", + "new": [ + "kandb", + "kandnb", + "kaddb", + "ktestb", + "kaddw", + "ktestw", + "kmovb", + "knotb", + "korb", + "kortestb", + "kshiftlb", + "kshiftrb", + "kxnorb", + "kxorb", + "vbroadcastf32x2", + "vbroadcastf64x2", + "vbroadcastf32x8", + "vbroadcasti32x8", + "vbroadcasti64x2", + "vbroadcasti32x2", + "vextractf32x8", + "vextracti32x8", + "vgetexpsd", + "vgetexpss", + "vxorpd", + "vxorps", + "vpextrd", + "vpextrq", + "vpinsrd", + "vpinsrq", + "vandnpd", + "vandnps", + "vandpd", + "vandps", + "vorpd", + "vorps", + "vcvttpd2qq", + "vcvtpd2qq", + "vcvttpd2uqq", + "vcvtpd2uqq", + "vcvttps2qq", + "vcvtps2qq", + "vcvttps2uqq", + "vcvtps2uqq", + "vcvtuqq2pd", + "vcvtuqq2ps", + "vextractf64x2", + "vextracti64x2", + "vfpclasspd", + "vfpclassps", + "vfpclasssd", + "vfpclassss", + "vinsertf64x2", + "vinsertf32x8", + "vinserti32x8", + "vinserti64x2", + "vpmovm2d", + "vpmovm2q", + "vpmovb2d", + "vpmovq2m", + "vrangepd", + "vrangeps", + "vrangesd", + "vrangess", + "vreducepd", + "vreduceps", + "vreducesd", + "vreducess" + ], + "extended": [ + "vpaddq", + "vpmullq" + ] + }, + { + "name": "rdseed", + "new": [ + ], + "extended": [ + ] + }, + { + "name": "adx", + "new": [ + "adcx", + "adox" + ], + "extended": [ + ] + }, + { + "name": "avx512_ifma", + "new": [ + "vpmadd52huq", + "vpmadd52luq" + ], + "extended": [ + ] + }, + { + "name": "pcommit", + "new": [ + ], + "extended": [ + ] + }, + { + "name": "avx512_pf", + "new": [ + "vgatherpf0dpd", + "vgatherpf0dps", + "vgatherpf0qpd", + "vgatherpf0qps", + "vgatherpf1dpd", + "vgatherpf1dps", + "vgatherpf1qpd", + "vgatherpf1qps", + "vscatterpf0dpd", + "vscatterpf0dps", + "vscatterpf0qpd", + "vscatterpf0qps", + "vscatterpf1dpd", + "vscatterpf1dps", + "vscatterpf1qpd", + "vscatterpf1qps" + ], + "extended": [ + ] + }, + { + "name": "avx512_er", + "new": [ + "vexp2pd", + "vexp2ps", + "vexp2sd", + "vexp2ss", + "vrcp28pd", + "vrcp28ps", + "vrcp28sd", + "vrcp28ss", + "vrsqrt28pd", + "vrsqrt28ps", + "vrsqrt28sd", + "vrsqrt28ss" + ], + "extended": [ + ] + }, + { + "name": "avx512_cd", + "new": [ + "vpbroadcastmw2d", + "vpbroadcastmb2q", + "vpbroadcastm", + "vpconflictd", + "vpconflictq", + "vplzcntd", + "vplzcntq" + ], + "extended": [ + ] + }, + { + "name": "sha", + "new": [ + "sha1rnds4", + "sha1nexte", + "sha1msg1", + "sha1msg2", + "sha256rnds2", + "sha256msg1", + "sha256msg2" + ], + "extended": [ + ] + }, + { + "name": "avx512_bw", + "new": [ + "+avx512bw_unimplemented", + "kandq", + "kandd", + "kandnq", + "kandnd", + "kmovd", + "kmovq", + "knotd", + "knotq", + "kord", + "korq", + "kaddd", + "ktestd", + "kaddq", + "ktestq", + "kortestd", + "kortestq", + "kshiftld", + "kshiftrd", + "kshiftlq", + "kshiftrq", + "kunpckwd", + "kunpckdq", + "kxnord", + "kxnorq", + "kxord", + "kxorq", + "vpcmpeqb", + "vpcmpeqw", + "vpcmpgtb", + "vpcmpgtw", + "vpsubusb", + "vpsubusw", + "vpermw", + "vpermi2w", + "vpermt2w", + "vpsllvw", + "vpsravw", + "vpsrlvw", + "vpextrb", + "vpextrw", + "vpinsrb", + "vpinsrw", + "vpmulhuw", + "vpmulhrsw", + "vpaddsb", + "vpaddsw", + "vpaddusb", + "vpaddusw", + "vpalignr", + "vpmovd2m", + "vpmovq2m", + "vpmovwb", + "vdbpsadbw", + "vmovdqu8", + "vmovdqu16", + "vpblendmb", + "vpblendmw", + "vpcmpb", + "vpcmpub", + "vpcmpw", + "vpcmpuw", + "vpermw", + "vpermi2b", + "vpermi2w", + "vpmovm2b", + "vpmovm2w", + "vpmovb2m", + "vpmovw2m", + "vpmovswb", + "vpmovuswb", + "vpsllvw", + "vpsravw", + "vpsrlvw", + "vptestnmb", + "vptestnmw", + "vptestmb", + "vptestmw" + ], + "extended": [ + "vpabsb", + "vpabsw", + + "vpaddb", + "vpaddw", + "vpsubsb", + "vpsubsw", + "vpmaxsb", + "vpmaxsw", + "vpminsb", + "vpminsw", + "vpminub", + "vpminuw", + "vpmaddubsw", + "vpmaddwd", + "vpsadbw", + + "vpslldq", + "vpsrldq", + + "vpmovsxbw", + "vpmovzxbw", + "vpsllw", + "vpsraw", + "vpsrlw", + "vpsubb", + "vpsubw", + + "vpunpckhbw", + "vpunpckhwd", + "vpunpcklbw", + "vpunpcklwd", + "vpbroadcastb", + "vpbroadcastw", + "vpermt2w", + "vpackssdw", + "vpackusdw", + "vpacksswb", + "vpackuswb", + "vpavgb", + "vpavgw", + "vpmulhw", + "vpmullw", + "vpshufb", + "vpshufhw", + "vpshuflw" + ] + }, + { + "name": "avx512_vl", + "remark": "not used for opcode generation, since this only adds new modes to existing instructions", + "new": [ + ], + "extended": [ + "vaddpd", + "vaddps", + "vcmppd", + "vcmpps", + "vcvtdq2pd", + "vcvtdq2ps", + "vcvtpd2dq", + "vcvtpd2ps", + "vcvtps2dq", + "vcvtps2pd", + "vcvttpd2dq", + "vcvttps2dq", + "vdivpd", + "vdivps", + "vmaxpd", + "vmaxps", + "vminpd", + "vminps", + "vmovapd", + "vmovaps", + "vmovddup", + "vmovdqa", + "vmovdqu", + "vmovntdqa", + "vmovntdq", + "vmovntpd", + "vmovntps", + "vmovshdup", + "vmovsldup", + "vmovupd", + "vmovups", + "vmulpd", + "vmulps", + "vpandd", + "vpandq", + "vpandnd", + "vpandnq", + "vpcmpeqd", + "vpcmpeqq", + "vpcmpgtd", + "vpcmpgtq", + "vpmaxsd", + "vpmaxsq", + "vpmaxud", + "vpmaxud", + "vpminsd", + "vpminsq", + "vpminud", + "vpminuq", + "vpcmpd", + "vpcmpq", + "vpcmpud", + "vpcmpuq", + + "vpord", + "vporq", + "vpxord", + "vpxorq", + + "vpslld", + "vpsllq", + "vpsllw", + "vpsrad", + "vpsraq", + "valignd", + "valignq", + "vblendmpd", + "vblendmps", + "vprold", + "vprolq", + "vprolvd", + "vprolvq", + "vprord", + "vprorq", + "vprorvd", + "vprorvq", + + "vpunpckhdq", + "vpunpckhqdq", + "vpunpckldq", + "vpunpcklqdq", + "vunpckhpd", + "vunpckhps", + "vunpcklpd", + "vunpcklps", + + "vbroadcastf32x4", + "vbroadcastf64x4", + "vbroadcasti64x4", + "vbroadcasti32x4", + "vinsertf32x4", + "vinserti32x4", + "vshuff32x4", + "vshuff64x2", + "vshufi32x4", + "vshufi64x2", + "vcompressd", + "vcompressq", + "vcompresspd", + "vcompressps", + "vexpandpd", + "vexpandps", + "vcvtpd2udq", + "vcvtps2udq", + "vcvtudq2pd", + "vcvtudq2ps", + "vcvttpd2udq", + "vcvttps2udq", + "vfixupimmpd", + "vfixupimmps", + "vcvtph2ps", + "vcvtps2ph", + + "vfmadd132pd", + "vfmadd132ps", + "vfmadd213pd", + "vfmadd213ps", + "vfmadd231pd", + "vfmadd231ps", + "vfmaddsub132pd", + "vfmaddsub132ps", + "vfmaddsub213pd", + "vfmaddsub213ps", + "vfmaddsub231pd", + "vfmaddsub231ps", + "vfmsub132pd", + "vfmsub132ps", + "vfmsub213pd", + "vfmsub213ps", + "vfmsub231pd", + "vfmsub231ps", + "vfmsubadd132pd", + "vfmsubadd132ps", + "vfmsubadd213pd", + "vfmsubadd213ps", + "vfmsubadd231pd", + "vfmsubadd231ps", + "vfnmadd132pd", + "vfnmadd132ps", + "vfnmadd213pd", + "vfnmadd213ps", + "vfnmadd231pd", + "vfnmadd231ps", + "vfnmsub132pd", + "vfnmsub132ps", + "vfnmsub213pd", + "vfnmsub213ps", + "vfnmsub231pd", + "vfnmsub231ps", + + "vscatterdps", + "vscatterdpd", + "vscatterqps", + "vscatterqpd", + "vgatherdpd", + "vgatherdps", + "vgatherqpd", + "vgatherqps", + "vgetexppd", + "vgetexpps", + "vgetmantpd", + "vgetmantps", + "vpblendmd", + "vpblendmq", + + "vpermd", + "vpermq", + "vpermi2d", + "vpermi2q", + "vpermi2pd", + "vpermi2ps", + "vpermt2d", + "vpermt2q", + "vpermt2pd", + "vpermt2ps", + "vpexpandd", + "vpexpandq", + "vpgatherdd", + "vpgatherdq", + "vpgatherqd", + "vpgatherqq", + "vpscatterdd", + "vpscatterdq", + "vpscatterqd", + "vpscatterqq", + "vpmovdb", + "vpmovsdb", + "vpmovusdb", + "vpmovdw", + "vpmovsdw", + "vpmovusdw", + "vpmovqb", + "vpmovsqb", + "vpmovusqb", + "vpmovqd", + "vpmovsqd", + "vpmovusqd", + "vpmovqw", + "vpmovsqw", + "vpmovusqw", + + "vpsravq", + "vpternlogd", + "vpternlogq", + "vptestmd", + "vptestmq", + "vptestnmd", + "vptestnmq", + "vrcp14pd", + "vrcp14ps", + "vrndscalepd", + "vrndscaleps", + "vrsqrt14pd", + "vrsqrt14ps", + "vscalefps", + "vscalefpd", + "vpabsq" + ] + }, + { + "name": "prefetchwt1", + "new": [ + ], + "extended": [ + ] + }, + { + "name": "avx512_vbmi", + "new": [ + "vpermt2b", + "vpermb" + ], + "extended": [ + ] + }, + { + "name": "avx512_vbmi2", + "new": [ + "vpcompressb", + "vpcompressw", + "vpshldvw", + "vpshldw", + "vpexpandb", + "vpexpandw", + "vpshrdvw", + "vpshrdw", + "vpshldvq", + "vpshldvd", + "vpshldq", + "vpshldd", + "vpshrdq", + "vpshrdd", + "vpshrdvq", + "vpshrdvd" + ], + "extended": [ + ] + }, + { + "name": "gfni", + "new": [ + "gf2p8affineqb", + "gf2p8affineinvqb", + "gf2p8mulb" + ], + "extended": [ + ] + }, + { + "name": "avx512_gfni", + "new": [ + "vgf2p8affineqb", + "vgf2p8affineinvqb", + "vgf2p8mulb" + ], + "extended": [ + ] + }, + { + "name": "vaes", + "new": [ + "vaesdec", + "vaesdeclast", + "vaesenc", + "vaesenclast", + "vaesimc", + "vaeskeygenassist" + ], + "extended": [ + ] + }, + { + "name": "clmul", + "remark": "this extension is pclmulqdq in a few forms", + "new": [ + "+pclmulqdq" + ], + "extended": [ + ] + }, + { + "name": "pclmulqdq", + "new": [ + "pclmulqdq" + ], + "extended": [ + ] + }, + { + "name": "avx512_vp2intersect", + "new": [ + "vp2intersectd", + "vp2intersectq" + ], + "extended": [ + ] + }, + { + "name": "avx512_vnni", + "new": [ + "vpdpbusds", + "vpdpbusd", + "vpdpwssds", + "vpdpwssd" + ], + "extended": [ + ] + }, + { + "name": "avx512_bitalg", + "new": [ + "vpopcntd", + "vpopcntq", + "vpopcntb", + "vpopcntw", + "vpshufbitqmb", + "vpmultishiftqb" + ], + "extended": [ + ] + }, + { + "name": "avx512_vpopcntdq", + "new": [ + "vpopcntd", + "vpopcntq" + ], + "extended": [ + ] + }, + { + "name": "avx512_4vnniw", + "new": [ + "vp4dpwssds", + "vp4dpwssd" + ], + "extended": [ + ] + }, + { + "name": "avx512_4fmaps", + "new": [ + "v4fnmaddss", + "v4fnmaddps", + "v4fmaddss", + "v4fmaddps" + ], + "extended": [ + ] + }, + { + "name": "avx512_bf16", + "new": [ + "vcvtne2ps2bf16", + "vcvtneps2bf16", + "vdpbf16ps" + ], + "extended": [ + ] + }, + { + "name": "cx8", + "new": [ + ], + "extended": [ + ] + }, + { + "name": "sysenter", + "new": [ + "sysenter", + "sysexit" + ], + "extended": [ + ] + }, + { + "name": "syscall", + "new": [ + "syscall", + "sysret" + ], + "extended": [ + ] + }, + { + "name": "rdtscp", + "new": [ + "rdtscp" + ], + "extended": [ + ] + }, + { + "name": "abm", + "new": [ + "popcnt", + "lzcnt" + ], + "extended": [ + ] + }, + { + "name": "sse4a", + "new": [ + "extrq", + "insertq", + "movntsd", + "movntss" + ], + "extended": [ + ] + }, + { + "name": "3dnowprefetch", + "new": [ + "prefetchw" + ], + "extended": [ + ] + }, + { + "name": "xop", + "new": [ + ], + "extended": [ + ] + }, + { + "name": "skinit", + "new": [ + ], + "extended": [ + ] + }, + { + "name": "tbm", + "new": [ + ], + "extended": [ + ] + }, + { + "name": "svm", + "new": [ + "clgi", + "stgi", + "skinit", + "vmload", + "vmmcall", + "vmsave", + "vmrun", + "invlpga" + ], + "extended": [ + ] + }, + { + "name": "lahfsahf", + "new": [ + "lahf", + "sahf" + ], + "extended": [ + ] + }, + { + "name": "cmov", + "new": [ + "cmova", + "cmovb", + "cmovg", + "cmovge", + "cmovl", + "cmovle", + "cmovna", + "cmovnb", + "cmovno", + "cmovnp", + "cmovns", + "cmovnz", + "cmovo", + "cmovp", + "cmovs", + "cmovz" + ], + "extended": [ + ] + }, + { + "name": "f16c", + "new": [ + "vcvtph2ps", + "vcvtps2ph" + ], + "extended": [ + ] + }, + { + "name": "fma4", + "new": [ + ], + "extended": [ + ] + }, + { + "name": "prefetchw", + "new": [ + "+3dnowprefetch" + ], + "extended": [ + ] + }, + { + "name": "tsx", + "new": [ + "xabort", + "xbegin", + "xend", + "xtest" + ], + "extended": [ + ] + }, + { + "name": "lzcnt", + "new": [ + "lzcnt" + ], + "extended": [ + ] + }, + { + "name": "keylocker", + "new": [ + "aesdec128kl", + "aesdec256kl", + "aesdecwide128kl", + "aesdecwide256kl", + "aesenc128kl", + "aesenc256kl", + "aesencwide128kl", + "aesencwide256kl", + "encodekey128", + "encodekey256", + "loadiwkey" + ], + "extended": [ + ] + }, + { + "name": "cet", + "new": [ + "wruss", + "wrss", + "incssp", + "saveprevssp", + "setssbsy", + "clrssbsy", + "rstorssp", + "endbr64", + "endbr32" + ], + "extended": [ + ] + }, + { + "name": "tdx", + "new": [ + "tdcall", + "seamret", + "seamops", + "seamcall" + ], + "extended": [ + ] + }, + { + "name": "waitpkg", + "new": [ + "tpause", + "umonitor", + "umwait" + ], + "extended": [ + ] + }, + { + "name": "uintr", + "new": [ + "uiret", + "testui", + "clui", + "stui", + "senduipi" + ], + "extended": [ + ] + }, + { + "name": "tsxldtrk", + "new": [ + "xsusldtrk", + "xresldtrk" + ], + "extended": [ + ] + }, + { + "name": "3dnow", + "new": [ + "femms", + "pi2fw", + "pi2fd", + "pf2iw", + "pf2id", + "pmulhrw", + "pfcmpge", + "pfmin", + "pfrcp", + "pfrsqrt", + "pfsub", + "pfadd", + "pfcmpgt", + "pfmax", + "pfrcpit1", + "pfrsqit1", + "pfsubr", + "pfacc", + "pfcmpeq", + "pfmul", + "pfmulhrw", + "pfrcpit2", + "pfnacc", + "pfpnacc", + "pswapd", + "pavgusb", + "+3dnowprefetch" + ], + "extended": [ + ] + }, + { + "name": "enqcmd", + "new": [ + "enqcmd", + "enqcmds" + ], + "extended": [ + ] + }, + { + "name": "invpcid", + "new": [ + "invept", + "invvpid", + "invpcid" + ], + "extended": [ + ] + }, + { + "name": "ptwrite", + "new": [ + "ptwrite" + ], + "extended": [ + ] + }, + { + "name": "x87", + "new": [ + "f2xm1", + "fabs", + "fadd", + "faddp", + "fbld", + "fbstp", + "fchs", + "fcmovb", + "fcmovbe", + "fcmove", + "fcmovnb", + "fcmovnbe", + "fcmovne", + "fcmovnu", + "fcmovu", + "fcom", + "fcomi", + "fcomip", + "fcomp", + "fcompp", + "fcos", + "fdecstp", + "fdisi8087_nop", + "fdiv", + "fdivp", + "fdivr", + "fdivrp", + "feni8087_nop", + "ffree", + "ffreep", + "fiadd", + "ficom", + "ficomp", + "fidiv", + "fidivr", + "fild", + "fimul", + "fincstp", + "fist", + "fistp", + "fisttp", + "fisub", + "fisubr", + "fld", + "fld1", + "fldcw", + "fldenv", + "fldl2e", + "fldl2t", + "fldlg2", + "fldln2", + "fldpi", + "fldz", + "fmul", + "fmulp", + "fnclex", + "fninit", + "fnop", + "fnsave", + "fnstcw", + "fnstenv", + "fnstor", + "fnstsw", + "fpatan", + "fprem", + "fprem1", + "fptan", + "frndint", + "frstor", + "fscale", + "fsetpm287_nop", + "fsin", + "fsincos", + "fsqrt", + "fst", + "fstp", + "fstpnce", + "fsub", + "fsubp", + "fsubr", + "fsubrp", + "ftst", + "fucom", + "fucomi", + "fucomip", + "fucomp", + "fucompp", + "fxam", + "fxch", + "fxtract", + "fyl2x", + "fyl2xp1" + ], + "extended": [ + ] + }, + { + "name": "snp", + "new": [ + "psmash", + "pvalidate", + "rmpadjust", + "rmpupdate" + ], + "extended": [ + ] + }, + { + "name": "fxsr", + "new": [ + "fxsave", + "fxrstor" + ], + "extended": [ + ] + }, + { + "name": "xsave", + "new": [ + "+xsaveopt", + "xgetbv", + "xrstor", + "xrstors", + "xsave", + "xsavec", + "xsaves", + "xsetbv", + "+xsave64" + ], + "extended": [ + ] + }, + { + "name": "xsave64", + "new": [ + "xrstors64", + "xsavec64", + "xsaves64" + ], + "extended": [ + ] + }, + { + "name": "rdrand", + "new": [ + "rdrand" + ], + "extended": [ + ] + }, + { + "name": "rdseed", + "new": [ + "rdseed" + ], + "extended": [ + ] + }, + { + "name": "xsaveopt", + "new": [ + "xsaveopt" + ], + "extended": [ + ] + }, + { + "name": "smap", + "new": [ + "clac", + "stac" + ], + "extended": [ + ] + }, + { + "name": "rdpid", + "new": [ + "rdpid" + ], + "extended": [ + ] + }, + { + "name": "salc", + "new": [ + "salc" + ], + "extended": [ + ] + }, + { + "name": "clwb", + "new": [ + "clwb" + ], + "extended": [ + ] + }, + { + "name": "clzero", + "new": [ + "clzero" + ], + "extended": [ + ] + }, + { + "name": "pconfig", + "new": [ + "pconfig" + ], + "extended": [ + ] + }, + { + "name": "hreset", + "new": [ + "hreset" + ], + "extended": [ + ] + }, + { + "name": "clflushopt", + "new": [ + "clflushopt" + ], + "extended": [ + ] + }, + { + "name": "pmem", + "new": [ + "+clflushopt", + "+clwb" + ], + "extended": [ + ] + }, + { + "name": "emx", + "new": [ + "monitorx", + "mwaitx", + "+monitor" + ], + "extended": [ + ] + }, + { + "name": "mpk", + "new": [ + "rdpkru", + "wrpkru" + ], + "extended": [ + ] + }, + { + "name": "rdpru", + "new": [ + "rdpru" + ], + "extended": [ + ] + }, + { + "name": "itanium", + "new": [ + "jmpe" + ], + "extended": [ + ] + }, + { + "name": "smx", + "new": [ + "getsec" + ], + "extended": [ + ] + }, + { + "name": "fsgsbase", + "new": [ + "rdfsbase", + "rdgsbase", + "wrfsbase", + "wrgsbase" + ], + "extended": [ + ] + }, + { + "name": "movdir", + "new": [ + "movdiri", + "movdir64b" + ], + "extended": [ + ] + }, + { + "name": "new", + "vendor": "yax", + "remark": "misc instruction sets implementing newer features of x86, such as `syscall`, `skinit`, `svm`, `tsx`, `mpx`, and others", + "new": [ + "+invpcid_unimplemented", + "+invpcid", + "+pconfig", + "+abm", + "+smap", + "+smx", + "+rdpid", + "+rdpru", + "+tsxldtrk", + "+waitpkg", + "+clwb", + "+uintr", + "+mpk", + "+emx", + "+snp", + "+invlpgb", + "+enqcmd", + "+cet", + "+tdx", + "+clflushopt", + "+fxsr", + "+sgx", + "+keylocker", + "+vmx", + "+svm", + "+rdrand", + "+rdseed", + "+ptwrite", + "+clzero", + "+popcnt", + "+movbe", + "+xsave", + "+xsave64", + "+mpx", + "+tsx", + "+movdir", + "+sysenter", + "+syscall", + "+hreset", + "+rdtscp" + ] + }, + { + "name": "simd", + "vendor": "yax", + "remark": "SIMD extensions for x86-family architectures", + "new": [ + "+3dnow", + "+sha", + "+mmx", + "+sse", + "+sse2", + "+sse3", + "+ssse3", + "+sse4a", + "+sse4_1", + "+sse4_2", + "+pclmulqdq", + "+avx", + "+avx2", + "+gfni", + "+fma3", + "+fma4", + "+bmi1", + "+bmi2", + "+aesni", + "+avx_unimplemented", + "+avx512_f", + "+avx512_f_typo", + "+avx512_vnni", + "+avx512_dq", + "+avx512_er", + "+avx512_ifma", + "+avx512_pf", + "+avx512_cd", + "+avx512_bw", + "+avx512_vbmi", + "+avx512_vbmi2", + "+avx512_gfni", + "+avx512_bitalg", + "+avx512_vpopcntdq", + "+avx512_4vnniw", + "+avx512_4fmaps", + "+avx512_bf16", + "+avx512_vp2intersect", + "+vpclmulqdq", + "+vaes" + ] + } + ], + "uarch": [ + { + "name": "k8", + "vendor": "amd", + "sets": [ + "64bit" + ] + }, + { + "name": "k10", + "vendor": "amd", + "sets": [ + "+k8", + "cmov", + "cmpxchg16b", + "svm", + "abm", + "lahfsahf", + "sse3", + "ssse3", + "sse4_1", + "sse4_2", + "sse4a" + ] + }, + { + "name": "bulldozer", + "vendor": "amd", + "sets": [ + "+k10", + "bmi1", + "aesni", + "pclmulqdq", + "f16c", + "avx", + "fma4", + "xop" + ] + }, + { + "name": "piledriver", + "vendor": "amd", + "sets": [ + "+bulldozer", + "tbm", + "fma3", + "fma4" + ] + }, + { + "name": "steamroller", + "vendor": "amd", + "sets": [ + "+bulldozer" + ] + }, + { + "name": "excavator", + "vendor": "amd", + "sets": [ + "+steamroller", + "movbe", + "bmi2", + "rdrand", + "avx", + "xop", + "sha", + "avx2" + ] + }, + { + "name": "zen", + "vendor": "amd", + "sets": [ + "+k10", + "avx", + "avx2", + "bmi1", + "bmi2", + "aesni", + "pclmulqdq", + "f16c", + "movbe", + "rdrand", + "adx", + "sha", + "rdseed", + "fma3", + "xsave", + "clflushopt", + "clzero" + ] + }, + { + "name": "netburst", + "vendor": "intel", + "sets": [ + "64bit", + "cmov", + "cmpxchg16b", + "sse3" + ] + }, + { + "name": "core", + "vendor": "intel", + "sets": [ + "+netburst", + "ssse3" + ] + }, + { + "name": "penryn", + "vendor": "intel", + "sets": [ + "+core", + "sse4_1" + ] + }, + { + "name": "nehalem", + "vendor": "intel", + "sets": [ + "+penryn", + "sse4_2", + "popcnt" + ] + }, + { + "name": "westmere", + "vendor": "intel", + "sets": [ + "+nehalem", + "aesni", + "pclmulqdq" + ] + }, + { + "name": "sandybridge", + "vendor": "intel", + "sets": [ + "+westmere", + "avx" + ] + }, + { + "name": "ivybridge", + "vendor": "intel", + "sets": [ + "+sandybridge", + "f16c", + "rdrand" + ] + }, + { + "name": "haswell", + "vendor": "intel", + "sets": [ + "+ivybridge", + "bmi1", + "bmi2", + "abm", + "fma3", + "avx2" + ] + }, + { + "name": "haswell_ex", + "vendor": "intel", + "sets": [ + "+haswell", + "tsx" + ] + }, + { + "name": "broadwell", + "vendor": "intel", + "sets": [ + "+haswell_ex", + "rdseed", + "prefetchw" + ] + }, + { + "name": "skylake", + "vendor": "intel", + "sets": [ + "+broadwell", + "mpx", + "sgx" + ] + }, + { + "name": "kabylake", + "vendor": "intel", + "sets": [ + "+skylake" + ] + }, + { + "name": "tigerlake", + "vendor": "intel", + "sets": [ + "keylocker" + ] + }, + { + "name": "goldencove", + "vendor": "intel", + "sets": [ + "/cldemote", + "ptwrite", + "hreset", + "avx512_vnni", + "avx512_f", + "/avx512_fp16" + ] + }, + { + "name": "long_mode", + "vendor": "yax", + "remark": "pseudo-architecture describing the sum of all x86_64 instructions on various processors and architectures", + "sets": [ + "+goldencove", + "+tigerlake", + "+kabylake", + "+skylake", + "+broadwell", + "+haswell_ex", + "+haswell", + "+ivybridge", + "+sandybridge", + "+westmere", + "+nehalem", + "+penryn", + "+core", + "+netburst", + "+zen", + "+excavator", + "+steamroller", + "+piledriver", + "+bulldozer", + "+k10", + "+k8", + "x86_64_baseline", + "simd", + "new", + "itanium", + "avx_unimplemented", + "avx512bw_unimplemented", + "invpcid_unimplemented", + "avx512_f__vl_unimplemented", + "typo_instructions" + ] + }, + { + "name": "protected_mode", + "vendor": "yax", + "remark": "pseudo-architecture describing the sum of all x86_32 instructions on various processors and architectures", + "sets": [ + "80186_bound", + "jecxz", + "fsgsbase", + "extra_instructions", + "pentium_pro", + "8086_bcd", + "80186_pusha", + "8086", + "x87", + "80186", + "80286", + "80286_arpl", + "80386", + "80486", + "itanium", + "lahfsahf", + "adx", + "simd", + "new" + ] + }, + { + "name": "real_mode", + "vendor": "yax", + "remark": "pseudo-architecture describing the sum of all x86_16 instructions on various processors and architectures", + "sets": [ + "80186_bound", + "jcxz", + "fsgsbase", + "extra_instructions", + "pentium_pro", + "8086_bcd", + "80186_pusha", + "8086", + "x87", + "80186", + "80286", + "80286_arpl", + "80386", + "80486", + "itanium", + "lahfsahf", + "adx", + "simd", + "new" + ] + }, + { + "name": "x86_generic", + "vendor": "yax", + "remark": "the union of all instructions in any x86 operation mode. processor can execute all these instructions in a single execution mode, but the generalization can be useful for f.ex generic program disassembly", + "sets": [ + "+real_mode", + "+protected_mode", + "+long_mode" + ] + } + ] +} |