PageRenderTime 64ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 2ms

/mingw-w64-v2.0.999/binutils/src/gas/config/tc-score.c

#
C | 7836 lines | 6458 code | 908 blank | 470 comment | 2126 complexity | 7adf69ea0a3da2cdbcb9cd17f1ce3ffe MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-1.0, LGPL-3.0, Unlicense, GPL-2.0, LGPL-2.0, BSD-3-Clause, GPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. /* tc-score.c -- Assembler for Score
  2. Copyright 2006, 2007, 2008, 2009, 2011, 2012 Free Software Foundation, Inc.
  3. Contributed by:
  4. Brain.lin (brain.lin@sunplusct.com)
  5. Mei Ligang (ligang@sunnorth.com.cn)
  6. Pei-Lin Tsai (pltsai@sunplus.com)
  7. This file is part of GAS, the GNU Assembler.
  8. GAS is free software; you can redistribute it and/or modify
  9. it under the terms of the GNU General Public License as published by
  10. the Free Software Foundation; either version 3, or (at your option)
  11. any later version.
  12. GAS is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. GNU General Public License for more details.
  16. You should have received a copy of the GNU General Public License
  17. along with GAS; see the file COPYING. If not, write to the Free
  18. Software Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
  19. 02110-1301, USA. */
  20. #include "tc-score7.c"
  21. static void s3_s_score_bss (int ignore ATTRIBUTE_UNUSED);
  22. static void s3_s_score_text (int ignore);
  23. static void s3_score_s_section (int ignore);
  24. static void s3_s_change_sec (int sec);
  25. static void s3_s_score_mask (int reg_type ATTRIBUTE_UNUSED);
  26. static void s3_s_score_ent (int aent);
  27. static void s3_s_score_frame (int ignore ATTRIBUTE_UNUSED);
  28. static void s3_s_score_end (int x ATTRIBUTE_UNUSED);
  29. static void s3_s_score_set (int x ATTRIBUTE_UNUSED);
  30. static void s3_s_score_cpload (int ignore ATTRIBUTE_UNUSED);
  31. static void s3_s_score_cprestore (int ignore ATTRIBUTE_UNUSED);
  32. static void s3_s_score_gpword (int ignore ATTRIBUTE_UNUSED);
  33. static void s3_s_score_cpadd (int ignore ATTRIBUTE_UNUSED);
  34. static void s3_s_score_lcomm (int bytes_p);
  35. static void s_score_bss (int ignore ATTRIBUTE_UNUSED);
  36. static void s_score_text (int ignore);
  37. static void s_section (int ignore);
  38. static void s_change_sec (int sec);
  39. static void s_score_mask (int reg_type ATTRIBUTE_UNUSED);
  40. static void s_score_ent (int aent);
  41. static void s_score_frame (int ignore ATTRIBUTE_UNUSED);
  42. static void s_score_end (int x ATTRIBUTE_UNUSED);
  43. static void s_score_set (int x ATTRIBUTE_UNUSED);
  44. static void s_score_cpload (int ignore ATTRIBUTE_UNUSED);
  45. static void s_score_cprestore (int ignore ATTRIBUTE_UNUSED);
  46. static void s_score_gpword (int ignore ATTRIBUTE_UNUSED);
  47. static void s_score_cpadd (int ignore ATTRIBUTE_UNUSED);
  48. static void s_score_lcomm (int bytes_p);
  49. /* s3: hooks. */
  50. static void s3_md_number_to_chars (char *buf, valueT val, int n);
  51. static valueT s3_md_chars_to_number (char *buf, int n);
  52. static void s3_assemble (char *str);
  53. static void s3_operand (expressionS *);
  54. static void s3_begin (void);
  55. static void s3_number_to_chars (char *buf, valueT val, int n);
  56. static char *s3_atof (int type, char *litP, int *sizeP);
  57. static void s3_frag_check (fragS * fragp ATTRIBUTE_UNUSED);
  58. static void s3_validate_fix (fixS *fixP);
  59. static int s3_force_relocation (struct fix *fixp);
  60. static bfd_boolean s3_fix_adjustable (fixS * fixP);
  61. static void s3_elf_final_processing (void);
  62. static int s3_estimate_size_before_relax (fragS * fragp, asection * sec ATTRIBUTE_UNUSED);
  63. static int s3_relax_frag (asection * sec ATTRIBUTE_UNUSED, fragS * fragp, long stretch ATTRIBUTE_UNUSED);
  64. static void s3_convert_frag (bfd * abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED, fragS * fragp);
  65. static long s3_pcrel_from (fixS * fixP);
  66. static valueT s3_section_align (segT segment ATTRIBUTE_UNUSED, valueT size);
  67. static void s3_apply_fix (fixS *fixP, valueT *valP, segT seg);
  68. static arelent **s3_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp);
  69. /* s3: utils. */
  70. static void s3_do_ldst_insn (char *);
  71. static void s3_do_crdcrscrsimm5 (char *);
  72. static void s3_do_ldst_unalign (char *);
  73. static void s3_do_ldst_atomic (char *);
  74. static void s3_do_ldst_cop (char *);
  75. static void s3_do_macro_li_rdi32 (char *);
  76. static void s3_do_macro_la_rdi32 (char *);
  77. static void s3_do_macro_rdi32hi (char *);
  78. static void s3_do_macro_rdi32lo (char *);
  79. static void s3_do_macro_mul_rdrsrs (char *);
  80. static void s3_do_macro_bcmp (char *);
  81. static void s3_do_macro_bcmpz (char *);
  82. static void s3_do_macro_ldst_label (char *);
  83. static void s3_do_branch (char *);
  84. static void s3_do_jump (char *);
  85. static void s3_do_empty (char *);
  86. static void s3_do16_int (char *);
  87. static void s3_do_rdrsrs (char *);
  88. static void s3_do_rdsi16 (char *);
  89. static void s3_do_rdrssi14 (char *);
  90. static void s3_do_sub_rdsi16 (char *);
  91. static void s3_do_sub_rdi16 (char *);
  92. static void s3_do_sub_rdrssi14 (char *);
  93. static void s3_do_rdrsi5 (char *);
  94. static void s3_do_rdrsi14 (char *);
  95. static void s3_do_rdi16 (char *);
  96. static void s3_do_ldis (char *);
  97. static void s3_do_xrsi5 (char *);
  98. static void s3_do_rdrs (char *);
  99. static void s3_do_rdxrs (char *);
  100. static void s3_do_rsrs (char *);
  101. static void s3_do_rdcrs (char *);
  102. static void s3_do_rdsrs (char *);
  103. static void s3_do_rd (char *);
  104. static void s3_do16_dsp (char *);
  105. static void s3_do16_dsp2 (char *);
  106. static void s3_do_dsp (char *);
  107. static void s3_do_dsp2 (char *);
  108. static void s3_do_dsp3 (char *);
  109. static void s3_do_rs (char *);
  110. static void s3_do_i15 (char *);
  111. static void s3_do_xi5x (char *);
  112. static void s3_do_ceinst (char *);
  113. static void s3_do_cache (char *);
  114. static void s3_do16_rdrs2 (char *);
  115. static void s3_do16_br (char *);
  116. static void s3_do16_brr (char *);
  117. static void s3_do_ltb (char *);
  118. static void s3_do16_mv_cmp (char *);
  119. static void s3_do16_addi (char *);
  120. static void s3_do16_cmpi (char *);
  121. static void s3_do16_rdi5 (char *);
  122. static void s3_do16_xi5 (char *);
  123. static void s3_do16_ldst_insn (char *);
  124. static void s3_do16_slli_srli (char *);
  125. static void s3_do16_ldiu (char *);
  126. static void s3_do16_push_pop (char *);
  127. static void s3_do16_rpush (char *);
  128. static void s3_do16_rpop (char *);
  129. static void s3_do16_branch (char *);
  130. static void s3_do_lw48 (char *);
  131. static void s3_do_sw48 (char *);
  132. static void s3_do_ldi48 (char *);
  133. static void s3_do_sdbbp48 (char *);
  134. static void s3_do_and48 (char *);
  135. static void s3_do_or48 (char *);
  136. static void s3_do_mbitclr (char *);
  137. static void s3_do_mbitset (char *);
  138. static void s3_do_rdi16_pic (char *);
  139. static void s3_do_addi_s_pic (char *);
  140. static void s3_do_addi_u_pic (char *);
  141. static void s3_do_lw_pic (char *);
  142. #define MARCH_SCORE3 "score3"
  143. #define MARCH_SCORE3D "score3d"
  144. #define MARCH_SCORE7 "score7"
  145. #define MARCH_SCORE7D "score7d"
  146. #define MARCH_SCORE5 "score5"
  147. #define MARCH_SCORE5U "score5u"
  148. #define SCORE_BI_ENDIAN
  149. #ifdef SCORE_BI_ENDIAN
  150. #define OPTION_EB (OPTION_MD_BASE + 0)
  151. #define OPTION_EL (OPTION_MD_BASE + 1)
  152. #else
  153. #if TARGET_BYTES_BIG_ENDIAN
  154. #define OPTION_EB (OPTION_MD_BASE + 0)
  155. #else
  156. #define OPTION_EL (OPTION_MD_BASE + 1)
  157. #endif
  158. #endif
  159. #define OPTION_FIXDD (OPTION_MD_BASE + 2)
  160. #define OPTION_NWARN (OPTION_MD_BASE + 3)
  161. #define OPTION_SCORE5 (OPTION_MD_BASE + 4)
  162. #define OPTION_SCORE5U (OPTION_MD_BASE + 5)
  163. #define OPTION_SCORE7 (OPTION_MD_BASE + 6)
  164. #define OPTION_R1 (OPTION_MD_BASE + 7)
  165. #define OPTION_O0 (OPTION_MD_BASE + 8)
  166. #define OPTION_SCORE_VERSION (OPTION_MD_BASE + 9)
  167. #define OPTION_PIC (OPTION_MD_BASE + 10)
  168. #define OPTION_MARCH (OPTION_MD_BASE + 11)
  169. #define OPTION_SCORE3 (OPTION_MD_BASE + 12)
  170. /* This array holds the chars that always start a comment. If the
  171. pre-processor is disabled, these aren't very useful. */
  172. const char comment_chars[] = "#";
  173. const char line_comment_chars[] = "#";
  174. const char line_separator_chars[] = ";";
  175. /* Chars that can be used to separate mant from exp in floating point numbers. */
  176. const char EXP_CHARS[] = "eE";
  177. const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
  178. #ifdef OBJ_ELF
  179. /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
  180. symbolS *GOT_symbol;
  181. #endif
  182. const pseudo_typeS md_pseudo_table[] =
  183. {
  184. {"bss", s_score_bss, 0},
  185. {"text", s_score_text, 0},
  186. {"word", cons, 4},
  187. {"long", cons, 4},
  188. {"extend", float_cons, 'x'},
  189. {"ldouble", float_cons, 'x'},
  190. {"packed", float_cons, 'p'},
  191. {"end", s_score_end, 0},
  192. {"ent", s_score_ent, 0},
  193. {"frame", s_score_frame, 0},
  194. {"rdata", s_change_sec, 'r'},
  195. {"sdata", s_change_sec, 's'},
  196. {"set", s_score_set, 0},
  197. {"mask", s_score_mask, 'R'},
  198. {"dword", cons, 8},
  199. {"lcomm", s_score_lcomm, 1},
  200. {"section", s_section, 0},
  201. {"cpload", s_score_cpload, 0},
  202. {"cprestore", s_score_cprestore, 0},
  203. {"gpword", s_score_gpword, 0},
  204. {"cpadd", s_score_cpadd, 0},
  205. {0, 0, 0}
  206. };
  207. const char *md_shortopts = "nO::g::G:";
  208. struct option md_longopts[] =
  209. {
  210. #ifdef OPTION_EB
  211. {"EB" , no_argument, NULL, OPTION_EB},
  212. #endif
  213. #ifdef OPTION_EL
  214. {"EL" , no_argument, NULL, OPTION_EL},
  215. #endif
  216. {"FIXDD" , no_argument, NULL, OPTION_FIXDD},
  217. {"NWARN" , no_argument, NULL, OPTION_NWARN},
  218. {"SCORE5" , no_argument, NULL, OPTION_SCORE5},
  219. {"SCORE5U", no_argument, NULL, OPTION_SCORE5U},
  220. {"SCORE7" , no_argument, NULL, OPTION_SCORE7},
  221. {"USE_R1" , no_argument, NULL, OPTION_R1},
  222. {"O0" , no_argument, NULL, OPTION_O0},
  223. {"V" , no_argument, NULL, OPTION_SCORE_VERSION},
  224. {"KPIC" , no_argument, NULL, OPTION_PIC},
  225. {"march=" , required_argument, NULL, OPTION_MARCH},
  226. {"SCORE3" , no_argument, NULL, OPTION_SCORE3},
  227. {NULL , no_argument, NULL, 0}
  228. };
  229. size_t md_longopts_size = sizeof (md_longopts);
  230. #define s3_GP 28
  231. #define s3_PIC_CALL_REG 29
  232. #define s3_MAX_LITERAL_POOL_SIZE 1024
  233. #define s3_FAIL 0x80000000
  234. #define s3_SUCCESS 0
  235. #define s3_INSN48_SIZE 6
  236. #define s3_INSN_SIZE 4
  237. #define s3_INSN16_SIZE 2
  238. #define s3_RELAX_INST_NUM 3
  239. /* For score5u : div/mul will pop warning message, mmu/alw/asw will pop error message. */
  240. #define s3_BAD_ARGS _("bad arguments to instruction")
  241. #define s3_ERR_FOR_SCORE5U_MUL_DIV _("div / mul are reserved instructions")
  242. #define s3_ERR_FOR_SCORE5U_MMU _("This architecture doesn't support mmu")
  243. #define s3_ERR_FOR_SCORE5U_ATOMIC _("This architecture doesn't support atomic instruction")
  244. #define s3_BAD_SKIP_COMMA s3_BAD_ARGS
  245. #define s3_BAD_GARBAGE _("garbage following instruction");
  246. #define s3_skip_whitespace(str) while (*(str) == ' ') ++(str)
  247. /* The name of the readonly data section. */
  248. #define s3_RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_aout_flavour \
  249. ? ".data" \
  250. : OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
  251. ? ".rdata" \
  252. : OUTPUT_FLAVOR == bfd_target_coff_flavour \
  253. ? ".rdata" \
  254. : OUTPUT_FLAVOR == bfd_target_elf_flavour \
  255. ? ".rodata" \
  256. : (abort (), ""))
  257. #define s3_RELAX_ENCODE(old, new, type, reloc1, reloc2, opt) \
  258. ((relax_substateT) \
  259. (((old) << 23) \
  260. | ((new) << 16) \
  261. | ((type) << 9) \
  262. | ((reloc1) << 5) \
  263. | ((reloc2) << 1) \
  264. | ((opt) ? 1 : 0)))
  265. #define s3_RELAX_OLD(i) (((i) >> 23) & 0x7f)
  266. #define s3_RELAX_NEW(i) (((i) >> 16) & 0x7f)
  267. #define s3_RELAX_TYPE(i) (((i) >> 9) & 0x7f)
  268. #define s3_RELAX_RELOC1(i) ((valueT) ((i) >> 5) & 0xf)
  269. #define s3_RELAX_RELOC2(i) ((valueT) ((i) >> 1) & 0xf)
  270. #define s3_RELAX_OPT(i) ((i) & 1)
  271. #define s3_SET_INSN_ERROR(s) (s3_inst.error = (s))
  272. #define s3_INSN_IS_PCE_P(s) (strstr (str, "||") != NULL)
  273. #define s3_INSN_IS_48_P(s) (strstr (str, "48") != NULL)
  274. #define s3_GET_INSN_CLASS(type) (s3_get_insn_class_from_type (type))
  275. #define s3_GET_INSN_SIZE(type) ((s3_GET_INSN_CLASS (type) == INSN_CLASS_16) \
  276. ? s3_INSN16_SIZE : (s3_GET_INSN_CLASS (type) == INSN_CLASS_48) \
  277. ? s3_INSN48_SIZE : s3_INSN_SIZE)
  278. #define s3_MAX_LITTLENUMS 6
  279. #define s3_INSN_NAME_LEN 16
  280. /* Relax will need some padding for alignment. */
  281. #define s3_RELAX_PAD_BYTE 3
  282. #define s3_USE_GLOBAL_POINTER_OPT 1
  283. /* Enumeration matching entries in table above. */
  284. enum s3_score_reg_type
  285. {
  286. s3_REG_TYPE_SCORE = 0,
  287. #define s3_REG_TYPE_FIRST s3_REG_TYPE_SCORE
  288. s3_REG_TYPE_SCORE_SR = 1,
  289. s3_REG_TYPE_SCORE_CR = 2,
  290. s3_REG_TYPE_MAX = 3
  291. };
  292. enum s3_score_pic_level
  293. {
  294. s3_NO_PIC,
  295. s3_PIC
  296. };
  297. static enum s3_score_pic_level s3_score_pic = s3_NO_PIC;
  298. enum s3_insn_type_for_dependency
  299. {
  300. s3_D_mtcr,
  301. s3_D_all_insn
  302. };
  303. struct s3_insn_to_dependency
  304. {
  305. char *insn_name;
  306. enum s3_insn_type_for_dependency type;
  307. };
  308. struct s3_data_dependency
  309. {
  310. enum s3_insn_type_for_dependency pre_insn_type;
  311. char pre_reg[6];
  312. enum s3_insn_type_for_dependency cur_insn_type;
  313. char cur_reg[6];
  314. int bubblenum_7;
  315. int bubblenum_3;
  316. int warn_or_error; /* warning - 0; error - 1 */
  317. };
  318. static const struct s3_insn_to_dependency s3_insn_to_dependency_table[] =
  319. {
  320. /* move spectial instruction. */
  321. {"mtcr", s3_D_mtcr},
  322. };
  323. static const struct s3_data_dependency s3_data_dependency_table[] =
  324. {
  325. /* Status regiser. */
  326. {s3_D_mtcr, "cr0", s3_D_all_insn, "", 5, 1, 0},
  327. };
  328. /* Used to contain constructed error messages. */
  329. static char s3_err_msg[255];
  330. static int s3_fix_data_dependency = 0;
  331. static int s3_warn_fix_data_dependency = 1;
  332. static int s3_in_my_get_expression = 0;
  333. /* Default, pop warning message when using r1. */
  334. static int s3_nor1 = 1;
  335. /* Default will do instruction relax, -O0 will set s3_g_opt = 0. */
  336. static unsigned int s3_g_opt = 1;
  337. /* The size of the small data section. */
  338. static unsigned int s3_g_switch_value = 8;
  339. static segT s3_pdr_seg;
  340. struct s3_score_it
  341. {
  342. char name[s3_INSN_NAME_LEN];
  343. bfd_vma instruction;
  344. bfd_vma relax_inst;
  345. int size;
  346. int relax_size;
  347. enum score_insn_type type;
  348. char str[s3_MAX_LITERAL_POOL_SIZE];
  349. const char *error;
  350. int bwarn;
  351. char reg[s3_INSN_NAME_LEN];
  352. struct
  353. {
  354. bfd_reloc_code_real_type type;
  355. expressionS exp;
  356. int pc_rel;
  357. }reloc;
  358. };
  359. static struct s3_score_it s3_inst;
  360. typedef struct s3_proc
  361. {
  362. symbolS *isym;
  363. unsigned long reg_mask;
  364. unsigned long reg_offset;
  365. unsigned long fpreg_mask;
  366. unsigned long leaf;
  367. unsigned long frame_offset;
  368. unsigned long frame_reg;
  369. unsigned long pc_reg;
  370. } s3_procS;
  371. static s3_procS s3_cur_proc;
  372. static s3_procS *s3_cur_proc_ptr;
  373. static int s3_numprocs;
  374. /* Structure for a hash table entry for a register. */
  375. struct s3_reg_entry
  376. {
  377. const char *name;
  378. int number;
  379. };
  380. static const struct s3_reg_entry s3_score_rn_table[] =
  381. {
  382. {"r0", 0}, {"r1", 1}, {"r2", 2}, {"r3", 3},
  383. {"r4", 4}, {"r5", 5}, {"r6", 6}, {"r7", 7},
  384. {"r8", 8}, {"r9", 9}, {"r10", 10}, {"r11", 11},
  385. {"r12", 12}, {"r13", 13}, {"r14", 14}, {"r15", 15},
  386. {"r16", 16}, {"r17", 17}, {"r18", 18}, {"r19", 19},
  387. {"r20", 20}, {"r21", 21}, {"r22", 22}, {"r23", 23},
  388. {"r24", 24}, {"r25", 25}, {"r26", 26}, {"r27", 27},
  389. {"r28", 28}, {"r29", 29}, {"r30", 30}, {"r31", 31},
  390. {NULL, 0}
  391. };
  392. static const struct s3_reg_entry s3_score_srn_table[] =
  393. {
  394. {"sr0", 0}, {"sr1", 1}, {"sr2", 2},
  395. {NULL, 0}
  396. };
  397. static const struct s3_reg_entry s3_score_crn_table[] =
  398. {
  399. {"cr0", 0}, {"cr1", 1}, {"cr2", 2}, {"cr3", 3},
  400. {"cr4", 4}, {"cr5", 5}, {"cr6", 6}, {"cr7", 7},
  401. {"cr8", 8}, {"cr9", 9}, {"cr10", 10}, {"cr11", 11},
  402. {"cr12", 12}, {"cr13", 13}, {"cr14", 14}, {"cr15", 15},
  403. {"cr16", 16}, {"cr17", 17}, {"cr18", 18}, {"cr19", 19},
  404. {"cr20", 20}, {"cr21", 21}, {"cr22", 22}, {"cr23", 23},
  405. {"cr24", 24}, {"cr25", 25}, {"cr26", 26}, {"cr27", 27},
  406. {"cr28", 28}, {"cr29", 29}, {"cr30", 30}, {"cr31", 31},
  407. {NULL, 0}
  408. };
  409. struct s3_reg_map
  410. {
  411. const struct s3_reg_entry *names;
  412. int max_regno;
  413. struct hash_control *htab;
  414. const char *expected;
  415. };
  416. static struct s3_reg_map s3_all_reg_maps[] =
  417. {
  418. {s3_score_rn_table, 31, NULL, N_("S+core register expected")},
  419. {s3_score_srn_table, 2, NULL, N_("S+core special-register expected")},
  420. {s3_score_crn_table, 31, NULL, N_("S+core co-processor register expected")},
  421. };
  422. static struct hash_control *s3_score_ops_hsh = NULL;
  423. static struct hash_control *s3_dependency_insn_hsh = NULL;
  424. struct s3_datafield_range
  425. {
  426. int data_type;
  427. int bits;
  428. int range[2];
  429. };
  430. static struct s3_datafield_range s3_score_df_range[] =
  431. {
  432. {_IMM4, 4, {0, (1 << 4) - 1}}, /* ( 0 ~ 15 ) */
  433. {_IMM5, 5, {0, (1 << 5) - 1}}, /* ( 0 ~ 31 ) */
  434. {_IMM8, 8, {0, (1 << 8) - 1}}, /* ( 0 ~ 255 ) */
  435. {_IMM14, 14, {0, (1 << 14) - 1}}, /* ( 0 ~ 16383) */
  436. {_IMM15, 15, {0, (1 << 15) - 1}}, /* ( 0 ~ 32767) */
  437. {_IMM16, 16, {0, (1 << 16) - 1}}, /* ( 0 ~ 65535) */
  438. {_SIMM10, 10, {-(1 << 9), (1 << 9) - 1}}, /* ( -512 ~ 511 ) */
  439. {_SIMM12, 12, {-(1 << 11), (1 << 11) - 1}}, /* ( -2048 ~ 2047 ) */
  440. {_SIMM14, 14, {-(1 << 13), (1 << 13) - 1}}, /* ( -8192 ~ 8191 ) */
  441. {_SIMM15, 15, {-(1 << 14), (1 << 14) - 1}}, /* (-16384 ~ 16383) */
  442. {_SIMM16, 16, {-(1 << 15), (1 << 15) - 1}}, /* (-32768 ~ 32767) */
  443. {_SIMM14_NEG, 14, {-(1 << 13), (1 << 13) - 1}}, /* ( -8191 ~ 8192 ) */
  444. {_IMM16_NEG, 16, {0, (1 << 16) - 1}}, /* (-65535 ~ 0 ) */
  445. {_SIMM16_NEG, 16, {-(1 << 15), (1 << 15) - 1}}, /* (-32768 ~ 32767) */
  446. {_IMM20, 20, {0, (1 << 20) - 1}},
  447. {_IMM25, 25, {0, (1 << 25) - 1}},
  448. {_DISP8div2, 8, {-(1 << 8), (1 << 8) - 1}}, /* ( -256 ~ 255 ) */
  449. {_DISP11div2, 11, {0, 0}},
  450. {_DISP19div2, 19, {-(1 << 19), (1 << 19) - 1}}, /* (-524288 ~ 524287) */
  451. {_DISP24div2, 24, {0, 0}},
  452. {_VALUE, 32, {0, ((unsigned int)1 << 31) - 1}},
  453. {_VALUE_HI16, 16, {0, (1 << 16) - 1}},
  454. {_VALUE_LO16, 16, {0, (1 << 16) - 1}},
  455. {_VALUE_LDST_LO16, 16, {0, (1 << 16) - 1}},
  456. {_SIMM16_LA, 16, {-(1 << 15), (1 << 15) - 1}}, /* (-32768 ~ 32767) */
  457. {_IMM5_RSHIFT_1, 5, {0, (1 << 6) - 1}}, /* ( 0 ~ 63 ) */
  458. {_IMM5_RSHIFT_2, 5, {0, (1 << 7) - 1}}, /* ( 0 ~ 127 ) */
  459. {_SIMM16_LA_POS, 16, {0, (1 << 15) - 1}}, /* ( 0 ~ 32767) */
  460. {_IMM5_RANGE_8_31, 5, {8, 31}}, /* But for cop0 the valid data : (8 ~ 31). */
  461. {_IMM10_RSHIFT_2, 10, {-(1 << 11), (1 << 11) - 1}}, /* For ldc#, stc#. */
  462. {_SIMM10, 10, {0, (1 << 10) - 1}}, /* ( -1024 ~ 1023 ) */
  463. {_SIMM12, 12, {0, (1 << 12) - 1}}, /* ( -2048 ~ 2047 ) */
  464. {_SIMM14, 14, {0, (1 << 14) - 1}}, /* ( -8192 ~ 8191 ) */
  465. {_SIMM15, 15, {0, (1 << 15) - 1}}, /* (-16384 ~ 16383) */
  466. {_SIMM16, 16, {0, (1 << 16) - 1}}, /* (-65536 ~ 65536) */
  467. {_SIMM14_NEG, 14, {0, (1 << 16) - 1}}, /* ( -8191 ~ 8192 ) */
  468. {_IMM16_NEG, 16, {0, (1 << 16) - 1}}, /* ( 65535 ~ 0 ) */
  469. {_SIMM16_NEG, 16, {0, (1 << 16) - 1}}, /* ( 65535 ~ 0 ) */
  470. {_IMM20, 20, {0, (1 << 20) - 1}}, /* (-32768 ~ 32767) */
  471. {_IMM25, 25, {0, (1 << 25) - 1}}, /* (-32768 ~ 32767) */
  472. {_GP_IMM15, 15, {0, (1 << 15) - 1}}, /* ( 0 ~ 65535) */
  473. {_GP_IMM14, 14, {0, (1 << 14) - 1}}, /* ( 0 ~ 65535) */
  474. {_SIMM16_pic, 16, {-(1 << 15), (1 << 15) - 1}}, /* (-32768 ~ 32767) */
  475. {_IMM16_LO16_pic, 16, {0, (1 << 16) - 1}}, /* ( 65535 ~ 0 ) */
  476. {_IMM16_pic, 16, {0, (1 << 16) - 1}}, /* ( 0 ~ 65535) */
  477. {_SIMM5, 5, {-(1 << 4), (1 << 4) - 1}}, /* ( -16 ~ 15 ) */
  478. {_SIMM6, 6, {-(1 << 5), (1 << 5) - 1}}, /* ( -32 ~ 31 ) */
  479. {_IMM32, 32, {0, 0xfffffff}},
  480. {_SIMM32, 32, {-0x80000000, 0x7fffffff}},
  481. {_IMM11, 11, {0, (1 << 11) - 1}},
  482. };
  483. struct s3_asm_opcode
  484. {
  485. /* Instruction name. */
  486. const char *template_name;
  487. /* Instruction Opcode. */
  488. bfd_vma value;
  489. /* Instruction bit mask. */
  490. bfd_vma bitmask;
  491. /* Relax instruction opcode. 0x8000 imply no relaxation. */
  492. bfd_vma relax_value;
  493. /* Instruction type. */
  494. enum score_insn_type type;
  495. /* Function to call to parse args. */
  496. void (*parms) (char *);
  497. };
  498. static const struct s3_asm_opcode s3_score_ldst_insns[] =
  499. {
  500. {"lw", 0x20000000, 0x3e000000, 0x1000, Rd_rvalueRs_SI15, s3_do_ldst_insn},
  501. {"lw", 0x06000000, 0x3e000007, 0x8000, Rd_rvalueRs_preSI12, s3_do_ldst_insn},
  502. {"lw", 0x0e000000, 0x3e000007, 0x0040, Rd_rvalueRs_postSI12, s3_do_ldst_insn},
  503. {"lh", 0x22000000, 0x3e000000, 0x8000, Rd_rvalueRs_SI15, s3_do_ldst_insn},
  504. {"lh", 0x06000001, 0x3e000007, 0x8000, Rd_rvalueRs_preSI12, s3_do_ldst_insn},
  505. {"lh", 0x0e000001, 0x3e000007, 0x8000, Rd_rvalueRs_postSI12, s3_do_ldst_insn},
  506. {"lhu", 0x24000000, 0x3e000000, 0x8000, Rd_rvalueRs_SI15, s3_do_ldst_insn},
  507. {"lhu", 0x06000002, 0x3e000007, 0x8000, Rd_rvalueRs_preSI12, s3_do_ldst_insn},
  508. {"lhu", 0x0e000002, 0x3e000007, 0x8000, Rd_rvalueRs_postSI12, s3_do_ldst_insn},
  509. {"lb", 0x26000000, 0x3e000000, 0x8000, Rd_rvalueRs_SI15, s3_do_ldst_insn},
  510. {"lb", 0x06000003, 0x3e000007, 0x8000, Rd_rvalueRs_preSI12, s3_do_ldst_insn},
  511. {"lb", 0x0e000003, 0x3e000007, 0x8000, Rd_rvalueRs_postSI12, s3_do_ldst_insn},
  512. {"sw", 0x28000000, 0x3e000000, 0x2000, Rd_lvalueRs_SI15, s3_do_ldst_insn},
  513. {"sw", 0x06000004, 0x3e000007, 0x0060, Rd_lvalueRs_preSI12, s3_do_ldst_insn},
  514. {"sw", 0x0e000004, 0x3e000007, 0x8000, Rd_lvalueRs_postSI12, s3_do_ldst_insn},
  515. {"sh", 0x2a000000, 0x3e000000, 0x8000, Rd_lvalueRs_SI15, s3_do_ldst_insn},
  516. {"sh", 0x06000005, 0x3e000007, 0x8000, Rd_lvalueRs_preSI12, s3_do_ldst_insn},
  517. {"sh", 0x0e000005, 0x3e000007, 0x8000, Rd_lvalueRs_postSI12, s3_do_ldst_insn},
  518. {"lbu", 0x2c000000, 0x3e000000, 0x8000, Rd_rvalueRs_SI15, s3_do_ldst_insn},
  519. {"lbu", 0x06000006, 0x3e000007, 0x8000, Rd_rvalueRs_preSI12, s3_do_ldst_insn},
  520. {"lbu", 0x0e000006, 0x3e000007, 0x8000, Rd_rvalueRs_postSI12, s3_do_ldst_insn},
  521. {"sb", 0x2e000000, 0x3e000000, 0x8000, Rd_lvalueRs_SI15, s3_do_ldst_insn},
  522. {"sb", 0x06000007, 0x3e000007, 0x8000, Rd_lvalueRs_preSI12, s3_do_ldst_insn},
  523. {"sb", 0x0e000007, 0x3e000007, 0x8000, Rd_lvalueRs_postSI12, s3_do_ldst_insn},
  524. };
  525. static const struct s3_asm_opcode s3_score_insns[] =
  526. {
  527. {"abs", 0x3800000a, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_dsp3},
  528. {"abs.s", 0x3800004b, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_dsp3},
  529. {"add", 0x00000010, 0x3e0003ff, 0x4800, Rd_Rs_Rs, s3_do_rdrsrs},
  530. {"add.c", 0x00000011, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  531. {"add.s", 0x38000048, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_dsp2},
  532. {"addc", 0x00000012, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  533. {"addc.c", 0x00000013, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  534. {"addi", 0x02000000, 0x3e0e0001, 0x5c00, Rd_SI16, s3_do_rdsi16},
  535. {"addi.c", 0x02000001, 0x3e0e0001, 0x8000, Rd_SI16, s3_do_rdsi16},
  536. {"addis", 0x0a000000, 0x3e0e0001, 0x8000, Rd_SI16, s3_do_rdi16},
  537. {"addis.c", 0x0a000001, 0x3e0e0001, 0x8000, Rd_SI16, s3_do_rdi16},
  538. {"addi!", 0x5c00, 0x7c00, 0x8000, Rd_SI6, s3_do16_addi},
  539. {"addri", 0x10000000, 0x3e000001, 0x8000, Rd_Rs_SI14, s3_do_rdrssi14},
  540. {"addri.c", 0x10000001, 0x3e000001, 0x8000, Rd_Rs_SI14, s3_do_rdrssi14},
  541. /* add.c <-> add!. */
  542. {"add!", 0x4800, 0x7f00, 0x8000, Rd_Rs, s3_do16_rdrs2},
  543. {"subi", 0x02000000, 0x3e0e0001, 0x8000, Rd_SI16, s3_do_sub_rdsi16},
  544. {"subi.c", 0x02000001, 0x3e0e0001, 0x8000, Rd_SI16, s3_do_sub_rdsi16},
  545. {"subis", 0x0a000000, 0x3e0e0001, 0x8000, Rd_SI16, s3_do_sub_rdi16},
  546. {"subis.c", 0x0a000001, 0x3e0e0001, 0x8000, Rd_SI16, s3_do_sub_rdi16},
  547. {"subri", 0x10000000, 0x3e000001, 0x8000, Rd_Rs_SI14, s3_do_sub_rdrssi14},
  548. {"subri.c", 0x10000001, 0x3e000001, 0x8000, Rd_Rs_SI14, s3_do_sub_rdrssi14},
  549. {"and", 0x00000020, 0x3e0003ff, 0x4b00, Rd_Rs_Rs, s3_do_rdrsrs},
  550. {"and.c", 0x00000021, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  551. {"andi", 0x02080000, 0x3e0e0001, 0x8000, Rd_I16, s3_do_rdi16},
  552. {"andi.c", 0x02080001, 0x3e0e0001, 0x8000, Rd_I16, s3_do_rdi16},
  553. {"andis", 0x0a080000, 0x3e0e0001, 0x8000, Rd_I16, s3_do_rdi16},
  554. {"andis.c", 0x0a080001, 0x3e0e0001, 0x8000, Rd_I16, s3_do_rdi16},
  555. {"andri", 0x18000000, 0x3e000001, 0x8000, Rd_Rs_I14, s3_do_rdrsi14},
  556. {"andri.c", 0x18000001, 0x3e000001, 0x8000, Rd_Rs_I14, s3_do_rdrsi14},
  557. /* and.c <-> and!. */
  558. {"and!", 0x4b00, 0x7f00, 0x8000, Rd_Rs, s3_do16_rdrs2},
  559. {"bcs", 0x08000000, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  560. {"bcc", 0x08000400, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  561. {"bcnz", 0x08003800, 0x3e007c01, 0x3200, PC_DISP19div2, s3_do_branch},
  562. {"bcsl", 0x08000001, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  563. {"bccl", 0x08000401, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  564. {"bcnzl", 0x08003801, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  565. {"bcnz!", 0x3200, 0x7f00, 0x08003800, PC_DISP8div2, s3_do16_branch},
  566. {"beq", 0x08001000, 0x3e007c01, 0x3800, PC_DISP19div2, s3_do_branch},
  567. {"beql", 0x08001001, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  568. {"beq!", 0x3800, 0x7e00, 0x08001000, PC_DISP8div2, s3_do16_branch},
  569. {"bgtu", 0x08000800, 0x3e007c01, 0x3400, PC_DISP19div2, s3_do_branch},
  570. {"bgt", 0x08001800, 0x3e007c01, 0x3c00, PC_DISP19div2, s3_do_branch},
  571. {"bge", 0x08002000, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  572. {"bgtul", 0x08000801, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  573. {"bgtl", 0x08001801, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  574. {"bgel", 0x08002001, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  575. {"bgtu!", 0x3400, 0x7e00, 0x08000800, PC_DISP8div2, s3_do16_branch},
  576. {"bgt!", 0x3c00, 0x7e00, 0x08001800, PC_DISP8div2, s3_do16_branch},
  577. {"bitclr", 0x00000028, 0x3e0003ff, 0x5000, Rd_Rs_I5, s3_do_rdrsi5},
  578. {"bitclr.c", 0x00000029, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  579. {"mbitclr", 0x00000064, 0x3e00007e, 0x8000, Ra_I9_I5, s3_do_mbitclr},
  580. {"mbitset", 0x0000006c, 0x3e00007e, 0x8000, Ra_I9_I5, s3_do_mbitset},
  581. {"bitrev", 0x3800000c, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_dsp2},
  582. {"bitset", 0x0000002a, 0x3e0003ff, 0x5200, Rd_Rs_I5, s3_do_rdrsi5},
  583. {"bitset.c", 0x0000002b, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  584. {"bittst.c", 0x0000002d, 0x3e0003ff, 0x5400, x_Rs_I5, s3_do_xrsi5},
  585. {"bittgl", 0x0000002e, 0x3e0003ff, 0x5600, Rd_Rs_I5, s3_do_rdrsi5},
  586. {"bittgl.c", 0x0000002f, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  587. {"bitclr!", 0x5000, 0x7e00, 0x8000, Rd_I5, s3_do16_rdi5},
  588. {"bitset!", 0x5200, 0x7e00, 0x8000, Rd_I5, s3_do16_rdi5},
  589. {"bittst!", 0x5400, 0x7e00, 0x8000, Rd_I5, s3_do16_rdi5},
  590. {"bittgl!", 0x5600, 0x7e00, 0x8000, Rd_I5, s3_do16_rdi5},
  591. {"bleu", 0x08000c00, 0x3e007c01, 0x3600, PC_DISP19div2, s3_do_branch},
  592. {"ble", 0x08001c00, 0x3e007c01, 0x3e00, PC_DISP19div2, s3_do_branch},
  593. {"blt", 0x08002400, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  594. {"bleul", 0x08000c01, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  595. {"blel", 0x08001c01, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  596. {"bltl", 0x08002401, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  597. {"bl", 0x08003c01, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  598. {"bleu!", 0x3600, 0x7e00, 0x08000c00, PC_DISP8div2, s3_do16_branch},
  599. {"ble!", 0x3e00, 0x7e00, 0x08001c00, PC_DISP8div2, s3_do16_branch},
  600. {"bmi", 0x08002800, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  601. {"bmil", 0x08002801, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  602. {"bne", 0x08001400, 0x3e007c01, 0x3a00, PC_DISP19div2, s3_do_branch},
  603. {"bnel", 0x08001401, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  604. {"bne!", 0x3a00, 0x7e00, 0x08001400, PC_DISP8div2, s3_do16_branch},
  605. {"bpl", 0x08002c00, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  606. {"bpll", 0x08002c01, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  607. {"brcs", 0x00000008, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  608. {"brcc", 0x00000408, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  609. {"brgtu", 0x00000808, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  610. {"brleu", 0x00000c08, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  611. {"breq", 0x00001008, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  612. {"brne", 0x00001408, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  613. {"brgt", 0x00001808, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  614. {"brle", 0x00001c08, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  615. {"brge", 0x00002008, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  616. {"brlt", 0x00002408, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  617. {"brmi", 0x00002808, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  618. {"brpl", 0x00002c08, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  619. {"brvs", 0x00003008, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  620. {"brvc", 0x00003408, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  621. {"brcnz", 0x00003808, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  622. {"br", 0x00003c08, 0x3e007fff, 0x0080, x_Rs_x, s3_do_rs},
  623. {"brcsl", 0x00000009, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  624. {"brccl", 0x00000409, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  625. {"brgtul", 0x00000809, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  626. {"brleul", 0x00000c09, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  627. {"breql", 0x00001009, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  628. {"brnel", 0x00001409, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  629. {"brgtl", 0x00001809, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  630. {"brlel", 0x00001c09, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  631. {"brgel", 0x00002009, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  632. {"brltl", 0x00002409, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  633. {"brmil", 0x00002809, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  634. {"brpll", 0x00002c09, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  635. {"brvsl", 0x00003009, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  636. {"brvcl", 0x00003409, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  637. {"brcnzl", 0x00003809, 0x3e007fff, 0x8000, x_Rs_x, s3_do_rs},
  638. {"brl", 0x00003c09, 0x3e007fff, 0x00a0, x_Rs_x, s3_do_rs},
  639. {"br!", 0x0080, 0x7fe0, 0x8000, x_Rs, s3_do16_br},
  640. {"brl!", 0x00a0, 0x7fe0, 0x8000, x_Rs, s3_do16_br},
  641. {"brr!", 0x00c0, 0x7fe0, 0x8000, x_Rs, s3_do16_brr},
  642. {"bvs", 0x08003000, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  643. {"bvc", 0x08003400, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  644. {"bvsl", 0x08003001, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  645. {"bvcl", 0x08003401, 0x3e007c01, 0x8000, PC_DISP19div2, s3_do_branch},
  646. {"b!", 0x3000, 0x7e00, 0x08003c00, PC_DISP8div2, s3_do16_branch},
  647. {"b", 0x08003c00, 0x3e007c01, 0x3000, PC_DISP19div2, s3_do_branch},
  648. {"cache", 0x30000000, 0x3ff00000, 0x8000, OP5_rvalueRs_SI15, s3_do_cache},
  649. {"ceinst", 0x38000000, 0x3e000000, 0x8000, I5_Rs_Rs_I5_OP5, s3_do_ceinst},
  650. {"clz", 0x0000001c, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  651. {"cmp.c", 0x00300019, 0x3ff003ff, 0x4400, x_Rs_Rs, s3_do_rsrs},
  652. {"cmpz.c", 0x0030001b, 0x3ff07fff, 0x8000, x_Rs_x, s3_do_rs},
  653. {"cmpi.c", 0x02040001, 0x3e0e0001, 0x6000, Rd_SI16, s3_do_rdsi16},
  654. /* cmp.c <-> cmp!. */
  655. {"cmp!", 0x4400, 0x7c00, 0x8000, Rd_Rs, s3_do16_mv_cmp},
  656. {"cmpi!", 0x6000, 0x7c00, 0x8000, Rd_SI5, s3_do16_cmpi},
  657. {"cop1", 0x0c00000c, 0x3e00001f, 0x8000, Rd_Rs_Rs_imm, s3_do_crdcrscrsimm5},
  658. {"cop2", 0x0c000014, 0x3e00001f, 0x8000, Rd_Rs_Rs_imm, s3_do_crdcrscrsimm5},
  659. {"cop3", 0x0c00001c, 0x3e00001f, 0x8000, Rd_Rs_Rs_imm, s3_do_crdcrscrsimm5},
  660. {"drte", 0x0c0000a4, 0x3e0003ff, 0x8000, NO_OPD, s3_do_empty},
  661. {"disint!", 0x00e0, 0xffe1, 0x8000, NO16_OPD, s3_do16_int},
  662. {"enint!", 0x00e1, 0xffe1, 0x8000, NO16_OPD, s3_do16_int},
  663. {"extsb", 0x00000058, 0x3e0003ff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  664. {"extsb.c", 0x00000059, 0x3e0003ff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  665. {"extsh", 0x0000005a, 0x3e0003ff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  666. {"extsh.c", 0x0000005b, 0x3e0003ff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  667. {"extzb", 0x0000005c, 0x3e0003ff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  668. {"extzb.c", 0x0000005d, 0x3e0003ff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  669. {"extzh", 0x0000005e, 0x3e0003ff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  670. {"extzh.c", 0x0000005f, 0x3e0003ff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  671. {"jl", 0x04000001, 0x3e000001, 0x8000, PC_DISP24div2, s3_do_jump},
  672. {"j", 0x04000000, 0x3e000001, 0x8000, PC_DISP24div2, s3_do_jump},
  673. {"alw", 0x0000000c, 0x3e0003ff, 0x8000, Rd_rvalue32Rs, s3_do_ldst_atomic},
  674. {"lcb", 0x00000060, 0x3e0003ff, 0x8000, x_rvalueRs_post4, s3_do_ldst_unalign},
  675. {"lcw", 0x00000062, 0x3e0003ff, 0x8000, Rd_rvalueRs_post4, s3_do_ldst_unalign},
  676. {"lce", 0x00000066, 0x3e0003ff, 0x8000, Rd_rvalueRs_post4, s3_do_ldst_unalign},
  677. {"ldc1", 0x0c00000a, 0x3e00001f, 0x8000, Rd_rvalueRs_SI10, s3_do_ldst_cop},
  678. {"ldc2", 0x0c000012, 0x3e00001f, 0x8000, Rd_rvalueRs_SI10, s3_do_ldst_cop},
  679. {"ldc3", 0x0c00001a, 0x3e00001f, 0x8000, Rd_rvalueRs_SI10, s3_do_ldst_cop},
  680. /* s3_inst.relax */
  681. {"ldi", 0x020c0000, 0x3e0e0000, 0x6400, Rd_SI16, s3_do_rdsi16},
  682. {"ldis", 0x0a0c0000, 0x3e0e0000, 0x8000, Rd_I16, s3_do_ldis},
  683. /* ldi <-> ldiu!. */
  684. {"ldiu!", 0x6400, 0x7c00, 0x8000, Rd_I5, s3_do16_ldiu},
  685. /*ltbb! , ltbh! ltbw! */
  686. {"ltbw", 0x00000032, 0x03ff, 0x8000, Rd_Rs_Rs, s3_do_ltb},
  687. {"ltbh", 0x00000132, 0x03ff, 0x8000, Rd_Rs_Rs, s3_do_ltb},
  688. {"ltbb", 0x00000332, 0x03ff, 0x8000, Rd_Rs_Rs, s3_do_ltb},
  689. {"lw!", 0x1000, 0x7000, 0x8000, Rd_rvalueRs, s3_do16_ldst_insn},
  690. {"mfcel", 0x00000448, 0x3e007fff, 0x8000, Rd_x_x, s3_do_rd},
  691. {"mfcel!", 0x7100, 0x7ff0, 0x00000448, x_Rs, s3_do16_dsp},
  692. {"mad", 0x38000000, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  693. {"mad.f!", 0x7400, 0x7f00, 0x38000080, Rd_Rs, s3_do16_dsp2},
  694. {"madh", 0x38000203, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  695. {"madh.fs", 0x380002c3, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  696. {"madh.fs!", 0x7b00, 0x7f00, 0x380002c3, Rd_Rs, s3_do16_dsp2},
  697. {"madl", 0x38000002, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  698. {"madl.fs", 0x380000c2, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  699. {"madl.fs!", 0x7a00, 0x7f00, 0x380000c2, Rd_Rs, s3_do16_dsp2},
  700. {"madu", 0x38000020, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  701. {"madu!", 0x7500, 0x7f00, 0x38000020, Rd_Rs, s3_do16_dsp2},
  702. {"mad.f", 0x38000080, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  703. {"max", 0x38000007, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_dsp2},
  704. {"mazh", 0x38000303, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  705. {"mazh.f", 0x38000383, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  706. {"mazh.f!", 0x7900, 0x7f00, 0x3800038c, Rd_Rs, s3_do16_dsp2},
  707. {"mazl", 0x38000102, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  708. {"mazl.f", 0x38000182, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  709. {"mazl.f!", 0x7800, 0x7f00, 0x38000182, Rd_Rs, s3_do16_dsp2},
  710. {"mfceh", 0x00000848, 0x3e007fff, 0x8000, Rd_x_x, s3_do_rd},
  711. {"mfceh!", 0x7110, 0x7ff0, 0x00000848, x_Rs, s3_do16_dsp},
  712. {"mfcehl", 0x00000c48, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  713. {"mfsr", 0x00000050, 0x3e0003ff, 0x8000, Rd_x_I5, s3_do_rdsrs},
  714. {"mfcr", 0x0c000001, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  715. {"mfc1", 0x0c000009, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  716. {"mfc2", 0x0c000011, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  717. {"mfc3", 0x0c000019, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  718. {"mfcc1", 0x0c00000f, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  719. {"mfcc2", 0x0c000017, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  720. {"mfcc3", 0x0c00001f, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  721. {"min", 0x38000006, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_dsp2},
  722. {"msb", 0x38000001, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  723. {"msb.f!", 0x7600, 0x7f00, 0x38000081, Rd_Rs, s3_do16_dsp2},
  724. {"msbh", 0x38000205, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  725. {"msbh.fs", 0x380002c5, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  726. {"msbh.fs!", 0x7f00, 0x7f00, 0x380002c5, Rd_Rs, s3_do16_dsp2},
  727. {"msbl", 0x38000004, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  728. {"msbl.fs", 0x380000c4, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  729. {"msbl.fs!", 0x7e00, 0x7f00, 0x380000c4, Rd_Rs, s3_do16_dsp2},
  730. {"msbu", 0x38000021, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  731. {"msbu!", 0x7700, 0x7f00, 0x38000021, Rd_Rs, s3_do16_dsp2},
  732. {"msb.f", 0x38000081, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  733. {"mszh", 0x38000305, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  734. {"mszh.f", 0x38000385, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  735. {"mszh.f!", 0x7d00, 0x7f00, 0x38000385, Rd_Rs, s3_do16_dsp2},
  736. {"mszl", 0x38000104, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  737. {"mszl.f", 0x38000184, 0x3ff003ff, 0x8000, x_Rs_Rs, s3_do_dsp},
  738. {"mszl.f!", 0x7c00, 0x7f00, 0x38000184, Rd_Rs, s3_do16_dsp2},
  739. {"mtcel!", 0x7000, 0x7ff0, 0x0000044a, x_Rs, s3_do16_dsp},
  740. {"mtcel", 0x0000044a, 0x3e007fff, 0x8000, Rd_x_x, s3_do_rd},
  741. {"mtceh", 0x0000084a, 0x3e007fff, 0x8000, Rd_x_x, s3_do_rd},
  742. {"mtceh!", 0x7010, 0x7ff0, 0x0000084a, x_Rs, s3_do16_dsp},
  743. {"mtcehl", 0x00000c4a, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  744. {"mtsr", 0x00000052, 0x3e0003ff, 0x8000, x_Rs_I5, s3_do_rdsrs},
  745. {"mtcr", 0x0c000000, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  746. {"mtc1", 0x0c000008, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  747. {"mtc2", 0x0c000010, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  748. {"mtc3", 0x0c000018, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  749. {"mtcc1", 0x0c00000e, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  750. {"mtcc2", 0x0c000016, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  751. {"mtcc3", 0x0c00001e, 0x3e00001f, 0x8000, Rd_Rs_x, s3_do_rdcrs},
  752. {"mul.f!", 0x7200, 0x7f00, 0x00000041, Rd_Rs, s3_do16_dsp2},
  753. {"mulu!", 0x7300, 0x7f00, 0x00000042, Rd_Rs, s3_do16_dsp2},
  754. {"mulr.l", 0x00000140, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  755. {"mulr.h", 0x00000240, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  756. {"mulr", 0x00000340, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  757. {"mulr.lf", 0x00000141, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  758. {"mulr.hf", 0x00000241, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  759. {"mulr.f", 0x00000341, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  760. {"mulur.l", 0x00000142, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  761. {"mulur.h", 0x00000242, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  762. {"mulur", 0x00000342, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  763. {"divr.q", 0x00000144, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  764. {"divr.r", 0x00000244, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  765. {"divr", 0x00000344, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  766. {"divur.q", 0x00000146, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  767. {"divur.r", 0x00000246, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  768. {"divur", 0x00000346, 0x3e0003ff, 0x8000, Insn_Type_SYN, s3_do_rdrsrs},
  769. {"mvcs", 0x00000056, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  770. {"mvcc", 0x00000456, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  771. {"mvgtu", 0x00000856, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  772. {"mvleu", 0x00000c56, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  773. {"mveq", 0x00001056, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  774. {"mvne", 0x00001456, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  775. {"mvgt", 0x00001856, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  776. {"mvle", 0x00001c56, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  777. {"mvge", 0x00002056, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  778. {"mvlt", 0x00002456, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  779. {"mvmi", 0x00002856, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  780. {"mvpl", 0x00002c56, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  781. {"mvvs", 0x00003056, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  782. {"mvvc", 0x00003456, 0x3e007fff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  783. /* mv <-> mv!. */
  784. {"mv", 0x00003c56, 0x3e007fff, 0x4000, Rd_Rs_x, s3_do_rdrs},
  785. {"mv!", 0x4000, 0x7c00, 0x8000, Rd_Rs, s3_do16_mv_cmp},
  786. {"neg", 0x0000001e, 0x3e0003ff, 0x8000, Rd_x_Rs, s3_do_rdxrs},
  787. {"neg.c", 0x0000001f, 0x3e0003ff, 0x8000, Rd_x_Rs, s3_do_rdxrs},
  788. {"nop", 0x00000000, 0x3e0003ff, 0x0000, NO_OPD, s3_do_empty},
  789. {"not", 0x00000024, 0x3e0003ff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  790. {"not.c", 0x00000025, 0x3e0003ff, 0x8000, Rd_Rs_x, s3_do_rdrs},
  791. {"nop!", 0x0000, 0x7fff, 0x8000, NO16_OPD, s3_do_empty},
  792. {"or", 0x00000022, 0x3e0003ff, 0x4a00, Rd_Rs_Rs, s3_do_rdrsrs},
  793. {"or.c", 0x00000023, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  794. {"ori", 0x020a0000, 0x3e0e0001, 0x8000, Rd_I16, s3_do_rdi16},
  795. {"ori.c", 0x020a0001, 0x3e0e0001, 0x8000, Rd_I16, s3_do_rdi16},
  796. {"oris", 0x0a0a0000, 0x3e0e0001, 0x8000, Rd_I16, s3_do_rdi16},
  797. {"oris.c", 0x0a0a0001, 0x3e0e0001, 0x8000, Rd_I16, s3_do_rdi16},
  798. {"orri", 0x1a000000, 0x3e000001, 0x8000, Rd_Rs_I14, s3_do_rdrsi14},
  799. {"orri.c", 0x1a000001, 0x3e000001, 0x8000, Rd_Rs_I14, s3_do_rdrsi14},
  800. /* or.c <-> or!. */
  801. {"or!", 0x4a00, 0x7f00, 0x8000, Rd_Rs, s3_do16_rdrs2},
  802. {"pflush", 0x0000000a, 0x3e0003ff, 0x8000, NO_OPD, s3_do_empty},
  803. {"pop!", 0x0040, 0x7fe0, 0x8000, Rd_rvalueRs, s3_do16_push_pop},
  804. {"push!", 0x0060, 0x7fe0, 0x8000, Rd_lvalueRs, s3_do16_push_pop},
  805. {"rpop!", 0x6800, 0x7c00, 0x8000, Rd_I5, s3_do16_rpop},
  806. {"rpush!", 0x6c00, 0x7c00, 0x8000, Rd_I5, s3_do16_rpush},
  807. {"ror", 0x00000038, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  808. {"ror.c", 0x00000039, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  809. {"rorc.c", 0x0000003b, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  810. {"rol", 0x0000003c, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  811. {"rol.c", 0x0000003d, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  812. {"rolc.c", 0x0000003f, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  813. {"rori", 0x00000078, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  814. {"rori.c", 0x00000079, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  815. {"roric.c", 0x0000007b, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  816. {"roli", 0x0000007c, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  817. {"roli.c", 0x0000007d, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  818. {"rolic.c", 0x0000007f, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  819. {"rte", 0x0c000084, 0x3e0003ff, 0x8000, NO_OPD, s3_do_empty},
  820. {"asw", 0x0000000e, 0x3e0003ff, 0x8000, Rd_lvalue32Rs, s3_do_ldst_atomic},
  821. {"scb", 0x00000068, 0x3e0003ff, 0x8000, Rd_lvalueRs_post4, s3_do_ldst_unalign},
  822. {"scw", 0x0000006a, 0x3e0003ff, 0x8000, Rd_lvalueRs_post4, s3_do_ldst_unalign},
  823. {"sce", 0x0000006e, 0x3e0003ff, 0x8000, x_lvalueRs_post4, s3_do_ldst_unalign},
  824. {"sdbbp", 0x00000006, 0x3e0003ff, 0x0020, x_I5_x, s3_do_xi5x},
  825. {"sdbbp!", 0x0020, 0x7fe0, 0x8000, Rd_I5, s3_do16_xi5},
  826. {"sleep", 0x0c0000c4, 0x3e0003ff, 0x8000, NO_OPD, s3_do_empty},
  827. {"rti", 0x0c0000e4, 0x3e0003ff, 0x8000, NO_OPD, s3_do_empty},
  828. {"sll", 0x00000030, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  829. {"sll.c", 0x00000031, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  830. {"sll.s", 0x3800004e, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_dsp2},
  831. {"slli", 0x00000070, 0x3e0003ff, 0x5800, Rd_Rs_I5, s3_do_rdrsi5},
  832. {"slli.c", 0x00000071, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  833. /* slli.c <-> slli!. */
  834. {"slli!", 0x5800, 0x7e00, 0x8000, Rd_I5, s3_do16_slli_srli},
  835. {"srl", 0x00000034, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  836. {"srl.c", 0x00000035, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  837. {"sra", 0x00000036, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  838. {"sra.c", 0x00000037, 0x3e0003ff, 0x8000, Rd_Rs_Rs, s3_do_rdrsrs},
  839. {"srli", 0x00000074, 0x3e0003ff, 0x5a00, Rd_Rs_I5, s3_do_rdrsi5},
  840. {"srli.c", 0x00000075, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  841. {"srai", 0x00000076, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  842. {"srai.c", 0x00000077, 0x3e0003ff, 0x8000, Rd_Rs_I5, s3_do_rdrsi5},
  843. /* srli.c <-> srli!. */
  844. {"srli!", 0x5a00, 0x7e00, 0x8000, Rd_Rs, s3_do16_slli_srli},
  845. {"stc1", 0x0c00000b, 0x3e00001f, 0x8000, Rd_lvalueRs_SI10, s3_do_ldst_cop},
  846. {"stc2", 0x0c000013, 0x3e00001f, 0x8000, Rd_lvalueRs_SI10, s3_do_ldst_cop},
  847. {"stc3", 0x0c00001b, 0x3e00001f, 0x800

Large files files are truncated, but you can click here to view the full file