1 /// Types and constants of x86 architecture (both 32bit and 64bit)
2 module capstone.x86;
3 
4 import std.variant;
5 import std.exception: enforce;
6 
7 import capstone.internal;
8 import capstone.utils;
9 
10 /** Instruction's operand referring to memory
11 
12 This is associated with the `X86OpType.mem` operand type
13 */
14 struct X86OpMem {
15     X86Register segment; /// Segment register (or `X86Register.invalid` if irrelevant)
16     X86Register base;    /// Base register (or `X86Register.invalid` if irrelevant)
17     X86Register index;   /// Index register (or `X86Register.invalid` if irrelevant)
18     int scale;           /// Scale for index register
19     long disp;           /// Displacement value
20 }
21 
22 /// Tagged union of possible operand types
23 alias X86OpValue = TaggedUnion!(X86Register, "reg", long, "imm", X86OpMem, "mem", double, "fp");
24 
25 /// Instruction's operand
26 struct X86Op {
27     X86OpType type;   /// Operand type
28     X86OpValue value; /// Operand value of type `type`
29     alias value this; /// Convenient access to value (as in original bindings)
30 
31     ubyte size; /// Size of this operand (in bytes)
32 
33     X86AvxBroadcast avxBcast; /// AVX broadcast type, or `X86AvxBroadcast.invalid`
34     bool avxZeroOpmask;       /// AVX zero opmask {z}
35 
36     package this(cs_x86_op internal){
37         type = internal.type;
38         final switch(internal.type) {
39             case X86OpType.invalid:
40                 break;
41             case X86OpType.reg:
42                 value.reg = internal.reg;
43                 break;
44             case X86OpType.imm:
45                 value.imm = internal.imm;
46                 break;
47             case X86OpType.mem:
48                 value.mem = internal.mem;
49                 break;
50             case X86OpType.fp:
51                 value.fp = internal.fp;
52                 break;
53         }
54         size = internal.size;
55         avxBcast = internal.avx_bcast;
56         avxZeroOpmask = internal.avx_zero_opmask;
57     }
58 }
59 
60 /// X86-specific information about an instruction
61 struct X86InstructionDetail {
62     /** Instruction prefix, which can be up to 4 bytes.
63 
64     A prefix byte gets value 0 when irrelevant.
65     $(OL
66         $(LI `prefix[0]` indicates REP/REPNE/LOCK prefix (See `X86Prefix.rep`, `X86Prefix.repne`, `X86Prefix.lock`))
67         $(LI `prefix[1]` indicates segment override (irrelevant for x86_64):
68                 See `X86Prefix.cs`,`X86Prefix.ss`,`X86Prefix.ds`,`X86Prefix.es`,`X86Prefix.fs`,`X86Prefix.gs`)
69         $(LI `prefix[2]` indicates operand-size override (`X86Prefix.opsize`))
70         $(LI `prefix[3]` indicates address-size override (`X86Prefix.addrsize`))
71     )
72     */
73     ubyte[] prefix; // TODO: Split?
74 
75     /** Instruction opcode, wich can be from 1 to 4 bytes in size.
76 
77     This contains VEX opcode as well. A trailing opcode byte gets value 0 when irrelevant.
78     */
79     ubyte[] opcode; // TODO: Get rid of irrelevant trailing bytes?
80     ubyte rex;      /// REX prefix: only a non-zero value is relavant for x86_64
81     ubyte addrSize; /// Address size
82     ubyte modRM;    /// ModR/M byte
83     ubyte sib;      /// SIB value, or 0 when irrelevant
84     int disp;       /// Displacement value, or 0 when irrelevant
85 
86     // SIB state
87     X86Register sibIndex;      /// SIB index register, or `X86Register.invalid` when irrelevant
88     byte sibScale;             /// SIB scale. Only applicable if `sibIndex` is relavant
89     X86Register sibBase;       /// SIB base register, or `X86Register.invalid` when irrelevant
90 
91     X86SseCodeCondition sseCc; /// SSE code condition
92     X86AvxCodeCondition avxCc; /// AVX code condition
93     bool avxSae;               /// AVX suppress all exceptions
94     X86AvxRoundingMode avxRM;  /// AVX static rounding mode
95 
96     X86Op[] operands;          /// Operands for this instruction.
97 
98     // TODO: Check for copying/ownership issues
99     package this(cs_arch_detail arch_detail){
100         auto internal = arch_detail.x86;
101         prefix = internal.prefix.dup; // here [0..?]
102         opcode = internal.opcode.dup; // here [0..?]
103         rex = internal.rex;
104         addrSize = internal.addr_size;
105         modRM = internal.modrm;
106         sib = internal.sib;
107         disp = internal.disp;
108         sibIndex = internal.sib_index;
109         sibScale = internal.sib_scale;
110         sibBase = internal.sib_base;
111         sseCc = internal.sse_cc;
112         avxCc = internal.avx_cc;
113         avxRM = internal.avx_rm;
114 
115         foreach(op; internal.operands[0..internal.op_count])
116             operands ~= X86Op(op);
117     }
118 }
119 
120 //=============================================================================
121 // Constants
122 //=============================================================================
123 
124 /// Operand type for instruction's operands
125 enum X86OpType {
126     invalid = 0, /// Invalid
127     reg,         /// Register operand (`X86Register`)
128     imm,         /// Immediate operand (`long`)
129     mem,         /// Memory operand (`X86OpMem`)
130     fp           /// Floating-Point operand (`double`)
131 }
132 
133 /// AVX broadcast type
134 enum X86AvxBroadcast {
135     invalid = 0, /// Invalid
136     bcast_2,     /// avx512 broadcast type {1to2}
137     bcast_4,     /// avx512 broadcast type {1to4}
138     bcast_8,     /// avx512 broadcast type {1to8}
139     bcast_16     /// avx512 broadcast type {1to16}
140 }
141 
142 /// SSE code condition type
143 enum X86SseCodeCondition {
144     invalid = 0,
145     eq,
146     lt,
147     le,
148     unord,
149     neq,
150     nlt,
151     nle,
152     ord,
153     eq_uq,
154     nge,
155     ngt,
156     false_,
157     neq_oq,
158     ge,
159     gt,
160     true_
161 }
162 
163 /// AVX code condition type
164 enum X86AvxCodeCondition {
165     invalid = 0,
166     eq,
167     lt,
168     le,
169     unord,
170     neq,
171     nlt,
172     nle,
173     ord,
174     eq_uq,
175     nge,
176     ngt,
177     false_,
178     neq_oq,
179     ge,
180     gt,
181     true_,
182     eq_os,
183     lt_oq,
184     le_oq,
185     unord_s,
186     neq_us,
187     nlt_uq,
188     nle_uq,
189     ord_s,
190     eq_us,
191     nge_uq,
192     ngt_uq,
193     false_os,
194     neq_os,
195     ge_oq,
196     gt_oq,
197     true_us
198 }
199 
200 /// AVX static rounding mode type
201 enum X86AvxRoundingMode {
202     invalid = 0, /// Invalid
203     rn,          /// Round to nearest
204     rd,          /// Round down
205     ru,          /// Round up
206     rz           /// Round toward zero
207 }
208 
209 /// Instruction prefixes - used in `X86InstructionDetail.prefix[]`
210 enum X86Prefix {
211     lock        =   0xf0,   // lock (cs_x86.prefix[0]
212     rep         =   0xf3,   // rep (cs_x86.prefix[0]
213     repne       =   0xf2,   // repne (cs_x86.prefix[0]
214 
215     cs          =   0x2e,   // segment override cs (cs_x86.prefix[1]
216     ss          =   0x36,   // segment override ss (cs_x86.prefix[1]
217     ds          =   0x3e,   // segment override ds (cs_x86.prefix[1]
218     es          =   0x26,   // segment override es (cs_x86.prefix[1]
219     fs          =   0x64,   // segment override fs (cs_x86.prefix[1]
220     gs          =   0x65,   // segment override gs (cs_x86.prefix[1]
221 
222     opsize      =   0x66,   // operand-size override (cs_x86.prefix[2]
223     addrsize    =   0x67    // address-size override (cs_x86.prefix[3]
224 }
225 
226 /// X86 registers
227 enum X86Register {
228     invalid = 0,
229     ah, al, ax, bh, bl,
230     bp, bpl, bx, ch, cl,
231     cs, cx, dh, di, dil,
232     dl, ds, dx, eax, ebp,
233     ebx, ecx, edi, edx, eflags,
234     eip, eiz, es, esi, esp,
235     fpsw, fs, gs, ip, rax,
236     rbp, rbx, rcx, rdi, rdx,
237     rip, riz, rsi, rsp, si,
238     sil, sp, spl, ss, cr0,
239     cr1, cr2, cr3, cr4, cr5,
240     cr6, cr7, cr8, cr9, cr10,
241     cr11, cr12, cr13, cr14, cr15,
242     dr0, dr1, dr2, dr3, dr4,
243     dr5, dr6, dr7, fp0, fp1,
244     fp2, fp3, fp4, fp5, fp6, fp7,
245     k0, k1, k2, k3, k4,
246     k5, k6, k7, mm0, mm1,
247     mm2, mm3, mm4, mm5, mm6,
248     mm7, r8, r9, r10, r11,
249     r12, r13, r14, r15,
250     st0, st1, st2, st3,
251     st4, st5, st6, st7,
252     xmm0, xmm1, xmm2, xmm3, xmm4,
253     xmm5, xmm6, xmm7, xmm8, xmm9,
254     xmm10, xmm11, xmm12, xmm13, xmm14,
255     xmm15, xmm16, xmm17, xmm18, xmm19,
256     xmm20, xmm21, xmm22, xmm23, xmm24,
257     xmm25, xmm26, xmm27, xmm28, xmm29,
258     xmm30, xmm31, ymm0, ymm1, ymm2,
259     ymm3, ymm4, ymm5, ymm6, ymm7,
260     ymm8, ymm9, ymm10, ymm11, ymm12,
261     ymm13, ymm14, ymm15, ymm16, ymm17,
262     ymm18, ymm19, ymm20, ymm21, ymm22,
263     ymm23, ymm24, ymm25, ymm26, ymm27,
264     ymm28, ymm29, ymm30, ymm31, zmm0,
265     zmm1, zmm2, zmm3, zmm4, zmm5,
266     zmm6, zmm7, zmm8, zmm9, zmm10,
267     zmm11, zmm12, zmm13, zmm14, zmm15,
268     zmm16, zmm17, zmm18, zmm19, zmm20,
269     zmm21, zmm22, zmm23, zmm24, zmm25,
270     zmm26, zmm27, zmm28, zmm29, zmm30,
271     zmm31, r8b, r9b, r10b, r11b,
272     r12b, r13b, r14b, r15b, r8d,
273     r9d, r10d, r11d, r12d, r13d,
274     r14d, r15d, r8w, r9w, r10w,
275     r11w, r12w, r13w, r14w, r15w
276 }
277 
278 /// X86 instructions
279 enum X86InstructionId {
280     invalid = 0,
281 
282     aaa,
283     aad,
284     aam,
285     aas,
286     fabs,
287     adc,
288     adcx,
289     add,
290     addpd,
291     addps,
292     addsd,
293     addss,
294     addsubpd,
295     addsubps,
296     fadd,
297     fiadd,
298     faddp,
299     adox,
300     aesdeclast,
301     aesdec,
302     aesenclast,
303     aesenc,
304     aesimc,
305     aeskeygenassist,
306     and,
307     andn,
308     andnpd,
309     andnps,
310     andpd,
311     andps,
312     arpl,
313     bextr,
314     blcfill,
315     blci,
316     blcic,
317     blcmsk,
318     blcs,
319     blendpd,
320     blendps,
321     blendvpd,
322     blendvps,
323     blsfill,
324     blsi,
325     blsic,
326     blsmsk,
327     blsr,
328     bound,
329     bsf,
330     bsr,
331     bswap,
332     bt,
333     btc,
334     btr,
335     bts,
336     bzhi,
337     call,
338     cbw,
339     cdq,
340     cdqe,
341     fchs,
342     clac,
343     clc,
344     cld,
345     clflush,
346     clgi,
347     cli,
348     clts,
349     cmc,
350     cmova,
351     cmovae,
352     cmovb,
353     cmovbe,
354     fcmovbe,
355     fcmovb,
356     cmove,
357     fcmove,
358     cmovg,
359     cmovge,
360     cmovl,
361     cmovle,
362     fcmovnbe,
363     fcmovnb,
364     cmovne,
365     fcmovne,
366     cmovno,
367     cmovnp,
368     fcmovnu,
369     cmovns,
370     cmovo,
371     cmovp,
372     fcmovu,
373     cmovs,
374     cmp,
375     cmppd,
376     cmpps,
377     cmpsb,
378     cmpsd,
379     cmpsq,
380     cmpss,
381     cmpsw,
382     cmpxchg16b,
383     cmpxchg,
384     cmpxchg8b,
385     comisd,
386     comiss,
387     fcomp,
388     fcompi,
389     fcomi,
390     fcom,
391     fcos,
392     cpuid,
393     cqo,
394     crc32,
395     cvtdq2pd,
396     cvtdq2ps,
397     cvtpd2dq,
398     cvtpd2ps,
399     cvtps2dq,
400     cvtps2pd,
401     cvtsd2si,
402     cvtsd2ss,
403     cvtsi2sd,
404     cvtsi2ss,
405     cvtss2sd,
406     cvtss2si,
407     cvttpd2dq,
408     cvttps2dq,
409     cvttsd2si,
410     cvttss2si,
411     cwd,
412     cwde,
413     daa,
414     das,
415     data16,
416     dec,
417     div,
418     divpd,
419     divps,
420     fdivr,
421     fidivr,
422     fdivrp,
423     divsd,
424     divss,
425     fdiv,
426     fidiv,
427     fdivp,
428     dppd,
429     dpps,
430     ret,
431     encls,
432     enclu,
433     enter,
434     extractps,
435     extrq,
436     f2xm1,
437     lcall,
438     ljmp,
439     fbld,
440     fbstp,
441     fcompp,
442     fdecstp,
443     femms,
444     ffree,
445     ficom,
446     ficomp,
447     fincstp,
448     fldcw,
449     fldenv,
450     fldl2e,
451     fldl2t,
452     fldlg2,
453     fldln2,
454     fldpi,
455     fnclex,
456     fninit,
457     fnop,
458     fnstcw,
459     fnstsw,
460     fpatan,
461     fprem,
462     fprem1,
463     fptan,
464     frndint,
465     frstor,
466     fnsave,
467     fscale,
468     fsetpm,
469     fsincos,
470     fnstenv,
471     fxam,
472     fxrstor,
473     fxrstor64,
474     fxsave,
475     fxsave64,
476     fxtract,
477     fyl2x,
478     fyl2xp1,
479     movapd,
480     movaps,
481     orpd,
482     orps,
483     vmovapd,
484     vmovaps,
485     xorpd,
486     xorps,
487     getsec,
488     haddpd,
489     haddps,
490     hlt,
491     hsubpd,
492     hsubps,
493     idiv,
494     fild,
495     imul,
496     in_,
497     inc,
498     insb,
499     insertps,
500     insertq,
501     insd,
502     insw,
503     int_,
504     int1,
505     int3,
506     into,
507     invd,
508     invept,
509     invlpg,
510     invlpga,
511     invpcid,
512     invvpid,
513     iret,
514     iretd,
515     iretq,
516     fisttp,
517     fist,
518     fistp,
519     ucomisd,
520     ucomiss,
521     vcmp,
522     vcomisd,
523     vcomiss,
524     vcvtsd2ss,
525     vcvtsi2sd,
526     vcvtsi2ss,
527     vcvtss2sd,
528     vcvttsd2si,
529     vcvttsd2usi,
530     vcvttss2si,
531     vcvttss2usi,
532     vcvtusi2sd,
533     vcvtusi2ss,
534     vucomisd,
535     vucomiss,
536     jae,
537     ja,
538     jbe,
539     jb,
540     jcxz,
541     jecxz,
542     je,
543     jge,
544     jg,
545     jle,
546     jl,
547     jmp,
548     jne,
549     jno,
550     jnp,
551     jns,
552     jo,
553     jp,
554     jrcxz,
555     js,
556     kandb,
557     kandd,
558     kandnb,
559     kandnd,
560     kandnq,
561     kandnw,
562     kandq,
563     kandw,
564     kmovb,
565     kmovd,
566     kmovq,
567     kmovw,
568     knotb,
569     knotd,
570     knotq,
571     knotw,
572     korb,
573     kord,
574     korq,
575     kortestw,
576     korw,
577     kshiftlw,
578     kshiftrw,
579     kunpckbw,
580     kxnorb,
581     kxnord,
582     kxnorq,
583     kxnorw,
584     kxorb,
585     kxord,
586     kxorq,
587     kxorw,
588     lahf,
589     lar,
590     lddqu,
591     ldmxcsr,
592     lds,
593     fldz,
594     fld1,
595     fld,
596     lea,
597     leave,
598     les,
599     lfence,
600     lfs,
601     lgdt,
602     lgs,
603     lidt,
604     lldt,
605     lmsw,
606     or,
607     sub,
608     xor,
609     lodsb,
610     lodsd,
611     lodsq,
612     lodsw,
613     loop,
614     loope,
615     loopne,
616     retf,
617     retfq,
618     lsl,
619     lss,
620     ltr,
621     xadd,
622     lzcnt,
623     maskmovdqu,
624     maxpd,
625     maxps,
626     maxsd,
627     maxss,
628     mfence,
629     minpd,
630     minps,
631     minsd,
632     minss,
633     cvtpd2pi,
634     cvtpi2pd,
635     cvtpi2ps,
636     cvtps2pi,
637     cvttpd2pi,
638     cvttps2pi,
639     emms,
640     maskmovq,
641     movd,
642     movdq2q,
643     movntq,
644     movq2dq,
645     movq,
646     pabsb,
647     pabsd,
648     pabsw,
649     packssdw,
650     packsswb,
651     packuswb,
652     paddb,
653     paddd,
654     paddq,
655     paddsb,
656     paddsw,
657     paddusb,
658     paddusw,
659     paddw,
660     palignr,
661     pandn,
662     pand,
663     pavgb,
664     pavgw,
665     pcmpeqb,
666     pcmpeqd,
667     pcmpeqw,
668     pcmpgtb,
669     pcmpgtd,
670     pcmpgtw,
671     pextrw,
672     phaddsw,
673     phaddw,
674     phaddd,
675     phsubd,
676     phsubsw,
677     phsubw,
678     pinsrw,
679     pmaddubsw,
680     pmaddwd,
681     pmaxsw,
682     pmaxub,
683     pminsw,
684     pminub,
685     pmovmskb,
686     pmulhrsw,
687     pmulhuw,
688     pmulhw,
689     pmullw,
690     pmuludq,
691     por,
692     psadbw,
693     pshufb,
694     pshufw,
695     psignb,
696     psignd,
697     psignw,
698     pslld,
699     psllq,
700     psllw,
701     psrad,
702     psraw,
703     psrld,
704     psrlq,
705     psrlw,
706     psubb,
707     psubd,
708     psubq,
709     psubsb,
710     psubsw,
711     psubusb,
712     psubusw,
713     psubw,
714     punpckhbw,
715     punpckhdq,
716     punpckhwd,
717     punpcklbw,
718     punpckldq,
719     punpcklwd,
720     pxor,
721     monitor,
722     montmul,
723     mov,
724     movabs,
725     movbe,
726     movddup,
727     movdqa,
728     movdqu,
729     movhlps,
730     movhpd,
731     movhps,
732     movlhps,
733     movlpd,
734     movlps,
735     movmskpd,
736     movmskps,
737     movntdqa,
738     movntdq,
739     movnti,
740     movntpd,
741     movntps,
742     movntsd,
743     movntss,
744     movsb,
745     movsd,
746     movshdup,
747     movsldup,
748     movsq,
749     movss,
750     movsw,
751     movsx,
752     movsxd,
753     movupd,
754     movups,
755     movzx,
756     mpsadbw,
757     mul,
758     mulpd,
759     mulps,
760     mulsd,
761     mulss,
762     mulx,
763     fmul,
764     fimul,
765     fmulp,
766     mwait,
767     neg,
768     nop,
769     not,
770     out_,
771     outsb,
772     outsd,
773     outsw,
774     packusdw,
775     pause,
776     pavgusb,
777     pblendvb,
778     pblendw,
779     pclmulqdq,
780     pcmpeqq,
781     pcmpestri,
782     pcmpestrm,
783     pcmpgtq,
784     pcmpistri,
785     pcmpistrm,
786     pdep,
787     pext,
788     pextrb,
789     pextrd,
790     pextrq,
791     pf2id,
792     pf2iw,
793     pfacc,
794     pfadd,
795     pfcmpeq,
796     pfcmpge,
797     pfcmpgt,
798     pfmax,
799     pfmin,
800     pfmul,
801     pfnacc,
802     pfpnacc,
803     pfrcpit1,
804     pfrcpit2,
805     pfrcp,
806     pfrsqit1,
807     pfrsqrt,
808     pfsubr,
809     pfsub,
810     phminposuw,
811     pi2fd,
812     pi2fw,
813     pinsrb,
814     pinsrd,
815     pinsrq,
816     pmaxsb,
817     pmaxsd,
818     pmaxud,
819     pmaxuw,
820     pminsb,
821     pminsd,
822     pminud,
823     pminuw,
824     pmovsxbd,
825     pmovsxbq,
826     pmovsxbw,
827     pmovsxdq,
828     pmovsxwd,
829     pmovsxwq,
830     pmovzxbd,
831     pmovzxbq,
832     pmovzxbw,
833     pmovzxdq,
834     pmovzxwd,
835     pmovzxwq,
836     pmuldq,
837     pmulhrw,
838     pmulld,
839     pop,
840     popaw,
841     popal,
842     popcnt,
843     popf,
844     popfd,
845     popfq,
846     prefetch,
847     prefetchnta,
848     prefetcht0,
849     prefetcht1,
850     prefetcht2,
851     prefetchw,
852     pshufd,
853     pshufhw,
854     pshuflw,
855     pslldq,
856     psrldq,
857     pswapd,
858     ptest,
859     punpckhqdq,
860     punpcklqdq,
861     push,
862     pushaw,
863     pushal,
864     pushf,
865     pushfd,
866     pushfq,
867     rcl,
868     rcpps,
869     rcpss,
870     rcr,
871     rdfsbase,
872     rdgsbase,
873     rdmsr,
874     rdpmc,
875     rdrand,
876     rdseed,
877     rdtsc,
878     rdtscp,
879     rol,
880     ror,
881     rorx,
882     roundpd,
883     roundps,
884     roundsd,
885     roundss,
886     rsm,
887     rsqrtps,
888     rsqrtss,
889     sahf,
890     sal,
891     salc,
892     sar,
893     sarx,
894     sbb,
895     scasb,
896     scasd,
897     scasq,
898     scasw,
899     setae,
900     seta,
901     setbe,
902     setb,
903     sete,
904     setge,
905     setg,
906     setle,
907     setl,
908     setne,
909     setno,
910     setnp,
911     setns,
912     seto,
913     setp,
914     sets,
915     sfence,
916     sgdt,
917     sha1msg1,
918     sha1msg2,
919     sha1nexte,
920     sha1rnds4,
921     sha256msg1,
922     sha256msg2,
923     sha256rnds2,
924     shl,
925     shld,
926     shlx,
927     shr,
928     shrd,
929     shrx,
930     shufpd,
931     shufps,
932     sidt,
933     fsin,
934     skinit,
935     sldt,
936     smsw,
937     sqrtpd,
938     sqrtps,
939     sqrtsd,
940     sqrtss,
941     fsqrt,
942     stac,
943     stc,
944     std,
945     stgi,
946     sti,
947     stmxcsr,
948     stosb,
949     stosd,
950     stosq,
951     stosw,
952     str,
953     fst,
954     fstp,
955     fstpnce,
956     subpd,
957     subps,
958     fsubr,
959     fisubr,
960     fsubrp,
961     subsd,
962     subss,
963     fsub,
964     fisub,
965     fsubp,
966     swapgs,
967     syscall,
968     sysenter,
969     sysexit,
970     sysret,
971     t1mskc,
972     test,
973     ud2,
974     ftst,
975     tzcnt,
976     tzmsk,
977     fucompi,
978     fucomi,
979     fucompp,
980     fucomp,
981     fucom,
982     ud2b,
983     unpckhpd,
984     unpckhps,
985     unpcklpd,
986     unpcklps,
987     vaddpd,
988     vaddps,
989     vaddsd,
990     vaddss,
991     vaddsubpd,
992     vaddsubps,
993     vaesdeclast,
994     vaesdec,
995     vaesenclast,
996     vaesenc,
997     vaesimc,
998     vaeskeygenassist,
999     valignd,
1000     valignq,
1001     vandnpd,
1002     vandnps,
1003     vandpd,
1004     vandps,
1005     vblendmpd,
1006     vblendmps,
1007     vblendpd,
1008     vblendps,
1009     vblendvpd,
1010     vblendvps,
1011     vbroadcastf128,
1012     vbroadcasti128,
1013     vbroadcasti32x4,
1014     vbroadcasti64x4,
1015     vbroadcastsd,
1016     vbroadcastss,
1017     vcmppd,
1018     vcmpps,
1019     vcmpsd,
1020     vcmpss,
1021     vcvtdq2pd,
1022     vcvtdq2ps,
1023     vcvtpd2dqx,
1024     vcvtpd2dq,
1025     vcvtpd2psx,
1026     vcvtpd2ps,
1027     vcvtpd2udq,
1028     vcvtph2ps,
1029     vcvtps2dq,
1030     vcvtps2pd,
1031     vcvtps2ph,
1032     vcvtps2udq,
1033     vcvtsd2si,
1034     vcvtsd2usi,
1035     vcvtss2si,
1036     vcvtss2usi,
1037     vcvttpd2dqx,
1038     vcvttpd2dq,
1039     vcvttpd2udq,
1040     vcvttps2dq,
1041     vcvttps2udq,
1042     vcvtudq2pd,
1043     vcvtudq2ps,
1044     vdivpd,
1045     vdivps,
1046     vdivsd,
1047     vdivss,
1048     vdppd,
1049     vdpps,
1050     verr,
1051     verw,
1052     vextractf128,
1053     vextractf32x4,
1054     vextractf64x4,
1055     vextracti128,
1056     vextracti32x4,
1057     vextracti64x4,
1058     vextractps,
1059     vfmadd132pd,
1060     vfmadd132ps,
1061     vfmadd213pd,
1062     vfmadd213ps,
1063     vfmaddpd,
1064     vfmadd231pd,
1065     vfmaddps,
1066     vfmadd231ps,
1067     vfmaddsd,
1068     vfmadd213sd,
1069     vfmadd132sd,
1070     vfmadd231sd,
1071     vfmaddss,
1072     vfmadd213ss,
1073     vfmadd132ss,
1074     vfmadd231ss,
1075     vfmaddsub132pd,
1076     vfmaddsub132ps,
1077     vfmaddsub213pd,
1078     vfmaddsub213ps,
1079     vfmaddsubpd,
1080     vfmaddsub231pd,
1081     vfmaddsubps,
1082     vfmaddsub231ps,
1083     vfmsub132pd,
1084     vfmsub132ps,
1085     vfmsub213pd,
1086     vfmsub213ps,
1087     vfmsubadd132pd,
1088     vfmsubadd132ps,
1089     vfmsubadd213pd,
1090     vfmsubadd213ps,
1091     vfmsubaddpd,
1092     vfmsubadd231pd,
1093     vfmsubaddps,
1094     vfmsubadd231ps,
1095     vfmsubpd,
1096     vfmsub231pd,
1097     vfmsubps,
1098     vfmsub231ps,
1099     vfmsubsd,
1100     vfmsub213sd,
1101     vfmsub132sd,
1102     vfmsub231sd,
1103     vfmsubss,
1104     vfmsub213ss,
1105     vfmsub132ss,
1106     vfmsub231ss,
1107     vfnmadd132pd,
1108     vfnmadd132ps,
1109     vfnmadd213pd,
1110     vfnmadd213ps,
1111     vfnmaddpd,
1112     vfnmadd231pd,
1113     vfnmaddps,
1114     vfnmadd231ps,
1115     vfnmaddsd,
1116     vfnmadd213sd,
1117     vfnmadd132sd,
1118     vfnmadd231sd,
1119     vfnmaddss,
1120     vfnmadd213ss,
1121     vfnmadd132ss,
1122     vfnmadd231ss,
1123     vfnmsub132pd,
1124     vfnmsub132ps,
1125     vfnmsub213pd,
1126     vfnmsub213ps,
1127     vfnmsubpd,
1128     vfnmsub231pd,
1129     vfnmsubps,
1130     vfnmsub231ps,
1131     vfnmsubsd,
1132     vfnmsub213sd,
1133     vfnmsub132sd,
1134     vfnmsub231sd,
1135     vfnmsubss,
1136     vfnmsub213ss,
1137     vfnmsub132ss,
1138     vfnmsub231ss,
1139     vfrczpd,
1140     vfrczps,
1141     vfrczsd,
1142     vfrczss,
1143     vorpd,
1144     vorps,
1145     vxorpd,
1146     vxorps,
1147     vgatherdpd,
1148     vgatherdps,
1149     vgatherpf0dpd,
1150     vgatherpf0dps,
1151     vgatherpf0qpd,
1152     vgatherpf0qps,
1153     vgatherpf1dpd,
1154     vgatherpf1dps,
1155     vgatherpf1qpd,
1156     vgatherpf1qps,
1157     vgatherqpd,
1158     vgatherqps,
1159     vhaddpd,
1160     vhaddps,
1161     vhsubpd,
1162     vhsubps,
1163     vinsertf128,
1164     vinsertf32x4,
1165     vinsertf64x4,
1166     vinserti128,
1167     vinserti32x4,
1168     vinserti64x4,
1169     vinsertps,
1170     vlddqu,
1171     vldmxcsr,
1172     vmaskmovdqu,
1173     vmaskmovpd,
1174     vmaskmovps,
1175     vmaxpd,
1176     vmaxps,
1177     vmaxsd,
1178     vmaxss,
1179     vmcall,
1180     vmclear,
1181     vmfunc,
1182     vminpd,
1183     vminps,
1184     vminsd,
1185     vminss,
1186     vmlaunch,
1187     vmload,
1188     vmmcall,
1189     vmovq,
1190     vmovddup,
1191     vmovd,
1192     vmovdqa32,
1193     vmovdqa64,
1194     vmovdqa,
1195     vmovdqu16,
1196     vmovdqu32,
1197     vmovdqu64,
1198     vmovdqu8,
1199     vmovdqu,
1200     vmovhlps,
1201     vmovhpd,
1202     vmovhps,
1203     vmovlhps,
1204     vmovlpd,
1205     vmovlps,
1206     vmovmskpd,
1207     vmovmskps,
1208     vmovntdqa,
1209     vmovntdq,
1210     vmovntpd,
1211     vmovntps,
1212     vmovsd,
1213     vmovshdup,
1214     vmovsldup,
1215     vmovss,
1216     vmovupd,
1217     vmovups,
1218     vmpsadbw,
1219     vmptrld,
1220     vmptrst,
1221     vmread,
1222     vmresume,
1223     vmrun,
1224     vmsave,
1225     vmulpd,
1226     vmulps,
1227     vmulsd,
1228     vmulss,
1229     vmwrite,
1230     vmxoff,
1231     vmxon,
1232     vpabsb,
1233     vpabsd,
1234     vpabsq,
1235     vpabsw,
1236     vpackssdw,
1237     vpacksswb,
1238     vpackusdw,
1239     vpackuswb,
1240     vpaddb,
1241     vpaddd,
1242     vpaddq,
1243     vpaddsb,
1244     vpaddsw,
1245     vpaddusb,
1246     vpaddusw,
1247     vpaddw,
1248     vpalignr,
1249     vpandd,
1250     vpandnd,
1251     vpandnq,
1252     vpandn,
1253     vpandq,
1254     vpand,
1255     vpavgb,
1256     vpavgw,
1257     vpblendd,
1258     vpblendmd,
1259     vpblendmq,
1260     vpblendvb,
1261     vpblendw,
1262     vpbroadcastb,
1263     vpbroadcastd,
1264     vpbroadcastmb2q,
1265     vpbroadcastmw2d,
1266     vpbroadcastq,
1267     vpbroadcastw,
1268     vpclmulqdq,
1269     vpcmov,
1270     vpcmp,
1271     vpcmpd,
1272     vpcmpeqb,
1273     vpcmpeqd,
1274     vpcmpeqq,
1275     vpcmpeqw,
1276     vpcmpestri,
1277     vpcmpestrm,
1278     vpcmpgtb,
1279     vpcmpgtd,
1280     vpcmpgtq,
1281     vpcmpgtw,
1282     vpcmpistri,
1283     vpcmpistrm,
1284     vpcmpq,
1285     vpcmpud,
1286     vpcmpuq,
1287     vpcomb,
1288     vpcomd,
1289     vpcomq,
1290     vpcomub,
1291     vpcomud,
1292     vpcomuq,
1293     vpcomuw,
1294     vpcomw,
1295     vpconflictd,
1296     vpconflictq,
1297     vperm2f128,
1298     vperm2i128,
1299     vpermd,
1300     vpermi2d,
1301     vpermi2pd,
1302     vpermi2ps,
1303     vpermi2q,
1304     vpermil2pd,
1305     vpermil2ps,
1306     vpermilpd,
1307     vpermilps,
1308     vpermpd,
1309     vpermps,
1310     vpermq,
1311     vpermt2d,
1312     vpermt2pd,
1313     vpermt2ps,
1314     vpermt2q,
1315     vpextrb,
1316     vpextrd,
1317     vpextrq,
1318     vpextrw,
1319     vpgatherdd,
1320     vpgatherdq,
1321     vpgatherqd,
1322     vpgatherqq,
1323     vphaddbd,
1324     vphaddbq,
1325     vphaddbw,
1326     vphadddq,
1327     vphaddd,
1328     vphaddsw,
1329     vphaddubd,
1330     vphaddubq,
1331     vphaddubw,
1332     vphaddudq,
1333     vphadduwd,
1334     vphadduwq,
1335     vphaddwd,
1336     vphaddwq,
1337     vphaddw,
1338     vphminposuw,
1339     vphsubbw,
1340     vphsubdq,
1341     vphsubd,
1342     vphsubsw,
1343     vphsubwd,
1344     vphsubw,
1345     vpinsrb,
1346     vpinsrd,
1347     vpinsrq,
1348     vpinsrw,
1349     vplzcntd,
1350     vplzcntq,
1351     vpmacsdd,
1352     vpmacsdqh,
1353     vpmacsdql,
1354     vpmacssdd,
1355     vpmacssdqh,
1356     vpmacssdql,
1357     vpmacsswd,
1358     vpmacssww,
1359     vpmacswd,
1360     vpmacsww,
1361     vpmadcsswd,
1362     vpmadcswd,
1363     vpmaddubsw,
1364     vpmaddwd,
1365     vpmaskmovd,
1366     vpmaskmovq,
1367     vpmaxsb,
1368     vpmaxsd,
1369     vpmaxsq,
1370     vpmaxsw,
1371     vpmaxub,
1372     vpmaxud,
1373     vpmaxuq,
1374     vpmaxuw,
1375     vpminsb,
1376     vpminsd,
1377     vpminsq,
1378     vpminsw,
1379     vpminub,
1380     vpminud,
1381     vpminuq,
1382     vpminuw,
1383     vpmovdb,
1384     vpmovdw,
1385     vpmovmskb,
1386     vpmovqb,
1387     vpmovqd,
1388     vpmovqw,
1389     vpmovsdb,
1390     vpmovsdw,
1391     vpmovsqb,
1392     vpmovsqd,
1393     vpmovsqw,
1394     vpmovsxbd,
1395     vpmovsxbq,
1396     vpmovsxbw,
1397     vpmovsxdq,
1398     vpmovsxwd,
1399     vpmovsxwq,
1400     vpmovusdb,
1401     vpmovusdw,
1402     vpmovusqb,
1403     vpmovusqd,
1404     vpmovusqw,
1405     vpmovzxbd,
1406     vpmovzxbq,
1407     vpmovzxbw,
1408     vpmovzxdq,
1409     vpmovzxwd,
1410     vpmovzxwq,
1411     vpmuldq,
1412     vpmulhrsw,
1413     vpmulhuw,
1414     vpmulhw,
1415     vpmulld,
1416     vpmullw,
1417     vpmuludq,
1418     vpord,
1419     vporq,
1420     vpor,
1421     vpperm,
1422     vprotb,
1423     vprotd,
1424     vprotq,
1425     vprotw,
1426     vpsadbw,
1427     vpscatterdd,
1428     vpscatterdq,
1429     vpscatterqd,
1430     vpscatterqq,
1431     vpshab,
1432     vpshad,
1433     vpshaq,
1434     vpshaw,
1435     vpshlb,
1436     vpshld,
1437     vpshlq,
1438     vpshlw,
1439     vpshufb,
1440     vpshufd,
1441     vpshufhw,
1442     vpshuflw,
1443     vpsignb,
1444     vpsignd,
1445     vpsignw,
1446     vpslldq,
1447     vpslld,
1448     vpsllq,
1449     vpsllvd,
1450     vpsllvq,
1451     vpsllw,
1452     vpsrad,
1453     vpsraq,
1454     vpsravd,
1455     vpsravq,
1456     vpsraw,
1457     vpsrldq,
1458     vpsrld,
1459     vpsrlq,
1460     vpsrlvd,
1461     vpsrlvq,
1462     vpsrlw,
1463     vpsubb,
1464     vpsubd,
1465     vpsubq,
1466     vpsubsb,
1467     vpsubsw,
1468     vpsubusb,
1469     vpsubusw,
1470     vpsubw,
1471     vptestmd,
1472     vptestmq,
1473     vptestnmd,
1474     vptestnmq,
1475     vptest,
1476     vpunpckhbw,
1477     vpunpckhdq,
1478     vpunpckhqdq,
1479     vpunpckhwd,
1480     vpunpcklbw,
1481     vpunpckldq,
1482     vpunpcklqdq,
1483     vpunpcklwd,
1484     vpxord,
1485     vpxorq,
1486     vpxor,
1487     vrcp14pd,
1488     vrcp14ps,
1489     vrcp14sd,
1490     vrcp14ss,
1491     vrcp28pd,
1492     vrcp28ps,
1493     vrcp28sd,
1494     vrcp28ss,
1495     vrcpps,
1496     vrcpss,
1497     vrndscalepd,
1498     vrndscaleps,
1499     vrndscalesd,
1500     vrndscaless,
1501     vroundpd,
1502     vroundps,
1503     vroundsd,
1504     vroundss,
1505     vrsqrt14pd,
1506     vrsqrt14ps,
1507     vrsqrt14sd,
1508     vrsqrt14ss,
1509     vrsqrt28pd,
1510     vrsqrt28ps,
1511     vrsqrt28sd,
1512     vrsqrt28ss,
1513     vrsqrtps,
1514     vrsqrtss,
1515     vscatterdpd,
1516     vscatterdps,
1517     vscatterpf0dpd,
1518     vscatterpf0dps,
1519     vscatterpf0qpd,
1520     vscatterpf0qps,
1521     vscatterpf1dpd,
1522     vscatterpf1dps,
1523     vscatterpf1qpd,
1524     vscatterpf1qps,
1525     vscatterqpd,
1526     vscatterqps,
1527     vshufpd,
1528     vshufps,
1529     vsqrtpd,
1530     vsqrtps,
1531     vsqrtsd,
1532     vsqrtss,
1533     vstmxcsr,
1534     vsubpd,
1535     vsubps,
1536     vsubsd,
1537     vsubss,
1538     vtestpd,
1539     vtestps,
1540     vunpckhpd,
1541     vunpckhps,
1542     vunpcklpd,
1543     vunpcklps,
1544     vzeroall,
1545     vzeroupper,
1546     wait,
1547     wbinvd,
1548     wrfsbase,
1549     wrgsbase,
1550     wrmsr,
1551     xabort,
1552     xacquire,
1553     xbegin,
1554     xchg,
1555     fxch,
1556     xcryptcbc,
1557     xcryptcfb,
1558     xcryptctr,
1559     xcryptecb,
1560     xcryptofb,
1561     xend,
1562     xgetbv,
1563     xlatb,
1564     xrelease,
1565     xrstor,
1566     xrstor64,
1567     xsave,
1568     xsave64,
1569     xsaveopt,
1570     xsaveopt64,
1571     xsetbv,
1572     xsha1,
1573     xsha256,
1574     xstore,
1575     xtest
1576 }
1577 
1578 /// Group of X86 instructions
1579 enum  X86InstructionGroup {
1580     invalid = 0,
1581 
1582     // Generic groups
1583     // All jump instructions (conditional+direct+indirect jumps)
1584     jump,
1585     // All call instructions
1586     call,
1587     // All return instructions
1588     ret,
1589     // All interrupt instructions (int+syscall)
1590     int_,
1591     // All interrupt return instructions
1592     iret,
1593 
1594     // Architecture-specific groups
1595     // All virtualization instructions (vt-x + amd-v)
1596     vm = 128,
1597     grp_3dnow,
1598     aes,
1599     adx,
1600     avx,
1601     avx2,
1602     avx512,
1603     bmi,
1604     bmi2,
1605     cmov,
1606     f16c,
1607     fma,
1608     fma4,
1609     fsgsbase,
1610     hle,
1611     mmx,
1612     mode32,
1613     mode64,
1614     rtm,
1615     sha,
1616     sse1,
1617     sse2,
1618     sse3,
1619     sse41,
1620     sse42,
1621     sse4a,
1622     ssse3,
1623     pclmul,
1624     xop,
1625     cdi,
1626     eri,
1627     tbm,
1628     grp_16bitmode,
1629     not64bitmode,
1630     sgx,
1631     dqi,
1632     bwi,
1633     pfi,
1634     vlx,
1635     smap,
1636     novlx
1637 }