nds32-asm.c 103 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283
  1. /* NDS32-specific support for 32-bit ELF.
  2. Copyright (C) 2012-2017 Free Software Foundation, Inc.
  3. Contributed by Andes Technology Corporation.
  4. This file is part of BFD, the Binary File Descriptor library.
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 3 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
  16. 02110-1301, USA. */
  17. #include <config.h>
  18. #include <stdlib.h>
  19. #include <stdint.h>
  20. #include <string.h>
  21. #include <assert.h>
  22. #include "safe-ctype.h"
  23. #include "libiberty.h"
  24. #include "hashtab.h"
  25. #include "bfd.h"
  26. #include "opcode/nds32.h"
  27. #include "nds32-asm.h"
  28. /* There at at most MAX_LEX_NUM lexical elements in a syntax. */
  29. #define MAX_LEX_NUM 32
  30. /* A operand in syntax string should be at most this long. */
  31. #define MAX_LEX_LEN 64
  32. /* The max length of a keyword can be. */
  33. #define MAX_KEYWORD_LEN 32
  34. /* This LEX is a plain char or operand. */
  35. #define IS_LEX_CHAR(c) (((c) >> 7) == 0)
  36. #define LEX_SET_FIELD(c) ((c) | SYN_FIELD)
  37. #define LEX_GET_FIELD(c) operand_fields[((c) & 0xff)]
  38. /* Get the char in this lexical element. */
  39. #define LEX_CHAR(c) ((c) & 0xff)
  40. #define USRIDX(group, usr) ((group) | ((usr) << 5))
  41. #define SRIDX(major, minor, ext) \
  42. (((major) << 7) | ((minor) << 3) | (ext))
  43. static int parse_re (struct nds32_asm_desc *, struct nds32_asm_insn *,
  44. char **, int64_t *);
  45. static int parse_re2 (struct nds32_asm_desc *, struct nds32_asm_insn *,
  46. char **, int64_t *);
  47. static int parse_fe5 (struct nds32_asm_desc *, struct nds32_asm_insn *,
  48. char **, int64_t *);
  49. static int parse_pi5 (struct nds32_asm_desc *, struct nds32_asm_insn *,
  50. char **, int64_t *);
  51. static int parse_aext_reg (char **, int *, int);
  52. static int parse_a30b20 (struct nds32_asm_desc *, struct nds32_asm_insn *,
  53. char **, int64_t *);
  54. static int parse_rt21 (struct nds32_asm_desc *, struct nds32_asm_insn *,
  55. char **, int64_t *);
  56. static int parse_rte_start (struct nds32_asm_desc *, struct nds32_asm_insn *,
  57. char **, int64_t *);
  58. static int parse_rte_end (struct nds32_asm_desc *, struct nds32_asm_insn *,
  59. char **, int64_t *);
  60. static int parse_rte69_start (struct nds32_asm_desc *, struct nds32_asm_insn *,
  61. char **, int64_t *);
  62. static int parse_rte69_end (struct nds32_asm_desc *, struct nds32_asm_insn *,
  63. char **, int64_t *);
  64. static int parse_im5_ip (struct nds32_asm_desc *, struct nds32_asm_insn *,
  65. char **, int64_t *);
  66. static int parse_im5_mr (struct nds32_asm_desc *, struct nds32_asm_insn *,
  67. char **, int64_t *);
  68. static int parse_im6_ip (struct nds32_asm_desc *, struct nds32_asm_insn *,
  69. char **, int64_t *);
  70. static int parse_im6_iq (struct nds32_asm_desc *, struct nds32_asm_insn *,
  71. char **, int64_t *);
  72. static int parse_im6_mr (struct nds32_asm_desc *, struct nds32_asm_insn *,
  73. char **, int64_t *);
  74. static int parse_im6_ms (struct nds32_asm_desc *, struct nds32_asm_insn *,
  75. char **, int64_t *);
  76. /* These are operand prefixes for input/output semantic.
  77. % input
  78. = output
  79. & both
  80. {} optional operand
  81. Field table for operands and bit-fields. */
  82. const field_t operand_fields[] =
  83. {
  84. {"rt", 20, 5, 0, HW_GPR, NULL},
  85. {"ra", 15, 5, 0, HW_GPR, NULL},
  86. {"rb", 10, 5, 0, HW_GPR, NULL},
  87. {"rd", 5, 5, 0, HW_GPR, NULL},
  88. {"re", 10, 5, 0, HW_GPR, parse_re}, /* lmw smw lmwa smwa. */
  89. {"fst", 20, 5, 0, HW_FSR, NULL},
  90. {"fsa", 15, 5, 0, HW_FSR, NULL},
  91. {"fsb", 10, 5, 0, HW_FSR, NULL},
  92. {"fdt", 20, 5, 0, HW_FDR, NULL},
  93. {"fda", 15, 5, 0, HW_FDR, NULL},
  94. {"fdb", 10, 5, 0, HW_FDR, NULL},
  95. {"cprt", 20, 5, 0, HW_CPR, NULL},
  96. {"cp", 13, 2, 0, HW_CP, NULL},
  97. {"sh", 5, 5, 0, HW_UINT, NULL}, /* sh in ALU instructions. */
  98. {"sv", 8, 2, 0, HW_UINT, NULL}, /* sv in MEM instructions. */
  99. {"dt", 21, 1, 0, HW_DXR, NULL},
  100. {"usr", 10, 10, 0, HW_USR, NULL}, /* User Special Registers. */
  101. {"sr", 10, 10, 0, HW_SR, NULL}, /* System Registers. */
  102. {"ridx", 10, 10, 0, HW_UINT, NULL}, /* Raw value for mfusr/mfsr. */
  103. {"enb4", 6, 4, 0, HW_UINT, NULL}, /* Enable4 for LSMW. */
  104. {"swid", 5, 15, 0, HW_UINT, NULL},
  105. {"stdby_st", 5, 2, 0, HW_STANDBY_ST, NULL},
  106. {"tlbop_st", 5, 5, 0, HW_TLBOP_ST, NULL},
  107. {"tlbop_stx", 5, 5, 0, HW_UINT, NULL},
  108. {"cctl_st0", 5, 5, 0, HW_CCTL_ST0, NULL},
  109. {"cctl_st1", 5, 5, 0, HW_CCTL_ST1, NULL},
  110. {"cctl_st2", 5, 5, 0, HW_CCTL_ST2, NULL},
  111. {"cctl_st3", 5, 5, 0, HW_CCTL_ST3, NULL},
  112. {"cctl_st4", 5, 5, 0, HW_CCTL_ST4, NULL},
  113. {"cctl_st5", 5, 5, 0, HW_CCTL_ST5, NULL},
  114. {"cctl_stx", 5, 5, 0, HW_UINT, NULL},
  115. {"cctl_lv", 10, 1, 0, HW_CCTL_LV, NULL},
  116. {"msync_st", 5, 3, 0, HW_MSYNC_ST, NULL},
  117. {"msync_stx", 5, 3, 0, HW_UINT, NULL},
  118. {"dpref_st", 20, 4, 0, HW_DPREF_ST, NULL},
  119. {"rt5", 5, 5, 0, HW_GPR, NULL},
  120. {"ra5", 0, 5, 0, HW_GPR, NULL},
  121. {"rt4", 5, 4, 0, HW_GPR, NULL},
  122. {"rt3", 6, 3, 0, HW_GPR, NULL},
  123. {"rt38", 8, 3, 0, HW_GPR, NULL}, /* rt3 used in 38 form. */
  124. {"ra3", 3, 3, 0, HW_GPR, NULL},
  125. {"rb3", 0, 3, 0, HW_GPR, NULL},
  126. {"rt5e", 4, 4, 1, HW_GPR, NULL}, /* for movd44. */
  127. {"ra5e", 0, 4, 1, HW_GPR, NULL}, /* for movd44. */
  128. {"re2", 5, 2, 0, HW_GPR, parse_re2}, /* re in push25/pop25. */
  129. {"fe5", 0, 5, 2, HW_UINT, parse_fe5}, /* imm5u in lwi45.fe. */
  130. {"pi5", 0, 5, 0, HW_UINT, parse_pi5}, /* imm5u in movpi45. */
  131. {"abdim", 2, 3, 0, HW_ABDIM, NULL}, /* Flags for LSMW. */
  132. {"abm", 2, 3, 0, HW_ABM, NULL}, /* Flags for LSMWZB. */
  133. {"dtiton", 8, 2, 0, HW_DTITON, NULL},
  134. {"dtitoff", 8, 2, 0, HW_DTITOFF, NULL},
  135. {"i5s", 0, 5, 0, HW_INT, NULL},
  136. {"i10s", 0, 10, 0, HW_INT, NULL},
  137. {"i15s", 0, 15, 0, HW_INT, NULL},
  138. {"i19s", 0, 19, 0, HW_INT, NULL},
  139. {"i20s", 0, 20, 0, HW_INT, NULL},
  140. {"i8s1", 0, 8, 1, HW_INT, NULL},
  141. {"i11br3", 8, 11, 0, HW_INT, NULL},
  142. {"i14s1", 0, 14, 1, HW_INT, NULL},
  143. {"i15s1", 0, 15, 1, HW_INT, NULL},
  144. {"i16s1", 0, 16, 1, HW_INT, NULL},
  145. {"i18s1", 0, 18, 1, HW_INT, NULL},
  146. {"i24s1", 0, 24, 1, HW_INT, NULL},
  147. {"i8s2", 0, 8, 2, HW_INT, NULL},
  148. {"i12s2", 0, 12, 2, HW_INT, NULL},
  149. {"i15s2", 0, 15, 2, HW_INT, NULL},
  150. {"i17s2", 0, 17, 2, HW_INT, NULL},
  151. {"i19s2", 0, 19, 2, HW_INT, NULL},
  152. {"i3u", 0, 3, 0, HW_UINT, NULL},
  153. {"i5u", 0, 5, 0, HW_UINT, NULL},
  154. {"ib5u", 10, 5, 0, HW_UINT, NULL}, /* imm5 field in ALU. */
  155. {"ib5s", 10, 5, 0, HW_INT, NULL}, /* imm5 field in ALU. */
  156. {"i9u", 0, 9, 0, HW_UINT, NULL}, /* for ex9.it. */
  157. {"ia3u", 3, 3, 0, HW_UINT, NULL}, /* for bmski33, fexti33. */
  158. {"i8u", 0, 8, 0, HW_UINT, NULL},
  159. {"ib8u", 7, 8, 0, HW_UINT, NULL}, /* for ffbi. */
  160. {"i15u", 0, 15, 0, HW_UINT, NULL},
  161. {"i20u", 0, 20, 0, HW_UINT, NULL},
  162. {"i3u1", 0, 3, 1, HW_UINT, NULL},
  163. {"i9u1", 0, 9, 1, HW_UINT, NULL},
  164. {"i3u2", 0, 3, 2, HW_UINT, NULL},
  165. {"i6u2", 0, 6, 2, HW_UINT, NULL},
  166. {"i7u2", 0, 7, 2, HW_UINT, NULL},
  167. {"i5u3", 0, 5, 3, HW_UINT, NULL}, /* for pop25/pop25. */
  168. {"i15s3", 0, 15, 3, HW_INT, NULL}, /* for dprefi.d. */
  169. {"a_rt", 15, 5, 0, HW_GPR, NULL}, /* for audio-extension. */
  170. {"a_ru", 10, 5, 0, HW_GPR, NULL}, /* for audio-extension. */
  171. {"a_dx", 9, 1, 0, HW_DXR, NULL}, /* for audio-extension. */
  172. {"a_a30", 16, 4, 0, HW_GPR, parse_a30b20}, /* for audio-extension. */
  173. {"a_b20", 12, 4, 0, HW_GPR, parse_a30b20}, /* for audio-extension. */
  174. {"a_rt21", 5, 7, 0, HW_GPR, parse_rt21}, /* for audio-extension. */
  175. {"a_rte", 5, 7, 0, HW_GPR, parse_rte_start}, /* for audio-extension. */
  176. {"a_rte1", 5, 7, 0, HW_GPR, parse_rte_end}, /* for audio-extension. */
  177. {"a_rte69", 6, 4, 0, HW_GPR, parse_rte69_start}, /* for audio-extension. */
  178. {"a_rte69_1", 6, 4, 0, HW_GPR, parse_rte69_end}, /* for audio-extension. */
  179. {"dhy", 5, 2, 0, HW_AEXT_ACC, NULL}, /* for audio-extension. */
  180. {"dxh", 15, 2, 0, HW_AEXT_ACC, NULL}, /* for audio-extension. */
  181. {"aridx", 0, 5, 0, HW_AEXT_ARIDX, NULL}, /* for audio-extension. */
  182. {"aridx2", 0, 5, 0, HW_AEXT_ARIDX2, NULL}, /* for audio-extension. */
  183. {"aridxi", 16, 4, 0, HW_AEXT_ARIDXI, NULL}, /* for audio-extension. */
  184. {"imm16", 0, 16, 0, HW_UINT, NULL}, /* for audio-extension. */
  185. {"im5_i", 0, 5, 0, HW_AEXT_IM_I, parse_im5_ip}, /* for audio-extension. */
  186. {"im5_m", 0, 5, 0, HW_AEXT_IM_M, parse_im5_mr}, /* for audio-extension. */
  187. {"im6_ip", 0, 2, 0, HW_AEXT_IM_I, parse_im6_ip}, /* for audio-extension. */
  188. {"im6_iq", 0, 2, 0, HW_AEXT_IM_I, parse_im6_iq}, /* for audio-extension. */
  189. {"im6_mr", 2, 2, 0, HW_AEXT_IM_M, parse_im6_mr}, /* for audio-extension. */
  190. {"im6_ms", 4, 2, 0, HW_AEXT_IM_M, parse_im6_ms}, /* for audio-extension. */
  191. {"cp45", 4, 2, 0, HW_CP, NULL}, /* for cop-extension. */
  192. {"i12u", 8, 12, 0, HW_UINT, NULL}, /* for cop-extension. */
  193. {"cpi19", 6, 19, 0, HW_UINT, NULL}, /* for cop-extension. */
  194. {NULL, 0, 0, 0, 0, NULL}
  195. };
  196. #define DEF_REG(r) (__BIT (r))
  197. #define USE_REG(r) (__BIT (r))
  198. #define RT(r) (r << 20)
  199. #define RA(r) (r << 15)
  200. #define RB(r) (r << 10)
  201. #define RA5(r) (r)
  202. struct nds32_opcode nds32_opcodes[] =
  203. {
  204. /* opc6_encoding table OPC_6. */
  205. {"lbi", "=rt,[%ra{+%i15s}]", OP6 (LBI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  206. {"lhi", "=rt,[%ra{+%i15s1}]", OP6 (LHI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  207. {"lwi", "=rt,[%ra{+%i15s2}]", OP6 (LWI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  208. {"lbi.bi", "=rt,[%ra],%i15s", OP6 (LBI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  209. {"lhi.bi", "=rt,[%ra],%i15s1", OP6 (LHI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  210. {"lwi.bi", "=rt,[%ra],%i15s2", OP6 (LWI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  211. {"sbi", "%rt,[%ra{+%i15s}]", OP6 (SBI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  212. {"shi", "%rt,[%ra{+%i15s1}]", OP6 (SHI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  213. {"swi", "%rt,[%ra{+%i15s2}]", OP6 (SWI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  214. {"sbi.bi", "%rt,[%ra],%i15s", OP6 (SBI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  215. {"shi.bi", "%rt,[%ra],%i15s1", OP6 (SHI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  216. {"swi.bi", "%rt,[%ra],%i15s2", OP6 (SWI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  217. {"lbsi", "=rt,[%ra{+%i15s}]", OP6 (LBSI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  218. {"lhsi", "=rt,[%ra{+%i15s1}]", OP6 (LHSI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  219. {"lbsi.bi", "=rt,[%ra],%i15s", OP6 (LBSI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  220. {"lhsi.bi", "=rt,[%ra],%i15s1", OP6 (LHSI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  221. {"movi", "=rt,%i20s", OP6 (MOVI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  222. {"sethi", "=rt,%i20u", OP6 (SETHI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  223. {"addi", "=rt,%ra,%i15s", OP6 (ADDI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  224. {"subri", "=rt,%ra,%i15s", OP6 (SUBRI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  225. {"andi", "=rt,%ra,%i15u", OP6 (ANDI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  226. {"xori", "=rt,%ra,%i15u", OP6 (XORI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  227. {"ori", "=rt,%ra,%i15u", OP6 (ORI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  228. {"slti", "=rt,%ra,%i15s", OP6 (SLTI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  229. {"sltsi", "=rt,%ra,%i15s", OP6 (SLTSI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  230. {"bitci", "=rt,%ra,%i15u", OP6 (BITCI), 4, ATTR_V3, 0, NULL, 0, NULL},
  231. /* seg-DPREFI. */
  232. {"dprefi.w", "%dpref_st,[%ra{+%i15s2}]", OP6 (DPREFI), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  233. {"dprefi.d", "%dpref_st,[%ra{+%i15s3}]", OP6 (DPREFI) | __BIT (24), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  234. /* seg-LBGP. */
  235. {"lbi.gp", "=rt,[+%i19s]", OP6 (LBGP), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL},
  236. {"lbsi.gp", "=rt,[+%i19s]", OP6 (LBGP) | __BIT (19), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL},
  237. /* seg-LWC/0. */
  238. {"cplwi", "%cp,=cprt,[%ra{+%i12s2}]", OP6 (LWC), 4, 0, 0, NULL, 0, NULL},
  239. {"cplwi.bi", "%cp,=cprt,[%ra],%i12s2", OP6 (LWC) | __BIT (12), 4, 0, 0, NULL, 0, NULL},
  240. /* seg-SWC/0. */
  241. {"cpswi", "%cp,=cprt,[%ra{+%i12s2}]", OP6 (SWC), 4, 0, 0, NULL, 0, NULL},
  242. {"cpswi.bi", "%cp,=cprt,[%ra],%i12s2", OP6 (SWC) | __BIT (12), 4, 0, 0, NULL, 0, NULL},
  243. /* seg-LDC/0. */
  244. {"cpldi", "%cp,%cprt,[%ra{+%i12s2}]", OP6 (LDC), 4, 0, 0, NULL, 0, NULL},
  245. {"cpldi.bi", "%cp,%cprt,[%ra],%i12s2", OP6 (LDC) | __BIT (12), 4, 0, 0, NULL, 0, NULL},
  246. /* seg-SDC/0. */
  247. {"cpsdi", "%cp,%cprt,[%ra{+%i12s2}]", OP6 (SDC), 4, 0, 0, NULL, 0, NULL},
  248. {"cpsdi.bi", "%cp,%cprt,[%ra],%i12s2", OP6 (SDC) | __BIT (12), 4, 0, 0, NULL, 0, NULL},
  249. /* seg-LSMW. */
  250. {"lmw", "%abdim %rt,[%ra],%re{,%enb4}", LSMW (LSMW), 4, ATTR_ALL, 0, NULL, 0, NULL},
  251. {"lmwa", "%abdim %rt,[%ra],%re{,%enb4}", LSMW (LSMWA), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL},
  252. {"lmwzb", "%abm %rt,[%ra],%re{,%enb4}", LSMW (LSMWZB), 4, ATTR (STR_EXT), 0, NULL, 0, NULL},
  253. {"smw", "%abdim %rt,[%ra],%re{,%enb4}", LSMW (LSMW) | __BIT (5), 4, ATTR_ALL, 0, NULL, 0, NULL},
  254. {"smwa", "%abdim %rt,[%ra],%re{,%enb4}", LSMW (LSMWA) | __BIT (5), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL},
  255. {"smwzb", "%abm %rt,[%ra],%re{,%enb4}", LSMW (LSMWZB) | __BIT (5), 4, ATTR (STR_EXT), 0, NULL, 0, NULL},
  256. /* seg-HWGP. */
  257. {"lhi.gp", "=rt,[+%i18s1]", OP6 (HWGP), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL},
  258. {"lhsi.gp", "=rt,[+%i18s1]", OP6 (HWGP) | (2 << 17), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL},
  259. {"shi.gp", "%rt,[+%i18s1]", OP6 (HWGP) | (4 << 17), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL},
  260. {"lwi.gp", "=rt,[+%i17s2]", OP6 (HWGP) | (6 << 17), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL},
  261. {"swi.gp", "%rt,[+%i17s2]", OP6 (HWGP) | (7 << 17), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL},
  262. /* seg-SBGP. */
  263. {"sbi.gp", "%rt,[+%i19s]", OP6 (SBGP), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL},
  264. {"addi.gp", "=rt,%i19s", OP6 (SBGP) | __BIT (19), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL},
  265. /* seg-JI. */
  266. {"j", "%i24s1", OP6 (JI), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  267. {"jal", "%i24s1", OP6 (JI) | __BIT (24), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  268. /* seg-JREG. */
  269. {"jr", "%rb", JREG (JR), 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL},
  270. {"jral", "%rt,%rb", JREG (JRAL), 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL},
  271. {"jrnez", "%rb", JREG (JRNEZ), 4, ATTR (BRANCH) | ATTR_V3, 0, NULL, 0, NULL},
  272. {"jralnez", "%rt,%rb", JREG (JRALNEZ), 4, ATTR (BRANCH) | ATTR_V3, 0, NULL, 0, NULL},
  273. {"ret", "%rb", JREG (JR) | JREG_RET, 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL},
  274. {"ifret", "", JREG (JR) | JREG_IFC | JREG_RET, 4, ATTR (BRANCH) | ATTR (IFC_EXT), 0, NULL, 0, NULL},
  275. {"jral", "%rb", JREG (JRAL) | RT (30), 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL},
  276. {"jralnez", "%rb", JREG (JRALNEZ) | RT (30), 4, ATTR (BRANCH) | ATTR_V3, 0, NULL, 0, NULL},
  277. {"ret", "", JREG (JR) | JREG_RET | RB (30), 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL},
  278. {"jr", "%dtitoff %rb", JREG (JR), 4, ATTR (BRANCH) | ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  279. {"ret", "%dtitoff %rb", JREG (JR) | JREG_RET, 4, ATTR (BRANCH) | ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  280. {"jral", "%dtiton %rt,%rb", JREG (JRAL), 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL},
  281. {"jral", "%dtiton %rb", JREG (JRAL) | RT (30), 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL},
  282. /* seg-BR1. */
  283. {"beq", "%rt,%ra,%i14s1", OP6 (BR1), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  284. {"bne", "%rt,%ra,%i14s1", OP6 (BR1) | __BIT (14), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  285. /* seg-BR2. */
  286. #define BR2(sub) (OP6 (BR2) | (N32_BR2_ ## sub << 16))
  287. {"ifcall", "%i16s1", BR2 (IFCALL), 4, ATTR (IFC_EXT), 0, NULL, 0, NULL},
  288. {"beqz", "%rt,%i16s1", BR2 (BEQZ), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  289. {"bnez", "%rt,%i16s1", BR2 (BNEZ), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  290. {"bgez", "%rt,%i16s1", BR2 (BGEZ), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  291. {"bltz", "%rt,%i16s1", BR2 (BLTZ), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  292. {"bgtz", "%rt,%i16s1", BR2 (BGTZ), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  293. {"blez", "%rt,%i16s1", BR2 (BLEZ), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  294. {"bgezal", "%rt,%i16s1", BR2 (BGEZAL), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  295. {"bltzal", "%rt,%i16s1", BR2 (BLTZAL), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  296. /* seg-BR3. */
  297. {"beqc", "%rt,%i11br3,%i8s1", OP6 (BR3), 4, ATTR_PCREL | ATTR_V3MUP, 0, NULL, 0, NULL},
  298. {"bnec", "%rt,%i11br3,%i8s1", OP6 (BR3) | __BIT (19), 4, ATTR_PCREL | ATTR_V3MUP, 0, NULL, 0, NULL},
  299. /* seg-SIMD. */
  300. {"pbsad", "%rt,%ra,%rb", SIMD (PBSAD), 4, ATTR (PERF2_EXT), 0, NULL, 0, NULL},
  301. {"pbsada", "%rt,%ra,%rb", SIMD (PBSADA), 4, ATTR (PERF2_EXT), 0, NULL, 0, NULL},
  302. /* seg-ALU1. */
  303. {"add", "=rt,%ra,%rb", ALU1 (ADD), 4, ATTR_ALL, 0, NULL, 0, NULL},
  304. {"sub", "=rt,%ra,%rb", ALU1 (SUB), 4, ATTR_ALL, 0, NULL, 0, NULL},
  305. {"and", "=rt,%ra,%rb", ALU1 (AND), 4, ATTR_ALL, 0, NULL, 0, NULL},
  306. {"xor", "=rt,%ra,%rb", ALU1 (XOR), 4, ATTR_ALL, 0, NULL, 0, NULL},
  307. {"or", "=rt,%ra,%rb", ALU1 (OR), 4, ATTR_ALL, 0, NULL, 0, NULL},
  308. {"nor", "=rt,%ra,%rb", ALU1 (NOR), 4, ATTR_ALL, 0, NULL, 0, NULL},
  309. {"slt", "=rt,%ra,%rb", ALU1 (SLT), 4, ATTR_ALL, 0, NULL, 0, NULL},
  310. {"slts", "=rt,%ra,%rb", ALU1 (SLTS), 4, ATTR_ALL, 0, NULL, 0, NULL},
  311. {"slli", "=rt,%ra,%ib5u", ALU1 (SLLI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  312. {"srli", "=rt,%ra,%ib5u", ALU1 (SRLI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  313. {"srai", "=rt,%ra,%ib5u", ALU1 (SRAI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  314. {"rotri", "=rt,%ra,%ib5u", ALU1 (ROTRI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  315. {"sll", "=rt,%ra,%rb", ALU1 (SLL), 4, ATTR_ALL, 0, NULL, 0, NULL},
  316. {"srl", "=rt,%ra,%rb", ALU1 (SRL), 4, ATTR_ALL, 0, NULL, 0, NULL},
  317. {"sra", "=rt,%ra,%rb", ALU1 (SRA), 4, ATTR_ALL, 0, NULL, 0, NULL},
  318. {"rotr", "=rt,%ra,%rb", ALU1 (ROTR), 4, ATTR_ALL, 0, NULL, 0, NULL},
  319. {"seb", "=rt,%ra", ALU1 (SEB), 4, ATTR_ALL, 0, NULL, 0, NULL},
  320. {"seh", "=rt,%ra", ALU1 (SEH), 4, ATTR_ALL, 0, NULL, 0, NULL},
  321. {"bitc", "=rt,%ra,%rb", ALU1 (BITC), 4, ATTR_V3, 0, NULL, 0, NULL},
  322. {"zeh", "=rt,%ra", ALU1 (ZEH), 4, ATTR_ALL, 0, NULL, 0, NULL},
  323. {"wsbh", "=rt,%ra", ALU1 (WSBH), 4, ATTR_ALL, 0, NULL, 0, NULL},
  324. {"divsr", "=rt,=rd,%ra,%rb", ALU1 (DIVSR), 4, ATTR (DIV) | ATTR_V2UP, 0, NULL, 0, NULL},
  325. {"divr", "=rt,=rd,%ra,%rb", ALU1 (DIVR), 4, ATTR (DIV) | ATTR_V2UP, 0, NULL, 0, NULL},
  326. {"sva", "=rt,%ra,%rb", ALU1 (SVA), 4, ATTR_ALL, 0, NULL, 0, NULL},
  327. {"svs", "=rt,%ra,%rb", ALU1 (SVS), 4, ATTR_ALL, 0, NULL, 0, NULL},
  328. {"cmovz", "=rt,%ra,%rb", ALU1 (CMOVZ), 4, ATTR_ALL, 0, NULL, 0, NULL},
  329. {"cmovn", "=rt,%ra,%rb", ALU1 (CMOVN), 4, ATTR_ALL, 0, NULL, 0, NULL},
  330. {"or_srli", "=rt,%ra,%rb,%sh", ALU1 (OR_SRLI), 4, ATTR_V3, 0, NULL, 0, NULL},
  331. {"add_srli", "=rt,%ra,%rb,%sh", ALU1 (ADD_SRLI), 4, ATTR_V3, 0, NULL, 0, NULL},
  332. {"sub_srli", "=rt,%ra,%rb,%sh", ALU1 (SUB_SRLI), 4, ATTR_V3, 0, NULL, 0, NULL},
  333. {"and_srli", "=rt,%ra,%rb,%sh", ALU1 (AND_SRLI), 4, ATTR_V3, 0, NULL, 0, NULL},
  334. {"xor_srli", "=rt,%ra,%rb,%sh", ALU1 (XOR_SRLI), 4, ATTR_V3, 0, NULL, 0, NULL},
  335. {"add_slli", "=rt,%ra,%rb,%sh", ALU1 (ADD), 4, ATTR_V3, 0, NULL, 0, NULL},
  336. {"sub_slli", "=rt,%ra,%rb,%sh", ALU1 (SUB), 4, ATTR_V3, 0, NULL, 0, NULL},
  337. {"and_slli", "=rt,%ra,%rb,%sh", ALU1 (AND), 4, ATTR_V3, 0, NULL, 0, NULL},
  338. {"xor_slli", "=rt,%ra,%rb,%sh", ALU1 (XOR), 4, ATTR_V3, 0, NULL, 0, NULL},
  339. {"or_slli", "=rt,%ra,%rb,%sh", ALU1 (OR), 4, ATTR_V3, 0, NULL, 0, NULL},
  340. {"nop", "", ALU1 (SRLI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  341. /* seg-ALU2. */
  342. {"max", "=rt,%ra,%rb", ALU2 (MAX), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL},
  343. {"min", "=rt,%ra,%rb", ALU2 (MIN), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL},
  344. {"ave", "=rt,%ra,%rb", ALU2 (AVE), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL},
  345. {"abs", "=rt,%ra", ALU2 (ABS), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL},
  346. {"clips", "=rt,%ra,%ib5u", ALU2 (CLIPS), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL},
  347. {"clip", "=rt,%ra,%ib5u", ALU2 (CLIP), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL},
  348. {"clo", "=rt,%ra", ALU2 (CLO), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL},
  349. {"clz", "=rt,%ra", ALU2 (CLZ), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL},
  350. {"bset", "=rt,%ra,%ib5u", ALU2 (BSET), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL},
  351. {"bclr", "=rt,%ra,%ib5u", ALU2 (BCLR), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL},
  352. {"btgl", "=rt,%ra,%ib5u", ALU2 (BTGL), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL},
  353. {"btst", "=rt,%ra,%ib5u", ALU2 (BTST), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL},
  354. {"bse", "=rt,%ra,=rb", ALU2 (BSE), 4, ATTR (PERF2_EXT), 0, NULL, 0, NULL},
  355. {"bsp", "=rt,%ra,=rb", ALU2 (BSP), 4, ATTR (PERF2_EXT), 0, NULL, 0, NULL},
  356. {"ffzmism", "=rt,%ra,%rb", ALU2 (FFZMISM), 4, ATTR (STR_EXT), 0, NULL, 0, NULL},
  357. {"mfusr", "=rt,%usr", ALU2 (MFUSR), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  358. {"mtusr", "%rt,%usr", ALU2 (MTUSR), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  359. {"mfusr", "=rt,%ridx", ALU2 (MFUSR), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  360. {"mtusr", "%rt,%ridx", ALU2 (MTUSR), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  361. {"mul", "=rt,%ra,%rb", ALU2 (MUL), 4, ATTR_ALL, 0, NULL, 0, NULL},
  362. {"madds64", "=dt,%ra,%rb", ALU2 (MADDS64), 4, ATTR (MAC) | ATTR_ALL, 0, NULL, 0, NULL},
  363. {"madd64", "=dt,%ra,%rb", ALU2 (MADD64), 4, ATTR (MAC) | ATTR_ALL, 0, NULL, 0, NULL},
  364. {"msubs64", "=dt,%ra,%rb", ALU2 (MSUBS64), 4, ATTR (MAC) | ATTR_ALL, 0, NULL, 0, NULL},
  365. {"msub64", "=dt,%ra,%rb", ALU2 (MSUB64), 4, ATTR (MAC) | ATTR_ALL, 0, NULL, 0, NULL},
  366. {"divs", "=dt,%ra,%rb", ALU2 (DIVS), 4, ATTR (DIV) | ATTR (DXREG), 0, NULL, 0, NULL},
  367. {"div", "=dt,%ra,%rb", ALU2 (DIV), 4, ATTR (DIV) | ATTR (DXREG), 0, NULL, 0, NULL},
  368. {"mult32", "=dt,%ra,%rb", ALU2 (MULT32), 4, ATTR (DXREG) | ATTR_ALL, 0, NULL, 0, NULL},
  369. /* seg-ALU2_FFBI. */
  370. {"ffb", "=rt,%ra,%rb", ALU2 (FFB), 4, ATTR (STR_EXT), 0, NULL, 0, NULL},
  371. {"ffbi", "=rt,%ra,%ib8u", ALU2 (FFBI) | __BIT (6), 4, ATTR (STR_EXT), 0, NULL, 0, NULL},
  372. /* seg-ALU2_FLMISM. */
  373. {"ffmism", "=rt,%ra,%rb", ALU2 (FFMISM), 4, ATTR (STR_EXT), 0, NULL, 0, NULL},
  374. {"flmism", "=rt,%ra,%rb", ALU2 (FLMISM) | __BIT (6), 4, ATTR (STR_EXT), 0, NULL, 0, NULL},
  375. /* seg-ALU2_MULSR64. */
  376. {"mults64", "=dt,%ra,%rb", ALU2 (MULTS64), 4, ATTR_ALL, 0, NULL, 0, NULL},
  377. {"mulsr64", "=rt,%ra,%rb", ALU2 (MULSR64)| __BIT (6), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL},
  378. /* seg-ALU2_MULR64. */
  379. {"mult64", "=dt,%ra,%rb", ALU2 (MULT64), 4, ATTR_ALL, 0, NULL, 0, NULL},
  380. {"mulr64", "=rt,%ra,%rb", ALU2 (MULR64) | __BIT (6), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL},
  381. /* seg-ALU2_MADDR32. */
  382. {"madd32", "=dt,%ra,%rb", ALU2 (MADD32), 4, ATTR (MAC) | ATTR (DXREG) | ATTR_ALL, 0, NULL, 0, NULL},
  383. {"maddr32", "=rt,%ra,%rb", ALU2 (MADDR32) | __BIT (6), 4, ATTR (MAC) | ATTR_V2UP, 0, NULL, 0, NULL},
  384. /* seg-ALU2_MSUBR32. */
  385. {"msub32", "=dt,%ra,%rb", ALU2 (MSUB32), 4, ATTR (MAC) | ATTR (DXREG) | ATTR_ALL, 0, NULL, 0, NULL},
  386. {"msubr32", "=rt,%ra,%rb", ALU2 (MSUBR32) | __BIT (6), 4, ATTR (MAC) | ATTR_V2UP, 0, NULL, 0, NULL},
  387. /* seg-MISC. */
  388. {"standby", "%stdby_st", MISC (STANDBY), 4, ATTR_ALL, 0, NULL, 0, NULL},
  389. {"mfsr", "=rt,%sr", MISC (MFSR), 4, ATTR_ALL, 0, NULL, 0, NULL},
  390. {"iret", "", MISC (IRET), 4, ATTR_ALL, 0, NULL, 0, NULL},
  391. {"trap", "%swid", MISC (TRAP), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  392. {"teqz", "%rt{,%swid}", MISC (TEQZ), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  393. {"tnez", "%rt{,%swid}", MISC (TNEZ), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  394. {"dsb", "", MISC (DSB), 4, ATTR_ALL, 0, NULL, 0, NULL},
  395. {"isb", "", MISC (ISB), 4, ATTR_ALL, 0, NULL, 0, NULL},
  396. {"break", "%swid", MISC (BREAK), 4, ATTR_ALL, 0, NULL, 0, NULL},
  397. {"syscall", "%swid", MISC (SYSCALL), 4, ATTR_ALL, 0, NULL, 0, NULL},
  398. {"msync", "%msync_st", MISC (MSYNC), 4, ATTR_ALL, 0, NULL, 0, NULL},
  399. {"isync", "%rt", MISC (ISYNC), 4, ATTR_ALL, 0, NULL, 0, NULL},
  400. /* seg-MISC_MTSR. */
  401. {"mtsr", "%rt,%sr", MISC (MTSR), 4, ATTR_ALL, 0, NULL, 0, NULL},
  402. /* seg-MISC_SETEND. */
  403. {"setend.l", "", MISC (MTSR) | (SRIDX (1, 0, 0) << 10) | __BIT (5), 4, ATTR_ALL, 0, NULL, 0, NULL},
  404. {"setend.b", "", MISC (MTSR) | (SRIDX (1, 0, 0) << 10) | __BIT (5) | __BIT (20), 4, ATTR_ALL, 0, NULL, 0, NULL},
  405. /* seg-MISC_SETGIE. */
  406. {"setgie.d", "", MISC (MTSR) | (SRIDX (1, 0, 0) << 10) | __BIT (6), 4, ATTR_ALL, 0, NULL, 0, NULL},
  407. {"setgie.e", "", MISC (MTSR) | (SRIDX (1, 0, 0) << 10) | __BIT (6) | __BIT (20), 4, ATTR_ALL, 0, NULL, 0, NULL},
  408. {"mfsr", "=rt,%ridx", MISC (MFSR), 4, ATTR_ALL, 0, NULL, 0, NULL},
  409. {"mtsr", "%rt,%ridx", MISC (MTSR), 4, ATTR_ALL, 0, NULL, 0, NULL},
  410. {"trap", "", MISC (TRAP), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  411. {"break", "", MISC (BREAK), 4, ATTR_ALL, 0, NULL, 0, NULL},
  412. {"msync", "", MISC (MSYNC), 4, ATTR_ALL, 0, NULL, 0, NULL},
  413. /* seg-MISC_TLBOP. */
  414. {"tlbop", "%ra,%tlbop_st", MISC (TLBOP), 4, ATTR_ALL, 0, NULL, 0, NULL},
  415. {"tlbop", "%ra,%tlbop_stx", MISC (TLBOP), 4, ATTR_ALL, 0, NULL, 0, NULL},
  416. {"tlbop", "%rt,%ra,pb", MISC (TLBOP) | (5 << 5), 4, ATTR_ALL, 0, NULL, 0, NULL},
  417. {"tlbop", "flua", MISC (TLBOP) | (7 << 5), 4, ATTR_ALL, 0, NULL, 0, NULL},
  418. {"tlbop", "flushall", MISC (TLBOP) | (7 << 5), 4, ATTR_ALL, 0, NULL, 0, NULL},
  419. /* seg-MEM. */
  420. {"lb", "=rt,[%ra+(%rb<<%sv)]", MEM (LB), 4, ATTR_ALL, 0, NULL, 0, NULL},
  421. {"lb", "=rt,[%ra+%rb{<<%sv}]", MEM (LB), 4, ATTR_ALL, 0, NULL, 0, NULL},
  422. {"lh", "=rt,[%ra+(%rb<<%sv)]", MEM (LH), 4, ATTR_ALL, 0, NULL, 0, NULL},
  423. {"lh", "=rt,[%ra+%rb{<<%sv}]", MEM (LH), 4, ATTR_ALL, 0, NULL, 0, NULL},
  424. {"lw", "=rt,[%ra+(%rb<<%sv)]", MEM (LW), 4, ATTR_ALL, 0, NULL, 0, NULL},
  425. {"lw", "=rt,[%ra+%rb{<<%sv}]", MEM (LW), 4, ATTR_ALL, 0, NULL, 0, NULL},
  426. {"ld", "=rt,[%ra+(%rb<<%sv)]", MEM (LD), 4, ATTR_ALL, 0, NULL, 0, NULL},
  427. {"lb.bi", "=rt,[%ra],%rb{<<%sv}", MEM (LB_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  428. {"lb.bi", "=rt,[%ra],(%rb<<%sv)", MEM (LB_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  429. {"lb.p", "=rt,[%ra],%rb{<<%sv}", MEM (LB_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  430. {"lh.bi", "=rt,[%ra],%rb{<<%sv}", MEM (LH_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  431. {"lh.bi", "=rt,[%ra],(%rb<<%sv)", MEM (LH_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  432. {"lh.p", "=rt,[%ra],%rb{<<%sv}", MEM (LH_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  433. {"lw.bi", "=rt,[%ra],%rb{<<%sv}", MEM (LW_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  434. {"lw.bi", "=rt,[%ra],(%rb<<%sv)", MEM (LW_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  435. {"lw.p", "=rt,[%ra],%rb{<<%sv}", MEM (LW_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  436. {"ld.bi", "=rt,[%ra],(%rb<<%sv)", MEM (LD_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  437. {"sb", "=rt,[%ra+(%rb<<%sv)]", MEM (SB), 4, ATTR_ALL, 0, NULL, 0, NULL},
  438. {"sb", "%rt,[%ra+%rb{<<%sv}]", MEM (SB), 4, ATTR_ALL, 0, NULL, 0, NULL},
  439. {"sh", "=rt,[%ra+(%rb<<%sv)]", MEM (SH), 4, ATTR_ALL, 0, NULL, 0, NULL},
  440. {"sh", "%rt,[%ra+%rb{<<%sv}]", MEM (SH), 4, ATTR_ALL, 0, NULL, 0, NULL},
  441. {"sw", "=rt,[%ra+(%rb<<%sv)]", MEM (SW), 4, ATTR_ALL, 0, NULL, 0, NULL},
  442. {"sw", "%rt,[%ra+%rb{<<%sv}]", MEM (SW), 4, ATTR_ALL, 0, NULL, 0, NULL},
  443. {"sd", "=rt,[%ra+(%rb<<%sv)]", MEM (SD), 4, ATTR_ALL, 0, NULL, 0, NULL},
  444. {"sb.bi", "%rt,[%ra],%rb{<<%sv}", MEM (SB_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  445. {"sb.bi", "=rt,[%ra],(%rb<<%sv)", MEM (SB_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  446. {"sb.p", "%rt,[%ra],%rb{<<%sv}", MEM (SB_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  447. {"sh.bi", "%rt,[%ra],%rb{<<%sv}", MEM (SH_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  448. {"sh.bi", "=rt,[%ra],(%rb<<%sv)", MEM (SH_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  449. {"sh.p", "%rt,[%ra],%rb{<<%sv}", MEM (SH_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  450. {"sw.bi", "%rt,[%ra],%rb{<<%sv}", MEM (SW_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  451. {"sw.bi", "=rt,[%ra],(%rb<<%sv)", MEM (SW_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  452. {"sw.p", "%rt,[%ra],%rb{<<%sv}", MEM (SW_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  453. {"sd.bi", "=rt,[%ra],(%rb<<%sv)", MEM (SD_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  454. {"lbs", "=rt,[%ra+(%rb<<%sv)]", MEM (LBS), 4, ATTR_ALL, 0, NULL, 0, NULL},
  455. {"lbs", "=rt,[%ra+%rb{<<%sv}]", MEM (LBS), 4, ATTR_ALL, 0, NULL, 0, NULL},
  456. {"lhs", "=rt,[%ra+(%rb<<%sv)]", MEM (LHS), 4, ATTR_ALL, 0, NULL, 0, NULL},
  457. {"lhs", "=rt,[%ra+%rb{<<%sv}]", MEM (LHS), 4, ATTR_ALL, 0, NULL, 0, NULL},
  458. {"lbs.bi", "=rt,[%ra],%rb{<<%sv}", MEM (LBS_BI),4, ATTR_ALL, 0, NULL, 0, NULL},
  459. {"lbs.bi", "=rt,[%ra],(%rb<<%sv)", MEM (LBS_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  460. {"lbs.p", "=rt,[%ra],%rb{<<%sv}", MEM (LBS_BI),4, ATTR_ALL, 0, NULL, 0, NULL},
  461. {"lhs.bi", "=rt,[%ra],%rb{<<%sv}", MEM (LHS_BI),4, ATTR_ALL, 0, NULL, 0, NULL},
  462. {"lhs.bi", "=rt,[%ra],(%rb<<%sv)", MEM (LHS_BI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  463. {"lhs.p", "=rt,[%ra],%rb{<<%sv}", MEM (LHS_BI),4, ATTR_ALL, 0, NULL, 0, NULL},
  464. {"llw", "=rt,[%ra+(%rb<<%sv)]", MEM (LLW), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  465. {"llw", "=rt,[%ra+%rb{<<%sv}]", MEM (LLW), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  466. {"scw", "%rt,[%ra+(%rb<<%sv)]", MEM (SCW), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  467. {"scw", "%rt,[%ra+%rb{<<%sv}]", MEM (SCW), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  468. {"lbup", "=rt,[%ra+(%rb<<%sv)]", MEM (LBUP), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL},
  469. {"lbup", "=rt,[%ra+%rb{<<%sv}]", MEM (LBUP), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL},
  470. {"lwup", "=rt,[%ra+(%rb<<%sv)]", MEM (LWUP), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  471. {"lwup", "=rt,[%ra+%rb{<<%sv}]", MEM (LWUP), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  472. {"sbup", "%rt,[%ra+(%rb<<%sv)]", MEM (SBUP), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL},
  473. {"sbup", "%rt,[%ra+%rb{<<%sv}]", MEM (SBUP), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL},
  474. {"swup", "%rt,[%ra+(%rb<<%sv)]", MEM (SWUP), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  475. {"swup", "%rt,[%ra+%rb{<<%sv}]", MEM (SWUP), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  476. {"dpref", "%dpref_st,[%ra]", OP6 (DPREFI), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  477. {"dpref", "%dpref_st,[%ra+(%rb<<%sv)]", MEM (DPREF), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  478. {"dpref", "%dpref_st,[%ra+%rb{<<%sv}]", MEM (DPREF), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  479. /* For missing-operand-load/store instructions. */
  480. {"lb", "=rt,[%ra]", OP6 (LBI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  481. {"lh", "=rt,[%ra]", OP6 (LHI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  482. {"lw", "=rt,[%ra]", OP6 (LWI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  483. {"lbs", "=rt,[%ra]", OP6 (LBSI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  484. {"lhs", "=rt,[%ra]", OP6 (LHSI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  485. {"sb", "%rt,[%ra]", OP6 (SBI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  486. {"sh", "%rt,[%ra]", OP6 (SHI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  487. {"sw", "%rt,[%ra]", OP6 (SWI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  488. /* seg-LWC0. */
  489. {"flsi", "=fst,[%ra{+%i12s2}]", OP6 (LWC), 4, ATTR (FPU), 0, NULL, 0, NULL},
  490. {"flsi.bi", "=fst,[%ra],%i12s2", FPU_RA_IMMBI (LWC), 4, ATTR (FPU), 0, NULL, 0, NULL},
  491. /* seg-SWC0. */
  492. {"fssi", "=fst,[%ra{+%i12s2}]", OP6 (SWC), 4, ATTR (FPU), 0, NULL, 0, NULL},
  493. {"fssi.bi", "=fst,[%ra],%i12s2", FPU_RA_IMMBI (SWC), 4, ATTR (FPU), 0, NULL, 0, NULL},
  494. /* seg-LDC0. */
  495. {"fldi", "=fdt,[%ra{+%i12s2}]", OP6 (LDC), 4, ATTR (FPU), 0, NULL, 0, NULL},
  496. {"fldi.bi", "=fdt,[%ra],%i12s2", FPU_RA_IMMBI (LDC), 4, ATTR (FPU), 0, NULL, 0, NULL},
  497. /* seg-SDC0. */
  498. {"fsdi", "=fdt,[%ra{+%i12s2}]", OP6 (SDC), 4, ATTR (FPU), 0, NULL, 0, NULL},
  499. {"fsdi.bi", "=fdt,[%ra],%i12s2", FPU_RA_IMMBI (SDC), 4, ATTR (FPU), 0, NULL, 0, NULL},
  500. /* seg-FPU_FS1. */
  501. {"fadds", "=fst,%fsa,%fsb", FS1 (FADDS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  502. {"fsubs", "=fst,%fsa,%fsb", FS1 (FSUBS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  503. {"fcpynss", "=fst,%fsa,%fsb", FS1 (FCPYNSS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  504. {"fcpyss", "=fst,%fsa,%fsb", FS1 (FCPYSS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  505. {"fmadds", "=fst,%fsa,%fsb", FS1 (FMADDS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  506. {"fmsubs", "=fst,%fsa,%fsb", FS1 (FMSUBS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  507. {"fcmovns", "=fst,%fsa,%fsb", FS1 (FCMOVNS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  508. {"fcmovzs", "=fst,%fsa,%fsb", FS1 (FCMOVZS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  509. {"fnmadds", "=fst,%fsa,%fsb", FS1 (FNMADDS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  510. {"fnmsubs", "=fst,%fsa,%fsb", FS1 (FNMSUBS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  511. {"fmuls", "=fst,%fsa,%fsb", FS1 (FMULS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  512. {"fdivs", "=fst,%fsa,%fsb", FS1 (FDIVS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  513. /* seg-FPU_FS1_F2OP. */
  514. {"fs2d", "=fdt,%fsa", FS1_F2OP (FS2D), 4, ATTR (FPU) | ATTR (FPU_SP_EXT) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  515. {"fsqrts", "=fst,%fsa", FS1_F2OP (FSQRTS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  516. {"fabss", "=fst,%fsa", FS1_F2OP (FABSS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  517. {"fui2s", "=fst,%fsa", FS1_F2OP (FUI2S), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  518. {"fsi2s", "=fst,%fsa", FS1_F2OP (FSI2S), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  519. {"fs2ui", "=fst,%fsa", FS1_F2OP (FS2UI), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  520. {"fs2ui.z", "=fst,%fsa", FS1_F2OP (FS2UI_Z), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  521. {"fs2si", "=fst,%fsa", FS1_F2OP (FS2SI), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  522. {"fs2si.z", "=fst,%fsa", FS1_F2OP (FS2SI_Z), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  523. /* seg-FPU_FS2. */
  524. {"fcmpeqs", "=fst,%fsa,%fsb", FS2 (FCMPEQS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  525. {"fcmpeqs.e", "=fst,%fsa,%fsb", FS2 (FCMPEQS_E), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  526. {"fcmplts", "=fst,%fsa,%fsb", FS2 (FCMPLTS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  527. {"fcmplts.e", "=fst,%fsa,%fsb", FS2 (FCMPLTS_E), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  528. {"fcmples", "=fst,%fsa,%fsb", FS2 (FCMPLES), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  529. {"fcmples.e", "=fst,%fsa,%fsb", FS2 (FCMPLES_E), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  530. {"fcmpuns", "=fst,%fsa,%fsb", FS2 (FCMPUNS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  531. {"fcmpuns.e", "=fst,%fsa,%fsb", FS2 (FCMPUNS_E), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL},
  532. /* seg-FPU_FD1. */
  533. {"faddd", "=fdt,%fda,%fdb", FD1 (FADDD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  534. {"fsubd", "=fdt,%fda,%fdb", FD1 (FSUBD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  535. {"fcpynsd", "=fdt,%fda,%fdb", FD1 (FCPYNSD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  536. {"fcpysd", "=fdt,%fda,%fdb", FD1 (FCPYSD), 4, ATTR (FPU), 0, NULL, 0, NULL},
  537. {"fmaddd", "=fdt,%fda,%fdb", FD1 (FMADDD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  538. {"fmsubd", "=fdt,%fda,%fdb", FD1 (FMSUBD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  539. {"fcmovnd", "=fdt,%fda,%fsb", FD1 (FCMOVND), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  540. {"fcmovzd", "=fdt,%fda,%fsb", FD1 (FCMOVZD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  541. {"fnmaddd", "=fdt,%fda,%fdb", FD1 (FNMADDD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  542. {"fnmsubd", "=fdt,%fda,%fdb", FD1 (FNMSUBD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  543. {"fmuld", "=fdt,%fda,%fdb", FD1 (FMULD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  544. {"fdivd", "=fdt,%fda,%fdb", FD1 (FDIVD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  545. /* seg-FPU_FD1_F2OP. */
  546. {"fd2s", "=fst,%fda", FD1_F2OP (FD2S), 4, ATTR (FPU) | ATTR (FPU_SP_EXT) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  547. {"fsqrtd", "=fdt,%fda", FD1_F2OP (FSQRTD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  548. {"fabsd", "=fdt,%fda", FD1_F2OP (FABSD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  549. {"fui2d", "=fdt,%fsa", FD1_F2OP (FUI2D), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  550. {"fsi2d", "=fdt,%fsa", FD1_F2OP (FSI2D), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  551. {"fd2ui", "=fst,%fda", FD1_F2OP (FD2UI), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  552. {"fd2ui.z", "=fst,%fda", FD1_F2OP (FD2UI_Z), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  553. {"fd2si", "=fst,%fda", FD1_F2OP (FD2SI), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  554. {"fd2si.z", "=fst,%fda", FD1_F2OP (FD2SI_Z), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  555. /* seg-FPU_FD2. */
  556. {"fcmpeqd", "=fst,%fda,%fdb", FD2 (FCMPEQD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  557. {"fcmpeqd.e", "=fst,%fda,%fdb", FD2 (FCMPEQD_E), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  558. {"fcmpltd", "=fst,%fda,%fdb", FD2 (FCMPLTD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  559. {"fcmpltd.e", "=fst,%fda,%fdb", FD2 (FCMPLTD_E), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  560. {"fcmpled", "=fst,%fda,%fdb", FD2 (FCMPLED), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  561. {"fcmpled.e", "=fst,%fda,%fdb", FD2 (FCMPLED_E), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  562. {"fcmpund", "=fst,%fda,%fdb", FD2 (FCMPUND), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  563. {"fcmpund.e", "=fst,%fda,%fdb", FD2 (FCMPUND_E), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL},
  564. /* seg-FPU_MFCP. */
  565. {"fmfsr", "=rt,%fsa", MFCP (FMFSR), 4, ATTR (FPU), 0, NULL, 0, NULL},
  566. {"fmfdr", "=rt,%fda", MFCP (FMFDR), 4, ATTR (FPU), 0, NULL, 0, NULL},
  567. /* seg-FPU_MFCP_XR. */
  568. {"fmfcfg", "=rt", MFCP_XR(FMFCFG), 4, ATTR (FPU), 0, NULL, 0, NULL},
  569. {"fmfcsr", "=rt", MFCP_XR(FMFCSR), 4, ATTR (FPU), 0, NULL, 0, NULL},
  570. /* seg-FPU_MTCP. */
  571. {"fmtsr", "%rt,=fsa", MTCP (FMTSR), 4, ATTR (FPU), 0, NULL, 0, NULL},
  572. {"fmtdr", "%rt,=fda", MTCP (FMTDR), 4, ATTR (FPU), 0, NULL, 0, NULL},
  573. /* seg-FPU_MTCP_XR. */
  574. {"fmtcsr", "%rt", MTCP_XR(FMTCSR), 4, ATTR (FPU), 0, NULL, 0, NULL},
  575. /* seg-FPU_FLS. */
  576. {"fls", "=fst,[%ra+(%rb<<%sv)]", FPU_MEM(FLS), 4, ATTR (FPU), 0, NULL, 0, NULL},
  577. {"fls.bi", "=fst,[%ra],(%rb<<%sv)", FPU_MEMBI(FLS), 4, ATTR (FPU), 0, NULL, 0, NULL},
  578. /* seg-FPU_FLD. */
  579. {"fld", "=fdt,[%ra+(%rb<<%sv)]", FPU_MEM(FLD), 4, ATTR (FPU), 0, NULL, 0, NULL},
  580. {"fld.bi", "=fdt,[%ra],(%rb<<%sv)", FPU_MEMBI(FLD), 4, ATTR (FPU), 0, NULL, 0, NULL},
  581. /* seg-FPU_FSS. */
  582. {"fss", "=fst,[%ra+(%rb<<%sv)]", FPU_MEM(FSS), 4, ATTR (FPU), 0, NULL, 0, NULL},
  583. {"fss.bi", "=fst,[%ra],(%rb<<%sv)", FPU_MEMBI(FSS), 4, ATTR (FPU), 0, NULL, 0, NULL},
  584. /* seg-FPU_FSD. */
  585. {"fsd", "=fdt,[%ra+(%rb<<%sv)]", FPU_MEM(FSD), 4, ATTR (FPU), 0, NULL, 0, NULL},
  586. {"fsd.bi", "=fdt,[%ra],(%rb<<%sv)", FPU_MEMBI(FSD), 4, ATTR (FPU), 0, NULL, 0, NULL},
  587. {"fls", "=fst,[%ra+%rb{<<%sv}]", FPU_MEM(FLS), 4, ATTR (FPU), 0, NULL, 0, NULL},
  588. {"fls.bi", "=fst,[%ra],%rb{<<%sv}", FPU_MEMBI(FLS), 4, ATTR (FPU), 0, NULL, 0, NULL},
  589. {"fld", "=fdt,[%ra+%rb{<<%sv}]", FPU_MEM(FLD), 4, ATTR (FPU), 0, NULL, 0, NULL},
  590. {"fld.bi", "=fdt,[%ra],%rb{<<%sv}", FPU_MEMBI(FLD), 4, ATTR (FPU), 0, NULL, 0, NULL},
  591. {"fss", "=fst,[%ra+%rb{<<%sv}]", FPU_MEM(FSS), 4, ATTR (FPU), 0, NULL, 0, NULL},
  592. {"fss.bi", "=fst,[%ra],%rb{<<%sv}", FPU_MEMBI(FSS), 4, ATTR (FPU), 0, NULL, 0, NULL},
  593. {"fsd", "=fdt,[%ra+%rb{<<%sv}]", FPU_MEM(FSD), 4, ATTR (FPU), 0, NULL, 0, NULL},
  594. {"fsd.bi", "=fdt,[%ra],%rb{<<%sv}", FPU_MEMBI(FSD), 4, ATTR (FPU), 0, NULL, 0, NULL},
  595. {"cctl", "%ra,%cctl_st0", MISC (CCTL), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  596. {"cctl", "%ra,%cctl_st1{,%cctl_lv}", MISC (CCTL), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  597. {"cctl", "=rt,%ra,%cctl_st2", MISC (CCTL), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  598. {"cctl", "%rt,%ra,%cctl_st3", MISC (CCTL), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  599. {"cctl", "%cctl_st4", MISC (CCTL), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  600. {"cctl", "%cctl_st5{,%cctl_lv}", MISC (CCTL), 4, ATTR_V3, 0, NULL, 0, NULL},
  601. {"cctl", "=rt,%ra,%cctl_stx,%cctl_lv", MISC (CCTL), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL},
  602. /* seg-Alias instructions. */
  603. {"neg", "=rt,%ra", OP6 (SUBRI), 4, ATTR_ALL, 0, NULL, 0, NULL},
  604. {"zeb", "=rt,%ra", OP6 (ANDI) | 0xff, 4, ATTR_ALL, 0, NULL, 0, NULL},
  605. /* seg-COP. */
  606. {"cpe1", "%cp45,%cpi19", OP6 (COP) | 0x00, 4, ATTR_ALL, 0, NULL, 0, NULL},
  607. {"cpe2", "%cp45,%cpi19", OP6 (COP) | 0x04, 4, ATTR_ALL, 0, NULL, 0, NULL},
  608. {"cpe3", "%cp45,%cpi19", OP6 (COP) | 0x08, 4, ATTR_ALL, 0, NULL, 0, NULL},
  609. {"cpe4", "%cp45,%cpi19", OP6 (COP) | 0x0C, 4, ATTR_ALL, 0, NULL, 0, NULL},
  610. /* seg-COP-MFCPX. */
  611. {"mfcpw", "%cp45,=rt,%i12u", OP6 (COP) | 0x01, 4, ATTR_ALL, 0, NULL, 0, NULL},
  612. {"mfcpd", "%cp45,=rt,%i12u", OP6 (COP) | 0x41, 4, ATTR_ALL, 0, NULL, 0, NULL},
  613. {"mfcppw", "%cp45,=rt,%i12u", OP6 (COP) | 0xc1, 4, ATTR_ALL, 0, NULL, 0, NULL},
  614. /* seg-COP-CPLW. */
  615. {"cplw", "%cp45,%cprt,[%ra+%rb<<%sv]", OP6 (COP) | 0x02, 4, ATTR_ALL, 0, NULL, 0, NULL},
  616. {"cplw.bi", "%cp45,%cprt,[%ra],%rb<<%sv", OP6 (COP) | 0x82, 4, ATTR_ALL, 0, NULL, 0, NULL},
  617. /* seg-COP-CPLD. */
  618. {"cpld", "%cp45,%cprt,[%ra+%rb<<%sv]", OP6 (COP) | 0x03, 4, ATTR_ALL, 0, NULL, 0, NULL},
  619. {"cpld.bi", "%cp45,%cprt,[%ra],%rb<<%sv", OP6 (COP) | 0x83, 4, ATTR_ALL, 0, NULL, 0, NULL},
  620. /* seg-COP-MTCPX. */
  621. {"mtcpw", "%cp45,%rt,%i12u", OP6 (COP) | 0x09, 4, ATTR_ALL, 0, NULL, 0, NULL},
  622. {"mtcpd", "%cp45,%rt,%i12u", OP6 (COP) | 0x49, 4, ATTR_ALL, 0, NULL, 0, NULL},
  623. {"mtcppw", "%cp45,%rt,%i12u", OP6 (COP) | 0xc9, 4, ATTR_ALL, 0, NULL, 0, NULL},
  624. /* seg-COP-CPSW. */
  625. {"cpsw", "%cp45,%cprt,[%ra+%rb<<%sv]", OP6 (COP) | 0x0a, 4, ATTR_ALL, 0, NULL, 0, NULL},
  626. {"cpsw.bi", "%cp45,%cprt,[%ra],%rb<<%sv", OP6 (COP) | 0x8a, 4, ATTR_ALL, 0, NULL, 0, NULL},
  627. /* seg-COP-CPSD. */
  628. {"cpsd", "%cp45,%cprt,[%ra+%rb<<%sv]", OP6 (COP) | 0x0b, 4, ATTR_ALL, 0, NULL, 0, NULL},
  629. {"cpsd.bi", "%cp45,%cprt,[%ra],%rb<<%sv", OP6 (COP) | 0x8b, 4, ATTR_ALL, 0, NULL, 0, NULL},
  630. /* 16-bit instructions. */
  631. /* get bit14~bit11 of 16-bit instruction. */
  632. {"beqz38", "%rt38,%i8s1", 0xc000, 2, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  633. {"bnez38", "%rt38,%i8s1", 0xc800, 2, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  634. {"beqs38", "%rt38,%i8s1", 0xd000, 2, ATTR_PCREL | ATTR_ALL, USE_REG (5), NULL, 0, NULL},
  635. {"bnes38", "%rt38,%i8s1", 0xd800, 2, ATTR_PCREL | ATTR_ALL, USE_REG (5), NULL, 0, NULL},
  636. /* SEG00, get bit10. */
  637. {"mov55", "=rt5,%ra5", 0x8000, 2, ATTR_ALL, 0, NULL, 0, NULL},
  638. {"movi55", "=rt5,%i5s", 0x8400, 2, ATTR_ALL, 0, NULL, 0, NULL},
  639. /* SEG01 bit10~bit9. */
  640. {"add45", "=rt4,%ra5", 0x8800, 2, ATTR_ALL, 0, NULL, 0, NULL},
  641. {"sub45", "=rt4,%ra5", 0x8a00, 2, ATTR_ALL, 0, NULL, 0, NULL},
  642. {"addi45", "=rt4,%i5u", 0x8c00, 2, ATTR_ALL, 0, NULL, 0, NULL},
  643. {"subi45", "=rt4,%i5u", 0x8e00, 2, ATTR_ALL, 0, NULL, 0, NULL},
  644. /* SEG02 bit10~bit9. */
  645. {"srai45", "=rt4,%i5u", 0x9000, 2, ATTR_ALL, 0, NULL, 0, NULL},
  646. {"srli45", "=rt4,%i5u", 0x9200, 2, ATTR_ALL, 0, NULL, 0, NULL},
  647. {"slli333", "=rt3,%ra3,%i3u", 0x9400, 2, ATTR_ALL, 0, NULL, 0, NULL},
  648. /* SEG03 bit10~bit9. */
  649. {"add333", "=rt3,%ra3,%rb3", 0x9800, 2, ATTR_ALL, 0, NULL, 0, NULL},
  650. {"sub333", "=rt3,%ra3,%rb3", 0x9a00, 2, ATTR_ALL, 0, NULL, 0, NULL},
  651. {"addi333", "=rt3,%ra3,%i3u", 0x9c00, 2, ATTR_ALL, 0, NULL, 0, NULL},
  652. {"subi333", "=rt3,%ra3,%i3u", 0x9e00, 2, ATTR_ALL, 0, NULL, 0, NULL},
  653. /* SEG04 bit10~bit9. */
  654. {"lwi333", "=rt3,[%ra3{+%i3u2}]", 0xa000, 2, ATTR_ALL, 0, NULL, 0, NULL},
  655. {"lwi333.bi", "=rt3,[%ra3],%i3u2", 0xa200, 2, ATTR_ALL, 0, NULL, 0, NULL},
  656. {"lhi333", "=rt3,[%ra3{+%i3u1}]", 0xa400, 2, ATTR_ALL, 0, NULL, 0, NULL},
  657. {"lbi333", "=rt3,[%ra3{+%i3u}]", 0xa600, 2, ATTR_ALL, 0, NULL, 0, NULL},
  658. /* SEG05 bit10~bit9. */
  659. {"swi333", "%rt3,[%ra3{+%i3u2}]", 0xa800, 2, ATTR_ALL, 0, NULL, 0, NULL},
  660. {"swi333.bi", "%rt3,[%ra3],%i3u2", 0xaa00, 2, ATTR_ALL, 0, NULL, 0, NULL},
  661. {"shi333", "%rt3,[%ra3{+%i3u1}]", 0xac00, 2, ATTR_ALL, 0, NULL, 0, NULL},
  662. {"sbi333", "%rt3,[%ra3{+%i3u}]", 0xae00, 2, ATTR_ALL, 0, NULL, 0, NULL},
  663. /* SEG06 bit10~bit9. */
  664. {"addri36.sp", "%rt3,%i6u2", 0xb000, 2, ATTR_V3MUP, USE_REG (31), NULL, 0, NULL},
  665. {"lwi45.fe", "=rt4,%fe5", 0xb200, 2, ATTR_V3MUP, USE_REG (8), NULL, 0, NULL},
  666. {"lwi450", "=rt4,[%ra5]", 0xb400, 2, ATTR_ALL, 0, NULL, 0, NULL},
  667. {"swi450", "%rt4,[%ra5]", 0xb600, 2, ATTR_ALL, 0, NULL, 0, NULL},
  668. /* SEG07 bit7. */
  669. {"lwi37", "=rt38,[$fp{+%i7u2}]", 0xb800, 2, ATTR_ALL, USE_REG (28), NULL, 0, NULL},
  670. {"swi37", "%rt38,[$fp{+%i7u2}]", 0xb880, 2, ATTR_ALL, USE_REG (28), NULL, 0, NULL},
  671. /* SEG10_1 if Rt3=5. */
  672. {"j8", "%i8s1", 0xd500, 2, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL},
  673. /* SEG11_2 bit7~bit5. */
  674. {"jr5", "%ra5", 0xdd00, 2, ATTR_ALL, 0, NULL, 0, NULL},
  675. {"jral5", "%ra5", 0xdd20, 2, ATTR_ALL, 0, NULL, 0, NULL},
  676. {"ex9.it", "%i5u", 0xdd40, 2, ATTR (EX9_EXT), 0, NULL, 0, NULL},
  677. {"ret5", "%ra5", 0xdd80, 2, ATTR_ALL, 0, NULL, 0, NULL},
  678. {"add5.pc", "%ra5", 0xdda0, 2, ATTR_V3, 0, NULL, 0, NULL},
  679. /* SEG11_3 if Ra5=30. */
  680. {"ret5", "", 0xdd80 | RA5 (30), 2, ATTR_ALL, 0, NULL, 0, NULL},
  681. /* SEG12 bit10~bit9. */
  682. {"slts45", "%rt4,%ra5", 0xe000, 2, ATTR_ALL, DEF_REG (15), NULL, 0, NULL},
  683. {"slt45", "%rt4,%ra5", 0xe200, 2, ATTR_ALL, DEF_REG (15), NULL, 0, NULL},
  684. {"sltsi45", "%rt4,%i5u", 0xe400, 2, ATTR_ALL, DEF_REG (15), NULL, 0, NULL},
  685. {"slti45", "%rt4,%i5u", 0xe600, 2, ATTR_ALL, DEF_REG (15), NULL, 0, NULL},
  686. /* SEG13 bit10~bit9. */
  687. {"break16", "%i5u", 0xea00, 2, ATTR_ALL, 0, NULL, 0, NULL},
  688. {"addi10.sp", "%i10s", 0xec00, 2, ATTR_V2UP, USE_REG (31) | DEF_REG (31), NULL, 0, NULL},
  689. {"addi10.sp", "%i10s", 0xec00, 2, ATTR_V2UP, USE_REG (31) | DEF_REG (31), NULL, 0, NULL},
  690. /* SEG13_1 bit8. */
  691. {"beqzs8", "%i8s1", 0xe800, 2, ATTR_PCREL | ATTR_ALL, USE_REG (15), NULL, 0, NULL},
  692. {"bnezs8", "%i8s1", 0xe900, 2, ATTR_PCREL | ATTR_ALL, USE_REG (15), NULL, 0, NULL},
  693. /* SEG13_2 bit8~bit5. */
  694. {"ex9.it", "%i9u", 0xea00, 2, ATTR (EX9_EXT), 0, NULL, 0, NULL},
  695. /* SEG14 bit7. */
  696. {"lwi37.sp", "=rt38,[+%i7u2]", 0xf000, 2, ATTR_V2UP, USE_REG (31), NULL, 0, NULL},
  697. {"swi37.sp", "%rt38,[+%i7u2]", 0xf080, 2, ATTR_V2UP, USE_REG (31), NULL, 0, NULL},
  698. /* SEG15 bit10~bit9. */
  699. {"ifcall9", "%i9u1", 0xf800, 2, ATTR (IFC_EXT), 0, NULL, 0, NULL},
  700. {"movpi45", "=rt4,%pi5", 0xfa00, 2, ATTR_V3MUP, 0, NULL, 0, NULL},
  701. /* SEG15_1 bit8. */
  702. {"movd44", "=rt5e,%ra5e", 0xfd00, 2, ATTR_V3MUP, 0, NULL, 0, NULL},
  703. /* SEG-BFMI333 bit2~bit0. */
  704. {"zeb33", "=rt3,%ra3", 0x9600, 2, ATTR_ALL, 0, NULL, 0, NULL},
  705. {"zeh33", "=rt3,%ra3", 0x9601, 2, ATTR_ALL, 0, NULL, 0, NULL},
  706. {"seb33", "=rt3,%ra3", 0x9602, 2, ATTR_ALL, 0, NULL, 0, NULL},
  707. {"seh33", "=rt3,%ra3", 0x9603, 2, ATTR_ALL, 0, NULL, 0, NULL},
  708. {"xlsb33", "=rt3,%ra3", 0x9604, 2, ATTR_ALL, 0, NULL, 0, NULL},
  709. {"x11b33", "=rt3,%ra3", 0x9605, 2, ATTR_ALL, 0, NULL, 0, NULL},
  710. {"bmski33", "=rt3,%ia3u", 0x9606, 2, ATTR_V3MUP, 0, NULL, 0, NULL},
  711. {"fexti33", "=rt3,%ia3u", 0x9607, 2, ATTR_V3MUP, 0, NULL, 0, NULL},
  712. /* SEG-PUSHPOP25 bit8~bit7. */
  713. {"push25", "%re2,%i5u3", 0xfc00, 2, ATTR_V3MUP, USE_REG (31) | DEF_REG (31), NULL, 0, NULL},
  714. {"pop25", "%re2,%i5u3", 0xfc80, 2, ATTR_V3MUP, USE_REG (31) | DEF_REG (31), NULL, 0, NULL},
  715. /* SEG-MISC33 bit2~bit0. */
  716. {"neg33", "=rt3,%ra3", 0xfe02, 2, ATTR_V3MUP, 0, NULL, 0, NULL},
  717. {"not33", "=rt3,%ra3", 0xfe03, 2, ATTR_V3MUP, 0, NULL, 0, NULL},
  718. {"mul33", "=rt3,%ra3", 0xfe04, 2, ATTR_V3MUP, 0, NULL, 0, NULL},
  719. {"xor33", "=rt3,%ra3", 0xfe05, 2, ATTR_V3MUP, 0, NULL, 0, NULL},
  720. {"and33", "=rt3,%ra3", 0xfe06, 2, ATTR_V3MUP, 0, NULL, 0, NULL},
  721. {"or33", "=rt3,%ra3", 0xfe07, 2, ATTR_V3MUP, 0, NULL, 0, NULL},
  722. /* SEG-Alias instructions. */
  723. {"nop16", "", 0x9200, 2, ATTR_ALL, 0, NULL, 0, NULL},
  724. {"ifret16", "", 0x83ff, 2, ATTR (IFC_EXT), 0, NULL, 0, NULL},
  725. /* Saturation ext ISA. */
  726. {"kaddw", "=rt,%ra,%rb", ALU2 (KADD), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  727. {"ksubw", "=rt,%ra,%rb", ALU2 (KSUB), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  728. {"kaddh", "=rt,%ra,%rb", ALU2 (KADD) | __BIT (6), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  729. {"ksubh", "=rt,%ra,%rb", ALU2 (KSUB) | __BIT (6), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  730. {"kdmbb", "=rt,%ra,%rb", ALU2 (KMxy), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  731. {"kdmbt", "=rt,%ra,%rb", ALU2 (KMxy) | __BIT (6), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  732. {"kdmtb", "=rt,%ra,%rb", ALU2 (KMxy) | __BIT (7), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  733. {"kdmtt", "=rt,%ra,%rb", ALU2 (KMxy) | __BIT (6) | __BIT (7), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  734. {"khmbb", "=rt,%ra,%rb", ALU2 (KMxy) | __BIT (8), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  735. {"khmbt", "=rt,%ra,%rb", ALU2 (KMxy) | __BIT (8) | __BIT (6), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  736. {"khmtb", "=rt,%ra,%rb", ALU2 (KMxy) | __BIT (8) | __BIT (7), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  737. {"khmtt", "=rt,%ra,%rb", ALU2 (KMxy) | __BIT (8) | __BIT (6) | __BIT (7), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  738. {"kslraw", "=rt,%ra,%rb", ALU2 (KSLRA), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  739. {"rdov", "=rt", ALU2 (MFUSR) | __BIT (6) | ( 0x1e << 15), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  740. {"clrov", "", ALU2 (MTUSR) | __BIT (6) | ( 0x1e << 15), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL},
  741. /* Audio ext. instructions. */
  742. {"amtari", "%aridxi,%imm16", AUDIO (AMTARI), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  743. /* N32_AEXT_AMADD */
  744. {"alr2", "=a_rt,=a_ru,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMADD) | (0x1 << 6), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  745. {"amaddl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMADD) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  746. {"amaddl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMADD) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  747. {"amaddl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMADD) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  748. {"amaddl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMADD) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  749. {"amaddsa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMADD) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  750. {"alr", "=a_rt,[%im5_i],%im5_m", AUDIO (AMADD) | (0x01 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  751. {"amadd", "=a_dx,%ra,%rb", AUDIO (AMADD), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  752. {"amabbs", "=a_dx,%ra,%rb", AUDIO (AMADD) | 0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  753. /* N32_AEXT_AMSUB */
  754. {"amsubl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMSUB) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  755. {"amsubl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMSUB) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  756. {"amsubl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMSUB) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  757. {"amsubl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMSUB) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  758. {"amsubsa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMSUB) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  759. {"asr", "%ra,[%im5_i],%im5_m", AUDIO (AMSUB) | (0x01 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  760. {"amsub", "=a_dx,%ra,%rb", AUDIO (AMSUB), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  761. {"amabts", "=a_dx,%ra,%rb", AUDIO (AMSUB) |0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  762. /* N32_AEXT_AMULT */
  763. {"amultl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMULT) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  764. {"amultl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMULT) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  765. {"amultl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMULT) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  766. {"amultl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMULT) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  767. {"amultsa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMULT) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  768. {"ala", "=dxh,[%im5_i],%im5_m", AUDIO (AMULT) | (0x01 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  769. {"amult", "=a_dx,%ra,%rb", AUDIO (AMULT), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  770. {"amatbs", "=a_dx,%ra,%rb", AUDIO (AMULT) |0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  771. {"asats48", "=a_dx", AUDIO (AMULT) | (0x02 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  772. {"awext", "%ra,%a_dx,%i5u", AUDIO (AMULT) | (0x03 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  773. /* N32_AEXT_AMFAR */
  774. {"amatts", "=a_dx,%ra,%rb", AUDIO (AMFAR) | 0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  775. {"asa", "=dxh,[%im5_i],%im5_m", AUDIO (AMFAR) | (0x01 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  776. {"amtar", "%ra,%aridx", AUDIO (AMFAR) | (0x02 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  777. {"amtar2", "%ra,%aridx2", AUDIO (AMFAR) | (0x12 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  778. {"amfar", "=ra,%aridx", AUDIO (AMFAR) | (0x03 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  779. {"amfar2", "=ra,%aridx2", AUDIO (AMFAR) | (0x13 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  780. /* N32_AEXT_AMADDS */
  781. {"amaddsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMADDS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  782. {"amaddsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMADDS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  783. {"amaddsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMADDS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  784. {"amaddsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMADDS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  785. {"amaddssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMADDS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  786. {"aupi", "%im5_i,%im5_m", AUDIO (AMADDS) | (0x01 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  787. {"amadds", "=a_dx,%ra,%rb", AUDIO (AMADDS), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  788. {"ambbs", "=a_dx,%ra,%rb", AUDIO (AMADDS) |0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  789. {"amawbs", "=a_dx,%ra,%rb", AUDIO (AMADDS) |0x02, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  790. /* N32_AEXT_AMSUBS */
  791. {"amsubsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMSUBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  792. {"amsubsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMSUBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  793. {"amsubsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMSUBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  794. {"amsubsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMSUBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  795. {"amsubssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMSUBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  796. {"amsubs", "=a_dx,%ra,%rb", AUDIO (AMSUBS), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  797. {"ambts", "=a_dx,%ra,%rb", AUDIO (AMSUBS) |0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  798. {"amawts", "=a_dx,%ra,%rb", AUDIO (AMSUBS) |0x02, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  799. /* N32_AEXT_AMULTS */
  800. {"amultsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMULTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  801. {"amultsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMULTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  802. {"amultsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMULTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  803. {"amultsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMULTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  804. {"amultssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMULTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  805. {"amults", "=a_dx,%ra,%rb", AUDIO (AMULTS), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  806. {"amtbs", "=a_dx,%ra,%rb", AUDIO (AMULTS) |0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  807. {"amwbs", "=a_dx,%ra,%rb", AUDIO (AMULTS) |0x02, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  808. /* N32_AEXT_AMNEGS */
  809. {"amnegsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMNEGS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  810. {"amnegsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMNEGS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  811. {"amnegsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMNEGS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  812. {"amnegsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMNEGS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  813. {"amnegssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMNEGS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  814. {"amnegs", "=a_dx,%ra,%rb", AUDIO (AMNEGS), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  815. {"amtts", "=a_dx,%ra,%rb", AUDIO (AMNEGS) |0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  816. {"amwts", "=a_dx,%ra,%rb", AUDIO (AMNEGS) |0x02, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  817. /* N32_AEXT_AADDL */
  818. {"aaddl", "=a_rte69,%ra,%rb,%a_rte69_1,[%im5_i],%im5_m", AUDIO (AADDL), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  819. {"asubl", "=a_rte69,%ra,%rb,%a_rte69_1,[%im5_i],%im5_m", AUDIO (AADDL) | (0x01 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  820. /* N32_AEXT_AMAWBS */
  821. {"amawbsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMAWBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  822. {"amawbsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMAWBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  823. {"amawbsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMAWBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  824. {"amawbsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMAWBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  825. {"amawbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMAWBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  826. /* N32_AEXT_AMAWTS */
  827. {"amawtsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMAWTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  828. {"amawtsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMAWTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  829. {"amawtsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMAWTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  830. {"amawtsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMAWTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  831. {"amawtssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMAWTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  832. /* N32_AEXT_AMWBS */
  833. {"amwbsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMWBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  834. {"amwbsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMWBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  835. {"amwbsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMWBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  836. {"amwbsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMWBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  837. {"amwbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMWBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  838. {"amwbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMWBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  839. /* N32_AEXT_AMWTS */
  840. {"amwtsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMWTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  841. {"amwtsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMWTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  842. {"amwtsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMWTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  843. {"amwtsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMWTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  844. {"amwtssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMWTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  845. /* N32_AEXT_AMABBS */
  846. {"amabbsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMABBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  847. {"amabbsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMABBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  848. {"amabbsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMABBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  849. {"amabbsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMABBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  850. {"amabbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMABBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  851. /* N32_AEXT_AMABTS */
  852. {"amabtsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMABTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  853. {"amabtsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMABTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  854. {"amabtsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMABTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  855. {"amabtsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMABTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  856. {"amabtssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMABTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  857. /* N32_AEXT_AMATBS */
  858. {"amatbsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMATBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  859. {"amatbsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMATBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  860. {"amatbsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMATBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  861. {"amatbsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMATBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  862. {"amatbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMATBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  863. /* N32_AEXT_AMATTS */
  864. {"amattsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMATTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  865. {"amattsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMATTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  866. {"amattsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMATTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  867. {"amattsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMATTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  868. {"amattssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMATTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  869. /* N32_AEXT_AMBBS */
  870. {"ambbsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMBBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  871. {"ambbsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMBBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  872. {"ambbsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMBBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  873. {"ambbsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMBBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  874. {"ambbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMBBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  875. /* N32_AEXT_AMBTS */
  876. {"ambtsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMBTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  877. {"ambtsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMBTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  878. {"ambtsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMBTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  879. {"ambtsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMBTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  880. {"ambtssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMBTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  881. /* N32_AEXT_AMTBS */
  882. {"amtbsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMTBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  883. {"amtbsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMTBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  884. {"amtbsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMTBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  885. {"amtbsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMTBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  886. {"amtbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMTBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  887. /* N32_AEXT_AMTTS */
  888. {"amttsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMTTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  889. {"amttsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMTTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  890. {"amttsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMTTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  891. {"amttsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMTTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  892. {"amttssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMTTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL},
  893. {NULL, NULL, 0, 0, 0, 0, NULL, 0, NULL},
  894. };
  895. const keyword_t keyword_gpr[] =
  896. {
  897. /* Standard names. */
  898. {"r0", 0, ATTR (RDREG)}, {"r1", 1, ATTR (RDREG)}, {"r2", 2, ATTR (RDREG)},
  899. {"r3", 3, ATTR (RDREG)}, {"r4", 4, ATTR (RDREG)}, {"r5", 5, ATTR (RDREG)},
  900. {"r6", 6, ATTR (RDREG)}, {"r7", 7, ATTR (RDREG)}, {"r8", 8, ATTR (RDREG)},
  901. {"r9", 9, ATTR (RDREG)}, {"r10", 10, ATTR (RDREG)}, {"r11", 11, 0},
  902. {"r12", 12, 0}, {"r13", 13, 0}, {"r14", 14, 0}, {"r15", 15, ATTR (RDREG)},
  903. {"r16", 16, 0}, {"r17", 17, 0}, {"r18", 18, 0}, {"r19", 19, 0},
  904. {"r20", 20, 0}, {"r21", 21, 0}, {"r22", 22, 0}, {"r23", 23, 0},
  905. {"r24", 24, 0}, {"r25", 25, 0},
  906. {"p0", 26, 0}, {"p1", 27, 0},
  907. {"fp", 28, ATTR (RDREG)}, {"gp", 29, ATTR (RDREG)},
  908. {"lp", 30, ATTR (RDREG)}, {"sp", 31, ATTR (RDREG)},
  909. {"r26", 26, 0}, {"r27", 27, 0},
  910. {"r28", 28, ATTR (RDREG)}, {"r29", 29, ATTR (RDREG)},
  911. {"r30", 30, ATTR (RDREG)}, {"r31", 31, ATTR (RDREG)},
  912. /* Names for parameter passing. */
  913. {"a0", 0, ATTR (RDREG)}, {"a1", 1, ATTR (RDREG)},
  914. {"a2", 2, ATTR (RDREG)}, {"a3", 3, ATTR (RDREG)},
  915. {"a4", 4, ATTR (RDREG)}, {"a5", 5, ATTR (RDREG)},
  916. /* Names reserved for 5-bit addressing only. */
  917. {"s0", 6, ATTR (RDREG)}, {"s1", 7, ATTR (RDREG)},
  918. {"s2", 8, ATTR (RDREG)}, {"s3", 9, ATTR (RDREG)},
  919. {"s4", 10, ATTR (RDREG)}, {"s5", 11, 0}, {"s6", 12, 0}, {"s7", 13, 0},
  920. {"s8", 14, 0}, {"s9", 28, ATTR (RDREG)},
  921. {"ta", 15, ATTR (RDREG)},
  922. {"t0", 16, 0}, {"t1", 17, 0}, {"t2", 18, 0}, {"t3", 19, 0},
  923. {"t4", 20, 0}, {"t5", 21, 0}, {"t6", 22, 0}, {"t7", 23, 0},
  924. {"t8", 24, 0}, {"t9", 25, 0},
  925. /* Names reserved for 4-bit addressing only. */
  926. {"h0", 0, ATTR (RDREG)}, {"h1", 1, ATTR (RDREG)},
  927. {"h2", 2, ATTR (RDREG)}, {"h3", 3, ATTR (RDREG)},
  928. {"h4", 4, ATTR (RDREG)}, {"h5", 5, ATTR (RDREG)},
  929. {"h6", 6, ATTR (RDREG)}, {"h7", 7, ATTR (RDREG)},
  930. {"h8", 8, ATTR (RDREG)}, {"h9", 9, ATTR (RDREG)},
  931. {"h10", 10, ATTR (RDREG)}, {"h11", 11, 0},
  932. {"h12", 16, 0}, {"h13", 17, 0}, {"h14", 18, 0}, {"h15", 19, 0},
  933. /* Names reserved for 3-bit addressing only. */
  934. {"o0", 0, ATTR (RDREG)}, {"o1", 1, ATTR (RDREG)},
  935. {"o2", 2, ATTR (RDREG)}, {"o3", 3, ATTR (RDREG)},
  936. {"o4", 4, ATTR (RDREG)}, {"o5", 5, ATTR (RDREG)},
  937. {"o6", 6, ATTR (RDREG)}, {"o7", 7, ATTR (RDREG)},
  938. {NULL, 0, 0}
  939. };
  940. const keyword_t keyword_usr[] =
  941. {
  942. {"d0.lo", USRIDX (0, 0), 0},
  943. {"d0.hi", USRIDX (0, 1), 0},
  944. {"d1.lo", USRIDX (0, 2), 0},
  945. {"d1.hi", USRIDX (0, 3), 0},
  946. {"itb", USRIDX (0, 28), 0},
  947. {"ifc_lp", USRIDX (0, 29), 0},
  948. {"pc", USRIDX (0, 31), 0},
  949. {"dma_cfg", USRIDX (1, 0), 0},
  950. {"dma_gcsw", USRIDX (1, 1), 0},
  951. {"dma_chnsel", USRIDX (1, 2), 0},
  952. {"dma_act", USRIDX (1, 3), 0},
  953. {"dma_setup", USRIDX (1, 4), 0},
  954. {"dma_isaddr", USRIDX (1, 5), 0},
  955. {"dma_esaddr", USRIDX (1, 6), 0},
  956. {"dma_tcnt", USRIDX (1, 7), 0},
  957. {"dma_status", USRIDX (1, 8), 0},
  958. {"dma_2dset", USRIDX (1, 9), 0},
  959. {"dma_rcnt", USRIDX (1, 23), 0},
  960. {"dma_hstatus", USRIDX (1, 24), 0},
  961. {"dma_2dsctl", USRIDX (1, 25), 0},
  962. {"pfmc0", USRIDX (2, 0), 0},
  963. {"pfmc1", USRIDX (2, 1), 0},
  964. {"pfmc2", USRIDX (2, 2), 0},
  965. {"pfm_ctl", USRIDX (2, 4), 0},
  966. {NULL, 0, 0}
  967. };
  968. const keyword_t keyword_dxr[] =
  969. {
  970. {"d0", 0, 0}, {"d1", 1, 0}, {NULL, 0, 0}
  971. };
  972. const keyword_t keyword_sr[] =
  973. {
  974. {"cpu_ver", SRIDX (0, 0, 0), 0}, {"cr0", SRIDX (0, 0, 0), 0},
  975. {"icm_cfg", SRIDX (0, 1, 0), 0}, {"cr1", SRIDX (0, 1, 0), 0},
  976. {"dcm_cfg", SRIDX (0, 2, 0), 0}, {"cr2", SRIDX (0, 2, 0), 0},
  977. {"mmu_cfg", SRIDX (0, 3, 0), 0}, {"cr3", SRIDX (0, 3, 0), 0},
  978. {"msc_cfg", SRIDX (0, 4, 0), 0}, {"cr4", SRIDX (0, 4, 0), 0},
  979. {"msc_cfg2", SRIDX (0, 4, 1), 0}, {"cr7", SRIDX (0, 4, 1), 0},
  980. {"core_id", SRIDX (0, 0, 1), 0}, {"cr5", SRIDX (0, 0, 1), 0},
  981. {"fucop_exist", SRIDX (0, 5, 0), 0}, {"cr6", SRIDX (0, 5, 0), 0},
  982. {"psw", SRIDX (1, 0, 0), 0}, {"ir0", SRIDX (1, 0, 0), 0},
  983. {"ipsw", SRIDX (1, 0, 1), 0}, {"ir1", SRIDX (1, 0, 1), 0},
  984. {"p_ipsw", SRIDX (1, 0, 2), 0}, {"ir2", SRIDX (1, 0, 2), 0},
  985. {"ivb", SRIDX (1, 1, 1), 0}, {"ir3", SRIDX (1, 1, 1), 0},
  986. {"eva", SRIDX (1, 2, 1), 0}, {"ir4", SRIDX (1, 2, 1), 0},
  987. {"p_eva", SRIDX (1, 2, 2), 0}, {"ir5", SRIDX (1, 2, 2), 0},
  988. {"itype", SRIDX (1, 3, 1), 0}, {"ir6", SRIDX (1, 3, 1), 0},
  989. {"p_itype", SRIDX (1, 3, 2), 0}, {"ir7", SRIDX (1, 3, 2), 0},
  990. {"merr", SRIDX (1, 4, 1), 0}, {"ir8", SRIDX (1, 4, 1), 0},
  991. {"ipc", SRIDX (1, 5, 1), 0}, {"ir9", SRIDX (1, 5, 1), 0},
  992. {"p_ipc", SRIDX (1, 5, 2), 0}, {"ir10", SRIDX (1, 5, 2), 0},
  993. {"oipc", SRIDX (1, 5, 3), 0}, {"ir11", SRIDX (1, 5, 3), 0},
  994. {"p_p0", SRIDX (1, 6, 2), 0}, {"ir12", SRIDX (1, 6, 2), 0},
  995. {"p_p1", SRIDX (1, 7, 2), 0}, {"ir13", SRIDX (1, 7, 2), 0},
  996. {"int_mask", SRIDX (1, 8, 0), 0}, {"ir14", SRIDX (1, 8, 0), 0},
  997. {"int_pend", SRIDX (1, 9, 0), 0}, {"ir15", SRIDX (1, 9, 0), 0},
  998. {"sp_usr", SRIDX (1, 10, 0), 0}, {"ir16", SRIDX (1, 10, 0), 0},
  999. {"sp_priv", SRIDX (1, 10, 1), 0}, {"ir17", SRIDX (1, 10, 1), 0},
  1000. {"int_pri", SRIDX (1, 11, 0), 0}, {"ir18", SRIDX (1, 11, 0), 0},
  1001. {"int_ctrl", SRIDX (1, 1, 2), 0}, {"ir19", SRIDX (1, 1, 2), 0},
  1002. {"sp_usr1", SRIDX (1, 10, 2), 0}, {"ir20", SRIDX (1, 10, 2), 0},
  1003. {"sp_priv1", SRIDX (1, 10, 3), 0}, {"ir21", SRIDX (1, 10, 3), 0},
  1004. {"sp_usr2", SRIDX (1, 10, 4), 0}, {"ir22", SRIDX (1, 10, 4), 0},
  1005. {"sp_priv2", SRIDX (1, 10, 5), 0}, {"ir23", SRIDX (1, 10, 5), 0},
  1006. {"sp_usr3", SRIDX (1, 10, 6), 0}, {"ir24", SRIDX (1, 10, 6), 0},
  1007. {"sp_priv3", SRIDX (1, 10, 7), 0}, {"ir25", SRIDX (1, 10, 7), 0},
  1008. {"int_mask2", SRIDX (1, 8, 1), 0}, {"ir26", SRIDX (1, 8, 1), 0},
  1009. {"int_pend2", SRIDX (1, 9, 1), 0}, {"ir27", SRIDX (1, 9, 1), 0},
  1010. {"int_pri2", SRIDX (1, 11, 1), 0}, {"ir28", SRIDX (1, 11, 1), 0},
  1011. {"int_trigger", SRIDX (1, 9, 4), 0}, {"ir29", SRIDX (1, 9, 4), 0},
  1012. {"int_gpr_push_dis", SRIDX(1, 1, 3), 0}, {"ir30", SRIDX (1, 1, 3), 0},
  1013. {"mmu_ctl", SRIDX (2, 0, 0), 0}, {"mr0", SRIDX (2, 0, 0), 0},
  1014. {"l1_pptb", SRIDX (2, 1, 0), 0}, {"mr1", SRIDX (2, 1, 0), 0},
  1015. {"tlb_vpn", SRIDX (2, 2, 0), 0}, {"mr2", SRIDX (2, 2, 0), 0},
  1016. {"tlb_data", SRIDX (2, 3, 0), 0}, {"mr3", SRIDX (2, 3, 0), 0},
  1017. {"tlb_misc", SRIDX (2, 4, 0), 0}, {"mr4", SRIDX (2, 4, 0), 0},
  1018. {"vlpt_idx", SRIDX (2, 5, 0), 0}, {"mr5", SRIDX (2, 5, 0), 0},
  1019. {"ilmb", SRIDX (2, 6, 0), 0}, {"mr6", SRIDX (2, 6, 0), 0},
  1020. {"dlmb", SRIDX (2, 7, 0), 0}, {"mr7", SRIDX (2, 7, 0), 0},
  1021. {"cache_ctl", SRIDX (2, 8, 0), 0}, {"mr8", SRIDX (2, 8, 0), 0},
  1022. {"hsmp_saddr", SRIDX (2, 9, 0), 0}, {"mr9", SRIDX (2, 9, 0), 0},
  1023. {"hsmp_eaddr", SRIDX (2, 9, 1), 0}, {"mr10", SRIDX (2, 9, 1), 0},
  1024. {"bg_region", SRIDX (2, 0, 1), 0}, {"mr11", SRIDX (2, 0, 1), 0},
  1025. {"pfmc0", SRIDX (4, 0, 0), 0}, {"pfr0", SRIDX (4, 0, 0), 0},
  1026. {"pfmc1", SRIDX (4, 0, 1), 0}, {"pfr1", SRIDX (4, 0, 1), 0},
  1027. {"pfmc2", SRIDX (4, 0, 2), 0}, {"pfr2", SRIDX (4, 0, 2), 0},
  1028. {"pfm_ctl", SRIDX (4, 1, 0), 0}, {"pfr3", SRIDX (4, 1, 0), 0},
  1029. {"hsp_ctl", SRIDX (4, 6, 0), 0}, {"hspr0", SRIDX (4, 6, 0), 0},
  1030. {"sp_bound", SRIDX (4, 6, 1), 0}, {"hspr1", SRIDX (4, 6, 1), 0},
  1031. {"sp_bound_priv", SRIDX (4, 6, 2), 0},{"hspr2", SRIDX (4, 6, 2), 0},
  1032. {"dma_cfg", SRIDX (5, 0, 0), 0}, {"dmar0", SRIDX (5, 0, 0), 0},
  1033. {"dma_gcsw", SRIDX (5, 1, 0), 0}, {"dmar1", SRIDX (5, 1, 0), 0},
  1034. {"dma_chnsel", SRIDX (5, 2, 0), 0}, {"dmar2", SRIDX (5, 2, 0), 0},
  1035. {"dma_act", SRIDX (5, 3, 0), 0}, {"dmar3", SRIDX (5, 3, 0), 0},
  1036. {"dma_setup", SRIDX (5, 4, 0), 0}, {"dmar4", SRIDX (5, 4, 0), 0},
  1037. {"dma_isaddr", SRIDX (5, 5, 0), 0}, {"dmar5", SRIDX (5, 5, 0), 0},
  1038. {"dma_esaddr", SRIDX (5, 6, 0), 0}, {"dmar6", SRIDX (5, 6, 0), 0},
  1039. {"dma_tcnt", SRIDX (5, 7, 0), 0}, {"dmar7", SRIDX (5, 7, 0), 0},
  1040. {"dma_status", SRIDX (5, 8, 0), 0}, {"dmar8", SRIDX (5, 8, 0), 0},
  1041. {"dma_2dset", SRIDX (5, 9, 0), 0}, {"dmar9", SRIDX (5, 9, 0), 0},
  1042. {"dma_2dsctl", SRIDX (5, 9, 1), 0}, {"dmar10", SRIDX (5, 9, 1), 0},
  1043. {"dma_rcnt", SRIDX (5, 7, 1), 0}, {"dmar11", SRIDX (5, 7, 1), 0},
  1044. {"dma_hstatus", SRIDX (5, 8, 1), 0}, {"dmar12", SRIDX (5, 8, 1), 0},
  1045. {"sdz_ctl", SRIDX (2, 15, 0), 0}, {"idr0", SRIDX (2, 15, 0), 0},
  1046. {"misc_ctl", SRIDX (2, 15, 1), 0}, {"n12misc_ctl", SRIDX (2, 15, 1), 0},
  1047. {"idr1", SRIDX (2, 15, 1), 0},
  1048. {"ecc_misc", SRIDX (2, 15, 2), 0}, {"idr2", SRIDX (2, 15, 2), 0},
  1049. {"secur0", SRIDX (6, 0, 0), 0}, {"sfcr", SRIDX (6, 0, 0), 0},
  1050. {"secur1", SRIDX (6, 1, 0), 0}, {"sign", SRIDX (6, 1, 0), 0},
  1051. {"secur2", SRIDX (6, 1, 1), 0}, {"isign", SRIDX (6, 1, 1), 0},
  1052. {"secur3", SRIDX (6, 1, 2), 0}, {"p_isign", SRIDX (6, 1, 2), 0},
  1053. {"prusr_acc_ctl", SRIDX (4, 4, 0), 0},
  1054. {"fucpr", SRIDX (4, 5, 0), 0}, {"fucop_ctl", SRIDX (4, 5, 0), 0},
  1055. {"bpc0", SRIDX (3, 0, 0), 0}, {"dr0", SRIDX (3, 0, 0), 0},
  1056. {"bpc1", SRIDX (3, 0, 1), 0}, {"dr1", SRIDX (3, 0, 1), 0},
  1057. {"bpc2", SRIDX (3, 0, 2), 0}, {"dr2", SRIDX (3, 0, 2), 0},
  1058. {"bpc3", SRIDX (3, 0, 3), 0}, {"dr3", SRIDX (3, 0, 3), 0},
  1059. {"bpc4", SRIDX (3, 0, 4), 0}, {"dr4", SRIDX (3, 0, 4), 0},
  1060. {"bpc5", SRIDX (3, 0, 5), 0}, {"dr5", SRIDX (3, 0, 5), 0},
  1061. {"bpc6", SRIDX (3, 0, 6), 0}, {"dr6", SRIDX (3, 0, 6), 0},
  1062. {"bpc7", SRIDX (3, 0, 7), 0}, {"dr7", SRIDX (3, 0, 7), 0},
  1063. {"bpa0", SRIDX (3, 1, 0), 0}, {"dr8", SRIDX (3, 1, 0), 0},
  1064. {"bpa1", SRIDX (3, 1, 1), 0}, {"dr9", SRIDX (3, 1, 1), 0},
  1065. {"bpa2", SRIDX (3, 1, 2), 0}, {"dr10", SRIDX (3, 1, 2), 0},
  1066. {"bpa3", SRIDX (3, 1, 3), 0}, {"dr11", SRIDX (3, 1, 3), 0},
  1067. {"bpa4", SRIDX (3, 1, 4), 0}, {"dr12", SRIDX (3, 1, 4), 0},
  1068. {"bpa5", SRIDX (3, 1, 5), 0}, {"dr13", SRIDX (3, 1, 5), 0},
  1069. {"bpa6", SRIDX (3, 1, 6), 0}, {"dr14", SRIDX (3, 1, 6), 0},
  1070. {"bpa7", SRIDX (3, 1, 7), 0}, {"dr15", SRIDX (3, 1, 7), 0},
  1071. {"bpam0", SRIDX (3, 2, 0), 0}, {"dr16", SRIDX (3, 2, 0), 0},
  1072. {"bpam1", SRIDX (3, 2, 1), 0}, {"dr17", SRIDX (3, 2, 1), 0},
  1073. {"bpam2", SRIDX (3, 2, 2), 0}, {"dr18", SRIDX (3, 2, 2), 0},
  1074. {"bpam3", SRIDX (3, 2, 3), 0}, {"dr19", SRIDX (3, 2, 3), 0},
  1075. {"bpam4", SRIDX (3, 2, 4), 0}, {"dr20", SRIDX (3, 2, 4), 0},
  1076. {"bpam5", SRIDX (3, 2, 5), 0}, {"dr21", SRIDX (3, 2, 5), 0},
  1077. {"bpam6", SRIDX (3, 2, 6), 0}, {"dr22", SRIDX (3, 2, 6), 0},
  1078. {"bpam7", SRIDX (3, 2, 7), 0}, {"dr23", SRIDX (3, 2, 7), 0},
  1079. {"bpv0", SRIDX (3, 3, 0), 0}, {"dr24", SRIDX (3, 3, 0), 0},
  1080. {"bpv1", SRIDX (3, 3, 1), 0}, {"dr25", SRIDX (3, 3, 1), 0},
  1081. {"bpv2", SRIDX (3, 3, 2), 0}, {"dr26", SRIDX (3, 3, 2), 0},
  1082. {"bpv3", SRIDX (3, 3, 3), 0}, {"dr27", SRIDX (3, 3, 3), 0},
  1083. {"bpv4", SRIDX (3, 3, 4), 0}, {"dr28", SRIDX (3, 3, 4), 0},
  1084. {"bpv5", SRIDX (3, 3, 5), 0}, {"dr29", SRIDX (3, 3, 5), 0},
  1085. {"bpv6", SRIDX (3, 3, 6), 0}, {"dr30", SRIDX (3, 3, 6), 0},
  1086. {"bpv7", SRIDX (3, 3, 7), 0}, {"dr31", SRIDX (3, 3, 7), 0},
  1087. {"bpcid0", SRIDX (3, 4, 0), 0}, {"dr32", SRIDX (3, 4, 0), 0},
  1088. {"bpcid1", SRIDX (3, 4, 1), 0}, {"dr33", SRIDX (3, 4, 1), 0},
  1089. {"bpcid2", SRIDX (3, 4, 2), 0}, {"dr34", SRIDX (3, 4, 2), 0},
  1090. {"bpcid3", SRIDX (3, 4, 3), 0}, {"dr35", SRIDX (3, 4, 3), 0},
  1091. {"bpcid4", SRIDX (3, 4, 4), 0}, {"dr36", SRIDX (3, 4, 4), 0},
  1092. {"bpcid5", SRIDX (3, 4, 5), 0}, {"dr37", SRIDX (3, 4, 5), 0},
  1093. {"bpcid6", SRIDX (3, 4, 6), 0}, {"dr38", SRIDX (3, 4, 6), 0},
  1094. {"bpcid7", SRIDX (3, 4, 7), 0}, {"dr39", SRIDX (3, 4, 7), 0},
  1095. {"edm_cfg", SRIDX (3, 5, 0), 0}, {"dr40", SRIDX (3, 5, 0), 0},
  1096. {"edmsw", SRIDX (3, 6, 0), 0}, {"dr41", SRIDX (3, 6, 0), 0},
  1097. {"edm_ctl", SRIDX (3, 7, 0), 0}, {"dr42", SRIDX (3, 7, 0), 0},
  1098. {"edm_dtr", SRIDX (3, 8, 0), 0}, {"dr43", SRIDX (3, 8, 0), 0},
  1099. {"bpmtc", SRIDX (3, 9, 0), 0}, {"dr44", SRIDX (3, 9, 0), 0},
  1100. {"dimbr", SRIDX (3, 10, 0), 0}, {"dr45", SRIDX (3, 10, 0), 0},
  1101. {"tecr0", SRIDX (3, 14, 0), 0}, {"dr46", SRIDX (3, 14, 0), 0},
  1102. {"tecr1", SRIDX (3, 14, 1), 0}, {"dr47", SRIDX (3, 14, 1), 0},
  1103. {NULL,0 ,0}
  1104. };
  1105. const keyword_t keyword_cp[] =
  1106. {
  1107. {"cp0", 0, 0}, {"cp1", 1, 0}, {"cp2", 2, 0}, {"cp3", 3, 0}, {NULL, 0, 0}
  1108. };
  1109. const keyword_t keyword_cpr[] =
  1110. {
  1111. {"cpr0", 0, 0}, {"cpr1", 1, 0}, {"cpr2", 2, 0}, {"cpr3", 3, 0},
  1112. {"cpr4", 4, 0}, {"cpr5", 5, 0}, {"cpr6", 6, 0}, {"cpr7", 7, 0},
  1113. {"cpr8", 8, 0}, {"cpr9", 9, 0}, {"cpr10", 10, 0}, {"cpr11", 11, 0},
  1114. {"cpr12", 12, 0}, {"cpr13", 13, 0}, {"cpr14", 14, 0}, {"cpr15", 15, 0},
  1115. {"cpr16", 16, 0}, {"cpr17", 17, 0}, {"cpr18", 18, 0}, {"cpr19", 19, 0},
  1116. {"cpr20", 20, 0}, {"cpr21", 21, 0}, {"cpr22", 22, 0}, {"cpr23", 23, 0},
  1117. {"cpr24", 24, 0}, {"cpr25", 25, 0}, {"cpr26", 26, 0}, {"cpr27", 27, 0},
  1118. {"cpr28", 28, 0}, {"cpr29", 29, 0}, {"cpr30", 30, 0}, {"cpr31", 31, 0},
  1119. {NULL, 0, 0}
  1120. };
  1121. const keyword_t keyword_fsr[] =
  1122. {
  1123. {"fs0", 0, 0}, {"fs1", 1, 0}, {"fs2", 2, 0}, {"fs3", 3, 0}, {"fs4", 4, 0},
  1124. {"fs5", 5, 0}, {"fs6", 6, 0}, {"fs7", 7, 0}, {"fs8", 8, 0}, {"fs9", 9, 0},
  1125. {"fs10", 10, 0}, {"fs11", 11, 0}, {"fs12", 12, 0}, {"fs13", 13, 0},
  1126. {"fs14", 14, 0}, {"fs15", 15, 0}, {"fs16", 16, 0}, {"fs17", 17, 0},
  1127. {"fs18", 18, 0}, {"fs19", 19, 0}, {"fs20", 20, 0}, {"fs21", 21, 0},
  1128. {"fs22", 22, 0}, {"fs23", 23, 0}, {"fs24", 24, 0}, {"fs25", 25, 0},
  1129. {"fs26", 26, 0}, {"fs27", 27, 0}, {"fs28", 28, 0}, {"fs29", 29, 0},
  1130. {"fs30", 30, 0}, {"fs31", 31, 0}, {NULL, 0 ,0}
  1131. };
  1132. const keyword_t keyword_fdr[] =
  1133. {
  1134. {"fd0", 0, 0}, {"fd1", 1, 0}, {"fd2", 2, 0}, {"fd3", 3, 0}, {"fd4", 4, 0},
  1135. {"fd5", 5, 0}, {"fd6", 6, 0}, {"fd7", 7, 0}, {"fd8", 8, 0}, {"fd9", 9, 0},
  1136. {"fd10", 10, 0}, {"fd11", 11, 0}, {"fd12", 12, 0}, {"fd13", 13, 0},
  1137. {"fd14", 14, 0}, {"fd15", 15, 0}, {"fd16", 16, 0}, {"fd17", 17, 0},
  1138. {"fd18", 18, 0}, {"fd19", 19, 0}, {"fd20", 20, 0}, {"fd21", 21, 0},
  1139. {"fd22", 22, 0}, {"fd23", 23, 0}, {"fd24", 24, 0}, {"fd25", 25, 0},
  1140. {"fd26", 26, 0}, {"fd27", 27, 0}, {"fd28", 28, 0}, {"fd29", 29, 0},
  1141. {"fd30", 30, 0}, {"fd31", 31, 0}, {NULL, 0, 0}
  1142. };
  1143. const keyword_t keyword_abdim[] =
  1144. {
  1145. {"bi", 0, 0}, {"bim", 1, 0}, {"bd", 2, 0}, {"bdm", 3, 0},
  1146. {"ai", 4, 0}, {"aim", 5, 0}, {"ad", 6, 0}, {"adm", 7, 0},
  1147. {NULL, 0, 0}
  1148. };
  1149. const keyword_t keyword_abm[] =
  1150. {
  1151. {"b", 0, 0}, {"bm", 1, 0}, {"bx", 2, 0}, {"bmx", 3, 0},
  1152. {"a", 4, 0}, {"am", 5, 0}, {"ax", 6, 0}, {"amx", 7, 0},
  1153. {NULL, 0, 0}
  1154. };
  1155. static const keyword_t keyword_dtiton[] =
  1156. {
  1157. {"iton", 1, 0}, {"ton", 3, 0}, {NULL, 0, 0}
  1158. };
  1159. static const keyword_t keyword_dtitoff[] =
  1160. {
  1161. {"itoff", 1, 0}, {"toff", 3, 0}, {NULL, 0, 0}
  1162. };
  1163. const keyword_t keyword_dpref_st[] =
  1164. {
  1165. {"srd", 0, 0}, {"mrd", 1, 0}, {"swr", 2, 0}, {"mwr", 3, 0},
  1166. {"pte", 4, 0}, {"clwr", 5, 0}, {NULL, 0, 0}
  1167. };
  1168. /* CCTL Ra, SubType. */
  1169. static const keyword_t keyword_cctl_st0[] =
  1170. {
  1171. {"l1d_ix_inval", 0X0, 0}, {"l1d_ix_wb", 0X1, 0}, {"l1d_ix_wbinval", 0X2, 0},
  1172. {"l1d_va_fillck", 0XB, 0}, {"l1d_va_ulck", 0XC, 0}, {"l1i_ix_inval", 0X10, 0},
  1173. {"l1i_va_fillck", 0X1B, 0}, {"l1i_va_ulck", 0X1C, 0},
  1174. {NULL, 0, 0}
  1175. };
  1176. /* CCTL Ra, SubType, level. */
  1177. static const keyword_t keyword_cctl_st1[] =
  1178. {
  1179. {"l1d_va_inval", 0X8, 0}, {"l1d_va_wb", 0X9, 0},
  1180. {"l1d_va_wbinval", 0XA, 0}, {"l1i_va_inval", 0X18, 0},
  1181. {NULL, 0, 0}
  1182. };
  1183. /* CCTL Rt, Ra, SubType. */
  1184. static const keyword_t keyword_cctl_st2[] =
  1185. {
  1186. {"l1d_ix_rtag", 0X3, 0}, {"l1d_ix_rwd", 0X4, 0},
  1187. {"l1i_ix_rtag", 0X13, 0}, {"l1i_ix_rwd", 0X14, 0},
  1188. {NULL, 0, 0}
  1189. };
  1190. /* CCTL Rb, Ra, SubType. */
  1191. static const keyword_t keyword_cctl_st3[] =
  1192. {
  1193. {"l1d_ix_wtag", 0X5, 0}, {"l1d_ix_wwd", 0X6, 0},
  1194. {"l1i_ix_wtag", 0X15, 0}, {"l1i_ix_wwd", 0X16, 0},
  1195. {NULL, 0, 0}
  1196. };
  1197. /* CCTL L1D_INVALALL. */
  1198. static const keyword_t keyword_cctl_st4[] =
  1199. {
  1200. {"l1d_invalall", 0x7, 0}, {NULL, 0, 0}
  1201. };
  1202. /* CCTL L1D_WBALL, level. */
  1203. static const keyword_t keyword_cctl_st5[] =
  1204. {
  1205. {"l1d_wball", 0xf, 0}, {NULL, 0, 0}
  1206. };
  1207. const keyword_t keyword_cctl_lv[] =
  1208. {
  1209. {"1level", 0, 0}, {"alevel", 1, 0}, {"0", 0, 0}, {"1", 1, 0},
  1210. {NULL, 0, 0},
  1211. };
  1212. static const keyword_t keyword_tlbop_st[] =
  1213. {
  1214. {"targetread", 0, 0}, {"trd", 0, 0},
  1215. {"targetwrite", 1, 0}, {"twr", 1, 0},
  1216. {"rwrite", 2, 0}, {"rwr", 2, 0},
  1217. {"rwritelock", 3, 0}, {"rwlk", 3, 0},
  1218. {"unlock", 4, 0}, {"unlk", 4, 0},
  1219. {"invalidate", 6, 0}, {"inv", 6, 0},
  1220. {NULL, 0, 0},
  1221. };
  1222. const keyword_t keyword_standby_st[] =
  1223. {
  1224. {"no_wake_grant", 0, 0},
  1225. {"wake_grant", 1, 0},
  1226. {"wait_done", 2, 0},
  1227. {"0", 0, 0},
  1228. {"1", 1, 0},
  1229. {"2", 2, 0},
  1230. {"3", 3, 0},
  1231. {NULL, 0, 0},
  1232. };
  1233. const keyword_t keyword_msync_st[] =
  1234. {
  1235. {"all", 0, 0}, {"store", 1, 0},
  1236. {NULL, 0, 0}
  1237. };
  1238. const keyword_t keyword_im5_i[] =
  1239. {
  1240. {"i0", 0, 0}, {"i1", 1, 0}, {"i2", 2, 0}, {"i3", 3, 0},
  1241. {"i4", 4, 0}, {"i5", 5, 0}, {"i6", 6, 0}, {"i7", 7, 0},
  1242. {NULL, 0, 0}
  1243. };
  1244. const keyword_t keyword_im5_m[] =
  1245. {
  1246. {"m0", 0, 0}, {"m1", 1, 0}, {"m2", 2, 0}, {"m3", 3, 0},
  1247. {"m4", 4, 0}, {"m5", 5, 0}, {"m6", 6, 0}, {"m7", 7, 0},
  1248. {NULL, 0, 0}
  1249. };
  1250. const keyword_t keyword_accumulator[] =
  1251. {
  1252. {"d0.lo", 0, 0}, {"d0.hi", 1, 0}, {"d1.lo", 2, 0}, {"d1.hi", 3, 0},
  1253. {NULL, 0, 0}
  1254. };
  1255. const keyword_t keyword_aridx[] =
  1256. {
  1257. {"i0", 0, 0}, {"i1", 1, 0}, {"i2", 2, 0}, {"i3", 3, 0},
  1258. {"i4", 4, 0}, {"i5", 5, 0}, {"i6", 6, 0}, {"i7", 7, 0},
  1259. {"mod", 8, 0}, {"m1", 9, 0}, {"m2", 10, 0}, {"m3",11, 0},
  1260. {"m5",13, 0}, {"m6",14, 0}, {"m7",15, 0},
  1261. {"d0.l24", 16, 0}, {"d1.l24", 17, 0},
  1262. {"shft_ctl0", 18, 0}, {"shft_ctl1", 19, 0},
  1263. {"lb", 24, 0}, {"le", 25, 0}, {"lc", 26, 0}, {"adm_vbase", 27, 0},
  1264. {NULL, 0, 0}
  1265. };
  1266. const keyword_t keyword_aridx2[] =
  1267. {
  1268. {"cbb0", 0, 0}, {"cbb1", 1, 0}, {"cbb2", 2, 0}, {"cbb3", 3, 0},
  1269. {"cbe0", 4, 0}, {"cbe1", 5, 0}, {"cbe2", 6, 0}, {"cbe3", 7, 0},
  1270. {"cb_ctl", 31, 0},
  1271. {NULL, 0, 0}
  1272. };
  1273. const keyword_t keyword_aridxi[] =
  1274. {
  1275. {"i0", 0, 0}, {"i1", 1, 0}, {"i2", 2, 0}, {"i3", 3, 0},
  1276. {"i4", 4, 0}, {"i5", 5, 0}, {"i6", 6, 0}, {"i7", 7, 0},
  1277. {"mod", 8, 0}, {"m1", 9, 0}, {"m2", 10, 0}, {"m3",11, 0},
  1278. {"m5",13, 0}, {"m6",14, 0}, {"m7",15, 0},
  1279. {NULL, 0, 0}
  1280. };
  1281. const keyword_t *keywords[_HW_LAST] =
  1282. {
  1283. keyword_gpr, keyword_usr, keyword_dxr, keyword_sr, keyword_fsr,
  1284. keyword_fdr, keyword_cp, keyword_cpr, keyword_abdim, keyword_abm,
  1285. keyword_dtiton, keyword_dtitoff, keyword_dpref_st,
  1286. keyword_cctl_st0, keyword_cctl_st1, keyword_cctl_st2,
  1287. keyword_cctl_st3, keyword_cctl_st4, keyword_cctl_st5,
  1288. keyword_cctl_lv, keyword_tlbop_st, keyword_standby_st,
  1289. keyword_msync_st,
  1290. keyword_im5_i, keyword_im5_m,
  1291. keyword_accumulator, keyword_aridx, keyword_aridx2, keyword_aridxi
  1292. };
  1293. /* Hash table for syntax lex. */
  1294. static htab_t field_htab;
  1295. /* Hash table for opcodes. */
  1296. static htab_t opcode_htab;
  1297. /* Hash table for hardware resources. */
  1298. static htab_t hw_ktabs[_HW_LAST];
  1299. static hashval_t
  1300. htab_hash_hash (const void *p)
  1301. {
  1302. struct nds32_hash_entry *h = (struct nds32_hash_entry *) p;
  1303. return htab_hash_string (h->name);
  1304. }
  1305. static int
  1306. htab_hash_eq (const void *p, const void *q)
  1307. {
  1308. struct nds32_hash_entry *h = (struct nds32_hash_entry *) p;
  1309. const char *name = (const char *) q;
  1310. return strcmp (name, h->name) == 0;
  1311. }
  1312. /* Build a hash table for array BASE. Each element is in size of SIZE,
  1313. and it's first element is a pointer to the key of string.
  1314. It stops inserting elements until reach an NULL key. */
  1315. static htab_t
  1316. build_hash_table (const void *base, size_t size)
  1317. {
  1318. htab_t htab;
  1319. hashval_t hash;
  1320. const char *p;
  1321. htab = htab_create_alloc (128, htab_hash_hash, htab_hash_eq,
  1322. NULL, xcalloc, free);
  1323. p = base;
  1324. while (1)
  1325. {
  1326. struct nds32_hash_entry **slot;
  1327. struct nds32_hash_entry *h;
  1328. h = (struct nds32_hash_entry *) p;
  1329. if (h->name == NULL)
  1330. break;
  1331. hash = htab_hash_string (h->name);
  1332. slot = (struct nds32_hash_entry **)
  1333. htab_find_slot_with_hash (htab, h->name, hash, INSERT);
  1334. assert (slot != NULL && *slot == NULL);
  1335. *slot = h;
  1336. p = p + size;
  1337. }
  1338. return htab;
  1339. }
  1340. /* Build the syntax for a given opcode OPC. It parses the string
  1341. pointed by INSTRUCTION and store the result on SYNTAX, so
  1342. when we assemble an instruction, we don't have to parse the syntax
  1343. again. */
  1344. static void
  1345. build_opcode_syntax (struct nds32_opcode *opc)
  1346. {
  1347. char odstr[MAX_LEX_LEN];
  1348. const char *str;
  1349. const char *end;
  1350. lex_t *plex;
  1351. int len;
  1352. hashval_t hash;
  1353. field_t *fd;
  1354. int opt = 0;
  1355. /* Check whether it has been initialized. */
  1356. if (opc->syntax)
  1357. return;
  1358. opc->syntax = xmalloc (MAX_LEX_NUM * sizeof (lex_t));
  1359. str = opc->instruction;
  1360. plex = opc->syntax;
  1361. while (*str)
  1362. {
  1363. int fidx;
  1364. switch (*str)
  1365. {
  1366. case '%':
  1367. *plex = SYN_INPUT;
  1368. break;
  1369. case '=':
  1370. *plex = SYN_OUTPUT;
  1371. break;
  1372. case '&':
  1373. *plex = SYN_INPUT | SYN_OUTPUT;
  1374. break;
  1375. case '{':
  1376. *plex++ = SYN_LOPT;
  1377. opt++;
  1378. str++;
  1379. continue;
  1380. case '}':
  1381. *plex++ = SYN_ROPT;
  1382. str++;
  1383. continue;
  1384. default:
  1385. *plex++ = *str++;
  1386. continue;
  1387. }
  1388. str++;
  1389. /* Extract operand. */
  1390. end = str;
  1391. while (ISALNUM (*end) || *end == '_')
  1392. end++;
  1393. len = end - str;
  1394. memcpy (odstr, str, len);
  1395. odstr[len] = '\0';
  1396. hash = htab_hash_string (odstr);
  1397. fd = (field_t *) htab_find_with_hash (field_htab, odstr, hash);
  1398. fidx = fd - operand_fields;
  1399. if (fd == NULL)
  1400. {
  1401. fprintf (stderr, "Internal error: Unknown operand, %s\n", str);
  1402. }
  1403. assert (fd && fidx >= 0 && fidx < (int) ARRAY_SIZE (operand_fields));
  1404. *plex |= LEX_SET_FIELD (fidx);
  1405. str += len;
  1406. plex++;
  1407. }
  1408. *plex = 0;
  1409. opc->variant = opt;
  1410. return;
  1411. }
  1412. /* Initialize the assembler. It must be called before assembling. */
  1413. void
  1414. nds32_asm_init (nds32_asm_desc_t *pdesc, int flags)
  1415. {
  1416. int i;
  1417. hashval_t hash;
  1418. pdesc->flags = flags;
  1419. pdesc->mach = flags & NASM_OPEN_ARCH_MASK;
  1420. /* Build keyword tables. */
  1421. field_htab = build_hash_table (operand_fields,
  1422. sizeof (operand_fields[0]));
  1423. for (i = 0; i < _HW_LAST; i++)
  1424. hw_ktabs[i] = build_hash_table (keywords[i], sizeof (keyword_t));
  1425. /* Build opcode table. */
  1426. opcode_htab = htab_create_alloc (128, htab_hash_hash, htab_hash_eq,
  1427. NULL, xcalloc, free);
  1428. for (i = 0; i < (int) ARRAY_SIZE (nds32_opcodes); i++)
  1429. {
  1430. struct nds32_opcode **slot;
  1431. struct nds32_opcode *opc;
  1432. opc = &nds32_opcodes[i];
  1433. if ((opc->opcode != NULL) && (opc->instruction != NULL))
  1434. {
  1435. hash = htab_hash_string (opc->opcode);
  1436. slot = (struct nds32_opcode **)
  1437. htab_find_slot_with_hash (opcode_htab, opc->opcode, hash, INSERT);
  1438. #define NDS32_PREINIT_SYNTAX
  1439. #if defined (NDS32_PREINIT_SYNTAX)
  1440. /* Initial SYNTAX when build opcode table, so bug in syntax can be
  1441. found when initialized rather than used. */
  1442. build_opcode_syntax (opc);
  1443. #endif
  1444. if (*slot == NULL)
  1445. {
  1446. /* This is the new one. */
  1447. *slot = opc;
  1448. }
  1449. else
  1450. {
  1451. /* Already exists. Append to the list. */
  1452. opc = *slot;
  1453. while (opc->next)
  1454. opc = opc->next;
  1455. opc->next = &nds32_opcodes[i];
  1456. }
  1457. }
  1458. }
  1459. }
  1460. /* Parse the input and store operand keyword string in ODSTR.
  1461. This function is only used for parsing keywords,
  1462. HW_INT/HW_UINT are parsed parse_operand callback handler. */
  1463. static char *
  1464. parse_to_delimiter (char *str, char odstr[MAX_KEYWORD_LEN])
  1465. {
  1466. char *outp = odstr;
  1467. while (ISALNUM (*str) || *str == '.' || *str == '_')
  1468. *outp++ = TOLOWER (*str++);
  1469. *outp = '\0';
  1470. return str;
  1471. }
  1472. /* Parse the operand of lmw/smw/lmwa/smwa. */
  1473. static int
  1474. parse_re (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1475. struct nds32_asm_insn *pinsn, char **pstr, int64_t *value)
  1476. {
  1477. char *end = *pstr;
  1478. char odstr[MAX_KEYWORD_LEN];
  1479. keyword_t *k;
  1480. hashval_t hash;
  1481. if (*end == '$')
  1482. end++;
  1483. end = parse_to_delimiter (end, odstr);
  1484. hash = htab_hash_string (odstr);
  1485. k = htab_find_with_hash (hw_ktabs[HW_GPR], odstr, hash);
  1486. if (k == NULL)
  1487. return NASM_ERR_OPERAND;
  1488. if (__GF (pinsn->insn, 20, 5) > (unsigned int) k->value)
  1489. return NASM_ERR_OPERAND;
  1490. *value = k->value;
  1491. *pstr = end;
  1492. return NASM_R_CONST;
  1493. }
  1494. /* Parse the operand of push25/pop25. */
  1495. static int
  1496. parse_re2 (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1497. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1498. char **pstr, int64_t *value)
  1499. {
  1500. char *end = *pstr;
  1501. char odstr[MAX_KEYWORD_LEN];
  1502. keyword_t *k;
  1503. hashval_t hash;
  1504. if (*end == '$')
  1505. end++;
  1506. end = parse_to_delimiter (end, odstr);
  1507. hash = htab_hash_string (odstr);
  1508. k = htab_find_with_hash (hw_ktabs[HW_GPR], odstr, hash);
  1509. if (k == NULL)
  1510. return NASM_ERR_OPERAND;
  1511. if (k->value == 6)
  1512. *value = 0;
  1513. else if (k->value == 8)
  1514. *value = 1;
  1515. else if (k->value == 10)
  1516. *value = 2;
  1517. else if (k->value == 14)
  1518. *value = 3;
  1519. else
  1520. return NASM_ERR_OPERAND;
  1521. *pstr = end;
  1522. return NASM_R_CONST;
  1523. }
  1524. /* Parse the operand of lwi45.fe. */
  1525. static int
  1526. parse_fe5 (struct nds32_asm_desc *pdesc, struct nds32_asm_insn *pinsn,
  1527. char **pstr, int64_t *value)
  1528. {
  1529. int r;
  1530. r = pdesc->parse_operand (pdesc, pinsn, pstr, value);
  1531. if (r != NASM_R_CONST)
  1532. return NASM_ERR_OPERAND;
  1533. /* 128 == 32 << 2. Leave the shift to parse_opreand,
  1534. so it can check whether it is a multiple of 4. */
  1535. *value = 128 + *value;
  1536. return r;
  1537. }
  1538. /* Parse the operand of movpi45. */
  1539. static int
  1540. parse_pi5 (struct nds32_asm_desc *pdesc, struct nds32_asm_insn *pinsn,
  1541. char **pstr, int64_t *value)
  1542. {
  1543. int r;
  1544. r = pdesc->parse_operand (pdesc, pinsn, pstr, value);
  1545. if (r != NASM_R_CONST)
  1546. return NASM_ERR_OPERAND;
  1547. *value -= 16;
  1548. return r;
  1549. }
  1550. static int aext_a30b20 = 0;
  1551. static int aext_rte = 0;
  1552. static int aext_im5_ip = 0;
  1553. static int aext_im6_ip = 0;
  1554. /* Parse the operand of audio ext. */
  1555. static int
  1556. parse_aext_reg (char **pstr, int *value, int hw_res)
  1557. {
  1558. char *end = *pstr;
  1559. char odstr[MAX_KEYWORD_LEN];
  1560. keyword_t *k;
  1561. hashval_t hash;
  1562. if (*end == '$')
  1563. end++;
  1564. end = parse_to_delimiter (end, odstr);
  1565. hash = htab_hash_string (odstr);
  1566. k = htab_find_with_hash (hw_ktabs[hw_res], odstr, hash);
  1567. if (k == NULL)
  1568. return NASM_ERR_OPERAND;
  1569. *value = k->value;
  1570. *pstr = end;
  1571. return NASM_R_CONST;
  1572. }
  1573. static int
  1574. parse_a30b20 (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1575. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1576. char **pstr, int64_t *value)
  1577. {
  1578. int rt_value, ret;
  1579. ret = parse_aext_reg (pstr, &rt_value, HW_GPR);
  1580. if ((ret == NASM_ERR_OPERAND) || (rt_value > 15))
  1581. return NASM_ERR_OPERAND;
  1582. *value = rt_value;
  1583. aext_a30b20 = rt_value;
  1584. return NASM_R_CONST;
  1585. }
  1586. static int
  1587. parse_rt21 (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1588. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1589. char **pstr, int64_t *value)
  1590. {
  1591. int rt_value, ret, tmp_value, tmp1, tmp2;
  1592. ret = parse_aext_reg (pstr, &rt_value, HW_GPR);
  1593. if ((ret == NASM_ERR_OPERAND) || (rt_value > 15))
  1594. return NASM_ERR_OPERAND;
  1595. tmp1 = (aext_a30b20 & 0x08);
  1596. tmp2 = (rt_value & 0x08);
  1597. if (tmp1 != tmp2)
  1598. return NASM_ERR_OPERAND;
  1599. /* Rt=CONCAT(c, t21, t0), t21:bit11-10, t0:bit5. */
  1600. tmp_value = (rt_value & 0x06) << 4;
  1601. tmp_value |= (rt_value & 0x01);
  1602. *value = tmp_value;
  1603. return NASM_R_CONST;
  1604. }
  1605. static int
  1606. parse_rte_start (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1607. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1608. char **pstr, int64_t *value)
  1609. {
  1610. int rt_value, ret, tmp1, tmp2;
  1611. ret = parse_aext_reg (pstr, &rt_value, HW_GPR);
  1612. if ((ret == NASM_ERR_OPERAND) || (rt_value > 15)
  1613. || (rt_value & 0x01))
  1614. return NASM_ERR_OPERAND;
  1615. tmp1 = (aext_a30b20 & 0x08);
  1616. tmp2 = (rt_value & 0x08);
  1617. if (tmp1 != tmp2)
  1618. return NASM_ERR_OPERAND;
  1619. aext_rte = rt_value;
  1620. /* Rt=CONCAT(c, t21, 0), t21:bit11-10. */
  1621. rt_value = (rt_value & 0x06) << 4;
  1622. *value = rt_value;
  1623. return NASM_R_CONST;
  1624. }
  1625. static int
  1626. parse_rte_end (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1627. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1628. char **pstr, int64_t *value)
  1629. {
  1630. int rt_value, ret, tmp1, tmp2;
  1631. ret = parse_aext_reg (pstr, &rt_value, HW_GPR);
  1632. if ((ret == NASM_ERR_OPERAND) || (rt_value > 15)
  1633. || ((rt_value & 0x01) == 0)
  1634. || (rt_value != (aext_rte + 1)))
  1635. return NASM_ERR_OPERAND;
  1636. tmp1 = (aext_a30b20 & 0x08);
  1637. tmp2 = (rt_value & 0x08);
  1638. if (tmp1 != tmp2)
  1639. return NASM_ERR_OPERAND;
  1640. /* Rt=CONCAT(c, t21, 0), t21:bit11-10. */
  1641. rt_value = (rt_value & 0x06) << 4;
  1642. *value = rt_value;
  1643. return NASM_R_CONST;
  1644. }
  1645. static int
  1646. parse_rte69_start (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1647. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1648. char **pstr, int64_t *value)
  1649. {
  1650. int rt_value, ret;
  1651. ret = parse_aext_reg (pstr, &rt_value, HW_GPR);
  1652. if ((ret == NASM_ERR_OPERAND)
  1653. || (rt_value & 0x01))
  1654. return NASM_ERR_OPERAND;
  1655. aext_rte = rt_value;
  1656. rt_value = (rt_value >> 1);
  1657. *value = rt_value;
  1658. return NASM_R_CONST;
  1659. }
  1660. static int
  1661. parse_rte69_end (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1662. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1663. char **pstr, int64_t *value)
  1664. {
  1665. int rt_value, ret;
  1666. ret = parse_aext_reg (pstr, &rt_value, HW_GPR);
  1667. if ((ret == NASM_ERR_OPERAND)
  1668. || ((rt_value & 0x01) == 0)
  1669. || (rt_value != (aext_rte + 1)))
  1670. return NASM_ERR_OPERAND;
  1671. aext_rte = rt_value;
  1672. rt_value = (rt_value >> 1);
  1673. *value = rt_value;
  1674. return NASM_R_CONST;
  1675. }
  1676. static int
  1677. parse_im5_ip (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1678. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1679. char **pstr, int64_t *value)
  1680. {
  1681. int rt_value, ret, new_value;
  1682. ret = parse_aext_reg (pstr, &rt_value, HW_AEXT_IM_I);
  1683. if (ret == NASM_ERR_OPERAND)
  1684. return NASM_ERR_OPERAND;
  1685. /* p = bit[4].bit[1:0], r = bit[4].bit[3:2]. */
  1686. new_value = (rt_value & 0x04) << 2;
  1687. new_value |= (rt_value & 0x03);
  1688. *value = new_value;
  1689. aext_im5_ip = new_value;
  1690. return NASM_R_CONST;
  1691. }
  1692. static int
  1693. parse_im5_mr (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1694. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1695. char **pstr, int64_t *value)
  1696. {
  1697. int rt_value, ret, new_value, tmp1, tmp2;
  1698. ret = parse_aext_reg (pstr, &rt_value, HW_AEXT_IM_M);
  1699. if (ret == NASM_ERR_OPERAND)
  1700. return NASM_ERR_OPERAND;
  1701. /* p = bit[4].bit[1:0], r = bit[4].bit[3:2]. */
  1702. new_value = (rt_value & 0x07) << 2;
  1703. tmp1 = (aext_im5_ip & 0x10);
  1704. tmp2 = (new_value & 0x10);
  1705. if (tmp1 != tmp2)
  1706. return NASM_ERR_OPERAND;
  1707. *value = new_value;
  1708. return NASM_R_CONST;
  1709. }
  1710. static int
  1711. parse_im6_ip (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1712. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1713. char **pstr, int64_t *value)
  1714. {
  1715. int rt_value, ret;
  1716. ret = parse_aext_reg (pstr, &rt_value, HW_AEXT_IM_I);
  1717. if ((ret == NASM_ERR_OPERAND) || (rt_value > 3))
  1718. return NASM_ERR_OPERAND;
  1719. /* p = 0.bit[1:0]. */
  1720. aext_im6_ip = rt_value;
  1721. *value = aext_im6_ip;
  1722. return NASM_R_CONST;
  1723. }
  1724. static int
  1725. parse_im6_iq (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1726. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1727. char **pstr, int64_t *value)
  1728. {
  1729. int rt_value, ret;
  1730. ret = parse_aext_reg (pstr, &rt_value, HW_AEXT_IM_I);
  1731. if ((ret == NASM_ERR_OPERAND) || (rt_value < 4))
  1732. return NASM_ERR_OPERAND;
  1733. /* q = 1.bit[1:0]. */
  1734. if ((rt_value & 0x03) != aext_im6_ip)
  1735. return NASM_ERR_OPERAND;
  1736. *value = aext_im6_ip;
  1737. return NASM_R_CONST;
  1738. }
  1739. static int
  1740. parse_im6_mr (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1741. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1742. char **pstr, int64_t *value)
  1743. {
  1744. int rt_value, ret;
  1745. ret = parse_aext_reg (pstr, &rt_value, HW_AEXT_IM_M);
  1746. if ((ret == NASM_ERR_OPERAND) || (rt_value > 3))
  1747. return NASM_ERR_OPERAND;
  1748. /* r = 0.bit[3:2]. */
  1749. *value = (rt_value & 0x03);
  1750. return NASM_R_CONST;
  1751. }
  1752. static int
  1753. parse_im6_ms (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED,
  1754. struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED,
  1755. char **pstr, int64_t *value)
  1756. {
  1757. int rt_value, ret;
  1758. ret = parse_aext_reg (pstr, &rt_value, HW_AEXT_IM_M);
  1759. if ((ret == NASM_ERR_OPERAND) || (rt_value < 4))
  1760. return NASM_ERR_OPERAND;
  1761. /* s = 1.bit[5:4]. */
  1762. *value = (rt_value & 0x03);
  1763. return NASM_R_CONST;
  1764. }
  1765. /* Generic operand parse base on the information provided by the field. */
  1766. static int
  1767. parse_operand (nds32_asm_desc_t *pdesc, nds32_asm_insn_t *pinsn,
  1768. char **str, int syn)
  1769. {
  1770. char odstr[MAX_KEYWORD_LEN];
  1771. char *end;
  1772. hashval_t hash;
  1773. const field_t *fld = &LEX_GET_FIELD (syn);
  1774. keyword_t *k;
  1775. int64_t value;
  1776. int r;
  1777. uint64_t modifier = 0;
  1778. end = *str;
  1779. if (fld->parse)
  1780. {
  1781. r = fld->parse (pdesc, pinsn, &end, &value);
  1782. if (r == NASM_ERR_OPERAND)
  1783. {
  1784. pdesc->result = NASM_ERR_OPERAND;
  1785. return 0;
  1786. }
  1787. goto done;
  1788. }
  1789. if (fld->hw_res < _HW_LAST)
  1790. {
  1791. /* Parse the operand in assembly code. */
  1792. if (*end == '$')
  1793. end++;
  1794. end = parse_to_delimiter (end, odstr);
  1795. hash = htab_hash_string (odstr);
  1796. k = htab_find_with_hash (hw_ktabs[fld->hw_res], odstr, hash);
  1797. if (k == NULL)
  1798. {
  1799. pdesc->result = NASM_ERR_OPERAND;
  1800. return 0;
  1801. }
  1802. if (fld->hw_res == HW_GPR && (pdesc->flags & NASM_OPEN_REDUCED_REG)
  1803. && (k->attr & ATTR (RDREG)) == 0)
  1804. {
  1805. /* Register not allowed in reduced register. */
  1806. pdesc->result = NASM_ERR_REG_REDUCED;
  1807. return 0;
  1808. }
  1809. if (fld->hw_res == HW_GPR)
  1810. {
  1811. if (syn & SYN_INPUT)
  1812. pinsn->defuse |= USE_REG (k->value);
  1813. if (syn & SYN_OUTPUT)
  1814. pinsn->defuse |= DEF_REG (k->value);
  1815. }
  1816. value = k->value;
  1817. if (fld->hw_res == HW_GPR && (fld->bitsize + fld->shift) == 4)
  1818. value = nds32_r54map[value];
  1819. }
  1820. else if (fld->hw_res == HW_INT || fld->hw_res == HW_UINT)
  1821. {
  1822. if (*end == '#')
  1823. end++;
  1824. /* Handle modifiers. Do we need to make a table for modifiers?
  1825. Do we need to check unknown modifier? */
  1826. if (strncasecmp (end, "hi20(", 5) == 0)
  1827. {
  1828. modifier |= NASM_ATTR_HI20;
  1829. end += 5;
  1830. }
  1831. else if (strncasecmp (end, "lo12(", 5) == 0)
  1832. {
  1833. modifier |= NASM_ATTR_LO12;
  1834. end += 5;
  1835. }
  1836. else if (strncasecmp (end, "lo20(", 5) == 0)
  1837. {
  1838. /* e.g., movi. */
  1839. modifier |= NASM_ATTR_LO20;
  1840. end += 5;
  1841. }
  1842. r = pdesc->parse_operand (pdesc, pinsn, &end, &value);
  1843. if (modifier)
  1844. {
  1845. /* Consume the ')' of modifier. */
  1846. end++;
  1847. pinsn->attr |= modifier;
  1848. }
  1849. switch (r)
  1850. {
  1851. case NASM_R_ILLEGAL:
  1852. pdesc->result = NASM_ERR_OPERAND;
  1853. return 0;
  1854. case NASM_R_SYMBOL:
  1855. /* This field needs special fix-up. */
  1856. pinsn->field = fld;
  1857. break;
  1858. case NASM_R_CONST:
  1859. if (modifier & NASM_ATTR_HI20)
  1860. value = (value >> 12) & 0xfffff;
  1861. else if (modifier & NASM_ATTR_LO12)
  1862. value = value & 0xfff;
  1863. else if (modifier & NASM_ATTR_LO20)
  1864. value = value & 0xfffff;
  1865. break;
  1866. default:
  1867. fprintf (stderr, "Internal error: Don't know how to handle "
  1868. "parsing results.\n");
  1869. abort ();
  1870. }
  1871. }
  1872. else
  1873. {
  1874. fprintf (stderr, "Internal error: Unknown hardware resource.\n");
  1875. abort ();
  1876. }
  1877. done:
  1878. /* Don't silently discarding bits. */
  1879. if (value & __MASK (fld->shift))
  1880. {
  1881. pdesc->result = NASM_ERR_OUT_OF_RANGE;
  1882. return 0;
  1883. }
  1884. /* Check the range of signed or unsigned result. */
  1885. if (fld->hw_res != HW_INT && ((int32_t) value >> (fld->bitsize + fld->shift)))
  1886. {
  1887. pdesc->result = NASM_ERR_OUT_OF_RANGE;
  1888. return 0;
  1889. }
  1890. else if (fld->hw_res == HW_INT)
  1891. {
  1892. /* Sign-ext the value. */
  1893. if (((value >> 32) == 0) && (value & 0x80000000))
  1894. value |= (int64_t) -1U << 31;
  1895. /* Shift the value to positive domain. */
  1896. if ((value + (1 << (fld->bitsize + fld->shift - 1)))
  1897. >> (fld->bitsize + fld->shift))
  1898. {
  1899. pdesc->result = NASM_ERR_OUT_OF_RANGE;
  1900. return 0;
  1901. }
  1902. }
  1903. pinsn->insn |=
  1904. (((value >> fld->shift) & __MASK (fld->bitsize)) << fld->bitpos);
  1905. *str = end;
  1906. return 1;
  1907. }
  1908. /* Try to parse an instruction string based on opcode syntax. */
  1909. static int
  1910. parse_insn (nds32_asm_desc_t *pdesc, nds32_asm_insn_t *pinsn,
  1911. char *str, struct nds32_opcode *opc)
  1912. {
  1913. int variant = 0;
  1914. char *p = NULL;
  1915. /* A syntax may has optional operands, so we have to try each possible
  1916. combination to see if the input is accepted. In order to do so,
  1917. bit-N represent whether optional-operand-N is used in this combination.
  1918. That is, if bit-N is set, optional-operand-N is not used.
  1919. For example, there are 2 optional operands in this syntax,
  1920. "a{,b}{,c}"
  1921. we can try it 4 times (i.e., 1 << 2)
  1922. 0 (b00): "a,b,c"
  1923. 1 (b01): "a,c"
  1924. 2 (b10): "a,b"
  1925. 3 (b11): "a"
  1926. */
  1927. /* The outer do-while loop is used to try each possible optional
  1928. operand combination, and VARIANT is the bit mask. The inner loop
  1929. iterates each lexeme in the syntax. */
  1930. do
  1931. {
  1932. /* OPT is the number of optional operands we've seen. */
  1933. int opt = 0;
  1934. lex_t *plex;
  1935. /* PLEX is the syntax iterator and P is the iterator for input
  1936. string. */
  1937. plex = opc->syntax;
  1938. p = str;
  1939. /* Initial the base value. */
  1940. pinsn->insn = opc->value;
  1941. while (*plex)
  1942. {
  1943. if (IS_LEX_CHAR (*plex))
  1944. {
  1945. /* If it's a plain char, just compare it. */
  1946. if (LEX_CHAR (*plex) != TOLOWER (*p))
  1947. {
  1948. if (LEX_CHAR (*plex) == '+' && TOLOWER (*p) == '-')
  1949. {
  1950. /* We don't define minus format for some signed
  1951. immediate case, so ignoring '+' here to parse
  1952. negative value eazily. Besides, the minus format
  1953. can not support for instruction with relocation.
  1954. Ex: lwi $r0, [$r0 + imm] */
  1955. plex++;
  1956. continue;
  1957. }
  1958. pdesc->result = NASM_ERR_SYNTAX;
  1959. goto reject;
  1960. }
  1961. p++;
  1962. }
  1963. else if (*plex & SYN_LOPT)
  1964. {
  1965. /* If it's '{' and it's not used in this iteration,
  1966. just skip the whole optional operand. */
  1967. if ((1 << (opt++)) & variant)
  1968. {
  1969. while ((*plex & SYN_ROPT) == 0)
  1970. plex++;
  1971. }
  1972. }
  1973. else if (*plex & SYN_ROPT)
  1974. {
  1975. /* ignore. */
  1976. }
  1977. else
  1978. {
  1979. /* If it's a operand, parse the input operand from input. */
  1980. if (!parse_operand (pdesc, pinsn, &p, *plex))
  1981. goto reject;
  1982. }
  1983. plex++;
  1984. }
  1985. /* Check whether this syntax is accepted. */
  1986. if (*plex == 0 && (*p == '\0' || *p == '!' || *p == '#'))
  1987. return 1;
  1988. reject:
  1989. /* If not accepted, try another combination. */
  1990. variant++;
  1991. }
  1992. while (variant < (1 << opc->variant));
  1993. return 0;
  1994. }
  1995. void
  1996. nds32_assemble (nds32_asm_desc_t *pdesc, nds32_asm_insn_t *pinsn,
  1997. char *str)
  1998. {
  1999. struct nds32_opcode *opc;
  2000. char *s;
  2001. char *mnemoic;
  2002. char *dot;
  2003. hashval_t hash;
  2004. /* Duplicate the string, so we can modify it for convenience. */
  2005. s = strdup (str);
  2006. mnemoic = s;
  2007. str = s;
  2008. /* Find opcode mnemoic. */
  2009. while (*s != ' ' && *s != '\t' && *s != '\0')
  2010. s++;
  2011. if (*s != '\0')
  2012. *s++ = '\0';
  2013. dot = strchr (mnemoic, '.');
  2014. retry_dot:
  2015. /* Lookup the opcode syntax. */
  2016. hash = htab_hash_string (mnemoic);
  2017. opc = (struct nds32_opcode *)
  2018. htab_find_with_hash (opcode_htab, mnemoic, hash);
  2019. /* If we cannot find a match syntax, try it again without `.'.
  2020. For example, try "lmw.adm" first and then try "lmw" again. */
  2021. if (opc == NULL && dot != NULL)
  2022. {
  2023. *dot = '\0';
  2024. s[-1] = ' ';
  2025. s = dot + 1;
  2026. dot = NULL;
  2027. goto retry_dot;
  2028. }
  2029. else if (opc == NULL)
  2030. {
  2031. pdesc->result = NASM_ERR_UNKNOWN_OP;
  2032. goto out;
  2033. }
  2034. /* There may be multiple syntaxes for a given opcode.
  2035. Try each one until a match is found. */
  2036. for (; opc; opc = opc->next)
  2037. {
  2038. /* Build opcode syntax, if it's not been initialized yet. */
  2039. if (opc->syntax == NULL)
  2040. build_opcode_syntax (opc);
  2041. /* Reset status before assemble. */
  2042. pinsn->defuse = opc->defuse;
  2043. pinsn->insn = 0;
  2044. pinsn->field = NULL;
  2045. /* Use opcode attributes to initial instruction attributes. */
  2046. pinsn->attr = opc->attr;
  2047. if (parse_insn (pdesc, pinsn, s, opc))
  2048. break;
  2049. }
  2050. pinsn->opcode = opc;
  2051. if (opc == NULL)
  2052. {
  2053. if (pdesc->result == NASM_OK)
  2054. pdesc->result = NASM_ERR_SYNTAX;
  2055. goto out;
  2056. }
  2057. /* A matched opcode is found. Write the result to instruction buffer. */
  2058. pdesc->result = NASM_OK;
  2059. out:
  2060. free (str);
  2061. }