diff options
Diffstat (limited to 'src/protected_mode')
| -rw-r--r-- | src/protected_mode/display.rs | 1478 | ||||
| -rw-r--r-- | src/protected_mode/mod.rs | 2165 | 
2 files changed, 13 insertions, 3630 deletions
| diff --git a/src/protected_mode/display.rs b/src/protected_mode/display.rs index 4416141..9ef531e 100644 --- a/src/protected_mode/display.rs +++ b/src/protected_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", -    "jecxz", -    "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/protected_mode/mod.rs b/src/protected_mode/mod.rs index 2993968..2adf0c8 100644 --- a/src/protected_mode/mod.rs +++ b/src/protected_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::protected_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, -    JECXZ, - -    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::protected_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::protected_mode::revise_instruction(self, instr)?;          }          Ok(()) @@ -7677,7 +5524,7 @@ fn unlikely_operands<                      vex::three_byte_vex(words, modrm, instruction, sink)?;                      if decoder != &InstDecoder::default() { -                        decoder.revise_instruction(instruction)?; +                        crate::generated::protected_mode::revise_instruction(decoder, instruction)?;                      }                      return Ok(());                  } @@ -7710,7 +5557,7 @@ fn unlikely_operands<                      vex::two_byte_vex(words, modrm, instruction, sink)?;                      if decoder != &InstDecoder::default() { -                        decoder.revise_instruction(instruction)?; +                        crate::generated::protected_mode::revise_instruction(decoder, instruction)?;                      }                      return Ok(());                  } | 
