aboutsummaryrefslogtreecommitdiff
path: root/src/real_mode
diff options
context:
space:
mode:
Diffstat (limited to 'src/real_mode')
-rw-r--r--src/real_mode/display.rs1478
-rw-r--r--src/real_mode/mod.rs2165
2 files changed, 13 insertions, 3630 deletions
diff --git a/src/real_mode/display.rs b/src/real_mode/display.rs
index 6f6eb74..5783d1a 100644
--- a/src/real_mode/display.rs
+++ b/src/real_mode/display.rs
@@ -345,1480 +345,10 @@ impl fmt::Display for Opcode {
}
}
-const MNEMONICS: &[&'static str] = &[
- "invalid",
- "add",
- "or",
- "adc",
- "sbb",
- "and",
- "xor",
- "sub",
- "cmp",
- "xadd",
- "bt",
- "bts",
- "btc",
- "btr",
- "bsf",
- "bsr",
- "tzcnt",
- "movss",
- "addss",
- "subss",
- "mulss",
- "divss",
- "minss",
- "maxss",
- "sqrtss",
- "movsd",
- "sqrtsd",
- "addsd",
- "subsd",
- "mulsd",
- "divsd",
- "minsd",
- "maxsd",
- "movsldup",
- "movshdup",
- "movddup",
- "haddps",
- "hsubps",
- "addsubpd",
- "addsubps",
- "cvtsi2ss",
- "cvtsi2sd",
- "cvttsd2si",
- "cvttps2dq",
- "cvtpd2dq",
- "cvtpd2ps",
- "cvtps2dq",
- "cvtsd2si",
- "cvtsd2ss",
- "cvttss2si",
- "cvtss2si",
- "cvtss2sd",
- "cvtdq2pd",
- "lddqu",
- "movzx",
- "movsx",
- "movsxd",
- "sar",
- "sal",
- "shr",
- "shrd",
- "shl",
- "rcr",
- "rcl",
- "ror",
- "rol",
- "inc",
- "dec",
- "hlt",
- "call",
- "callf",
- "jmp",
- "jmpf",
- "push",
- "pop",
- "lea",
- "nop",
- "prefetchnta",
- "prefetch0",
- "prefetch1",
- "prefetch2",
- "xchg",
- "popf",
- "int",
- "into",
- "iret",
- "iretd",
- "iretq",
- "retf",
- "enter",
- "leave",
- "mov",
- "ret",
- "pushf",
- "wait",
- "cbw",
- "cwde",
- "cdqe",
- "cwd",
- "cdq",
- "cqo",
- "lods",
- "stos",
- "lahf",
- "sahf",
- "cmps",
- "scas",
- "movs",
- "test",
- "ins",
- "in",
- "outs",
- "out",
- "imul",
- "jo",
- "jno",
- "jb",
- "jnb",
- "jz",
- "jnz",
- "ja",
- "jna",
- "js",
- "jns",
- "jp",
- "jnp",
- "jl",
- "jge",
- "jle",
- "jg",
- "cmova",
- "cmovb",
- "cmovg",
- "cmovge",
- "cmovl",
- "cmovle",
- "cmovna",
- "cmovnb",
- "cmovno",
- "cmovnp",
- "cmovns",
- "cmovnz",
- "cmovo",
- "cmovp",
- "cmovs",
- "cmovz",
- "div",
- "idiv",
- "mul",
- "neg",
- "not",
- "cmpxchg",
- "seto",
- "setno",
- "setb",
- "setae",
- "setz",
- "setnz",
- "setbe",
- "seta",
- "sets",
- "setns",
- "setp",
- "setnp",
- "setl",
- "setge",
- "setle",
- "setg",
- "cpuid",
- "ud0",
- "ud1",
- "ud2",
- "wbinvd",
- "invd",
- "sysret",
- "clts",
- "syscall",
- "lsl",
- "lar",
- "les",
- "lds",
- "sgdt",
- "sidt",
- "lgdt",
- "lidt",
- "smsw",
- "lmsw",
- "swapgs",
- "rdtscp",
- "invlpg",
- "fxsave",
- "fxrstor",
- "ldmxcsr",
- "stmxcsr",
- "xsave",
- "xrstor",
- "xsaveopt",
- "lfence",
- "mfence",
- "sfence",
- "clflush",
- "clflushopt",
- "clwb",
- "wrmsr",
- "rdtsc",
- "rdmsr",
- "rdpmc",
- "sldt",
- "str",
- "lldt",
- "ltr",
- "verr",
- "verw",
- "cmc",
- "clc",
- "stc",
- "cli",
- "sti",
- "cld",
- "std",
- "jmpe",
- "popcnt",
- "movdqu",
- "movdqa",
- "movq",
- "cmpss",
- "cmpsd",
- "unpcklps",
- "unpcklpd",
- "unpckhps",
- "unpckhpd",
- "pshufhw",
- "pshuflw",
- "movups",
- "movq2dq",
- "movdq2q",
- "rsqrtss",
- "rcpss",
- "andn",
- "bextr",
- "blsi",
- "blsmsk",
- "blsr",
- "vmclear",
- "vmxon",
- "vmcall",
- "vmlaunch",
- "vmresume",
- "vmxoff",
- "pconfig",
- "monitor",
- "mwait",
- "monitorx",
- "mwaitx",
- "clac",
- "stac",
- "encls",
- "enclv",
- "xgetbv",
- "xsetbv",
- "vmfunc",
- "xabort",
- "xbegin",
- "xend",
- "xtest",
- "enclu",
- "rdpkru",
- "wrpkru",
- "rdpru",
- "clzero",
- "rdseed",
- "rdrand",
- "addps",
- "addpd",
- "andnps",
- "andnpd",
- "andps",
- "andpd",
- "bswap",
- "cmppd",
- "cmpps",
- "comisd",
- "comiss",
- "cvtdq2ps",
- "cvtpi2ps",
- "cvtpi2pd",
- "cvtps2pd",
- "cvtps2pi",
- "cvtpd2pi",
- "cvttps2pi",
- "cvttpd2pi",
- "cvttpd2dq",
- "divps",
- "divpd",
- "emms",
- "getsec",
- "lfs",
- "lgs",
- "lss",
- "maskmovq",
- "maskmovdqu",
- "maxps",
- "maxpd",
- "minps",
- "minpd",
- "movaps",
- "movapd",
- "movd",
- "movlps",
- "movlpd",
- "movhps",
- "movhpd",
- "movlhps",
- "movhlps",
- "movupd",
- "movmskps",
- "movmskpd",
- "movnti",
- "movntps",
- "movntpd",
- "extrq",
- "insertq",
- "movntss",
- "movntsd",
- "movntq",
- "movntdq",
- "mulps",
- "mulpd",
- "orps",
- "orpd",
- "packssdw",
- "packsswb",
- "packuswb",
- "paddb",
- "paddd",
- "paddq",
- "paddsb",
- "paddsw",
- "paddusb",
- "paddusw",
- "paddw",
- "pand",
- "pandn",
- "pavgb",
- "pavgw",
- "pcmpeqb",
- "pcmpeqd",
- "pcmpeqw",
- "pcmpgtb",
- "pcmpgtd",
- "pcmpgtw",
- "pinsrw",
- "pmaddwd",
- "pmaxsw",
- "pmaxub",
- "pminsw",
- "pminub",
- "pmovmskb",
- "pmulhuw",
- "pmulhw",
- "pmullw",
- "pmuludq",
- "por",
- "psadbw",
- "pshufw",
- "pshufd",
- "pslld",
- "pslldq",
- "psllq",
- "psllw",
- "psrad",
- "psraw",
- "psrld",
- "psrldq",
- "psrlq",
- "psrlw",
- "psubb",
- "psubd",
- "psubq",
- "psubsb",
- "psubsw",
- "psubusb",
- "psubusw",
- "psubw",
- "punpckhbw",
- "punpckhdq",
- "punpckhwd",
- "punpcklbw",
- "punpckldq",
- "punpcklwd",
- "punpcklqdq",
- "punpckhqdq",
- "pxor",
- "rcpps",
- "rsm",
- "rsqrtps",
- "shld",
- "shufpd",
- "shufps",
- "slhd",
- "sqrtps",
- "sqrtpd",
- "subps",
- "subpd",
- "sysenter",
- "sysexit",
- "ucomisd",
- "ucomiss",
- "vmread",
- "vmwrite",
- "xorps",
- "xorpd",
- "vmovddup",
- "vpshuflw",
- "vpshufhw",
- "vhaddps",
- "vhsubps",
- "vaddsubps",
- "vcvtpd2dq",
- "vlddqu",
- "vcomisd",
- "vcomiss",
- "vucomisd",
- "vucomiss",
- "vaddpd",
- "vaddps",
- "vaddsd",
- "vaddss",
- "vaddsubpd",
- "vaesdec",
- "vaesdeclast",
- "vaesenc",
- "vaesenclast",
- "vaesimc",
- "vaeskeygenassist",
- "vblendpd",
- "vblendps",
- "vblendvpd",
- "vblendvps",
- "vbroadcastf128",
- "vbroadcasti128",
- "vbroadcastsd",
- "vbroadcastss",
- "vcmpsd",
- "vcmpss",
- "vcmppd",
- "vcmpps",
- "vcvtdq2pd",
- "vcvtdq2ps",
- "vcvtpd2ps",
- "vcvtph2ps",
- "vcvtps2dq",
- "vcvtps2pd",
- "vcvtss2sd",
- "vcvtsi2ss",
- "vcvtsi2sd",
- "vcvtsd2si",
- "vcvtsd2ss",
- "vcvtps2ph",
- "vcvtss2si",
- "vcvttpd2dq",
- "vcvttps2dq",
- "vcvttss2si",
- "vcvttsd2si",
- "vdivpd",
- "vdivps",
- "vdivsd",
- "vdivss",
- "vdppd",
- "vdpps",
- "vextractf128",
- "vextracti128",
- "vextractps",
- "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",
- "vgatherdpd",
- "vgatherdps",
- "vgatherqpd",
- "vgatherqps",
- "vhaddpd",
- "vhsubpd",
- "vinsertf128",
- "vinserti128",
- "vinsertps",
- "vmaskmovdqu",
- "vmaskmovpd",
- "vmaskmovps",
- "vmaxpd",
- "vmaxps",
- "vmaxsd",
- "vmaxss",
- "vminpd",
- "vminps",
- "vminsd",
- "vminss",
- "vmovapd",
- "vmovaps",
- "vmovd",
- "vmovdqa",
- "vmovdqu",
- "vmovhlps",
- "vmovhpd",
- "vmovhps",
- "vmovlhps",
- "vmovlpd",
- "vmovlps",
- "vmovmskpd",
- "vmovmskps",
- "vmovntdq",
- "vmovntdqa",
- "vmovntpd",
- "vmovntps",
- "vmovq",
- "vmovss",
- "vmovsd",
- "vmovshdup",
- "vmovsldup",
- "vmovupd",
- "vmovups",
- "vmpsadbw",
- "vmulpd",
- "vmulps",
- "vmulsd",
- "vmulss",
- "vpabsb",
- "vpabsd",
- "vpabsw",
- "vpackssdw",
- "vpackusdw",
- "vpacksswb",
- "vpackuswb",
- "vpaddb",
- "vpaddd",
- "vpaddq",
- "vpaddsb",
- "vpaddsw",
- "vpaddusb",
- "vpaddusw",
- "vpaddw",
- "vpalignr",
- "vandpd",
- "vandps",
- "vorpd",
- "vorps",
- "vandnpd",
- "vandnps",
- "vpand",
- "vpandn",
- "vpavgb",
- "vpavgw",
- "vpblendd",
- "vpblendvb",
- "vpblendw",
- "vpbroadcastb",
- "vpbroadcastd",
- "vpbroadcastq",
- "vpbroadcastw",
- "vpclmulqdq",
- "vpcmpeqb",
- "vpcmpeqd",
- "vpcmpeqq",
- "vpcmpeqw",
- "vpcmpgtb",
- "vpcmpgtd",
- "vpcmpgtq",
- "vpcmpgtw",
- "vpcmpestri",
- "vpcmpestrm",
- "vpcmpistri",
- "vpcmpistrm",
- "vperm2f128",
- "vperm2i128",
- "vpermd",
- "vpermilpd",
- "vpermilps",
- "vpermpd",
- "vpermps",
- "vpermq",
- "vpextrb",
- "vpextrd",
- "vpextrq",
- "vpextrw",
- "vpgatherdd",
- "vpgatherdq",
- "vpgatherqd",
- "vpgatherqq",
- "vphaddd",
- "vphaddsw",
- "vphaddw",
- "vpmaddubsw",
- "vphminposuw",
- "vphsubd",
- "vphsubsw",
- "vphsubw",
- "vpinsrb",
- "vpinsrd",
- "vpinsrq",
- "vpinsrw",
- "vpmaddwd",
- "vpmaskmovd",
- "vpmaskmovq",
- "vpmaxsb",
- "vpmaxsd",
- "vpmaxsw",
- "vpmaxub",
- "vpmaxuw",
- "vpmaxud",
- "vpminsb",
- "vpminsw",
- "vpminsd",
- "vpminub",
- "vpminuw",
- "vpminud",
- "vpmovmskb",
- "vpmovsxbd",
- "vpmovsxbq",
- "vpmovsxbw",
- "vpmovsxdq",
- "vpmovsxwd",
- "vpmovsxwq",
- "vpmovzxbd",
- "vpmovzxbq",
- "vpmovzxbw",
- "vpmovzxdq",
- "vpmovzxwd",
- "vpmovzxwq",
- "vpmuldq",
- "vpmulhrsw",
- "vpmulhuw",
- "vpmulhw",
- "vpmullq",
- "vpmulld",
- "vpmullw",
- "vpmuludq",
- "vpor",
- "vpsadbw",
- "vpshufb",
- "vpshufd",
- "vpsignb",
- "vpsignd",
- "vpsignw",
- "vpslld",
- "vpslldq",
- "vpsllq",
- "vpsllvd",
- "vpsllvq",
- "vpsllw",
- "vpsrad",
- "vpsravd",
- "vpsraw",
- "vpsrld",
- "vpsrldq",
- "vpsrlq",
- "vpsrlvd",
- "vpsrlvq",
- "vpsrlw",
- "vpsubb",
- "vpsubd",
- "vpsubq",
- "vpsubsb",
- "vpsubsw",
- "vpsubusb",
- "vpsubusw",
- "vpsubw",
- "vptest",
- "vpunpckhbw",
- "vpunpckhdq",
- "vpunpckhqdq",
- "vpunpckhwd",
- "vpunpcklbw",
- "vpunpckldq",
- "vpunpcklqdq",
- "vpunpcklwd",
- "vpxor",
- "vrcpps",
- "vroundpd",
- "vroundps",
- "vroundsd",
- "vroundss",
- "vrsqrtps",
- "vrsqrtss",
- "vrcpss",
- "vshufpd",
- "vshufps",
- "vsqrtpd",
- "vsqrtps",
- "vsqrtss",
- "vsqrtsd",
- "vsubpd",
- "vsubps",
- "vsubsd",
- "vsubss",
- "vtestpd",
- "vtestps",
- "vunpckhpd",
- "vunpckhps",
- "vunpcklpd",
- "vunpcklps",
- "vxorpd",
- "vxorps",
- "vzeroupper",
- "vzeroall",
- "vldmxcsr",
- "vstmxcsr",
- "pclmulqdq",
- "aeskeygenassist",
- "aesimc",
- "aesenc",
- "aesenclast",
- "aesdec",
- "aesdeclast",
- "pcmpgtq",
- "pcmpistrm",
- "pcmpistri",
- "pcmpestri",
- "packusdw",
- "pcmpestrm",
- "pcmpeqq",
- "ptest",
- "phminposuw",
- "dpps",
- "dppd",
- "mpsadbw",
- "pmovzxdq",
- "pmovsxdq",
- "pmovzxbd",
- "pmovsxbd",
- "pmovzxwq",
- "pmovsxwq",
- "pmovzxbq",
- "pmovsxbq",
- "pmovsxwd",
- "pmovzxwd",
- "pextrq",
- "pextrd",
- "pextrw",
- "pextrb",
- "pmovsxbw",
- "pmovzxbw",
- "pinsrq",
- "pinsrd",
- "pinsrb",
- "extractps",
- "insertps",
- "roundss",
- "roundsd",
- "roundps",
- "roundpd",
- "pmaxsb",
- "pmaxsd",
- "pmaxuw",
- "pmaxud",
- "pminsd",
- "pminsb",
- "pminud",
- "pminuw",
- "blendw",
- "pblendvb",
- "pblendw",
- "blendvps",
- "blendvpd",
- "blendps",
- "blendpd",
- "pmuldq",
- "movntdqa",
- "pmulld",
- "palignr",
- "psignw",
- "psignd",
- "psignb",
- "pshufb",
- "pmulhrsw",
- "pmaddubsw",
- "pabsd",
- "pabsw",
- "pabsb",
- "phsubsw",
- "phsubw",
- "phsubd",
- "phaddd",
- "phaddsw",
- "phaddw",
- "hsubpd",
- "haddpd",
- "sha1rnds4",
- "sha1nexte",
- "sha1msg1",
- "sha1msg2",
- "sha256rnds2",
- "sha256msg1",
- "sha256msg2",
- "lzcnt",
- "clgi",
- "stgi",
- "skinit",
- "vmload",
- "vmmcall",
- "vmsave",
- "vmrun",
- "invlpga",
- "invlpgb",
- "tlbsync",
- "movbe",
- "adcx",
- "adox",
- "prefetchw",
- "rdpid",
- "cmpxchg8b",
- "cmpxchg16b",
- "vmptrld",
- "vmptrst",
- "bzhi",
- "mulx",
- "shlx",
- "shrx",
- "sarx",
- "pdep",
- "pext",
- "rorx",
- "xrstors",
- "xrstors64",
- "xsavec",
- "xsavec64",
- "xsaves",
- "xsaves64",
- "rdfsbase",
- "rdgsbase",
- "wrfsbase",
- "wrgsbase",
- "crc32",
- "salc",
- "xlat",
-
- "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",
- "loopnz",
- "loopz",
- "loop",
- "jcxz",
- "pusha",
- "popa",
- "bound",
- "arpl",
- "aas",
- "aaa",
- "das",
- "daa",
- "aam",
- "aad",
- "movdir64b",
- "movdiri",
- "aesdec128kl",
- "aesdec256kl",
- "aesdecwide128kl",
- "aesdecwide256kl",
- "aesenc128kl",
- "aesenc256kl",
- "aesencwide128kl",
- "aesencwide256kl",
- "encodekey128",
- "encodekey256",
- "loadiwkey",
-
- // unsure
- "hreset",
-
- // 3dnow
- "femms",
- "pi2fw",
- "pi2fd",
- "pi2iw",
- "pi2id",
- "pmulhrw",
- "pfcmpge",
- "pfmin",
- "pfrcp",
- "pfrsqrt",
- "pfsub",
- "pfadd",
- "pfcmpgt",
- "pfmax",
- "pfrcpit1",
- "pfrsqit1",
- "pfsubr",
- "pfacc",
- "pfcmpeq",
- "pfmul",
- "pfmulhrw",
- "pfrcpit2",
- "pfnacc",
- "pfpnacc",
- "pswapd",
- "pavgusb",
-
- // ENQCMD
- "enqcmd",
- "enqcmds",
-
- // INVPCID,
- "invept",
- "invvpid",
- "invpcid",
-
- // PTWRITE
- "ptwrite",
-
- // GFNI
- "gf2p8affineqb",
- "gf2p8affineinvqb",
- "gf2p8mulb",
-
- // CET
- "wruss",
- "wrss",
- "incssp",
- "saveprevssp",
- "setssbsy",
- "clrssbsy",
- "rstorssp",
- "endbr64",
- "endbr32",
-
- // TDX
- "tdcall",
- "seamret",
- "seamops",
- "seamcall",
-
- // WAITPKG
- "tpause",
- "umonitor",
- "umwait",
-
- // UINTR
- "uiret",
- "testui",
- "clui",
- "stui",
- "senduipi",
-
- // TSXLDTRK
- "xsusldtrk",
- "xresldtrk",
-
- // AVX512F
- "valignd",
- "valignq",
- "vblendmpd",
- "vblendmps",
- "vcompresspd",
- "vcompressps",
- "vcvtpd2udq",
- "vcvttpd2udq",
- "vcvtps2udq",
- "vcvttps2udq",
- "vcvtqq2pd",
- "vcvtqq2ps",
- "vcvtsd2usi",
- "vcvttsd2usi",
- "vcvtss2usi",
- "vcvttss2usi",
- "vcvtudq2pd",
- "vcvtudq2ps",
- "vcvtusi2usd",
- "vcvtusi2uss",
- "vexpandpd",
- "vexpandps",
- "vextractf32x4",
- "vextractf64x4",
- "vextracti32x4",
- "vextracti64x4",
- "vfixupimmpd",
- "vfixupimmps",
- "vfixupimmsd",
- "vfixupimmss",
- "vgetexppd",
- "vgetexpps",
- "vgetexpsd",
- "vgetexpss",
- "vgetmantpd",
- "vgetmantps",
- "vgetmantsd",
- "vgetmantss",
- "vinsertf32x4",
- "vinsertf64x4",
- "vinserti64x4",
- "vmovdqa32",
- "vmovdqa64",
- "vmovdqu32",
- "vmovdqu64",
- "vpblendmd",
- "vpblendmq",
- "vpcmpd",
- "vpcmpud",
- "vpcmpq",
- "vpcmpuq",
- "vpcompressq",
- "vpcompressd",
- "vpermi2d",
- "vpermi2q",
- "vpermi2pd",
- "vpermi2ps",
- "vpermt2d",
- "vpermt2q",
- "vpermt2pd",
- "vpermt2ps",
- "vpmaxsq",
- "vpmaxuq",
- "vpminsq",
- "vpminuq",
- "vpmovsqb",
- "vpmovusqb",
- "vpmovsqw",
- "vpmovusqw",
- "vpmovsqd",
- "vpmovusqd",
- "vpmovsdb",
- "vpmovusdb",
- "vpmovsdw",
- "vpmovusdw",
- "vprold",
- "vprolq",
- "vprolvd",
- "vprolvq",
- "vprord",
- "vprorq",
- "vprorrd",
- "vprorrq",
- "vpscatterdd",
- "vpscatterdq",
- "vpscatterqd",
- "vpscatterqq",
- "vpsraq",
- "vpsravq",
- "vptestnmd",
- "vptestnmq",
- "vpternlogd",
- "vpternlogq",
- "vptestmd",
- "vptestmq",
- "vrcp14pd",
- "vrcp14ps",
- "vrcp14sd",
- "vrcp14ss",
- "vrndscalepd",
- "vrndscaleps",
- "vrndscalesd",
- "vrndscaless",
- "vrsqrt14pd",
- "vrsqrt14ps",
- "vrsqrt14sd",
- "vrsqrt14ss",
- "vscaledpd",
- "vscaledps",
- "vscaledsd",
- "vscaledss",
- "vscatterdd",
- "vscatterdq",
- "vscatterqd",
- "vscatterqq",
- "vshuff32x4",
- "vshuff64x2",
- "vshufi32x4",
- "vshufi64x2",
-
- // AVX512DQ
- "vcvttpd2qq",
- "vcvtpd2qq",
- "vcvttpd2uqq",
- "vcvtpd2uqq",
- "vcvttps2qq",
- "vcvtps2qq",
- "vcvttps2uqq",
- "vcvtps2uqq",
- "vcvtuqq2pd",
- "vcvtuqq2ps",
- "vextractf64x2",
- "vextracti64x2",
- "vfpclasspd",
- "vfpclassps",
- "vfpclasssd",
- "vfpclassss",
- "vinsertf64x2",
- "vinserti64x2",
- "vpmovm2d",
- "vpmovm2q",
- "vpmovb2d",
- "vpmovq2m",
- "vrangepd",
- "vrangeps",
- "vrangesd",
- "vrangess",
- "vreducepd",
- "vreduceps",
- "vreducesd",
- "vreducess",
-
- // AVX512BW
- "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",
-
- // AVX512CD
- "vpbroadcastm",
- "vpconflictd",
- "vpconflictq",
- "vplzcntd",
- "vplzcntq",
-
- "kunpckbw",
- "kunpckwd",
- "kunpckdq",
-
- "kaddb",
- "kandb",
- "kandnb",
- "kmovb",
- "knotb",
- "korb",
- "kortestb",
- "kshiftlb",
- "kshiftrb",
- "ktestb",
- "kxnorb",
- "kxorb",
- "kaddw",
- "kandw",
- "kandnw",
- "kmovw",
- "knotw",
- "korw",
- "kortestw",
- "kshiftlw",
- "kshiftrw",
- "ktestw",
- "kxnorw",
- "kxorw",
- "kaddd",
- "kandd",
- "kandnd",
- "kmovd",
- "knotd",
- "kord",
- "kortestd",
- "kshiftld",
- "kshiftrd",
- "ktestd",
- "kxnord",
- "kxord",
- "kaddq",
- "kandq",
- "kandnq",
- "kmovq",
- "knotq",
- "korq",
- "kortestq",
- "kshiftlq",
- "kshiftrq",
- "ktestq",
- "kxnorq",
- "kxorq",
-
- // AVX512ER
- "vexp2pd",
- "vexp2ps",
- "vexp2sd",
- "vexp2ss",
- "vrcp28pd",
- "vrcp28ps",
- "vrcp28sd",
- "vrcp28ss",
- "vrsqrt28pd",
- "vrsqrt28ps",
- "vrsqrt28sd",
- "vrsqrt28ss",
-
- // AVX512PF
- "vgatherpf0dpd",
- "vgatherpf0dps",
- "vgatherpf0qpd",
- "vgatherpf0qps",
- "vgatherpf1dpd",
- "vgatherpf1dps",
- "vgatherpf1qpd",
- "vgatherpf1qps",
- "vscatterpf0dpd",
- "vscatterpf0dps",
- "vscatterpf0qpd",
- "vscatterpf0qps",
- "vscatterpf1dpd",
- "vscatterpf1dps",
- "vscatterpf1qpd",
- "vscatterpf1qps",
-
- // MPX
- "bndmk",
- "bndcl",
- "bndcu",
- "bndcn",
- "bndmov",
- "bndldx",
- "bndstx",
-
-
-
- "vgf2p8affineqb",
- "vgf2p8affineinvqb",
- "vpshrdq",
- "vpshrdd",
- "vpshrdw",
- "vpshldq",
- "vpshldd",
- "vpshldw",
- "vbroadcastf32x8",
- "vbroadcastf64x4",
- "vbroadcastf32x4",
- "vbroadcastf64x2",
- "vbroadcastf32x2",
- "vbroadcasti32x8",
- "vbroadcasti64x4",
- "vbroadcasti32x4",
- "vbroadcasti64x2",
- "vbroadcasti32x2",
- "vextracti32x8",
- "vextractf32x8",
- "vinserti32x8",
- "vinsertf32x8",
- "vinserti32x4",
- "v4fnmaddss",
- "v4fnmaddps",
- "vcvtneps2bf16",
- "v4fmaddss",
- "v4fmaddps",
- "vcvtne2ps2bf16",
- "vp2intersectd",
- "vp2intersectq",
- "vp4dpwssds",
- "vp4dpwssd",
- "vpdpwssds",
- "vpdpwssd",
- "vpdpbusds",
- "vdpbf16ps",
- "vpbroadcastmw2d",
- "vpbroadcastmb2q",
- "vpmovd2m",
- "vpmovqd",
- "vpmovwb",
- "vpmovdb",
- "vpmovdw",
- "vpmovqb",
- "vpmovqw",
- "vgf2p8mulb",
- "vpmadd52huq",
- "vpmadd52luq",
- "vpshufbitqmb",
- "vpermb",
- "vpexpandd",
- "vpexpandq",
- "vpabsq",
- "vprorvd",
- "vprorvq",
- "vpmultishiftqb",
- "vpermt2b",
- "vpermt2w",
- "vpshrdvq",
- "vpshrdvd",
- "vpshrdvw",
- "vpshldvq",
- "vpshldvd",
- "vpshldvw",
- "vpcompressb",
- "vpcompressw",
- "vpexpandb",
- "vpexpandw",
- "vpopcntd",
- "vpopcntq",
- "vpopcntb",
- "vpopcntw",
- "vscalefss",
- "vscalefsd",
- "vscalefps",
- "vscalefpd",
- "vpdpbusd",
- "vcvtusi2sd",
- "vcvtusi2ss",
- "vpxord",
- "vpxorq",
- "vpord",
- "vporq",
- "vpandnd",
- "vpandnq",
- "vpandd",
- "vpandq",
- "psmash",
- "pvalidate",
- "rmpadjust",
- "rmpupdate",
-];
-
impl Opcode {
fn name(&self) -> &'static str {
unsafe {
- MNEMONICS.get_kinda_unchecked(*self as usize)
+ crate::generated::opcode::MNEMONICS.get_kinda_unchecked(*self as usize)
}
}
}
@@ -2523,6 +1053,10 @@ impl <T: fmt::Write, Y: YaxColors> Colorize<T, Y> for Opcode {
Opcode::VSCATTERDQ |
Opcode::VSCATTERQD |
Opcode::VSCATTERQQ |
+ Opcode::VSCATTERDPS |
+ Opcode::VSCATTERDPD |
+ Opcode::VSCATTERQPS |
+ Opcode::VSCATTERQPD |
Opcode::VPSCATTERDD |
Opcode::VPSCATTERDQ |
Opcode::VPSCATTERQD |
@@ -2711,6 +1245,8 @@ impl <T: fmt::Write, Y: YaxColors> Colorize<T, Y> for Opcode {
Opcode::VPINSRW |
Opcode::VPMASKMOVD |
Opcode::VPMASKMOVQ |
+ Opcode::VCOMPRESSD |
+ Opcode::VCOMPRESSQ |
Opcode::VCOMPRESSPD |
Opcode::VCOMPRESSPS |
Opcode::VPCOMPRESSQ |
diff --git a/src/real_mode/mod.rs b/src/real_mode/mod.rs
index cad9499..3181197 100644
--- a/src/real_mode/mod.rs
+++ b/src/real_mode/mod.rs
@@ -11,6 +11,7 @@ pub use self::display::{DisplayStyle, InstructionDisplayer};
use core::cmp::PartialEq;
use crate::safer_unchecked::unreachable_kinda_unchecked as unreachable_unchecked;
+pub use crate::generated::opcode::real_mode::Opcode as Opcode;
use yaxpeax_arch::{AddressDiff, Decoder, Reader, LengthedInstruction};
use yaxpeax_arch::annotation::{AnnotatingDecoder, DescriptionSink, NullSink};
@@ -997,1500 +998,6 @@ const XSAVE: [Opcode; 10] = [
Opcode::XSETBV,
];
-#[allow(non_camel_case_types)]
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
-#[non_exhaustive]
-pub enum Opcode {
- Invalid,
- ADD,
- OR,
- ADC,
- SBB,
- AND,
- XOR,
- SUB,
- CMP,
- XADD,
- BT,
- BTS,
- BTC,
- BTR,
- BSF,
- BSR,
- TZCNT,
- MOVSS,
- ADDSS,
- SUBSS,
- MULSS,
- DIVSS,
- MINSS,
- MAXSS,
- SQRTSS,
- MOVSD,
- SQRTSD,
- ADDSD,
- SUBSD,
- MULSD,
- DIVSD,
- MINSD,
- MAXSD,
- MOVSLDUP,
- MOVSHDUP,
- MOVDDUP,
- HADDPS,
- HSUBPS,
- ADDSUBPD,
- ADDSUBPS,
- CVTSI2SS,
- CVTSI2SD,
- CVTTSD2SI,
- CVTTPS2DQ,
- CVTPD2DQ,
- CVTPD2PS,
- CVTPS2DQ,
- CVTSD2SI,
- CVTSD2SS,
- CVTTSS2SI,
- CVTSS2SI,
- CVTSS2SD,
- CVTDQ2PD,
- LDDQU,
- MOVZX,
- MOVSX,
- MOVSXD,
- SAR,
- SAL,
- SHR,
- SHRD,
- SHL,
- RCR,
- RCL,
- ROR,
- ROL,
- INC,
- DEC,
- HLT,
- CALL,
- CALLF,
- JMP,
- JMPF,
- PUSH,
- POP,
- LEA,
- NOP,
- PREFETCHNTA,
- PREFETCH0,
- PREFETCH1,
- PREFETCH2,
- XCHG,
- POPF,
- INT,
- INTO,
- IRET,
- IRETD,
- IRETQ,
- RETF,
- ENTER,
- LEAVE,
- MOV,
- RETURN,
- PUSHF,
- WAIT,
- CBW,
- CWDE,
- CDQE,
- CWD,
- CDQ,
- CQO,
- LODS,
- STOS,
- LAHF,
- SAHF,
- CMPS,
- SCAS,
- MOVS,
- TEST,
- INS,
- IN,
- OUTS,
- OUT,
- IMUL,
- JO,
- JNO,
- JB,
- JNB,
- JZ,
- JNZ,
- JA,
- JNA,
- JS,
- JNS,
- JP,
- JNP,
- JL,
- JGE,
- JLE,
- JG,
- CMOVA,
- CMOVB,
- CMOVG,
- CMOVGE,
- CMOVL,
- CMOVLE,
- CMOVNA,
- CMOVNB,
- CMOVNO,
- CMOVNP,
- CMOVNS,
- CMOVNZ,
- CMOVO,
- CMOVP,
- CMOVS,
- CMOVZ,
- DIV,
- IDIV,
- MUL,
- NEG,
- NOT,
- CMPXCHG,
- SETO,
- SETNO,
- SETB,
- SETAE,
- SETZ,
- SETNZ,
- SETBE,
- SETA,
- SETS,
- SETNS,
- SETP,
- SETNP,
- SETL,
- SETGE,
- SETLE,
- SETG,
- CPUID,
- UD0,
- UD1,
- UD2,
- WBINVD,
- INVD,
- SYSRET,
- CLTS,
- SYSCALL,
- LSL,
- LAR,
- LES,
- LDS,
- SGDT,
- SIDT,
- LGDT,
- LIDT,
- SMSW,
- LMSW,
- SWAPGS,
- RDTSCP,
- INVLPG,
- FXSAVE,
- FXRSTOR,
- LDMXCSR,
- STMXCSR,
- XSAVE,
- XRSTOR,
- XSAVEOPT,
- LFENCE,
- MFENCE,
- SFENCE,
- CLFLUSH,
- CLFLUSHOPT,
- CLWB,
- WRMSR,
- RDTSC,
- RDMSR,
- RDPMC,
- SLDT,
- STR,
- LLDT,
- LTR,
- VERR,
- VERW,
- CMC,
- CLC,
- STC,
- CLI,
- STI,
- CLD,
- STD,
- JMPE,
- POPCNT,
- MOVDQU,
- MOVDQA,
- MOVQ,
- CMPSS,
- CMPSD,
- UNPCKLPS,
- UNPCKLPD,
- UNPCKHPS,
- UNPCKHPD,
- PSHUFHW,
- PSHUFLW,
- MOVUPS,
- MOVQ2DQ,
- MOVDQ2Q,
- RSQRTSS,
- RCPSS,
-
- ANDN,
- BEXTR,
- BLSI,
- BLSMSK,
- BLSR,
- VMCLEAR,
- VMXON,
- VMCALL,
- VMLAUNCH,
- VMRESUME,
- VMXOFF,
- PCONFIG,
- MONITOR,
- MWAIT,
- MONITORX,
- MWAITX,
- CLAC,
- STAC,
- ENCLS,
- ENCLV,
- XGETBV,
- XSETBV,
- VMFUNC,
- XABORT,
- XBEGIN,
- XEND,
- XTEST,
- ENCLU,
- RDPKRU,
- WRPKRU,
-
- RDPRU,
- CLZERO,
-
- RDSEED,
- RDRAND,
-
- ADDPS,
- ADDPD,
- ANDNPS,
- ANDNPD,
- ANDPS,
- ANDPD,
- BSWAP,
- CMPPD,
- CMPPS,
- COMISD,
- COMISS,
- CVTDQ2PS,
- CVTPI2PS,
- CVTPI2PD,
- CVTPS2PD,
- CVTPS2PI,
- CVTPD2PI,
- CVTTPS2PI,
- CVTTPD2PI,
- CVTTPD2DQ,
- DIVPS,
- DIVPD,
- EMMS,
- GETSEC,
- LFS,
- LGS,
- LSS,
- MASKMOVQ,
- MASKMOVDQU,
- MAXPS,
- MAXPD,
- MINPS,
- MINPD,
- MOVAPS,
- MOVAPD,
- MOVD,
- MOVLPS,
- MOVLPD,
- MOVHPS,
- MOVHPD,
- MOVLHPS,
- MOVHLPS,
- MOVUPD,
- MOVMSKPS,
- MOVMSKPD,
- MOVNTI,
- MOVNTPS,
- MOVNTPD,
- EXTRQ,
- INSERTQ,
- MOVNTSS,
- MOVNTSD,
- MOVNTQ,
- MOVNTDQ,
- MULPS,
- MULPD,
- ORPS,
- ORPD,
- PACKSSDW,
- PACKSSWB,
- PACKUSWB,
- PADDB,
- PADDD,
- PADDQ,
- PADDSB,
- PADDSW,
- PADDUSB,
- PADDUSW,
- PADDW,
- PAND,
- PANDN,
- PAVGB,
- PAVGW,
- PCMPEQB,
- PCMPEQD,
- PCMPEQW,
- PCMPGTB,
- PCMPGTD,
- PCMPGTW,
- PINSRW,
- PMADDWD,
- PMAXSW,
- PMAXUB,
- PMINSW,
- PMINUB,
- PMOVMSKB,
- PMULHUW,
- PMULHW,
- PMULLW,
- PMULUDQ,
- POR,
- PSADBW,
- PSHUFW,
- PSHUFD,
- PSLLD,
- PSLLDQ,
- PSLLQ,
- PSLLW,
- PSRAD,
- PSRAW,
- PSRLD,
- PSRLDQ,
- PSRLQ,
- PSRLW,
- PSUBB,
- PSUBD,
- PSUBQ,
- PSUBSB,
- PSUBSW,
- PSUBUSB,
- PSUBUSW,
- PSUBW,
- PUNPCKHBW,
- PUNPCKHDQ,
- PUNPCKHWD,
- PUNPCKLBW,
- PUNPCKLDQ,
- PUNPCKLWD,
- PUNPCKLQDQ,
- PUNPCKHQDQ,
- PXOR,
- RCPPS,
- RSM,
- RSQRTPS,
- SHLD,
- SHUFPD,
- SHUFPS,
- SLHD,
- SQRTPS,
- SQRTPD,
- SUBPS,
- SUBPD,
- SYSENTER,
- SYSEXIT,
- UCOMISD,
- UCOMISS,
- VMREAD,
- VMWRITE,
- XORPS,
- XORPD,
-
- VMOVDDUP,
- VPSHUFLW,
- VPSHUFHW,
- VHADDPS,
- VHSUBPS,
- VADDSUBPS,
- VCVTPD2DQ,
- VLDDQU,
-
- VCOMISD,
- VCOMISS,
- VUCOMISD,
- VUCOMISS,
- VADDPD,
- VADDPS,
- VADDSD,
- VADDSS,
- VADDSUBPD,
- VAESDEC,
- VAESDECLAST,
- VAESENC,
- VAESENCLAST,
- VAESIMC,
- VAESKEYGENASSIST,
- VBLENDPD,
- VBLENDPS,
- VBLENDVPD,
- VBLENDVPS,
- VBROADCASTF128,
- VBROADCASTI128,
- VBROADCASTSD,
- VBROADCASTSS,
- VCMPSD,
- VCMPSS,
- VCMPPD,
- VCMPPS,
- VCVTDQ2PD,
- VCVTDQ2PS,
- VCVTPD2PS,
- VCVTPH2PS,
- VCVTPS2DQ,
- VCVTPS2PD,
- VCVTSS2SD,
- VCVTSI2SS,
- VCVTSI2SD,
- VCVTSD2SI,
- VCVTSD2SS,
- VCVTPS2PH,
- VCVTSS2SI,
- VCVTTPD2DQ,
- VCVTTPS2DQ,
- VCVTTSS2SI,
- VCVTTSD2SI,
- VDIVPD,
- VDIVPS,
- VDIVSD,
- VDIVSS,
- VDPPD,
- VDPPS,
- VEXTRACTF128,
- VEXTRACTI128,
- VEXTRACTPS,
- 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,
- VGATHERDPD,
- VGATHERDPS,
- VGATHERQPD,
- VGATHERQPS,
- VHADDPD,
- VHSUBPD,
- VINSERTF128,
- VINSERTI128,
- VINSERTPS,
- VMASKMOVDQU,
- VMASKMOVPD,
- VMASKMOVPS,
- VMAXPD,
- VMAXPS,
- VMAXSD,
- VMAXSS,
- VMINPD,
- VMINPS,
- VMINSD,
- VMINSS,
- VMOVAPD,
- VMOVAPS,
- VMOVD,
- VMOVDQA,
- VMOVDQU,
- VMOVHLPS,
- VMOVHPD,
- VMOVHPS,
- VMOVLHPS,
- VMOVLPD,
- VMOVLPS,
- VMOVMSKPD,
- VMOVMSKPS,
- VMOVNTDQ,
- VMOVNTDQA,
- VMOVNTPD,
- VMOVNTPS,
- VMOVQ,
- VMOVSS,
- VMOVSD,
- VMOVSHDUP,
- VMOVSLDUP,
- VMOVUPD,
- VMOVUPS,
- VMPSADBW,
- VMULPD,
- VMULPS,
- VMULSD,
- VMULSS,
- VPABSB,
- VPABSD,
- VPABSW,
- VPACKSSDW,
- VPACKUSDW,
- VPACKSSWB,
- VPACKUSWB,
- VPADDB,
- VPADDD,
- VPADDQ,
- VPADDSB,
- VPADDSW,
- VPADDUSB,
- VPADDUSW,
- VPADDW,
- VPALIGNR,
- VANDPD,
- VANDPS,
- VORPD,
- VORPS,
- VANDNPD,
- VANDNPS,
- VPAND,
- VPANDN,
- VPAVGB,
- VPAVGW,
- VPBLENDD,
- VPBLENDVB,
- VPBLENDW,
- VPBROADCASTB,
- VPBROADCASTD,
- VPBROADCASTQ,
- VPBROADCASTW,
- VPCLMULQDQ,
- VPCMPEQB,
- VPCMPEQD,
- VPCMPEQQ,
- VPCMPEQW,
- VPCMPGTB,
- VPCMPGTD,
- VPCMPGTQ,
- VPCMPGTW,
- VPCMPESTRI,
- VPCMPESTRM,
- VPCMPISTRI,
- VPCMPISTRM,
- VPERM2F128,
- VPERM2I128,
- VPERMD,
- VPERMILPD,
- VPERMILPS,
- VPERMPD,
- VPERMPS,
- VPERMQ,
- VPEXTRB,
- VPEXTRD,
- VPEXTRQ,
- VPEXTRW,
- VPGATHERDD,
- VPGATHERDQ,
- VPGATHERQD,
- VPGATHERQQ,
- VPHADDD,
- VPHADDSW,
- VPHADDW,
- VPMADDUBSW,
- VPHMINPOSUW,
- VPHSUBD,
- VPHSUBSW,
- VPHSUBW,
- VPINSRB,
- VPINSRD,
- VPINSRQ,
- VPINSRW,
- VPMADDWD,
- VPMASKMOVD,
- VPMASKMOVQ,
- VPMAXSB,
- VPMAXSD,
- VPMAXSW,
- VPMAXUB,
- VPMAXUW,
- VPMAXUD,
- VPMINSB,
- VPMINSW,
- VPMINSD,
- VPMINUB,
- VPMINUW,
- VPMINUD,
- VPMOVMSKB,
- VPMOVSXBD,
- VPMOVSXBQ,
- VPMOVSXBW,
- VPMOVSXDQ,
- VPMOVSXWD,
- VPMOVSXWQ,
- VPMOVZXBD,
- VPMOVZXBQ,
- VPMOVZXBW,
- VPMOVZXDQ,
- VPMOVZXWD,
- VPMOVZXWQ,
- VPMULDQ,
- VPMULHRSW,
- VPMULHUW,
- VPMULHW,
- VPMULLQ,
- VPMULLD,
- VPMULLW,
- VPMULUDQ,
- VPOR,
- VPSADBW,
- VPSHUFB,
- VPSHUFD,
- VPSIGNB,
- VPSIGND,
- VPSIGNW,
- VPSLLD,
- VPSLLDQ,
- VPSLLQ,
- VPSLLVD,
- VPSLLVQ,
- VPSLLW,
- VPSRAD,
- VPSRAVD,
- VPSRAW,
- VPSRLD,
- VPSRLDQ,
- VPSRLQ,
- VPSRLVD,
- VPSRLVQ,
- VPSRLW,
- VPSUBB,
- VPSUBD,
- VPSUBQ,
- VPSUBSB,
- VPSUBSW,
- VPSUBUSB,
- VPSUBUSW,
- VPSUBW,
- VPTEST,
- VPUNPCKHBW,
- VPUNPCKHDQ,
- VPUNPCKHQDQ,
- VPUNPCKHWD,
- VPUNPCKLBW,
- VPUNPCKLDQ,
- VPUNPCKLQDQ,
- VPUNPCKLWD,
- VPXOR,
- VRCPPS,
- VROUNDPD,
- VROUNDPS,
- VROUNDSD,
- VROUNDSS,
- VRSQRTPS,
- VRSQRTSS,
- VRCPSS,
- VSHUFPD,
- VSHUFPS,
- VSQRTPD,
- VSQRTPS,
- VSQRTSS,
- VSQRTSD,
- VSUBPD,
- VSUBPS,
- VSUBSD,
- VSUBSS,
- VTESTPD,
- VTESTPS,
- VUNPCKHPD,
- VUNPCKHPS,
- VUNPCKLPD,
- VUNPCKLPS,
- VXORPD,
- VXORPS,
- VZEROUPPER,
- VZEROALL,
- VLDMXCSR,
- VSTMXCSR,
-
- PCLMULQDQ,
- AESKEYGENASSIST,
- AESIMC,
- AESENC,
- AESENCLAST,
- AESDEC,
- AESDECLAST,
- PCMPGTQ,
- PCMPISTRM,
- PCMPISTRI,
- PCMPESTRI,
- PACKUSDW,
- PCMPESTRM,
- PCMPEQQ,
- PTEST,
- PHMINPOSUW,
- DPPS,
- DPPD,
- MPSADBW,
- PMOVZXDQ,
- PMOVSXDQ,
- PMOVZXBD,
- PMOVSXBD,
- PMOVZXWQ,
- PMOVSXWQ,
- PMOVZXBQ,
- PMOVSXBQ,
- PMOVSXWD,
- PMOVZXWD,
- PEXTRQ,
- PEXTRD,
- PEXTRW,
- PEXTRB,
- PMOVSXBW,
- PMOVZXBW,
- PINSRQ,
- PINSRD,
- PINSRB,
- EXTRACTPS,
- INSERTPS,
- ROUNDSS,
- ROUNDSD,
- ROUNDPS,
- ROUNDPD,
- PMAXSB,
- PMAXSD,
- PMAXUW,
- PMAXUD,
- PMINSD,
- PMINSB,
- PMINUD,
- PMINUW,
- BLENDW,
- PBLENDVB,
- PBLENDW,
- BLENDVPS,
- BLENDVPD,
- BLENDPS,
- BLENDPD,
- PMULDQ,
- MOVNTDQA,
- PMULLD,
- PALIGNR,
- PSIGNW,
- PSIGND,
- PSIGNB,
- PSHUFB,
- PMULHRSW,
- PMADDUBSW,
- PABSD,
- PABSW,
- PABSB,
- PHSUBSW,
- PHSUBW,
- PHSUBD,
- PHADDD,
- PHADDSW,
- PHADDW,
- HSUBPD,
- HADDPD,
-
- SHA1RNDS4,
- SHA1NEXTE,
- SHA1MSG1,
- SHA1MSG2,
- SHA256RNDS2,
- SHA256MSG1,
- SHA256MSG2,
-
- LZCNT,
- CLGI,
- STGI,
- SKINIT,
- VMLOAD,
- VMMCALL,
- VMSAVE,
- VMRUN,
- INVLPGA,
- INVLPGB,
- TLBSYNC,
-
- MOVBE,
-
- ADCX,
- ADOX,
-
- PREFETCHW,
-
- RDPID,
- CMPXCHG8B,
- CMPXCHG16B,
- VMPTRLD,
- VMPTRST,
-
- BZHI,
- MULX,
- SHLX,
- SHRX,
- SARX,
- PDEP,
- PEXT,
- RORX,
- XRSTORS,
- XRSTORS64,
- XSAVEC,
- XSAVEC64,
- XSAVES,
- XSAVES64,
-
- RDFSBASE,
- RDGSBASE,
- WRFSBASE,
- WRGSBASE,
-
- CRC32,
- SALC,
- XLAT,
-
- 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,
-
- LOOPNZ,
- LOOPZ,
- LOOP,
- JCXZ,
-
- PUSHA,
- POPA,
- BOUND,
- ARPL,
- AAS,
- AAA,
- DAS,
- DAA,
- AAM,
- AAD,
-
- // started shipping in Tremont, 2020 sept 23
- MOVDIR64B,
- MOVDIRI,
-
- // started shipping in Tiger Lake, 2020 sept 2
- AESDEC128KL,
- AESDEC256KL,
- AESDECWIDE128KL,
- AESDECWIDE256KL,
- AESENC128KL,
- AESENC256KL,
- AESENCWIDE128KL,
- AESENCWIDE256KL,
- ENCODEKEY128,
- ENCODEKEY256,
- LOADIWKEY,
-
- // unsure
- HRESET,
-
- // 3dnow
- 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,
-
- // ENQCMD
- ENQCMD,
- ENQCMDS,
-
- // INVPCID
- INVEPT,
- INVVPID,
- INVPCID,
-
- // PTWRITE
- PTWRITE,
-
- // GFNI
- GF2P8AFFINEQB,
- GF2P8AFFINEINVQB,
- GF2P8MULB,
-
- // CET
- WRUSS,
- WRSS,
- INCSSP,
- SAVEPREVSSP,
- SETSSBSY,
- CLRSSBSY,
- RSTORSSP,
- ENDBR64,
- ENDBR32,
-
- // TDX
- TDCALL,
- SEAMRET,
- SEAMOPS,
- SEAMCALL,
-
- // WAITPKG
- TPAUSE,
- UMONITOR,
- UMWAIT,
-
- // UINTR
- UIRET,
- TESTUI,
- CLUI,
- STUI,
- SENDUIPI,
-
- // TSXLDTRK
- XSUSLDTRK,
- XRESLDTRK,
-
- // AVX512F
- VALIGND,
- VALIGNQ,
- VBLENDMPD,
- VBLENDMPS,
- VCOMPRESSPD,
- VCOMPRESSPS,
- VCVTPD2UDQ,
- VCVTTPD2UDQ,
- VCVTPS2UDQ,
- VCVTTPS2UDQ,
- VCVTQQ2PD,
- VCVTQQ2PS,
- VCVTSD2USI,
- VCVTTSD2USI,
- VCVTSS2USI,
- VCVTTSS2USI,
- VCVTUDQ2PD,
- VCVTUDQ2PS,
- VCVTUSI2USD,
- VCVTUSI2USS,
- VEXPANDPD,
- VEXPANDPS,
- VEXTRACTF32X4,
- VEXTRACTF64X4,
- VEXTRACTI32X4,
- VEXTRACTI64X4,
- VFIXUPIMMPD,
- VFIXUPIMMPS,
- VFIXUPIMMSD,
- VFIXUPIMMSS,
- VGETEXPPD,
- VGETEXPPS,
- VGETEXPSD,
- VGETEXPSS,
- VGETMANTPD,
- VGETMANTPS,
- VGETMANTSD,
- VGETMANTSS,
- VINSERTF32X4,
- VINSERTF64X4,
- VINSERTI64X4,
- VMOVDQA32,
- VMOVDQA64,
- VMOVDQU32,
- VMOVDQU64,
- VPBLENDMD,
- VPBLENDMQ,
- VPCMPD,
- VPCMPUD,
- VPCMPQ,
- VPCMPUQ,
- VPCOMPRESSQ,
- VPCOMPRESSD,
- VPERMI2D,
- VPERMI2Q,
- VPERMI2PD,
- VPERMI2PS,
- VPERMT2D,
- VPERMT2Q,
- VPERMT2PD,
- VPERMT2PS,
- VPMAXSQ,
- VPMAXUQ,
- VPMINSQ,
- VPMINUQ,
- VPMOVSQB,
- VPMOVUSQB,
- VPMOVSQW,
- VPMOVUSQW,
- VPMOVSQD,
- VPMOVUSQD,
- VPMOVSDB,
- VPMOVUSDB,
- VPMOVSDW,
- VPMOVUSDW,
- VPROLD,
- VPROLQ,
- VPROLVD,
- VPROLVQ,
- VPRORD,
- VPRORQ,
- VPRORRD,
- VPRORRQ,
- VPSCATTERDD,
- VPSCATTERDQ,
- VPSCATTERQD,
- VPSCATTERQQ,
- VPSRAQ,
- VPSRAVQ,
- VPTESTNMD,
- VPTESTNMQ,
- VPTERNLOGD,
- VPTERNLOGQ,
- VPTESTMD,
- VPTESTMQ,
- VRCP14PD,
- VRCP14PS,
- VRCP14SD,
- VRCP14SS,
- VRNDSCALEPD,
- VRNDSCALEPS,
- VRNDSCALESD,
- VRNDSCALESS,
- VRSQRT14PD,
- VRSQRT14PS,
- VRSQRT14SD,
- VRSQRT14SS,
- VSCALEDPD,
- VSCALEDPS,
- VSCALEDSD,
- VSCALEDSS,
- VSCATTERDD,
- VSCATTERDQ,
- VSCATTERQD,
- VSCATTERQQ,
- VSHUFF32X4,
- VSHUFF64X2,
- VSHUFI32X4,
- VSHUFI64X2,
-
- // AVX512DQ
- VCVTTPD2QQ,
- VCVTPD2QQ,
- VCVTTPD2UQQ,
- VCVTPD2UQQ,
- VCVTTPS2QQ,
- VCVTPS2QQ,
- VCVTTPS2UQQ,
- VCVTPS2UQQ,
- VCVTUQQ2PD,
- VCVTUQQ2PS,
- VEXTRACTF64X2,
- VEXTRACTI64X2,
- VFPCLASSPD,
- VFPCLASSPS,
- VFPCLASSSD,
- VFPCLASSSS,
- VINSERTF64X2,
- VINSERTI64X2,
- VPMOVM2D,
- VPMOVM2Q,
- VPMOVB2D,
- VPMOVQ2M,
- VRANGEPD,
- VRANGEPS,
- VRANGESD,
- VRANGESS,
- VREDUCEPD,
- VREDUCEPS,
- VREDUCESD,
- VREDUCESS,
-
- // AVX512BW
- 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,
-
- // AVX512CD
- VPBROADCASTM,
- VPCONFLICTD,
- VPCONFLICTQ,
- VPLZCNTD,
- VPLZCNTQ,
-
- KUNPCKBW,
- KUNPCKWD,
- KUNPCKDQ,
-
- KADDB,
- KANDB,
- KANDNB,
- KMOVB,
- KNOTB,
- KORB,
- KORTESTB,
- KSHIFTLB,
- KSHIFTRB,
- KTESTB,
- KXNORB,
- KXORB,
- KADDW,
- KANDW,
- KANDNW,
- KMOVW,
- KNOTW,
- KORW,
- KORTESTW,
- KSHIFTLW,
- KSHIFTRW,
- KTESTW,
- KXNORW,
- KXORW,
- KADDD,
- KANDD,
- KANDND,
- KMOVD,
- KNOTD,
- KORD,
- KORTESTD,
- KSHIFTLD,
- KSHIFTRD,
- KTESTD,
- KXNORD,
- KXORD,
- KADDQ,
- KANDQ,
- KANDNQ,
- KMOVQ,
- KNOTQ,
- KORQ,
- KORTESTQ,
- KSHIFTLQ,
- KSHIFTRQ,
- KTESTQ,
- KXNORQ,
- KXORQ,
-
- // AVX512ER
- VEXP2PD,
- VEXP2PS,
- VEXP2SD,
- VEXP2SS,
- VRCP28PD,
- VRCP28PS,
- VRCP28SD,
- VRCP28SS,
- VRSQRT28PD,
- VRSQRT28PS,
- VRSQRT28SD,
- VRSQRT28SS,
-
- // AVX512PF
- VGATHERPF0DPD,
- VGATHERPF0DPS,
- VGATHERPF0QPD,
- VGATHERPF0QPS,
- VGATHERPF1DPD,
- VGATHERPF1DPS,
- VGATHERPF1QPD,
- VGATHERPF1QPS,
- VSCATTERPF0DPD,
- VSCATTERPF0DPS,
- VSCATTERPF0QPD,
- VSCATTERPF0QPS,
- VSCATTERPF1DPD,
- VSCATTERPF1DPS,
- VSCATTERPF1QPD,
- VSCATTERPF1QPS,
-
- // MPX
- BNDMK,
- BNDCL,
- BNDCU,
- BNDCN,
- BNDMOV,
- BNDLDX,
- BNDSTX,
-
- VGF2P8AFFINEQB,
- VGF2P8AFFINEINVQB,
- VPSHRDQ,
- VPSHRDD,
- VPSHRDW,
- VPSHLDQ,
- VPSHLDD,
- VPSHLDW,
- VBROADCASTF32X8,
- VBROADCASTF64X4,
- VBROADCASTF32X4,
- VBROADCASTF64X2,
- VBROADCASTF32X2,
- VBROADCASTI32X8,
- VBROADCASTI64X4,
- VBROADCASTI32X4,
- VBROADCASTI64X2,
- VBROADCASTI32X2,
- VEXTRACTI32X8,
- VEXTRACTF32X8,
- VINSERTI32X8,
- VINSERTF32X8,
- VINSERTI32X4,
- V4FNMADDSS,
- V4FNMADDPS,
- VCVTNEPS2BF16,
- V4FMADDSS,
- V4FMADDPS,
- VCVTNE2PS2BF16,
- VP2INTERSECTD,
- VP2INTERSECTQ,
- VP4DPWSSDS,
- VP4DPWSSD,
- VPDPWSSDS,
- VPDPWSSD,
- VPDPBUSDS,
- VDPBF16PS,
- VPBROADCASTMW2D,
- VPBROADCASTMB2Q,
- VPMOVD2M,
- VPMOVQD,
- VPMOVWB,
- VPMOVDB,
- VPMOVDW,
- VPMOVQB,
- VPMOVQW,
- VGF2P8MULB,
- VPMADD52HUQ,
- VPMADD52LUQ,
- VPSHUFBITQMB,
- VPERMB,
- VPEXPANDD,
- VPEXPANDQ,
- VPABSQ,
- VPRORVD,
- VPRORVQ,
- VPMULTISHIFTQB,
- VPERMT2B,
- VPERMT2W,
- VPSHRDVQ,
- VPSHRDVD,
- VPSHRDVW,
- VPSHLDVQ,
- VPSHLDVD,
- VPSHLDVW,
- VPCOMPRESSB,
- VPCOMPRESSW,
- VPEXPANDB,
- VPEXPANDW,
- VPOPCNTD,
- VPOPCNTQ,
- VPOPCNTB,
- VPOPCNTW,
- VSCALEFSS,
- VSCALEFSD,
- VSCALEFPS,
- VSCALEFPD,
- VPDPBUSD,
- VCVTUSI2SD,
- VCVTUSI2SS,
- VPXORD,
- VPXORQ,
- VPORD,
- VPORQ,
- VPANDND,
- VPANDNQ,
- VPANDD,
- VPANDQ,
-
- PSMASH,
- PVALIDATE,
- RMPADJUST,
- RMPUPDATE,
-}
-
impl PartialEq for Instruction {
fn eq(&self, other: &Self) -> bool {
if self.prefixes != other.prefixes {
@@ -2544,7 +1051,7 @@ pub struct Instruction {
operands: [OperandSpec; 4],
imm: u32,
disp: u32,
- opcode: Opcode,
+ pub(crate) opcode: Opcode,
mem_size: u8,
}
@@ -3431,666 +1938,6 @@ impl InstDecoder {
self.flags |= 1 << 63;
self
}
-
- /// Optionally reject or reinterpret instruction according to the decoder's
- /// declared extensions.
- fn revise_instruction(&self, inst: &mut Instruction) -> Result<(), DecodeError> {
- if inst.prefixes.evex().is_some() {
- if !self.avx512() {
- return Err(DecodeError::InvalidOpcode);
- } else {
- return Ok(());
- }
- }
- match inst.opcode {
- Opcode::TZCNT => {
- if !self.bmi1() {
- // tzcnt is only supported if bmi1 is enabled. without bmi1, this decodes as
- // bsf.
- inst.opcode = Opcode::BSF;
- }
- }
- Opcode::LDDQU |
- Opcode::ADDSUBPS |
- Opcode::ADDSUBPD |
- Opcode::HADDPS |
- Opcode::HSUBPS |
- Opcode::HADDPD |
- Opcode::HSUBPD |
- Opcode::MOVSHDUP |
- Opcode::MOVSLDUP |
- Opcode::MOVDDUP |
- Opcode::MONITOR |
- Opcode::MWAIT => {
- // via Intel section 5.7, SSE3 Instructions
- if !self.sse3() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::PHADDW |
- Opcode::PHADDSW |
- Opcode::PHADDD |
- Opcode::PHSUBW |
- Opcode::PHSUBSW |
- Opcode::PHSUBD |
- Opcode::PABSB |
- Opcode::PABSW |
- Opcode::PABSD |
- Opcode::PMADDUBSW |
- Opcode::PMULHRSW |
- Opcode::PSHUFB |
- Opcode::PSIGNB |
- Opcode::PSIGNW |
- Opcode::PSIGND |
- Opcode::PALIGNR => {
- // via Intel section 5.8, SSSE3 Instructions
- if !self.ssse3() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::PMULLD |
- Opcode::PMULDQ |
- Opcode::MOVNTDQA |
- Opcode::BLENDPD |
- Opcode::BLENDPS |
- Opcode::BLENDVPD |
- Opcode::BLENDVPS |
- Opcode::PBLENDVB |
- Opcode::BLENDW |
- Opcode::PMINUW |
- Opcode::PMINUD |
- Opcode::PMINSB |
- Opcode::PMINSD |
- Opcode::PMAXUW |
- Opcode::PMAXUD |
- Opcode::PMAXSB |
- Opcode::PMAXSD |
- Opcode::ROUNDPS |
- Opcode::ROUNDPD |
- Opcode::ROUNDSS |
- Opcode::ROUNDSD |
- Opcode::PBLENDW |
- Opcode::EXTRACTPS |
- Opcode::INSERTPS |
- Opcode::PINSRB |
- Opcode::PINSRD |
- Opcode::PINSRQ |
- Opcode::PMOVSXBW |
- Opcode::PMOVZXBW |
- Opcode::PMOVSXBD |
- Opcode::PMOVZXBD |
- Opcode::PMOVSXWD |
- Opcode::PMOVZXWD |
- Opcode::PMOVSXBQ |
- Opcode::PMOVZXBQ |
- Opcode::PMOVSXWQ |
- Opcode::PMOVZXWQ |
- Opcode::PMOVSXDQ |
- Opcode::PMOVZXDQ |
- Opcode::DPPS |
- Opcode::DPPD |
- Opcode::MPSADBW |
- Opcode::PHMINPOSUW |
- Opcode::PTEST |
- Opcode::PCMPEQQ |
- Opcode::PEXTRB |
- Opcode::PEXTRW |
- Opcode::PEXTRD |
- Opcode::PEXTRQ |
- Opcode::PACKUSDW => {
- // via Intel section 5.10, SSE4.1 Instructions
- if !self.sse4_1() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::EXTRQ |
- Opcode::INSERTQ |
- Opcode::MOVNTSS |
- Opcode::MOVNTSD => {
- if !self.sse4a() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::CRC32 |
- Opcode::PCMPESTRI |
- Opcode::PCMPESTRM |
- Opcode::PCMPISTRI |
- Opcode::PCMPISTRM |
- Opcode::PCMPGTQ => {
- // via Intel section 5.11, SSE4.2 Instructions
- if !self.sse4_2() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::AESDEC |
- Opcode::AESDECLAST |
- Opcode::AESENC |
- Opcode::AESENCLAST |
- Opcode::AESIMC |
- Opcode::AESKEYGENASSIST => {
- // via Intel section 5.12. AESNI AND PCLMULQDQ
- if !self.aesni() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::PCLMULQDQ => {
- // via Intel section 5.12. AESNI AND PCLMULQDQ
- if !self.pclmulqdq() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::XABORT |
- Opcode::XBEGIN |
- Opcode::XEND |
- Opcode::XTEST => {
- if !self.tsx() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::SHA1MSG1 |
- Opcode::SHA1MSG2 |
- Opcode::SHA1NEXTE |
- Opcode::SHA1RNDS4 |
- Opcode::SHA256MSG1 |
- Opcode::SHA256MSG2 |
- Opcode::SHA256RNDS2 => {
- if !self.sha() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::ENCLV |
- Opcode::ENCLS |
- Opcode::ENCLU => {
- if !self.sgx() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- // AVX...
- Opcode::VMOVDDUP |
- Opcode::VPSHUFLW |
- Opcode::VPSHUFHW |
- Opcode::VHADDPS |
- Opcode::VHSUBPS |
- Opcode::VADDSUBPS |
- Opcode::VCVTPD2DQ |
- Opcode::VLDDQU |
- Opcode::VCOMISD |
- Opcode::VCOMISS |
- Opcode::VUCOMISD |
- Opcode::VUCOMISS |
- Opcode::VADDPD |
- Opcode::VADDPS |
- Opcode::VADDSD |
- Opcode::VADDSS |
- Opcode::VADDSUBPD |
- Opcode::VBLENDPD |
- Opcode::VBLENDPS |
- Opcode::VBLENDVPD |
- Opcode::VBLENDVPS |
- Opcode::VBROADCASTF128 |
- Opcode::VBROADCASTI128 |
- Opcode::VBROADCASTSD |
- Opcode::VBROADCASTSS |
- Opcode::VCMPSD |
- Opcode::VCMPSS |
- Opcode::VCMPPD |
- Opcode::VCMPPS |
- Opcode::VCVTDQ2PD |
- Opcode::VCVTDQ2PS |
- Opcode::VCVTPD2PS |
- Opcode::VCVTPS2DQ |
- Opcode::VCVTPS2PD |
- Opcode::VCVTSS2SD |
- Opcode::VCVTSI2SS |
- Opcode::VCVTSI2SD |
- Opcode::VCVTSD2SI |
- Opcode::VCVTSD2SS |
- Opcode::VCVTSS2SI |
- Opcode::VCVTTPD2DQ |
- Opcode::VCVTTPS2DQ |
- Opcode::VCVTTSS2SI |
- Opcode::VCVTTSD2SI |
- Opcode::VDIVPD |
- Opcode::VDIVPS |
- Opcode::VDIVSD |
- Opcode::VDIVSS |
- Opcode::VDPPD |
- Opcode::VDPPS |
- Opcode::VEXTRACTF128 |
- Opcode::VEXTRACTI128 |
- Opcode::VEXTRACTPS |
- Opcode::VFMADD132PD |
- Opcode::VFMADD132PS |
- Opcode::VFMADD132SD |
- Opcode::VFMADD132SS |
- Opcode::VFMADD213PD |
- Opcode::VFMADD213PS |
- Opcode::VFMADD213SD |
- Opcode::VFMADD213SS |
- Opcode::VFMADD231PD |
- Opcode::VFMADD231PS |
- Opcode::VFMADD231SD |
- Opcode::VFMADD231SS |
- Opcode::VFMADDSUB132PD |
- Opcode::VFMADDSUB132PS |
- Opcode::VFMADDSUB213PD |
- Opcode::VFMADDSUB213PS |
- Opcode::VFMADDSUB231PD |
- Opcode::VFMADDSUB231PS |
- Opcode::VFMSUB132PD |
- Opcode::VFMSUB132PS |
- Opcode::VFMSUB132SD |
- Opcode::VFMSUB132SS |
- Opcode::VFMSUB213PD |
- Opcode::VFMSUB213PS |
- Opcode::VFMSUB213SD |
- Opcode::VFMSUB213SS |
- Opcode::VFMSUB231PD |
- Opcode::VFMSUB231PS |
- Opcode::VFMSUB231SD |
- Opcode::VFMSUB231SS |
- Opcode::VFMSUBADD132PD |
- Opcode::VFMSUBADD132PS |
- Opcode::VFMSUBADD213PD |
- Opcode::VFMSUBADD213PS |
- Opcode::VFMSUBADD231PD |
- Opcode::VFMSUBADD231PS |
- Opcode::VFNMADD132PD |
- Opcode::VFNMADD132PS |
- Opcode::VFNMADD132SD |
- Opcode::VFNMADD132SS |
- Opcode::VFNMADD213PD |
- Opcode::VFNMADD213PS |
- Opcode::VFNMADD213SD |
- Opcode::VFNMADD213SS |
- Opcode::VFNMADD231PD |
- Opcode::VFNMADD231PS |
- Opcode::VFNMADD231SD |
- Opcode::VFNMADD231SS |
- Opcode::VFNMSUB132PD |
- Opcode::VFNMSUB132PS |
- Opcode::VFNMSUB132SD |
- Opcode::VFNMSUB132SS |
- Opcode::VFNMSUB213PD |
- Opcode::VFNMSUB213PS |
- Opcode::VFNMSUB213SD |
- Opcode::VFNMSUB213SS |
- Opcode::VFNMSUB231PD |
- Opcode::VFNMSUB231PS |
- Opcode::VFNMSUB231SD |
- Opcode::VFNMSUB231SS |
- Opcode::VGATHERDPD |
- Opcode::VGATHERDPS |
- Opcode::VGATHERQPD |
- Opcode::VGATHERQPS |
- Opcode::VHADDPD |
- Opcode::VHSUBPD |
- Opcode::VINSERTF128 |
- Opcode::VINSERTI128 |
- Opcode::VINSERTPS |
- Opcode::VMASKMOVDQU |
- Opcode::VMASKMOVPD |
- Opcode::VMASKMOVPS |
- Opcode::VMAXPD |
- Opcode::VMAXPS |
- Opcode::VMAXSD |
- Opcode::VMAXSS |
- Opcode::VMINPD |
- Opcode::VMINPS |
- Opcode::VMINSD |
- Opcode::VMINSS |
- Opcode::VMOVAPD |
- Opcode::VMOVAPS |
- Opcode::VMOVD |
- Opcode::VMOVDQA |
- Opcode::VMOVDQU |
- Opcode::VMOVHLPS |
- Opcode::VMOVHPD |
- Opcode::VMOVHPS |
- Opcode::VMOVLHPS |
- Opcode::VMOVLPD |
- Opcode::VMOVLPS |
- Opcode::VMOVMSKPD |
- Opcode::VMOVMSKPS |
- Opcode::VMOVNTDQ |
- Opcode::VMOVNTDQA |
- Opcode::VMOVNTPD |
- Opcode::VMOVNTPS |
- Opcode::VMOVQ |
- Opcode::VMOVSS |
- Opcode::VMOVSD |
- Opcode::VMOVSHDUP |
- Opcode::VMOVSLDUP |
- Opcode::VMOVUPD |
- Opcode::VMOVUPS |
- Opcode::VMPSADBW |
- Opcode::VMULPD |
- Opcode::VMULPS |
- Opcode::VMULSD |
- Opcode::VMULSS |
- Opcode::VPABSB |
- Opcode::VPABSD |
- Opcode::VPABSW |
- Opcode::VPACKSSDW |
- Opcode::VPACKUSDW |
- Opcode::VPACKSSWB |
- Opcode::VPACKUSWB |
- Opcode::VPADDB |
- Opcode::VPADDD |
- Opcode::VPADDQ |
- Opcode::VPADDSB |
- Opcode::VPADDSW |
- Opcode::VPADDUSB |
- Opcode::VPADDUSW |
- Opcode::VPADDW |
- Opcode::VPALIGNR |
- Opcode::VPAND |
- Opcode::VANDPD |
- Opcode::VANDPS |
- Opcode::VANDNPD |
- Opcode::VANDNPS |
- Opcode::VORPD |
- Opcode::VORPS |
- Opcode::VPANDN |
- Opcode::VPAVGB |
- Opcode::VPAVGW |
- Opcode::VPBLENDD |
- Opcode::VPBLENDVB |
- Opcode::VPBLENDW |
- Opcode::VPBROADCASTB |
- Opcode::VPBROADCASTD |
- Opcode::VPBROADCASTQ |
- Opcode::VPBROADCASTW |
- Opcode::VPCLMULQDQ |
- Opcode::VPCMPEQB |
- Opcode::VPCMPEQD |
- Opcode::VPCMPEQQ |
- Opcode::VPCMPEQW |
- Opcode::VPCMPGTB |
- Opcode::VPCMPGTD |
- Opcode::VPCMPGTQ |
- Opcode::VPCMPGTW |
- Opcode::VPCMPESTRI |
- Opcode::VPCMPESTRM |
- Opcode::VPCMPISTRI |
- Opcode::VPCMPISTRM |
- Opcode::VPERM2F128 |
- Opcode::VPERM2I128 |
- Opcode::VPERMD |
- Opcode::VPERMILPD |
- Opcode::VPERMILPS |
- Opcode::VPERMPD |
- Opcode::VPERMPS |
- Opcode::VPERMQ |
- Opcode::VPEXTRB |
- Opcode::VPEXTRD |
- Opcode::VPEXTRQ |
- Opcode::VPEXTRW |
- Opcode::VPGATHERDD |
- Opcode::VPGATHERDQ |
- Opcode::VPGATHERQD |
- Opcode::VPGATHERQQ |
- Opcode::VPHADDD |
- Opcode::VPHADDSW |
- Opcode::VPHADDW |
- Opcode::VPMADDUBSW |
- Opcode::VPHMINPOSUW |
- Opcode::VPHSUBD |
- Opcode::VPHSUBSW |
- Opcode::VPHSUBW |
- Opcode::VPINSRB |
- Opcode::VPINSRD |
- Opcode::VPINSRQ |
- Opcode::VPINSRW |
- Opcode::VPMADDWD |
- Opcode::VPMASKMOVD |
- Opcode::VPMASKMOVQ |
- Opcode::VPMAXSB |
- Opcode::VPMAXSD |
- Opcode::VPMAXSW |
- Opcode::VPMAXUB |
- Opcode::VPMAXUW |
- Opcode::VPMAXUD |
- Opcode::VPMINSB |
- Opcode::VPMINSW |
- Opcode::VPMINSD |
- Opcode::VPMINUB |
- Opcode::VPMINUW |
- Opcode::VPMINUD |
- Opcode::VPMOVMSKB |
- Opcode::VPMOVSXBD |
- Opcode::VPMOVSXBQ |
- Opcode::VPMOVSXBW |
- Opcode::VPMOVSXDQ |
- Opcode::VPMOVSXWD |
- Opcode::VPMOVSXWQ |
- Opcode::VPMOVZXBD |
- Opcode::VPMOVZXBQ |
- Opcode::VPMOVZXBW |
- Opcode::VPMOVZXDQ |
- Opcode::VPMOVZXWD |
- Opcode::VPMOVZXWQ |
- Opcode::VPMULDQ |
- Opcode::VPMULHRSW |
- Opcode::VPMULHUW |
- Opcode::VPMULHW |
- Opcode::VPMULLQ |
- Opcode::VPMULLD |
- Opcode::VPMULLW |
- Opcode::VPMULUDQ |
- Opcode::VPOR |
- Opcode::VPSADBW |
- Opcode::VPSHUFB |
- Opcode::VPSHUFD |
- Opcode::VPSIGNB |
- Opcode::VPSIGND |
- Opcode::VPSIGNW |
- Opcode::VPSLLD |
- Opcode::VPSLLDQ |
- Opcode::VPSLLQ |
- Opcode::VPSLLVD |
- Opcode::VPSLLVQ |
- Opcode::VPSLLW |
- Opcode::VPSRAD |
- Opcode::VPSRAVD |
- Opcode::VPSRAW |
- Opcode::VPSRLD |
- Opcode::VPSRLDQ |
- Opcode::VPSRLQ |
- Opcode::VPSRLVD |
- Opcode::VPSRLVQ |
- Opcode::VPSRLW |
- Opcode::VPSUBB |
- Opcode::VPSUBD |
- Opcode::VPSUBQ |
- Opcode::VPSUBSB |
- Opcode::VPSUBSW |
- Opcode::VPSUBUSB |
- Opcode::VPSUBUSW |
- Opcode::VPSUBW |
- Opcode::VPTEST |
- Opcode::VPUNPCKHBW |
- Opcode::VPUNPCKHDQ |
- Opcode::VPUNPCKHQDQ |
- Opcode::VPUNPCKHWD |
- Opcode::VPUNPCKLBW |
- Opcode::VPUNPCKLDQ |
- Opcode::VPUNPCKLQDQ |
- Opcode::VPUNPCKLWD |
- Opcode::VPXOR |
- Opcode::VRCPPS |
- Opcode::VROUNDPD |
- Opcode::VROUNDPS |
- Opcode::VROUNDSD |
- Opcode::VROUNDSS |
- Opcode::VRSQRTPS |
- Opcode::VRSQRTSS |
- Opcode::VRCPSS |
- Opcode::VSHUFPD |
- Opcode::VSHUFPS |
- Opcode::VSQRTPD |
- Opcode::VSQRTPS |
- Opcode::VSQRTSS |
- Opcode::VSQRTSD |
- Opcode::VSUBPD |
- Opcode::VSUBPS |
- Opcode::VSUBSD |
- Opcode::VSUBSS |
- Opcode::VTESTPD |
- Opcode::VTESTPS |
- Opcode::VUNPCKHPD |
- Opcode::VUNPCKHPS |
- Opcode::VUNPCKLPD |
- Opcode::VUNPCKLPS |
- Opcode::VXORPD |
- Opcode::VXORPS |
- Opcode::VZEROUPPER |
- Opcode::VZEROALL |
- Opcode::VLDMXCSR |
- Opcode::VSTMXCSR => {
- // TODO: check a table for these
- if !self.avx() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::VAESDEC |
- Opcode::VAESDECLAST |
- Opcode::VAESENC |
- Opcode::VAESENCLAST |
- Opcode::VAESIMC |
- Opcode::VAESKEYGENASSIST => {
- // TODO: check a table for these
- if !self.avx() || !self.aesni() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::MOVBE => {
- if !self.movbe() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::POPCNT => {
- /*
- * from the intel SDM:
- * ```
- * Before an application attempts to use the POPCNT instruction, it must check that
- * the processor supports SSE4.2 (if CPUID.01H:ECX.SSE4_2[bit 20] = 1) and POPCNT
- * (if CPUID.01H:ECX.POPCNT[bit 23] = 1).
- * ```
- */
- if self.intel_quirks() && (self.sse4_2() || self.popcnt()) {
- return Ok(());
- } else if !self.popcnt() {
- /*
- * elsewhere from the amd APM:
- * `Instruction Subsets and CPUID Feature Flags` on page 507 indicates that
- * popcnt is present when the popcnt bit is reported by cpuid. this seems to be
- * the less quirky default, so `intel_quirks` is considered the outlier, and
- * before this default.
- * */
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::LZCNT => {
- /*
- * amd APM, `LZCNT` page 212:
- * LZCNT is an Advanced Bit Manipulation (ABM) instruction. Support for the LZCNT
- * instruction is indicated by CPUID Fn8000_0001_ECX[ABM] = 1.
- *
- * meanwhile the intel SDM simply states:
- * ```
- * CPUID.EAX=80000001H:ECX.LZCNT[bit 5]: if 1 indicates the processor supports the
- * LZCNT instruction.
- * ```
- *
- * so that's considered the less-quirky (default) case here.
- * */
- if self.amd_quirks() && !self.abm() {
- return Err(DecodeError::InvalidOpcode);
- } else if !self.lzcnt() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::ADCX |
- Opcode::ADOX => {
- if !self.adx() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::VMRUN |
- Opcode::VMLOAD |
- Opcode::VMSAVE |
- Opcode::CLGI |
- Opcode::VMMCALL |
- Opcode::INVLPGA => {
- if !self.svm() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::STGI |
- Opcode::SKINIT => {
- if !self.svm() || !self.skinit() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::LAHF |
- Opcode::SAHF => {
- if !self.lahfsahf() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::VCVTPS2PH |
- Opcode::VCVTPH2PS => {
- /*
- * from intel SDM:
- * ```
- * 14.4.1 Detection of F16C Instructions Application using float 16 instruction
- * must follow a detection sequence similar to AVX to ensure: • The OS has
- * enabled YMM state management support, • The processor support AVX as
- * indicated by the CPUID feature flag, i.e. CPUID.01H:ECX.AVX[bit 28] = 1. •
- * The processor support 16-bit floating-point conversion instructions via a
- * CPUID feature flag (CPUID.01H:ECX.F16C[bit 29] = 1).
- * ```
- *
- * TODO: only the VEX-coded variant of this instruction should be gated on `f16c`.
- * the EVEX-coded variant should be gated on `avx512f` or `avx512vl` if not
- * EVEX.512-coded.
- */
- if !self.avx() || !self.f16c() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::RDRAND => {
- if !self.rdrand() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::RDSEED => {
- if !self.rdseed() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- Opcode::MONITORX | Opcode::MWAITX | // these are gated on the `monitorx` and `mwaitx` cpuid bits, but are AMD-only.
- Opcode::CLZERO | Opcode::RDPRU => { // again, gated on specific cpuid bits, but AMD-only.
- if !self.amd_quirks() {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- other => {
- if !self.bmi1() {
- if BMI1.contains(&other) {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- if !self.bmi2() {
- if BMI2.contains(&other) {
- return Err(DecodeError::InvalidOpcode);
- }
- }
- }
- }
- Ok(())
- }
}
impl Default for InstDecoder {
@@ -4116,7 +1963,7 @@ impl Decoder<Arch> for InstDecoder {
}
if self != &InstDecoder::default() {
- self.revise_instruction(&mut instr)?;
+ crate::generated::real_mode::revise_instruction(self, &mut instr)?;
}
Ok(instr)
@@ -4141,7 +1988,7 @@ impl AnnotatingDecoder<Arch> for InstDecoder {
}
if self != &InstDecoder::default() {
- self.revise_instruction(instr)?;
+ crate::generated::real_mode::revise_instruction(self, instr)?;
}
Ok(())
@@ -7680,7 +5527,7 @@ fn unlikely_operands<
vex::three_byte_vex(words, modrm, instruction, sink)?;
if decoder != &InstDecoder::default() {
- decoder.revise_instruction(instruction)?;
+ crate::generated::real_mode::revise_instruction(decoder, instruction)?;
}
return Ok(());
}
@@ -7713,7 +5560,7 @@ fn unlikely_operands<
vex::two_byte_vex(words, modrm, instruction, sink)?;
if decoder != &InstDecoder::default() {
- decoder.revise_instruction(instruction)?;
+ crate::generated::real_mode::revise_instruction(decoder, instruction)?;
}
return Ok(());
}