UnityGame/Library/PackageCache/com.unity.burst/Editor/BurstDisassembler.Core.x86.cs
2024-10-27 10:53:47 +03:00

1741 lines
47 KiB
C#

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