Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

BurstDisassembler.Core.ARM64.cs 37KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.InteropServices;
  4. #if UNITY_EDITOR || BURST_INTERNAL
  5. namespace Unity.Burst.Editor
  6. {
  7. internal partial class BurstDisassembler
  8. {
  9. internal class ARM64AsmTokenKindProvider : AsmTokenKindProvider
  10. {
  11. private static readonly string[] Registers = new[]
  12. {
  13. "nzcv",
  14. "wsp",
  15. "sp",
  16. "lr",
  17. "r0",
  18. "r1",
  19. "r2",
  20. "r3",
  21. "r4",
  22. "r5",
  23. "r6",
  24. "r7",
  25. "r8",
  26. "r9",
  27. "r10",
  28. "r11",
  29. "r12",
  30. "r13",
  31. "r14",
  32. "r15",
  33. "b0",
  34. "b1",
  35. "b2",
  36. "b3",
  37. "b4",
  38. "b5",
  39. "b6",
  40. "b7",
  41. "b8",
  42. "b9",
  43. "b10",
  44. "b11",
  45. "b12",
  46. "b13",
  47. "b14",
  48. "b15",
  49. "b16",
  50. "b17",
  51. "b18",
  52. "b19",
  53. "b20",
  54. "b21",
  55. "b22",
  56. "b23",
  57. "b24",
  58. "b25",
  59. "b26",
  60. "b27",
  61. "b28",
  62. "b29",
  63. "b30",
  64. "b31",
  65. "d0",
  66. "d1",
  67. "d2",
  68. "d3",
  69. "d4",
  70. "d5",
  71. "d6",
  72. "d7",
  73. "d8",
  74. "d9",
  75. "d10",
  76. "d11",
  77. "d12",
  78. "d13",
  79. "d14",
  80. "d15",
  81. "d16",
  82. "d17",
  83. "d18",
  84. "d19",
  85. "d20",
  86. "d21",
  87. "d22",
  88. "d23",
  89. "d24",
  90. "d25",
  91. "d26",
  92. "d27",
  93. "d28",
  94. "d29",
  95. "d30",
  96. "d31",
  97. "h0",
  98. "h1",
  99. "h2",
  100. "h3",
  101. "h4",
  102. "h5",
  103. "h6",
  104. "h7",
  105. "h8",
  106. "h9",
  107. "h10",
  108. "h11",
  109. "h12",
  110. "h13",
  111. "h14",
  112. "h15",
  113. "h16",
  114. "h17",
  115. "h18",
  116. "h19",
  117. "h20",
  118. "h21",
  119. "h22",
  120. "h23",
  121. "h24",
  122. "h25",
  123. "h26",
  124. "h27",
  125. "h28",
  126. "h29",
  127. "h30",
  128. "h31",
  129. "q0",
  130. "q1",
  131. "q2",
  132. "q3",
  133. "q4",
  134. "q5",
  135. "q6",
  136. "q7",
  137. "q8",
  138. "q9",
  139. "q10",
  140. "q11",
  141. "q12",
  142. "q13",
  143. "q14",
  144. "q15",
  145. "q16",
  146. "q17",
  147. "q18",
  148. "q19",
  149. "q20",
  150. "q21",
  151. "q22",
  152. "q23",
  153. "q24",
  154. "q25",
  155. "q26",
  156. "q27",
  157. "q28",
  158. "q29",
  159. "q30",
  160. "q31",
  161. "s0",
  162. "s1",
  163. "s2",
  164. "s3",
  165. "s4",
  166. "s5",
  167. "s6",
  168. "s7",
  169. "s8",
  170. "s9",
  171. "s10",
  172. "s11",
  173. "s12",
  174. "s13",
  175. "s14",
  176. "s15",
  177. "s16",
  178. "s17",
  179. "s18",
  180. "s19",
  181. "s20",
  182. "s21",
  183. "s22",
  184. "s23",
  185. "s24",
  186. "s25",
  187. "s26",
  188. "s27",
  189. "s28",
  190. "s29",
  191. "s30",
  192. "s31",
  193. "w0",
  194. "w1",
  195. "w2",
  196. "w3",
  197. "w4",
  198. "w5",
  199. "w6",
  200. "w7",
  201. "w8",
  202. "w9",
  203. "w10",
  204. "w11",
  205. "w12",
  206. "w13",
  207. "w14",
  208. "w15",
  209. "w16",
  210. "w17",
  211. "w18",
  212. "w19",
  213. "w20",
  214. "w21",
  215. "w22",
  216. "w23",
  217. "w24",
  218. "w25",
  219. "w26",
  220. "w27",
  221. "w28",
  222. "w29",
  223. "w30",
  224. "wzr",
  225. "x0",
  226. "x1",
  227. "x2",
  228. "x3",
  229. "x4",
  230. "x5",
  231. "x6",
  232. "x7",
  233. "x8",
  234. "x9",
  235. "x10",
  236. "x11",
  237. "x12",
  238. "x13",
  239. "x14",
  240. "x15",
  241. "x16",
  242. "x17",
  243. "x18",
  244. "x19",
  245. "x20",
  246. "x21",
  247. "x22",
  248. "x23",
  249. "x24",
  250. "x25",
  251. "x26",
  252. "x27",
  253. "x28",
  254. "x29",
  255. "x30",
  256. "v0",
  257. "v1",
  258. "v2",
  259. "v3",
  260. "v4",
  261. "v5",
  262. "v6",
  263. "v7",
  264. "v8",
  265. "v9",
  266. "v10",
  267. "v11",
  268. "v12",
  269. "v13",
  270. "v14",
  271. "v15",
  272. "v16",
  273. "v17",
  274. "v18",
  275. "v19",
  276. "v20",
  277. "v21",
  278. "v22",
  279. "v23",
  280. "v24",
  281. "v25",
  282. "v26",
  283. "v27",
  284. "v28",
  285. "v29",
  286. "v30",
  287. };
  288. private static readonly string[] Instructions = new[]
  289. {
  290. "bkpt",
  291. "usat",
  292. "stm",
  293. "stmia",
  294. "stmib",
  295. "stmda",
  296. "stmdb",
  297. "ldm",
  298. "ldmia",
  299. "ldmib",
  300. "ldmda",
  301. "ldmdb",
  302. "it",
  303. "itt",
  304. "ittt",
  305. "itttt",
  306. "ite",
  307. "itte",
  308. "ittte",
  309. "itee",
  310. "ittee",
  311. "uxtab",
  312. "uxtah",
  313. "abs",
  314. "adc",
  315. "add",
  316. "addhi",
  317. "adds",
  318. "addhn",
  319. "addhn2",
  320. "addp",
  321. "addv",
  322. "addw",
  323. "adr",
  324. "adrp",
  325. "aesd",
  326. "aese",
  327. "aesimc",
  328. "aesmc",
  329. "and",
  330. "asr",
  331. "asrs",
  332. "at",
  333. "bfi",
  334. "bfm",
  335. "bfxil",
  336. "bic",
  337. "bif",
  338. "bit",
  339. "brk",
  340. "bsl",
  341. "ccmn",
  342. "ccmp",
  343. "clrex",
  344. "cls",
  345. "clz",
  346. "cmeq",
  347. "cmge",
  348. "cmgt",
  349. "cmhi",
  350. "cmhs",
  351. "cmle",
  352. "cmlt",
  353. "cmn",
  354. "cmp",
  355. "cmtst",
  356. "cnt",
  357. "crc32b",
  358. "crc32cb",
  359. "crc32ch",
  360. "crc32cw",
  361. "crc32cx",
  362. "crc32h",
  363. "crc32w",
  364. "crc32x",
  365. "csel",
  366. "csinc",
  367. "csinv",
  368. "csneg",
  369. "dc",
  370. "dcps1",
  371. "dcps2",
  372. "dcps3",
  373. "dmb",
  374. "drps",
  375. "dsb",
  376. "dup",
  377. "eon",
  378. "eor",
  379. "eors",
  380. "eret",
  381. "ext",
  382. "extr",
  383. "fabd",
  384. "fabs",
  385. "facge",
  386. "facgt",
  387. "fadd",
  388. "faddp",
  389. "fccmp",
  390. "fccmpe",
  391. "fcmeq",
  392. "fcmge",
  393. "fcmgt",
  394. "fcmle",
  395. "fcmlt",
  396. "fcmp",
  397. "fcmpe",
  398. "fcsel",
  399. "fcvt",
  400. "fcvtas",
  401. "fcvtau",
  402. "fcvtl",
  403. "fcvtl2",
  404. "fcvtms",
  405. "fcvtmu",
  406. "fcvtn",
  407. "fcvtn2",
  408. "fcvtns",
  409. "fcvtnu",
  410. "fcvtps",
  411. "fcvtpu",
  412. "fcvtxn",
  413. "fcvtxn2",
  414. "fcvtzs",
  415. "fcvtzu",
  416. "fdiv",
  417. "fmadd",
  418. "fmax",
  419. "fmaxnm",
  420. "fmaxnmp",
  421. "fmaxnmv",
  422. "fmaxp",
  423. "fmaxv",
  424. "fmin",
  425. "fminnm",
  426. "fminnmp",
  427. "fminnmv",
  428. "fminp",
  429. "fminv",
  430. "fmla",
  431. "fmls",
  432. "fmov",
  433. "fmsub",
  434. "fmul",
  435. "fmulx",
  436. "fneg",
  437. "fnmadd",
  438. "fnmsub",
  439. "fnmul",
  440. "frecpe",
  441. "frecps",
  442. "frecpx",
  443. "frinta",
  444. "frinti",
  445. "frintm",
  446. "frintn",
  447. "frintp",
  448. "frintx",
  449. "frintz",
  450. "frsqrte",
  451. "frsqrts",
  452. "fsqrt",
  453. "fsub",
  454. "hint",
  455. "hlt",
  456. "hvc",
  457. "ic",
  458. "ins",
  459. "isb",
  460. "ld1",
  461. "ld1r",
  462. "ld2",
  463. "ld2r",
  464. "ld3",
  465. "ld3r",
  466. "ld4",
  467. "ld4r",
  468. "ldar",
  469. "ldarb",
  470. "ldarh",
  471. "ldaxp",
  472. "ldaxr",
  473. "ldaxrb",
  474. "ldaxrh",
  475. "ldnp",
  476. "ldp",
  477. "ldpsw",
  478. "ldr",
  479. "ldrb",
  480. "ldrd",
  481. "ldrh",
  482. "ldrsb",
  483. "ldrsh",
  484. "ldrsw",
  485. "ldtr",
  486. "ldtrb",
  487. "ldtrh",
  488. "ldtrsb",
  489. "ldtrsh",
  490. "ldtrsw",
  491. "ldur",
  492. "ldurb",
  493. "ldurh",
  494. "ldursb",
  495. "ldursh",
  496. "ldursw",
  497. "ldxp",
  498. "ldxr",
  499. "ldxrb",
  500. "ldxrh",
  501. "lsl",
  502. "lsls",
  503. "lsr",
  504. "lsrs",
  505. "umaal",
  506. "smmul",
  507. "madd",
  508. "mla",
  509. "mls",
  510. "mneg",
  511. "mov",
  512. "movi",
  513. "movk",
  514. "movn",
  515. "movt",
  516. "movz",
  517. "movw",
  518. "mrs",
  519. "msr",
  520. "msub",
  521. "mul",
  522. "muls",
  523. "mvn",
  524. "mvns",
  525. "mvni",
  526. "neg",
  527. "ngc",
  528. "nop",
  529. "not",
  530. "orn",
  531. "orr",
  532. "orrs",
  533. "pmul",
  534. "pmull",
  535. "pmull2",
  536. "prfm",
  537. "prfum",
  538. "raddhn",
  539. "raddhn2",
  540. "rbit",
  541. "rev",
  542. "rev16",
  543. "rev32",
  544. "rev64",
  545. "rrx",
  546. "ror",
  547. "rshrn",
  548. "rshrn2",
  549. "rsubhn",
  550. "rsubhn2",
  551. "saba",
  552. "sabal",
  553. "sabal2",
  554. "sabd",
  555. "sabdl",
  556. "sabdl2",
  557. "sadalp",
  558. "saddl",
  559. "saddl2",
  560. "saddlp",
  561. "saddlv",
  562. "saddw",
  563. "saddw2",
  564. "sbc",
  565. "sbfiz",
  566. "sbfm",
  567. "sbfx",
  568. "scvtf",
  569. "sdiv",
  570. "sev",
  571. "sevl",
  572. "sha1c",
  573. "sha1h",
  574. "sha1m",
  575. "sha1p",
  576. "sha1su0",
  577. "sha1su1",
  578. "sha256h",
  579. "sha256h2",
  580. "sha256su0",
  581. "sha256su1",
  582. "shadd",
  583. "shl",
  584. "shll",
  585. "shll2",
  586. "shrn",
  587. "shrn2",
  588. "shsub",
  589. "sli",
  590. "smaddl",
  591. "smax",
  592. "smaxp",
  593. "smaxv",
  594. "smc",
  595. "smin",
  596. "sminp",
  597. "sminv",
  598. "smlabb",
  599. "smlabt",
  600. "smlatb",
  601. "smlatt",
  602. "smlal",
  603. "smlal2",
  604. "smlsl",
  605. "smlsl2",
  606. "smnegl",
  607. "smov",
  608. "smsubl",
  609. "smulh",
  610. "smull",
  611. "smull2",
  612. "sqabs",
  613. "sqadd",
  614. "sqdmlal",
  615. "sqdmlal2",
  616. "sqdmlsl",
  617. "sqdmlsl2",
  618. "sqdmulh",
  619. "sqdmull",
  620. "sqdmull2",
  621. "sqneg",
  622. "sqrdmulh",
  623. "sqrshl",
  624. "sqrshrn",
  625. "sqrshrn2",
  626. "sqrshrun",
  627. "sqrshrun2",
  628. "sqshl",
  629. "sqshlu",
  630. "sqshrn",
  631. "sqshrn2",
  632. "sqshrun",
  633. "sqshrun2",
  634. "sqsub",
  635. "sqxtn",
  636. "sqxtn2",
  637. "sqxtun",
  638. "sqxtun2",
  639. "srhadd",
  640. "sri",
  641. "srshl",
  642. "srshr",
  643. "srsra",
  644. "sshl",
  645. "sshll",
  646. "sshll2",
  647. "sshr",
  648. "ssra",
  649. "ssubl",
  650. "ssubl2",
  651. "ssubw",
  652. "ssubw2",
  653. "st1",
  654. "st2",
  655. "st3",
  656. "st4",
  657. "stlr",
  658. "stlrb",
  659. "stlrh",
  660. "stlxp",
  661. "stlxr",
  662. "stlxrb",
  663. "stlxrh",
  664. "stnp",
  665. "stp",
  666. "str",
  667. "strd",
  668. "strb",
  669. "strh",
  670. "sttr",
  671. "sttrb",
  672. "sttrh",
  673. "stur",
  674. "sturb",
  675. "sturh",
  676. "stxp",
  677. "stxr",
  678. "stxrb",
  679. "stxrh",
  680. "sub",
  681. "subw",
  682. "subs",
  683. "rsb",
  684. "rsbs",
  685. "subhn",
  686. "subhn2",
  687. "suqadd",
  688. "svc",
  689. "sxtb",
  690. "sxth",
  691. "sxtw",
  692. "sys",
  693. "sysl",
  694. "tbl",
  695. "tbx",
  696. "tbb",
  697. "tbh",
  698. "tlbi",
  699. "trn1",
  700. "trn2",
  701. "tst",
  702. "uaba",
  703. "uabal",
  704. "uabal2",
  705. "uabd",
  706. "uabdl",
  707. "uabdl2",
  708. "uadalp",
  709. "uaddl",
  710. "uaddl2",
  711. "uaddlp",
  712. "uaddlv",
  713. "uaddw",
  714. "uaddw2",
  715. "ubfiz",
  716. "ubfm",
  717. "ubfx",
  718. "ucvtf",
  719. "udiv",
  720. "uhadd",
  721. "uhsub",
  722. "umaddl",
  723. "umax",
  724. "umaxp",
  725. "umaxv",
  726. "umin",
  727. "uminp",
  728. "uminv",
  729. "umlal",
  730. "umlal2",
  731. "umlsl",
  732. "umlsl2",
  733. "umnegl",
  734. "umov",
  735. "umsubl",
  736. "umulh",
  737. "umull",
  738. "umull2",
  739. "uqadd",
  740. "uqrshl",
  741. "uqrshrn",
  742. "uqrshrn2",
  743. "uqshl",
  744. "uqshrn",
  745. "uqshrn2",
  746. "uqsub",
  747. "uqxtn",
  748. "uqxtn2",
  749. "urecpe",
  750. "urhadd",
  751. "urshl",
  752. "urshr",
  753. "ursqrte",
  754. "ursra",
  755. "ushl",
  756. "ushll",
  757. "ushll2",
  758. "ushr",
  759. "usqadd",
  760. "usra",
  761. "usubl",
  762. "usubl2",
  763. "usubw",
  764. "usubw2",
  765. "uxtb",
  766. "uxth",
  767. "uzp1",
  768. "uzp2",
  769. "wfe",
  770. "wfi",
  771. "xtn",
  772. "xtn2",
  773. "yield",
  774. "zip1",
  775. "zip2",
  776. "adcs",
  777. "addg",
  778. "adrl",
  779. "ands",
  780. "asrv",
  781. "autda",
  782. "autdza",
  783. "autdb",
  784. "autdzb",
  785. "autia",
  786. "autiza",
  787. "autia1716",
  788. "autiasp",
  789. "autiaz",
  790. "autib",
  791. "autizb",
  792. "autib1716",
  793. "autibsp",
  794. "autibz",
  795. "axflag",
  796. "b.cond",
  797. "bfc",
  798. "bics",
  799. "cinc",
  800. "cinv",
  801. "cmpp",
  802. "cneg",
  803. "csdb",
  804. "cset",
  805. "csetm",
  806. "eretaa",
  807. "eretab",
  808. "esb",
  809. "irg",
  810. "ldg",
  811. "ldgv",
  812. "lslv",
  813. "lsrv",
  814. "movl",
  815. "negs",
  816. "ngcs",
  817. "pacda",
  818. "pacdza",
  819. "pacdb",
  820. "pacdzb",
  821. "pacga",
  822. "pacia",
  823. "paciza",
  824. "pacia1716",
  825. "paciasp",
  826. "paciaz",
  827. "pacib",
  828. "pacizb",
  829. "pacib1716",
  830. "pacibsp",
  831. "pacibz",
  832. "psb",
  833. "rorv",
  834. "sbcs",
  835. "st2g",
  836. "stg",
  837. "stgp",
  838. "stgv",
  839. "stz2g",
  840. "stzg",
  841. "subg",
  842. "subp",
  843. "subps",
  844. "xaflag",
  845. "xpacd",
  846. "xpaci",
  847. "xpaclri",
  848. "casa",
  849. "casal",
  850. "cas",
  851. "casl",
  852. "casab",
  853. "casalb",
  854. "casb",
  855. "caslb",
  856. "casah",
  857. "casalh",
  858. "cash",
  859. "caslh",
  860. "caspa",
  861. "caspal",
  862. "casp",
  863. "caspl",
  864. "ldadda",
  865. "ldaddal",
  866. "ldadd",
  867. "ldaddl",
  868. "ldaddab",
  869. "ldaddalb",
  870. "ldaddb",
  871. "ldaddlb",
  872. "ldaddah",
  873. "ldaddalh",
  874. "ldaddh",
  875. "ldaddlh",
  876. "ldapr",
  877. "ldaprb",
  878. "ldaprh",
  879. "ldclra",
  880. "ldclral",
  881. "ldclr",
  882. "ldclrl",
  883. "ldclrab",
  884. "ldclralb",
  885. "ldclrb",
  886. "ldclrlb",
  887. "ldclrah",
  888. "ldclralh",
  889. "ldclrh",
  890. "ldclrlh",
  891. "ldeora",
  892. "ldeoral",
  893. "ldeor",
  894. "ldeorl",
  895. "ldeorab",
  896. "ldeoralb",
  897. "ldeorb",
  898. "ldeorlb",
  899. "ldeorah",
  900. "ldeoralh",
  901. "ldeorh",
  902. "ldeorlh",
  903. "ldlar",
  904. "ldlarb",
  905. "ldlarh",
  906. "ldraa",
  907. "ldrab",
  908. "ldrex",
  909. "strex",
  910. "ldseta",
  911. "ldsetal",
  912. "ldset",
  913. "ldsetl",
  914. "ldsetab",
  915. "ldsetalb",
  916. "ldsetb",
  917. "ldsetlb",
  918. "ldsetah",
  919. "ldsetalh",
  920. "ldseth",
  921. "ldsetlh",
  922. "ldsmaxa",
  923. "ldsmaxal",
  924. "ldsmax",
  925. "ldsmaxl",
  926. "ldsmaxab",
  927. "ldsmaxalb",
  928. "ldsmaxb",
  929. "ldsmaxlb",
  930. "ldsmaxah",
  931. "ldsmaxalh",
  932. "ldsmaxh",
  933. "ldsmaxlh",
  934. "ldsmina",
  935. "ldsminal",
  936. "ldsmin",
  937. "ldsminl",
  938. "ldsminab",
  939. "ldsminalb",
  940. "ldsminb",
  941. "ldsminlb",
  942. "ldsminah",
  943. "ldsminalh",
  944. "ldsminh",
  945. "ldsminlh",
  946. "ldumaxa",
  947. "ldumaxal",
  948. "ldumax",
  949. "ldumaxl",
  950. "ldumaxab",
  951. "ldumaxalb",
  952. "ldumaxb",
  953. "ldumaxlb",
  954. "ldumaxah",
  955. "ldumaxalh",
  956. "ldumaxh",
  957. "ldumaxlh",
  958. "ldumina",
  959. "lduminal",
  960. "ldumin",
  961. "lduminl",
  962. "lduminab",
  963. "lduminalb",
  964. "lduminb",
  965. "lduminlb",
  966. "lduminah",
  967. "lduminalh",
  968. "lduminh",
  969. "lduminlh",
  970. "stadd",
  971. "staddl",
  972. "staddb",
  973. "staddlb",
  974. "staddh",
  975. "staddlh",
  976. "stclr",
  977. "stclrl",
  978. "stclrb",
  979. "stclrlb",
  980. "stclrh",
  981. "stclrlh",
  982. "steor",
  983. "steorl",
  984. "steorb",
  985. "steorlb",
  986. "steorh",
  987. "steorlh",
  988. "stllr",
  989. "stllrb",
  990. "stllrh",
  991. "stset",
  992. "stsetl",
  993. "stsetb",
  994. "stsetlb",
  995. "stseth",
  996. "stsetlh",
  997. "stsmax",
  998. "stsmaxl",
  999. "stsmaxb",
  1000. "stsmaxlb",
  1001. "stsmaxh",
  1002. "stsmaxlh",
  1003. "stsmin",
  1004. "stsminl",
  1005. "stsminb",
  1006. "stsminlb",
  1007. "stsminh",
  1008. "stsminlh",
  1009. "stumax",
  1010. "stumaxl",
  1011. "stumaxb",
  1012. "stumaxlb",
  1013. "stumaxh",
  1014. "stumaxlh",
  1015. "stumin",
  1016. "stuminl",
  1017. "stuminb",
  1018. "stuminlb",
  1019. "stuminh",
  1020. "stuminlh",
  1021. "swpa",
  1022. "swpal",
  1023. "swp",
  1024. "swpl",
  1025. "swpab",
  1026. "swpalb",
  1027. "swpb",
  1028. "swplb",
  1029. "swpah",
  1030. "swpalh",
  1031. "swph",
  1032. "swplh",
  1033. "fjcvtzs",
  1034. "fcmla",
  1035. "fmlal",
  1036. "fmlsl",
  1037. "sqrdmlah",
  1038. "sqrdmlsh",
  1039. "fcadd",
  1040. "sdot",
  1041. "sxtl",
  1042. "sxtl2",
  1043. "udot",
  1044. "uxtl",
  1045. "uxtl2",
  1046. "bcax",
  1047. "eor3",
  1048. "rax1",
  1049. "sha512h2",
  1050. "sha512h",
  1051. "sha512su0",
  1052. "sha512su1",
  1053. "sm3partw1",
  1054. "sm3partw2",
  1055. "sm3ss1",
  1056. "sm3tt1a",
  1057. "sm3tt1b",
  1058. "sm3tt2a",
  1059. "sm3tt2b",
  1060. "sm4e",
  1061. "sm4ekey",
  1062. "xar",
  1063. };
  1064. private static readonly string[] BranchInstructions = new string[]
  1065. {
  1066. "beq",
  1067. "bne",
  1068. "bcs",
  1069. "bhs",
  1070. "bcc",
  1071. "blo",
  1072. "bmi",
  1073. "bpl",
  1074. "bvs",
  1075. "bvc",
  1076. "bhi",
  1077. "bls",
  1078. "bge",
  1079. "blt",
  1080. "bgt",
  1081. "ble",
  1082. "bal",
  1083. "bnv",
  1084. "cbnz",
  1085. "cbz",
  1086. "tbnz",
  1087. "tbz",
  1088. "blraa",
  1089. "blraaz",
  1090. "blrab",
  1091. "blrabz",
  1092. "braa",
  1093. "braaz",
  1094. "brab",
  1095. "brabz",
  1096. };
  1097. private static readonly string[] JumpInstructions = new string[]
  1098. {
  1099. "b",
  1100. "br",
  1101. "blr",
  1102. "bx",
  1103. "bl",
  1104. "blx",
  1105. "bxj",
  1106. };
  1107. private static readonly string[] ReturnInstructions = new string[]
  1108. {
  1109. "ret",
  1110. "retaa",
  1111. "retab",
  1112. };
  1113. private static readonly string[] SimdInstructions = new string[]
  1114. {
  1115. // TODO: add missing instructions
  1116. "vld1",
  1117. "vld2",
  1118. "vld3",
  1119. "vld4",
  1120. "vabs",
  1121. "vadd",
  1122. "vaddl",
  1123. "vaddw",
  1124. "vmov",
  1125. "movs",
  1126. "vmul",
  1127. "vsub",
  1128. "vaba",
  1129. "vabl",
  1130. "vabd",
  1131. "vabdl",
  1132. "vacge",
  1133. "vacgt",
  1134. "vacle",
  1135. "vaclt",
  1136. "vaddhn",
  1137. "vand",
  1138. "vbic",
  1139. "vbif",
  1140. "vbit",
  1141. "vbsl",
  1142. "vceq",
  1143. "vcge",
  1144. "vcgt",
  1145. "vcle",
  1146. "vcls",
  1147. "vcnt",
  1148. "vclt",
  1149. "vclz",
  1150. "vcvt",
  1151. "vdup",
  1152. "veor",
  1153. "vext",
  1154. "vfma",
  1155. "vfms",
  1156. "vhadd",
  1157. "vhsub",
  1158. "vld",
  1159. "vmax",
  1160. "vmin",
  1161. "vmla",
  1162. "vmls",
  1163. "vmovl",
  1164. "vmovn",
  1165. "vmvn",
  1166. "vneg",
  1167. "vorn",
  1168. "vorr",
  1169. "vpadal",
  1170. "vpadd",
  1171. "vpmax",
  1172. "vpmin",
  1173. "vqabs",
  1174. "vqadd",
  1175. "vqdmlal",
  1176. "vqdmlsl",
  1177. "vqdmull",
  1178. "vqdmulh",
  1179. "vqmovn",
  1180. "vqneg",
  1181. "vqrdmulh",
  1182. "vqrshl",
  1183. "vqrshrn",
  1184. "vqshl",
  1185. "vqshrn",
  1186. "vqsub",
  1187. "vraddhn",
  1188. "vrecpe",
  1189. "vrecps",
  1190. "vrev",
  1191. "vrev16",
  1192. "vrev32",
  1193. "vrev64",
  1194. "vrhadd",
  1195. "vrshr",
  1196. "vrshrn",
  1197. "vrsqrte",
  1198. "vrsqrts",
  1199. "vrsra",
  1200. "vrsubhn",
  1201. "vshl",
  1202. "vshr",
  1203. "vshrn",
  1204. "vsli",
  1205. "vsra",
  1206. "vsri",
  1207. "vst",
  1208. "vst1",
  1209. "vst2",
  1210. "vst3",
  1211. "vst4",
  1212. "vsubhn",
  1213. "vswp",
  1214. "vtbl",
  1215. "vtbx",
  1216. "vtrn",
  1217. "vtst",
  1218. "vuzp",
  1219. "vzip",
  1220. "vldm",
  1221. "vldmia",
  1222. "vldmdb",
  1223. "vldr",
  1224. "vmrs",
  1225. "vmsr",
  1226. "vpop",
  1227. "vpush",
  1228. "vstm",
  1229. "vstmia",
  1230. "vstr",
  1231. "vcmp",
  1232. "vcmpe",
  1233. "vcvtb",
  1234. "vcvtt",
  1235. "vdiv",
  1236. "vfnma",
  1237. "vfnms",
  1238. "vnmla",
  1239. "vnmls",
  1240. "vnmul",
  1241. "vsqrt",
  1242. "push",
  1243. "pop",
  1244. "pkhbt",
  1245. "pkhtb",
  1246. };
  1247. private ARM64AsmTokenKindProvider() : base(Registers.Length +
  1248. Instructions.Length +
  1249. BranchInstructions.Length +
  1250. JumpInstructions.Length +
  1251. ReturnInstructions.Length +
  1252. SimdInstructions.Length)
  1253. {
  1254. foreach (var register in Registers)
  1255. {
  1256. AddTokenKind(register, AsmTokenKind.Register);
  1257. }
  1258. foreach (var instruction in Instructions)
  1259. {
  1260. AddTokenKind(instruction, AsmTokenKind.Instruction);
  1261. }
  1262. foreach (var instruction in BranchInstructions)
  1263. {
  1264. AddTokenKind(instruction, AsmTokenKind.BranchInstruction);
  1265. }
  1266. foreach (var instruction in JumpInstructions)
  1267. {
  1268. AddTokenKind(instruction, AsmTokenKind.JumpInstruction);
  1269. }
  1270. foreach (var instruction in ReturnInstructions)
  1271. {
  1272. AddTokenKind(instruction, AsmTokenKind.ReturnInstruction);
  1273. }
  1274. foreach (var instruction in SimdInstructions)
  1275. {
  1276. AddTokenKind(instruction, AsmTokenKind.InstructionSIMD);
  1277. }
  1278. }
  1279. public override AsmTokenKind FindTokenKind(StringSlice instr)
  1280. {
  1281. instr = TryRemoveT(instr); // error here now that I added b.le etc.
  1282. var kind = base.FindTokenKind(instr);
  1283. if (kind != AsmTokenKind.Identifier)
  1284. {
  1285. return kind;
  1286. }
  1287. // Did not find instruction in listed instructions.
  1288. // Try matching whether it ended on a condition flag.
  1289. instr = TryRemoveCond(instr);
  1290. kind = base.FindTokenKind(instr);
  1291. return kind;
  1292. }
  1293. private static bool IsConditional(string text)
  1294. {
  1295. switch (text)
  1296. {
  1297. case "eq":
  1298. case "ne":
  1299. case "cs":
  1300. case "hs":
  1301. case "cc":
  1302. case "lo":
  1303. case "mi":
  1304. case "pl":
  1305. case "vs":
  1306. case "vc":
  1307. case "hi":
  1308. case "ls":
  1309. case "ge":
  1310. case "lt":
  1311. case "gt":
  1312. case "le":
  1313. case "al":
  1314. return true;
  1315. default:
  1316. return false;
  1317. }
  1318. }
  1319. internal static StringSlice TryRemoveT(StringSlice instr)
  1320. {
  1321. var idx = instr.IndexOf('.');
  1322. if (idx < 0)
  1323. {
  1324. return instr;
  1325. }
  1326. var instrS = instr.ToString();
  1327. if (IsConditional(instrS.Substring(idx+1)))
  1328. {
  1329. // remove '.' from string e.g. b.le => ble
  1330. return new StringSlice(instrS.Remove(idx, 1));
  1331. }
  1332. return new StringSlice(instrS, 0, idx);
  1333. }
  1334. internal static StringSlice TryRemoveCond(StringSlice instr)
  1335. {
  1336. if (instr.Length < 2)
  1337. {
  1338. return instr;
  1339. }
  1340. var instrS = instr.ToString();
  1341. var idx = instr.Length - 2;
  1342. return IsConditional(instrS.Substring(idx, 2))
  1343. ? new StringSlice(instrS, 0, idx)
  1344. : instr;
  1345. }
  1346. private static bool IsFloatingRegister(string reg)
  1347. {
  1348. if (reg == "sp")
  1349. {
  1350. return false;
  1351. }
  1352. var c = reg[0];
  1353. return c == 'b' || c == 'h' || c == 's' || c == 'd' || c == 'q' || c == 'v';
  1354. }
  1355. private static int StripSizeIdentifier(string reg, int idx)
  1356. {
  1357. // "sp" only register that defies the heuristic.
  1358. if (reg != "sp")
  1359. {
  1360. switch (reg[idx])
  1361. {
  1362. case 'w':
  1363. case 'x':
  1364. case 's':
  1365. case 'q':
  1366. case 'h':
  1367. case 'b':
  1368. case 'd':
  1369. case 'v':
  1370. idx++;
  1371. break;
  1372. }
  1373. }
  1374. return idx;
  1375. }
  1376. public override bool RegisterEqual(string regA, string regB)
  1377. {
  1378. var isAFloat = IsFloatingRegister(regA);
  1379. var isBFloat = IsFloatingRegister(regB);
  1380. if ((isAFloat && isBFloat) || (isAFloat == isBFloat))
  1381. {
  1382. var idxA = StripSizeIdentifier(regA, 0);
  1383. var idxB = StripSizeIdentifier(regB, 0);
  1384. var lenA = regA.Length;
  1385. var lenB = regB.Length;
  1386. while (idxA < lenA && idxB < lenB)
  1387. {
  1388. if (regA[idxA] != regB[idxB])
  1389. {
  1390. break;
  1391. }
  1392. if ((idxA == lenA - 1 || regA[idxA+1] == '.')
  1393. && (idxB == lenB - 1 || regB[idxB+1] == '.'))
  1394. {
  1395. return true;
  1396. }
  1397. idxA++;
  1398. idxB++;
  1399. }
  1400. }
  1401. return false;
  1402. }
  1403. /// <summary>
  1404. /// Assumes <see cref="instruction"/> is an arm SIMD instruction.
  1405. /// Returns whether it's a packed or scalar SIMD instruction.
  1406. /// </summary>
  1407. public override SIMDkind SimdKind(StringSlice instruction) =>
  1408. instruction.Contains('.')
  1409. ? SIMDkind.Packed
  1410. : SIMDkind.Scalar;
  1411. public static readonly ARM64AsmTokenKindProvider Instance = new ARM64AsmTokenKindProvider();
  1412. }
  1413. }
  1414. }
  1415. #endif