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 }