1 /* Print mips instructions for GDB, the GNU debugger, or for objdump.
2 Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2012
4 Free Software Foundation, Inc.
5 Contributed by Nobuyuki Hikichi(hikichi@sra.co.jp).
7 This file is part of the GNU opcodes library.
9 This library is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
14 It is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22 MA 02110-1301, USA. */
26 #include "libiberty.h"
27 #include "opcode/mips.h"
30 /* FIXME: These are needed to figure out if the code is mips16 or
31 not. The low bit of the address is often a good indicator. No
32 symbol table is available when this code runs out in an embedded
33 system as when it is used for disassembler support in a monitor. */
35 #if !defined(EMBEDDED_ENV)
36 #define SYMTAB_AVAILABLE 1
41 /* Mips instructions are at maximum this many bytes long. */
45 /* FIXME: These should be shared with gdb somehow. */
47 struct mips_cp0sel_name
51 const char * const name;
54 /* The mips16 registers. */
55 static const unsigned int mips16_to_32_reg_map[] =
57 16, 17, 2, 3, 4, 5, 6, 7
60 /* The microMIPS registers with type b. */
61 #define micromips_to_32_reg_b_map mips16_to_32_reg_map
63 /* The microMIPS registers with type c. */
64 #define micromips_to_32_reg_c_map mips16_to_32_reg_map
66 /* The microMIPS registers with type d. */
67 #define micromips_to_32_reg_d_map mips16_to_32_reg_map
69 /* The microMIPS registers with type e. */
70 #define micromips_to_32_reg_e_map mips16_to_32_reg_map
72 /* The microMIPS registers with type f. */
73 #define micromips_to_32_reg_f_map mips16_to_32_reg_map
75 /* The microMIPS registers with type g. */
76 #define micromips_to_32_reg_g_map mips16_to_32_reg_map
78 /* The microMIPS registers with type h. */
79 static const unsigned int micromips_to_32_reg_h_map[] =
81 5, 5, 6, 4, 4, 4, 4, 4
84 /* The microMIPS registers with type i. */
85 static const unsigned int micromips_to_32_reg_i_map[] =
87 6, 7, 7, 21, 22, 5, 6, 7
90 /* The microMIPS registers with type j: 32 registers. */
92 /* The microMIPS registers with type l. */
93 #define micromips_to_32_reg_l_map mips16_to_32_reg_map
95 /* The microMIPS registers with type m. */
96 static const unsigned int micromips_to_32_reg_m_map[] =
98 0, 17, 2, 3, 16, 18, 19, 20
101 /* The microMIPS registers with type n. */
102 #define micromips_to_32_reg_n_map micromips_to_32_reg_m_map
104 /* The microMIPS registers with type p: 32 registers. */
106 /* The microMIPS registers with type q. */
107 static const unsigned int micromips_to_32_reg_q_map[] =
109 0, 17, 2, 3, 4, 5, 6, 7
112 /* reg type s is $29. */
114 /* reg type t is the same as the last register. */
116 /* reg type y is $31. */
118 /* reg type z is $0. */
120 /* micromips imm B type. */
121 static const int micromips_imm_b_map[8] =
123 1, 4, 8, 12, 16, 20, 24, -1
126 /* micromips imm C type. */
127 static const int micromips_imm_c_map[16] =
129 128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 255, 32768, 65535
132 /* micromips imm D type: (-512..511)<<1. */
133 /* micromips imm E type: (-64..63)<<1. */
134 /* micromips imm F type: (0..63). */
135 /* micromips imm G type: (-1..14). */
136 /* micromips imm H type: (0..15)<<1. */
137 /* micromips imm I type: (-1..126). */
138 /* micromips imm J type: (0..15)<<2. */
139 /* micromips imm L type: (0..15). */
140 /* micromips imm M type: (1..8). */
141 /* micromips imm W type: (0..63)<<2. */
142 /* micromips imm X type: (-8..7). */
143 /* micromips imm Y type: (-258..-3, 2..257)<<2. */
145 #define mips16_reg_names(rn) mips_gpr_names[mips16_to_32_reg_map[rn]]
148 static const char * const mips_gpr_names_numeric[32] =
150 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
151 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
152 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
153 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
156 static const char * const mips_gpr_names_oldabi[32] =
158 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
159 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
160 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
161 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
164 static const char * const mips_gpr_names_newabi[32] =
166 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
167 "a4", "a5", "a6", "a7", "t0", "t1", "t2", "t3",
168 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
169 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
172 static const char * const mips_fpr_names_numeric[32] =
174 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
175 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
176 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
177 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31"
180 static const char * const mips_fpr_names_32[32] =
182 "fv0", "fv0f", "fv1", "fv1f", "ft0", "ft0f", "ft1", "ft1f",
183 "ft2", "ft2f", "ft3", "ft3f", "fa0", "fa0f", "fa1", "fa1f",
184 "ft4", "ft4f", "ft5", "ft5f", "fs0", "fs0f", "fs1", "fs1f",
185 "fs2", "fs2f", "fs3", "fs3f", "fs4", "fs4f", "fs5", "fs5f"
188 static const char * const mips_fpr_names_n32[32] =
190 "fv0", "ft14", "fv1", "ft15", "ft0", "ft1", "ft2", "ft3",
191 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
192 "fa4", "fa5", "fa6", "fa7", "fs0", "ft8", "fs1", "ft9",
193 "fs2", "ft10", "fs3", "ft11", "fs4", "ft12", "fs5", "ft13"
196 static const char * const mips_fpr_names_64[32] =
198 "fv0", "ft12", "fv1", "ft13", "ft0", "ft1", "ft2", "ft3",
199 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
200 "fa4", "fa5", "fa6", "fa7", "ft8", "ft9", "ft10", "ft11",
201 "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7"
204 static const char * const mips_cp0_names_numeric[32] =
206 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
207 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
208 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
209 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
212 static const char * const mips_cp0_names_r3000[32] =
214 "c0_index", "c0_random", "c0_entrylo", "$3",
215 "c0_context", "$5", "$6", "$7",
216 "c0_badvaddr", "$9", "c0_entryhi", "$11",
217 "c0_sr", "c0_cause", "c0_epc", "c0_prid",
218 "$16", "$17", "$18", "$19",
219 "$20", "$21", "$22", "$23",
220 "$24", "$25", "$26", "$27",
221 "$28", "$29", "$30", "$31",
224 static const char * const mips_cp0_names_r4000[32] =
226 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
227 "c0_context", "c0_pagemask", "c0_wired", "$7",
228 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
229 "c0_sr", "c0_cause", "c0_epc", "c0_prid",
230 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
231 "c0_xcontext", "$21", "$22", "$23",
232 "$24", "$25", "c0_ecc", "c0_cacheerr",
233 "c0_taglo", "c0_taghi", "c0_errorepc", "$31",
236 static const char * const mips_cp0_names_mips3264[32] =
238 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
239 "c0_context", "c0_pagemask", "c0_wired", "$7",
240 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
241 "c0_status", "c0_cause", "c0_epc", "c0_prid",
242 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
243 "c0_xcontext", "$21", "$22", "c0_debug",
244 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr",
245 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
248 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264[] =
250 { 16, 1, "c0_config1" },
251 { 16, 2, "c0_config2" },
252 { 16, 3, "c0_config3" },
253 { 18, 1, "c0_watchlo,1" },
254 { 18, 2, "c0_watchlo,2" },
255 { 18, 3, "c0_watchlo,3" },
256 { 18, 4, "c0_watchlo,4" },
257 { 18, 5, "c0_watchlo,5" },
258 { 18, 6, "c0_watchlo,6" },
259 { 18, 7, "c0_watchlo,7" },
260 { 19, 1, "c0_watchhi,1" },
261 { 19, 2, "c0_watchhi,2" },
262 { 19, 3, "c0_watchhi,3" },
263 { 19, 4, "c0_watchhi,4" },
264 { 19, 5, "c0_watchhi,5" },
265 { 19, 6, "c0_watchhi,6" },
266 { 19, 7, "c0_watchhi,7" },
267 { 25, 1, "c0_perfcnt,1" },
268 { 25, 2, "c0_perfcnt,2" },
269 { 25, 3, "c0_perfcnt,3" },
270 { 25, 4, "c0_perfcnt,4" },
271 { 25, 5, "c0_perfcnt,5" },
272 { 25, 6, "c0_perfcnt,6" },
273 { 25, 7, "c0_perfcnt,7" },
274 { 27, 1, "c0_cacheerr,1" },
275 { 27, 2, "c0_cacheerr,2" },
276 { 27, 3, "c0_cacheerr,3" },
277 { 28, 1, "c0_datalo" },
278 { 29, 1, "c0_datahi" }
281 static const char * const mips_cp0_names_mips3264r2[32] =
283 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
284 "c0_context", "c0_pagemask", "c0_wired", "c0_hwrena",
285 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
286 "c0_status", "c0_cause", "c0_epc", "c0_prid",
287 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
288 "c0_xcontext", "$21", "$22", "c0_debug",
289 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr",
290 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
293 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264r2[] =
295 { 4, 1, "c0_contextconfig" },
296 { 0, 1, "c0_mvpcontrol" },
297 { 0, 2, "c0_mvpconf0" },
298 { 0, 3, "c0_mvpconf1" },
299 { 1, 1, "c0_vpecontrol" },
300 { 1, 2, "c0_vpeconf0" },
301 { 1, 3, "c0_vpeconf1" },
302 { 1, 4, "c0_yqmask" },
303 { 1, 5, "c0_vpeschedule" },
304 { 1, 6, "c0_vpeschefback" },
305 { 2, 1, "c0_tcstatus" },
306 { 2, 2, "c0_tcbind" },
307 { 2, 3, "c0_tcrestart" },
308 { 2, 4, "c0_tchalt" },
309 { 2, 5, "c0_tccontext" },
310 { 2, 6, "c0_tcschedule" },
311 { 2, 7, "c0_tcschefback" },
312 { 5, 1, "c0_pagegrain" },
313 { 6, 1, "c0_srsconf0" },
314 { 6, 2, "c0_srsconf1" },
315 { 6, 3, "c0_srsconf2" },
316 { 6, 4, "c0_srsconf3" },
317 { 6, 5, "c0_srsconf4" },
318 { 12, 1, "c0_intctl" },
319 { 12, 2, "c0_srsctl" },
320 { 12, 3, "c0_srsmap" },
321 { 15, 1, "c0_ebase" },
322 { 16, 1, "c0_config1" },
323 { 16, 2, "c0_config2" },
324 { 16, 3, "c0_config3" },
325 { 18, 1, "c0_watchlo,1" },
326 { 18, 2, "c0_watchlo,2" },
327 { 18, 3, "c0_watchlo,3" },
328 { 18, 4, "c0_watchlo,4" },
329 { 18, 5, "c0_watchlo,5" },
330 { 18, 6, "c0_watchlo,6" },
331 { 18, 7, "c0_watchlo,7" },
332 { 19, 1, "c0_watchhi,1" },
333 { 19, 2, "c0_watchhi,2" },
334 { 19, 3, "c0_watchhi,3" },
335 { 19, 4, "c0_watchhi,4" },
336 { 19, 5, "c0_watchhi,5" },
337 { 19, 6, "c0_watchhi,6" },
338 { 19, 7, "c0_watchhi,7" },
339 { 23, 1, "c0_tracecontrol" },
340 { 23, 2, "c0_tracecontrol2" },
341 { 23, 3, "c0_usertracedata" },
342 { 23, 4, "c0_tracebpc" },
343 { 25, 1, "c0_perfcnt,1" },
344 { 25, 2, "c0_perfcnt,2" },
345 { 25, 3, "c0_perfcnt,3" },
346 { 25, 4, "c0_perfcnt,4" },
347 { 25, 5, "c0_perfcnt,5" },
348 { 25, 6, "c0_perfcnt,6" },
349 { 25, 7, "c0_perfcnt,7" },
350 { 27, 1, "c0_cacheerr,1" },
351 { 27, 2, "c0_cacheerr,2" },
352 { 27, 3, "c0_cacheerr,3" },
353 { 28, 1, "c0_datalo" },
354 { 28, 2, "c0_taglo1" },
355 { 28, 3, "c0_datalo1" },
356 { 28, 4, "c0_taglo2" },
357 { 28, 5, "c0_datalo2" },
358 { 28, 6, "c0_taglo3" },
359 { 28, 7, "c0_datalo3" },
360 { 29, 1, "c0_datahi" },
361 { 29, 2, "c0_taghi1" },
362 { 29, 3, "c0_datahi1" },
363 { 29, 4, "c0_taghi2" },
364 { 29, 5, "c0_datahi2" },
365 { 29, 6, "c0_taghi3" },
366 { 29, 7, "c0_datahi3" },
369 /* SB-1: MIPS64 (mips_cp0_names_mips3264) with minor mods. */
370 static const char * const mips_cp0_names_sb1[32] =
372 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
373 "c0_context", "c0_pagemask", "c0_wired", "$7",
374 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
375 "c0_status", "c0_cause", "c0_epc", "c0_prid",
376 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
377 "c0_xcontext", "$21", "$22", "c0_debug",
378 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr_i",
379 "c0_taglo_i", "c0_taghi_i", "c0_errorepc", "c0_desave",
382 static const struct mips_cp0sel_name mips_cp0sel_names_sb1[] =
384 { 16, 1, "c0_config1" },
385 { 18, 1, "c0_watchlo,1" },
386 { 19, 1, "c0_watchhi,1" },
387 { 22, 0, "c0_perftrace" },
388 { 23, 3, "c0_edebug" },
389 { 25, 1, "c0_perfcnt,1" },
390 { 25, 2, "c0_perfcnt,2" },
391 { 25, 3, "c0_perfcnt,3" },
392 { 25, 4, "c0_perfcnt,4" },
393 { 25, 5, "c0_perfcnt,5" },
394 { 25, 6, "c0_perfcnt,6" },
395 { 25, 7, "c0_perfcnt,7" },
396 { 26, 1, "c0_buserr_pa" },
397 { 27, 1, "c0_cacheerr_d" },
398 { 27, 3, "c0_cacheerr_d_pa" },
399 { 28, 1, "c0_datalo_i" },
400 { 28, 2, "c0_taglo_d" },
401 { 28, 3, "c0_datalo_d" },
402 { 29, 1, "c0_datahi_i" },
403 { 29, 2, "c0_taghi_d" },
404 { 29, 3, "c0_datahi_d" },
407 /* Xlr cop0 register names. */
408 static const char * const mips_cp0_names_xlr[32] = {
409 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
410 "c0_context", "c0_pagemask", "c0_wired", "$7",
411 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
412 "c0_status", "c0_cause", "c0_epc", "c0_prid",
413 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
414 "c0_xcontext", "$21", "$22", "c0_debug",
415 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr_i",
416 "c0_taglo_i", "c0_taghi_i", "c0_errorepc", "c0_desave",
419 /* XLR's CP0 Select Registers. */
421 static const struct mips_cp0sel_name mips_cp0sel_names_xlr[] = {
422 { 9, 6, "c0_extintreq" },
423 { 9, 7, "c0_extintmask" },
424 { 15, 1, "c0_ebase" },
425 { 16, 1, "c0_config1" },
426 { 16, 2, "c0_config2" },
427 { 16, 3, "c0_config3" },
428 { 16, 7, "c0_procid2" },
429 { 18, 1, "c0_watchlo,1" },
430 { 18, 2, "c0_watchlo,2" },
431 { 18, 3, "c0_watchlo,3" },
432 { 18, 4, "c0_watchlo,4" },
433 { 18, 5, "c0_watchlo,5" },
434 { 18, 6, "c0_watchlo,6" },
435 { 18, 7, "c0_watchlo,7" },
436 { 19, 1, "c0_watchhi,1" },
437 { 19, 2, "c0_watchhi,2" },
438 { 19, 3, "c0_watchhi,3" },
439 { 19, 4, "c0_watchhi,4" },
440 { 19, 5, "c0_watchhi,5" },
441 { 19, 6, "c0_watchhi,6" },
442 { 19, 7, "c0_watchhi,7" },
443 { 25, 1, "c0_perfcnt,1" },
444 { 25, 2, "c0_perfcnt,2" },
445 { 25, 3, "c0_perfcnt,3" },
446 { 25, 4, "c0_perfcnt,4" },
447 { 25, 5, "c0_perfcnt,5" },
448 { 25, 6, "c0_perfcnt,6" },
449 { 25, 7, "c0_perfcnt,7" },
450 { 27, 1, "c0_cacheerr,1" },
451 { 27, 2, "c0_cacheerr,2" },
452 { 27, 3, "c0_cacheerr,3" },
453 { 28, 1, "c0_datalo" },
454 { 29, 1, "c0_datahi" }
457 static const char * const mips_hwr_names_numeric[32] =
459 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
460 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
461 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
462 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
465 static const char * const mips_hwr_names_mips3264r2[32] =
467 "hwr_cpunum", "hwr_synci_step", "hwr_cc", "hwr_ccres",
468 "$4", "$5", "$6", "$7",
469 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
470 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
471 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
474 struct mips_abi_choice
477 const char * const *gpr_names;
478 const char * const *fpr_names;
481 struct mips_abi_choice mips_abi_choices[] =
483 { "numeric", mips_gpr_names_numeric, mips_fpr_names_numeric },
484 { "32", mips_gpr_names_oldabi, mips_fpr_names_32 },
485 { "n32", mips_gpr_names_newabi, mips_fpr_names_n32 },
486 { "64", mips_gpr_names_newabi, mips_fpr_names_64 },
489 struct mips_arch_choice
493 unsigned long bfd_mach;
496 const char * const *cp0_names;
497 const struct mips_cp0sel_name *cp0sel_names;
498 unsigned int cp0sel_names_len;
499 const char * const *hwr_names;
502 const struct mips_arch_choice mips_arch_choices[] =
504 { "numeric", 0, 0, 0, 0,
505 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
507 { "r3000", 1, bfd_mach_mips3000, CPU_R3000, ISA_MIPS1,
508 mips_cp0_names_r3000, NULL, 0, mips_hwr_names_numeric },
509 { "r3900", 1, bfd_mach_mips3900, CPU_R3900, ISA_MIPS1,
510 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
511 { "r4000", 1, bfd_mach_mips4000, CPU_R4000, ISA_MIPS3,
512 mips_cp0_names_r4000, NULL, 0, mips_hwr_names_numeric },
513 { "r4010", 1, bfd_mach_mips4010, CPU_R4010, ISA_MIPS2,
514 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
515 { "vr4100", 1, bfd_mach_mips4100, CPU_VR4100, ISA_MIPS3,
516 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
517 { "vr4111", 1, bfd_mach_mips4111, CPU_R4111, ISA_MIPS3,
518 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
519 { "vr4120", 1, bfd_mach_mips4120, CPU_VR4120, ISA_MIPS3,
520 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
521 { "r4300", 1, bfd_mach_mips4300, CPU_R4300, ISA_MIPS3,
522 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
523 { "r4400", 1, bfd_mach_mips4400, CPU_R4400, ISA_MIPS3,
524 mips_cp0_names_r4000, NULL, 0, mips_hwr_names_numeric },
525 { "r4600", 1, bfd_mach_mips4600, CPU_R4600, ISA_MIPS3,
526 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
527 { "r4650", 1, bfd_mach_mips4650, CPU_R4650, ISA_MIPS3,
528 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
529 { "r5000", 1, bfd_mach_mips5000, CPU_R5000, ISA_MIPS4,
530 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
531 { "vr5400", 1, bfd_mach_mips5400, CPU_VR5400, ISA_MIPS4,
532 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
533 { "vr5500", 1, bfd_mach_mips5500, CPU_VR5500, ISA_MIPS4,
534 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
535 { "r6000", 1, bfd_mach_mips6000, CPU_R6000, ISA_MIPS2,
536 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
537 { "rm7000", 1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4,
538 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
539 { "rm9000", 1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4,
540 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
541 { "r8000", 1, bfd_mach_mips8000, CPU_R8000, ISA_MIPS4,
542 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
543 { "r10000", 1, bfd_mach_mips10000, CPU_R10000, ISA_MIPS4,
544 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
545 { "r12000", 1, bfd_mach_mips12000, CPU_R12000, ISA_MIPS4,
546 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
547 { "r14000", 1, bfd_mach_mips14000, CPU_R14000, ISA_MIPS4,
548 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
549 { "r16000", 1, bfd_mach_mips16000, CPU_R16000, ISA_MIPS4,
550 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
551 { "mips5", 1, bfd_mach_mips5, CPU_MIPS5, ISA_MIPS5,
552 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
554 /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
555 Note that MIPS-3D and MDMX are not applicable to MIPS32. (See
556 _MIPS32 Architecture For Programmers Volume I: Introduction to the
557 MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
559 { "mips32", 1, bfd_mach_mipsisa32, CPU_MIPS32,
560 ISA_MIPS32 | INSN_SMARTMIPS,
561 mips_cp0_names_mips3264,
562 mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
563 mips_hwr_names_numeric },
565 { "mips32r2", 1, bfd_mach_mipsisa32r2, CPU_MIPS32R2,
566 (ISA_MIPS32R2 | INSN_SMARTMIPS | INSN_DSP | INSN_DSPR2
567 | INSN_MIPS3D | INSN_MT | INSN_MCU),
568 mips_cp0_names_mips3264r2,
569 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
570 mips_hwr_names_mips3264r2 },
572 /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs. */
573 { "mips64", 1, bfd_mach_mipsisa64, CPU_MIPS64,
574 ISA_MIPS64 | INSN_MIPS3D | INSN_MDMX,
575 mips_cp0_names_mips3264,
576 mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
577 mips_hwr_names_numeric },
579 { "mips64r2", 1, bfd_mach_mipsisa64r2, CPU_MIPS64R2,
580 (ISA_MIPS64R2 | INSN_MIPS3D | INSN_DSP | INSN_DSPR2
581 | INSN_DSP64 | INSN_MT | INSN_MDMX | INSN_MCU),
582 mips_cp0_names_mips3264r2,
583 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
584 mips_hwr_names_mips3264r2 },
586 { "sb1", 1, bfd_mach_mips_sb1, CPU_SB1,
587 ISA_MIPS64 | INSN_MIPS3D | INSN_SB1,
589 mips_cp0sel_names_sb1, ARRAY_SIZE (mips_cp0sel_names_sb1),
590 mips_hwr_names_numeric },
592 { "loongson2e", 1, bfd_mach_mips_loongson_2e, CPU_LOONGSON_2E,
593 ISA_MIPS3 | INSN_LOONGSON_2E, mips_cp0_names_numeric,
594 NULL, 0, mips_hwr_names_numeric },
596 { "loongson2f", 1, bfd_mach_mips_loongson_2f, CPU_LOONGSON_2F,
597 ISA_MIPS3 | INSN_LOONGSON_2F, mips_cp0_names_numeric,
598 NULL, 0, mips_hwr_names_numeric },
600 { "loongson3a", 1, bfd_mach_mips_loongson_3a, CPU_LOONGSON_3A,
601 ISA_MIPS64 | INSN_LOONGSON_3A, mips_cp0_names_numeric,
602 NULL, 0, mips_hwr_names_numeric },
604 { "octeon", 1, bfd_mach_mips_octeon, CPU_OCTEON,
605 ISA_MIPS64R2 | INSN_OCTEON, mips_cp0_names_numeric, NULL, 0,
606 mips_hwr_names_numeric },
608 { "octeon+", 1, bfd_mach_mips_octeonp, CPU_OCTEONP,
609 ISA_MIPS64R2 | INSN_OCTEONP, mips_cp0_names_numeric,
610 NULL, 0, mips_hwr_names_numeric },
612 { "octeon2", 1, bfd_mach_mips_octeon2, CPU_OCTEON2,
613 ISA_MIPS64R2 | INSN_OCTEON2, mips_cp0_names_numeric,
614 NULL, 0, mips_hwr_names_numeric },
616 { "xlr", 1, bfd_mach_mips_xlr, CPU_XLR,
617 ISA_MIPS64 | INSN_XLR,
619 mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
620 mips_hwr_names_numeric },
622 /* XLP is mostly like XLR, with the prominent exception it is being
624 { "xlp", 1, bfd_mach_mips_xlr, CPU_XLR,
625 ISA_MIPS64R2 | INSN_XLR,
627 mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
628 mips_hwr_names_numeric },
630 /* This entry, mips16, is here only for ISA/processor selection; do
631 not print its name. */
632 { "", 1, bfd_mach_mips16, CPU_MIPS16, ISA_MIPS3,
633 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
636 /* ISA and processor type to disassemble for, and register names to use.
637 set_default_mips_dis_options and parse_mips_dis_options fill in these
639 static int mips_processor;
641 static int micromips_ase;
642 static const char * const *mips_gpr_names;
643 static const char * const *mips_fpr_names;
644 static const char * const *mips_cp0_names;
645 static const struct mips_cp0sel_name *mips_cp0sel_names;
646 static int mips_cp0sel_names_len;
647 static const char * const *mips_hwr_names;
650 static int no_aliases; /* If set disassemble as most general inst. */
652 static const struct mips_abi_choice *
653 choose_abi_by_name (const char *name, unsigned int namelen)
655 const struct mips_abi_choice *c;
658 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_abi_choices) && c == NULL; i++)
659 if (strncmp (mips_abi_choices[i].name, name, namelen) == 0
660 && strlen (mips_abi_choices[i].name) == namelen)
661 c = &mips_abi_choices[i];
666 static const struct mips_arch_choice *
667 choose_arch_by_name (const char *name, unsigned int namelen)
669 const struct mips_arch_choice *c = NULL;
672 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
673 if (strncmp (mips_arch_choices[i].name, name, namelen) == 0
674 && strlen (mips_arch_choices[i].name) == namelen)
675 c = &mips_arch_choices[i];
680 static const struct mips_arch_choice *
681 choose_arch_by_number (unsigned long mach)
683 static unsigned long hint_bfd_mach;
684 static const struct mips_arch_choice *hint_arch_choice;
685 const struct mips_arch_choice *c;
688 /* We optimize this because even if the user specifies no
689 flags, this will be done for every instruction! */
690 if (hint_bfd_mach == mach
691 && hint_arch_choice != NULL
692 && hint_arch_choice->bfd_mach == hint_bfd_mach)
693 return hint_arch_choice;
695 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
697 if (mips_arch_choices[i].bfd_mach_valid
698 && mips_arch_choices[i].bfd_mach == mach)
700 c = &mips_arch_choices[i];
701 hint_bfd_mach = mach;
702 hint_arch_choice = c;
708 /* Check if the object uses NewABI conventions. */
711 is_newabi (Elf_Internal_Ehdr *header)
713 /* There are no old-style ABIs which use 64-bit ELF. */
714 if (header->e_ident[EI_CLASS] == ELFCLASS64)
717 /* If a 32-bit ELF file, n32 is a new-style ABI. */
718 if ((header->e_flags & EF_MIPS_ABI2) != 0)
724 /* Check if the object has microMIPS ASE code. */
727 is_micromips (Elf_Internal_Ehdr *header)
729 if ((header->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS) != 0)
736 set_default_mips_dis_options (struct disassemble_info *info)
738 const struct mips_arch_choice *chosen_arch;
740 /* Defaults: mipsIII/r3000 (?!), no microMIPS ASE (any compressed code
741 is MIPS16 ASE) (o)32-style ("oldabi") GPR names, and numeric FPR,
742 CP0 register, and HWR names. */
743 mips_isa = ISA_MIPS3;
744 mips_processor = CPU_R3000;
746 mips_gpr_names = mips_gpr_names_oldabi;
747 mips_fpr_names = mips_fpr_names_numeric;
748 mips_cp0_names = mips_cp0_names_numeric;
749 mips_cp0sel_names = NULL;
750 mips_cp0sel_names_len = 0;
751 mips_hwr_names = mips_hwr_names_numeric;
754 /* Update settings according to the ELF file header flags. */
755 if (info->flavour == bfd_target_elf_flavour && info->section != NULL)
757 Elf_Internal_Ehdr *header;
759 header = elf_elfheader (info->section->owner);
760 /* If an ELF "newabi" binary, use the n32/(n)64 GPR names. */
761 if (is_newabi (header))
762 mips_gpr_names = mips_gpr_names_newabi;
763 /* If a microMIPS binary, then don't use MIPS16 bindings. */
764 micromips_ase = is_micromips (header);
767 /* Set ISA, architecture, and cp0 register names as best we can. */
768 #if ! SYMTAB_AVAILABLE
769 /* This is running out on a target machine, not in a host tool.
770 FIXME: Where does mips_target_info come from? */
771 target_processor = mips_target_info.processor;
772 mips_isa = mips_target_info.isa;
774 chosen_arch = choose_arch_by_number (info->mach);
775 if (chosen_arch != NULL)
777 mips_processor = chosen_arch->processor;
778 mips_isa = chosen_arch->isa;
779 mips_cp0_names = chosen_arch->cp0_names;
780 mips_cp0sel_names = chosen_arch->cp0sel_names;
781 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
782 mips_hwr_names = chosen_arch->hwr_names;
788 parse_mips_dis_option (const char *option, unsigned int len)
790 unsigned int i, optionlen, vallen;
792 const struct mips_abi_choice *chosen_abi;
793 const struct mips_arch_choice *chosen_arch;
795 /* Try to match options that are simple flags */
796 if (CONST_STRNEQ (option, "no-aliases"))
802 /* Look for the = that delimits the end of the option name. */
803 for (i = 0; i < len; i++)
804 if (option[i] == '=')
807 if (i == 0) /* Invalid option: no name before '='. */
809 if (i == len) /* Invalid option: no '='. */
811 if (i == (len - 1)) /* Invalid option: no value after '='. */
815 val = option + (optionlen + 1);
816 vallen = len - (optionlen + 1);
818 if (strncmp ("gpr-names", option, optionlen) == 0
819 && strlen ("gpr-names") == optionlen)
821 chosen_abi = choose_abi_by_name (val, vallen);
822 if (chosen_abi != NULL)
823 mips_gpr_names = chosen_abi->gpr_names;
827 if (strncmp ("fpr-names", option, optionlen) == 0
828 && strlen ("fpr-names") == optionlen)
830 chosen_abi = choose_abi_by_name (val, vallen);
831 if (chosen_abi != NULL)
832 mips_fpr_names = chosen_abi->fpr_names;
836 if (strncmp ("cp0-names", option, optionlen) == 0
837 && strlen ("cp0-names") == optionlen)
839 chosen_arch = choose_arch_by_name (val, vallen);
840 if (chosen_arch != NULL)
842 mips_cp0_names = chosen_arch->cp0_names;
843 mips_cp0sel_names = chosen_arch->cp0sel_names;
844 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
849 if (strncmp ("hwr-names", option, optionlen) == 0
850 && strlen ("hwr-names") == optionlen)
852 chosen_arch = choose_arch_by_name (val, vallen);
853 if (chosen_arch != NULL)
854 mips_hwr_names = chosen_arch->hwr_names;
858 if (strncmp ("reg-names", option, optionlen) == 0
859 && strlen ("reg-names") == optionlen)
861 /* We check both ABI and ARCH here unconditionally, so
862 that "numeric" will do the desirable thing: select
863 numeric register names for all registers. Other than
864 that, a given name probably won't match both. */
865 chosen_abi = choose_abi_by_name (val, vallen);
866 if (chosen_abi != NULL)
868 mips_gpr_names = chosen_abi->gpr_names;
869 mips_fpr_names = chosen_abi->fpr_names;
871 chosen_arch = choose_arch_by_name (val, vallen);
872 if (chosen_arch != NULL)
874 mips_cp0_names = chosen_arch->cp0_names;
875 mips_cp0sel_names = chosen_arch->cp0sel_names;
876 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
877 mips_hwr_names = chosen_arch->hwr_names;
882 /* Invalid option. */
886 parse_mips_dis_options (const char *options)
888 const char *option_end;
893 while (*options != '\0')
895 /* Skip empty options. */
902 /* We know that *options is neither NUL or a comma. */
903 option_end = options + 1;
904 while (*option_end != ',' && *option_end != '\0')
907 parse_mips_dis_option (options, option_end - options);
909 /* Go on to the next one. If option_end points to a comma, it
910 will be skipped above. */
911 options = option_end;
915 static const struct mips_cp0sel_name *
916 lookup_mips_cp0sel_name (const struct mips_cp0sel_name *names,
923 for (i = 0; i < len; i++)
924 if (names[i].cp0reg == cp0reg && names[i].sel == sel)
929 /* Print insn arguments for 32/64-bit code. */
932 print_insn_args (const char *d,
933 register unsigned long int l,
935 struct disassemble_info *info,
936 const struct mips_opcode *opp)
939 unsigned int lsb, msb, msbd;
943 for (; *d != '\0'; d++)
952 (*info->fprintf_func) (info->stream, "%c", *d);
956 /* Extension character; switch for second char. */
961 /* xgettext:c-format */
962 (*info->fprintf_func) (info->stream,
963 _("# internal error, incomplete extension sequence (+)"));
967 lsb = (l >> OP_SH_SHAMT) & OP_MASK_SHAMT;
968 (*info->fprintf_func) (info->stream, "0x%x", lsb);
972 msb = (l >> OP_SH_INSMSB) & OP_MASK_INSMSB;
973 (*info->fprintf_func) (info->stream, "0x%x", msb - lsb + 1);
977 (*info->fprintf_func) (info->stream, "0x%lx",
978 (l >> OP_SH_UDI1) & OP_MASK_UDI1);
982 (*info->fprintf_func) (info->stream, "0x%lx",
983 (l >> OP_SH_UDI2) & OP_MASK_UDI2);
987 (*info->fprintf_func) (info->stream, "0x%lx",
988 (l >> OP_SH_UDI3) & OP_MASK_UDI3);
992 (*info->fprintf_func) (info->stream, "0x%lx",
993 (l >> OP_SH_UDI4) & OP_MASK_UDI4);
998 msbd = (l >> OP_SH_EXTMSBD) & OP_MASK_EXTMSBD;
999 (*info->fprintf_func) (info->stream, "0x%x", msbd + 1);
1004 const struct mips_cp0sel_name *n;
1005 unsigned int cp0reg, sel;
1007 cp0reg = (l >> OP_SH_RD) & OP_MASK_RD;
1008 sel = (l >> OP_SH_SEL) & OP_MASK_SEL;
1010 /* CP0 register including 'sel' code for mtcN (et al.), to be
1011 printed textually if known. If not known, print both
1012 CP0 register name and sel numerically since CP0 register
1013 with sel 0 may have a name unrelated to register being
1015 n = lookup_mips_cp0sel_name(mips_cp0sel_names,
1016 mips_cp0sel_names_len, cp0reg, sel);
1018 (*info->fprintf_func) (info->stream, "%s", n->name);
1020 (*info->fprintf_func) (info->stream, "$%d,%d", cp0reg, sel);
1025 lsb = ((l >> OP_SH_SHAMT) & OP_MASK_SHAMT) + 32;
1026 (*info->fprintf_func) (info->stream, "0x%x", lsb);
1030 msb = ((l >> OP_SH_INSMSB) & OP_MASK_INSMSB) + 32;
1031 (*info->fprintf_func) (info->stream, "0x%x", msb - lsb + 1);
1035 msbd = ((l >> OP_SH_EXTMSBD) & OP_MASK_EXTMSBD) + 32;
1036 (*info->fprintf_func) (info->stream, "0x%x", msbd + 1);
1039 case 't': /* Coprocessor 0 reg name */
1040 (*info->fprintf_func) (info->stream, "%s",
1041 mips_cp0_names[(l >> OP_SH_RT) &
1045 case 'T': /* Coprocessor 0 reg name */
1047 const struct mips_cp0sel_name *n;
1048 unsigned int cp0reg, sel;
1050 cp0reg = (l >> OP_SH_RT) & OP_MASK_RT;
1051 sel = (l >> OP_SH_SEL) & OP_MASK_SEL;
1053 /* CP0 register including 'sel' code for mftc0, to be
1054 printed textually if known. If not known, print both
1055 CP0 register name and sel numerically since CP0 register
1056 with sel 0 may have a name unrelated to register being
1058 n = lookup_mips_cp0sel_name(mips_cp0sel_names,
1059 mips_cp0sel_names_len, cp0reg, sel);
1061 (*info->fprintf_func) (info->stream, "%s", n->name);
1063 (*info->fprintf_func) (info->stream, "$%d,%d", cp0reg, sel);
1067 case 'x': /* bbit bit index */
1068 (*info->fprintf_func) (info->stream, "0x%lx",
1069 (l >> OP_SH_BBITIND) & OP_MASK_BBITIND);
1072 case 'p': /* cins, cins32, exts and exts32 position */
1073 (*info->fprintf_func) (info->stream, "0x%lx",
1074 (l >> OP_SH_CINSPOS) & OP_MASK_CINSPOS);
1077 case 's': /* cins and exts length-minus-one */
1078 (*info->fprintf_func) (info->stream, "0x%lx",
1079 (l >> OP_SH_CINSLM1) & OP_MASK_CINSLM1);
1082 case 'S': /* cins32 and exts32 length-minus-one field */
1083 (*info->fprintf_func) (info->stream, "0x%lx",
1084 (l >> OP_SH_CINSLM1) & OP_MASK_CINSLM1);
1087 case 'Q': /* seqi/snei immediate field */
1088 op = (l >> OP_SH_SEQI) & OP_MASK_SEQI;
1089 /* Sign-extend it. */
1090 op = (op ^ 512) - 512;
1091 (*info->fprintf_func) (info->stream, "%d", op);
1094 case 'a': /* 8-bit signed offset in bit 6 */
1095 delta = (l >> OP_SH_OFFSET_A) & OP_MASK_OFFSET_A;
1097 delta |= ~OP_MASK_OFFSET_A;
1098 (*info->fprintf_func) (info->stream, "%d", delta);
1101 case 'b': /* 8-bit signed offset in bit 3 */
1102 delta = (l >> OP_SH_OFFSET_B) & OP_MASK_OFFSET_B;
1104 delta |= ~OP_MASK_OFFSET_B;
1105 (*info->fprintf_func) (info->stream, "%d", delta);
1108 case 'c': /* 9-bit signed offset in bit 6 */
1109 delta = (l >> OP_SH_OFFSET_C) & OP_MASK_OFFSET_C;
1111 delta |= ~OP_MASK_OFFSET_C;
1112 /* Left shift 4 bits to print the real offset. */
1113 (*info->fprintf_func) (info->stream, "%d", delta << 4);
1117 (*info->fprintf_func) (info->stream, "%s",
1118 mips_gpr_names[(l >> OP_SH_RZ) & OP_MASK_RZ]);
1122 (*info->fprintf_func) (info->stream, "%s",
1123 mips_fpr_names[(l >> OP_SH_FZ) & OP_MASK_FZ]);
1127 /* xgettext:c-format */
1128 (*info->fprintf_func) (info->stream,
1129 _("# internal error, undefined extension sequence (+%c)"),
1136 (*info->fprintf_func) (info->stream, "0x%lx",
1137 (l >> OP_SH_BP) & OP_MASK_BP);
1141 (*info->fprintf_func) (info->stream, "0x%lx",
1142 (l >> OP_SH_SA3) & OP_MASK_SA3);
1146 (*info->fprintf_func) (info->stream, "0x%lx",
1147 (l >> OP_SH_SA4) & OP_MASK_SA4);
1151 (*info->fprintf_func) (info->stream, "0x%lx",
1152 (l >> OP_SH_IMM8) & OP_MASK_IMM8);
1156 (*info->fprintf_func) (info->stream, "0x%lx",
1157 (l >> OP_SH_RS) & OP_MASK_RS);
1161 (*info->fprintf_func) (info->stream, "$ac%ld",
1162 (l >> OP_SH_DSPACC) & OP_MASK_DSPACC);
1166 (*info->fprintf_func) (info->stream, "0x%lx",
1167 (l >> OP_SH_WRDSP) & OP_MASK_WRDSP);
1171 (*info->fprintf_func) (info->stream, "$ac%ld",
1172 (l >> OP_SH_DSPACC_S) & OP_MASK_DSPACC_S);
1175 case '0': /* dsp 6-bit signed immediate in bit 20 */
1176 delta = ((l >> OP_SH_DSPSFT) & OP_MASK_DSPSFT);
1177 if (delta & 0x20) /* test sign bit */
1178 delta |= ~OP_MASK_DSPSFT;
1179 (*info->fprintf_func) (info->stream, "%d", delta);
1182 case ':': /* dsp 7-bit signed immediate in bit 19 */
1183 delta = ((l >> OP_SH_DSPSFT_7) & OP_MASK_DSPSFT_7);
1184 if (delta & 0x40) /* test sign bit */
1185 delta |= ~OP_MASK_DSPSFT_7;
1186 (*info->fprintf_func) (info->stream, "%d", delta);
1190 delta = (l >> OP_SH_OFFSET12) & OP_MASK_OFFSET12;
1193 (*info->fprintf_func) (info->stream, "%d", delta);
1197 (*info->fprintf_func) (info->stream, "0x%lx",
1198 (l >> OP_SH_3BITPOS) & OP_MASK_3BITPOS);
1202 (*info->fprintf_func) (info->stream, "0x%lx",
1203 (l >> OP_SH_RDDSP) & OP_MASK_RDDSP);
1206 case '@': /* dsp 10-bit signed immediate in bit 16 */
1207 delta = ((l >> OP_SH_IMM10) & OP_MASK_IMM10);
1208 if (delta & 0x200) /* test sign bit */
1209 delta |= ~OP_MASK_IMM10;
1210 (*info->fprintf_func) (info->stream, "%d", delta);
1214 (*info->fprintf_func) (info->stream, "%ld",
1215 (l >> OP_SH_MT_U) & OP_MASK_MT_U);
1219 (*info->fprintf_func) (info->stream, "%ld",
1220 (l >> OP_SH_MT_H) & OP_MASK_MT_H);
1224 (*info->fprintf_func) (info->stream, "$ac%ld",
1225 (l >> OP_SH_MTACC_T) & OP_MASK_MTACC_T);
1229 (*info->fprintf_func) (info->stream, "$ac%ld",
1230 (l >> OP_SH_MTACC_D) & OP_MASK_MTACC_D);
1234 /* Coprocessor register for CTTC1, MTTC2, MTHC2, CTTC2. */
1235 (*info->fprintf_func) (info->stream, "$%ld",
1236 (l >> OP_SH_RD) & OP_MASK_RD);
1243 (*info->fprintf_func) (info->stream, "%s",
1244 mips_gpr_names[(l >> OP_SH_RS) & OP_MASK_RS]);
1249 (*info->fprintf_func) (info->stream, "%s",
1250 mips_gpr_names[(l >> OP_SH_RT) & OP_MASK_RT]);
1255 (*info->fprintf_func) (info->stream, "0x%lx",
1256 (l >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE);
1259 case 'j': /* Same as i, but sign-extended. */
1261 delta = (l >> OP_SH_DELTA) & OP_MASK_DELTA;
1264 (*info->fprintf_func) (info->stream, "%d",
1269 (*info->fprintf_func) (info->stream, "0x%x",
1270 (unsigned int) ((l >> OP_SH_PREFX)
1275 (*info->fprintf_func) (info->stream, "0x%x",
1276 (unsigned int) ((l >> OP_SH_CACHE)
1281 info->target = (((pc + 4) & ~(bfd_vma) 0x0fffffff)
1282 | (((l >> OP_SH_TARGET) & OP_MASK_TARGET) << 2));
1283 /* For gdb disassembler, force odd address on jalx. */
1284 if (info->flavour == bfd_target_unknown_flavour
1285 && strcmp (opp->name, "jalx") == 0)
1287 (*info->print_address_func) (info->target, info);
1291 /* Sign extend the displacement. */
1292 delta = (l >> OP_SH_DELTA) & OP_MASK_DELTA;
1295 info->target = (delta << 2) + pc + INSNLEN;
1296 (*info->print_address_func) (info->target, info);
1300 (*info->fprintf_func) (info->stream, "%s",
1301 mips_gpr_names[(l >> OP_SH_RD) & OP_MASK_RD]);
1306 /* First check for both rd and rt being equal. */
1307 unsigned int reg = (l >> OP_SH_RD) & OP_MASK_RD;
1308 if (reg == ((l >> OP_SH_RT) & OP_MASK_RT))
1309 (*info->fprintf_func) (info->stream, "%s",
1310 mips_gpr_names[reg]);
1313 /* If one is zero use the other. */
1315 (*info->fprintf_func) (info->stream, "%s",
1316 mips_gpr_names[(l >> OP_SH_RT) & OP_MASK_RT]);
1317 else if (((l >> OP_SH_RT) & OP_MASK_RT) == 0)
1318 (*info->fprintf_func) (info->stream, "%s",
1319 mips_gpr_names[reg]);
1320 else /* Bogus, result depends on processor. */
1321 (*info->fprintf_func) (info->stream, "%s or %s",
1322 mips_gpr_names[reg],
1323 mips_gpr_names[(l >> OP_SH_RT) & OP_MASK_RT]);
1329 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[0]);
1334 (*info->fprintf_func) (info->stream, "0x%lx",
1335 (l >> OP_SH_SHAMT) & OP_MASK_SHAMT);
1339 (*info->fprintf_func) (info->stream, "0x%lx",
1340 (l >> OP_SH_CODE) & OP_MASK_CODE);
1344 (*info->fprintf_func) (info->stream, "0x%lx",
1345 (l >> OP_SH_CODE2) & OP_MASK_CODE2);
1349 (*info->fprintf_func) (info->stream, "0x%lx",
1350 (l >> OP_SH_COPZ) & OP_MASK_COPZ);
1354 (*info->fprintf_func) (info->stream, "0x%lx",
1355 (l >> OP_SH_CODE20) & OP_MASK_CODE20);
1359 (*info->fprintf_func) (info->stream, "0x%lx",
1360 (l >> OP_SH_CODE19) & OP_MASK_CODE19);
1365 (*info->fprintf_func) (info->stream, "%s",
1366 mips_fpr_names[(l >> OP_SH_FS) & OP_MASK_FS]);
1371 (*info->fprintf_func) (info->stream, "%s",
1372 mips_fpr_names[(l >> OP_SH_FT) & OP_MASK_FT]);
1376 (*info->fprintf_func) (info->stream, "%s",
1377 mips_fpr_names[(l >> OP_SH_FD) & OP_MASK_FD]);
1381 (*info->fprintf_func) (info->stream, "%s",
1382 mips_fpr_names[(l >> OP_SH_FR) & OP_MASK_FR]);
1386 /* Coprocessor register for lwcN instructions, et al.
1388 Note that there is no load/store cp0 instructions, and
1389 that FPU (cp1) instructions disassemble this field using
1390 'T' format. Therefore, until we gain understanding of
1391 cp2 register names, we can simply print the register
1393 (*info->fprintf_func) (info->stream, "$%ld",
1394 (l >> OP_SH_RT) & OP_MASK_RT);
1398 /* Coprocessor register for mtcN instructions, et al. Note
1399 that FPU (cp1) instructions disassemble this field using
1400 'S' format. Therefore, we only need to worry about cp0,
1402 op = (l >> OP_SH_OP) & OP_MASK_OP;
1403 if (op == OP_OP_COP0)
1404 (*info->fprintf_func) (info->stream, "%s",
1405 mips_cp0_names[(l >> OP_SH_RD) & OP_MASK_RD]);
1407 (*info->fprintf_func) (info->stream, "$%ld",
1408 (l >> OP_SH_RD) & OP_MASK_RD);
1412 (*info->fprintf_func) (info->stream, "%s",
1413 mips_hwr_names[(l >> OP_SH_RD) & OP_MASK_RD]);
1417 (*info->fprintf_func) (info->stream,
1418 ((opp->pinfo & (FP_D | FP_S)) != 0
1419 ? "$fcc%ld" : "$cc%ld"),
1420 (l >> OP_SH_BCC) & OP_MASK_BCC);
1424 (*info->fprintf_func) (info->stream, "$fcc%ld",
1425 (l >> OP_SH_CCC) & OP_MASK_CCC);
1429 (*info->fprintf_func) (info->stream, "%ld",
1430 (l >> OP_SH_PERFREG) & OP_MASK_PERFREG);
1434 (*info->fprintf_func) (info->stream, "%ld",
1435 (l >> OP_SH_VECBYTE) & OP_MASK_VECBYTE);
1439 (*info->fprintf_func) (info->stream, "%ld",
1440 (l >> OP_SH_VECALIGN) & OP_MASK_VECALIGN);
1444 (*info->fprintf_func) (info->stream, "%ld",
1445 (l >> OP_SH_SEL) & OP_MASK_SEL);
1449 (*info->fprintf_func) (info->stream, "%ld",
1450 (l >> OP_SH_ALN) & OP_MASK_ALN);
1455 unsigned int vsel = (l >> OP_SH_VSEL) & OP_MASK_VSEL;
1457 if ((vsel & 0x10) == 0)
1462 for (fmt = 0; fmt < 3; fmt++, vsel >>= 1)
1463 if ((vsel & 1) == 0)
1465 (*info->fprintf_func) (info->stream, "$v%ld[%d]",
1466 (l >> OP_SH_FT) & OP_MASK_FT,
1469 else if ((vsel & 0x08) == 0)
1471 (*info->fprintf_func) (info->stream, "$v%ld",
1472 (l >> OP_SH_FT) & OP_MASK_FT);
1476 (*info->fprintf_func) (info->stream, "0x%lx",
1477 (l >> OP_SH_FT) & OP_MASK_FT);
1483 (*info->fprintf_func) (info->stream, "$v%ld",
1484 (l >> OP_SH_FD) & OP_MASK_FD);
1488 (*info->fprintf_func) (info->stream, "$v%ld",
1489 (l >> OP_SH_FS) & OP_MASK_FS);
1493 (*info->fprintf_func) (info->stream, "$v%ld",
1494 (l >> OP_SH_FT) & OP_MASK_FT);
1498 /* xgettext:c-format */
1499 (*info->fprintf_func) (info->stream,
1500 _("# internal error, undefined modifier (%c)"),
1507 /* Print the mips instruction at address MEMADDR in debugged memory,
1508 on using INFO. Returns length of the instruction, in bytes, which is
1509 always INSNLEN. BIGENDIAN must be 1 if this is big-endian code, 0 if
1510 this is little-endian code. */
1513 print_insn_mips (bfd_vma memaddr,
1514 unsigned long int word,
1515 struct disassemble_info *info)
1517 const struct mips_opcode *op;
1518 static bfd_boolean init = 0;
1519 static const struct mips_opcode *mips_hash[OP_MASK_OP + 1];
1521 /* Build a hash table to shorten the search time. */
1526 for (i = 0; i <= OP_MASK_OP; i++)
1528 for (op = mips_opcodes; op < &mips_opcodes[NUMOPCODES]; op++)
1530 if (op->pinfo == INSN_MACRO
1531 || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
1533 if (i == ((op->match >> OP_SH_OP) & OP_MASK_OP))
1544 info->bytes_per_chunk = INSNLEN;
1545 info->display_endian = info->endian;
1546 info->insn_info_valid = 1;
1547 info->branch_delay_insns = 0;
1548 info->data_size = 0;
1549 info->insn_type = dis_nonbranch;
1553 op = mips_hash[(word >> OP_SH_OP) & OP_MASK_OP];
1556 for (; op < &mips_opcodes[NUMOPCODES]; op++)
1558 if (op->pinfo != INSN_MACRO
1559 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
1560 && (word & op->mask) == op->match)
1564 /* We always allow to disassemble the jalx instruction. */
1565 if (! OPCODE_IS_MEMBER (op, mips_isa, mips_processor)
1566 && strcmp (op->name, "jalx"))
1569 /* Figure out instruction type and branch delay information. */
1570 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
1572 if ((op->pinfo & (INSN_WRITE_GPR_31
1573 | INSN_WRITE_GPR_D)) != 0)
1574 info->insn_type = dis_jsr;
1576 info->insn_type = dis_branch;
1577 info->branch_delay_insns = 1;
1579 else if ((op->pinfo & (INSN_COND_BRANCH_DELAY
1580 | INSN_COND_BRANCH_LIKELY)) != 0)
1582 if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
1583 info->insn_type = dis_condjsr;
1585 info->insn_type = dis_condbranch;
1586 info->branch_delay_insns = 1;
1588 else if ((op->pinfo & (INSN_STORE_MEMORY
1589 | INSN_LOAD_MEMORY_DELAY)) != 0)
1590 info->insn_type = dis_dref;
1592 (*info->fprintf_func) (info->stream, "%s", op->name);
1595 if (d != NULL && *d != '\0')
1597 (*info->fprintf_func) (info->stream, "\t");
1598 print_insn_args (d, word, memaddr, info, op);
1606 /* Handle undefined instructions. */
1607 info->insn_type = dis_noninsn;
1608 (*info->fprintf_func) (info->stream, "0x%lx", word);
1612 /* Disassemble an operand for a mips16 instruction. */
1615 print_mips16_insn_arg (char type,
1616 const struct mips_opcode *op,
1618 bfd_boolean use_extend,
1621 struct disassemble_info *info)
1628 (*info->fprintf_func) (info->stream, "%c", type);
1633 (*info->fprintf_func) (info->stream, "%s",
1634 mips16_reg_names(((l >> MIPS16OP_SH_RY)
1635 & MIPS16OP_MASK_RY)));
1640 (*info->fprintf_func) (info->stream, "%s",
1641 mips16_reg_names(((l >> MIPS16OP_SH_RX)
1642 & MIPS16OP_MASK_RX)));
1646 (*info->fprintf_func) (info->stream, "%s",
1647 mips16_reg_names(((l >> MIPS16OP_SH_RZ)
1648 & MIPS16OP_MASK_RZ)));
1652 (*info->fprintf_func) (info->stream, "%s",
1653 mips16_reg_names(((l >> MIPS16OP_SH_MOVE32Z)
1654 & MIPS16OP_MASK_MOVE32Z)));
1658 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[0]);
1662 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[29]);
1666 (*info->fprintf_func) (info->stream, "$pc");
1670 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[31]);
1674 (*info->fprintf_func) (info->stream, "%s",
1675 mips_gpr_names[((l >> MIPS16OP_SH_REGR32)
1676 & MIPS16OP_MASK_REGR32)]);
1680 (*info->fprintf_func) (info->stream, "%s",
1681 mips_gpr_names[MIPS16OP_EXTRACT_REG32R (l)]);
1707 int immed, nbits, shift, signedp, extbits, pcrel, extu, branch;
1719 immed = (l >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
1725 immed = (l >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
1731 immed = (l >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
1737 immed = (l >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
1743 immed = (l >> MIPS16OP_SH_IMM4) & MIPS16OP_MASK_IMM4;
1749 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1750 info->insn_type = dis_dref;
1751 info->data_size = 1;
1756 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1757 info->insn_type = dis_dref;
1758 info->data_size = 2;
1763 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1764 if ((op->pinfo & MIPS16_INSN_READ_PC) == 0
1765 && (op->pinfo & MIPS16_INSN_READ_SP) == 0)
1767 info->insn_type = dis_dref;
1768 info->data_size = 4;
1774 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1775 info->insn_type = dis_dref;
1776 info->data_size = 8;
1780 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1785 immed = (l >> MIPS16OP_SH_IMM6) & MIPS16OP_MASK_IMM6;
1789 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1794 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1795 /* FIXME: This might be lw, or it might be addiu to $sp or
1796 $pc. We assume it's load. */
1797 info->insn_type = dis_dref;
1798 info->data_size = 4;
1803 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1804 info->insn_type = dis_dref;
1805 info->data_size = 8;
1809 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1814 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1820 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1825 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1832 immed = (l >> MIPS16OP_SH_IMM11) & MIPS16OP_MASK_IMM11;
1840 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1842 /* FIXME: This can be lw or la. We assume it is lw. */
1843 info->insn_type = dis_dref;
1844 info->data_size = 4;
1849 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1851 info->insn_type = dis_dref;
1852 info->data_size = 8;
1857 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1866 if (signedp && immed >= (1 << (nbits - 1)))
1867 immed -= 1 << nbits;
1869 if ((type == '<' || type == '>' || type == '[' || type == ']')
1876 immed |= ((extend & 0x1f) << 11) | (extend & 0x7e0);
1877 else if (extbits == 15)
1878 immed |= ((extend & 0xf) << 11) | (extend & 0x7f0);
1880 immed = ((extend >> 6) & 0x1f) | (extend & 0x20);
1881 immed &= (1 << extbits) - 1;
1882 if (! extu && immed >= (1 << (extbits - 1)))
1883 immed -= 1 << extbits;
1887 (*info->fprintf_func) (info->stream, "%d", immed);
1895 baseaddr = memaddr + 2;
1897 else if (use_extend)
1898 baseaddr = memaddr - 2;
1906 /* If this instruction is in the delay slot of a jr
1907 instruction, the base address is the address of the
1908 jr instruction. If it is in the delay slot of jalr
1909 instruction, the base address is the address of the
1910 jalr instruction. This test is unreliable: we have
1911 no way of knowing whether the previous word is
1912 instruction or data. */
1913 status = (*info->read_memory_func) (memaddr - 4, buffer, 2,
1916 && (((info->endian == BFD_ENDIAN_BIG
1917 ? bfd_getb16 (buffer)
1918 : bfd_getl16 (buffer))
1919 & 0xf800) == 0x1800))
1920 baseaddr = memaddr - 4;
1923 status = (*info->read_memory_func) (memaddr - 2, buffer,
1926 && (((info->endian == BFD_ENDIAN_BIG
1927 ? bfd_getb16 (buffer)
1928 : bfd_getl16 (buffer))
1929 & 0xf81f) == 0xe800))
1930 baseaddr = memaddr - 2;
1933 info->target = (baseaddr & ~((1 << shift) - 1)) + immed;
1935 && info->flavour == bfd_target_unknown_flavour)
1936 /* For gdb disassembler, maintain odd address. */
1938 (*info->print_address_func) (info->target, info);
1945 int jalx = l & 0x400;
1949 l = ((l & 0x1f) << 23) | ((l & 0x3e0) << 13) | (extend << 2);
1950 if (!jalx && info->flavour == bfd_target_unknown_flavour)
1951 /* For gdb disassembler, maintain odd address. */
1954 info->target = ((memaddr + 4) & ~(bfd_vma) 0x0fffffff) | l;
1955 (*info->print_address_func) (info->target, info);
1961 int need_comma, amask, smask;
1965 l = (l >> MIPS16OP_SH_IMM6) & MIPS16OP_MASK_IMM6;
1967 amask = (l >> 3) & 7;
1969 if (amask > 0 && amask < 5)
1971 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[4]);
1973 (*info->fprintf_func) (info->stream, "-%s",
1974 mips_gpr_names[amask + 3]);
1978 smask = (l >> 1) & 3;
1981 (*info->fprintf_func) (info->stream, "%s??",
1982 need_comma ? "," : "");
1987 (*info->fprintf_func) (info->stream, "%s%s",
1988 need_comma ? "," : "",
1989 mips_gpr_names[16]);
1991 (*info->fprintf_func) (info->stream, "-%s",
1992 mips_gpr_names[smask + 15]);
1998 (*info->fprintf_func) (info->stream, "%s%s",
1999 need_comma ? "," : "",
2000 mips_gpr_names[31]);
2004 if (amask == 5 || amask == 6)
2006 (*info->fprintf_func) (info->stream, "%s$f0",
2007 need_comma ? "," : "");
2009 (*info->fprintf_func) (info->stream, "-$f1");
2016 /* MIPS16e save/restore. */
2019 int amask, args, statics;
2028 amask = (l >> 16) & 0xf;
2029 if (amask == MIPS16_ALL_ARGS)
2034 else if (amask == MIPS16_ALL_STATICS)
2042 statics = amask & 3;
2046 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[4]);
2048 (*info->fprintf_func) (info->stream, "-%s",
2049 mips_gpr_names[4 + args - 1]);
2053 framesz = (((l >> 16) & 0xf0) | (l & 0x0f)) * 8;
2054 if (framesz == 0 && !use_extend)
2057 (*info->fprintf_func) (info->stream, "%s%d",
2058 need_comma ? "," : "",
2061 if (l & 0x40) /* $ra */
2062 (*info->fprintf_func) (info->stream, ",%s", mips_gpr_names[31]);
2064 nsreg = (l >> 24) & 0x7;
2066 if (l & 0x20) /* $s0 */
2068 if (l & 0x10) /* $s1 */
2070 if (nsreg > 0) /* $s2-$s8 */
2071 smask |= ((1 << nsreg) - 1) << 2;
2073 /* Find first set static reg bit. */
2074 for (i = 0; i < 9; i++)
2076 if (smask & (1 << i))
2078 (*info->fprintf_func) (info->stream, ",%s",
2079 mips_gpr_names[i == 8 ? 30 : (16 + i)]);
2080 /* Skip over string of set bits. */
2081 for (j = i; smask & (2 << j); j++)
2084 (*info->fprintf_func) (info->stream, "-%s",
2085 mips_gpr_names[j == 8 ? 30 : (16 + j)]);
2090 /* Statics $ax - $a3. */
2092 (*info->fprintf_func) (info->stream, ",%s", mips_gpr_names[7]);
2093 else if (statics > 0)
2094 (*info->fprintf_func) (info->stream, ",%s-%s",
2095 mips_gpr_names[7 - statics + 1],
2101 /* xgettext:c-format */
2102 (*info->fprintf_func)
2104 _("# internal disassembler error, unrecognised modifier (%c)"),
2110 /* Disassemble mips16 instructions. */
2113 print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
2119 bfd_boolean use_extend;
2121 const struct mips_opcode *op, *opend;
2123 info->bytes_per_chunk = 2;
2124 info->display_endian = info->endian;
2125 info->insn_info_valid = 1;
2126 info->branch_delay_insns = 0;
2127 info->data_size = 0;
2128 info->insn_type = dis_nonbranch;
2132 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2135 (*info->memory_error_func) (status, memaddr, info);
2141 if (info->endian == BFD_ENDIAN_BIG)
2142 insn = bfd_getb16 (buffer);
2144 insn = bfd_getl16 (buffer);
2146 /* Handle the extend opcode specially. */
2148 if ((insn & 0xf800) == 0xf000)
2151 extend = insn & 0x7ff;
2155 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2158 (*info->fprintf_func) (info->stream, "extend 0x%x",
2159 (unsigned int) extend);
2160 (*info->memory_error_func) (status, memaddr, info);
2164 if (info->endian == BFD_ENDIAN_BIG)
2165 insn = bfd_getb16 (buffer);
2167 insn = bfd_getl16 (buffer);
2169 /* Check for an extend opcode followed by an extend opcode. */
2170 if ((insn & 0xf800) == 0xf000)
2172 (*info->fprintf_func) (info->stream, "extend 0x%x",
2173 (unsigned int) extend);
2174 info->insn_type = dis_noninsn;
2181 /* FIXME: Should probably use a hash table on the major opcode here. */
2183 opend = mips16_opcodes + bfd_mips16_num_opcodes;
2184 for (op = mips16_opcodes; op < opend; op++)
2186 if (op->pinfo != INSN_MACRO
2187 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
2188 && (insn & op->mask) == op->match)
2192 if (strchr (op->args, 'a') != NULL)
2196 (*info->fprintf_func) (info->stream, "extend 0x%x",
2197 (unsigned int) extend);
2198 info->insn_type = dis_noninsn;
2206 status = (*info->read_memory_func) (memaddr, buffer, 2,
2211 if (info->endian == BFD_ENDIAN_BIG)
2212 extend = bfd_getb16 (buffer);
2214 extend = bfd_getl16 (buffer);
2219 (*info->fprintf_func) (info->stream, "%s", op->name);
2220 if (op->args[0] != '\0')
2221 (*info->fprintf_func) (info->stream, "\t");
2223 for (s = op->args; *s != '\0'; s++)
2227 && (((insn >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX)
2228 == ((insn >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY)))
2230 /* Skip the register and the comma. */
2236 && (((insn >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ)
2237 == ((insn >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX)))
2239 /* Skip the register and the comma. */
2243 print_mips16_insn_arg (*s, op, insn, use_extend, extend, memaddr,
2247 /* Figure out branch instruction type and delay slot information. */
2248 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2249 info->branch_delay_insns = 1;
2250 if ((op->pinfo & (INSN_UNCOND_BRANCH_DELAY
2251 | MIPS16_INSN_UNCOND_BRANCH)) != 0)
2253 if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2254 info->insn_type = dis_jsr;
2256 info->insn_type = dis_branch;
2258 else if ((op->pinfo & MIPS16_INSN_COND_BRANCH) != 0)
2259 info->insn_type = dis_condbranch;
2266 (*info->fprintf_func) (info->stream, "0x%x", extend | 0xf000);
2267 (*info->fprintf_func) (info->stream, "0x%x", insn);
2268 info->insn_type = dis_noninsn;
2273 /* Disassemble microMIPS instructions. */
2276 print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
2278 const fprintf_ftype infprintf = info->fprintf_func;
2279 const struct mips_opcode *op, *opend;
2280 unsigned int lsb, msbd, msb;
2281 void *is = info->stream;
2294 info->bytes_per_chunk = 2;
2295 info->display_endian = info->endian;
2296 info->insn_info_valid = 1;
2297 info->branch_delay_insns = 0;
2298 info->data_size = 0;
2299 info->insn_type = dis_nonbranch;
2303 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2306 (*info->memory_error_func) (status, memaddr, info);
2312 if (info->endian == BFD_ENDIAN_BIG)
2313 insn = bfd_getb16 (buffer);
2315 insn = bfd_getl16 (buffer);
2317 if ((insn & 0xfc00) == 0x7c00)
2319 /* This is a 48-bit microMIPS instruction. */
2322 status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2325 infprintf (is, "micromips 0x%x", higher);
2326 (*info->memory_error_func) (status, memaddr + 2, info);
2329 if (info->endian == BFD_ENDIAN_BIG)
2330 insn = bfd_getb16 (buffer);
2332 insn = bfd_getl16 (buffer);
2333 higher = (higher << 16) | insn;
2335 status = (*info->read_memory_func) (memaddr + 4, buffer, 2, info);
2338 infprintf (is, "micromips 0x%x", higher);
2339 (*info->memory_error_func) (status, memaddr + 4, info);
2342 if (info->endian == BFD_ENDIAN_BIG)
2343 insn = bfd_getb16 (buffer);
2345 insn = bfd_getl16 (buffer);
2346 infprintf (is, "0x%x%04x (48-bit insn)", higher, insn);
2348 info->insn_type = dis_noninsn;
2351 else if ((insn & 0x1c00) == 0x0000 || (insn & 0x1000) == 0x1000)
2353 /* This is a 32-bit microMIPS instruction. */
2356 status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2359 infprintf (is, "micromips 0x%x", higher);
2360 (*info->memory_error_func) (status, memaddr + 2, info);
2364 if (info->endian == BFD_ENDIAN_BIG)
2365 insn = bfd_getb16 (buffer);
2367 insn = bfd_getl16 (buffer);
2369 insn = insn | (higher << 16);
2374 /* FIXME: Should probably use a hash table on the major opcode here. */
2376 #define GET_OP(insn, field) \
2377 (((insn) >> MICROMIPSOP_SH_##field) & MICROMIPSOP_MASK_##field)
2378 opend = micromips_opcodes + bfd_micromips_num_opcodes;
2379 for (op = micromips_opcodes; op < opend; op++)
2381 if (op->pinfo != INSN_MACRO
2382 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
2383 && (insn & op->mask) == op->match
2384 && ((length == 2 && (op->mask & 0xffff0000) == 0)
2385 || (length == 4 && (op->mask & 0xffff0000) != 0)))
2389 infprintf (is, "%s", op->name);
2390 if (op->args[0] != '\0')
2391 infprintf (is, "\t");
2393 for (s = op->args; *s != '\0'; s++)
2400 infprintf (is, "%c", *s);
2404 delta = GET_OP (insn, OFFSET10);
2407 infprintf (is, "%d", delta);
2411 infprintf (is, "0x%x", GET_OP (insn, STYPE));
2415 infprintf (is, "0x%lx", GET_OP (insn, BP));
2419 infprintf (is, "0x%lx", GET_OP (insn, SA3));
2423 infprintf (is, "0x%lx", GET_OP (insn, SA4));
2427 infprintf (is, "0x%lx", GET_OP (insn, IMM8));
2431 infprintf (is, "0x%lx", GET_OP (insn, RS));
2435 infprintf (is, "$ac%ld", GET_OP (insn, DSPACC));
2439 infprintf (is, "0x%lx", GET_OP (insn, WRDSP));
2442 case '0': /* DSP 6-bit signed immediate in bit 16. */
2443 delta = (GET_OP (insn, DSPSFT) ^ 0x20) - 0x20;
2444 infprintf (is, "%d", delta);
2448 infprintf (is, "0x%x", GET_OP (insn, SHAMT));
2452 infprintf (is, "0x%x", GET_OP (insn, 3BITPOS));
2456 infprintf (is, "0x%lx", GET_OP (insn, RD));
2460 infprintf (is, "0x%x", GET_OP (insn, TRAP));
2464 delta = GET_OP (insn, OFFSET12);
2467 infprintf (is, "%d", delta);
2471 if (strcmp (op->name, "jalx") == 0)
2472 info->target = (((memaddr + 4) & ~(bfd_vma) 0x0fffffff)
2473 | (GET_OP (insn, TARGET) << 2));
2475 info->target = (((memaddr + 4) & ~(bfd_vma) 0x07ffffff)
2476 | ((GET_OP (insn, TARGET)) << 1));
2477 /* For gdb disassembler, force odd address on jalx. */
2478 if (info->flavour == bfd_target_unknown_flavour
2479 && strcmp (op->name, "jalx") == 0)
2481 (*info->print_address_func) (info->target, info);
2488 infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS)]);
2492 infprintf (is, "0x%x", GET_OP (insn, CODE));
2496 infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RD)]);
2500 infprintf (is, "0x%x", GET_OP (insn, PREFX));
2505 infprintf (is, "0x%x", GET_OP (insn, IMMEDIATE));
2508 case 'j': /* Same as i, but sign-extended. */
2510 delta = (GET_OP (insn, DELTA) ^ 0x8000) - 0x8000;
2511 infprintf (is, "%d", delta);
2515 infprintf (is, "0x%x", GET_OP (insn, CACHE));
2522 immed = GET_OP (insn, RT);
2523 s_reg_encode = immed & 0xf;
2524 if (s_reg_encode != 0)
2526 if (s_reg_encode == 1)
2527 infprintf (is, "%s", mips_gpr_names[16]);
2528 else if (s_reg_encode < 9)
2529 infprintf (is, "%s-%s",
2531 mips_gpr_names[15 + s_reg_encode]);
2532 else if (s_reg_encode == 9)
2533 infprintf (is, "%s-%s,%s",
2536 mips_gpr_names[30]);
2538 infprintf (is, "UNKNOWN");
2541 if (immed & 0x10) /* For ra. */
2543 if (s_reg_encode == 0)
2544 infprintf (is, "%s", mips_gpr_names[31]);
2546 infprintf (is, ",%s", mips_gpr_names[31]);
2552 /* Sign-extend the displacement. */
2553 delta = (GET_OP (insn, DELTA) ^ 0x8000) - 0x8000;
2554 info->target = (delta << 1) + memaddr + length;
2555 (*info->print_address_func) (info->target, info);
2559 infprintf (is, "0x%x", GET_OP (insn, CODE2));
2564 infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RT)]);
2568 infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS3)]);
2572 infprintf (is, "%s", mips_gpr_names[0]);
2575 case '@': /* DSP 10-bit signed immediate in bit 16. */
2576 delta = (GET_OP (insn, IMM10) ^ 0x200) - 0x200;
2577 infprintf (is, "%d", delta);
2581 infprintf (is, "0x%x", GET_OP (insn, CODE10));
2585 infprintf (is, "0x%x", GET_OP (insn, COPZ));
2589 infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FD)]);
2593 /* Coprocessor register for lwcN instructions, et al.
2595 Note that there is no load/store cp0 instructions, and
2596 that FPU (cp1) instructions disassemble this field using
2597 'T' format. Therefore, until we gain understanding of
2598 cp2 register names, we can simply print the register
2600 infprintf (is, "$%d", GET_OP (insn, RT));
2604 /* Coprocessor register for mtcN instructions, et al. Note
2605 that FPU (cp1) instructions disassemble this field using
2606 'S' format. Therefore, we only need to worry about cp0,
2608 The microMIPS encoding does not have a coprocessor
2609 identifier field as such, so we must work out the
2610 coprocessor number by looking at the opcode. */
2612 & ~((MICROMIPSOP_MASK_RT << MICROMIPSOP_SH_RT)
2613 | (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS)))
2615 case 0x000000fc: /* mfc0 */
2616 case 0x000002fc: /* mtc0 */
2617 case 0x580000fc: /* dmfc0 */
2618 case 0x580002fc: /* dmtc0 */
2619 infprintf (is, "%s", mips_cp0_names[GET_OP (insn, RS)]);
2622 infprintf (is, "$%d", GET_OP (insn, RS));
2628 infprintf (is, "%d", GET_OP (insn, SEL));
2632 infprintf (is, "%s", mips_hwr_names[GET_OP (insn, RS)]);
2636 infprintf (is, "$fcc%d", GET_OP (insn, CCC));
2641 (op->pinfo & (FP_D | FP_S)) != 0
2642 ? "$fcc%d" : "$cc%d",
2643 GET_OP (insn, BCC));
2647 infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FR)]);
2652 infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FS)]);
2656 infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FT)]);
2660 /* Extension character; switch for second char. */
2665 lsb = GET_OP (insn, EXTLSB);
2666 infprintf (is, "0x%x", lsb);
2670 msb = GET_OP (insn, INSMSB);
2671 infprintf (is, "0x%x", msb - lsb + 1);
2676 msbd = GET_OP (insn, EXTMSBD);
2677 infprintf (is, "0x%x", msbd + 1);
2682 const struct mips_cp0sel_name *n;
2683 unsigned int cp0reg, sel;
2685 cp0reg = GET_OP (insn, RS);
2686 sel = GET_OP (insn, SEL);
2688 /* CP0 register including 'sel' code for mtcN
2689 (et al.), to be printed textually if known.
2690 If not known, print both CP0 register name and
2691 sel numerically since CP0 register with sel 0 may
2692 have a name unrelated to register being printed. */
2693 n = lookup_mips_cp0sel_name (mips_cp0sel_names,
2694 mips_cp0sel_names_len,
2697 infprintf (is, "%s", n->name);
2699 infprintf (is, "$%d,%d", cp0reg, sel);
2704 lsb = GET_OP (insn, EXTLSB) + 32;
2705 infprintf (is, "0x%x", lsb);
2709 msb = GET_OP (insn, INSMSB) + 32;
2710 infprintf (is, "0x%x", msb - lsb + 1);
2714 msbd = GET_OP (insn, EXTMSBD) + 32;
2715 infprintf (is, "0x%x", msbd + 1);
2719 /* xgettext:c-format */
2721 _("# internal disassembler error, "
2722 "unrecognized modifier (+%c)"),
2729 /* Extension character; switch for second char. */
2733 case 'a': /* global pointer. */
2734 infprintf (is, "%s", mips_gpr_names[28]);
2738 regno = micromips_to_32_reg_b_map[GET_OP (insn, MB)];
2739 infprintf (is, "%s", mips_gpr_names[regno]);
2743 regno = micromips_to_32_reg_c_map[GET_OP (insn, MC)];
2744 infprintf (is, "%s", mips_gpr_names[regno]);
2748 regno = micromips_to_32_reg_d_map[GET_OP (insn, MD)];
2749 infprintf (is, "%s", mips_gpr_names[regno]);
2753 regno = micromips_to_32_reg_e_map[GET_OP (insn, ME)];
2754 infprintf (is, "%s", mips_gpr_names[regno]);
2758 /* Save lastregno for "mt" to print out later. */
2759 lastregno = micromips_to_32_reg_f_map[GET_OP (insn, MF)];
2760 infprintf (is, "%s", mips_gpr_names[lastregno]);
2764 regno = micromips_to_32_reg_g_map[GET_OP (insn, MG)];
2765 infprintf (is, "%s", mips_gpr_names[regno]);
2769 regno = micromips_to_32_reg_h_map[GET_OP (insn, MH)];
2770 infprintf (is, "%s", mips_gpr_names[regno]);
2774 regno = micromips_to_32_reg_i_map[GET_OP (insn, MI)];
2775 infprintf (is, "%s", mips_gpr_names[regno]);
2779 infprintf (is, "%s", mips_gpr_names[GET_OP (insn, MJ)]);
2783 regno = micromips_to_32_reg_l_map[GET_OP (insn, ML)];
2784 infprintf (is, "%s", mips_gpr_names[regno]);
2788 regno = micromips_to_32_reg_m_map[GET_OP (insn, MM)];
2789 infprintf (is, "%s", mips_gpr_names[regno]);
2793 regno = micromips_to_32_reg_n_map[GET_OP (insn, MN)];
2794 infprintf (is, "%s", mips_gpr_names[regno]);
2798 /* Save lastregno for "mt" to print out later. */
2799 lastregno = GET_OP (insn, MP);
2800 infprintf (is, "%s", mips_gpr_names[lastregno]);
2804 regno = micromips_to_32_reg_q_map[GET_OP (insn, MQ)];
2805 infprintf (is, "%s", mips_gpr_names[regno]);
2808 case 'r': /* program counter. */
2809 infprintf (is, "$pc");
2812 case 's': /* stack pointer. */
2814 infprintf (is, "%s", mips_gpr_names[29]);
2818 infprintf (is, "%s", mips_gpr_names[lastregno]);
2822 infprintf (is, "%s", mips_gpr_names[0]);
2826 /* Sign-extend the immediate. */
2827 immed = ((GET_OP (insn, IMMA) ^ 0x40) - 0x40) << 2;
2828 infprintf (is, "%d", immed);
2832 immed = micromips_imm_b_map[GET_OP (insn, IMMB)];
2833 infprintf (is, "%d", immed);
2837 immed = micromips_imm_c_map[GET_OP (insn, IMMC)];
2838 infprintf (is, "0x%x", immed);
2842 /* Sign-extend the displacement. */
2843 delta = (GET_OP (insn, IMMD) ^ 0x200) - 0x200;
2844 info->target = (delta << 1) + memaddr + length;
2845 (*info->print_address_func) (info->target, info);
2849 /* Sign-extend the displacement. */
2850 delta = (GET_OP (insn, IMME) ^ 0x40) - 0x40;
2851 info->target = (delta << 1) + memaddr + length;
2852 (*info->print_address_func) (info->target, info);
2856 immed = GET_OP (insn, IMMF);
2857 infprintf (is, "0x%x", immed);
2861 immed = (insn >> MICROMIPSOP_SH_IMMG) + 1;
2862 immed = (immed & MICROMIPSOP_MASK_IMMG) - 1;
2863 infprintf (is, "%d", immed);
2867 immed = GET_OP (insn, IMMH) << 1;
2868 infprintf (is, "%d", immed);
2872 immed = (insn >> MICROMIPSOP_SH_IMMI) + 1;
2873 immed = (immed & MICROMIPSOP_MASK_IMMI) - 1;
2874 infprintf (is, "%d", immed);
2878 immed = GET_OP (insn, IMMJ) << 2;
2879 infprintf (is, "%d", immed);
2883 immed = GET_OP (insn, IMML);
2884 infprintf (is, "%d", immed);
2888 immed = (insn >> MICROMIPSOP_SH_IMMM) - 1;
2889 immed = (immed & MICROMIPSOP_MASK_IMMM) + 1;
2890 infprintf (is, "%d", immed);
2894 immed = GET_OP (insn, IMMN);
2896 infprintf (is, "%s,%s",
2898 mips_gpr_names[31]);
2900 infprintf (is, "%s-%s,%s",
2902 mips_gpr_names[16 + immed],
2903 mips_gpr_names[31]);
2907 immed = GET_OP (insn, IMMO);
2908 infprintf (is, "0x%x", immed);
2912 immed = GET_OP (insn, IMMP) << 2;
2913 infprintf (is, "%d", immed);
2917 /* Sign-extend the immediate. */
2918 immed = (GET_OP (insn, IMMQ) ^ 0x400000) - 0x400000;
2920 infprintf (is, "%d", immed);
2924 immed = GET_OP (insn, IMMU) << 2;
2925 infprintf (is, "%d", immed);
2929 immed = GET_OP (insn, IMMW) << 2;
2930 infprintf (is, "%d", immed);
2934 /* Sign-extend the immediate. */
2935 immed = (GET_OP (insn, IMMX) ^ 0x8) - 0x8;
2936 infprintf (is, "%d", immed);
2940 /* Sign-extend the immediate. */
2941 immed = (GET_OP (insn, IMMY) ^ 0x100) - 0x100;
2942 if (immed >= -2 && immed <= 1)
2945 infprintf (is, "%d", immed);
2949 /* xgettext:c-format */
2951 _("# internal disassembler error, "
2952 "unrecognized modifier (m%c)"),
2959 /* xgettext:c-format */
2961 _("# internal disassembler error, "
2962 "unrecognized modifier (%c)"),
2968 /* Figure out instruction type and branch delay information. */
2970 & (INSN_UNCOND_BRANCH_DELAY | INSN_COND_BRANCH_DELAY)) != 0)
2971 info->branch_delay_insns = 1;
2972 if (((op->pinfo & INSN_UNCOND_BRANCH_DELAY)
2973 | (op->pinfo2 & INSN2_UNCOND_BRANCH)) != 0)
2975 if ((op->pinfo & (INSN_WRITE_GPR_31 | INSN_WRITE_GPR_T)) != 0)
2976 info->insn_type = dis_jsr;
2978 info->insn_type = dis_branch;
2980 else if (((op->pinfo & INSN_COND_BRANCH_DELAY)
2981 | (op->pinfo2 & INSN2_COND_BRANCH)) != 0)
2983 if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2984 info->insn_type = dis_condjsr;
2986 info->insn_type = dis_condbranch;
2989 & (INSN_STORE_MEMORY | INSN_LOAD_MEMORY_DELAY)) != 0)
2990 info->insn_type = dis_dref;
2997 infprintf (is, "0x%x", insn);
2998 info->insn_type = dis_noninsn;
3003 /* Return 1 if a symbol associated with the location being disassembled
3004 indicates a compressed (MIPS16 or microMIPS) mode. We iterate over
3005 all the symbols at the address being considered assuming if at least
3006 one of them indicates code compression, then such code has been
3007 genuinely produced here (other symbols could have been derived from
3008 function symbols defined elsewhere or could define data). Otherwise,
3012 is_compressed_mode_p (struct disassemble_info *info)
3014 elf_symbol_type *symbol;
3018 for (i = 0; i < info->num_symbols; i++)
3020 pos = info->symtab_pos + i;
3022 if (bfd_asymbol_flavour (info->symtab[pos]) != bfd_target_elf_flavour)
3025 symbol = (elf_symbol_type *) info->symtab[pos];
3027 && ELF_ST_IS_MIPS16 (symbol->internal_elf_sym.st_other))
3029 && ELF_ST_IS_MICROMIPS (symbol->internal_elf_sym.st_other)))
3036 /* In an environment where we do not know the symbol type of the
3037 instruction we are forced to assume that the low order bit of the
3038 instructions' address may mark it as a mips16 instruction. If we
3039 are single stepping, or the pc is within the disassembled function,
3040 this works. Otherwise, we need a clue. Sometimes. */
3043 _print_insn_mips (bfd_vma memaddr,
3044 struct disassemble_info *info,
3045 enum bfd_endian endianness)
3047 int (*print_insn_compr) (bfd_vma, struct disassemble_info *);
3048 bfd_byte buffer[INSNLEN];
3051 set_default_mips_dis_options (info);
3052 parse_mips_dis_options (info->disassembler_options);
3054 if (info->mach == bfd_mach_mips16)
3055 return print_insn_mips16 (memaddr, info);
3056 if (info->mach == bfd_mach_mips_micromips)
3057 return print_insn_micromips (memaddr, info);
3059 print_insn_compr = !micromips_ase ? print_insn_mips16 : print_insn_micromips;
3062 /* FIXME: If odd address, this is CLEARLY a compressed instruction. */
3063 /* Only a few tools will work this way. */
3065 return print_insn_compr (memaddr, info);
3068 #if SYMTAB_AVAILABLE
3069 if (is_compressed_mode_p (info))
3070 return print_insn_compr (memaddr, info);
3073 status = (*info->read_memory_func) (memaddr, buffer, INSNLEN, info);
3078 if (endianness == BFD_ENDIAN_BIG)
3079 insn = (unsigned long) bfd_getb32 (buffer);
3081 insn = (unsigned long) bfd_getl32 (buffer);
3083 return print_insn_mips (memaddr, insn, info);
3087 (*info->memory_error_func) (status, memaddr, info);
3093 print_insn_big_mips (bfd_vma memaddr, struct disassemble_info *info)
3095 return _print_insn_mips (memaddr, info, BFD_ENDIAN_BIG);
3099 print_insn_little_mips (bfd_vma memaddr, struct disassemble_info *info)
3101 return _print_insn_mips (memaddr, info, BFD_ENDIAN_LITTLE);
3105 print_mips_disassembler_options (FILE *stream)
3109 fprintf (stream, _("\n\
3110 The following MIPS specific disassembler options are supported for use\n\
3111 with the -M switch (multiple options should be separated by commas):\n"));
3113 fprintf (stream, _("\n\
3114 gpr-names=ABI Print GPR names according to specified ABI.\n\
3115 Default: based on binary being disassembled.\n"));
3117 fprintf (stream, _("\n\
3118 fpr-names=ABI Print FPR names according to specified ABI.\n\
3119 Default: numeric.\n"));
3121 fprintf (stream, _("\n\
3122 cp0-names=ARCH Print CP0 register names according to\n\
3123 specified architecture.\n\
3124 Default: based on binary being disassembled.\n"));
3126 fprintf (stream, _("\n\
3127 hwr-names=ARCH Print HWR names according to specified \n\
3129 Default: based on binary being disassembled.\n"));
3131 fprintf (stream, _("\n\
3132 reg-names=ABI Print GPR and FPR names according to\n\
3133 specified ABI.\n"));
3135 fprintf (stream, _("\n\
3136 reg-names=ARCH Print CP0 register and HWR names according to\n\
3137 specified architecture.\n"));
3139 fprintf (stream, _("\n\
3140 For the options above, the following values are supported for \"ABI\":\n\
3142 for (i = 0; i < ARRAY_SIZE (mips_abi_choices); i++)
3143 fprintf (stream, " %s", mips_abi_choices[i].name);
3144 fprintf (stream, _("\n"));
3146 fprintf (stream, _("\n\
3147 For the options above, The following values are supported for \"ARCH\":\n\
3149 for (i = 0; i < ARRAY_SIZE (mips_arch_choices); i++)
3150 if (*mips_arch_choices[i].name != '\0')
3151 fprintf (stream, " %s", mips_arch_choices[i].name);
3152 fprintf (stream, _("\n"));
3154 fprintf (stream, _("\n"));