A game about forced loneliness, made by TACStudios
at master 1741 lines 48 kB view raw
1using System.Collections.Generic; 2using System; 3using UnityEngine; 4 5#if UNITY_EDITOR || BURST_INTERNAL 6namespace Unity.Burst.Editor 7{ 8 internal partial class BurstDisassembler 9 { 10 /// <summary> 11 /// <see cref="AsmTokenKind"/> provider for Intel x86-64 12 /// </summary> 13 internal class X86AsmTokenKindProvider : AsmTokenKindProvider 14 { 15 private static readonly string[] Registers = new[] 16 { 17 "rax", 18 "eax", 19 "ax", 20 "al", 21 "ah", 22 "rbx", 23 "ebx", 24 "bx", 25 "bl", 26 "bh", 27 "rcx", 28 "ecx", 29 "cx", 30 "cl", 31 "ch", 32 "rdx", 33 "edx", 34 "dx", 35 "dl", 36 "dh", 37 "rsi", 38 "esi", 39 "si", 40 "sil", 41 "rdi", 42 "edi", 43 "di", 44 "dil", 45 "rbp", 46 "ebp", 47 "bp", 48 "bpl", 49 "rsp", 50 "esp", 51 "sp", 52 "spl", 53 "r8", 54 "r8d", 55 "r8w", 56 "r8b", 57 "r9", 58 "r9d", 59 "r9w", 60 "r9b", 61 "r10", 62 "r10d", 63 "r10w", 64 "r10b", 65 "r11", 66 "r11d", 67 "r11w", 68 "r11b", 69 "r12", 70 "r12d", 71 "r12w", 72 "r12b", 73 "r13", 74 "r13d", 75 "r13w", 76 "r13b", 77 "r14", 78 "r14d", 79 "r14w", 80 "r14b", 81 "r15", 82 "r15d", 83 "r15w", 84 "r15b", 85 "cs", 86 "ss", 87 "ds", 88 "es", 89 "fs", 90 "gs", 91 "cr0", 92 "cr2", 93 "cr3", 94 "cr4", 95 "cr8", 96 "dr0", 97 "dr1", 98 "dr2", 99 "dr3", 100 "dr6", 101 "dr7", 102 "mm0", 103 "mm1", 104 "mm2", 105 "mm3", 106 "mm4", 107 "mm5", 108 "mm6", 109 "mm7", 110 "xmm0", 111 "xmm1", 112 "xmm2", 113 "xmm3", 114 "xmm4", 115 "xmm5", 116 "xmm6", 117 "xmm7", 118 "xmm8", 119 "xmm9", 120 "xmm10", 121 "xmm11", 122 "xmm12", 123 "xmm13", 124 "xmm14", 125 "xmm15", 126 "ymm0", 127 "ymm1", 128 "ymm2", 129 "ymm3", 130 "ymm4", 131 "ymm5", 132 "ymm6", 133 "ymm7", 134 "ymm8", 135 "ymm9", 136 "ymm10", 137 "ymm11", 138 "ymm12", 139 "ymm13", 140 "ymm14", 141 "ymm15", 142 "st", 143 "st0", 144 "st1", 145 "st2", 146 "st3", 147 "st4", 148 "st5", 149 "st6", 150 "st7", 151 }; 152 153 private static readonly string[] Qualifiers = new[] 154 { 155 "offset", 156 "xmmword", 157 "dword", 158 "qword", 159 "byte", 160 "ptr", 161 }; 162 163 private static readonly string[] Instructions = new[] 164 { 165 "aaa", 166 "aad", 167 "aam", 168 "aas", 169 "adc", 170 "adcx", 171 "add", 172 "adox", 173 "and", 174 "andn", 175 "arpl", 176 "bextr", 177 "blsi", 178 "blsmsk", 179 "blsr", 180 "bound", 181 "bsf", 182 "bsr", 183 "bswap", 184 "bt", 185 "btc", 186 "btr", 187 "bts", 188 "bzhi", 189 "cbw", 190 "cdq", 191 "cdqe", 192 "clac", 193 "clc", 194 "cld", 195 "cli", 196 "clts", 197 "cmc", 198 "cmova", 199 "cmovae", 200 "cmovb", 201 "cmovbe", 202 "cmovc", 203 "cmove", 204 "cmovg", 205 "cmovge", 206 "cmovl", 207 "cmovle", 208 "cmovna", 209 "cmovnae", 210 "cmovnb", 211 "cmovnbe", 212 "cmovnc", 213 "cmovne", 214 "cmovng", 215 "cmovnge", 216 "cmovnl", 217 "cmovnle", 218 "cmovno", 219 "cmovnp", 220 "cmovns", 221 "cmovnz", 222 "cmovo", 223 "cmovp", 224 "cmovpe", 225 "cmovpo", 226 "cmovs", 227 "cmovz", 228 "cmp", 229 "cmps", 230 "cmpsb", 231 "cmpsd", 232 "cmpsq", 233 "cmpsw", 234 "cmpxchg", 235 "cmpxchg16b", 236 "cmpxchg8b", 237 "cpuid", 238 "crc32", 239 "cwd", 240 "cwde", 241 "daa", 242 "das", 243 "dec", 244 "div", 245 "enter", 246 "hlt", 247 "idiv", 248 "imul", 249 "in", 250 "inc", 251 "ins", 252 "cqo", 253 "insb", 254 "insd", 255 "insw", 256 "int", 257 "int1", 258 "int3", 259 "into", 260 "invd", 261 "invept", 262 "invlpg", 263 "invpcid", 264 "invvpid", 265 "iret", 266 "lahf", 267 "lar", 268 "lds", 269 "lea", 270 "leave", 271 "les", 272 "lfs", 273 "lgdt", 274 "lgs", 275 "lidt", 276 "lldt", 277 "lmsw", 278 "lock", 279 "lods", 280 "lodsb", 281 "lodsd", 282 "lodsq", 283 "lodsw", 284 "loop", 285 "loope", 286 "loopne", 287 "loopnz", 288 "loopz", 289 "lsl", 290 "lss", 291 "ltr", 292 "lzcnt", 293 "mov", 294 "movbe", 295 "movabs", 296 "movs", 297 "movsb", 298 "movsd", 299 "movsq", 300 "movsw", 301 "movsx", 302 "movsxd", 303 "movzx", 304 "mul", 305 "mulx", 306 "neg", 307 "nop", 308 "not", 309 "or", 310 "out", 311 "outs", 312 "outsb", 313 "outsd", 314 "outsw", 315 "pdep", 316 "pext", 317 "pop", 318 "popa", 319 "popad", 320 "popcnt", 321 "popf", 322 "popfd", 323 "prefetchw", 324 "prefetchwt1", 325 "push", 326 "pusha", 327 "pushad", 328 "pushf", 329 "pushfd", 330 "rcl", 331 "rcr", 332 "rdfsbase", 333 "rdgsbase", 334 "rdmsr", 335 "rdpmc", 336 "rdrand", 337 "rdseed", 338 "rdtsc", 339 "rdtscp", 340 "rep", 341 "repe", 342 "repne", 343 "repnz", 344 "repz", 345 "rex64", 346 "rol", 347 "ror", 348 "rorx", 349 "rsm", 350 "sahf", 351 "sal", 352 "sar", 353 "sarx", 354 "sbb", 355 "scas", 356 "scasb", 357 "scasd", 358 "scasw", 359 "seta", 360 "setae", 361 "setb", 362 "setbe", 363 "setc", 364 "sete", 365 "setg", 366 "setge", 367 "setl", 368 "setle", 369 "setna", 370 "setnae", 371 "setnb", 372 "setnbe", 373 "setnc", 374 "setne", 375 "setng", 376 "setnge", 377 "setnl", 378 "setnle", 379 "setno", 380 "setnp", 381 "setns", 382 "setnz", 383 "seto", 384 "setp", 385 "setpe", 386 "setpo", 387 "sets", 388 "setz", 389 "sgdt", 390 "shl", 391 "shld", 392 "shlx", 393 "shr", 394 "shrd", 395 "shrx", 396 "sidt", 397 "sldt", 398 "smsw", 399 "stac", 400 "stc", 401 "std", 402 "sti", 403 "stos", 404 "stosb", 405 "stosd", 406 "stosq", 407 "stosw", 408 "str", 409 "sub", 410 "swapgs", 411 "syscall", 412 "sysenter", 413 "sysexit", 414 "sysret", 415 "test", 416 "tzcnt", 417 "ud2", 418 "verr", 419 "verw", 420 "vmcall", 421 "vmclear", 422 "vmfunc", 423 "vmlaunch", 424 "vmptrld", 425 "vmptrst", 426 "vmread", 427 "vmresume", 428 "vmwrite", 429 "vmxoff", 430 "vmxon", 431 "wbinvd", 432 "wrfsbase", 433 "wrgsbase", 434 "wrmsr", 435 "xabort", 436 "xacquire", 437 "xadd", 438 "xbegin", 439 "xchg", 440 "xend", 441 "xgetbv", 442 "xlat", 443 "xlatb", 444 "xor", 445 "xrelease", 446 "xrstor", 447 "xsave", 448 "xsaveopt", 449 "xsetbv", 450 "xtest", 451 }; 452 453 private static readonly string[] CallInstructions = new[] 454 { 455 "call", 456 }; 457 458 private static readonly string[] ReturnInstructions = new[] 459 { 460 "ret", 461 }; 462 463 private static readonly string[] BranchInstructions = new[] 464 { 465 "ja", 466 "jae", 467 "jb", 468 "jbe", 469 "jc", 470 "jcxz", 471 "je", 472 "jecxz", 473 "jg", 474 "jge", 475 "jl", 476 "jle", 477 "jna", 478 "jnae", 479 "jnb", 480 "jnbe", 481 "jnc", 482 "jne", 483 "jng", 484 "jnge", 485 "jnl", 486 "jnle", 487 "jno", 488 "jnp", 489 "jns", 490 "jnz", 491 "jo", 492 "jp", 493 "jpe", 494 "jpo", 495 "js", 496 "jz", 497 }; 498 499 private static readonly string[] JumpInstructions = new[] 500 { 501 "jmp", 502 }; 503 504 private static readonly string[] FpuInstructions = new[] 505 { 506 "f2xm1", 507 "fabs", 508 "fadd", 509 "faddp", 510 "fbld", 511 "fbstp", 512 "fchs", 513 "fclex", 514 "fcmovb", 515 "fcmovbe", 516 "fcmove", 517 "fcmovnb", 518 "fcmovnbe", 519 "fcmovne", 520 "fcmovnu", 521 "fcmovu", 522 "fcom", 523 "fcomi", 524 "fcomip", 525 "fcomp", 526 "fcompp", 527 "fcos", 528 "fdecstp", 529 "fdiv", 530 "fdivp", 531 "fdivr", 532 "fdivrp", 533 "ffree", 534 "fiadd", 535 "ficom", 536 "ficomp", 537 "fidiv", 538 "fidivr", 539 "fild", 540 "fimul", 541 "fincstp", 542 "finit", 543 "fist", 544 "fistp", 545 "fisttp", 546 "fisub", 547 "fisubr", 548 "fld1", 549 "fld", 550 "fldcw", 551 "fldenv", 552 "fldl2e", 553 "fldl2t", 554 "fldlg2", 555 "fldln2", 556 "fldpi", 557 "fldz", 558 "fmul", 559 "fmulp", 560 "fnclex", 561 "fninit", 562 "fnop", 563 "fnsave", 564 "fnstcw", 565 "fnstenv", 566 "fnstsw", 567 "fpatan", 568 "fprem1", 569 "fprem", 570 "fptan", 571 "frndint", 572 "frstor", 573 "fsave", 574 "fscale", 575 "fsin", 576 "fsincos", 577 "fsqrt", 578 "fst", 579 "fstcw", 580 "fstenv", 581 "fstp", 582 "fstsw", 583 "fsub", 584 "fsubp", 585 "fsubr", 586 "fsubrp", 587 "ftst", 588 "fucom", 589 "fucomi", 590 "fucomip", 591 "fucomp", 592 "fucompp", 593 "fxam", 594 "fxch", 595 "fxrstor", 596 "fxsave", 597 "fxtract", 598 "fyl2x", 599 "fyl2xp1", 600 "fwait", 601 "wait", 602 }; 603 604 private static readonly string[] SimdInstructions = new[] 605 { 606 "addpd", 607 "addps", 608 "addsd", 609 "addss", 610 "addsubpd", 611 "addsubps", 612 "aesdec", 613 "aesdeclast", 614 "aesenc", 615 "aesenclast", 616 "aesimc", 617 "aeskeygenassist", 618 "andnpd", 619 "andnps", 620 "andpd", 621 "andps", 622 "blendpd", 623 "blendps", 624 "blendvpd", 625 "blendvps", 626 "clflush", 627 "cmpeqpd", 628 "cmpeqps", 629 "cmpeqsd", 630 "cmpeqss", 631 "cmplepd", 632 "cmpleps", 633 "cmplesd", 634 "cmpless", 635 "cmpltpd", 636 "cmpltps", 637 "cmpltsd", 638 "cmpltss", 639 "cmpneqpd", 640 "cmpneqps", 641 "cmpneqsd", 642 "cmpneqss", 643 "cmpnlepd", 644 "cmpnleps", 645 "cmpnlesd", 646 "cmpnless", 647 "cmpnltpd", 648 "cmpnltps", 649 "cmpnltsd", 650 "cmpnltss", 651 "cmpordpd", 652 "cmpordps", 653 "cmpordsd", 654 "cmpordss", 655 "cmppd", 656 "cmpps", 657 "cmpss", 658 "cmpunordpd", 659 "cmpunordps", 660 "cmpunordsd", 661 "cmpunordss", 662 "comisd", 663 "comiss", 664 "cvtdq2pd", 665 "cvtdq2ps", 666 "cvtpd2dq", 667 "cvtpd2pi", 668 "cvtpd2ps", 669 "cvtpi2pd", 670 "cvtpi2ps", 671 "cvtps2dq", 672 "cvtps2pd", 673 "cvtps2pi", 674 "cvtsd2si", 675 "cvtsd2ss", 676 "cvtsi2sd", 677 "cvtsi2ss", 678 "cvtss2sd", 679 "cvtss2si", 680 "cvttpd2dq", 681 "cvttpd2pi", 682 "cvttps2dq", 683 "cvttps2pi", 684 "cvttsd2si", 685 "cvttss2si", 686 "divpd", 687 "divps", 688 "divsd", 689 "divss", 690 "dppd", 691 "dpps", 692 "emms", 693 "extractps", 694 "extrq", 695 "femms", 696 "fxrstor64", 697 "fxsave64", 698 "haddpd", 699 "haddps", 700 "hsubpd", 701 "hsubps", 702 "insertps", 703 "insertq", 704 "lddqu", 705 "ldmxcsr", 706 "lfence", 707 "maskmovdqu", 708 "maskmovq", 709 "maxpd", 710 "maxps", 711 "maxsd", 712 "maxss", 713 "mfence", 714 "minpd", 715 "minps", 716 "minsd", 717 "minss", 718 "monitor", 719 "movapd", 720 "movaps", 721 "movd", 722 "movddup", 723 "movdq2q", 724 "movdqa", 725 "movdqu", 726 "movhlps", 727 "movhpd", 728 "movhps", 729 "movlhps", 730 "movlpd", 731 "movlps", 732 "movmskpd", 733 "movmskps", 734 "movntdq", 735 "movntdqa", 736 "movnti", 737 "movntpd", 738 "movntps", 739 "movntq", 740 "movntsd", 741 "movntss", 742 "movq", 743 "movq2dq", 744 "movshdup", 745 "movsldup", 746 "movss", 747 "movupd", 748 "movups", 749 "mpsadbw", 750 "mulpd", 751 "mulps", 752 "mulsd", 753 "mulss", 754 "mwait", 755 "orpd", 756 "orps", 757 "pabsb", 758 "pabsd", 759 "pabsw", 760 "packssdw", 761 "packsswb", 762 "packusdw", 763 "packuswb", 764 "paddb", 765 "paddd", 766 "paddq", 767 "paddsb", 768 "paddsiw", 769 "paddsw", 770 "paddusb", 771 "paddusw", 772 "paddw", 773 "palignr", 774 "pand", 775 "pandn", 776 "pause", 777 "paveb", 778 "pavgb", 779 "pavgusb", 780 "pavgw", 781 "pblendvb", 782 "pblendw", 783 "pclmulqdq", 784 "pcmpeqb", 785 "pcmpeqd", 786 "pcmpeqq", 787 "pcmpeqw", 788 "pcmpestri", 789 "pcmpestrm", 790 "pcmpgtb", 791 "pcmpgtd", 792 "pcmpgtq", 793 "pcmpgtw", 794 "pcmpistri", 795 "pcmpistrm", 796 "pdistib", 797 "pextrb", 798 "pextrd", 799 "pextrq", 800 "pextrw", 801 "pf2id", 802 "pfacc", 803 "pfadd", 804 "pfcmpeq", 805 "pfcmpge", 806 "pfcmpgt", 807 "pfmax", 808 "pfmin", 809 "pfmul", 810 "pfrcp", 811 "pfrcpit1", 812 "pfrcpit2", 813 "pfrsqit1", 814 "pfrsqrt", 815 "pfsub", 816 "pfsubr", 817 "phaddd", 818 "phaddsw", 819 "phaddw", 820 "phminposuw", 821 "phsubd", 822 "phsubsw", 823 "phsubw", 824 "pi2fd", 825 "pinsrb", 826 "pinsrd", 827 "pinsrq", 828 "pinsrw", 829 "pmachriw", 830 "pmaddubsw", 831 "pmaddwd", 832 "pmagw", 833 "pmaxsb", 834 "pmaxsd", 835 "pmaxsw", 836 "pmaxub", 837 "pmaxud", 838 "pmaxuw", 839 "pminsb", 840 "pminsd", 841 "pminsw", 842 "pminub", 843 "pminud", 844 "pminuw", 845 "pmovmskb", 846 "pmovsxbd", 847 "pmovsxbq", 848 "pmovsxbw", 849 "pmovsxdq", 850 "pmovsxwd", 851 "pmovsxwq", 852 "pmovzxbd", 853 "pmovzxbq", 854 "pmovzxbw", 855 "pmovzxdq", 856 "pmovzxwd", 857 "pmovzxwq", 858 "pmuldq", 859 "pmulhriw", 860 "pmulhrsw", 861 "pmulhrwa", 862 "pmulhrwc", 863 "pmulhuw", 864 "pmulhw", 865 "pmulld", 866 "pmullw", 867 "pmuludq", 868 "pmvgezb", 869 "pmvlzb", 870 "pmvnzb", 871 "pmvzb", 872 "por", 873 "prefetch", 874 "prefetchnta", 875 "prefetcht0", 876 "prefetcht1", 877 "prefetcht2", 878 "psadbw", 879 "pshufb", 880 "pshufd", 881 "pshufhw", 882 "pshuflw", 883 "pshufw", 884 "psignb", 885 "psignd", 886 "psignw", 887 "pslld", 888 "pslldq", 889 "psllq", 890 "psllw", 891 "psrad", 892 "psraw", 893 "psrld", 894 "psrldq", 895 "psrlq", 896 "psrlw", 897 "psubb", 898 "psubd", 899 "psubq", 900 "psubsb", 901 "psubsiw", 902 "psubsw", 903 "psubusb", 904 "psubusw", 905 "psubw", 906 "ptest", 907 "punpckhbw", 908 "punpckhdq", 909 "punpckhqdq", 910 "punpckhwd", 911 "punpcklbw", 912 "punpckldq", 913 "punpcklqdq", 914 "punpcklwd", 915 "pxor", 916 "rcpps", 917 "rcpss", 918 "roundpd", 919 "roundps", 920 "roundsd", 921 "roundss", 922 "rsqrtps", 923 "rsqrtss", 924 "sfence", 925 "shufpd", 926 "shufps", 927 "sqrtpd", 928 "sqrtps", 929 "sqrtsd", 930 "sqrtss", 931 "stmxcsr", 932 "subpd", 933 "subps", 934 "subsd", 935 "subss", 936 "ucomisd", 937 "ucomiss", 938 "unpckhpd", 939 "unpckhps", 940 "unpcklpd", 941 "unpcklps", 942 "vaddpd", 943 "vaddps", 944 "vaddsd", 945 "vaddss", 946 "vaddsubpd", 947 "vaddsubps", 948 "vaesdec", 949 "vaesdeclast", 950 "vaesenc", 951 "vaesenclast", 952 "vaesimc", 953 "vaeskeygenassist", 954 "vandnpd", 955 "vandnps", 956 "vandpd", 957 "vandps", 958 "vblendpd", 959 "vblendps", 960 "vblendvpd", 961 "vblendvps", 962 "vbroadcastf128", 963 "vbroadcasti128", 964 "vbroadcastsd", 965 "vbroadcastss", 966 "vcmpeqpd", 967 "vcmpeqps", 968 "vcmpeqsd", 969 "vcmpeqss", 970 "vcmpfalsepd", 971 "vcmpfalseps", 972 "vcmpfalsesd", 973 "vcmpfalsess", 974 "vcmpgepd", 975 "vcmpgeps", 976 "vcmpgesd", 977 "vcmpgess", 978 "vcmpgtpd", 979 "vcmpgtps", 980 "vcmpgtsd", 981 "vcmpgtss", 982 "vcmplepd", 983 "vcmpleps", 984 "vcmplesd", 985 "vcmpless", 986 "vcmpltpd", 987 "vcmpltps", 988 "vcmpltsd", 989 "vcmpltss", 990 "vcmpneqpd", 991 "vcmpneqps", 992 "vcmpneqsd", 993 "vcmpneqss", 994 "vcmpngepd", 995 "vcmpngeps", 996 "vcmpngesd", 997 "vcmpngess", 998 "vcmpngtpd", 999 "vcmpngtps", 1000 "vcmpngtsd", 1001 "vcmpngtss", 1002 "vcmpnlepd", 1003 "vcmpnleps", 1004 "vcmpnlesd", 1005 "vcmpnless", 1006 "vcmpnltpd", 1007 "vcmpnltps", 1008 "vcmpnltsd", 1009 "vcmpnltss", 1010 "vcmpordpd", 1011 "vcmpordps", 1012 "vcmpordsd", 1013 "vcmpordss", 1014 "vcmppd", 1015 "vcmpps", 1016 "vcmpsd", 1017 "vcmpss", 1018 "vcmptruepd", 1019 "vcmptrueps", 1020 "vcmptruesd", 1021 "vcmptruess", 1022 "vcmpunordpd", 1023 "vcmpunordps", 1024 "vcmpunordsd", 1025 "vcmpunordss", 1026 "vcomisd", 1027 "vcomiss", 1028 "vcvtdq2pd", 1029 "vcvtdq2ps", 1030 "vcvtpd2dq", 1031 "vcvtpd2ps", 1032 "vcvtph2ps", 1033 "vcvtps2dq", 1034 "vcvtps2pd", 1035 "vcvtps2ph", 1036 "vcvtsd2si", 1037 "vcvtsd2ss", 1038 "vcvtsi2sd", 1039 "vcvtsi2ss", 1040 "vcvtss2sd", 1041 "vcvtss2si", 1042 "vcvttpd2dq", 1043 "vcvttps2dq", 1044 "vcvttsd2si", 1045 "vcvttss2si", 1046 "vdivpd", 1047 "vdivps", 1048 "vdivsd", 1049 "vdivss", 1050 "vdppd", 1051 "vdpps", 1052 "vextractf128", 1053 "vextracti128", 1054 "vextractps", 1055 "vfmadd123pd", 1056 "vfmadd123ps", 1057 "vfmadd123sd", 1058 "vfmadd123ss", 1059 "vfmadd132pd", 1060 "vfmadd132ps", 1061 "vfmadd132sd", 1062 "vfmadd132ss", 1063 "vfmadd213pd", 1064 "vfmadd213ps", 1065 "vfmadd213sd", 1066 "vfmadd213ss", 1067 "vfmadd231pd", 1068 "vfmadd231ps", 1069 "vfmadd231sd", 1070 "vfmadd231ss", 1071 "vfmadd312pd", 1072 "vfmadd312ps", 1073 "vfmadd312sd", 1074 "vfmadd312ss", 1075 "vfmadd321pd", 1076 "vfmadd321ps", 1077 "vfmadd321sd", 1078 "vfmadd321ss", 1079 "vfmaddsub123pd", 1080 "vfmaddsub123ps", 1081 "vfmaddsub132pd", 1082 "vfmaddsub132ps", 1083 "vfmaddsub213pd", 1084 "vfmaddsub213ps", 1085 "vfmaddsub231pd", 1086 "vfmaddsub231ps", 1087 "vfmaddsub312pd", 1088 "vfmaddsub312ps", 1089 "vfmaddsub321pd", 1090 "vfmaddsub321ps", 1091 "vfmsub123pd", 1092 "vfmsub123ps", 1093 "vfmsub123sd", 1094 "vfmsub123ss", 1095 "vfmsub132pd", 1096 "vfmsub132ps", 1097 "vfmsub132sd", 1098 "vfmsub132ss", 1099 "vfmsub213pd", 1100 "vfmsub213ps", 1101 "vfmsub213sd", 1102 "vfmsub213ss", 1103 "vfmsub231pd", 1104 "vfmsub231ps", 1105 "vfmsub231sd", 1106 "vfmsub231ss", 1107 "vfmsub312pd", 1108 "vfmsub312ps", 1109 "vfmsub312sd", 1110 "vfmsub312ss", 1111 "vfmsub321pd", 1112 "vfmsub321ps", 1113 "vfmsub321sd", 1114 "vfmsub321ss", 1115 "vfmsubadd123pd", 1116 "vfmsubadd123ps", 1117 "vfmsubadd132pd", 1118 "vfmsubadd132ps", 1119 "vfmsubadd213pd", 1120 "vfmsubadd213ps", 1121 "vfmsubadd231pd", 1122 "vfmsubadd231ps", 1123 "vfmsubadd312pd", 1124 "vfmsubadd312ps", 1125 "vfmsubadd321pd", 1126 "vfmsubadd321ps", 1127 "vfnmadd123pd", 1128 "vfnmadd123ps", 1129 "vfnmadd123sd", 1130 "vfnmadd123ss", 1131 "vfnmadd132pd", 1132 "vfnmadd132ps", 1133 "vfnmadd132sd", 1134 "vfnmadd132ss", 1135 "vfnmadd213pd", 1136 "vfnmadd213ps", 1137 "vfnmadd213sd", 1138 "vfnmadd213ss", 1139 "vfnmadd231pd", 1140 "vfnmadd231ps", 1141 "vfnmadd231sd", 1142 "vfnmadd231ss", 1143 "vfnmadd312pd", 1144 "vfnmadd312ps", 1145 "vfnmadd312sd", 1146 "vfnmadd312ss", 1147 "vfnmadd321pd", 1148 "vfnmadd321ps", 1149 "vfnmadd321sd", 1150 "vfnmadd321ss", 1151 "vfnmsub123pd", 1152 "vfnmsub123ps", 1153 "vfnmsub123sd", 1154 "vfnmsub123ss", 1155 "vfnmsub132pd", 1156 "vfnmsub132ps", 1157 "vfnmsub132sd", 1158 "vfnmsub132ss", 1159 "vfnmsub213pd", 1160 "vfnmsub213ps", 1161 "vfnmsub213sd", 1162 "vfnmsub213ss", 1163 "vfnmsub231pd", 1164 "vfnmsub231ps", 1165 "vfnmsub231sd", 1166 "vfnmsub231ss", 1167 "vfnmsub312pd", 1168 "vfnmsub312ps", 1169 "vfnmsub312sd", 1170 "vfnmsub312ss", 1171 "vfnmsub321pd", 1172 "vfnmsub321ps", 1173 "vfnmsub321sd", 1174 "vfnmsub321ss", 1175 "vgatherdpd", 1176 "vgatherdps", 1177 "vgatherqpd", 1178 "vgatherqps", 1179 "vhaddpd", 1180 "vhaddps", 1181 "vhsubpd", 1182 "vhsubps", 1183 "vinsertf128", 1184 "vinserti128", 1185 "vinsertps", 1186 "vlddqu", 1187 "vldmxcsr", 1188 "vldqqu", 1189 "vmaskmovdqu", 1190 "vmaskmovpd", 1191 "vmaskmovps", 1192 "vmaxpd", 1193 "vmaxps", 1194 "vmaxsd", 1195 "vmaxss", 1196 "vminpd", 1197 "vminps", 1198 "vminsd", 1199 "vminss", 1200 "vmovapd", 1201 "vmovaps", 1202 "vmovd", 1203 "vmovddup", 1204 "vmovdqa", 1205 "vmovdqu", 1206 "vmovhlps", 1207 "vmovhpd", 1208 "vmovhps", 1209 "vmovlhps", 1210 "vmovlpd", 1211 "vmovlps", 1212 "vmovmskpd", 1213 "vmovmskps", 1214 "vmovntdq", 1215 "vmovntdqa", 1216 "vmovntpd", 1217 "vmovntps", 1218 "vmovntqq", 1219 "vmovq", 1220 "vmovqqa", 1221 "vmovqqu", 1222 "vmovsd", 1223 "vmovshdup", 1224 "vmovsldup", 1225 "vmovss", 1226 "vmovupd", 1227 "vmovups", 1228 "vmpsadbw", 1229 "vmulpd", 1230 "vmulps", 1231 "vmulsd", 1232 "vmulss", 1233 "vorpd", 1234 "vorps", 1235 "vpabsb", 1236 "vpabsd", 1237 "vpabsw", 1238 "vpackssdw", 1239 "vpacksswb", 1240 "vpackusdw", 1241 "vpackuswb", 1242 "vpaddb", 1243 "vpaddd", 1244 "vpaddq", 1245 "vpaddsb", 1246 "vpaddsw", 1247 "vpaddusb", 1248 "vpaddusw", 1249 "vpaddw", 1250 "vpalignr", 1251 "vpand", 1252 "vpandn", 1253 "vpavgb", 1254 "vpavgw", 1255 "vpblendd", 1256 "vpblendvb", 1257 "vpblendw", 1258 "vpbroadcastb", 1259 "vpbroadcastd", 1260 "vpbroadcastq", 1261 "vpbroadcastw", 1262 "vpclmulqdq", 1263 "vpcmpeqb", 1264 "vpcmpeqd", 1265 "vpcmpeqq", 1266 "vpcmpeqw", 1267 "vpcmpestri", 1268 "vpcmpestrm", 1269 "vpcmpgtb", 1270 "vpcmpgtd", 1271 "vpcmpgtq", 1272 "vpcmpgtw", 1273 "vpcmpistri", 1274 "vpcmpistrm", 1275 "vperm2f128", 1276 "vperm2i128", 1277 "vpermd", 1278 "vpermilpd", 1279 "vpermilps", 1280 "vpermpd", 1281 "vpermps", 1282 "vpermq", 1283 "vpextrb", 1284 "vpextrd", 1285 "vpextrq", 1286 "vpextrw", 1287 "vpgatherdd", 1288 "vpgatherdq", 1289 "vpgatherqd", 1290 "vpgatherqq", 1291 "vphaddd", 1292 "vphaddsw", 1293 "vphaddw", 1294 "vphminposuw", 1295 "vphsubd", 1296 "vphsubsw", 1297 "vphsubw", 1298 "vpinsrb", 1299 "vpinsrd", 1300 "vpinsrq", 1301 "vpinsrw", 1302 "vpmaddubsw", 1303 "vpmaddwd", 1304 "vpmaskmovd", 1305 "vpmaskmovq", 1306 "vpmaxsb", 1307 "vpmaxsd", 1308 "vpmaxsw", 1309 "vpmaxub", 1310 "vpmaxud", 1311 "vpmaxuw", 1312 "vpminsb", 1313 "vpminsd", 1314 "vpminsw", 1315 "vpminub", 1316 "vpminud", 1317 "vpminuw", 1318 "vpmovmskb", 1319 "vpmovsxbd", 1320 "vpmovsxbq", 1321 "vpmovsxbw", 1322 "vpmovsxdq", 1323 "vpmovsxwd", 1324 "vpmovsxwq", 1325 "vpmovzxbd", 1326 "vpmovzxbq", 1327 "vpmovzxbw", 1328 "vpmovzxdq", 1329 "vpmovzxwd", 1330 "vpmovzxwq", 1331 "vpmuldq", 1332 "vpmulhrsw", 1333 "vpmulhuw", 1334 "vpmulhw", 1335 "vpmulld", 1336 "vpmullw", 1337 "vpmuludq", 1338 "vpor", 1339 "vpsadbw", 1340 "vpshufb", 1341 "vpshufd", 1342 "vpshufhw", 1343 "vpshuflw", 1344 "vpsignb", 1345 "vpsignd", 1346 "vpsignw", 1347 "vpslld", 1348 "vpslldq", 1349 "vpsllq", 1350 "vpsllvd", 1351 "vpsllvq", 1352 "vpsllw", 1353 "vpsrad", 1354 "vpsravd", 1355 "vpsraw", 1356 "vpsrld", 1357 "vpsrldq", 1358 "vpsrlq", 1359 "vpsrlvd", 1360 "vpsrlvq", 1361 "vpsrlw", 1362 "vpsubb", 1363 "vpsubd", 1364 "vpsubq", 1365 "vpsubsb", 1366 "vpsubsw", 1367 "vpsubusb", 1368 "vpsubusw", 1369 "vpsubw", 1370 "vptest", 1371 "vpunpckhbw", 1372 "vpunpckhdq", 1373 "vpunpckhqdq", 1374 "vpunpckhwd", 1375 "vpunpcklbw", 1376 "vpunpckldq", 1377 "vpunpcklqdq", 1378 "vpunpcklwd", 1379 "vpxor", 1380 "vrcpps", 1381 "vrcpss", 1382 "vroundpd", 1383 "vroundps", 1384 "vroundsd", 1385 "vroundss", 1386 "vrsqrtps", 1387 "vrsqrtss", 1388 "vshufpd", 1389 "vshufps", 1390 "vsqrtpd", 1391 "vsqrtps", 1392 "vsqrtsd", 1393 "vsqrtss", 1394 "vstmxcsr", 1395 "vsubpd", 1396 "vsubps", 1397 "vsubsd", 1398 "vsubss", 1399 "vtestpd", 1400 "vtestps", 1401 "vucomisd", 1402 "vucomiss", 1403 "vunpckhpd", 1404 "vunpckhps", 1405 "vunpcklpd", 1406 "vunpcklps", 1407 "vxorpd", 1408 "vxorps", 1409 "vzeroall", 1410 "vzeroupper", 1411 "xorpd", 1412 "xorps", 1413 "xrstor64", 1414 "xrstors", 1415 "xrstors64", 1416 "xsave64", 1417 "xsavec", 1418 "xsavec64", 1419 "xsaveopt64", 1420 "xsaves", 1421 "xsaves64", 1422 }; 1423 1424 private X86AsmTokenKindProvider() : base( 1425 Registers.Length + 1426 Qualifiers.Length + 1427 Instructions.Length + 1428 CallInstructions.Length + 1429 BranchInstructions.Length + 1430 JumpInstructions.Length + 1431 ReturnInstructions.Length + 1432 FpuInstructions.Length + 1433 SimdInstructions.Length) 1434 { 1435 foreach (var register in Registers) 1436 { 1437 AddTokenKind(register, AsmTokenKind.Register); 1438 } 1439 1440 foreach (var instruction in Qualifiers) 1441 { 1442 AddTokenKind(instruction, AsmTokenKind.Qualifier); 1443 } 1444 1445 foreach (var instruction in Instructions) 1446 { 1447 AddTokenKind(instruction, AsmTokenKind.Instruction); 1448 } 1449 1450 foreach (var instruction in CallInstructions) 1451 { 1452 AddTokenKind(instruction, AsmTokenKind.CallInstruction); 1453 } 1454 1455 foreach (var instruction in BranchInstructions) 1456 { 1457 AddTokenKind(instruction, AsmTokenKind.BranchInstruction); 1458 } 1459 1460 foreach (var instruction in JumpInstructions) 1461 { 1462 AddTokenKind(instruction, AsmTokenKind.JumpInstruction); 1463 } 1464 1465 foreach (var instruction in ReturnInstructions) 1466 { 1467 AddTokenKind(instruction, AsmTokenKind.ReturnInstruction); 1468 } 1469 1470 foreach (var instruction in FpuInstructions) 1471 { 1472 AddTokenKind(instruction, AsmTokenKind.Instruction); 1473 } 1474 1475 foreach (var instruction in SimdInstructions) 1476 { 1477 AddTokenKind(instruction, AsmTokenKind.InstructionSIMD); 1478 } 1479 } 1480 1481 public static readonly X86AsmTokenKindProvider Instance = new X86AsmTokenKindProvider(); 1482 1483 /// <summary> 1484 /// Returns whether <see cref="instruction"/> is a packed, scalar, or infrastructure SIMD instruction. 1485 /// </summary> 1486 /// <remarks> 1487 /// Assumes that <see cref="instruction"/> is an X86 SIMD instruction. 1488 /// </remarks> 1489 public override SIMDkind SimdKind(StringSlice instruction) => instruction[instruction.Length - 2] switch 1490 { 1491 'p' => SIMDkind.Packed, 1492 's' => SIMDkind.Scalar, 1493 _ => SIMDkind.Infrastructure 1494 }; 1495 1496 public override bool RegisterEqual(string regA, string regB) 1497 { 1498 try 1499 { 1500 var regAVal = RegisterMapping(regA); 1501 var regBVal = RegisterMapping(regB); 1502 return regAVal == regBVal; 1503 } 1504 catch (Exception) 1505 { 1506 return false; 1507 } 1508 } 1509 1510 private int RegisterMapping(string reg) 1511 { 1512 switch (reg) 1513 { 1514 case "rax": 1515 case "eax": 1516 case "ax": 1517 case "ah": 1518 case "al": 1519 return 0; 1520 case "rbx": 1521 case "ebx": 1522 case "bx": 1523 case "bh": 1524 case "bl": 1525 return 1; 1526 case "rcx": 1527 case "ecx": 1528 case "cx": 1529 case "ch": 1530 case "cl": 1531 return 2; 1532 case "rdx": 1533 case "edx": 1534 case "dx": 1535 case "dh": 1536 case "dl": 1537 return 3; 1538 case "rsi": 1539 case "esi": 1540 case "si": 1541 case "sil": 1542 return 4; 1543 case "rdi": 1544 case "edi": 1545 case "di": 1546 case "dil": 1547 return 5; 1548 case "rsp": 1549 case "esp": 1550 case "sp": 1551 case "spl": 1552 return 6; 1553 case "rbp": 1554 case "ebp": 1555 case "bp": 1556 case "bpl": 1557 return 7; 1558 case "rip": 1559 case "eip": 1560 case "ip": 1561 return 8; 1562 case "r8": 1563 case "r8d": 1564 case "r8w": 1565 case "r8b": 1566 return 9; 1567 case "r9": 1568 case "r9d": 1569 case "r9w": 1570 case "r9b": 1571 return 10; 1572 case "r10": 1573 case "r10d": 1574 case "r10w": 1575 case "r10b": 1576 return 11; 1577 case "r11": 1578 case "r11d": 1579 case "r11w": 1580 case "r11b": 1581 return 12; 1582 case "r12": 1583 case "r12d": 1584 case "r12w": 1585 case "r12b": 1586 return 13; 1587 case "r13": 1588 case "r13d": 1589 case "r13w": 1590 case "r13b": 1591 return 14; 1592 case "r14": 1593 case "r14d": 1594 case "r14w": 1595 case "r14b": 1596 return 15; 1597 case "r15": 1598 case "r15d": 1599 case "r15w": 1600 case "r15b": 1601 return 16; 1602 case "cr0": 1603 return 17; 1604 case "cr2": 1605 return 18; 1606 case "cr3": 1607 return 19; 1608 case "cr4": 1609 return 20; 1610 case "cr8": 1611 return 21; 1612 case "dr0": 1613 return 22; 1614 case "dr1": 1615 return 23; 1616 case "dr2": 1617 return 24; 1618 case "dr3": 1619 return 25; 1620 case "dr6": 1621 return 26; 1622 case "dr7": 1623 return 27; 1624 case "mm0": 1625 return 28; 1626 case "mm1": 1627 return 29; 1628 case "mm2": 1629 return 30; 1630 case "mm3": 1631 return 31; 1632 case "mm4": 1633 return 32; 1634 case "mm5": 1635 return 33; 1636 case "mm6": 1637 return 34; 1638 case "mm7": 1639 return 35; 1640 case "xmm0": 1641 return 36; 1642 case "xmm1": 1643 return 37; 1644 case "xmm2": 1645 return 38; 1646 case "xmm3": 1647 return 39; 1648 case "xmm4": 1649 return 40; 1650 case "xmm5": 1651 return 41; 1652 case "xmm6": 1653 return 42; 1654 case "xmm7": 1655 return 43; 1656 case "xmm8": 1657 return 44; 1658 case "xmm9": 1659 return 45; 1660 case "xmm10": 1661 return 46; 1662 case "xmm11": 1663 return 47; 1664 case "xmm12": 1665 return 48; 1666 case "xmm13": 1667 return 49; 1668 case "xmm14": 1669 return 50; 1670 case "xmm15": 1671 return 51; 1672 case "ymm0": 1673 return 52; 1674 case "ymm1": 1675 return 53; 1676 case "ymm2": 1677 return 54; 1678 case "ymm3": 1679 return 55; 1680 case "ymm4": 1681 return 56; 1682 case "ymm5": 1683 return 57; 1684 case "ymm6": 1685 return 58; 1686 case "ymm7": 1687 return 59; 1688 case "ymm8": 1689 return 60; 1690 case "ymm9": 1691 return 61; 1692 case "ymm10": 1693 return 62; 1694 case "ymm11": 1695 return 63; 1696 case "ymm12": 1697 return 64; 1698 case "ymm13": 1699 return 65; 1700 case "ymm14": 1701 return 66; 1702 case "ymm15": 1703 return 67; 1704 case "st": 1705 return 68; 1706 case "st0": 1707 return 69; 1708 case "st1": 1709 return 70; 1710 case "st2": 1711 return 71; 1712 case "st3": 1713 return 72; 1714 case "st4": 1715 return 73; 1716 case "st5": 1717 return 74; 1718 case "st6": 1719 return 75; 1720 case "st7": 1721 return 76; 1722 case "cs": 1723 return 77; 1724 case "ss": 1725 return 78; 1726 case "ds": 1727 return 79; 1728 case "es": 1729 return 80; 1730 case "fs": 1731 return 81; 1732 case "gs": 1733 return 82; 1734 default: 1735 throw new Exception($"Case for \"{reg}\" not implemented."); 1736 } 1737 } 1738 } 1739 } 1740} 1741#endif