12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454 |
- using System;
- using System.Collections.Generic;
- using System.Runtime.InteropServices;
-
- #if UNITY_EDITOR || BURST_INTERNAL
- namespace Unity.Burst.Editor
- {
- internal partial class BurstDisassembler
- {
- internal class ARM64AsmTokenKindProvider : AsmTokenKindProvider
- {
- private static readonly string[] Registers = new[]
- {
- "nzcv",
- "wsp",
- "sp",
- "lr",
-
- "r0",
- "r1",
- "r2",
- "r3",
- "r4",
- "r5",
- "r6",
- "r7",
- "r8",
- "r9",
- "r10",
- "r11",
- "r12",
- "r13",
- "r14",
- "r15",
-
- "b0",
- "b1",
- "b2",
- "b3",
- "b4",
- "b5",
- "b6",
- "b7",
- "b8",
- "b9",
- "b10",
- "b11",
- "b12",
- "b13",
- "b14",
- "b15",
- "b16",
- "b17",
- "b18",
- "b19",
- "b20",
- "b21",
- "b22",
- "b23",
- "b24",
- "b25",
- "b26",
- "b27",
- "b28",
- "b29",
- "b30",
- "b31",
- "d0",
- "d1",
- "d2",
- "d3",
- "d4",
- "d5",
- "d6",
- "d7",
- "d8",
- "d9",
- "d10",
- "d11",
- "d12",
- "d13",
- "d14",
- "d15",
- "d16",
- "d17",
- "d18",
- "d19",
- "d20",
- "d21",
- "d22",
- "d23",
- "d24",
- "d25",
- "d26",
- "d27",
- "d28",
- "d29",
- "d30",
- "d31",
- "h0",
- "h1",
- "h2",
- "h3",
- "h4",
- "h5",
- "h6",
- "h7",
- "h8",
- "h9",
- "h10",
- "h11",
- "h12",
- "h13",
- "h14",
- "h15",
- "h16",
- "h17",
- "h18",
- "h19",
- "h20",
- "h21",
- "h22",
- "h23",
- "h24",
- "h25",
- "h26",
- "h27",
- "h28",
- "h29",
- "h30",
- "h31",
- "q0",
- "q1",
- "q2",
- "q3",
- "q4",
- "q5",
- "q6",
- "q7",
- "q8",
- "q9",
- "q10",
- "q11",
- "q12",
- "q13",
- "q14",
- "q15",
- "q16",
- "q17",
- "q18",
- "q19",
- "q20",
- "q21",
- "q22",
- "q23",
- "q24",
- "q25",
- "q26",
- "q27",
- "q28",
- "q29",
- "q30",
- "q31",
- "s0",
- "s1",
- "s2",
- "s3",
- "s4",
- "s5",
- "s6",
- "s7",
- "s8",
- "s9",
- "s10",
- "s11",
- "s12",
- "s13",
- "s14",
- "s15",
- "s16",
- "s17",
- "s18",
- "s19",
- "s20",
- "s21",
- "s22",
- "s23",
- "s24",
- "s25",
- "s26",
- "s27",
- "s28",
- "s29",
- "s30",
- "s31",
- "w0",
- "w1",
- "w2",
- "w3",
- "w4",
- "w5",
- "w6",
- "w7",
- "w8",
- "w9",
- "w10",
- "w11",
- "w12",
- "w13",
- "w14",
- "w15",
- "w16",
- "w17",
- "w18",
- "w19",
- "w20",
- "w21",
- "w22",
- "w23",
- "w24",
- "w25",
- "w26",
- "w27",
- "w28",
- "w29",
- "w30",
- "wzr",
- "x0",
- "x1",
- "x2",
- "x3",
- "x4",
- "x5",
- "x6",
- "x7",
- "x8",
- "x9",
- "x10",
- "x11",
- "x12",
- "x13",
- "x14",
- "x15",
- "x16",
- "x17",
- "x18",
- "x19",
- "x20",
- "x21",
- "x22",
- "x23",
- "x24",
- "x25",
- "x26",
- "x27",
- "x28",
- "x29",
- "x30",
-
- "v0",
- "v1",
- "v2",
- "v3",
- "v4",
- "v5",
- "v6",
- "v7",
- "v8",
- "v9",
- "v10",
- "v11",
- "v12",
- "v13",
- "v14",
- "v15",
- "v16",
- "v17",
- "v18",
- "v19",
- "v20",
- "v21",
- "v22",
- "v23",
- "v24",
- "v25",
- "v26",
- "v27",
- "v28",
- "v29",
- "v30",
- };
-
- private static readonly string[] Instructions = new[]
- {
- "bkpt",
- "usat",
- "stm",
- "stmia",
- "stmib",
- "stmda",
- "stmdb",
- "ldm",
- "ldmia",
- "ldmib",
- "ldmda",
- "ldmdb",
- "it",
- "itt",
- "ittt",
- "itttt",
- "ite",
- "itte",
- "ittte",
- "itee",
- "ittee",
- "uxtab",
- "uxtah",
- "abs",
- "adc",
- "add",
- "addhi",
- "adds",
- "addhn",
- "addhn2",
- "addp",
- "addv",
- "addw",
- "adr",
- "adrp",
- "aesd",
- "aese",
- "aesimc",
- "aesmc",
- "and",
- "asr",
- "asrs",
- "at",
- "bfi",
- "bfm",
- "bfxil",
- "bic",
- "bif",
- "bit",
- "brk",
- "bsl",
- "ccmn",
- "ccmp",
- "clrex",
- "cls",
- "clz",
- "cmeq",
- "cmge",
- "cmgt",
- "cmhi",
- "cmhs",
- "cmle",
- "cmlt",
- "cmn",
- "cmp",
- "cmtst",
- "cnt",
- "crc32b",
- "crc32cb",
- "crc32ch",
- "crc32cw",
- "crc32cx",
- "crc32h",
- "crc32w",
- "crc32x",
- "csel",
- "csinc",
- "csinv",
- "csneg",
- "dc",
- "dcps1",
- "dcps2",
- "dcps3",
- "dmb",
- "drps",
- "dsb",
- "dup",
- "eon",
- "eor",
- "eors",
- "eret",
- "ext",
- "extr",
- "fabd",
- "fabs",
- "facge",
- "facgt",
- "fadd",
- "faddp",
- "fccmp",
- "fccmpe",
- "fcmeq",
- "fcmge",
- "fcmgt",
- "fcmle",
- "fcmlt",
- "fcmp",
- "fcmpe",
- "fcsel",
- "fcvt",
- "fcvtas",
- "fcvtau",
- "fcvtl",
- "fcvtl2",
- "fcvtms",
- "fcvtmu",
- "fcvtn",
- "fcvtn2",
- "fcvtns",
- "fcvtnu",
- "fcvtps",
- "fcvtpu",
- "fcvtxn",
- "fcvtxn2",
- "fcvtzs",
- "fcvtzu",
- "fdiv",
- "fmadd",
- "fmax",
- "fmaxnm",
- "fmaxnmp",
- "fmaxnmv",
- "fmaxp",
- "fmaxv",
- "fmin",
- "fminnm",
- "fminnmp",
- "fminnmv",
- "fminp",
- "fminv",
- "fmla",
- "fmls",
- "fmov",
- "fmsub",
- "fmul",
- "fmulx",
- "fneg",
- "fnmadd",
- "fnmsub",
- "fnmul",
- "frecpe",
- "frecps",
- "frecpx",
- "frinta",
- "frinti",
- "frintm",
- "frintn",
- "frintp",
- "frintx",
- "frintz",
- "frsqrte",
- "frsqrts",
- "fsqrt",
- "fsub",
- "hint",
- "hlt",
- "hvc",
- "ic",
- "ins",
- "isb",
- "ld1",
- "ld1r",
- "ld2",
- "ld2r",
- "ld3",
- "ld3r",
- "ld4",
- "ld4r",
- "ldar",
- "ldarb",
- "ldarh",
- "ldaxp",
- "ldaxr",
- "ldaxrb",
- "ldaxrh",
- "ldnp",
- "ldp",
- "ldpsw",
- "ldr",
- "ldrb",
- "ldrd",
- "ldrh",
- "ldrsb",
- "ldrsh",
- "ldrsw",
- "ldtr",
- "ldtrb",
- "ldtrh",
- "ldtrsb",
- "ldtrsh",
- "ldtrsw",
- "ldur",
- "ldurb",
- "ldurh",
- "ldursb",
- "ldursh",
- "ldursw",
- "ldxp",
- "ldxr",
- "ldxrb",
- "ldxrh",
- "lsl",
- "lsls",
- "lsr",
- "lsrs",
- "umaal",
- "smmul",
- "madd",
- "mla",
- "mls",
- "mneg",
- "mov",
- "movi",
- "movk",
- "movn",
- "movt",
- "movz",
- "movw",
- "mrs",
- "msr",
- "msub",
- "mul",
- "muls",
- "mvn",
- "mvns",
- "mvni",
- "neg",
- "ngc",
- "nop",
- "not",
- "orn",
- "orr",
- "orrs",
- "pmul",
- "pmull",
- "pmull2",
- "prfm",
- "prfum",
- "raddhn",
- "raddhn2",
- "rbit",
- "rev",
- "rev16",
- "rev32",
- "rev64",
- "rrx",
- "ror",
- "rshrn",
- "rshrn2",
- "rsubhn",
- "rsubhn2",
- "saba",
- "sabal",
- "sabal2",
- "sabd",
- "sabdl",
- "sabdl2",
- "sadalp",
- "saddl",
- "saddl2",
- "saddlp",
- "saddlv",
- "saddw",
- "saddw2",
- "sbc",
- "sbfiz",
- "sbfm",
- "sbfx",
- "scvtf",
- "sdiv",
- "sev",
- "sevl",
- "sha1c",
- "sha1h",
- "sha1m",
- "sha1p",
- "sha1su0",
- "sha1su1",
- "sha256h",
- "sha256h2",
- "sha256su0",
- "sha256su1",
- "shadd",
- "shl",
- "shll",
- "shll2",
- "shrn",
- "shrn2",
- "shsub",
- "sli",
- "smaddl",
- "smax",
- "smaxp",
- "smaxv",
- "smc",
- "smin",
- "sminp",
- "sminv",
- "smlabb",
- "smlabt",
- "smlatb",
- "smlatt",
- "smlal",
- "smlal2",
- "smlsl",
- "smlsl2",
- "smnegl",
- "smov",
- "smsubl",
- "smulh",
- "smull",
- "smull2",
- "sqabs",
- "sqadd",
- "sqdmlal",
- "sqdmlal2",
- "sqdmlsl",
- "sqdmlsl2",
- "sqdmulh",
- "sqdmull",
- "sqdmull2",
- "sqneg",
- "sqrdmulh",
- "sqrshl",
- "sqrshrn",
- "sqrshrn2",
- "sqrshrun",
- "sqrshrun2",
- "sqshl",
- "sqshlu",
- "sqshrn",
- "sqshrn2",
- "sqshrun",
- "sqshrun2",
- "sqsub",
- "sqxtn",
- "sqxtn2",
- "sqxtun",
- "sqxtun2",
- "srhadd",
- "sri",
- "srshl",
- "srshr",
- "srsra",
- "sshl",
- "sshll",
- "sshll2",
- "sshr",
- "ssra",
- "ssubl",
- "ssubl2",
- "ssubw",
- "ssubw2",
- "st1",
- "st2",
- "st3",
- "st4",
- "stlr",
- "stlrb",
- "stlrh",
- "stlxp",
- "stlxr",
- "stlxrb",
- "stlxrh",
- "stnp",
- "stp",
- "str",
- "strd",
- "strb",
- "strh",
- "sttr",
- "sttrb",
- "sttrh",
- "stur",
- "sturb",
- "sturh",
- "stxp",
- "stxr",
- "stxrb",
- "stxrh",
- "sub",
- "subw",
- "subs",
- "rsb",
- "rsbs",
- "subhn",
- "subhn2",
- "suqadd",
- "svc",
- "sxtb",
- "sxth",
- "sxtw",
- "sys",
- "sysl",
- "tbl",
- "tbx",
- "tbb",
- "tbh",
- "tlbi",
- "trn1",
- "trn2",
- "tst",
- "uaba",
- "uabal",
- "uabal2",
- "uabd",
- "uabdl",
- "uabdl2",
- "uadalp",
- "uaddl",
- "uaddl2",
- "uaddlp",
- "uaddlv",
- "uaddw",
- "uaddw2",
- "ubfiz",
- "ubfm",
- "ubfx",
- "ucvtf",
- "udiv",
- "uhadd",
- "uhsub",
- "umaddl",
- "umax",
- "umaxp",
- "umaxv",
- "umin",
- "uminp",
- "uminv",
- "umlal",
- "umlal2",
- "umlsl",
- "umlsl2",
- "umnegl",
- "umov",
- "umsubl",
- "umulh",
- "umull",
- "umull2",
- "uqadd",
- "uqrshl",
- "uqrshrn",
- "uqrshrn2",
- "uqshl",
- "uqshrn",
- "uqshrn2",
- "uqsub",
- "uqxtn",
- "uqxtn2",
- "urecpe",
- "urhadd",
- "urshl",
- "urshr",
- "ursqrte",
- "ursra",
- "ushl",
- "ushll",
- "ushll2",
- "ushr",
- "usqadd",
- "usra",
- "usubl",
- "usubl2",
- "usubw",
- "usubw2",
- "uxtb",
- "uxth",
- "uzp1",
- "uzp2",
- "wfe",
- "wfi",
- "xtn",
- "xtn2",
- "yield",
- "zip1",
- "zip2",
- "adcs",
- "addg",
- "adrl",
- "ands",
- "asrv",
- "autda",
- "autdza",
- "autdb",
- "autdzb",
- "autia",
- "autiza",
- "autia1716",
- "autiasp",
- "autiaz",
- "autib",
- "autizb",
- "autib1716",
- "autibsp",
- "autibz",
- "axflag",
- "b.cond",
- "bfc",
- "bics",
- "cinc",
- "cinv",
- "cmpp",
- "cneg",
- "csdb",
- "cset",
- "csetm",
- "eretaa",
- "eretab",
- "esb",
- "irg",
- "ldg",
- "ldgv",
- "lslv",
- "lsrv",
- "movl",
- "negs",
- "ngcs",
- "pacda",
- "pacdza",
- "pacdb",
- "pacdzb",
- "pacga",
- "pacia",
- "paciza",
- "pacia1716",
- "paciasp",
- "paciaz",
- "pacib",
- "pacizb",
- "pacib1716",
- "pacibsp",
- "pacibz",
- "psb",
- "rorv",
- "sbcs",
- "st2g",
- "stg",
- "stgp",
- "stgv",
- "stz2g",
- "stzg",
- "subg",
- "subp",
- "subps",
- "xaflag",
- "xpacd",
- "xpaci",
- "xpaclri",
- "casa",
- "casal",
- "cas",
- "casl",
- "casab",
- "casalb",
- "casb",
- "caslb",
- "casah",
- "casalh",
- "cash",
- "caslh",
- "caspa",
- "caspal",
- "casp",
- "caspl",
- "ldadda",
- "ldaddal",
- "ldadd",
- "ldaddl",
- "ldaddab",
- "ldaddalb",
- "ldaddb",
- "ldaddlb",
- "ldaddah",
- "ldaddalh",
- "ldaddh",
- "ldaddlh",
- "ldapr",
- "ldaprb",
- "ldaprh",
- "ldclra",
- "ldclral",
- "ldclr",
- "ldclrl",
- "ldclrab",
- "ldclralb",
- "ldclrb",
- "ldclrlb",
- "ldclrah",
- "ldclralh",
- "ldclrh",
- "ldclrlh",
- "ldeora",
- "ldeoral",
- "ldeor",
- "ldeorl",
- "ldeorab",
- "ldeoralb",
- "ldeorb",
- "ldeorlb",
- "ldeorah",
- "ldeoralh",
- "ldeorh",
- "ldeorlh",
- "ldlar",
- "ldlarb",
- "ldlarh",
- "ldraa",
- "ldrab",
- "ldrex",
- "strex",
- "ldseta",
- "ldsetal",
- "ldset",
- "ldsetl",
- "ldsetab",
- "ldsetalb",
- "ldsetb",
- "ldsetlb",
- "ldsetah",
- "ldsetalh",
- "ldseth",
- "ldsetlh",
- "ldsmaxa",
- "ldsmaxal",
- "ldsmax",
- "ldsmaxl",
- "ldsmaxab",
- "ldsmaxalb",
- "ldsmaxb",
- "ldsmaxlb",
- "ldsmaxah",
- "ldsmaxalh",
- "ldsmaxh",
- "ldsmaxlh",
- "ldsmina",
- "ldsminal",
- "ldsmin",
- "ldsminl",
- "ldsminab",
- "ldsminalb",
- "ldsminb",
- "ldsminlb",
- "ldsminah",
- "ldsminalh",
- "ldsminh",
- "ldsminlh",
- "ldumaxa",
- "ldumaxal",
- "ldumax",
- "ldumaxl",
- "ldumaxab",
- "ldumaxalb",
- "ldumaxb",
- "ldumaxlb",
- "ldumaxah",
- "ldumaxalh",
- "ldumaxh",
- "ldumaxlh",
- "ldumina",
- "lduminal",
- "ldumin",
- "lduminl",
- "lduminab",
- "lduminalb",
- "lduminb",
- "lduminlb",
- "lduminah",
- "lduminalh",
- "lduminh",
- "lduminlh",
- "stadd",
- "staddl",
- "staddb",
- "staddlb",
- "staddh",
- "staddlh",
- "stclr",
- "stclrl",
- "stclrb",
- "stclrlb",
- "stclrh",
- "stclrlh",
- "steor",
- "steorl",
- "steorb",
- "steorlb",
- "steorh",
- "steorlh",
- "stllr",
- "stllrb",
- "stllrh",
- "stset",
- "stsetl",
- "stsetb",
- "stsetlb",
- "stseth",
- "stsetlh",
- "stsmax",
- "stsmaxl",
- "stsmaxb",
- "stsmaxlb",
- "stsmaxh",
- "stsmaxlh",
- "stsmin",
- "stsminl",
- "stsminb",
- "stsminlb",
- "stsminh",
- "stsminlh",
- "stumax",
- "stumaxl",
- "stumaxb",
- "stumaxlb",
- "stumaxh",
- "stumaxlh",
- "stumin",
- "stuminl",
- "stuminb",
- "stuminlb",
- "stuminh",
- "stuminlh",
- "swpa",
- "swpal",
- "swp",
- "swpl",
- "swpab",
- "swpalb",
- "swpb",
- "swplb",
- "swpah",
- "swpalh",
- "swph",
- "swplh",
- "fjcvtzs",
- "fcmla",
- "fmlal",
- "fmlsl",
- "sqrdmlah",
- "sqrdmlsh",
- "fcadd",
- "sdot",
- "sxtl",
- "sxtl2",
- "udot",
- "uxtl",
- "uxtl2",
- "bcax",
- "eor3",
- "rax1",
- "sha512h2",
- "sha512h",
- "sha512su0",
- "sha512su1",
- "sm3partw1",
- "sm3partw2",
- "sm3ss1",
- "sm3tt1a",
- "sm3tt1b",
- "sm3tt2a",
- "sm3tt2b",
- "sm4e",
- "sm4ekey",
- "xar",
- };
-
- private static readonly string[] BranchInstructions = new string[]
- {
- "beq",
- "bne",
- "bcs",
- "bhs",
- "bcc",
- "blo",
- "bmi",
- "bpl",
- "bvs",
- "bvc",
- "bhi",
- "bls",
- "bge",
- "blt",
- "bgt",
- "ble",
- "bal",
- "bnv",
-
- "cbnz",
- "cbz",
- "tbnz",
- "tbz",
-
- "blraa",
- "blraaz",
- "blrab",
- "blrabz",
-
- "braa",
- "braaz",
- "brab",
- "brabz",
- };
-
- private static readonly string[] JumpInstructions = new string[]
- {
- "b",
- "br",
- "blr",
- "bx",
- "bl",
- "blx",
- "bxj",
- };
-
- private static readonly string[] ReturnInstructions = new string[]
- {
- "ret",
- "retaa",
- "retab",
- };
-
- private static readonly string[] SimdInstructions = new string[]
- {
- // TODO: add missing instructions
- "vld1",
- "vld2",
- "vld3",
- "vld4",
- "vabs",
- "vadd",
- "vaddl",
- "vaddw",
- "vmov",
- "movs",
- "vmul",
- "vsub",
- "vaba",
- "vabl",
- "vabd",
- "vabdl",
- "vacge",
- "vacgt",
- "vacle",
- "vaclt",
- "vaddhn",
- "vand",
- "vbic",
- "vbif",
- "vbit",
- "vbsl",
- "vceq",
- "vcge",
- "vcgt",
- "vcle",
- "vcls",
- "vcnt",
- "vclt",
- "vclz",
- "vcvt",
- "vdup",
- "veor",
- "vext",
- "vfma",
- "vfms",
- "vhadd",
- "vhsub",
- "vld",
- "vmax",
- "vmin",
- "vmla",
- "vmls",
- "vmovl",
- "vmovn",
- "vmvn",
- "vneg",
- "vorn",
- "vorr",
- "vpadal",
- "vpadd",
- "vpmax",
- "vpmin",
- "vqabs",
- "vqadd",
- "vqdmlal",
- "vqdmlsl",
- "vqdmull",
- "vqdmulh",
- "vqmovn",
- "vqneg",
- "vqrdmulh",
- "vqrshl",
- "vqrshrn",
- "vqshl",
- "vqshrn",
- "vqsub",
- "vraddhn",
- "vrecpe",
- "vrecps",
- "vrev",
- "vrev16",
- "vrev32",
- "vrev64",
- "vrhadd",
- "vrshr",
- "vrshrn",
- "vrsqrte",
- "vrsqrts",
- "vrsra",
- "vrsubhn",
- "vshl",
- "vshr",
- "vshrn",
- "vsli",
- "vsra",
- "vsri",
- "vst",
- "vst1",
- "vst2",
- "vst3",
- "vst4",
- "vsubhn",
- "vswp",
- "vtbl",
- "vtbx",
- "vtrn",
- "vtst",
- "vuzp",
- "vzip",
- "vldm",
- "vldmia",
- "vldmdb",
- "vldr",
- "vmrs",
- "vmsr",
- "vpop",
- "vpush",
- "vstm",
- "vstmia",
- "vstr",
- "vcmp",
- "vcmpe",
- "vcvtb",
- "vcvtt",
- "vdiv",
- "vfnma",
- "vfnms",
- "vnmla",
- "vnmls",
- "vnmul",
- "vsqrt",
- "push",
- "pop",
- "pkhbt",
- "pkhtb",
- };
-
- private ARM64AsmTokenKindProvider() : base(Registers.Length +
- Instructions.Length +
- BranchInstructions.Length +
- JumpInstructions.Length +
- ReturnInstructions.Length +
- SimdInstructions.Length)
- {
- foreach (var register in Registers)
- {
- AddTokenKind(register, AsmTokenKind.Register);
- }
-
- foreach (var instruction in Instructions)
- {
- AddTokenKind(instruction, AsmTokenKind.Instruction);
- }
-
- 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 SimdInstructions)
- {
- AddTokenKind(instruction, AsmTokenKind.InstructionSIMD);
- }
- }
-
- public override AsmTokenKind FindTokenKind(StringSlice instr)
- {
- instr = TryRemoveT(instr); // error here now that I added b.le etc.
-
- var kind = base.FindTokenKind(instr);
- if (kind != AsmTokenKind.Identifier)
- {
- return kind;
- }
-
- // Did not find instruction in listed instructions.
- // Try matching whether it ended on a condition flag.
- instr = TryRemoveCond(instr);
- kind = base.FindTokenKind(instr);
- return kind;
- }
-
- private static bool IsConditional(string text)
- {
- switch (text)
- {
- case "eq":
- case "ne":
- case "cs":
- case "hs":
- case "cc":
- case "lo":
- case "mi":
- case "pl":
- case "vs":
- case "vc":
- case "hi":
- case "ls":
- case "ge":
- case "lt":
- case "gt":
- case "le":
- case "al":
- return true;
- default:
- return false;
- }
- }
-
-
- internal static StringSlice TryRemoveT(StringSlice instr)
- {
- var idx = instr.IndexOf('.');
- if (idx < 0)
- {
- return instr;
- }
-
- var instrS = instr.ToString();
- if (IsConditional(instrS.Substring(idx+1)))
- {
- // remove '.' from string e.g. b.le => ble
- return new StringSlice(instrS.Remove(idx, 1));
- }
-
- return new StringSlice(instrS, 0, idx);
- }
-
- internal static StringSlice TryRemoveCond(StringSlice instr)
- {
- if (instr.Length < 2)
- {
- return instr;
- }
-
- var instrS = instr.ToString();
- var idx = instr.Length - 2;
-
- return IsConditional(instrS.Substring(idx, 2))
- ? new StringSlice(instrS, 0, idx)
- : instr;
- }
-
- private static bool IsFloatingRegister(string reg)
- {
- if (reg == "sp")
- {
- return false;
- }
- var c = reg[0];
- return c == 'b' || c == 'h' || c == 's' || c == 'd' || c == 'q' || c == 'v';
- }
-
- private static int StripSizeIdentifier(string reg, int idx)
- {
- // "sp" only register that defies the heuristic.
- if (reg != "sp")
- {
- switch (reg[idx])
- {
- case 'w':
- case 'x':
- case 's':
- case 'q':
- case 'h':
- case 'b':
- case 'd':
- case 'v':
- idx++;
- break;
- }
- }
-
- return idx;
- }
-
- public override bool RegisterEqual(string regA, string regB)
- {
- var isAFloat = IsFloatingRegister(regA);
- var isBFloat = IsFloatingRegister(regB);
-
- if ((isAFloat && isBFloat) || (isAFloat == isBFloat))
- {
- var idxA = StripSizeIdentifier(regA, 0);
- var idxB = StripSizeIdentifier(regB, 0);
-
- var lenA = regA.Length;
- var lenB = regB.Length;
-
- while (idxA < lenA && idxB < lenB)
- {
- if (regA[idxA] != regB[idxB])
- {
- break;
- }
- if ((idxA == lenA - 1 || regA[idxA+1] == '.')
- && (idxB == lenB - 1 || regB[idxB+1] == '.'))
- {
- return true;
- }
- idxA++;
- idxB++;
- }
- }
-
- return false;
- }
-
- /// <summary>
- /// Assumes <see cref="instruction"/> is an arm SIMD instruction.
- /// Returns whether it's a packed or scalar SIMD instruction.
- /// </summary>
- public override SIMDkind SimdKind(StringSlice instruction) =>
- instruction.Contains('.')
- ? SIMDkind.Packed
- : SIMDkind.Scalar;
-
- public static readonly ARM64AsmTokenKindProvider Instance = new ARM64AsmTokenKindProvider();
- }
- }
- }
- #endif
|