1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741 |
- using System.Collections.Generic;
- using System;
- using UnityEngine;
-
- #if UNITY_EDITOR || BURST_INTERNAL
- namespace Unity.Burst.Editor
- {
- internal partial class BurstDisassembler
- {
- /// <summary>
- /// <see cref="AsmTokenKind"/> provider for Intel x86-64
- /// </summary>
- internal class X86AsmTokenKindProvider : AsmTokenKindProvider
- {
- private static readonly string[] Registers = new[]
- {
- "rax",
- "eax",
- "ax",
- "al",
- "ah",
- "rbx",
- "ebx",
- "bx",
- "bl",
- "bh",
- "rcx",
- "ecx",
- "cx",
- "cl",
- "ch",
- "rdx",
- "edx",
- "dx",
- "dl",
- "dh",
- "rsi",
- "esi",
- "si",
- "sil",
- "rdi",
- "edi",
- "di",
- "dil",
- "rbp",
- "ebp",
- "bp",
- "bpl",
- "rsp",
- "esp",
- "sp",
- "spl",
- "r8",
- "r8d",
- "r8w",
- "r8b",
- "r9",
- "r9d",
- "r9w",
- "r9b",
- "r10",
- "r10d",
- "r10w",
- "r10b",
- "r11",
- "r11d",
- "r11w",
- "r11b",
- "r12",
- "r12d",
- "r12w",
- "r12b",
- "r13",
- "r13d",
- "r13w",
- "r13b",
- "r14",
- "r14d",
- "r14w",
- "r14b",
- "r15",
- "r15d",
- "r15w",
- "r15b",
- "cs",
- "ss",
- "ds",
- "es",
- "fs",
- "gs",
- "cr0",
- "cr2",
- "cr3",
- "cr4",
- "cr8",
- "dr0",
- "dr1",
- "dr2",
- "dr3",
- "dr6",
- "dr7",
- "mm0",
- "mm1",
- "mm2",
- "mm3",
- "mm4",
- "mm5",
- "mm6",
- "mm7",
- "xmm0",
- "xmm1",
- "xmm2",
- "xmm3",
- "xmm4",
- "xmm5",
- "xmm6",
- "xmm7",
- "xmm8",
- "xmm9",
- "xmm10",
- "xmm11",
- "xmm12",
- "xmm13",
- "xmm14",
- "xmm15",
- "ymm0",
- "ymm1",
- "ymm2",
- "ymm3",
- "ymm4",
- "ymm5",
- "ymm6",
- "ymm7",
- "ymm8",
- "ymm9",
- "ymm10",
- "ymm11",
- "ymm12",
- "ymm13",
- "ymm14",
- "ymm15",
- "st",
- "st0",
- "st1",
- "st2",
- "st3",
- "st4",
- "st5",
- "st6",
- "st7",
- };
-
- private static readonly string[] Qualifiers = new[]
- {
- "offset",
- "xmmword",
- "dword",
- "qword",
- "byte",
- "ptr",
- };
-
- private static readonly string[] Instructions = new[]
- {
- "aaa",
- "aad",
- "aam",
- "aas",
- "adc",
- "adcx",
- "add",
- "adox",
- "and",
- "andn",
- "arpl",
- "bextr",
- "blsi",
- "blsmsk",
- "blsr",
- "bound",
- "bsf",
- "bsr",
- "bswap",
- "bt",
- "btc",
- "btr",
- "bts",
- "bzhi",
- "cbw",
- "cdq",
- "cdqe",
- "clac",
- "clc",
- "cld",
- "cli",
- "clts",
- "cmc",
- "cmova",
- "cmovae",
- "cmovb",
- "cmovbe",
- "cmovc",
- "cmove",
- "cmovg",
- "cmovge",
- "cmovl",
- "cmovle",
- "cmovna",
- "cmovnae",
- "cmovnb",
- "cmovnbe",
- "cmovnc",
- "cmovne",
- "cmovng",
- "cmovnge",
- "cmovnl",
- "cmovnle",
- "cmovno",
- "cmovnp",
- "cmovns",
- "cmovnz",
- "cmovo",
- "cmovp",
- "cmovpe",
- "cmovpo",
- "cmovs",
- "cmovz",
- "cmp",
- "cmps",
- "cmpsb",
- "cmpsd",
- "cmpsq",
- "cmpsw",
- "cmpxchg",
- "cmpxchg16b",
- "cmpxchg8b",
- "cpuid",
- "crc32",
- "cwd",
- "cwde",
- "daa",
- "das",
- "dec",
- "div",
- "enter",
- "hlt",
- "idiv",
- "imul",
- "in",
- "inc",
- "ins",
- "cqo",
- "insb",
- "insd",
- "insw",
- "int",
- "int1",
- "int3",
- "into",
- "invd",
- "invept",
- "invlpg",
- "invpcid",
- "invvpid",
- "iret",
- "lahf",
- "lar",
- "lds",
- "lea",
- "leave",
- "les",
- "lfs",
- "lgdt",
- "lgs",
- "lidt",
- "lldt",
- "lmsw",
- "lock",
- "lods",
- "lodsb",
- "lodsd",
- "lodsq",
- "lodsw",
- "loop",
- "loope",
- "loopne",
- "loopnz",
- "loopz",
- "lsl",
- "lss",
- "ltr",
- "lzcnt",
- "mov",
- "movbe",
- "movabs",
- "movs",
- "movsb",
- "movsd",
- "movsq",
- "movsw",
- "movsx",
- "movsxd",
- "movzx",
- "mul",
- "mulx",
- "neg",
- "nop",
- "not",
- "or",
- "out",
- "outs",
- "outsb",
- "outsd",
- "outsw",
- "pdep",
- "pext",
- "pop",
- "popa",
- "popad",
- "popcnt",
- "popf",
- "popfd",
- "prefetchw",
- "prefetchwt1",
- "push",
- "pusha",
- "pushad",
- "pushf",
- "pushfd",
- "rcl",
- "rcr",
- "rdfsbase",
- "rdgsbase",
- "rdmsr",
- "rdpmc",
- "rdrand",
- "rdseed",
- "rdtsc",
- "rdtscp",
- "rep",
- "repe",
- "repne",
- "repnz",
- "repz",
- "rex64",
- "rol",
- "ror",
- "rorx",
- "rsm",
- "sahf",
- "sal",
- "sar",
- "sarx",
- "sbb",
- "scas",
- "scasb",
- "scasd",
- "scasw",
- "seta",
- "setae",
- "setb",
- "setbe",
- "setc",
- "sete",
- "setg",
- "setge",
- "setl",
- "setle",
- "setna",
- "setnae",
- "setnb",
- "setnbe",
- "setnc",
- "setne",
- "setng",
- "setnge",
- "setnl",
- "setnle",
- "setno",
- "setnp",
- "setns",
- "setnz",
- "seto",
- "setp",
- "setpe",
- "setpo",
- "sets",
- "setz",
- "sgdt",
- "shl",
- "shld",
- "shlx",
- "shr",
- "shrd",
- "shrx",
- "sidt",
- "sldt",
- "smsw",
- "stac",
- "stc",
- "std",
- "sti",
- "stos",
- "stosb",
- "stosd",
- "stosq",
- "stosw",
- "str",
- "sub",
- "swapgs",
- "syscall",
- "sysenter",
- "sysexit",
- "sysret",
- "test",
- "tzcnt",
- "ud2",
- "verr",
- "verw",
- "vmcall",
- "vmclear",
- "vmfunc",
- "vmlaunch",
- "vmptrld",
- "vmptrst",
- "vmread",
- "vmresume",
- "vmwrite",
- "vmxoff",
- "vmxon",
- "wbinvd",
- "wrfsbase",
- "wrgsbase",
- "wrmsr",
- "xabort",
- "xacquire",
- "xadd",
- "xbegin",
- "xchg",
- "xend",
- "xgetbv",
- "xlat",
- "xlatb",
- "xor",
- "xrelease",
- "xrstor",
- "xsave",
- "xsaveopt",
- "xsetbv",
- "xtest",
- };
-
- private static readonly string[] CallInstructions = new[]
- {
- "call",
- };
-
- private static readonly string[] ReturnInstructions = new[]
- {
- "ret",
- };
-
- private static readonly string[] BranchInstructions = new[]
- {
- "ja",
- "jae",
- "jb",
- "jbe",
- "jc",
- "jcxz",
- "je",
- "jecxz",
- "jg",
- "jge",
- "jl",
- "jle",
- "jna",
- "jnae",
- "jnb",
- "jnbe",
- "jnc",
- "jne",
- "jng",
- "jnge",
- "jnl",
- "jnle",
- "jno",
- "jnp",
- "jns",
- "jnz",
- "jo",
- "jp",
- "jpe",
- "jpo",
- "js",
- "jz",
- };
-
- private static readonly string[] JumpInstructions = new[]
- {
- "jmp",
- };
-
- private static readonly string[] FpuInstructions = new[]
- {
- "f2xm1",
- "fabs",
- "fadd",
- "faddp",
- "fbld",
- "fbstp",
- "fchs",
- "fclex",
- "fcmovb",
- "fcmovbe",
- "fcmove",
- "fcmovnb",
- "fcmovnbe",
- "fcmovne",
- "fcmovnu",
- "fcmovu",
- "fcom",
- "fcomi",
- "fcomip",
- "fcomp",
- "fcompp",
- "fcos",
- "fdecstp",
- "fdiv",
- "fdivp",
- "fdivr",
- "fdivrp",
- "ffree",
- "fiadd",
- "ficom",
- "ficomp",
- "fidiv",
- "fidivr",
- "fild",
- "fimul",
- "fincstp",
- "finit",
- "fist",
- "fistp",
- "fisttp",
- "fisub",
- "fisubr",
- "fld1",
- "fld",
- "fldcw",
- "fldenv",
- "fldl2e",
- "fldl2t",
- "fldlg2",
- "fldln2",
- "fldpi",
- "fldz",
- "fmul",
- "fmulp",
- "fnclex",
- "fninit",
- "fnop",
- "fnsave",
- "fnstcw",
- "fnstenv",
- "fnstsw",
- "fpatan",
- "fprem1",
- "fprem",
- "fptan",
- "frndint",
- "frstor",
- "fsave",
- "fscale",
- "fsin",
- "fsincos",
- "fsqrt",
- "fst",
- "fstcw",
- "fstenv",
- "fstp",
- "fstsw",
- "fsub",
- "fsubp",
- "fsubr",
- "fsubrp",
- "ftst",
- "fucom",
- "fucomi",
- "fucomip",
- "fucomp",
- "fucompp",
- "fxam",
- "fxch",
- "fxrstor",
- "fxsave",
- "fxtract",
- "fyl2x",
- "fyl2xp1",
- "fwait",
- "wait",
- };
-
- private static readonly string[] SimdInstructions = new[]
- {
- "addpd",
- "addps",
- "addsd",
- "addss",
- "addsubpd",
- "addsubps",
- "aesdec",
- "aesdeclast",
- "aesenc",
- "aesenclast",
- "aesimc",
- "aeskeygenassist",
- "andnpd",
- "andnps",
- "andpd",
- "andps",
- "blendpd",
- "blendps",
- "blendvpd",
- "blendvps",
- "clflush",
- "cmpeqpd",
- "cmpeqps",
- "cmpeqsd",
- "cmpeqss",
- "cmplepd",
- "cmpleps",
- "cmplesd",
- "cmpless",
- "cmpltpd",
- "cmpltps",
- "cmpltsd",
- "cmpltss",
- "cmpneqpd",
- "cmpneqps",
- "cmpneqsd",
- "cmpneqss",
- "cmpnlepd",
- "cmpnleps",
- "cmpnlesd",
- "cmpnless",
- "cmpnltpd",
- "cmpnltps",
- "cmpnltsd",
- "cmpnltss",
- "cmpordpd",
- "cmpordps",
- "cmpordsd",
- "cmpordss",
- "cmppd",
- "cmpps",
- "cmpss",
- "cmpunordpd",
- "cmpunordps",
- "cmpunordsd",
- "cmpunordss",
- "comisd",
- "comiss",
- "cvtdq2pd",
- "cvtdq2ps",
- "cvtpd2dq",
- "cvtpd2pi",
- "cvtpd2ps",
- "cvtpi2pd",
- "cvtpi2ps",
- "cvtps2dq",
- "cvtps2pd",
- "cvtps2pi",
- "cvtsd2si",
- "cvtsd2ss",
- "cvtsi2sd",
- "cvtsi2ss",
- "cvtss2sd",
- "cvtss2si",
- "cvttpd2dq",
- "cvttpd2pi",
- "cvttps2dq",
- "cvttps2pi",
- "cvttsd2si",
- "cvttss2si",
- "divpd",
- "divps",
- "divsd",
- "divss",
- "dppd",
- "dpps",
- "emms",
- "extractps",
- "extrq",
- "femms",
- "fxrstor64",
- "fxsave64",
- "haddpd",
- "haddps",
- "hsubpd",
- "hsubps",
- "insertps",
- "insertq",
- "lddqu",
- "ldmxcsr",
- "lfence",
- "maskmovdqu",
- "maskmovq",
- "maxpd",
- "maxps",
- "maxsd",
- "maxss",
- "mfence",
- "minpd",
- "minps",
- "minsd",
- "minss",
- "monitor",
- "movapd",
- "movaps",
- "movd",
- "movddup",
- "movdq2q",
- "movdqa",
- "movdqu",
- "movhlps",
- "movhpd",
- "movhps",
- "movlhps",
- "movlpd",
- "movlps",
- "movmskpd",
- "movmskps",
- "movntdq",
- "movntdqa",
- "movnti",
- "movntpd",
- "movntps",
- "movntq",
- "movntsd",
- "movntss",
- "movq",
- "movq2dq",
- "movshdup",
- "movsldup",
- "movss",
- "movupd",
- "movups",
- "mpsadbw",
- "mulpd",
- "mulps",
- "mulsd",
- "mulss",
- "mwait",
- "orpd",
- "orps",
- "pabsb",
- "pabsd",
- "pabsw",
- "packssdw",
- "packsswb",
- "packusdw",
- "packuswb",
- "paddb",
- "paddd",
- "paddq",
- "paddsb",
- "paddsiw",
- "paddsw",
- "paddusb",
- "paddusw",
- "paddw",
- "palignr",
- "pand",
- "pandn",
- "pause",
- "paveb",
- "pavgb",
- "pavgusb",
- "pavgw",
- "pblendvb",
- "pblendw",
- "pclmulqdq",
- "pcmpeqb",
- "pcmpeqd",
- "pcmpeqq",
- "pcmpeqw",
- "pcmpestri",
- "pcmpestrm",
- "pcmpgtb",
- "pcmpgtd",
- "pcmpgtq",
- "pcmpgtw",
- "pcmpistri",
- "pcmpistrm",
- "pdistib",
- "pextrb",
- "pextrd",
- "pextrq",
- "pextrw",
- "pf2id",
- "pfacc",
- "pfadd",
- "pfcmpeq",
- "pfcmpge",
- "pfcmpgt",
- "pfmax",
- "pfmin",
- "pfmul",
- "pfrcp",
- "pfrcpit1",
- "pfrcpit2",
- "pfrsqit1",
- "pfrsqrt",
- "pfsub",
- "pfsubr",
- "phaddd",
- "phaddsw",
- "phaddw",
- "phminposuw",
- "phsubd",
- "phsubsw",
- "phsubw",
- "pi2fd",
- "pinsrb",
- "pinsrd",
- "pinsrq",
- "pinsrw",
- "pmachriw",
- "pmaddubsw",
- "pmaddwd",
- "pmagw",
- "pmaxsb",
- "pmaxsd",
- "pmaxsw",
- "pmaxub",
- "pmaxud",
- "pmaxuw",
- "pminsb",
- "pminsd",
- "pminsw",
- "pminub",
- "pminud",
- "pminuw",
- "pmovmskb",
- "pmovsxbd",
- "pmovsxbq",
- "pmovsxbw",
- "pmovsxdq",
- "pmovsxwd",
- "pmovsxwq",
- "pmovzxbd",
- "pmovzxbq",
- "pmovzxbw",
- "pmovzxdq",
- "pmovzxwd",
- "pmovzxwq",
- "pmuldq",
- "pmulhriw",
- "pmulhrsw",
- "pmulhrwa",
- "pmulhrwc",
- "pmulhuw",
- "pmulhw",
- "pmulld",
- "pmullw",
- "pmuludq",
- "pmvgezb",
- "pmvlzb",
- "pmvnzb",
- "pmvzb",
- "por",
- "prefetch",
- "prefetchnta",
- "prefetcht0",
- "prefetcht1",
- "prefetcht2",
- "psadbw",
- "pshufb",
- "pshufd",
- "pshufhw",
- "pshuflw",
- "pshufw",
- "psignb",
- "psignd",
- "psignw",
- "pslld",
- "pslldq",
- "psllq",
- "psllw",
- "psrad",
- "psraw",
- "psrld",
- "psrldq",
- "psrlq",
- "psrlw",
- "psubb",
- "psubd",
- "psubq",
- "psubsb",
- "psubsiw",
- "psubsw",
- "psubusb",
- "psubusw",
- "psubw",
- "ptest",
- "punpckhbw",
- "punpckhdq",
- "punpckhqdq",
- "punpckhwd",
- "punpcklbw",
- "punpckldq",
- "punpcklqdq",
- "punpcklwd",
- "pxor",
- "rcpps",
- "rcpss",
- "roundpd",
- "roundps",
- "roundsd",
- "roundss",
- "rsqrtps",
- "rsqrtss",
- "sfence",
- "shufpd",
- "shufps",
- "sqrtpd",
- "sqrtps",
- "sqrtsd",
- "sqrtss",
- "stmxcsr",
- "subpd",
- "subps",
- "subsd",
- "subss",
- "ucomisd",
- "ucomiss",
- "unpckhpd",
- "unpckhps",
- "unpcklpd",
- "unpcklps",
- "vaddpd",
- "vaddps",
- "vaddsd",
- "vaddss",
- "vaddsubpd",
- "vaddsubps",
- "vaesdec",
- "vaesdeclast",
- "vaesenc",
- "vaesenclast",
- "vaesimc",
- "vaeskeygenassist",
- "vandnpd",
- "vandnps",
- "vandpd",
- "vandps",
- "vblendpd",
- "vblendps",
- "vblendvpd",
- "vblendvps",
- "vbroadcastf128",
- "vbroadcasti128",
- "vbroadcastsd",
- "vbroadcastss",
- "vcmpeqpd",
- "vcmpeqps",
- "vcmpeqsd",
- "vcmpeqss",
- "vcmpfalsepd",
- "vcmpfalseps",
- "vcmpfalsesd",
- "vcmpfalsess",
- "vcmpgepd",
- "vcmpgeps",
- "vcmpgesd",
- "vcmpgess",
- "vcmpgtpd",
- "vcmpgtps",
- "vcmpgtsd",
- "vcmpgtss",
- "vcmplepd",
- "vcmpleps",
- "vcmplesd",
- "vcmpless",
- "vcmpltpd",
- "vcmpltps",
- "vcmpltsd",
- "vcmpltss",
- "vcmpneqpd",
- "vcmpneqps",
- "vcmpneqsd",
- "vcmpneqss",
- "vcmpngepd",
- "vcmpngeps",
- "vcmpngesd",
- "vcmpngess",
- "vcmpngtpd",
- "vcmpngtps",
- "vcmpngtsd",
- "vcmpngtss",
- "vcmpnlepd",
- "vcmpnleps",
- "vcmpnlesd",
- "vcmpnless",
- "vcmpnltpd",
- "vcmpnltps",
- "vcmpnltsd",
- "vcmpnltss",
- "vcmpordpd",
- "vcmpordps",
- "vcmpordsd",
- "vcmpordss",
- "vcmppd",
- "vcmpps",
- "vcmpsd",
- "vcmpss",
- "vcmptruepd",
- "vcmptrueps",
- "vcmptruesd",
- "vcmptruess",
- "vcmpunordpd",
- "vcmpunordps",
- "vcmpunordsd",
- "vcmpunordss",
- "vcomisd",
- "vcomiss",
- "vcvtdq2pd",
- "vcvtdq2ps",
- "vcvtpd2dq",
- "vcvtpd2ps",
- "vcvtph2ps",
- "vcvtps2dq",
- "vcvtps2pd",
- "vcvtps2ph",
- "vcvtsd2si",
- "vcvtsd2ss",
- "vcvtsi2sd",
- "vcvtsi2ss",
- "vcvtss2sd",
- "vcvtss2si",
- "vcvttpd2dq",
- "vcvttps2dq",
- "vcvttsd2si",
- "vcvttss2si",
- "vdivpd",
- "vdivps",
- "vdivsd",
- "vdivss",
- "vdppd",
- "vdpps",
- "vextractf128",
- "vextracti128",
- "vextractps",
- "vfmadd123pd",
- "vfmadd123ps",
- "vfmadd123sd",
- "vfmadd123ss",
- "vfmadd132pd",
- "vfmadd132ps",
- "vfmadd132sd",
- "vfmadd132ss",
- "vfmadd213pd",
- "vfmadd213ps",
- "vfmadd213sd",
- "vfmadd213ss",
- "vfmadd231pd",
- "vfmadd231ps",
- "vfmadd231sd",
- "vfmadd231ss",
- "vfmadd312pd",
- "vfmadd312ps",
- "vfmadd312sd",
- "vfmadd312ss",
- "vfmadd321pd",
- "vfmadd321ps",
- "vfmadd321sd",
- "vfmadd321ss",
- "vfmaddsub123pd",
- "vfmaddsub123ps",
- "vfmaddsub132pd",
- "vfmaddsub132ps",
- "vfmaddsub213pd",
- "vfmaddsub213ps",
- "vfmaddsub231pd",
- "vfmaddsub231ps",
- "vfmaddsub312pd",
- "vfmaddsub312ps",
- "vfmaddsub321pd",
- "vfmaddsub321ps",
- "vfmsub123pd",
- "vfmsub123ps",
- "vfmsub123sd",
- "vfmsub123ss",
- "vfmsub132pd",
- "vfmsub132ps",
- "vfmsub132sd",
- "vfmsub132ss",
- "vfmsub213pd",
- "vfmsub213ps",
- "vfmsub213sd",
- "vfmsub213ss",
- "vfmsub231pd",
- "vfmsub231ps",
- "vfmsub231sd",
- "vfmsub231ss",
- "vfmsub312pd",
- "vfmsub312ps",
- "vfmsub312sd",
- "vfmsub312ss",
- "vfmsub321pd",
- "vfmsub321ps",
- "vfmsub321sd",
- "vfmsub321ss",
- "vfmsubadd123pd",
- "vfmsubadd123ps",
- "vfmsubadd132pd",
- "vfmsubadd132ps",
- "vfmsubadd213pd",
- "vfmsubadd213ps",
- "vfmsubadd231pd",
- "vfmsubadd231ps",
- "vfmsubadd312pd",
- "vfmsubadd312ps",
- "vfmsubadd321pd",
- "vfmsubadd321ps",
- "vfnmadd123pd",
- "vfnmadd123ps",
- "vfnmadd123sd",
- "vfnmadd123ss",
- "vfnmadd132pd",
- "vfnmadd132ps",
- "vfnmadd132sd",
- "vfnmadd132ss",
- "vfnmadd213pd",
- "vfnmadd213ps",
- "vfnmadd213sd",
- "vfnmadd213ss",
- "vfnmadd231pd",
- "vfnmadd231ps",
- "vfnmadd231sd",
- "vfnmadd231ss",
- "vfnmadd312pd",
- "vfnmadd312ps",
- "vfnmadd312sd",
- "vfnmadd312ss",
- "vfnmadd321pd",
- "vfnmadd321ps",
- "vfnmadd321sd",
- "vfnmadd321ss",
- "vfnmsub123pd",
- "vfnmsub123ps",
- "vfnmsub123sd",
- "vfnmsub123ss",
- "vfnmsub132pd",
- "vfnmsub132ps",
- "vfnmsub132sd",
- "vfnmsub132ss",
- "vfnmsub213pd",
- "vfnmsub213ps",
- "vfnmsub213sd",
- "vfnmsub213ss",
- "vfnmsub231pd",
- "vfnmsub231ps",
- "vfnmsub231sd",
- "vfnmsub231ss",
- "vfnmsub312pd",
- "vfnmsub312ps",
- "vfnmsub312sd",
- "vfnmsub312ss",
- "vfnmsub321pd",
- "vfnmsub321ps",
- "vfnmsub321sd",
- "vfnmsub321ss",
- "vgatherdpd",
- "vgatherdps",
- "vgatherqpd",
- "vgatherqps",
- "vhaddpd",
- "vhaddps",
- "vhsubpd",
- "vhsubps",
- "vinsertf128",
- "vinserti128",
- "vinsertps",
- "vlddqu",
- "vldmxcsr",
- "vldqqu",
- "vmaskmovdqu",
- "vmaskmovpd",
- "vmaskmovps",
- "vmaxpd",
- "vmaxps",
- "vmaxsd",
- "vmaxss",
- "vminpd",
- "vminps",
- "vminsd",
- "vminss",
- "vmovapd",
- "vmovaps",
- "vmovd",
- "vmovddup",
- "vmovdqa",
- "vmovdqu",
- "vmovhlps",
- "vmovhpd",
- "vmovhps",
- "vmovlhps",
- "vmovlpd",
- "vmovlps",
- "vmovmskpd",
- "vmovmskps",
- "vmovntdq",
- "vmovntdqa",
- "vmovntpd",
- "vmovntps",
- "vmovntqq",
- "vmovq",
- "vmovqqa",
- "vmovqqu",
- "vmovsd",
- "vmovshdup",
- "vmovsldup",
- "vmovss",
- "vmovupd",
- "vmovups",
- "vmpsadbw",
- "vmulpd",
- "vmulps",
- "vmulsd",
- "vmulss",
- "vorpd",
- "vorps",
- "vpabsb",
- "vpabsd",
- "vpabsw",
- "vpackssdw",
- "vpacksswb",
- "vpackusdw",
- "vpackuswb",
- "vpaddb",
- "vpaddd",
- "vpaddq",
- "vpaddsb",
- "vpaddsw",
- "vpaddusb",
- "vpaddusw",
- "vpaddw",
- "vpalignr",
- "vpand",
- "vpandn",
- "vpavgb",
- "vpavgw",
- "vpblendd",
- "vpblendvb",
- "vpblendw",
- "vpbroadcastb",
- "vpbroadcastd",
- "vpbroadcastq",
- "vpbroadcastw",
- "vpclmulqdq",
- "vpcmpeqb",
- "vpcmpeqd",
- "vpcmpeqq",
- "vpcmpeqw",
- "vpcmpestri",
- "vpcmpestrm",
- "vpcmpgtb",
- "vpcmpgtd",
- "vpcmpgtq",
- "vpcmpgtw",
- "vpcmpistri",
- "vpcmpistrm",
- "vperm2f128",
- "vperm2i128",
- "vpermd",
- "vpermilpd",
- "vpermilps",
- "vpermpd",
- "vpermps",
- "vpermq",
- "vpextrb",
- "vpextrd",
- "vpextrq",
- "vpextrw",
- "vpgatherdd",
- "vpgatherdq",
- "vpgatherqd",
- "vpgatherqq",
- "vphaddd",
- "vphaddsw",
- "vphaddw",
- "vphminposuw",
- "vphsubd",
- "vphsubsw",
- "vphsubw",
- "vpinsrb",
- "vpinsrd",
- "vpinsrq",
- "vpinsrw",
- "vpmaddubsw",
- "vpmaddwd",
- "vpmaskmovd",
- "vpmaskmovq",
- "vpmaxsb",
- "vpmaxsd",
- "vpmaxsw",
- "vpmaxub",
- "vpmaxud",
- "vpmaxuw",
- "vpminsb",
- "vpminsd",
- "vpminsw",
- "vpminub",
- "vpminud",
- "vpminuw",
- "vpmovmskb",
- "vpmovsxbd",
- "vpmovsxbq",
- "vpmovsxbw",
- "vpmovsxdq",
- "vpmovsxwd",
- "vpmovsxwq",
- "vpmovzxbd",
- "vpmovzxbq",
- "vpmovzxbw",
- "vpmovzxdq",
- "vpmovzxwd",
- "vpmovzxwq",
- "vpmuldq",
- "vpmulhrsw",
- "vpmulhuw",
- "vpmulhw",
- "vpmulld",
- "vpmullw",
- "vpmuludq",
- "vpor",
- "vpsadbw",
- "vpshufb",
- "vpshufd",
- "vpshufhw",
- "vpshuflw",
- "vpsignb",
- "vpsignd",
- "vpsignw",
- "vpslld",
- "vpslldq",
- "vpsllq",
- "vpsllvd",
- "vpsllvq",
- "vpsllw",
- "vpsrad",
- "vpsravd",
- "vpsraw",
- "vpsrld",
- "vpsrldq",
- "vpsrlq",
- "vpsrlvd",
- "vpsrlvq",
- "vpsrlw",
- "vpsubb",
- "vpsubd",
- "vpsubq",
- "vpsubsb",
- "vpsubsw",
- "vpsubusb",
- "vpsubusw",
- "vpsubw",
- "vptest",
- "vpunpckhbw",
- "vpunpckhdq",
- "vpunpckhqdq",
- "vpunpckhwd",
- "vpunpcklbw",
- "vpunpckldq",
- "vpunpcklqdq",
- "vpunpcklwd",
- "vpxor",
- "vrcpps",
- "vrcpss",
- "vroundpd",
- "vroundps",
- "vroundsd",
- "vroundss",
- "vrsqrtps",
- "vrsqrtss",
- "vshufpd",
- "vshufps",
- "vsqrtpd",
- "vsqrtps",
- "vsqrtsd",
- "vsqrtss",
- "vstmxcsr",
- "vsubpd",
- "vsubps",
- "vsubsd",
- "vsubss",
- "vtestpd",
- "vtestps",
- "vucomisd",
- "vucomiss",
- "vunpckhpd",
- "vunpckhps",
- "vunpcklpd",
- "vunpcklps",
- "vxorpd",
- "vxorps",
- "vzeroall",
- "vzeroupper",
- "xorpd",
- "xorps",
- "xrstor64",
- "xrstors",
- "xrstors64",
- "xsave64",
- "xsavec",
- "xsavec64",
- "xsaveopt64",
- "xsaves",
- "xsaves64",
- };
-
- private X86AsmTokenKindProvider() : base(
- Registers.Length +
- Qualifiers.Length +
- Instructions.Length +
- CallInstructions.Length +
- BranchInstructions.Length +
- JumpInstructions.Length +
- ReturnInstructions.Length +
- FpuInstructions.Length +
- SimdInstructions.Length)
- {
- foreach (var register in Registers)
- {
- AddTokenKind(register, AsmTokenKind.Register);
- }
-
- foreach (var instruction in Qualifiers)
- {
- AddTokenKind(instruction, AsmTokenKind.Qualifier);
- }
-
- foreach (var instruction in Instructions)
- {
- AddTokenKind(instruction, AsmTokenKind.Instruction);
- }
-
- foreach (var instruction in CallInstructions)
- {
- AddTokenKind(instruction, AsmTokenKind.CallInstruction);
- }
-
- foreach (var instruction in BranchInstructions)
- {
- AddTokenKind(instruction, AsmTokenKind.BranchInstruction);
- }
-
- foreach (var instruction in JumpInstructions)
- {
- AddTokenKind(instruction, AsmTokenKind.JumpInstruction);
- }
-
- foreach (var instruction in ReturnInstructions)
- {
- AddTokenKind(instruction, AsmTokenKind.ReturnInstruction);
- }
-
- foreach (var instruction in FpuInstructions)
- {
- AddTokenKind(instruction, AsmTokenKind.Instruction);
- }
-
- foreach (var instruction in SimdInstructions)
- {
- AddTokenKind(instruction, AsmTokenKind.InstructionSIMD);
- }
- }
-
- public static readonly X86AsmTokenKindProvider Instance = new X86AsmTokenKindProvider();
-
- /// <summary>
- /// Returns whether <see cref="instruction"/> is a packed, scalar, or infrastructure SIMD instruction.
- /// </summary>
- /// <remarks>
- /// Assumes that <see cref="instruction"/> is an X86 SIMD instruction.
- /// </remarks>
- public override SIMDkind SimdKind(StringSlice instruction) => instruction[instruction.Length - 2] switch
- {
- 'p' => SIMDkind.Packed,
- 's' => SIMDkind.Scalar,
- _ => SIMDkind.Infrastructure
- };
-
- public override bool RegisterEqual(string regA, string regB)
- {
- try
- {
- var regAVal = RegisterMapping(regA);
- var regBVal = RegisterMapping(regB);
- return regAVal == regBVal;
- }
- catch (Exception)
- {
- return false;
- }
- }
-
- private int RegisterMapping(string reg)
- {
- switch (reg)
- {
- case "rax":
- case "eax":
- case "ax":
- case "ah":
- case "al":
- return 0;
- case "rbx":
- case "ebx":
- case "bx":
- case "bh":
- case "bl":
- return 1;
- case "rcx":
- case "ecx":
- case "cx":
- case "ch":
- case "cl":
- return 2;
- case "rdx":
- case "edx":
- case "dx":
- case "dh":
- case "dl":
- return 3;
- case "rsi":
- case "esi":
- case "si":
- case "sil":
- return 4;
- case "rdi":
- case "edi":
- case "di":
- case "dil":
- return 5;
- case "rsp":
- case "esp":
- case "sp":
- case "spl":
- return 6;
- case "rbp":
- case "ebp":
- case "bp":
- case "bpl":
- return 7;
- case "rip":
- case "eip":
- case "ip":
- return 8;
- case "r8":
- case "r8d":
- case "r8w":
- case "r8b":
- return 9;
- case "r9":
- case "r9d":
- case "r9w":
- case "r9b":
- return 10;
- case "r10":
- case "r10d":
- case "r10w":
- case "r10b":
- return 11;
- case "r11":
- case "r11d":
- case "r11w":
- case "r11b":
- return 12;
- case "r12":
- case "r12d":
- case "r12w":
- case "r12b":
- return 13;
- case "r13":
- case "r13d":
- case "r13w":
- case "r13b":
- return 14;
- case "r14":
- case "r14d":
- case "r14w":
- case "r14b":
- return 15;
- case "r15":
- case "r15d":
- case "r15w":
- case "r15b":
- return 16;
- case "cr0":
- return 17;
- case "cr2":
- return 18;
- case "cr3":
- return 19;
- case "cr4":
- return 20;
- case "cr8":
- return 21;
- case "dr0":
- return 22;
- case "dr1":
- return 23;
- case "dr2":
- return 24;
- case "dr3":
- return 25;
- case "dr6":
- return 26;
- case "dr7":
- return 27;
- case "mm0":
- return 28;
- case "mm1":
- return 29;
- case "mm2":
- return 30;
- case "mm3":
- return 31;
- case "mm4":
- return 32;
- case "mm5":
- return 33;
- case "mm6":
- return 34;
- case "mm7":
- return 35;
- case "xmm0":
- return 36;
- case "xmm1":
- return 37;
- case "xmm2":
- return 38;
- case "xmm3":
- return 39;
- case "xmm4":
- return 40;
- case "xmm5":
- return 41;
- case "xmm6":
- return 42;
- case "xmm7":
- return 43;
- case "xmm8":
- return 44;
- case "xmm9":
- return 45;
- case "xmm10":
- return 46;
- case "xmm11":
- return 47;
- case "xmm12":
- return 48;
- case "xmm13":
- return 49;
- case "xmm14":
- return 50;
- case "xmm15":
- return 51;
- case "ymm0":
- return 52;
- case "ymm1":
- return 53;
- case "ymm2":
- return 54;
- case "ymm3":
- return 55;
- case "ymm4":
- return 56;
- case "ymm5":
- return 57;
- case "ymm6":
- return 58;
- case "ymm7":
- return 59;
- case "ymm8":
- return 60;
- case "ymm9":
- return 61;
- case "ymm10":
- return 62;
- case "ymm11":
- return 63;
- case "ymm12":
- return 64;
- case "ymm13":
- return 65;
- case "ymm14":
- return 66;
- case "ymm15":
- return 67;
- case "st":
- return 68;
- case "st0":
- return 69;
- case "st1":
- return 70;
- case "st2":
- return 71;
- case "st3":
- return 72;
- case "st4":
- return 73;
- case "st5":
- return 74;
- case "st6":
- return 75;
- case "st7":
- return 76;
- case "cs":
- return 77;
- case "ss":
- return 78;
- case "ds":
- return 79;
- case "es":
- return 80;
- case "fs":
- return 81;
- case "gs":
- return 82;
- default:
- throw new Exception($"Case for \"{reg}\" not implemented.");
- }
- }
- }
- }
- }
- #endif
|