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, 2007, 2008
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 #define mips16_reg_names(rn) mips_gpr_names[mips16_to_32_reg_map[rn]]
63 static const char * const mips_gpr_names_numeric
[32] =
65 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
66 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
67 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
68 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
71 static const char * const mips_gpr_names_oldabi
[32] =
73 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
74 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
75 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
76 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
79 static const char * const mips_gpr_names_newabi
[32] =
81 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
82 "a4", "a5", "a6", "a7", "t0", "t1", "t2", "t3",
83 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
84 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
87 static const char * const mips_fpr_names_numeric
[32] =
89 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
90 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
91 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
92 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31"
95 static const char * const mips_fpr_names_32
[32] =
97 "fv0", "fv0f", "fv1", "fv1f", "ft0", "ft0f", "ft1", "ft1f",
98 "ft2", "ft2f", "ft3", "ft3f", "fa0", "fa0f", "fa1", "fa1f",
99 "ft4", "ft4f", "ft5", "ft5f", "fs0", "fs0f", "fs1", "fs1f",
100 "fs2", "fs2f", "fs3", "fs3f", "fs4", "fs4f", "fs5", "fs5f"
103 static const char * const mips_fpr_names_n32
[32] =
105 "fv0", "ft14", "fv1", "ft15", "ft0", "ft1", "ft2", "ft3",
106 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
107 "fa4", "fa5", "fa6", "fa7", "fs0", "ft8", "fs1", "ft9",
108 "fs2", "ft10", "fs3", "ft11", "fs4", "ft12", "fs5", "ft13"
111 static const char * const mips_fpr_names_64
[32] =
113 "fv0", "ft12", "fv1", "ft13", "ft0", "ft1", "ft2", "ft3",
114 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
115 "fa4", "fa5", "fa6", "fa7", "ft8", "ft9", "ft10", "ft11",
116 "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7"
119 static const char * const mips_cp0_names_numeric
[32] =
121 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
122 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
123 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
124 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
127 static const char * const mips_cp0_names_r3000
[32] =
129 "c0_index", "c0_random", "c0_entrylo", "$3",
130 "c0_context", "$5", "$6", "$7",
131 "c0_badvaddr", "$9", "c0_entryhi", "$11",
132 "c0_sr", "c0_cause", "c0_epc", "c0_prid",
133 "$16", "$17", "$18", "$19",
134 "$20", "$21", "$22", "$23",
135 "$24", "$25", "$26", "$27",
136 "$28", "$29", "$30", "$31",
139 static const char * const mips_cp0_names_r4000
[32] =
141 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
142 "c0_context", "c0_pagemask", "c0_wired", "$7",
143 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
144 "c0_sr", "c0_cause", "c0_epc", "c0_prid",
145 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
146 "c0_xcontext", "$21", "$22", "$23",
147 "$24", "$25", "c0_ecc", "c0_cacheerr",
148 "c0_taglo", "c0_taghi", "c0_errorepc", "$31",
151 static const char * const mips_cp0_names_mips3264
[32] =
153 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
154 "c0_context", "c0_pagemask", "c0_wired", "$7",
155 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
156 "c0_status", "c0_cause", "c0_epc", "c0_prid",
157 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
158 "c0_xcontext", "$21", "$22", "c0_debug",
159 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr",
160 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
163 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264
[] =
165 { 16, 1, "c0_config1" },
166 { 16, 2, "c0_config2" },
167 { 16, 3, "c0_config3" },
168 { 18, 1, "c0_watchlo,1" },
169 { 18, 2, "c0_watchlo,2" },
170 { 18, 3, "c0_watchlo,3" },
171 { 18, 4, "c0_watchlo,4" },
172 { 18, 5, "c0_watchlo,5" },
173 { 18, 6, "c0_watchlo,6" },
174 { 18, 7, "c0_watchlo,7" },
175 { 19, 1, "c0_watchhi,1" },
176 { 19, 2, "c0_watchhi,2" },
177 { 19, 3, "c0_watchhi,3" },
178 { 19, 4, "c0_watchhi,4" },
179 { 19, 5, "c0_watchhi,5" },
180 { 19, 6, "c0_watchhi,6" },
181 { 19, 7, "c0_watchhi,7" },
182 { 25, 1, "c0_perfcnt,1" },
183 { 25, 2, "c0_perfcnt,2" },
184 { 25, 3, "c0_perfcnt,3" },
185 { 25, 4, "c0_perfcnt,4" },
186 { 25, 5, "c0_perfcnt,5" },
187 { 25, 6, "c0_perfcnt,6" },
188 { 25, 7, "c0_perfcnt,7" },
189 { 27, 1, "c0_cacheerr,1" },
190 { 27, 2, "c0_cacheerr,2" },
191 { 27, 3, "c0_cacheerr,3" },
192 { 28, 1, "c0_datalo" },
193 { 29, 1, "c0_datahi" }
196 static const char * const mips_cp0_names_mips3264r2
[32] =
198 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
199 "c0_context", "c0_pagemask", "c0_wired", "c0_hwrena",
200 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
201 "c0_status", "c0_cause", "c0_epc", "c0_prid",
202 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
203 "c0_xcontext", "$21", "$22", "c0_debug",
204 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr",
205 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
208 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264r2
[] =
210 { 4, 1, "c0_contextconfig" },
211 { 0, 1, "c0_mvpcontrol" },
212 { 0, 2, "c0_mvpconf0" },
213 { 0, 3, "c0_mvpconf1" },
214 { 1, 1, "c0_vpecontrol" },
215 { 1, 2, "c0_vpeconf0" },
216 { 1, 3, "c0_vpeconf1" },
217 { 1, 4, "c0_yqmask" },
218 { 1, 5, "c0_vpeschedule" },
219 { 1, 6, "c0_vpeschefback" },
220 { 2, 1, "c0_tcstatus" },
221 { 2, 2, "c0_tcbind" },
222 { 2, 3, "c0_tcrestart" },
223 { 2, 4, "c0_tchalt" },
224 { 2, 5, "c0_tccontext" },
225 { 2, 6, "c0_tcschedule" },
226 { 2, 7, "c0_tcschefback" },
227 { 5, 1, "c0_pagegrain" },
228 { 6, 1, "c0_srsconf0" },
229 { 6, 2, "c0_srsconf1" },
230 { 6, 3, "c0_srsconf2" },
231 { 6, 4, "c0_srsconf3" },
232 { 6, 5, "c0_srsconf4" },
233 { 12, 1, "c0_intctl" },
234 { 12, 2, "c0_srsctl" },
235 { 12, 3, "c0_srsmap" },
236 { 15, 1, "c0_ebase" },
237 { 16, 1, "c0_config1" },
238 { 16, 2, "c0_config2" },
239 { 16, 3, "c0_config3" },
240 { 18, 1, "c0_watchlo,1" },
241 { 18, 2, "c0_watchlo,2" },
242 { 18, 3, "c0_watchlo,3" },
243 { 18, 4, "c0_watchlo,4" },
244 { 18, 5, "c0_watchlo,5" },
245 { 18, 6, "c0_watchlo,6" },
246 { 18, 7, "c0_watchlo,7" },
247 { 19, 1, "c0_watchhi,1" },
248 { 19, 2, "c0_watchhi,2" },
249 { 19, 3, "c0_watchhi,3" },
250 { 19, 4, "c0_watchhi,4" },
251 { 19, 5, "c0_watchhi,5" },
252 { 19, 6, "c0_watchhi,6" },
253 { 19, 7, "c0_watchhi,7" },
254 { 23, 1, "c0_tracecontrol" },
255 { 23, 2, "c0_tracecontrol2" },
256 { 23, 3, "c0_usertracedata" },
257 { 23, 4, "c0_tracebpc" },
258 { 25, 1, "c0_perfcnt,1" },
259 { 25, 2, "c0_perfcnt,2" },
260 { 25, 3, "c0_perfcnt,3" },
261 { 25, 4, "c0_perfcnt,4" },
262 { 25, 5, "c0_perfcnt,5" },
263 { 25, 6, "c0_perfcnt,6" },
264 { 25, 7, "c0_perfcnt,7" },
265 { 27, 1, "c0_cacheerr,1" },
266 { 27, 2, "c0_cacheerr,2" },
267 { 27, 3, "c0_cacheerr,3" },
268 { 28, 1, "c0_datalo" },
269 { 28, 2, "c0_taglo1" },
270 { 28, 3, "c0_datalo1" },
271 { 28, 4, "c0_taglo2" },
272 { 28, 5, "c0_datalo2" },
273 { 28, 6, "c0_taglo3" },
274 { 28, 7, "c0_datalo3" },
275 { 29, 1, "c0_datahi" },
276 { 29, 2, "c0_taghi1" },
277 { 29, 3, "c0_datahi1" },
278 { 29, 4, "c0_taghi2" },
279 { 29, 5, "c0_datahi2" },
280 { 29, 6, "c0_taghi3" },
281 { 29, 7, "c0_datahi3" },
284 /* SB-1: MIPS64 (mips_cp0_names_mips3264) with minor mods. */
285 static const char * const mips_cp0_names_sb1
[32] =
287 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
288 "c0_context", "c0_pagemask", "c0_wired", "$7",
289 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
290 "c0_status", "c0_cause", "c0_epc", "c0_prid",
291 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
292 "c0_xcontext", "$21", "$22", "c0_debug",
293 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr_i",
294 "c0_taglo_i", "c0_taghi_i", "c0_errorepc", "c0_desave",
297 static const struct mips_cp0sel_name mips_cp0sel_names_sb1
[] =
299 { 16, 1, "c0_config1" },
300 { 18, 1, "c0_watchlo,1" },
301 { 19, 1, "c0_watchhi,1" },
302 { 22, 0, "c0_perftrace" },
303 { 23, 3, "c0_edebug" },
304 { 25, 1, "c0_perfcnt,1" },
305 { 25, 2, "c0_perfcnt,2" },
306 { 25, 3, "c0_perfcnt,3" },
307 { 25, 4, "c0_perfcnt,4" },
308 { 25, 5, "c0_perfcnt,5" },
309 { 25, 6, "c0_perfcnt,6" },
310 { 25, 7, "c0_perfcnt,7" },
311 { 26, 1, "c0_buserr_pa" },
312 { 27, 1, "c0_cacheerr_d" },
313 { 27, 3, "c0_cacheerr_d_pa" },
314 { 28, 1, "c0_datalo_i" },
315 { 28, 2, "c0_taglo_d" },
316 { 28, 3, "c0_datalo_d" },
317 { 29, 1, "c0_datahi_i" },
318 { 29, 2, "c0_taghi_d" },
319 { 29, 3, "c0_datahi_d" },
322 static const char * const mips_hwr_names_numeric
[32] =
324 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
325 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
326 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
327 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
330 static const char * const mips_hwr_names_mips3264r2
[32] =
332 "hwr_cpunum", "hwr_synci_step", "hwr_cc", "hwr_ccres",
333 "$4", "$5", "$6", "$7",
334 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
335 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
336 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
339 struct mips_abi_choice
342 const char * const *gpr_names
;
343 const char * const *fpr_names
;
346 struct mips_abi_choice mips_abi_choices
[] =
348 { "numeric", mips_gpr_names_numeric
, mips_fpr_names_numeric
},
349 { "32", mips_gpr_names_oldabi
, mips_fpr_names_32
},
350 { "n32", mips_gpr_names_newabi
, mips_fpr_names_n32
},
351 { "64", mips_gpr_names_newabi
, mips_fpr_names_64
},
354 struct mips_arch_choice
358 unsigned long bfd_mach
;
361 const char * const *cp0_names
;
362 const struct mips_cp0sel_name
*cp0sel_names
;
363 unsigned int cp0sel_names_len
;
364 const char * const *hwr_names
;
367 const struct mips_arch_choice mips_arch_choices
[] =
369 { "numeric", 0, 0, 0, 0,
370 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
372 { "r3000", 1, bfd_mach_mips3000
, CPU_R3000
, ISA_MIPS1
,
373 mips_cp0_names_r3000
, NULL
, 0, mips_hwr_names_numeric
},
374 { "r3900", 1, bfd_mach_mips3900
, CPU_R3900
, ISA_MIPS1
,
375 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
376 { "r4000", 1, bfd_mach_mips4000
, CPU_R4000
, ISA_MIPS3
,
377 mips_cp0_names_r4000
, NULL
, 0, mips_hwr_names_numeric
},
378 { "r4010", 1, bfd_mach_mips4010
, CPU_R4010
, ISA_MIPS2
,
379 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
380 { "vr4100", 1, bfd_mach_mips4100
, CPU_VR4100
, ISA_MIPS3
,
381 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
382 { "vr4111", 1, bfd_mach_mips4111
, CPU_R4111
, ISA_MIPS3
,
383 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
384 { "vr4120", 1, bfd_mach_mips4120
, CPU_VR4120
, ISA_MIPS3
,
385 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
386 { "r4300", 1, bfd_mach_mips4300
, CPU_R4300
, ISA_MIPS3
,
387 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
388 { "r4400", 1, bfd_mach_mips4400
, CPU_R4400
, ISA_MIPS3
,
389 mips_cp0_names_r4000
, NULL
, 0, mips_hwr_names_numeric
},
390 { "r4600", 1, bfd_mach_mips4600
, CPU_R4600
, ISA_MIPS3
,
391 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
392 { "r4650", 1, bfd_mach_mips4650
, CPU_R4650
, ISA_MIPS3
,
393 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
394 { "r5000", 1, bfd_mach_mips5000
, CPU_R5000
, ISA_MIPS4
,
395 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
396 { "vr5400", 1, bfd_mach_mips5400
, CPU_VR5400
, ISA_MIPS4
,
397 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
398 { "vr5500", 1, bfd_mach_mips5500
, CPU_VR5500
, ISA_MIPS4
,
399 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
400 { "r6000", 1, bfd_mach_mips6000
, CPU_R6000
, ISA_MIPS2
,
401 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
402 { "rm7000", 1, bfd_mach_mips7000
, CPU_RM7000
, ISA_MIPS4
,
403 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
404 { "rm9000", 1, bfd_mach_mips7000
, CPU_RM7000
, ISA_MIPS4
,
405 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
406 { "r8000", 1, bfd_mach_mips8000
, CPU_R8000
, ISA_MIPS4
,
407 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
408 { "r10000", 1, bfd_mach_mips10000
, CPU_R10000
, ISA_MIPS4
,
409 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
410 { "r12000", 1, bfd_mach_mips12000
, CPU_R12000
, ISA_MIPS4
,
411 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
412 { "r14000", 1, bfd_mach_mips14000
, CPU_R14000
, ISA_MIPS4
,
413 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
414 { "r16000", 1, bfd_mach_mips16000
, CPU_R16000
, ISA_MIPS4
,
415 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
416 { "mips5", 1, bfd_mach_mips5
, CPU_MIPS5
, ISA_MIPS5
,
417 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
419 /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
420 Note that MIPS-3D and MDMX are not applicable to MIPS32. (See
421 _MIPS32 Architecture For Programmers Volume I: Introduction to the
422 MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
424 { "mips32", 1, bfd_mach_mipsisa32
, CPU_MIPS32
,
425 ISA_MIPS32
| INSN_MIPS16
| INSN_SMARTMIPS
,
426 mips_cp0_names_mips3264
,
427 mips_cp0sel_names_mips3264
, ARRAY_SIZE (mips_cp0sel_names_mips3264
),
428 mips_hwr_names_numeric
},
430 { "mips32r2", 1, bfd_mach_mipsisa32r2
, CPU_MIPS32R2
,
431 (ISA_MIPS32R2
| INSN_MIPS16
| INSN_SMARTMIPS
| INSN_DSP
| INSN_DSPR2
432 | INSN_MIPS3D
| INSN_MT
),
433 mips_cp0_names_mips3264r2
,
434 mips_cp0sel_names_mips3264r2
, ARRAY_SIZE (mips_cp0sel_names_mips3264r2
),
435 mips_hwr_names_mips3264r2
},
437 /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs. */
438 { "mips64", 1, bfd_mach_mipsisa64
, CPU_MIPS64
,
439 ISA_MIPS64
| INSN_MIPS16
| INSN_MIPS3D
| INSN_MDMX
,
440 mips_cp0_names_mips3264
,
441 mips_cp0sel_names_mips3264
, ARRAY_SIZE (mips_cp0sel_names_mips3264
),
442 mips_hwr_names_numeric
},
444 { "mips64r2", 1, bfd_mach_mipsisa64r2
, CPU_MIPS64R2
,
445 (ISA_MIPS64R2
| INSN_MIPS16
| INSN_MIPS3D
| INSN_DSP
| INSN_DSPR2
446 | INSN_DSP64
| INSN_MT
| INSN_MDMX
),
447 mips_cp0_names_mips3264r2
,
448 mips_cp0sel_names_mips3264r2
, ARRAY_SIZE (mips_cp0sel_names_mips3264r2
),
449 mips_hwr_names_mips3264r2
},
451 { "sb1", 1, bfd_mach_mips_sb1
, CPU_SB1
,
452 ISA_MIPS64
| INSN_MIPS3D
| INSN_SB1
,
454 mips_cp0sel_names_sb1
, ARRAY_SIZE (mips_cp0sel_names_sb1
),
455 mips_hwr_names_numeric
},
457 { "loongson2e", 1, bfd_mach_mips_loongson_2e
, CPU_LOONGSON_2E
,
458 ISA_MIPS3
| INSN_LOONGSON_2E
, mips_cp0_names_numeric
,
459 NULL
, 0, mips_hwr_names_numeric
},
461 { "loongson2f", 1, bfd_mach_mips_loongson_2f
, CPU_LOONGSON_2F
,
462 ISA_MIPS3
| INSN_LOONGSON_2F
, mips_cp0_names_numeric
,
463 NULL
, 0, mips_hwr_names_numeric
},
465 { "octeon", 1, bfd_mach_mips_octeon
, CPU_OCTEON
,
466 ISA_MIPS64R2
| INSN_OCTEON
, mips_cp0_names_numeric
, NULL
, 0,
467 mips_hwr_names_numeric
},
469 /* This entry, mips16, is here only for ISA/processor selection; do
470 not print its name. */
471 { "", 1, bfd_mach_mips16
, CPU_MIPS16
, ISA_MIPS3
| INSN_MIPS16
,
472 mips_cp0_names_numeric
, NULL
, 0, mips_hwr_names_numeric
},
475 /* ISA and processor type to disassemble for, and register names to use.
476 set_default_mips_dis_options and parse_mips_dis_options fill in these
478 static int mips_processor
;
480 static const char * const *mips_gpr_names
;
481 static const char * const *mips_fpr_names
;
482 static const char * const *mips_cp0_names
;
483 static const struct mips_cp0sel_name
*mips_cp0sel_names
;
484 static int mips_cp0sel_names_len
;
485 static const char * const *mips_hwr_names
;
488 static int no_aliases
; /* If set disassemble as most general inst. */
490 static const struct mips_abi_choice
*
491 choose_abi_by_name (const char *name
, unsigned int namelen
)
493 const struct mips_abi_choice
*c
;
496 for (i
= 0, c
= NULL
; i
< ARRAY_SIZE (mips_abi_choices
) && c
== NULL
; i
++)
497 if (strncmp (mips_abi_choices
[i
].name
, name
, namelen
) == 0
498 && strlen (mips_abi_choices
[i
].name
) == namelen
)
499 c
= &mips_abi_choices
[i
];
504 static const struct mips_arch_choice
*
505 choose_arch_by_name (const char *name
, unsigned int namelen
)
507 const struct mips_arch_choice
*c
= NULL
;
510 for (i
= 0, c
= NULL
; i
< ARRAY_SIZE (mips_arch_choices
) && c
== NULL
; i
++)
511 if (strncmp (mips_arch_choices
[i
].name
, name
, namelen
) == 0
512 && strlen (mips_arch_choices
[i
].name
) == namelen
)
513 c
= &mips_arch_choices
[i
];
518 static const struct mips_arch_choice
*
519 choose_arch_by_number (unsigned long mach
)
521 static unsigned long hint_bfd_mach
;
522 static const struct mips_arch_choice
*hint_arch_choice
;
523 const struct mips_arch_choice
*c
;
526 /* We optimize this because even if the user specifies no
527 flags, this will be done for every instruction! */
528 if (hint_bfd_mach
== mach
529 && hint_arch_choice
!= NULL
530 && hint_arch_choice
->bfd_mach
== hint_bfd_mach
)
531 return hint_arch_choice
;
533 for (i
= 0, c
= NULL
; i
< ARRAY_SIZE (mips_arch_choices
) && c
== NULL
; i
++)
535 if (mips_arch_choices
[i
].bfd_mach_valid
536 && mips_arch_choices
[i
].bfd_mach
== mach
)
538 c
= &mips_arch_choices
[i
];
539 hint_bfd_mach
= mach
;
540 hint_arch_choice
= c
;
546 /* Check if the object uses NewABI conventions. */
549 is_newabi (Elf_Internal_Ehdr
*header
)
551 /* There are no old-style ABIs which use 64-bit ELF. */
552 if (header
->e_ident
[EI_CLASS
] == ELFCLASS64
)
555 /* If a 32-bit ELF file, n32 is a new-style ABI. */
556 if ((header
->e_flags
& EF_MIPS_ABI2
) != 0)
563 set_default_mips_dis_options (struct disassemble_info
*info
)
565 const struct mips_arch_choice
*chosen_arch
;
567 /* Defaults: mipsIII/r3000 (?!), (o)32-style ("oldabi") GPR names,
568 and numeric FPR, CP0 register, and HWR names. */
569 mips_isa
= ISA_MIPS3
;
570 mips_processor
= CPU_R3000
;
571 mips_gpr_names
= mips_gpr_names_oldabi
;
572 mips_fpr_names
= mips_fpr_names_numeric
;
573 mips_cp0_names
= mips_cp0_names_numeric
;
574 mips_cp0sel_names
= NULL
;
575 mips_cp0sel_names_len
= 0;
576 mips_hwr_names
= mips_hwr_names_numeric
;
579 /* If an ELF "newabi" binary, use the n32/(n)64 GPR names. */
580 if (info
->flavour
== bfd_target_elf_flavour
&& info
->section
!= NULL
)
582 Elf_Internal_Ehdr
*header
;
584 header
= elf_elfheader (info
->section
->owner
);
585 if (is_newabi (header
))
586 mips_gpr_names
= mips_gpr_names_newabi
;
589 /* Set ISA, architecture, and cp0 register names as best we can. */
590 #if ! SYMTAB_AVAILABLE
591 /* This is running out on a target machine, not in a host tool.
592 FIXME: Where does mips_target_info come from? */
593 target_processor
= mips_target_info
.processor
;
594 mips_isa
= mips_target_info
.isa
;
596 chosen_arch
= choose_arch_by_number (info
->mach
);
597 if (chosen_arch
!= NULL
)
599 mips_processor
= chosen_arch
->processor
;
600 mips_isa
= chosen_arch
->isa
;
601 mips_cp0_names
= chosen_arch
->cp0_names
;
602 mips_cp0sel_names
= chosen_arch
->cp0sel_names
;
603 mips_cp0sel_names_len
= chosen_arch
->cp0sel_names_len
;
604 mips_hwr_names
= chosen_arch
->hwr_names
;
610 parse_mips_dis_option (const char *option
, unsigned int len
)
612 unsigned int i
, optionlen
, vallen
;
614 const struct mips_abi_choice
*chosen_abi
;
615 const struct mips_arch_choice
*chosen_arch
;
617 /* Try to match options that are simple flags */
618 if (CONST_STRNEQ (option
, "no-aliases"))
624 /* Look for the = that delimits the end of the option name. */
625 for (i
= 0; i
< len
; i
++)
626 if (option
[i
] == '=')
629 if (i
== 0) /* Invalid option: no name before '='. */
631 if (i
== len
) /* Invalid option: no '='. */
633 if (i
== (len
- 1)) /* Invalid option: no value after '='. */
637 val
= option
+ (optionlen
+ 1);
638 vallen
= len
- (optionlen
+ 1);
640 if (strncmp ("gpr-names", option
, optionlen
) == 0
641 && strlen ("gpr-names") == optionlen
)
643 chosen_abi
= choose_abi_by_name (val
, vallen
);
644 if (chosen_abi
!= NULL
)
645 mips_gpr_names
= chosen_abi
->gpr_names
;
649 if (strncmp ("fpr-names", option
, optionlen
) == 0
650 && strlen ("fpr-names") == optionlen
)
652 chosen_abi
= choose_abi_by_name (val
, vallen
);
653 if (chosen_abi
!= NULL
)
654 mips_fpr_names
= chosen_abi
->fpr_names
;
658 if (strncmp ("cp0-names", option
, optionlen
) == 0
659 && strlen ("cp0-names") == optionlen
)
661 chosen_arch
= choose_arch_by_name (val
, vallen
);
662 if (chosen_arch
!= NULL
)
664 mips_cp0_names
= chosen_arch
->cp0_names
;
665 mips_cp0sel_names
= chosen_arch
->cp0sel_names
;
666 mips_cp0sel_names_len
= chosen_arch
->cp0sel_names_len
;
671 if (strncmp ("hwr-names", option
, optionlen
) == 0
672 && strlen ("hwr-names") == optionlen
)
674 chosen_arch
= choose_arch_by_name (val
, vallen
);
675 if (chosen_arch
!= NULL
)
676 mips_hwr_names
= chosen_arch
->hwr_names
;
680 if (strncmp ("reg-names", option
, optionlen
) == 0
681 && strlen ("reg-names") == optionlen
)
683 /* We check both ABI and ARCH here unconditionally, so
684 that "numeric" will do the desirable thing: select
685 numeric register names for all registers. Other than
686 that, a given name probably won't match both. */
687 chosen_abi
= choose_abi_by_name (val
, vallen
);
688 if (chosen_abi
!= NULL
)
690 mips_gpr_names
= chosen_abi
->gpr_names
;
691 mips_fpr_names
= chosen_abi
->fpr_names
;
693 chosen_arch
= choose_arch_by_name (val
, vallen
);
694 if (chosen_arch
!= NULL
)
696 mips_cp0_names
= chosen_arch
->cp0_names
;
697 mips_cp0sel_names
= chosen_arch
->cp0sel_names
;
698 mips_cp0sel_names_len
= chosen_arch
->cp0sel_names_len
;
699 mips_hwr_names
= chosen_arch
->hwr_names
;
704 /* Invalid option. */
708 parse_mips_dis_options (const char *options
)
710 const char *option_end
;
715 while (*options
!= '\0')
717 /* Skip empty options. */
724 /* We know that *options is neither NUL or a comma. */
725 option_end
= options
+ 1;
726 while (*option_end
!= ',' && *option_end
!= '\0')
729 parse_mips_dis_option (options
, option_end
- options
);
731 /* Go on to the next one. If option_end points to a comma, it
732 will be skipped above. */
733 options
= option_end
;
737 static const struct mips_cp0sel_name
*
738 lookup_mips_cp0sel_name (const struct mips_cp0sel_name
*names
,
745 for (i
= 0; i
< len
; i
++)
746 if (names
[i
].cp0reg
== cp0reg
&& names
[i
].sel
== sel
)
751 /* Print insn arguments for 32/64-bit code. */
754 print_insn_args (const char *d
,
755 register unsigned long int l
,
757 struct disassemble_info
*info
,
758 const struct mips_opcode
*opp
)
761 unsigned int lsb
, msb
, msbd
;
765 for (; *d
!= '\0'; d
++)
774 (*info
->fprintf_func
) (info
->stream
, "%c", *d
);
778 /* Extension character; switch for second char. */
783 /* xgettext:c-format */
784 (*info
->fprintf_func
) (info
->stream
,
785 _("# internal error, incomplete extension sequence (+)"));
789 lsb
= (l
>> OP_SH_SHAMT
) & OP_MASK_SHAMT
;
790 (*info
->fprintf_func
) (info
->stream
, "0x%x", lsb
);
794 msb
= (l
>> OP_SH_INSMSB
) & OP_MASK_INSMSB
;
795 (*info
->fprintf_func
) (info
->stream
, "0x%x", msb
- lsb
+ 1);
799 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
800 (l
>> OP_SH_UDI1
) & OP_MASK_UDI1
);
804 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
805 (l
>> OP_SH_UDI2
) & OP_MASK_UDI2
);
809 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
810 (l
>> OP_SH_UDI3
) & OP_MASK_UDI3
);
814 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
815 (l
>> OP_SH_UDI4
) & OP_MASK_UDI4
);
820 msbd
= (l
>> OP_SH_EXTMSBD
) & OP_MASK_EXTMSBD
;
821 (*info
->fprintf_func
) (info
->stream
, "0x%x", msbd
+ 1);
826 const struct mips_cp0sel_name
*n
;
827 unsigned int cp0reg
, sel
;
829 cp0reg
= (l
>> OP_SH_RD
) & OP_MASK_RD
;
830 sel
= (l
>> OP_SH_SEL
) & OP_MASK_SEL
;
832 /* CP0 register including 'sel' code for mtcN (et al.), to be
833 printed textually if known. If not known, print both
834 CP0 register name and sel numerically since CP0 register
835 with sel 0 may have a name unrelated to register being
837 n
= lookup_mips_cp0sel_name(mips_cp0sel_names
,
838 mips_cp0sel_names_len
, cp0reg
, sel
);
840 (*info
->fprintf_func
) (info
->stream
, "%s", n
->name
);
842 (*info
->fprintf_func
) (info
->stream
, "$%d,%d", cp0reg
, sel
);
847 lsb
= ((l
>> OP_SH_SHAMT
) & OP_MASK_SHAMT
) + 32;
848 (*info
->fprintf_func
) (info
->stream
, "0x%x", lsb
);
852 msb
= ((l
>> OP_SH_INSMSB
) & OP_MASK_INSMSB
) + 32;
853 (*info
->fprintf_func
) (info
->stream
, "0x%x", msb
- lsb
+ 1);
857 msbd
= ((l
>> OP_SH_EXTMSBD
) & OP_MASK_EXTMSBD
) + 32;
858 (*info
->fprintf_func
) (info
->stream
, "0x%x", msbd
+ 1);
861 case 't': /* Coprocessor 0 reg name */
862 (*info
->fprintf_func
) (info
->stream
, "%s",
863 mips_cp0_names
[(l
>> OP_SH_RT
) &
867 case 'T': /* Coprocessor 0 reg name */
869 const struct mips_cp0sel_name
*n
;
870 unsigned int cp0reg
, sel
;
872 cp0reg
= (l
>> OP_SH_RT
) & OP_MASK_RT
;
873 sel
= (l
>> OP_SH_SEL
) & OP_MASK_SEL
;
875 /* CP0 register including 'sel' code for mftc0, to be
876 printed textually if known. If not known, print both
877 CP0 register name and sel numerically since CP0 register
878 with sel 0 may have a name unrelated to register being
880 n
= lookup_mips_cp0sel_name(mips_cp0sel_names
,
881 mips_cp0sel_names_len
, cp0reg
, sel
);
883 (*info
->fprintf_func
) (info
->stream
, "%s", n
->name
);
885 (*info
->fprintf_func
) (info
->stream
, "$%d,%d", cp0reg
, sel
);
889 case 'x': /* bbit bit index */
890 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
891 (l
>> OP_SH_BBITIND
) & OP_MASK_BBITIND
);
894 case 'p': /* cins, cins32, exts and exts32 position */
895 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
896 (l
>> OP_SH_CINSPOS
) & OP_MASK_CINSPOS
);
899 case 's': /* cins and exts length-minus-one */
900 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
901 (l
>> OP_SH_CINSLM1
) & OP_MASK_CINSLM1
);
904 case 'S': /* cins32 and exts32 length-minus-one field */
905 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
906 (l
>> OP_SH_CINSLM1
) & OP_MASK_CINSLM1
);
909 case 'Q': /* seqi/snei immediate field */
910 op
= (l
>> OP_SH_SEQI
) & OP_MASK_SEQI
;
911 /* Sign-extend it. */
912 op
= (op
^ 512) - 512;
913 (*info
->fprintf_func
) (info
->stream
, "%d", op
);
917 /* xgettext:c-format */
918 (*info
->fprintf_func
) (info
->stream
,
919 _("# internal error, undefined extension sequence (+%c)"),
926 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
927 (l
>> OP_SH_BP
) & OP_MASK_BP
);
931 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
932 (l
>> OP_SH_SA3
) & OP_MASK_SA3
);
936 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
937 (l
>> OP_SH_SA4
) & OP_MASK_SA4
);
941 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
942 (l
>> OP_SH_IMM8
) & OP_MASK_IMM8
);
946 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
947 (l
>> OP_SH_RS
) & OP_MASK_RS
);
951 (*info
->fprintf_func
) (info
->stream
, "$ac%ld",
952 (l
>> OP_SH_DSPACC
) & OP_MASK_DSPACC
);
956 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
957 (l
>> OP_SH_WRDSP
) & OP_MASK_WRDSP
);
961 (*info
->fprintf_func
) (info
->stream
, "$ac%ld",
962 (l
>> OP_SH_DSPACC_S
) & OP_MASK_DSPACC_S
);
965 case '0': /* dsp 6-bit signed immediate in bit 20 */
966 delta
= ((l
>> OP_SH_DSPSFT
) & OP_MASK_DSPSFT
);
967 if (delta
& 0x20) /* test sign bit */
968 delta
|= ~OP_MASK_DSPSFT
;
969 (*info
->fprintf_func
) (info
->stream
, "%d", delta
);
972 case ':': /* dsp 7-bit signed immediate in bit 19 */
973 delta
= ((l
>> OP_SH_DSPSFT_7
) & OP_MASK_DSPSFT_7
);
974 if (delta
& 0x40) /* test sign bit */
975 delta
|= ~OP_MASK_DSPSFT_7
;
976 (*info
->fprintf_func
) (info
->stream
, "%d", delta
);
980 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
981 (l
>> OP_SH_RDDSP
) & OP_MASK_RDDSP
);
984 case '@': /* dsp 10-bit signed immediate in bit 16 */
985 delta
= ((l
>> OP_SH_IMM10
) & OP_MASK_IMM10
);
986 if (delta
& 0x200) /* test sign bit */
987 delta
|= ~OP_MASK_IMM10
;
988 (*info
->fprintf_func
) (info
->stream
, "%d", delta
);
992 (*info
->fprintf_func
) (info
->stream
, "%ld",
993 (l
>> OP_SH_MT_U
) & OP_MASK_MT_U
);
997 (*info
->fprintf_func
) (info
->stream
, "%ld",
998 (l
>> OP_SH_MT_H
) & OP_MASK_MT_H
);
1002 (*info
->fprintf_func
) (info
->stream
, "$ac%ld",
1003 (l
>> OP_SH_MTACC_T
) & OP_MASK_MTACC_T
);
1007 (*info
->fprintf_func
) (info
->stream
, "$ac%ld",
1008 (l
>> OP_SH_MTACC_D
) & OP_MASK_MTACC_D
);
1012 /* Coprocessor register for CTTC1, MTTC2, MTHC2, CTTC2. */
1013 (*info
->fprintf_func
) (info
->stream
, "$%ld",
1014 (l
>> OP_SH_RD
) & OP_MASK_RD
);
1021 (*info
->fprintf_func
) (info
->stream
, "%s",
1022 mips_gpr_names
[(l
>> OP_SH_RS
) & OP_MASK_RS
]);
1027 (*info
->fprintf_func
) (info
->stream
, "%s",
1028 mips_gpr_names
[(l
>> OP_SH_RT
) & OP_MASK_RT
]);
1033 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
1034 (l
>> OP_SH_IMMEDIATE
) & OP_MASK_IMMEDIATE
);
1037 case 'j': /* Same as i, but sign-extended. */
1039 delta
= (l
>> OP_SH_DELTA
) & OP_MASK_DELTA
;
1042 (*info
->fprintf_func
) (info
->stream
, "%d",
1047 (*info
->fprintf_func
) (info
->stream
, "0x%x",
1048 (unsigned int) ((l
>> OP_SH_PREFX
)
1053 (*info
->fprintf_func
) (info
->stream
, "0x%x",
1054 (unsigned int) ((l
>> OP_SH_CACHE
)
1059 info
->target
= (((pc
+ 4) & ~(bfd_vma
) 0x0fffffff)
1060 | (((l
>> OP_SH_TARGET
) & OP_MASK_TARGET
) << 2));
1061 /* For gdb disassembler, force odd address on jalx. */
1062 if (info
->flavour
== bfd_target_unknown_flavour
1063 && strcmp (opp
->name
, "jalx") == 0)
1065 (*info
->print_address_func
) (info
->target
, info
);
1069 /* Sign extend the displacement. */
1070 delta
= (l
>> OP_SH_DELTA
) & OP_MASK_DELTA
;
1073 info
->target
= (delta
<< 2) + pc
+ INSNLEN
;
1074 (*info
->print_address_func
) (info
->target
, info
);
1078 (*info
->fprintf_func
) (info
->stream
, "%s",
1079 mips_gpr_names
[(l
>> OP_SH_RD
) & OP_MASK_RD
]);
1084 /* First check for both rd and rt being equal. */
1085 unsigned int reg
= (l
>> OP_SH_RD
) & OP_MASK_RD
;
1086 if (reg
== ((l
>> OP_SH_RT
) & OP_MASK_RT
))
1087 (*info
->fprintf_func
) (info
->stream
, "%s",
1088 mips_gpr_names
[reg
]);
1091 /* If one is zero use the other. */
1093 (*info
->fprintf_func
) (info
->stream
, "%s",
1094 mips_gpr_names
[(l
>> OP_SH_RT
) & OP_MASK_RT
]);
1095 else if (((l
>> OP_SH_RT
) & OP_MASK_RT
) == 0)
1096 (*info
->fprintf_func
) (info
->stream
, "%s",
1097 mips_gpr_names
[reg
]);
1098 else /* Bogus, result depends on processor. */
1099 (*info
->fprintf_func
) (info
->stream
, "%s or %s",
1100 mips_gpr_names
[reg
],
1101 mips_gpr_names
[(l
>> OP_SH_RT
) & OP_MASK_RT
]);
1107 (*info
->fprintf_func
) (info
->stream
, "%s", mips_gpr_names
[0]);
1112 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
1113 (l
>> OP_SH_SHAMT
) & OP_MASK_SHAMT
);
1117 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
1118 (l
>> OP_SH_CODE
) & OP_MASK_CODE
);
1122 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
1123 (l
>> OP_SH_CODE2
) & OP_MASK_CODE2
);
1127 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
1128 (l
>> OP_SH_COPZ
) & OP_MASK_COPZ
);
1132 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
1134 (l
>> OP_SH_CODE20
) & OP_MASK_CODE20
);
1138 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
1139 (l
>> OP_SH_CODE19
) & OP_MASK_CODE19
);
1144 (*info
->fprintf_func
) (info
->stream
, "%s",
1145 mips_fpr_names
[(l
>> OP_SH_FS
) & OP_MASK_FS
]);
1150 (*info
->fprintf_func
) (info
->stream
, "%s",
1151 mips_fpr_names
[(l
>> OP_SH_FT
) & OP_MASK_FT
]);
1155 (*info
->fprintf_func
) (info
->stream
, "%s",
1156 mips_fpr_names
[(l
>> OP_SH_FD
) & OP_MASK_FD
]);
1160 (*info
->fprintf_func
) (info
->stream
, "%s",
1161 mips_fpr_names
[(l
>> OP_SH_FR
) & OP_MASK_FR
]);
1165 /* Coprocessor register for lwcN instructions, et al.
1167 Note that there is no load/store cp0 instructions, and
1168 that FPU (cp1) instructions disassemble this field using
1169 'T' format. Therefore, until we gain understanding of
1170 cp2 register names, we can simply print the register
1172 (*info
->fprintf_func
) (info
->stream
, "$%ld",
1173 (l
>> OP_SH_RT
) & OP_MASK_RT
);
1177 /* Coprocessor register for mtcN instructions, et al. Note
1178 that FPU (cp1) instructions disassemble this field using
1179 'S' format. Therefore, we only need to worry about cp0,
1181 op
= (l
>> OP_SH_OP
) & OP_MASK_OP
;
1182 if (op
== OP_OP_COP0
)
1183 (*info
->fprintf_func
) (info
->stream
, "%s",
1184 mips_cp0_names
[(l
>> OP_SH_RD
) & OP_MASK_RD
]);
1186 (*info
->fprintf_func
) (info
->stream
, "$%ld",
1187 (l
>> OP_SH_RD
) & OP_MASK_RD
);
1191 (*info
->fprintf_func
) (info
->stream
, "%s",
1192 mips_hwr_names
[(l
>> OP_SH_RD
) & OP_MASK_RD
]);
1196 (*info
->fprintf_func
) (info
->stream
,
1197 ((opp
->pinfo
& (FP_D
| FP_S
)) != 0
1198 ? "$fcc%ld" : "$cc%ld"),
1199 (l
>> OP_SH_BCC
) & OP_MASK_BCC
);
1203 (*info
->fprintf_func
) (info
->stream
, "$fcc%ld",
1204 (l
>> OP_SH_CCC
) & OP_MASK_CCC
);
1208 (*info
->fprintf_func
) (info
->stream
, "%ld",
1209 (l
>> OP_SH_PERFREG
) & OP_MASK_PERFREG
);
1213 (*info
->fprintf_func
) (info
->stream
, "%ld",
1214 (l
>> OP_SH_VECBYTE
) & OP_MASK_VECBYTE
);
1218 (*info
->fprintf_func
) (info
->stream
, "%ld",
1219 (l
>> OP_SH_VECALIGN
) & OP_MASK_VECALIGN
);
1223 (*info
->fprintf_func
) (info
->stream
, "%ld",
1224 (l
>> OP_SH_SEL
) & OP_MASK_SEL
);
1228 (*info
->fprintf_func
) (info
->stream
, "%ld",
1229 (l
>> OP_SH_ALN
) & OP_MASK_ALN
);
1234 unsigned int vsel
= (l
>> OP_SH_VSEL
) & OP_MASK_VSEL
;
1236 if ((vsel
& 0x10) == 0)
1241 for (fmt
= 0; fmt
< 3; fmt
++, vsel
>>= 1)
1242 if ((vsel
& 1) == 0)
1244 (*info
->fprintf_func
) (info
->stream
, "$v%ld[%d]",
1245 (l
>> OP_SH_FT
) & OP_MASK_FT
,
1248 else if ((vsel
& 0x08) == 0)
1250 (*info
->fprintf_func
) (info
->stream
, "$v%ld",
1251 (l
>> OP_SH_FT
) & OP_MASK_FT
);
1255 (*info
->fprintf_func
) (info
->stream
, "0x%lx",
1256 (l
>> OP_SH_FT
) & OP_MASK_FT
);
1262 (*info
->fprintf_func
) (info
->stream
, "$v%ld",
1263 (l
>> OP_SH_FD
) & OP_MASK_FD
);
1267 (*info
->fprintf_func
) (info
->stream
, "$v%ld",
1268 (l
>> OP_SH_FS
) & OP_MASK_FS
);
1272 (*info
->fprintf_func
) (info
->stream
, "$v%ld",
1273 (l
>> OP_SH_FT
) & OP_MASK_FT
);
1277 /* xgettext:c-format */
1278 (*info
->fprintf_func
) (info
->stream
,
1279 _("# internal error, undefined modifier (%c)"),
1286 /* Print the mips instruction at address MEMADDR in debugged memory,
1287 on using INFO. Returns length of the instruction, in bytes, which is
1288 always INSNLEN. BIGENDIAN must be 1 if this is big-endian code, 0 if
1289 this is little-endian code. */
1292 print_insn_mips (bfd_vma memaddr
,
1293 unsigned long int word
,
1294 struct disassemble_info
*info
)
1296 const struct mips_opcode
*op
;
1297 static bfd_boolean init
= 0;
1298 static const struct mips_opcode
*mips_hash
[OP_MASK_OP
+ 1];
1300 /* Build a hash table to shorten the search time. */
1305 for (i
= 0; i
<= OP_MASK_OP
; i
++)
1307 for (op
= mips_opcodes
; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
1309 if (op
->pinfo
== INSN_MACRO
1310 || (no_aliases
&& (op
->pinfo2
& INSN2_ALIAS
)))
1312 if (i
== ((op
->match
>> OP_SH_OP
) & OP_MASK_OP
))
1323 info
->bytes_per_chunk
= INSNLEN
;
1324 info
->display_endian
= info
->endian
;
1325 info
->insn_info_valid
= 1;
1326 info
->branch_delay_insns
= 0;
1327 info
->data_size
= 0;
1328 info
->insn_type
= dis_nonbranch
;
1332 op
= mips_hash
[(word
>> OP_SH_OP
) & OP_MASK_OP
];
1335 for (; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
1337 if (op
->pinfo
!= INSN_MACRO
1338 && !(no_aliases
&& (op
->pinfo2
& INSN2_ALIAS
))
1339 && (word
& op
->mask
) == op
->match
)
1343 /* We always allow to disassemble the jalx instruction. */
1344 if (! OPCODE_IS_MEMBER (op
, mips_isa
, mips_processor
)
1345 && strcmp (op
->name
, "jalx"))
1348 /* Figure out instruction type and branch delay information. */
1349 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
1351 if ((info
->insn_type
& INSN_WRITE_GPR_31
) != 0)
1352 info
->insn_type
= dis_jsr
;
1354 info
->insn_type
= dis_branch
;
1355 info
->branch_delay_insns
= 1;
1357 else if ((op
->pinfo
& (INSN_COND_BRANCH_DELAY
1358 | INSN_COND_BRANCH_LIKELY
)) != 0)
1360 if ((info
->insn_type
& INSN_WRITE_GPR_31
) != 0)
1361 info
->insn_type
= dis_condjsr
;
1363 info
->insn_type
= dis_condbranch
;
1364 info
->branch_delay_insns
= 1;
1366 else if ((op
->pinfo
& (INSN_STORE_MEMORY
1367 | INSN_LOAD_MEMORY_DELAY
)) != 0)
1368 info
->insn_type
= dis_dref
;
1370 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
1373 if (d
!= NULL
&& *d
!= '\0')
1375 (*info
->fprintf_func
) (info
->stream
, "\t");
1376 print_insn_args (d
, word
, memaddr
, info
, op
);
1384 /* Handle undefined instructions. */
1385 info
->insn_type
= dis_noninsn
;
1386 (*info
->fprintf_func
) (info
->stream
, "0x%lx", word
);
1390 /* Disassemble an operand for a mips16 instruction. */
1393 print_mips16_insn_arg (char type
,
1394 const struct mips_opcode
*op
,
1396 bfd_boolean use_extend
,
1399 struct disassemble_info
*info
)
1406 (*info
->fprintf_func
) (info
->stream
, "%c", type
);
1411 (*info
->fprintf_func
) (info
->stream
, "%s",
1412 mips16_reg_names(((l
>> MIPS16OP_SH_RY
)
1413 & MIPS16OP_MASK_RY
)));
1418 (*info
->fprintf_func
) (info
->stream
, "%s",
1419 mips16_reg_names(((l
>> MIPS16OP_SH_RX
)
1420 & MIPS16OP_MASK_RX
)));
1424 (*info
->fprintf_func
) (info
->stream
, "%s",
1425 mips16_reg_names(((l
>> MIPS16OP_SH_RZ
)
1426 & MIPS16OP_MASK_RZ
)));
1430 (*info
->fprintf_func
) (info
->stream
, "%s",
1431 mips16_reg_names(((l
>> MIPS16OP_SH_MOVE32Z
)
1432 & MIPS16OP_MASK_MOVE32Z
)));
1436 (*info
->fprintf_func
) (info
->stream
, "%s", mips_gpr_names
[0]);
1440 (*info
->fprintf_func
) (info
->stream
, "%s", mips_gpr_names
[29]);
1444 (*info
->fprintf_func
) (info
->stream
, "$pc");
1448 (*info
->fprintf_func
) (info
->stream
, "%s", mips_gpr_names
[31]);
1452 (*info
->fprintf_func
) (info
->stream
, "%s",
1453 mips_gpr_names
[((l
>> MIPS16OP_SH_REGR32
)
1454 & MIPS16OP_MASK_REGR32
)]);
1458 (*info
->fprintf_func
) (info
->stream
, "%s",
1459 mips_gpr_names
[MIPS16OP_EXTRACT_REG32R (l
)]);
1485 int immed
, nbits
, shift
, signedp
, extbits
, pcrel
, extu
, branch
;
1497 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
1503 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
1509 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
1515 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
1521 immed
= (l
>> MIPS16OP_SH_IMM4
) & MIPS16OP_MASK_IMM4
;
1527 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1528 info
->insn_type
= dis_dref
;
1529 info
->data_size
= 1;
1534 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1535 info
->insn_type
= dis_dref
;
1536 info
->data_size
= 2;
1541 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1542 if ((op
->pinfo
& MIPS16_INSN_READ_PC
) == 0
1543 && (op
->pinfo
& MIPS16_INSN_READ_SP
) == 0)
1545 info
->insn_type
= dis_dref
;
1546 info
->data_size
= 4;
1552 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1553 info
->insn_type
= dis_dref
;
1554 info
->data_size
= 8;
1558 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1563 immed
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1567 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1572 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1573 /* FIXME: This might be lw, or it might be addiu to $sp or
1574 $pc. We assume it's load. */
1575 info
->insn_type
= dis_dref
;
1576 info
->data_size
= 4;
1581 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1582 info
->insn_type
= dis_dref
;
1583 info
->data_size
= 8;
1587 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1592 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1598 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1603 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1607 info
->insn_type
= dis_condbranch
;
1611 immed
= (l
>> MIPS16OP_SH_IMM11
) & MIPS16OP_MASK_IMM11
;
1615 info
->insn_type
= dis_branch
;
1620 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1622 /* FIXME: This can be lw or la. We assume it is lw. */
1623 info
->insn_type
= dis_dref
;
1624 info
->data_size
= 4;
1629 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1631 info
->insn_type
= dis_dref
;
1632 info
->data_size
= 8;
1637 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1646 if (signedp
&& immed
>= (1 << (nbits
- 1)))
1647 immed
-= 1 << nbits
;
1649 if ((type
== '<' || type
== '>' || type
== '[' || type
== ']')
1656 immed
|= ((extend
& 0x1f) << 11) | (extend
& 0x7e0);
1657 else if (extbits
== 15)
1658 immed
|= ((extend
& 0xf) << 11) | (extend
& 0x7f0);
1660 immed
= ((extend
>> 6) & 0x1f) | (extend
& 0x20);
1661 immed
&= (1 << extbits
) - 1;
1662 if (! extu
&& immed
>= (1 << (extbits
- 1)))
1663 immed
-= 1 << extbits
;
1667 (*info
->fprintf_func
) (info
->stream
, "%d", immed
);
1675 baseaddr
= memaddr
+ 2;
1677 else if (use_extend
)
1678 baseaddr
= memaddr
- 2;
1686 /* If this instruction is in the delay slot of a jr
1687 instruction, the base address is the address of the
1688 jr instruction. If it is in the delay slot of jalr
1689 instruction, the base address is the address of the
1690 jalr instruction. This test is unreliable: we have
1691 no way of knowing whether the previous word is
1692 instruction or data. */
1693 status
= (*info
->read_memory_func
) (memaddr
- 4, buffer
, 2,
1696 && (((info
->endian
== BFD_ENDIAN_BIG
1697 ? bfd_getb16 (buffer
)
1698 : bfd_getl16 (buffer
))
1699 & 0xf800) == 0x1800))
1700 baseaddr
= memaddr
- 4;
1703 status
= (*info
->read_memory_func
) (memaddr
- 2, buffer
,
1706 && (((info
->endian
== BFD_ENDIAN_BIG
1707 ? bfd_getb16 (buffer
)
1708 : bfd_getl16 (buffer
))
1709 & 0xf81f) == 0xe800))
1710 baseaddr
= memaddr
- 2;
1713 info
->target
= (baseaddr
& ~((1 << shift
) - 1)) + immed
;
1715 && info
->flavour
== bfd_target_unknown_flavour
)
1716 /* For gdb disassembler, maintain odd address. */
1718 (*info
->print_address_func
) (info
->target
, info
);
1725 int jalx
= l
& 0x400;
1729 l
= ((l
& 0x1f) << 23) | ((l
& 0x3e0) << 13) | (extend
<< 2);
1730 if (!jalx
&& info
->flavour
== bfd_target_unknown_flavour
)
1731 /* For gdb disassembler, maintain odd address. */
1734 info
->target
= ((memaddr
+ 4) & ~(bfd_vma
) 0x0fffffff) | l
;
1735 (*info
->print_address_func
) (info
->target
, info
);
1736 info
->insn_type
= dis_jsr
;
1737 info
->branch_delay_insns
= 1;
1743 int need_comma
, amask
, smask
;
1747 l
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1749 amask
= (l
>> 3) & 7;
1751 if (amask
> 0 && amask
< 5)
1753 (*info
->fprintf_func
) (info
->stream
, "%s", mips_gpr_names
[4]);
1755 (*info
->fprintf_func
) (info
->stream
, "-%s",
1756 mips_gpr_names
[amask
+ 3]);
1760 smask
= (l
>> 1) & 3;
1763 (*info
->fprintf_func
) (info
->stream
, "%s??",
1764 need_comma
? "," : "");
1769 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1770 need_comma
? "," : "",
1771 mips_gpr_names
[16]);
1773 (*info
->fprintf_func
) (info
->stream
, "-%s",
1774 mips_gpr_names
[smask
+ 15]);
1780 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1781 need_comma
? "," : "",
1782 mips_gpr_names
[31]);
1786 if (amask
== 5 || amask
== 6)
1788 (*info
->fprintf_func
) (info
->stream
, "%s$f0",
1789 need_comma
? "," : "");
1791 (*info
->fprintf_func
) (info
->stream
, "-$f1");
1798 /* MIPS16e save/restore. */
1801 int amask
, args
, statics
;
1810 amask
= (l
>> 16) & 0xf;
1811 if (amask
== MIPS16_ALL_ARGS
)
1816 else if (amask
== MIPS16_ALL_STATICS
)
1824 statics
= amask
& 3;
1828 (*info
->fprintf_func
) (info
->stream
, "%s", mips_gpr_names
[4]);
1830 (*info
->fprintf_func
) (info
->stream
, "-%s",
1831 mips_gpr_names
[4 + args
- 1]);
1835 framesz
= (((l
>> 16) & 0xf0) | (l
& 0x0f)) * 8;
1836 if (framesz
== 0 && !use_extend
)
1839 (*info
->fprintf_func
) (info
->stream
, "%s%d",
1840 need_comma
? "," : "",
1843 if (l
& 0x40) /* $ra */
1844 (*info
->fprintf_func
) (info
->stream
, ",%s", mips_gpr_names
[31]);
1846 nsreg
= (l
>> 24) & 0x7;
1848 if (l
& 0x20) /* $s0 */
1850 if (l
& 0x10) /* $s1 */
1852 if (nsreg
> 0) /* $s2-$s8 */
1853 smask
|= ((1 << nsreg
) - 1) << 2;
1855 /* Find first set static reg bit. */
1856 for (i
= 0; i
< 9; i
++)
1858 if (smask
& (1 << i
))
1860 (*info
->fprintf_func
) (info
->stream
, ",%s",
1861 mips_gpr_names
[i
== 8 ? 30 : (16 + i
)]);
1862 /* Skip over string of set bits. */
1863 for (j
= i
; smask
& (2 << j
); j
++)
1866 (*info
->fprintf_func
) (info
->stream
, "-%s",
1867 mips_gpr_names
[j
== 8 ? 30 : (16 + j
)]);
1872 /* Statics $ax - $a3. */
1874 (*info
->fprintf_func
) (info
->stream
, ",%s", mips_gpr_names
[7]);
1875 else if (statics
> 0)
1876 (*info
->fprintf_func
) (info
->stream
, ",%s-%s",
1877 mips_gpr_names
[7 - statics
+ 1],
1883 /* xgettext:c-format */
1884 (*info
->fprintf_func
)
1886 _("# internal disassembler error, unrecognised modifier (%c)"),
1892 /* Disassemble mips16 instructions. */
1895 print_insn_mips16 (bfd_vma memaddr
, struct disassemble_info
*info
)
1901 bfd_boolean use_extend
;
1903 const struct mips_opcode
*op
, *opend
;
1905 info
->bytes_per_chunk
= 2;
1906 info
->display_endian
= info
->endian
;
1907 info
->insn_info_valid
= 1;
1908 info
->branch_delay_insns
= 0;
1909 info
->data_size
= 0;
1910 info
->insn_type
= dis_nonbranch
;
1914 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
1917 (*info
->memory_error_func
) (status
, memaddr
, info
);
1923 if (info
->endian
== BFD_ENDIAN_BIG
)
1924 insn
= bfd_getb16 (buffer
);
1926 insn
= bfd_getl16 (buffer
);
1928 /* Handle the extend opcode specially. */
1930 if ((insn
& 0xf800) == 0xf000)
1933 extend
= insn
& 0x7ff;
1937 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
1940 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
1941 (unsigned int) extend
);
1942 (*info
->memory_error_func
) (status
, memaddr
, info
);
1946 if (info
->endian
== BFD_ENDIAN_BIG
)
1947 insn
= bfd_getb16 (buffer
);
1949 insn
= bfd_getl16 (buffer
);
1951 /* Check for an extend opcode followed by an extend opcode. */
1952 if ((insn
& 0xf800) == 0xf000)
1954 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
1955 (unsigned int) extend
);
1956 info
->insn_type
= dis_noninsn
;
1963 /* FIXME: Should probably use a hash table on the major opcode here. */
1965 opend
= mips16_opcodes
+ bfd_mips16_num_opcodes
;
1966 for (op
= mips16_opcodes
; op
< opend
; op
++)
1968 if (op
->pinfo
!= INSN_MACRO
1969 && !(no_aliases
&& (op
->pinfo2
& INSN2_ALIAS
))
1970 && (insn
& op
->mask
) == op
->match
)
1974 if (strchr (op
->args
, 'a') != NULL
)
1978 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
1979 (unsigned int) extend
);
1980 info
->insn_type
= dis_noninsn
;
1988 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2,
1993 if (info
->endian
== BFD_ENDIAN_BIG
)
1994 extend
= bfd_getb16 (buffer
);
1996 extend
= bfd_getl16 (buffer
);
2001 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
2002 if (op
->args
[0] != '\0')
2003 (*info
->fprintf_func
) (info
->stream
, "\t");
2005 for (s
= op
->args
; *s
!= '\0'; s
++)
2009 && (((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)
2010 == ((insn
>> MIPS16OP_SH_RY
) & MIPS16OP_MASK_RY
)))
2012 /* Skip the register and the comma. */
2018 && (((insn
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
)
2019 == ((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)))
2021 /* Skip the register and the comma. */
2025 print_mips16_insn_arg (*s
, op
, insn
, use_extend
, extend
, memaddr
,
2029 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
2031 info
->branch_delay_insns
= 1;
2032 if (info
->insn_type
!= dis_jsr
)
2033 info
->insn_type
= dis_branch
;
2041 (*info
->fprintf_func
) (info
->stream
, "0x%x", extend
| 0xf000);
2042 (*info
->fprintf_func
) (info
->stream
, "0x%x", insn
);
2043 info
->insn_type
= dis_noninsn
;
2048 /* In an environment where we do not know the symbol type of the
2049 instruction we are forced to assume that the low order bit of the
2050 instructions' address may mark it as a mips16 instruction. If we
2051 are single stepping, or the pc is within the disassembled function,
2052 this works. Otherwise, we need a clue. Sometimes. */
2055 _print_insn_mips (bfd_vma memaddr
,
2056 struct disassemble_info
*info
,
2057 enum bfd_endian endianness
)
2059 bfd_byte buffer
[INSNLEN
];
2062 set_default_mips_dis_options (info
);
2063 parse_mips_dis_options (info
->disassembler_options
);
2066 /* FIXME: If odd address, this is CLEARLY a mips 16 instruction. */
2067 /* Only a few tools will work this way. */
2069 return print_insn_mips16 (memaddr
, info
);
2072 #if SYMTAB_AVAILABLE
2073 if (info
->mach
== bfd_mach_mips16
2074 || (info
->symbols
!= NULL
2075 && bfd_asymbol_flavour (*info
->symbols
) == bfd_target_elf_flavour
2076 && ELF_ST_IS_MIPS16 ((*(elf_symbol_type
**) info
->symbols
)
2077 ->internal_elf_sym
.st_other
)))
2078 return print_insn_mips16 (memaddr
, info
);
2081 status
= (*info
->read_memory_func
) (memaddr
, buffer
, INSNLEN
, info
);
2086 if (endianness
== BFD_ENDIAN_BIG
)
2087 insn
= (unsigned long) bfd_getb32 (buffer
);
2089 insn
= (unsigned long) bfd_getl32 (buffer
);
2091 return print_insn_mips (memaddr
, insn
, info
);
2095 (*info
->memory_error_func
) (status
, memaddr
, info
);
2101 print_insn_big_mips (bfd_vma memaddr
, struct disassemble_info
*info
)
2103 return _print_insn_mips (memaddr
, info
, BFD_ENDIAN_BIG
);
2107 print_insn_little_mips (bfd_vma memaddr
, struct disassemble_info
*info
)
2109 return _print_insn_mips (memaddr
, info
, BFD_ENDIAN_LITTLE
);
2113 print_mips_disassembler_options (FILE *stream
)
2117 fprintf (stream
, _("\n\
2118 The following MIPS specific disassembler options are supported for use\n\
2119 with the -M switch (multiple options should be separated by commas):\n"));
2121 fprintf (stream
, _("\n\
2122 gpr-names=ABI Print GPR names according to specified ABI.\n\
2123 Default: based on binary being disassembled.\n"));
2125 fprintf (stream
, _("\n\
2126 fpr-names=ABI Print FPR names according to specified ABI.\n\
2127 Default: numeric.\n"));
2129 fprintf (stream
, _("\n\
2130 cp0-names=ARCH Print CP0 register names according to\n\
2131 specified architecture.\n\
2132 Default: based on binary being disassembled.\n"));
2134 fprintf (stream
, _("\n\
2135 hwr-names=ARCH Print HWR names according to specified \n\
2137 Default: based on binary being disassembled.\n"));
2139 fprintf (stream
, _("\n\
2140 reg-names=ABI Print GPR and FPR names according to\n\
2141 specified ABI.\n"));
2143 fprintf (stream
, _("\n\
2144 reg-names=ARCH Print CP0 register and HWR names according to\n\
2145 specified architecture.\n"));
2147 fprintf (stream
, _("\n\
2148 For the options above, the following values are supported for \"ABI\":\n\
2150 for (i
= 0; i
< ARRAY_SIZE (mips_abi_choices
); i
++)
2151 fprintf (stream
, " %s", mips_abi_choices
[i
].name
);
2152 fprintf (stream
, _("\n"));
2154 fprintf (stream
, _("\n\
2155 For the options above, The following values are supported for \"ARCH\":\n\
2157 for (i
= 0; i
< ARRAY_SIZE (mips_arch_choices
); i
++)
2158 if (*mips_arch_choices
[i
].name
!= '\0')
2159 fprintf (stream
, " %s", mips_arch_choices
[i
].name
);
2160 fprintf (stream
, _("\n"));
2162 fprintf (stream
, _("\n"));