lm32-opc.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851
  1. /* Instruction opcode table for lm32.
  2. THIS FILE IS MACHINE GENERATED WITH CGEN.
  3. Copyright (C) 1996-2017 Free Software Foundation, Inc.
  4. This file is part of the GNU Binutils and/or GDB, the GNU debugger.
  5. This file 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, or (at your option)
  8. any later version.
  9. It is distributed in the hope that it will be useful, but WITHOUT
  10. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
  12. License for more details.
  13. You should have received a copy of the GNU General Public License along
  14. with this program; if not, write to the Free Software Foundation, Inc.,
  15. 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
  16. */
  17. #include "sysdep.h"
  18. #include "ansidecl.h"
  19. #include "bfd.h"
  20. #include "symcat.h"
  21. #include "lm32-desc.h"
  22. #include "lm32-opc.h"
  23. #include "libiberty.h"
  24. /* The hash functions are recorded here to help keep assembler code out of
  25. the disassembler and vice versa. */
  26. static int asm_hash_insn_p (const CGEN_INSN *);
  27. static unsigned int asm_hash_insn (const char *);
  28. static int dis_hash_insn_p (const CGEN_INSN *);
  29. static unsigned int dis_hash_insn (const char *, CGEN_INSN_INT);
  30. /* Instruction formats. */
  31. #define F(f) & lm32_cgen_ifld_table[LM32_##f]
  32. static const CGEN_IFMT ifmt_empty ATTRIBUTE_UNUSED = {
  33. 0, 0, 0x0, { { 0 } }
  34. };
  35. static const CGEN_IFMT ifmt_add ATTRIBUTE_UNUSED = {
  36. 32, 32, 0xfc0007ff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } }
  37. };
  38. static const CGEN_IFMT ifmt_addi ATTRIBUTE_UNUSED = {
  39. 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
  40. };
  41. static const CGEN_IFMT ifmt_andi ATTRIBUTE_UNUSED = {
  42. 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } }
  43. };
  44. static const CGEN_IFMT ifmt_andhii ATTRIBUTE_UNUSED = {
  45. 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } }
  46. };
  47. static const CGEN_IFMT ifmt_b ATTRIBUTE_UNUSED = {
  48. 32, 32, 0xfc1fffff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } }
  49. };
  50. static const CGEN_IFMT ifmt_bi ATTRIBUTE_UNUSED = {
  51. 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_CALL) }, { 0 } }
  52. };
  53. static const CGEN_IFMT ifmt_be ATTRIBUTE_UNUSED = {
  54. 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_BRANCH) }, { 0 } }
  55. };
  56. static const CGEN_IFMT ifmt_ori ATTRIBUTE_UNUSED = {
  57. 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } }
  58. };
  59. static const CGEN_IFMT ifmt_rcsr ATTRIBUTE_UNUSED = {
  60. 32, 32, 0xfc1f07ff, { { F (F_OPCODE) }, { F (F_CSR) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } }
  61. };
  62. static const CGEN_IFMT ifmt_sextb ATTRIBUTE_UNUSED = {
  63. 32, 32, 0xfc1f07ff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } }
  64. };
  65. static const CGEN_IFMT ifmt_user ATTRIBUTE_UNUSED = {
  66. 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_USER) }, { 0 } }
  67. };
  68. static const CGEN_IFMT ifmt_wcsr ATTRIBUTE_UNUSED = {
  69. 32, 32, 0xfc00ffff, { { F (F_OPCODE) }, { F (F_CSR) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } }
  70. };
  71. static const CGEN_IFMT ifmt_break ATTRIBUTE_UNUSED = {
  72. 32, 32, 0xffffffff, { { F (F_OPCODE) }, { F (F_EXCEPTION) }, { 0 } }
  73. };
  74. static const CGEN_IFMT ifmt_bret ATTRIBUTE_UNUSED = {
  75. 32, 32, 0xffffffff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } }
  76. };
  77. static const CGEN_IFMT ifmt_mvi ATTRIBUTE_UNUSED = {
  78. 32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
  79. };
  80. static const CGEN_IFMT ifmt_mvui ATTRIBUTE_UNUSED = {
  81. 32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } }
  82. };
  83. static const CGEN_IFMT ifmt_mvhi ATTRIBUTE_UNUSED = {
  84. 32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } }
  85. };
  86. static const CGEN_IFMT ifmt_mva ATTRIBUTE_UNUSED = {
  87. 32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
  88. };
  89. static const CGEN_IFMT ifmt_nop ATTRIBUTE_UNUSED = {
  90. 32, 32, 0xffffffff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
  91. };
  92. static const CGEN_IFMT ifmt_lwgotrel ATTRIBUTE_UNUSED = {
  93. 32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
  94. };
  95. static const CGEN_IFMT ifmt_orhigotoffi ATTRIBUTE_UNUSED = {
  96. 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
  97. };
  98. static const CGEN_IFMT ifmt_addgotoff ATTRIBUTE_UNUSED = {
  99. 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
  100. };
  101. #undef F
  102. #define A(a) (1 << CGEN_INSN_##a)
  103. #define OPERAND(op) LM32_OPERAND_##op
  104. #define MNEM CGEN_SYNTAX_MNEMONIC /* syntax value for mnemonic */
  105. #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
  106. /* The instruction table. */
  107. static const CGEN_OPCODE lm32_cgen_insn_opcode_table[MAX_INSNS] =
  108. {
  109. /* Special null first entry.
  110. A `num' value of zero is thus invalid.
  111. Also, the special `invalid' insn resides here. */
  112. { { 0, 0, 0, 0 }, {{0}}, 0, {0}},
  113. /* add $r2,$r0,$r1 */
  114. {
  115. { 0, 0, 0, 0 },
  116. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  117. & ifmt_add, { 0xb4000000 }
  118. },
  119. /* addi $r1,$r0,$imm */
  120. {
  121. { 0, 0, 0, 0 },
  122. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
  123. & ifmt_addi, { 0x34000000 }
  124. },
  125. /* and $r2,$r0,$r1 */
  126. {
  127. { 0, 0, 0, 0 },
  128. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  129. & ifmt_add, { 0xa0000000 }
  130. },
  131. /* andi $r1,$r0,$uimm */
  132. {
  133. { 0, 0, 0, 0 },
  134. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } },
  135. & ifmt_andi, { 0x20000000 }
  136. },
  137. /* andhi $r1,$r0,$hi16 */
  138. {
  139. { 0, 0, 0, 0 },
  140. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (HI16), 0 } },
  141. & ifmt_andhii, { 0x60000000 }
  142. },
  143. /* b $r0 */
  144. {
  145. { 0, 0, 0, 0 },
  146. { { MNEM, ' ', OP (R0), 0 } },
  147. & ifmt_b, { 0xc0000000 }
  148. },
  149. /* bi $call */
  150. {
  151. { 0, 0, 0, 0 },
  152. { { MNEM, ' ', OP (CALL), 0 } },
  153. & ifmt_bi, { 0xe0000000 }
  154. },
  155. /* be $r0,$r1,$branch */
  156. {
  157. { 0, 0, 0, 0 },
  158. { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } },
  159. & ifmt_be, { 0x44000000 }
  160. },
  161. /* bg $r0,$r1,$branch */
  162. {
  163. { 0, 0, 0, 0 },
  164. { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } },
  165. & ifmt_be, { 0x48000000 }
  166. },
  167. /* bge $r0,$r1,$branch */
  168. {
  169. { 0, 0, 0, 0 },
  170. { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } },
  171. & ifmt_be, { 0x4c000000 }
  172. },
  173. /* bgeu $r0,$r1,$branch */
  174. {
  175. { 0, 0, 0, 0 },
  176. { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } },
  177. & ifmt_be, { 0x50000000 }
  178. },
  179. /* bgu $r0,$r1,$branch */
  180. {
  181. { 0, 0, 0, 0 },
  182. { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } },
  183. & ifmt_be, { 0x54000000 }
  184. },
  185. /* bne $r0,$r1,$branch */
  186. {
  187. { 0, 0, 0, 0 },
  188. { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } },
  189. & ifmt_be, { 0x5c000000 }
  190. },
  191. /* call $r0 */
  192. {
  193. { 0, 0, 0, 0 },
  194. { { MNEM, ' ', OP (R0), 0 } },
  195. & ifmt_b, { 0xd8000000 }
  196. },
  197. /* calli $call */
  198. {
  199. { 0, 0, 0, 0 },
  200. { { MNEM, ' ', OP (CALL), 0 } },
  201. & ifmt_bi, { 0xf8000000 }
  202. },
  203. /* cmpe $r2,$r0,$r1 */
  204. {
  205. { 0, 0, 0, 0 },
  206. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  207. & ifmt_add, { 0xe4000000 }
  208. },
  209. /* cmpei $r1,$r0,$imm */
  210. {
  211. { 0, 0, 0, 0 },
  212. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
  213. & ifmt_addi, { 0x64000000 }
  214. },
  215. /* cmpg $r2,$r0,$r1 */
  216. {
  217. { 0, 0, 0, 0 },
  218. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  219. & ifmt_add, { 0xe8000000 }
  220. },
  221. /* cmpgi $r1,$r0,$imm */
  222. {
  223. { 0, 0, 0, 0 },
  224. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
  225. & ifmt_addi, { 0x68000000 }
  226. },
  227. /* cmpge $r2,$r0,$r1 */
  228. {
  229. { 0, 0, 0, 0 },
  230. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  231. & ifmt_add, { 0xec000000 }
  232. },
  233. /* cmpgei $r1,$r0,$imm */
  234. {
  235. { 0, 0, 0, 0 },
  236. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
  237. & ifmt_addi, { 0x6c000000 }
  238. },
  239. /* cmpgeu $r2,$r0,$r1 */
  240. {
  241. { 0, 0, 0, 0 },
  242. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  243. & ifmt_add, { 0xf0000000 }
  244. },
  245. /* cmpgeui $r1,$r0,$uimm */
  246. {
  247. { 0, 0, 0, 0 },
  248. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } },
  249. & ifmt_andi, { 0x70000000 }
  250. },
  251. /* cmpgu $r2,$r0,$r1 */
  252. {
  253. { 0, 0, 0, 0 },
  254. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  255. & ifmt_add, { 0xf4000000 }
  256. },
  257. /* cmpgui $r1,$r0,$uimm */
  258. {
  259. { 0, 0, 0, 0 },
  260. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } },
  261. & ifmt_andi, { 0x74000000 }
  262. },
  263. /* cmpne $r2,$r0,$r1 */
  264. {
  265. { 0, 0, 0, 0 },
  266. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  267. & ifmt_add, { 0xfc000000 }
  268. },
  269. /* cmpnei $r1,$r0,$imm */
  270. {
  271. { 0, 0, 0, 0 },
  272. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
  273. & ifmt_addi, { 0x7c000000 }
  274. },
  275. /* divu $r2,$r0,$r1 */
  276. {
  277. { 0, 0, 0, 0 },
  278. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  279. & ifmt_add, { 0x8c000000 }
  280. },
  281. /* lb $r1,($r0+$imm) */
  282. {
  283. { 0, 0, 0, 0 },
  284. { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } },
  285. & ifmt_addi, { 0x10000000 }
  286. },
  287. /* lbu $r1,($r0+$imm) */
  288. {
  289. { 0, 0, 0, 0 },
  290. { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } },
  291. & ifmt_addi, { 0x40000000 }
  292. },
  293. /* lh $r1,($r0+$imm) */
  294. {
  295. { 0, 0, 0, 0 },
  296. { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } },
  297. & ifmt_addi, { 0x1c000000 }
  298. },
  299. /* lhu $r1,($r0+$imm) */
  300. {
  301. { 0, 0, 0, 0 },
  302. { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } },
  303. & ifmt_addi, { 0x2c000000 }
  304. },
  305. /* lw $r1,($r0+$imm) */
  306. {
  307. { 0, 0, 0, 0 },
  308. { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } },
  309. & ifmt_addi, { 0x28000000 }
  310. },
  311. /* modu $r2,$r0,$r1 */
  312. {
  313. { 0, 0, 0, 0 },
  314. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  315. & ifmt_add, { 0xc4000000 }
  316. },
  317. /* mul $r2,$r0,$r1 */
  318. {
  319. { 0, 0, 0, 0 },
  320. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  321. & ifmt_add, { 0x88000000 }
  322. },
  323. /* muli $r1,$r0,$imm */
  324. {
  325. { 0, 0, 0, 0 },
  326. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
  327. & ifmt_addi, { 0x8000000 }
  328. },
  329. /* nor $r2,$r0,$r1 */
  330. {
  331. { 0, 0, 0, 0 },
  332. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  333. & ifmt_add, { 0x84000000 }
  334. },
  335. /* nori $r1,$r0,$uimm */
  336. {
  337. { 0, 0, 0, 0 },
  338. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } },
  339. & ifmt_andi, { 0x4000000 }
  340. },
  341. /* or $r2,$r0,$r1 */
  342. {
  343. { 0, 0, 0, 0 },
  344. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  345. & ifmt_add, { 0xb8000000 }
  346. },
  347. /* ori $r1,$r0,$lo16 */
  348. {
  349. { 0, 0, 0, 0 },
  350. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (LO16), 0 } },
  351. & ifmt_ori, { 0x38000000 }
  352. },
  353. /* orhi $r1,$r0,$hi16 */
  354. {
  355. { 0, 0, 0, 0 },
  356. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (HI16), 0 } },
  357. & ifmt_andhii, { 0x78000000 }
  358. },
  359. /* rcsr $r2,$csr */
  360. {
  361. { 0, 0, 0, 0 },
  362. { { MNEM, ' ', OP (R2), ',', OP (CSR), 0 } },
  363. & ifmt_rcsr, { 0x90000000 }
  364. },
  365. /* sb ($r0+$imm),$r1 */
  366. {
  367. { 0, 0, 0, 0 },
  368. { { MNEM, ' ', '(', OP (R0), '+', OP (IMM), ')', ',', OP (R1), 0 } },
  369. & ifmt_addi, { 0x30000000 }
  370. },
  371. /* sextb $r2,$r0 */
  372. {
  373. { 0, 0, 0, 0 },
  374. { { MNEM, ' ', OP (R2), ',', OP (R0), 0 } },
  375. & ifmt_sextb, { 0xb0000000 }
  376. },
  377. /* sexth $r2,$r0 */
  378. {
  379. { 0, 0, 0, 0 },
  380. { { MNEM, ' ', OP (R2), ',', OP (R0), 0 } },
  381. & ifmt_sextb, { 0xdc000000 }
  382. },
  383. /* sh ($r0+$imm),$r1 */
  384. {
  385. { 0, 0, 0, 0 },
  386. { { MNEM, ' ', '(', OP (R0), '+', OP (IMM), ')', ',', OP (R1), 0 } },
  387. & ifmt_addi, { 0xc000000 }
  388. },
  389. /* sl $r2,$r0,$r1 */
  390. {
  391. { 0, 0, 0, 0 },
  392. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  393. & ifmt_add, { 0xbc000000 }
  394. },
  395. /* sli $r1,$r0,$imm */
  396. {
  397. { 0, 0, 0, 0 },
  398. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
  399. & ifmt_addi, { 0x3c000000 }
  400. },
  401. /* sr $r2,$r0,$r1 */
  402. {
  403. { 0, 0, 0, 0 },
  404. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  405. & ifmt_add, { 0x94000000 }
  406. },
  407. /* sri $r1,$r0,$imm */
  408. {
  409. { 0, 0, 0, 0 },
  410. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
  411. & ifmt_addi, { 0x14000000 }
  412. },
  413. /* sru $r2,$r0,$r1 */
  414. {
  415. { 0, 0, 0, 0 },
  416. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  417. & ifmt_add, { 0x80000000 }
  418. },
  419. /* srui $r1,$r0,$imm */
  420. {
  421. { 0, 0, 0, 0 },
  422. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
  423. & ifmt_addi, { 0x0 }
  424. },
  425. /* sub $r2,$r0,$r1 */
  426. {
  427. { 0, 0, 0, 0 },
  428. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  429. & ifmt_add, { 0xc8000000 }
  430. },
  431. /* sw ($r0+$imm),$r1 */
  432. {
  433. { 0, 0, 0, 0 },
  434. { { MNEM, ' ', '(', OP (R0), '+', OP (IMM), ')', ',', OP (R1), 0 } },
  435. & ifmt_addi, { 0x58000000 }
  436. },
  437. /* user $r2,$r0,$r1,$user */
  438. {
  439. { 0, 0, 0, 0 },
  440. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), ',', OP (USER), 0 } },
  441. & ifmt_user, { 0xcc000000 }
  442. },
  443. /* wcsr $csr,$r1 */
  444. {
  445. { 0, 0, 0, 0 },
  446. { { MNEM, ' ', OP (CSR), ',', OP (R1), 0 } },
  447. & ifmt_wcsr, { 0xd0000000 }
  448. },
  449. /* xor $r2,$r0,$r1 */
  450. {
  451. { 0, 0, 0, 0 },
  452. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  453. & ifmt_add, { 0x98000000 }
  454. },
  455. /* xori $r1,$r0,$uimm */
  456. {
  457. { 0, 0, 0, 0 },
  458. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } },
  459. & ifmt_andi, { 0x18000000 }
  460. },
  461. /* xnor $r2,$r0,$r1 */
  462. {
  463. { 0, 0, 0, 0 },
  464. { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
  465. & ifmt_add, { 0xa4000000 }
  466. },
  467. /* xnori $r1,$r0,$uimm */
  468. {
  469. { 0, 0, 0, 0 },
  470. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } },
  471. & ifmt_andi, { 0x24000000 }
  472. },
  473. /* break */
  474. {
  475. { 0, 0, 0, 0 },
  476. { { MNEM, 0 } },
  477. & ifmt_break, { 0xac000002 }
  478. },
  479. /* scall */
  480. {
  481. { 0, 0, 0, 0 },
  482. { { MNEM, 0 } },
  483. & ifmt_break, { 0xac000007 }
  484. },
  485. /* bret */
  486. {
  487. { 0, 0, 0, 0 },
  488. { { MNEM, 0 } },
  489. & ifmt_bret, { 0xc3e00000 }
  490. },
  491. /* eret */
  492. {
  493. { 0, 0, 0, 0 },
  494. { { MNEM, 0 } },
  495. & ifmt_bret, { 0xc3c00000 }
  496. },
  497. /* ret */
  498. {
  499. { 0, 0, 0, 0 },
  500. { { MNEM, 0 } },
  501. & ifmt_bret, { 0xc3a00000 }
  502. },
  503. /* mv $r2,$r0 */
  504. {
  505. { 0, 0, 0, 0 },
  506. { { MNEM, ' ', OP (R2), ',', OP (R0), 0 } },
  507. & ifmt_sextb, { 0xb8000000 }
  508. },
  509. /* mvi $r1,$imm */
  510. {
  511. { 0, 0, 0, 0 },
  512. { { MNEM, ' ', OP (R1), ',', OP (IMM), 0 } },
  513. & ifmt_mvi, { 0x34000000 }
  514. },
  515. /* mvu $r1,$lo16 */
  516. {
  517. { 0, 0, 0, 0 },
  518. { { MNEM, ' ', OP (R1), ',', OP (LO16), 0 } },
  519. & ifmt_mvui, { 0x38000000 }
  520. },
  521. /* mvhi $r1,$hi16 */
  522. {
  523. { 0, 0, 0, 0 },
  524. { { MNEM, ' ', OP (R1), ',', OP (HI16), 0 } },
  525. & ifmt_mvhi, { 0x78000000 }
  526. },
  527. /* mva $r1,$gp16 */
  528. {
  529. { 0, 0, 0, 0 },
  530. { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } },
  531. & ifmt_mva, { 0x37400000 }
  532. },
  533. /* not $r2,$r0 */
  534. {
  535. { 0, 0, 0, 0 },
  536. { { MNEM, ' ', OP (R2), ',', OP (R0), 0 } },
  537. & ifmt_sextb, { 0xa4000000 }
  538. },
  539. /* nop */
  540. {
  541. { 0, 0, 0, 0 },
  542. { { MNEM, 0 } },
  543. & ifmt_nop, { 0x34000000 }
  544. },
  545. /* lb $r1,$gp16 */
  546. {
  547. { 0, 0, 0, 0 },
  548. { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } },
  549. & ifmt_mva, { 0x13400000 }
  550. },
  551. /* lbu $r1,$gp16 */
  552. {
  553. { 0, 0, 0, 0 },
  554. { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } },
  555. & ifmt_mva, { 0x43400000 }
  556. },
  557. /* lh $r1,$gp16 */
  558. {
  559. { 0, 0, 0, 0 },
  560. { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } },
  561. & ifmt_mva, { 0x1f400000 }
  562. },
  563. /* lhu $r1,$gp16 */
  564. {
  565. { 0, 0, 0, 0 },
  566. { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } },
  567. & ifmt_mva, { 0x2f400000 }
  568. },
  569. /* lw $r1,$gp16 */
  570. {
  571. { 0, 0, 0, 0 },
  572. { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } },
  573. & ifmt_mva, { 0x2b400000 }
  574. },
  575. /* sb $gp16,$r1 */
  576. {
  577. { 0, 0, 0, 0 },
  578. { { MNEM, ' ', OP (GP16), ',', OP (R1), 0 } },
  579. & ifmt_mva, { 0x33400000 }
  580. },
  581. /* sh $gp16,$r1 */
  582. {
  583. { 0, 0, 0, 0 },
  584. { { MNEM, ' ', OP (GP16), ',', OP (R1), 0 } },
  585. & ifmt_mva, { 0xf400000 }
  586. },
  587. /* sw $gp16,$r1 */
  588. {
  589. { 0, 0, 0, 0 },
  590. { { MNEM, ' ', OP (GP16), ',', OP (R1), 0 } },
  591. & ifmt_mva, { 0x5b400000 }
  592. },
  593. /* lw $r1,(gp+$got16) */
  594. {
  595. { 0, 0, 0, 0 },
  596. { { MNEM, ' ', OP (R1), ',', '(', 'g', 'p', '+', OP (GOT16), ')', 0 } },
  597. & ifmt_lwgotrel, { 0x2b400000 }
  598. },
  599. /* orhi $r1,$r0,$gotoffhi16 */
  600. {
  601. { 0, 0, 0, 0 },
  602. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (GOTOFFHI16), 0 } },
  603. & ifmt_orhigotoffi, { 0x78000000 }
  604. },
  605. /* addi $r1,$r0,$gotofflo16 */
  606. {
  607. { 0, 0, 0, 0 },
  608. { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (GOTOFFLO16), 0 } },
  609. & ifmt_addgotoff, { 0x34000000 }
  610. },
  611. /* sw ($r0+$gotofflo16),$r1 */
  612. {
  613. { 0, 0, 0, 0 },
  614. { { MNEM, ' ', '(', OP (R0), '+', OP (GOTOFFLO16), ')', ',', OP (R1), 0 } },
  615. & ifmt_addgotoff, { 0x58000000 }
  616. },
  617. /* lw $r1,($r0+$gotofflo16) */
  618. {
  619. { 0, 0, 0, 0 },
  620. { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } },
  621. & ifmt_addgotoff, { 0x28000000 }
  622. },
  623. /* sh ($r0+$gotofflo16),$r1 */
  624. {
  625. { 0, 0, 0, 0 },
  626. { { MNEM, ' ', '(', OP (R0), '+', OP (GOTOFFLO16), ')', ',', OP (R1), 0 } },
  627. & ifmt_addgotoff, { 0xc000000 }
  628. },
  629. /* lh $r1,($r0+$gotofflo16) */
  630. {
  631. { 0, 0, 0, 0 },
  632. { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } },
  633. & ifmt_addgotoff, { 0x1c000000 }
  634. },
  635. /* lhu $r1,($r0+$gotofflo16) */
  636. {
  637. { 0, 0, 0, 0 },
  638. { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } },
  639. & ifmt_addgotoff, { 0x2c000000 }
  640. },
  641. /* sb ($r0+$gotofflo16),$r1 */
  642. {
  643. { 0, 0, 0, 0 },
  644. { { MNEM, ' ', '(', OP (R0), '+', OP (GOTOFFLO16), ')', ',', OP (R1), 0 } },
  645. & ifmt_addgotoff, { 0x30000000 }
  646. },
  647. /* lb $r1,($r0+$gotofflo16) */
  648. {
  649. { 0, 0, 0, 0 },
  650. { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } },
  651. & ifmt_addgotoff, { 0x10000000 }
  652. },
  653. /* lbu $r1,($r0+$gotofflo16) */
  654. {
  655. { 0, 0, 0, 0 },
  656. { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } },
  657. & ifmt_addgotoff, { 0x40000000 }
  658. },
  659. };
  660. #undef A
  661. #undef OPERAND
  662. #undef MNEM
  663. #undef OP
  664. /* Formats for ALIAS macro-insns. */
  665. #define F(f) & lm32_cgen_ifld_table[LM32_##f]
  666. #undef F
  667. /* Each non-simple macro entry points to an array of expansion possibilities. */
  668. #define A(a) (1 << CGEN_INSN_##a)
  669. #define OPERAND(op) LM32_OPERAND_##op
  670. #define MNEM CGEN_SYNTAX_MNEMONIC /* syntax value for mnemonic */
  671. #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
  672. /* The macro instruction table. */
  673. static const CGEN_IBASE lm32_cgen_macro_insn_table[] =
  674. {
  675. };
  676. /* The macro instruction opcode table. */
  677. static const CGEN_OPCODE lm32_cgen_macro_insn_opcode_table[] =
  678. {
  679. };
  680. #undef A
  681. #undef OPERAND
  682. #undef MNEM
  683. #undef OP
  684. #ifndef CGEN_ASM_HASH_P
  685. #define CGEN_ASM_HASH_P(insn) 1
  686. #endif
  687. #ifndef CGEN_DIS_HASH_P
  688. #define CGEN_DIS_HASH_P(insn) 1
  689. #endif
  690. /* Return non-zero if INSN is to be added to the hash table.
  691. Targets are free to override CGEN_{ASM,DIS}_HASH_P in the .opc file. */
  692. static int
  693. asm_hash_insn_p (const CGEN_INSN *insn ATTRIBUTE_UNUSED)
  694. {
  695. return CGEN_ASM_HASH_P (insn);
  696. }
  697. static int
  698. dis_hash_insn_p (const CGEN_INSN *insn)
  699. {
  700. /* If building the hash table and the NO-DIS attribute is present,
  701. ignore. */
  702. if (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_NO_DIS))
  703. return 0;
  704. return CGEN_DIS_HASH_P (insn);
  705. }
  706. #ifndef CGEN_ASM_HASH
  707. #define CGEN_ASM_HASH_SIZE 127
  708. #ifdef CGEN_MNEMONIC_OPERANDS
  709. #define CGEN_ASM_HASH(mnem) (*(unsigned char *) (mnem) % CGEN_ASM_HASH_SIZE)
  710. #else
  711. #define CGEN_ASM_HASH(mnem) (*(unsigned char *) (mnem) % CGEN_ASM_HASH_SIZE) /*FIXME*/
  712. #endif
  713. #endif
  714. /* It doesn't make much sense to provide a default here,
  715. but while this is under development we do.
  716. BUFFER is a pointer to the bytes of the insn, target order.
  717. VALUE is the first base_insn_bitsize bits as an int in host order. */
  718. #ifndef CGEN_DIS_HASH
  719. #define CGEN_DIS_HASH_SIZE 256
  720. #define CGEN_DIS_HASH(buf, value) (*(unsigned char *) (buf))
  721. #endif
  722. /* The result is the hash value of the insn.
  723. Targets are free to override CGEN_{ASM,DIS}_HASH in the .opc file. */
  724. static unsigned int
  725. asm_hash_insn (const char *mnem)
  726. {
  727. return CGEN_ASM_HASH (mnem);
  728. }
  729. /* BUF is a pointer to the bytes of the insn, target order.
  730. VALUE is the first base_insn_bitsize bits as an int in host order. */
  731. static unsigned int
  732. dis_hash_insn (const char *buf ATTRIBUTE_UNUSED,
  733. CGEN_INSN_INT value ATTRIBUTE_UNUSED)
  734. {
  735. return CGEN_DIS_HASH (buf, value);
  736. }
  737. /* Set the recorded length of the insn in the CGEN_FIELDS struct. */
  738. static void
  739. set_fields_bitsize (CGEN_FIELDS *fields, int size)
  740. {
  741. CGEN_FIELDS_BITSIZE (fields) = size;
  742. }
  743. /* Function to call before using the operand instance table.
  744. This plugs the opcode entries and macro instructions into the cpu table. */
  745. void
  746. lm32_cgen_init_opcode_table (CGEN_CPU_DESC cd)
  747. {
  748. int i;
  749. int num_macros = (sizeof (lm32_cgen_macro_insn_table) /
  750. sizeof (lm32_cgen_macro_insn_table[0]));
  751. const CGEN_IBASE *ib = & lm32_cgen_macro_insn_table[0];
  752. const CGEN_OPCODE *oc = & lm32_cgen_macro_insn_opcode_table[0];
  753. CGEN_INSN *insns = xmalloc (num_macros * sizeof (CGEN_INSN));
  754. /* This test has been added to avoid a warning generated
  755. if memset is called with a third argument of value zero. */
  756. if (num_macros >= 1)
  757. memset (insns, 0, num_macros * sizeof (CGEN_INSN));
  758. for (i = 0; i < num_macros; ++i)
  759. {
  760. insns[i].base = &ib[i];
  761. insns[i].opcode = &oc[i];
  762. lm32_cgen_build_insn_regex (& insns[i]);
  763. }
  764. cd->macro_insn_table.init_entries = insns;
  765. cd->macro_insn_table.entry_size = sizeof (CGEN_IBASE);
  766. cd->macro_insn_table.num_init_entries = num_macros;
  767. oc = & lm32_cgen_insn_opcode_table[0];
  768. insns = (CGEN_INSN *) cd->insn_table.init_entries;
  769. for (i = 0; i < MAX_INSNS; ++i)
  770. {
  771. insns[i].opcode = &oc[i];
  772. lm32_cgen_build_insn_regex (& insns[i]);
  773. }
  774. cd->sizeof_fields = sizeof (CGEN_FIELDS);
  775. cd->set_fields_bitsize = set_fields_bitsize;
  776. cd->asm_hash_p = asm_hash_insn_p;
  777. cd->asm_hash = asm_hash_insn;
  778. cd->asm_hash_size = CGEN_ASM_HASH_SIZE;
  779. cd->dis_hash_p = dis_hash_insn_p;
  780. cd->dis_hash = dis_hash_insn;
  781. cd->dis_hash_size = CGEN_DIS_HASH_SIZE;
  782. }