ep_capstone/arch/
x86.rs

1use super::generated::{cs_x86, cs_x86_encoding, cs_x86_op, x86_op_mem};
2use core::marker::PhantomData;
3
4#[repr(transparent)]
5#[derive(Clone, Copy)]
6pub struct Details<'c> {
7    inner: cs_x86,
8    _phantom: PhantomData<&'c ()>,
9}
10
11impl<'c> Details<'c> {
12    /// Returns true if the instruction has the given prefix, or false otherwise.
13    pub fn has_prefix(&self, mut prefix: Prefix) -> bool {
14        if prefix == Prefix::RepE {
15            prefix = Prefix::Rep
16        }
17
18        let idx = match prefix {
19            Prefix::Lock | Prefix::Rep | Prefix::RepNE | Prefix::RepE => 0,
20            Prefix::CS | Prefix::SS | Prefix::DS | Prefix::ES | Prefix::FS | Prefix::GS => 1,
21            Prefix::OpSize => 2,
22            Prefix::AddrSize => 3,
23        };
24
25        self.inner.prefix[idx] == prefix.to_primitive()
26    }
27
28    /// Instruction opcode. This value can be from 1 to 4 bytes in size.
29    /// This will contain the VEX opcode as well.
30    pub fn opcode(&self) -> &[u8] {
31        let len = self.inner.opcode.iter().position(|&b| b == 0).unwrap_or(0);
32        &self.inner.opcode[..len]
33    }
34
35    /// Returns the REX prefix byte. This value is only relevant
36    /// for x86_64 and only if it is non-zero.
37    pub fn rex(&self) -> u8 {
38        self.inner.rex
39    }
40
41    /// Address size. This can be overriden by the [`Prefix::AddrSize`] prefix.
42    pub fn addr_size(&self) -> u8 {
43        self.inner.addr_size
44    }
45
46    /// Returns the ModR/M byte.
47    pub fn modrm(&self) -> u8 {
48        self.inner.modrm
49    }
50
51    /// Returns the SIB value. This will be zero if it is not relevant.
52    pub fn sib(&self) -> u8 {
53        self.inner.sib
54    }
55
56    /// Returns the displacement value. This is only valid if the value returned by [`Encoding::disp_offset`]
57    /// which can be retrieved via [`Details::encoding`] is a non-zero value.
58    pub fn disp(&self) -> i64 {
59        self.inner.disp
60    }
61
62    /// Returns the SIB index register, or [`Reg::Invalid`] when irrelevant
63    pub fn sib_index(&self) -> Reg {
64        Reg::from_c(self.inner.sib_index).unwrap_or(Reg::Invalid)
65    }
66
67    /// Returns the SIB scale, only applicable if sib_index is valid.
68    pub fn sib_scale(&self) -> i8 {
69        self.inner.sib_scale
70    }
71
72    /// Returns the SIB base register, or [`Reg::Invalid`] when irrelevant.
73    pub fn sib_base(&self) -> Reg {
74        Reg::from_c(self.inner.sib_base).unwrap_or(Reg::Invalid)
75    }
76
77    /// Returns the XOP condition code.
78    pub fn xop_cc(&self) -> XopCC {
79        XopCC::from_c(self.inner.xop_cc).unwrap_or(XopCC::Invalid)
80    }
81
82    /// Returns the SSE condition code.
83    pub fn sse_cc(&self) -> SseCC {
84        SseCC::from_c(self.inner.sse_cc).unwrap_or(SseCC::Invalid)
85    }
86
87    /// Returns the AVX condition code.
88    pub fn avx_cc(&self) -> AvxCC {
89        AvxCC::from_c(self.inner.avx_cc).unwrap_or(AvxCC::Invalid)
90    }
91
92    /// Returns the AVX suppress all exceptions flag.
93    pub fn avx_sae(&self) -> bool {
94        self.inner.avx_sae
95    }
96
97    /// Returns the AVX static rounding mode.
98    pub fn avx_rm(&self) -> AvxRm {
99        AvxRm::from_c(self.inner.avx_rm).unwrap_or(AvxRm::Invalid)
100    }
101
102    /// Returns the number of operands in this instruction, or
103    /// zero when this instruction has no operands. This value will
104    /// be the same as the length of the slice returned by [`Details::operands`].
105    pub fn op_count(&self) -> usize {
106        self.inner.op_count as usize
107    }
108
109    /// Returns the operands contained in this instruction. The length
110    /// of the returned slice will be the same as teh value returned
111    /// by [`Details::op_count`].
112    pub fn operands(&self) -> &[Op] {
113        unsafe {
114            &*(&self.inner.operands[..self.inner.op_count as usize] as *const [cs_x86_op]
115                as *const [Op])
116        }
117    }
118
119    /// Returns encoding information about this instruction.
120    pub fn encoding(&self) -> &Encoding {
121        unsafe { &*(&self.inner.encoding as *const cs_x86_encoding as *const Encoding) }
122    }
123
124    /// Returns the eflags updated by this instruction.
125    /// This should not be called if the instruction is an FPU instruction,
126    /// the return value will be undefined.
127    pub fn eflags(&self) -> EFlags {
128        EFlags::from_bits_truncate(unsafe { self.inner.__bindgen_anon_1.eflags })
129    }
130
131    /// Returns the FPU flags updated by this instruction.
132    /// This should only be called if the instruction is
133    /// in the FPU group, the return value will be undefined.
134    pub fn fpu_flags(&self) -> FpuFlags {
135        FpuFlags::from_bits_truncate(unsafe { self.inner.__bindgen_anon_1.fpu_flags })
136    }
137}
138
139#[repr(transparent)]
140#[derive(Clone, Copy)]
141pub struct Op {
142    inner: cs_x86_op,
143}
144
145impl Op {
146    /// Returns the type of this operand.
147    pub fn op_type(&self) -> OpType {
148        OpType::from_c(self.inner.type_).unwrap_or(OpType::Invalid)
149    }
150
151    /// Returns the value of this operand.
152    pub fn value(&self) -> OpValue {
153        match self.op_type() {
154            OpType::Invalid => OpValue::Imm(0),
155            OpType::Reg => OpValue::Reg(
156                Reg::from_c(unsafe { self.inner.__bindgen_anon_1.reg }).unwrap_or(Reg::Invalid),
157            ),
158            OpType::Imm => OpValue::Imm(unsafe { self.inner.__bindgen_anon_1.imm }),
159            OpType::Mem => OpValue::Mem(unsafe {
160                OpMem {
161                    inner: self.inner.__bindgen_anon_1.mem,
162                }
163            }),
164        }
165    }
166
167    /// Returns the size of this operand in bytes.
168    pub fn size(&self) -> usize {
169        self.inner.size as usize
170    }
171
172    /// Returns how this operand was accessed.
173    pub fn access(&self) -> super::Access {
174        super::Access::from_bits_truncate(self.inner.access)
175    }
176
177    /// Returns AVX broadcast type, or [`AvxBroadcast::Invalid`] if irrelevant.
178    pub fn avx_bcast(&self) -> AvxBroadcast {
179        AvxBroadcast::from_c(self.inner.avx_bcast).unwrap_or(AvxBroadcast::Invalid)
180    }
181
182    /// Returns the AVX zero opmask {Z}
183    pub fn avx_zero_opmask(&self) -> bool {
184        self.inner.avx_zero_opmask
185    }
186}
187
188pub enum OpValue {
189    Reg(Reg),
190    Imm(i64),
191    Mem(OpMem),
192}
193
194#[repr(transparent)]
195#[derive(Clone, Copy)]
196pub struct Encoding {
197    inner: cs_x86_encoding,
198}
199
200impl Encoding {
201    /// Returns the ModR/M offset, or 0 when irrelevant.
202    pub fn modrm_offset(&self) -> u8 {
203        self.inner.modrm_offset
204    }
205
206    /// Returns the displacement offset, or 0 when irrelevant.
207    pub fn disp_offset(&self) -> u8 {
208        self.inner.disp_offset
209    }
210
211    /// Returns the displacement size.
212    pub fn disp_size(&self) -> u8 {
213        self.inner.disp_size
214    }
215
216    /// Returns the immediate offset, or 0 when irrelevant.
217    pub fn imm_offset(&self) -> u8 {
218        self.inner.imm_offset
219    }
220
221    /// Returns the immediate size.
222    pub fn imm_size(&self) -> u8 {
223        self.inner.imm_size
224    }
225}
226
227#[repr(C)]
228#[derive(Clone, Copy)]
229pub struct OpMem {
230    inner: x86_op_mem,
231}
232
233impl OpMem {
234    /// Returns the segment register.
235    pub fn segment(&self) -> Reg {
236        Reg::from_c(self.inner.segment).unwrap_or(Reg::Invalid)
237    }
238
239    /// Returns the base register.
240    pub fn base(&self) -> Reg {
241        Reg::from_c(self.inner.base).unwrap_or(Reg::Invalid)
242    }
243
244    /// Returns the index register.
245    pub fn index(&self) -> Reg {
246        Reg::from_c(self.inner.index).unwrap_or(Reg::Invalid)
247    }
248
249    /// Returns the scale for the index register.
250    pub fn scale(&self) -> i32 {
251        self.inner.scale as i32
252    }
253
254    /// Returns the displacement value.
255    pub fn disp(&self) -> i64 {
256        self.inner.disp
257    }
258}
259
260c_enum! {
261    /// Instruction prefixes.
262    #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
263    pub enum Prefix: u8 {
264        /// LOCK prefix
265        Lock = 0xf0,
266        /// REP prefix
267        Rep = 0xf3,
268
269        // NOTE: This is a special case (!!!).
270        // It is swapped out with `Rep` when used.
271        /// REPE/REPZ prefix
272        RepE = 0x03,
273
274        /// REPNE prefix
275        RepNE = 0xf2,
276
277        /// CS segment override
278        CS = 0x2e,
279        /// SS segment override
280        SS = 0x36,
281        /// DS segment override
282        DS = 0x3e,
283        /// ES segment override
284        ES = 0x26,
285        /// FS segment override
286        FS = 0x64,
287        /// GS segment override
288        GS = 0x65,
289
290        /// Operand size override
291        OpSize = 0x66,
292
293        /// Address size override
294        AddrSize = 0x67,
295    }
296}
297
298c_enum! {
299    /// Operand type for an x86 instruction's operands.
300    #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
301    pub enum OpType: u8 {
302        /// Uninitialized.
303        Invalid = 0,
304        /// Register operand.
305        Reg,
306        /// Immediate operand.
307        Imm,
308        /// Memory operand.
309        Mem,
310    }
311}
312
313c_enum! {
314    /// XOP Code Condition Type.
315    #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
316    pub enum XopCC: u8 {
317        /// Uninitialized.
318        Invalid = 0,
319        Lt,
320        Le,
321        Get,
322        Ge,
323        Eq,
324        Neq,
325        False,
326        True,
327    }
328}
329
330c_enum! {
331    /// AXV broadcast type.
332    #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
333    pub enum AvxBroadcast: u8 {
334        Invalid = 0,
335        /// AVX 512 broadcast type {1to2}
336        To2,
337        /// AVX 512 broadcast type {1to4}
338        To4,
339        /// AVX 512 broadcast type {1to8}
340        To8,
341        /// AVX 512 broadcast type {1to16}
342        To16,
343    }
344}
345
346c_enum! {
347    /// SSE condition codes.
348    #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
349    pub enum SseCC: u8 {
350        Invalid = 0,
351        Eq,
352        Lt,
353        Le,
354        Unord,
355        Neq,
356        Nlt,
357        Nle,
358        Ord
359    }
360}
361
362c_enum! {
363    /// AVX condition codes.
364    #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
365    pub enum AvxCC: u8 {
366        Invalid = 0,
367        Eq,
368        Lt,
369        Le,
370        Unord,
371        Neq,
372        Nlt,
373        Nle,
374        Ord,
375        EqUq,
376        Nge,
377        Ngt,
378        False,
379        NeqOq,
380        Ge,
381        Gt,
382        True,
383        EqOs,
384        LtOq,
385        LeOq,
386        UnordS,
387        NeqUs,
388        NltUq,
389        NleUq,
390        OrdS,
391        EqUs,
392        NgeUq,
393        NgtUq,
394        FalseOs,
395        NeqOs,
396        GeOq,
397        GtOq,
398        TrueUs,
399    }
400}
401
402c_enum! {
403    /// AVX rounding modes.
404    #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
405    pub enum AvxRm: u8 {
406        Invalid = 0,
407        /// Round to nearest.
408        Rn,
409        /// Round down.
410        Rd,
411        /// Round up.
412        Ru,
413        /// Round towards zero.
414        Rz
415    }
416}
417
418bitflags::bitflags! {
419    pub struct EFlags: u64 {
420        const MODIFY_AF = 1 << 0;
421        const MODIFY_CF = 1 << 1;
422        const MODIFY_SF = 1 << 2;
423        const MODIFY_ZF = 1 << 3;
424        const MODIFY_PF = 1 << 4;
425        const MODIFY_OF = 1 << 5;
426        const MODIFY_TF = 1 << 6;
427        const MODIFY_IF = 1 << 7;
428        const MODIFY_DF = 1 << 8;
429        const MODIFY_NT = 1 << 9;
430        const MODIFY_RF = 1 << 10;
431        const PRIOR_OF = 1 << 11;
432        const PRIOR_SF = 1 << 12;
433        const PRIOR_ZF = 1 << 13;
434        const PRIOR_AF = 1 << 14;
435        const PRIOR_PF = 1 << 15;
436        const PRIOR_CF = 1 << 16;
437        const PRIOR_TF = 1 << 17;
438        const PRIOR_IF = 1 << 18;
439        const PRIOR_DF = 1 << 19;
440        const PRIOR_NT = 1 << 20;
441        const RESET_OF = 1 << 21;
442        const RESET_CF = 1 << 22;
443        const RESET_DF = 1 << 23;
444        const RESET_IF = 1 << 24;
445        const RESET_SF = 1 << 25;
446        const RESET_AF = 1 << 26;
447        const RESET_TF = 1 << 27;
448        const RESET_NT = 1 << 28;
449        const RESET_PF = 1 << 29;
450        const SET_CF = 1 << 30;
451        const SET_DF = 1 << 31;
452        const SET_IF = 1 << 32;
453        const TEST_OF = 1 << 33;
454        const TEST_SF = 1 << 34;
455        const TEST_ZF = 1 << 35;
456        const TEST_PF = 1 << 36;
457        const TEST_CF = 1 << 37;
458        const TEST_NT = 1 << 38;
459        const TEST_DF = 1 << 39;
460        const UNDEFINED_OF = 1 << 40;
461        const UNDEFINED_SF = 1 << 41;
462        const UNDEFINED_ZF = 1 << 42;
463        const UNDEFINED_PF = 1 << 43;
464        const UNDEFINED_AF = 1 << 44;
465        const UNDEFINED_CF = 1 << 45;
466        const RESET_RF = 1 << 46;
467        const TEST_RF = 1 << 47;
468        const TEST_IF = 1 << 48;
469        const TEST_TF = 1 << 49;
470        const TEST_AF = 1 << 50;
471        const RESET_ZF = 1 << 51;
472        const SET_OF = 1 << 52;
473        const SET_SF = 1 << 53;
474        const SET_ZF = 1 << 54;
475        const SET_AF = 1 << 55;
476        const SET_PF = 1 << 56;
477        const RESET_0F = 1 << 57;
478        const RESET_AC = 1 << 58;
479    }
480}
481
482bitflags::bitflags! {
483    pub struct FpuFlags: u64 {
484        const MODIFY_C0 = 1 << 0;
485        const MODIFY_C1 = 1 << 1;
486        const MODIFY_C2 = 1 << 2;
487        const MODIFY_C3 = 1 << 3;
488        const RESET_C0 = 1 << 4;
489        const RESET_C1 = 1 << 5;
490        const RESET_C2 = 1 << 6;
491        const RESET_C3 = 1 << 7;
492        const SET_C0 = 1 << 8;
493        const SET_C1 = 1 << 9;
494        const SET_C2 = 1 << 10;
495        const SET_C3 = 1 << 11;
496        const UNDEFINED_C0 = 1 << 12;
497        const UNDEFINED_C1 = 1 << 13;
498        const UNDEFINED_C2 = 1 << 14;
499        const UNDEFINED_C3 = 1 << 15;
500        const TEST_C0 = 1 << 16;
501        const TEST_C1 = 1 << 17;
502        const TEST_C2 = 1 << 18;
503        const TEST_C3 = 1 << 19;
504    }
505}
506
507#[repr(C)]
508#[derive(Clone, Copy)]
509union X86EFlagsOrFpuFlags {
510    /// EFLAGS updated by an instruction.
511    /// This can be from an OR combination of X86_EFLAGS_* symbols
512    eflags: u64,
513    /// FPU_FLAGS updated by an instruction.
514    /// This can be formed from an OR combination of X86_FPU_FLAGS_*
515    fpu_flags: u64,
516}
517
518c_enum_big! {
519    #[non_exhaustive]
520    #[derive(Copy, Clone, PartialEq, Eq, Hash)]
521    pub enum Reg: u8 {
522        @Start = Invalid,
523        @End   = Ending,
524
525        Invalid = 0,
526        Ah,
527        Al,
528        Ax,
529        Bh,
530        Bl,
531        Bp,
532        Bpl,
533        Bx,
534        Ch,
535        Cl,
536        Cs,
537        Cx,
538        Dh,
539        Di,
540        Dil,
541        Dl,
542        Ds,
543        Dx,
544        Eax,
545        Ebp,
546        Ebx,
547        Ecx,
548        Edi,
549        Edx,
550        Eflags,
551        Eip,
552        Eiz,
553        Es,
554        Esi,
555        Esp,
556        Fpsw,
557        Fs,
558        Gs,
559        Ip,
560        Rax,
561        Rbp,
562        Rbx,
563        Rcx,
564        Rdi,
565        Rdx,
566        Rip,
567        Riz,
568        Rsi,
569        Rsp,
570        Si,
571        Sil,
572        Sp,
573        Spl,
574        Ss,
575        Cr0,
576        Cr1,
577        Cr2,
578        Cr3,
579        Cr4,
580        Cr5,
581        Cr6,
582        Cr7,
583        Cr8,
584        Cr9,
585        Cr10,
586        Cr11,
587        Cr12,
588        Cr13,
589        Cr14,
590        Cr15,
591        Dr0,
592        Dr1,
593        Dr2,
594        Dr3,
595        Dr4,
596        Dr5,
597        Dr6,
598        Dr7,
599        Dr8,
600        Dr9,
601        Dr10,
602        Dr11,
603        Dr12,
604        Dr13,
605        Dr14,
606        Dr15,
607        Fp0,
608        Fp1,
609        Fp2,
610        Fp3,
611        Fp4,
612        Fp5,
613        Fp6,
614        Fp7,
615        K0,
616        K1,
617        K2,
618        K3,
619        K4,
620        K5,
621        K6,
622        K7,
623        Mm0,
624        Mm1,
625        Mm2,
626        Mm3,
627        Mm4,
628        Mm5,
629        Mm6,
630        Mm7,
631        R8,
632        R9,
633        R10,
634        R11,
635        R12,
636        R13,
637        R14,
638        R15,
639        St0,
640        St1,
641        St2,
642        St3,
643        St4,
644        St5,
645        St6,
646        St7,
647        Xmm0,
648        Xmm1,
649        Xmm2,
650        Xmm3,
651        Xmm4,
652        Xmm5,
653        Xmm6,
654        Xmm7,
655        Xmm8,
656        Xmm9,
657        Xmm10,
658        Xmm11,
659        Xmm12,
660        Xmm13,
661        Xmm14,
662        Xmm15,
663        Xmm16,
664        Xmm17,
665        Xmm18,
666        Xmm19,
667        Xmm20,
668        Xmm21,
669        Xmm22,
670        Xmm23,
671        Xmm24,
672        Xmm25,
673        Xmm26,
674        Xmm27,
675        Xmm28,
676        Xmm29,
677        Xmm30,
678        Xmm31,
679        Ymm0,
680        Ymm1,
681        Ymm2,
682        Ymm3,
683        Ymm4,
684        Ymm5,
685        Ymm6,
686        Ymm7,
687        Ymm8,
688        Ymm9,
689        Ymm10,
690        Ymm11,
691        Ymm12,
692        Ymm13,
693        Ymm14,
694        Ymm15,
695        Ymm16,
696        Ymm17,
697        Ymm18,
698        Ymm19,
699        Ymm20,
700        Ymm21,
701        Ymm22,
702        Ymm23,
703        Ymm24,
704        Ymm25,
705        Ymm26,
706        Ymm27,
707        Ymm28,
708        Ymm29,
709        Ymm30,
710        Ymm31,
711        Zmm0,
712        Zmm1,
713        Zmm2,
714        Zmm3,
715        Zmm4,
716        Zmm5,
717        Zmm6,
718        Zmm7,
719        Zmm8,
720        Zmm9,
721        Zmm10,
722        Zmm11,
723        Zmm12,
724        Zmm13,
725        Zmm14,
726        Zmm15,
727        Zmm16,
728        Zmm17,
729        Zmm18,
730        Zmm19,
731        Zmm20,
732        Zmm21,
733        Zmm22,
734        Zmm23,
735        Zmm24,
736        Zmm25,
737        Zmm26,
738        Zmm27,
739        Zmm28,
740        Zmm29,
741        Zmm30,
742        Zmm31,
743        R8b,
744        R9b,
745        R10b,
746        R11b,
747        R12b,
748        R13b,
749        R14b,
750        R15b,
751        R8d,
752        R9d,
753        R10d,
754        R11d,
755        R12d,
756        R13d,
757        R14d,
758        R15d,
759        R8w,
760        R9w,
761        R10w,
762        R11w,
763        R12w,
764        R13w,
765        R14w,
766        R15w,
767
768        #[doc(hidden)]
769        Ending,
770    }
771}
772
773c_enum_big! {
774    #[non_exhaustive]
775    #[derive(Copy, Clone, PartialEq, Eq, Hash)]
776    pub enum InsnId: u16 {
777        @Start = Invalid,
778        @End   = Ending,
779
780        Invalid = 0,
781
782        Aaa,
783        Aad,
784        Aam,
785        Aas,
786        Fabs,
787        Adc,
788        Adcx,
789        Add,
790        Addpd,
791        Addps,
792        Addsd,
793        Addss,
794        Addsubpd,
795        Addsubps,
796        Fadd,
797        Fiadd,
798        Faddp,
799        Adox,
800        Aesdeclast,
801        Aesdec,
802        Aesenclast,
803        Aesenc,
804        Aesimc,
805        Aeskeygenassist,
806        And,
807        Andn,
808        Andnpd,
809        Andnps,
810        Andpd,
811        Andps,
812        Arpl,
813        Bextr,
814        Blcfill,
815        Blci,
816        Blcic,
817        Blcmsk,
818        Blcs,
819        Blendpd,
820        Blendps,
821        Blendvpd,
822        Blendvps,
823        Blsfill,
824        Blsi,
825        Blsic,
826        Blsmsk,
827        Blsr,
828        Bound,
829        Bsf,
830        Bsr,
831        Bswap,
832        Bt,
833        Btc,
834        Btr,
835        Bts,
836        Bzhi,
837        Call,
838        Cbw,
839        Cdq,
840        Cdqe,
841        Fchs,
842        Clac,
843        Clc,
844        Cld,
845        Clflush,
846        Clflushopt,
847        Clgi,
848        Cli,
849        Clts,
850        Clwb,
851        Cmc,
852        Cmova,
853        Cmovae,
854        Cmovb,
855        Cmovbe,
856        Fcmovbe,
857        Fcmovb,
858        Cmove,
859        Fcmove,
860        Cmovg,
861        Cmovge,
862        Cmovl,
863        Cmovle,
864        Fcmovnbe,
865        Fcmovnb,
866        Cmovne,
867        Fcmovne,
868        Cmovno,
869        Cmovnp,
870        Fcmovnu,
871        Cmovns,
872        Cmovo,
873        Cmovp,
874        Fcmovu,
875        Cmovs,
876        Cmp,
877        Cmpsb,
878        Cmpsq,
879        Cmpsw,
880        Cmpxchg16b,
881        Cmpxchg,
882        Cmpxchg8b,
883        Comisd,
884        Comiss,
885        Fcomp,
886        Fcomip,
887        Fcomi,
888        Fcom,
889        Fcos,
890        Cpuid,
891        Cqo,
892        Crc32,
893        Cvtdq2pd,
894        Cvtdq2ps,
895        Cvtpd2dq,
896        Cvtpd2ps,
897        Cvtps2dq,
898        Cvtps2pd,
899        Cvtsd2si,
900        Cvtsd2ss,
901        Cvtsi2sd,
902        Cvtsi2ss,
903        Cvtss2sd,
904        Cvtss2si,
905        Cvttpd2dq,
906        Cvttps2dq,
907        Cvttsd2si,
908        Cvttss2si,
909        Cwd,
910        Cwde,
911        Daa,
912        Das,
913        Data16,
914        Dec,
915        Div,
916        Divpd,
917        Divps,
918        Fdivr,
919        Fidivr,
920        Fdivrp,
921        Divsd,
922        Divss,
923        Fdiv,
924        Fidiv,
925        Fdivp,
926        Dppd,
927        Dpps,
928        Ret,
929        Encls,
930        Enclu,
931        Enter,
932        Extractps,
933        Extrq,
934        F2xm1,
935        Lcall,
936        Ljmp,
937        Fbld,
938        Fbstp,
939        Fcompp,
940        Fdecstp,
941        Femms,
942        Ffree,
943        Ficom,
944        Ficomp,
945        Fincstp,
946        Fldcw,
947        Fldenv,
948        Fldl2e,
949        Fldl2t,
950        Fldlg2,
951        Fldln2,
952        Fldpi,
953        Fnclex,
954        Fninit,
955        Fnop,
956        Fnstcw,
957        Fnstsw,
958        Fpatan,
959        Fprem,
960        Fprem1,
961        Fptan,
962        Ffreep,
963        Frndint,
964        Frstor,
965        Fnsave,
966        Fscale,
967        Fsetpm,
968        Fsincos,
969        Fnstenv,
970        Fxam,
971        Fxrstor,
972        Fxrstor64,
973        Fxsave,
974        Fxsave64,
975        Fxtract,
976        Fyl2x,
977        Fyl2xp1,
978        Movapd,
979        Movaps,
980        Orpd,
981        Orps,
982        Vmovapd,
983        Vmovaps,
984        Xorpd,
985        Xorps,
986        Getsec,
987        Haddpd,
988        Haddps,
989        Hlt,
990        Hsubpd,
991        Hsubps,
992        Idiv,
993        Fild,
994        Imul,
995        In,
996        Inc,
997        Insb,
998        Insertps,
999        Insertq,
1000        Insd,
1001        Insw,
1002        Int,
1003        Int1,
1004        Int3,
1005        Into,
1006        Invd,
1007        Invept,
1008        Invlpg,
1009        Invlpga,
1010        Invpcid,
1011        Invvpid,
1012        Iret,
1013        Iretd,
1014        Iretq,
1015        Fisttp,
1016        Fist,
1017        Fistp,
1018        Ucomisd,
1019        Ucomiss,
1020        Vcomisd,
1021        Vcomiss,
1022        Vcvtsd2ss,
1023        Vcvtsi2sd,
1024        Vcvtsi2ss,
1025        Vcvtss2sd,
1026        Vcvttsd2si,
1027        Vcvttsd2usi,
1028        Vcvttss2si,
1029        Vcvttss2usi,
1030        Vcvtusi2sd,
1031        Vcvtusi2ss,
1032        Vucomisd,
1033        Vucomiss,
1034        Jae,
1035        Ja,
1036        Jbe,
1037        Jb,
1038        Jcxz,
1039        Jecxz,
1040        Je,
1041        Jge,
1042        Jg,
1043        Jle,
1044        Jl,
1045        Jmp,
1046        Jne,
1047        Jno,
1048        Jnp,
1049        Jns,
1050        Jo,
1051        Jp,
1052        Jrcxz,
1053        Js,
1054        Kandb,
1055        Kandd,
1056        Kandnb,
1057        Kandnd,
1058        Kandnq,
1059        Kandnw,
1060        Kandq,
1061        Kandw,
1062        Kmovb,
1063        Kmovd,
1064        Kmovq,
1065        Kmovw,
1066        Knotb,
1067        Knotd,
1068        Knotq,
1069        Knotw,
1070        Korb,
1071        Kord,
1072        Korq,
1073        Kortestb,
1074        Kortestd,
1075        Kortestq,
1076        Kortestw,
1077        Korw,
1078        Kshiftlb,
1079        Kshiftld,
1080        Kshiftlq,
1081        Kshiftlw,
1082        Kshiftrb,
1083        Kshiftrd,
1084        Kshiftrq,
1085        Kshiftrw,
1086        Kunpckbw,
1087        Kxnorb,
1088        Kxnord,
1089        Kxnorq,
1090        Kxnorw,
1091        Kxorb,
1092        Kxord,
1093        Kxorq,
1094        Kxorw,
1095        Lahf,
1096        Lar,
1097        Lddqu,
1098        Ldmxcsr,
1099        Lds,
1100        Fldz,
1101        Fld1,
1102        Fld,
1103        Lea,
1104        Leave,
1105        Les,
1106        Lfence,
1107        Lfs,
1108        Lgdt,
1109        Lgs,
1110        Lidt,
1111        Lldt,
1112        Lmsw,
1113        Or,
1114        Sub,
1115        Xor,
1116        Lodsb,
1117        Lodsd,
1118        Lodsq,
1119        Lodsw,
1120        Loop,
1121        Loope,
1122        Loopne,
1123        Retf,
1124        Retfq,
1125        Lsl,
1126        Lss,
1127        Ltr,
1128        Xadd,
1129        Lzcnt,
1130        Maskmovdqu,
1131        Maxpd,
1132        Maxps,
1133        Maxsd,
1134        Maxss,
1135        Mfence,
1136        Minpd,
1137        Minps,
1138        Minsd,
1139        Minss,
1140        Cvtpd2pi,
1141        Cvtpi2pd,
1142        Cvtpi2ps,
1143        Cvtps2pi,
1144        Cvttpd2pi,
1145        Cvttps2pi,
1146        Emms,
1147        Maskmovq,
1148        Movd,
1149        Movdq2q,
1150        Movntq,
1151        Movq2dq,
1152        Movq,
1153        Pabsb,
1154        Pabsd,
1155        Pabsw,
1156        Packssdw,
1157        Packsswb,
1158        Packuswb,
1159        Paddb,
1160        Paddd,
1161        Paddq,
1162        Paddsb,
1163        Paddsw,
1164        Paddusb,
1165        Paddusw,
1166        Paddw,
1167        Palignr,
1168        Pandn,
1169        Pand,
1170        Pavgb,
1171        Pavgw,
1172        Pcmpeqb,
1173        Pcmpeqd,
1174        Pcmpeqw,
1175        Pcmpgtb,
1176        Pcmpgtd,
1177        Pcmpgtw,
1178        Pextrw,
1179        Phaddsw,
1180        Phaddw,
1181        Phaddd,
1182        Phsubd,
1183        Phsubsw,
1184        Phsubw,
1185        Pinsrw,
1186        Pmaddubsw,
1187        Pmaddwd,
1188        Pmaxsw,
1189        Pmaxub,
1190        Pminsw,
1191        Pminub,
1192        Pmovmskb,
1193        Pmulhrsw,
1194        Pmulhuw,
1195        Pmulhw,
1196        Pmullw,
1197        Pmuludq,
1198        Por,
1199        Psadbw,
1200        Pshufb,
1201        Pshufw,
1202        Psignb,
1203        Psignd,
1204        Psignw,
1205        Pslld,
1206        Psllq,
1207        Psllw,
1208        Psrad,
1209        Psraw,
1210        Psrld,
1211        Psrlq,
1212        Psrlw,
1213        Psubb,
1214        Psubd,
1215        Psubq,
1216        Psubsb,
1217        Psubsw,
1218        Psubusb,
1219        Psubusw,
1220        Psubw,
1221        Punpckhbw,
1222        Punpckhdq,
1223        Punpckhwd,
1224        Punpcklbw,
1225        Punpckldq,
1226        Punpcklwd,
1227        Pxor,
1228        Monitor,
1229        Montmul,
1230        Mov,
1231        Movabs,
1232        Movbe,
1233        Movddup,
1234        Movdqa,
1235        Movdqu,
1236        Movhlps,
1237        Movhpd,
1238        Movhps,
1239        Movlhps,
1240        Movlpd,
1241        Movlps,
1242        Movmskpd,
1243        Movmskps,
1244        Movntdqa,
1245        Movntdq,
1246        Movnti,
1247        Movntpd,
1248        Movntps,
1249        Movntsd,
1250        Movntss,
1251        Movsb,
1252        Movsd,
1253        Movshdup,
1254        Movsldup,
1255        Movsq,
1256        Movss,
1257        Movsw,
1258        Movsx,
1259        Movsxd,
1260        Movupd,
1261        Movups,
1262        Movzx,
1263        Mpsadbw,
1264        Mul,
1265        Mulpd,
1266        Mulps,
1267        Mulsd,
1268        Mulss,
1269        Mulx,
1270        Fmul,
1271        Fimul,
1272        Fmulp,
1273        Mwait,
1274        Neg,
1275        Nop,
1276        Not,
1277        Out,
1278        Outsb,
1279        Outsd,
1280        Outsw,
1281        Packusdw,
1282        Pause,
1283        Pavgusb,
1284        Pblendvb,
1285        Pblendw,
1286        Pclmulqdq,
1287        Pcmpeqq,
1288        Pcmpestri,
1289        Pcmpestrm,
1290        Pcmpgtq,
1291        Pcmpistri,
1292        Pcmpistrm,
1293        Pcommit,
1294        Pdep,
1295        Pext,
1296        Pextrb,
1297        Pextrd,
1298        Pextrq,
1299        Pf2id,
1300        Pf2iw,
1301        Pfacc,
1302        Pfadd,
1303        Pfcmpeq,
1304        Pfcmpge,
1305        Pfcmpgt,
1306        Pfmax,
1307        Pfmin,
1308        Pfmul,
1309        Pfnacc,
1310        Pfpnacc,
1311        Pfrcpit1,
1312        Pfrcpit2,
1313        Pfrcp,
1314        Pfrsqit1,
1315        Pfrsqrt,
1316        Pfsubr,
1317        Pfsub,
1318        Phminposuw,
1319        Pi2fd,
1320        Pi2fw,
1321        Pinsrb,
1322        Pinsrd,
1323        Pinsrq,
1324        Pmaxsb,
1325        Pmaxsd,
1326        Pmaxud,
1327        Pmaxuw,
1328        Pminsb,
1329        Pminsd,
1330        Pminud,
1331        Pminuw,
1332        Pmovsxbd,
1333        Pmovsxbq,
1334        Pmovsxbw,
1335        Pmovsxdq,
1336        Pmovsxwd,
1337        Pmovsxwq,
1338        Pmovzxbd,
1339        Pmovzxbq,
1340        Pmovzxbw,
1341        Pmovzxdq,
1342        Pmovzxwd,
1343        Pmovzxwq,
1344        Pmuldq,
1345        Pmulhrw,
1346        Pmulld,
1347        Pop,
1348        Popaw,
1349        Popal,
1350        Popcnt,
1351        Popf,
1352        Popfd,
1353        Popfq,
1354        Prefetch,
1355        Prefetchnta,
1356        Prefetcht0,
1357        Prefetcht1,
1358        Prefetcht2,
1359        Prefetchw,
1360        Pshufd,
1361        Pshufhw,
1362        Pshuflw,
1363        Pslldq,
1364        Psrldq,
1365        Pswapd,
1366        Ptest,
1367        Punpckhqdq,
1368        Punpcklqdq,
1369        Push,
1370        Pushaw,
1371        Pushal,
1372        Pushf,
1373        Pushfd,
1374        Pushfq,
1375        Rcl,
1376        Rcpps,
1377        Rcpss,
1378        Rcr,
1379        Rdfsbase,
1380        Rdgsbase,
1381        Rdmsr,
1382        Rdpmc,
1383        Rdrand,
1384        Rdseed,
1385        Rdtsc,
1386        Rdtscp,
1387        Rol,
1388        Ror,
1389        Rorx,
1390        Roundpd,
1391        Roundps,
1392        Roundsd,
1393        Roundss,
1394        Rsm,
1395        Rsqrtps,
1396        Rsqrtss,
1397        Sahf,
1398        Sal,
1399        Salc,
1400        Sar,
1401        Sarx,
1402        Sbb,
1403        Scasb,
1404        Scasd,
1405        Scasq,
1406        Scasw,
1407        Setae,
1408        Seta,
1409        Setbe,
1410        Setb,
1411        Sete,
1412        Setge,
1413        Setg,
1414        Setle,
1415        Setl,
1416        Setne,
1417        Setno,
1418        Setnp,
1419        Setns,
1420        Seto,
1421        Setp,
1422        Sets,
1423        Sfence,
1424        Sgdt,
1425        Sha1msg1,
1426        Sha1msg2,
1427        Sha1nexte,
1428        Sha1rnds4,
1429        Sha256msg1,
1430        Sha256msg2,
1431        Sha256rnds2,
1432        Shl,
1433        Shld,
1434        Shlx,
1435        Shr,
1436        Shrd,
1437        Shrx,
1438        Shufpd,
1439        Shufps,
1440        Sidt,
1441        Fsin,
1442        Skinit,
1443        Sldt,
1444        Smsw,
1445        Sqrtpd,
1446        Sqrtps,
1447        Sqrtsd,
1448        Sqrtss,
1449        Fsqrt,
1450        Stac,
1451        Stc,
1452        Std,
1453        Stgi,
1454        Sti,
1455        Stmxcsr,
1456        Stosb,
1457        Stosd,
1458        Stosq,
1459        Stosw,
1460        Str,
1461        Fst,
1462        Fstp,
1463        Fstpnce,
1464        Fxch,
1465        Subpd,
1466        Subps,
1467        Fsubr,
1468        Fisubr,
1469        Fsubrp,
1470        Subsd,
1471        Subss,
1472        Fsub,
1473        Fisub,
1474        Fsubp,
1475        Swapgs,
1476        Syscall,
1477        Sysenter,
1478        Sysexit,
1479        Sysret,
1480        T1mskc,
1481        Test,
1482        Ud2,
1483        Ftst,
1484        Tzcnt,
1485        Tzmsk,
1486        Fucomip,
1487        Fucomi,
1488        Fucompp,
1489        Fucomp,
1490        Fucom,
1491        Ud2b,
1492        Unpckhpd,
1493        Unpckhps,
1494        Unpcklpd,
1495        Unpcklps,
1496        Vaddpd,
1497        Vaddps,
1498        Vaddsd,
1499        Vaddss,
1500        Vaddsubpd,
1501        Vaddsubps,
1502        Vaesdeclast,
1503        Vaesdec,
1504        Vaesenclast,
1505        Vaesenc,
1506        Vaesimc,
1507        Vaeskeygenassist,
1508        Valignd,
1509        Valignq,
1510        Vandnpd,
1511        Vandnps,
1512        Vandpd,
1513        Vandps,
1514        Vblendmpd,
1515        Vblendmps,
1516        Vblendpd,
1517        Vblendps,
1518        Vblendvpd,
1519        Vblendvps,
1520        Vbroadcastf128,
1521        Vbroadcasti32x4,
1522        Vbroadcasti64x4,
1523        Vbroadcastsd,
1524        Vbroadcastss,
1525        Vcompresspd,
1526        Vcompressps,
1527        Vcvtdq2pd,
1528        Vcvtdq2ps,
1529        Vcvtpd2dqx,
1530        Vcvtpd2dq,
1531        Vcvtpd2psx,
1532        Vcvtpd2ps,
1533        Vcvtpd2udq,
1534        Vcvtph2ps,
1535        Vcvtps2dq,
1536        Vcvtps2pd,
1537        Vcvtps2ph,
1538        Vcvtps2udq,
1539        Vcvtsd2si,
1540        Vcvtsd2usi,
1541        Vcvtss2si,
1542        Vcvtss2usi,
1543        Vcvttpd2dqx,
1544        Vcvttpd2dq,
1545        Vcvttpd2udq,
1546        Vcvttps2dq,
1547        Vcvttps2udq,
1548        Vcvtudq2pd,
1549        Vcvtudq2ps,
1550        Vdivpd,
1551        Vdivps,
1552        Vdivsd,
1553        Vdivss,
1554        Vdppd,
1555        Vdpps,
1556        Verr,
1557        Verw,
1558        Vexp2pd,
1559        Vexp2ps,
1560        Vexpandpd,
1561        Vexpandps,
1562        Vextractf128,
1563        Vextractf32x4,
1564        Vextractf64x4,
1565        Vextracti128,
1566        Vextracti32x4,
1567        Vextracti64x4,
1568        Vextractps,
1569        Vfmadd132pd,
1570        Vfmadd132ps,
1571        Vfmaddpd,
1572        Vfmadd213pd,
1573        Vfmadd231pd,
1574        Vfmaddps,
1575        Vfmadd213ps,
1576        Vfmadd231ps,
1577        Vfmaddsd,
1578        Vfmadd213sd,
1579        Vfmadd132sd,
1580        Vfmadd231sd,
1581        Vfmaddss,
1582        Vfmadd213ss,
1583        Vfmadd132ss,
1584        Vfmadd231ss,
1585        Vfmaddsub132pd,
1586        Vfmaddsub132ps,
1587        Vfmaddsubpd,
1588        Vfmaddsub213pd,
1589        Vfmaddsub231pd,
1590        Vfmaddsubps,
1591        Vfmaddsub213ps,
1592        Vfmaddsub231ps,
1593        Vfmsub132pd,
1594        Vfmsub132ps,
1595        Vfmsubadd132pd,
1596        Vfmsubadd132ps,
1597        Vfmsubaddpd,
1598        Vfmsubadd213pd,
1599        Vfmsubadd231pd,
1600        Vfmsubaddps,
1601        Vfmsubadd213ps,
1602        Vfmsubadd231ps,
1603        Vfmsubpd,
1604        Vfmsub213pd,
1605        Vfmsub231pd,
1606        Vfmsubps,
1607        Vfmsub213ps,
1608        Vfmsub231ps,
1609        Vfmsubsd,
1610        Vfmsub213sd,
1611        Vfmsub132sd,
1612        Vfmsub231sd,
1613        Vfmsubss,
1614        Vfmsub213ss,
1615        Vfmsub132ss,
1616        Vfmsub231ss,
1617        Vfnmadd132pd,
1618        Vfnmadd132ps,
1619        Vfnmaddpd,
1620        Vfnmadd213pd,
1621        Vfnmadd231pd,
1622        Vfnmaddps,
1623        Vfnmadd213ps,
1624        Vfnmadd231ps,
1625        Vfnmaddsd,
1626        Vfnmadd213sd,
1627        Vfnmadd132sd,
1628        Vfnmadd231sd,
1629        Vfnmaddss,
1630        Vfnmadd213ss,
1631        Vfnmadd132ss,
1632        Vfnmadd231ss,
1633        Vfnmsub132pd,
1634        Vfnmsub132ps,
1635        Vfnmsubpd,
1636        Vfnmsub213pd,
1637        Vfnmsub231pd,
1638        Vfnmsubps,
1639        Vfnmsub213ps,
1640        Vfnmsub231ps,
1641        Vfnmsubsd,
1642        Vfnmsub213sd,
1643        Vfnmsub132sd,
1644        Vfnmsub231sd,
1645        Vfnmsubss,
1646        Vfnmsub213ss,
1647        Vfnmsub132ss,
1648        Vfnmsub231ss,
1649        Vfrczpd,
1650        Vfrczps,
1651        Vfrczsd,
1652        Vfrczss,
1653        Vorpd,
1654        Vorps,
1655        Vxorpd,
1656        Vxorps,
1657        Vgatherdpd,
1658        Vgatherdps,
1659        Vgatherpf0dpd,
1660        Vgatherpf0dps,
1661        Vgatherpf0qpd,
1662        Vgatherpf0qps,
1663        Vgatherpf1dpd,
1664        Vgatherpf1dps,
1665        Vgatherpf1qpd,
1666        Vgatherpf1qps,
1667        Vgatherqpd,
1668        Vgatherqps,
1669        Vhaddpd,
1670        Vhaddps,
1671        Vhsubpd,
1672        Vhsubps,
1673        Vinsertf128,
1674        Vinsertf32x4,
1675        Vinsertf32x8,
1676        Vinsertf64x2,
1677        Vinsertf64x4,
1678        Vinserti128,
1679        Vinserti32x4,
1680        Vinserti32x8,
1681        Vinserti64x2,
1682        Vinserti64x4,
1683        Vinsertps,
1684        Vlddqu,
1685        Vldmxcsr,
1686        Vmaskmovdqu,
1687        Vmaskmovpd,
1688        Vmaskmovps,
1689        Vmaxpd,
1690        Vmaxps,
1691        Vmaxsd,
1692        Vmaxss,
1693        Vmcall,
1694        Vmclear,
1695        Vmfunc,
1696        Vminpd,
1697        Vminps,
1698        Vminsd,
1699        Vminss,
1700        Vmlaunch,
1701        Vmload,
1702        Vmmcall,
1703        Vmovq,
1704        Vmovddup,
1705        Vmovd,
1706        Vmovdqa32,
1707        Vmovdqa64,
1708        Vmovdqa,
1709        Vmovdqu16,
1710        Vmovdqu32,
1711        Vmovdqu64,
1712        Vmovdqu8,
1713        Vmovdqu,
1714        Vmovhlps,
1715        Vmovhpd,
1716        Vmovhps,
1717        Vmovlhps,
1718        Vmovlpd,
1719        Vmovlps,
1720        Vmovmskpd,
1721        Vmovmskps,
1722        Vmovntdqa,
1723        Vmovntdq,
1724        Vmovntpd,
1725        Vmovntps,
1726        Vmovsd,
1727        Vmovshdup,
1728        Vmovsldup,
1729        Vmovss,
1730        Vmovupd,
1731        Vmovups,
1732        Vmpsadbw,
1733        Vmptrld,
1734        Vmptrst,
1735        Vmread,
1736        Vmresume,
1737        Vmrun,
1738        Vmsave,
1739        Vmulpd,
1740        Vmulps,
1741        Vmulsd,
1742        Vmulss,
1743        Vmwrite,
1744        Vmxoff,
1745        Vmxon,
1746        Vpabsb,
1747        Vpabsd,
1748        Vpabsq,
1749        Vpabsw,
1750        Vpackssdw,
1751        Vpacksswb,
1752        Vpackusdw,
1753        Vpackuswb,
1754        Vpaddb,
1755        Vpaddd,
1756        Vpaddq,
1757        Vpaddsb,
1758        Vpaddsw,
1759        Vpaddusb,
1760        Vpaddusw,
1761        Vpaddw,
1762        Vpalignr,
1763        Vpandd,
1764        Vpandnd,
1765        Vpandnq,
1766        Vpandn,
1767        Vpandq,
1768        Vpand,
1769        Vpavgb,
1770        Vpavgw,
1771        Vpblendd,
1772        Vpblendmb,
1773        Vpblendmd,
1774        Vpblendmq,
1775        Vpblendmw,
1776        Vpblendvb,
1777        Vpblendw,
1778        Vpbroadcastb,
1779        Vpbroadcastd,
1780        Vpbroadcastmb2q,
1781        Vpbroadcastmw2d,
1782        Vpbroadcastq,
1783        Vpbroadcastw,
1784        Vpclmulqdq,
1785        Vpcmov,
1786        Vpcmpb,
1787        Vpcmpd,
1788        Vpcmpeqb,
1789        Vpcmpeqd,
1790        Vpcmpeqq,
1791        Vpcmpeqw,
1792        Vpcmpestri,
1793        Vpcmpestrm,
1794        Vpcmpgtb,
1795        Vpcmpgtd,
1796        Vpcmpgtq,
1797        Vpcmpgtw,
1798        Vpcmpistri,
1799        Vpcmpistrm,
1800        Vpcmpq,
1801        Vpcmpub,
1802        Vpcmpud,
1803        Vpcmpuq,
1804        Vpcmpuw,
1805        Vpcmpw,
1806        Vpcomb,
1807        Vpcomd,
1808        Vpcompressd,
1809        Vpcompressq,
1810        Vpcomq,
1811        Vpcomub,
1812        Vpcomud,
1813        Vpcomuq,
1814        Vpcomuw,
1815        Vpcomw,
1816        Vpconflictd,
1817        Vpconflictq,
1818        Vperm2f128,
1819        Vperm2i128,
1820        Vpermd,
1821        Vpermi2d,
1822        Vpermi2pd,
1823        Vpermi2ps,
1824        Vpermi2q,
1825        Vpermil2pd,
1826        Vpermil2ps,
1827        Vpermilpd,
1828        Vpermilps,
1829        Vpermpd,
1830        Vpermps,
1831        Vpermq,
1832        Vpermt2d,
1833        Vpermt2pd,
1834        Vpermt2ps,
1835        Vpermt2q,
1836        Vpexpandd,
1837        Vpexpandq,
1838        Vpextrb,
1839        Vpextrd,
1840        Vpextrq,
1841        Vpextrw,
1842        Vpgatherdd,
1843        Vpgatherdq,
1844        Vpgatherqd,
1845        Vpgatherqq,
1846        Vphaddbd,
1847        Vphaddbq,
1848        Vphaddbw,
1849        Vphadddq,
1850        Vphaddd,
1851        Vphaddsw,
1852        Vphaddubd,
1853        Vphaddubq,
1854        Vphaddubw,
1855        Vphaddudq,
1856        Vphadduwd,
1857        Vphadduwq,
1858        Vphaddwd,
1859        Vphaddwq,
1860        Vphaddw,
1861        Vphminposuw,
1862        Vphsubbw,
1863        Vphsubdq,
1864        Vphsubd,
1865        Vphsubsw,
1866        Vphsubwd,
1867        Vphsubw,
1868        Vpinsrb,
1869        Vpinsrd,
1870        Vpinsrq,
1871        Vpinsrw,
1872        Vplzcntd,
1873        Vplzcntq,
1874        Vpmacsdd,
1875        Vpmacsdqh,
1876        Vpmacsdql,
1877        Vpmacssdd,
1878        Vpmacssdqh,
1879        Vpmacssdql,
1880        Vpmacsswd,
1881        Vpmacssww,
1882        Vpmacswd,
1883        Vpmacsww,
1884        Vpmadcsswd,
1885        Vpmadcswd,
1886        Vpmaddubsw,
1887        Vpmaddwd,
1888        Vpmaskmovd,
1889        Vpmaskmovq,
1890        Vpmaxsb,
1891        Vpmaxsd,
1892        Vpmaxsq,
1893        Vpmaxsw,
1894        Vpmaxub,
1895        Vpmaxud,
1896        Vpmaxuq,
1897        Vpmaxuw,
1898        Vpminsb,
1899        Vpminsd,
1900        Vpminsq,
1901        Vpminsw,
1902        Vpminub,
1903        Vpminud,
1904        Vpminuq,
1905        Vpminuw,
1906        Vpmovdb,
1907        Vpmovdw,
1908        Vpmovm2b,
1909        Vpmovm2d,
1910        Vpmovm2q,
1911        Vpmovm2w,
1912        Vpmovmskb,
1913        Vpmovqb,
1914        Vpmovqd,
1915        Vpmovqw,
1916        Vpmovsdb,
1917        Vpmovsdw,
1918        Vpmovsqb,
1919        Vpmovsqd,
1920        Vpmovsqw,
1921        Vpmovsxbd,
1922        Vpmovsxbq,
1923        Vpmovsxbw,
1924        Vpmovsxdq,
1925        Vpmovsxwd,
1926        Vpmovsxwq,
1927        Vpmovusdb,
1928        Vpmovusdw,
1929        Vpmovusqb,
1930        Vpmovusqd,
1931        Vpmovusqw,
1932        Vpmovzxbd,
1933        Vpmovzxbq,
1934        Vpmovzxbw,
1935        Vpmovzxdq,
1936        Vpmovzxwd,
1937        Vpmovzxwq,
1938        Vpmuldq,
1939        Vpmulhrsw,
1940        Vpmulhuw,
1941        Vpmulhw,
1942        Vpmulld,
1943        Vpmullq,
1944        Vpmullw,
1945        Vpmuludq,
1946        Vpord,
1947        Vporq,
1948        Vpor,
1949        Vpperm,
1950        Vprotb,
1951        Vprotd,
1952        Vprotq,
1953        Vprotw,
1954        Vpsadbw,
1955        Vpscatterdd,
1956        Vpscatterdq,
1957        Vpscatterqd,
1958        Vpscatterqq,
1959        Vpshab,
1960        Vpshad,
1961        Vpshaq,
1962        Vpshaw,
1963        Vpshlb,
1964        Vpshld,
1965        Vpshlq,
1966        Vpshlw,
1967        Vpshufb,
1968        Vpshufd,
1969        Vpshufhw,
1970        Vpshuflw,
1971        Vpsignb,
1972        Vpsignd,
1973        Vpsignw,
1974        Vpslldq,
1975        Vpslld,
1976        Vpsllq,
1977        Vpsllvd,
1978        Vpsllvq,
1979        Vpsllw,
1980        Vpsrad,
1981        Vpsraq,
1982        Vpsravd,
1983        Vpsravq,
1984        Vpsraw,
1985        Vpsrldq,
1986        Vpsrld,
1987        Vpsrlq,
1988        Vpsrlvd,
1989        Vpsrlvq,
1990        Vpsrlw,
1991        Vpsubb,
1992        Vpsubd,
1993        Vpsubq,
1994        Vpsubsb,
1995        Vpsubsw,
1996        Vpsubusb,
1997        Vpsubusw,
1998        Vpsubw,
1999        Vptestmd,
2000        Vptestmq,
2001        Vptestnmd,
2002        Vptestnmq,
2003        Vptest,
2004        Vpunpckhbw,
2005        Vpunpckhdq,
2006        Vpunpckhqdq,
2007        Vpunpckhwd,
2008        Vpunpcklbw,
2009        Vpunpckldq,
2010        Vpunpcklqdq,
2011        Vpunpcklwd,
2012        Vpxord,
2013        Vpxorq,
2014        Vpxor,
2015        Vrcp14pd,
2016        Vrcp14ps,
2017        Vrcp14sd,
2018        Vrcp14ss,
2019        Vrcp28pd,
2020        Vrcp28ps,
2021        Vrcp28sd,
2022        Vrcp28ss,
2023        Vrcpps,
2024        Vrcpss,
2025        Vrndscalepd,
2026        Vrndscaleps,
2027        Vrndscalesd,
2028        Vrndscaless,
2029        Vroundpd,
2030        Vroundps,
2031        Vroundsd,
2032        Vroundss,
2033        Vrsqrt14pd,
2034        Vrsqrt14ps,
2035        Vrsqrt14sd,
2036        Vrsqrt14ss,
2037        Vrsqrt28pd,
2038        Vrsqrt28ps,
2039        Vrsqrt28sd,
2040        Vrsqrt28ss,
2041        Vrsqrtps,
2042        Vrsqrtss,
2043        Vscatterdpd,
2044        Vscatterdps,
2045        Vscatterpf0dpd,
2046        Vscatterpf0dps,
2047        Vscatterpf0qpd,
2048        Vscatterpf0qps,
2049        Vscatterpf1dpd,
2050        Vscatterpf1dps,
2051        Vscatterpf1qpd,
2052        Vscatterpf1qps,
2053        Vscatterqpd,
2054        Vscatterqps,
2055        Vshufpd,
2056        Vshufps,
2057        Vsqrtpd,
2058        Vsqrtps,
2059        Vsqrtsd,
2060        Vsqrtss,
2061        Vstmxcsr,
2062        Vsubpd,
2063        Vsubps,
2064        Vsubsd,
2065        Vsubss,
2066        Vtestpd,
2067        Vtestps,
2068        Vunpckhpd,
2069        Vunpckhps,
2070        Vunpcklpd,
2071        Vunpcklps,
2072        Vzeroall,
2073        Vzeroupper,
2074        Wait,
2075        Wbinvd,
2076        Wrfsbase,
2077        Wrgsbase,
2078        Wrmsr,
2079        Xabort,
2080        Xacquire,
2081        Xbegin,
2082        Xchg,
2083        Xcryptcbc,
2084        Xcryptcfb,
2085        Xcryptctr,
2086        Xcryptecb,
2087        Xcryptofb,
2088        Xend,
2089        Xgetbv,
2090        Xlatb,
2091        Xrelease,
2092        Xrstor,
2093        Xrstor64,
2094        Xrstors,
2095        Xrstors64,
2096        Xsave,
2097        Xsave64,
2098        Xsavec,
2099        Xsavec64,
2100        Xsaveopt,
2101        Xsaveopt64,
2102        Xsaves,
2103        Xsaves64,
2104        Xsetbv,
2105        Xsha1,
2106        Xsha256,
2107        Xstore,
2108        Xtest,
2109        Fdisi8087Nop,
2110        Feni8087Nop,
2111
2112        // pseudo instructions
2113        Cmpss,
2114        Cmpeqss,
2115        Cmpltss,
2116        Cmpless,
2117        Cmpunordss,
2118        Cmpneqss,
2119        Cmpnltss,
2120        Cmpnless,
2121        Cmpordss,
2122
2123        Cmpsd,
2124        Cmpeqsd,
2125        Cmpltsd,
2126        Cmplesd,
2127        Cmpunordsd,
2128        Cmpneqsd,
2129        Cmpnltsd,
2130        Cmpnlesd,
2131        Cmpordsd,
2132
2133        Cmpps,
2134        Cmpeqps,
2135        Cmpltps,
2136        Cmpleps,
2137        Cmpunordps,
2138        Cmpneqps,
2139        Cmpnltps,
2140        Cmpnleps,
2141        Cmpordps,
2142
2143        Cmppd,
2144        Cmpeqpd,
2145        Cmpltpd,
2146        Cmplepd,
2147        Cmpunordpd,
2148        Cmpneqpd,
2149        Cmpnltpd,
2150        Cmpnlepd,
2151        Cmpordpd,
2152
2153        Vcmpss,
2154        Vcmpeqss,
2155        Vcmpltss,
2156        Vcmpless,
2157        Vcmpunordss,
2158        Vcmpneqss,
2159        Vcmpnltss,
2160        Vcmpnless,
2161        Vcmpordss,
2162        VcmpeqUqss,
2163        Vcmpngess,
2164        Vcmpngtss,
2165        Vcmpfalsess,
2166        VcmpneqOqss,
2167        Vcmpgess,
2168        Vcmpgtss,
2169        Vcmptruess,
2170        VcmpeqOsss,
2171        VcmpltOqss,
2172        VcmpleOqss,
2173        VcmpunordSss,
2174        VcmpneqUsss,
2175        VcmpnltUqss,
2176        VcmpnleUqss,
2177        VcmpordSss,
2178        VcmpeqUsss,
2179        VcmpngeUqss,
2180        VcmpngtUqss,
2181        VcmpfalseOsss,
2182        VcmpneqOsss,
2183        VcmpgeOqss,
2184        VcmpgtOqss,
2185        VcmptrueUsss,
2186
2187        Vcmpsd,
2188        Vcmpeqsd,
2189        Vcmpltsd,
2190        Vcmplesd,
2191        Vcmpunordsd,
2192        Vcmpneqsd,
2193        Vcmpnltsd,
2194        Vcmpnlesd,
2195        Vcmpordsd,
2196        VcmpeqUqsd,
2197        Vcmpngesd,
2198        Vcmpngtsd,
2199        Vcmpfalsesd,
2200        VcmpneqOqsd,
2201        Vcmpgesd,
2202        Vcmpgtsd,
2203        Vcmptruesd,
2204        VcmpeqOssd,
2205        VcmpltOqsd,
2206        VcmpleOqsd,
2207        VcmpunordSsd,
2208        VcmpneqUssd,
2209        VcmpnltUqsd,
2210        VcmpnleUqsd,
2211        VcmpordSsd,
2212        VcmpeqUssd,
2213        VcmpngeUqsd,
2214        VcmpngtUqsd,
2215        VcmpfalseOssd,
2216        VcmpneqOssd,
2217        VcmpgeOqsd,
2218        VcmpgtOqsd,
2219        VcmptrueUssd,
2220
2221        Vcmpps,
2222        Vcmpeqps,
2223        Vcmpltps,
2224        Vcmpleps,
2225        Vcmpunordps,
2226        Vcmpneqps,
2227        Vcmpnltps,
2228        Vcmpnleps,
2229        Vcmpordps,
2230        VcmpeqUqps,
2231        Vcmpngeps,
2232        Vcmpngtps,
2233        Vcmpfalseps,
2234        VcmpneqOqps,
2235        Vcmpgeps,
2236        Vcmpgtps,
2237        Vcmptrueps,
2238        VcmpeqOsps,
2239        VcmpltOqps,
2240        VcmpleOqps,
2241        VcmpunordSps,
2242        VcmpneqUsps,
2243        VcmpnltUqps,
2244        VcmpnleUqps,
2245        VcmpordSps,
2246        VcmpeqUsps,
2247        VcmpngeUqps,
2248        VcmpngtUqps,
2249        VcmpfalseOsps,
2250        VcmpneqOsps,
2251        VcmpgeOqps,
2252        VcmpgtOqps,
2253        VcmptrueUsps,
2254
2255        Vcmppd,
2256        Vcmpeqpd,
2257        Vcmpltpd,
2258        Vcmplepd,
2259        Vcmpunordpd,
2260        Vcmpneqpd,
2261        Vcmpnltpd,
2262        Vcmpnlepd,
2263        Vcmpordpd,
2264        VcmpeqUqpd,
2265        Vcmpngepd,
2266        Vcmpngtpd,
2267        Vcmpfalsepd,
2268        VcmpneqOqpd,
2269        Vcmpgepd,
2270        Vcmpgtpd,
2271        Vcmptruepd,
2272        VcmpeqOspd,
2273        VcmpltOqpd,
2274        VcmpleOqpd,
2275        VcmpunordSpd,
2276        VcmpneqUspd,
2277        VcmpnltUqpd,
2278        VcmpnleUqpd,
2279        VcmpordSpd,
2280        VcmpeqUspd,
2281        VcmpngeUqpd,
2282        VcmpngtUqpd,
2283        VcmpfalseOspd,
2284        VcmpneqOspd,
2285        VcmpgeOqpd,
2286        VcmpgtOqpd,
2287        VcmptrueUspd,
2288
2289        Ud0,
2290        Endbr32,
2291        Endbr64,
2292
2293        #[doc(hidden)]
2294        Ending,
2295    }
2296}
2297
2298c_enum_big! {
2299    #[non_exhaustive]
2300    #[derive(Copy, Clone, PartialEq, Eq, Hash)]
2301    pub enum InsnGroup: u8 {
2302        @Start = Invalid,
2303        @End   = Ending,
2304
2305        Invalid = 0,
2306
2307        // Generic groups
2308        /// All jump instructions (conditional+direct+indirect jumps)
2309        Jump,
2310        /// All call instructions
2311        Call,
2312        /// All return instructions
2313        Ret,
2314        /// All interrupt instructions (int+syscall)
2315        Int,
2316        /// All interrupt return instructions
2317        Iret,
2318        /// All privileged instructions
2319        Privilege,
2320        /// All relative branching instructions
2321        BranchRelative,
2322
2323        // Architecture-specific groups
2324        /// All virtualization instructions (VT-x + AMD-V)
2325        VM = 128,
2326        _3dnow,
2327        Aes,
2328        Adx,
2329        Avx,
2330        Avx2,
2331        Avx512,
2332        Bmi,
2333        Bmi2,
2334        Cmov,
2335        F16c,
2336        Fma,
2337        Fma4,
2338        Fsgsbase,
2339        Hle,
2340        Mmx,
2341        Mode32,
2342        Mode64,
2343        Rtm,
2344        Sha,
2345        Sse1,
2346        Sse2,
2347        Sse3,
2348        Sse41,
2349        Sse42,
2350        Sse4a,
2351        Ssse3,
2352        Pclmul,
2353        Xop,
2354        Cdi,
2355        Eri,
2356        Tbm,
2357        _16bitmode,
2358        Not64bitmode,
2359        Sgx,
2360        Dqi,
2361        Bwi,
2362        Pfi,
2363        Vlx,
2364        Smap,
2365        Novlx,
2366        Fpu,
2367
2368        Ending,
2369    }
2370}
2371
2372#[cfg(test)]
2373mod test {
2374    use super::*;
2375    use crate::sys;
2376
2377    #[test]
2378    fn x86_size_and_alignment() {
2379        assert_eq!(
2380            core::mem::size_of::<Details>(),
2381            sys::get_test_val("sizeof(cs_x86)")
2382        );
2383
2384        assert_eq!(
2385            core::mem::align_of::<Details>(),
2386            sys::get_test_val("alignof(cs_x86)")
2387        );
2388    }
2389
2390    #[test]
2391    fn x86_enum_size() {
2392        assert_eq!(Reg::Ending.to_c(), sys::get_test_val("X86_REG_ENDING") as _);
2393        assert_eq!(
2394            InsnId::Ending.to_c(),
2395            sys::get_test_val("X86_INS_ENDING") as _
2396        );
2397        assert_eq!(
2398            InsnGroup::Ending.to_c(),
2399            sys::get_test_val("X86_GRP_ENDING") as _
2400        );
2401    }
2402}