1 /* Print mips instructions for GDB, the GNU debugger, or for objdump.
2 Copyright (C) 1989-2018 Free Software Foundation, Inc.
5 This file is part of the GNU opcodes library.
7 This library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 It is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
23 #include "disassemble.h"
24 #include "libiberty.h"
25 #include "opcode/mips.h"
28 /* FIXME: These are needed to figure out if the code is mips16 or
29 not. The low bit of the address is often a good indicator. No
30 symbol table is available when this code runs out in an embedded
31 system as when it is used for disassembler support in a monitor. */
33 #if !defined(EMBEDDED_ENV)
34 #define SYMTAB_AVAILABLE 1
39 /* Mips instructions are at maximum this many bytes long. */
43 /* FIXME: These should be shared with gdb somehow. */
45 struct mips_cp0sel_name
49 const char * const name;
52 static const char * const mips_gpr_names_numeric[32] =
54 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
55 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
56 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
57 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
60 static const char * const mips_gpr_names_oldabi[32] =
62 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
63 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
64 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
65 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
68 static const char * const mips_gpr_names_newabi[32] =
70 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
71 "a4", "a5", "a6", "a7", "t0", "t1", "t2", "t3",
72 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
73 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
76 static const char * const mips_fpr_names_numeric[32] =
78 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
79 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
80 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
81 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31"
84 static const char * const mips_fpr_names_32[32] =
86 "fv0", "fv0f", "fv1", "fv1f", "ft0", "ft0f", "ft1", "ft1f",
87 "ft2", "ft2f", "ft3", "ft3f", "fa0", "fa0f", "fa1", "fa1f",
88 "ft4", "ft4f", "ft5", "ft5f", "fs0", "fs0f", "fs1", "fs1f",
89 "fs2", "fs2f", "fs3", "fs3f", "fs4", "fs4f", "fs5", "fs5f"
92 static const char * const mips_fpr_names_n32[32] =
94 "fv0", "ft14", "fv1", "ft15", "ft0", "ft1", "ft2", "ft3",
95 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
96 "fa4", "fa5", "fa6", "fa7", "fs0", "ft8", "fs1", "ft9",
97 "fs2", "ft10", "fs3", "ft11", "fs4", "ft12", "fs5", "ft13"
100 static const char * const mips_fpr_names_64[32] =
102 "fv0", "ft12", "fv1", "ft13", "ft0", "ft1", "ft2", "ft3",
103 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
104 "fa4", "fa5", "fa6", "fa7", "ft8", "ft9", "ft10", "ft11",
105 "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7"
108 static const char * const mips_cp0_names_numeric[32] =
110 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
111 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
112 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
113 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
116 static const char * const mips_cp1_names_numeric[32] =
118 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
119 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
120 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
121 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
124 static const char * const mips_cp0_names_r3000[32] =
126 "c0_index", "c0_random", "c0_entrylo", "$3",
127 "c0_context", "$5", "$6", "$7",
128 "c0_badvaddr", "$9", "c0_entryhi", "$11",
129 "c0_sr", "c0_cause", "c0_epc", "c0_prid",
130 "$16", "$17", "$18", "$19",
131 "$20", "$21", "$22", "$23",
132 "$24", "$25", "$26", "$27",
133 "$28", "$29", "$30", "$31",
136 static const char * const mips_cp0_names_r4000[32] =
138 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
139 "c0_context", "c0_pagemask", "c0_wired", "$7",
140 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
141 "c0_sr", "c0_cause", "c0_epc", "c0_prid",
142 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
143 "c0_xcontext", "$21", "$22", "$23",
144 "$24", "$25", "c0_ecc", "c0_cacheerr",
145 "c0_taglo", "c0_taghi", "c0_errorepc", "$31",
148 static const char * const mips_cp0_names_r5900[32] =
150 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
151 "c0_context", "c0_pagemask", "c0_wired", "$7",
152 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
153 "c0_sr", "c0_cause", "c0_epc", "c0_prid",
154 "c0_config", "$17", "$18", "$19",
155 "$20", "$21", "$22", "c0_badpaddr",
156 "c0_depc", "c0_perfcnt", "$26", "$27",
157 "c0_taglo", "c0_taghi", "c0_errorepc", "$31"
160 static const char * const mips_cp0_names_mips3264[32] =
162 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
163 "c0_context", "c0_pagemask", "c0_wired", "$7",
164 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
165 "c0_status", "c0_cause", "c0_epc", "c0_prid",
166 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
167 "c0_xcontext", "$21", "$22", "c0_debug",
168 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr",
169 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
172 static const char * const mips_cp1_names_mips3264[32] =
174 "c1_fir", "c1_ufr", "$2", "$3",
175 "c1_unfr", "$5", "$6", "$7",
176 "$8", "$9", "$10", "$11",
177 "$12", "$13", "$14", "$15",
178 "$16", "$17", "$18", "$19",
179 "$20", "$21", "$22", "$23",
180 "$24", "c1_fccr", "c1_fexr", "$27",
181 "c1_fenr", "$29", "$30", "c1_fcsr"
184 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264[] =
186 { 16, 1, "c0_config1" },
187 { 16, 2, "c0_config2" },
188 { 16, 3, "c0_config3" },
189 { 18, 1, "c0_watchlo,1" },
190 { 18, 2, "c0_watchlo,2" },
191 { 18, 3, "c0_watchlo,3" },
192 { 18, 4, "c0_watchlo,4" },
193 { 18, 5, "c0_watchlo,5" },
194 { 18, 6, "c0_watchlo,6" },
195 { 18, 7, "c0_watchlo,7" },
196 { 19, 1, "c0_watchhi,1" },
197 { 19, 2, "c0_watchhi,2" },
198 { 19, 3, "c0_watchhi,3" },
199 { 19, 4, "c0_watchhi,4" },
200 { 19, 5, "c0_watchhi,5" },
201 { 19, 6, "c0_watchhi,6" },
202 { 19, 7, "c0_watchhi,7" },
203 { 25, 1, "c0_perfcnt,1" },
204 { 25, 2, "c0_perfcnt,2" },
205 { 25, 3, "c0_perfcnt,3" },
206 { 25, 4, "c0_perfcnt,4" },
207 { 25, 5, "c0_perfcnt,5" },
208 { 25, 6, "c0_perfcnt,6" },
209 { 25, 7, "c0_perfcnt,7" },
210 { 27, 1, "c0_cacheerr,1" },
211 { 27, 2, "c0_cacheerr,2" },
212 { 27, 3, "c0_cacheerr,3" },
213 { 28, 1, "c0_datalo" },
214 { 29, 1, "c0_datahi" }
217 static const char * const mips_cp0_names_mips3264r2[32] =
219 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
220 "c0_context", "c0_pagemask", "c0_wired", "c0_hwrena",
221 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
222 "c0_status", "c0_cause", "c0_epc", "c0_prid",
223 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
224 "c0_xcontext", "$21", "$22", "c0_debug",
225 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr",
226 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
229 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264r2[] =
231 { 4, 1, "c0_contextconfig" },
232 { 0, 1, "c0_mvpcontrol" },
233 { 0, 2, "c0_mvpconf0" },
234 { 0, 3, "c0_mvpconf1" },
235 { 1, 1, "c0_vpecontrol" },
236 { 1, 2, "c0_vpeconf0" },
237 { 1, 3, "c0_vpeconf1" },
238 { 1, 4, "c0_yqmask" },
239 { 1, 5, "c0_vpeschedule" },
240 { 1, 6, "c0_vpeschefback" },
241 { 2, 1, "c0_tcstatus" },
242 { 2, 2, "c0_tcbind" },
243 { 2, 3, "c0_tcrestart" },
244 { 2, 4, "c0_tchalt" },
245 { 2, 5, "c0_tccontext" },
246 { 2, 6, "c0_tcschedule" },
247 { 2, 7, "c0_tcschefback" },
248 { 5, 1, "c0_pagegrain" },
249 { 6, 1, "c0_srsconf0" },
250 { 6, 2, "c0_srsconf1" },
251 { 6, 3, "c0_srsconf2" },
252 { 6, 4, "c0_srsconf3" },
253 { 6, 5, "c0_srsconf4" },
254 { 12, 1, "c0_intctl" },
255 { 12, 2, "c0_srsctl" },
256 { 12, 3, "c0_srsmap" },
257 { 15, 1, "c0_ebase" },
258 { 16, 1, "c0_config1" },
259 { 16, 2, "c0_config2" },
260 { 16, 3, "c0_config3" },
261 { 18, 1, "c0_watchlo,1" },
262 { 18, 2, "c0_watchlo,2" },
263 { 18, 3, "c0_watchlo,3" },
264 { 18, 4, "c0_watchlo,4" },
265 { 18, 5, "c0_watchlo,5" },
266 { 18, 6, "c0_watchlo,6" },
267 { 18, 7, "c0_watchlo,7" },
268 { 19, 1, "c0_watchhi,1" },
269 { 19, 2, "c0_watchhi,2" },
270 { 19, 3, "c0_watchhi,3" },
271 { 19, 4, "c0_watchhi,4" },
272 { 19, 5, "c0_watchhi,5" },
273 { 19, 6, "c0_watchhi,6" },
274 { 19, 7, "c0_watchhi,7" },
275 { 23, 1, "c0_tracecontrol" },
276 { 23, 2, "c0_tracecontrol2" },
277 { 23, 3, "c0_usertracedata" },
278 { 23, 4, "c0_tracebpc" },
279 { 25, 1, "c0_perfcnt,1" },
280 { 25, 2, "c0_perfcnt,2" },
281 { 25, 3, "c0_perfcnt,3" },
282 { 25, 4, "c0_perfcnt,4" },
283 { 25, 5, "c0_perfcnt,5" },
284 { 25, 6, "c0_perfcnt,6" },
285 { 25, 7, "c0_perfcnt,7" },
286 { 27, 1, "c0_cacheerr,1" },
287 { 27, 2, "c0_cacheerr,2" },
288 { 27, 3, "c0_cacheerr,3" },
289 { 28, 1, "c0_datalo" },
290 { 28, 2, "c0_taglo1" },
291 { 28, 3, "c0_datalo1" },
292 { 28, 4, "c0_taglo2" },
293 { 28, 5, "c0_datalo2" },
294 { 28, 6, "c0_taglo3" },
295 { 28, 7, "c0_datalo3" },
296 { 29, 1, "c0_datahi" },
297 { 29, 2, "c0_taghi1" },
298 { 29, 3, "c0_datahi1" },
299 { 29, 4, "c0_taghi2" },
300 { 29, 5, "c0_datahi2" },
301 { 29, 6, "c0_taghi3" },
302 { 29, 7, "c0_datahi3" },
305 /* SB-1: MIPS64 (mips_cp0_names_mips3264) with minor mods. */
306 static const char * const mips_cp0_names_sb1[32] =
308 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
309 "c0_context", "c0_pagemask", "c0_wired", "$7",
310 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
311 "c0_status", "c0_cause", "c0_epc", "c0_prid",
312 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
313 "c0_xcontext", "$21", "$22", "c0_debug",
314 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr_i",
315 "c0_taglo_i", "c0_taghi_i", "c0_errorepc", "c0_desave",
318 static const struct mips_cp0sel_name mips_cp0sel_names_sb1[] =
320 { 16, 1, "c0_config1" },
321 { 18, 1, "c0_watchlo,1" },
322 { 19, 1, "c0_watchhi,1" },
323 { 22, 0, "c0_perftrace" },
324 { 23, 3, "c0_edebug" },
325 { 25, 1, "c0_perfcnt,1" },
326 { 25, 2, "c0_perfcnt,2" },
327 { 25, 3, "c0_perfcnt,3" },
328 { 25, 4, "c0_perfcnt,4" },
329 { 25, 5, "c0_perfcnt,5" },
330 { 25, 6, "c0_perfcnt,6" },
331 { 25, 7, "c0_perfcnt,7" },
332 { 26, 1, "c0_buserr_pa" },
333 { 27, 1, "c0_cacheerr_d" },
334 { 27, 3, "c0_cacheerr_d_pa" },
335 { 28, 1, "c0_datalo_i" },
336 { 28, 2, "c0_taglo_d" },
337 { 28, 3, "c0_datalo_d" },
338 { 29, 1, "c0_datahi_i" },
339 { 29, 2, "c0_taghi_d" },
340 { 29, 3, "c0_datahi_d" },
343 /* Xlr cop0 register names. */
344 static const char * const mips_cp0_names_xlr[32] = {
345 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
346 "c0_context", "c0_pagemask", "c0_wired", "$7",
347 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
348 "c0_status", "c0_cause", "c0_epc", "c0_prid",
349 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
350 "c0_xcontext", "$21", "$22", "c0_debug",
351 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr_i",
352 "c0_taglo_i", "c0_taghi_i", "c0_errorepc", "c0_desave",
355 /* XLR's CP0 Select Registers. */
357 static const struct mips_cp0sel_name mips_cp0sel_names_xlr[] = {
358 { 9, 6, "c0_extintreq" },
359 { 9, 7, "c0_extintmask" },
360 { 15, 1, "c0_ebase" },
361 { 16, 1, "c0_config1" },
362 { 16, 2, "c0_config2" },
363 { 16, 3, "c0_config3" },
364 { 16, 7, "c0_procid2" },
365 { 18, 1, "c0_watchlo,1" },
366 { 18, 2, "c0_watchlo,2" },
367 { 18, 3, "c0_watchlo,3" },
368 { 18, 4, "c0_watchlo,4" },
369 { 18, 5, "c0_watchlo,5" },
370 { 18, 6, "c0_watchlo,6" },
371 { 18, 7, "c0_watchlo,7" },
372 { 19, 1, "c0_watchhi,1" },
373 { 19, 2, "c0_watchhi,2" },
374 { 19, 3, "c0_watchhi,3" },
375 { 19, 4, "c0_watchhi,4" },
376 { 19, 5, "c0_watchhi,5" },
377 { 19, 6, "c0_watchhi,6" },
378 { 19, 7, "c0_watchhi,7" },
379 { 25, 1, "c0_perfcnt,1" },
380 { 25, 2, "c0_perfcnt,2" },
381 { 25, 3, "c0_perfcnt,3" },
382 { 25, 4, "c0_perfcnt,4" },
383 { 25, 5, "c0_perfcnt,5" },
384 { 25, 6, "c0_perfcnt,6" },
385 { 25, 7, "c0_perfcnt,7" },
386 { 27, 1, "c0_cacheerr,1" },
387 { 27, 2, "c0_cacheerr,2" },
388 { 27, 3, "c0_cacheerr,3" },
389 { 28, 1, "c0_datalo" },
390 { 29, 1, "c0_datahi" }
393 static const char * const mips_hwr_names_numeric[32] =
395 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
396 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
397 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
398 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
401 static const char * const mips_hwr_names_mips3264r2[32] =
403 "hwr_cpunum", "hwr_synci_step", "hwr_cc", "hwr_ccres",
404 "$4", "$5", "$6", "$7",
405 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
406 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
407 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
410 static const char * const msa_control_names[32] =
412 "msa_ir", "msa_csr", "msa_access", "msa_save",
413 "msa_modify", "msa_request", "msa_map", "msa_unmap",
414 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
415 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
416 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
419 struct mips_abi_choice
422 const char * const *gpr_names;
423 const char * const *fpr_names;
426 struct mips_abi_choice mips_abi_choices[] =
428 { "numeric", mips_gpr_names_numeric, mips_fpr_names_numeric },
429 { "32", mips_gpr_names_oldabi, mips_fpr_names_32 },
430 { "n32", mips_gpr_names_newabi, mips_fpr_names_n32 },
431 { "64", mips_gpr_names_newabi, mips_fpr_names_64 },
434 struct mips_arch_choice
438 unsigned long bfd_mach;
442 const char * const *cp0_names;
443 const struct mips_cp0sel_name *cp0sel_names;
444 unsigned int cp0sel_names_len;
445 const char * const *cp1_names;
446 const char * const *hwr_names;
449 const struct mips_arch_choice mips_arch_choices[] =
451 { "numeric", 0, 0, 0, 0, 0,
452 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
453 mips_hwr_names_numeric },
455 { "r3000", 1, bfd_mach_mips3000, CPU_R3000, ISA_MIPS1, 0,
456 mips_cp0_names_r3000, NULL, 0, mips_cp1_names_numeric,
457 mips_hwr_names_numeric },
458 { "r3900", 1, bfd_mach_mips3900, CPU_R3900, ISA_MIPS1, 0,
459 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
460 mips_hwr_names_numeric },
461 { "r4000", 1, bfd_mach_mips4000, CPU_R4000, ISA_MIPS3, 0,
462 mips_cp0_names_r4000, NULL, 0, mips_cp1_names_numeric,
463 mips_hwr_names_numeric },
464 { "r4010", 1, bfd_mach_mips4010, CPU_R4010, ISA_MIPS2, 0,
465 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
466 mips_hwr_names_numeric },
467 { "vr4100", 1, bfd_mach_mips4100, CPU_VR4100, ISA_MIPS3, 0,
468 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
469 mips_hwr_names_numeric },
470 { "vr4111", 1, bfd_mach_mips4111, CPU_R4111, ISA_MIPS3, 0,
471 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
472 mips_hwr_names_numeric },
473 { "vr4120", 1, bfd_mach_mips4120, CPU_VR4120, ISA_MIPS3, 0,
474 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
475 mips_hwr_names_numeric },
476 { "r4300", 1, bfd_mach_mips4300, CPU_R4300, ISA_MIPS3, 0,
477 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
478 mips_hwr_names_numeric },
479 { "r4400", 1, bfd_mach_mips4400, CPU_R4400, ISA_MIPS3, 0,
480 mips_cp0_names_r4000, NULL, 0, mips_cp1_names_numeric,
481 mips_hwr_names_numeric },
482 { "r4600", 1, bfd_mach_mips4600, CPU_R4600, ISA_MIPS3, 0,
483 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
484 mips_hwr_names_numeric },
485 { "r4650", 1, bfd_mach_mips4650, CPU_R4650, ISA_MIPS3, 0,
486 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
487 mips_hwr_names_numeric },
488 { "r5000", 1, bfd_mach_mips5000, CPU_R5000, ISA_MIPS4, 0,
489 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
490 mips_hwr_names_numeric },
491 { "vr5400", 1, bfd_mach_mips5400, CPU_VR5400, ISA_MIPS4, 0,
492 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
493 mips_hwr_names_numeric },
494 { "vr5500", 1, bfd_mach_mips5500, CPU_VR5500, ISA_MIPS4, 0,
495 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
496 mips_hwr_names_numeric },
497 { "r5900", 1, bfd_mach_mips5900, CPU_R5900, ISA_MIPS3, 0,
498 mips_cp0_names_r5900, NULL, 0, mips_cp1_names_numeric,
499 mips_hwr_names_numeric },
500 { "r6000", 1, bfd_mach_mips6000, CPU_R6000, ISA_MIPS2, 0,
501 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
502 mips_hwr_names_numeric },
503 { "rm7000", 1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4, 0,
504 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
505 mips_hwr_names_numeric },
506 { "rm9000", 1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4, 0,
507 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
508 mips_hwr_names_numeric },
509 { "r8000", 1, bfd_mach_mips8000, CPU_R8000, ISA_MIPS4, 0,
510 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
511 mips_hwr_names_numeric },
512 { "r10000", 1, bfd_mach_mips10000, CPU_R10000, ISA_MIPS4, 0,
513 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
514 mips_hwr_names_numeric },
515 { "r12000", 1, bfd_mach_mips12000, CPU_R12000, ISA_MIPS4, 0,
516 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
517 mips_hwr_names_numeric },
518 { "r14000", 1, bfd_mach_mips14000, CPU_R14000, ISA_MIPS4, 0,
519 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
520 mips_hwr_names_numeric },
521 { "r16000", 1, bfd_mach_mips16000, CPU_R16000, ISA_MIPS4, 0,
522 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
523 mips_hwr_names_numeric },
524 { "mips5", 1, bfd_mach_mips5, CPU_MIPS5, ISA_MIPS5, 0,
525 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
526 mips_hwr_names_numeric },
528 /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
529 Note that MIPS-3D and MDMX are not applicable to MIPS32. (See
530 _MIPS32 Architecture For Programmers Volume I: Introduction to the
531 MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
533 { "mips32", 1, bfd_mach_mipsisa32, CPU_MIPS32,
534 ISA_MIPS32, ASE_SMARTMIPS,
535 mips_cp0_names_mips3264,
536 mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
537 mips_cp1_names_mips3264, mips_hwr_names_numeric },
539 { "mips32r2", 1, bfd_mach_mipsisa32r2, CPU_MIPS32R2,
541 (ASE_SMARTMIPS | ASE_DSP | ASE_DSPR2 | ASE_EVA | ASE_MIPS3D
542 | ASE_MT | ASE_MCU | ASE_VIRT | ASE_MSA | ASE_XPA),
543 mips_cp0_names_mips3264r2,
544 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
545 mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
547 { "mips32r3", 1, bfd_mach_mipsisa32r3, CPU_MIPS32R3,
549 (ASE_SMARTMIPS | ASE_DSP | ASE_DSPR2 | ASE_EVA | ASE_MIPS3D
550 | ASE_MT | ASE_MCU | ASE_VIRT | ASE_MSA | ASE_XPA),
551 mips_cp0_names_mips3264r2,
552 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
553 mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
555 { "mips32r5", 1, bfd_mach_mipsisa32r5, CPU_MIPS32R5,
557 (ASE_SMARTMIPS | ASE_DSP | ASE_DSPR2 | ASE_EVA | ASE_MIPS3D
558 | ASE_MT | ASE_MCU | ASE_VIRT | ASE_MSA | ASE_XPA),
559 mips_cp0_names_mips3264r2,
560 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
561 mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
563 { "mips32r6", 1, bfd_mach_mipsisa32r6, CPU_MIPS32R6,
565 (ASE_EVA | ASE_MSA | ASE_VIRT | ASE_XPA | ASE_MCU | ASE_MT | ASE_DSP
566 | ASE_DSPR2 | ASE_DSPR3 | ASE_CRC | ASE_GINV),
567 mips_cp0_names_mips3264r2,
568 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
569 mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
571 /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs. */
572 { "mips64", 1, bfd_mach_mipsisa64, CPU_MIPS64,
573 ISA_MIPS64, ASE_MIPS3D | ASE_MDMX,
574 mips_cp0_names_mips3264,
575 mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
576 mips_cp1_names_mips3264, mips_hwr_names_numeric },
578 { "mips64r2", 1, bfd_mach_mipsisa64r2, CPU_MIPS64R2,
580 (ASE_MIPS3D | ASE_DSP | ASE_DSPR2 | ASE_DSP64 | ASE_EVA | ASE_MT
581 | ASE_MCU | ASE_VIRT | ASE_VIRT64 | ASE_MSA | ASE_MSA64 | ASE_XPA),
582 mips_cp0_names_mips3264r2,
583 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
584 mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
586 { "mips64r3", 1, bfd_mach_mipsisa64r3, CPU_MIPS64R3,
588 (ASE_MIPS3D | ASE_DSP | ASE_DSPR2 | ASE_DSP64 | ASE_EVA | ASE_MT
589 | ASE_MCU | ASE_VIRT | ASE_VIRT64 | ASE_MSA | ASE_MSA64 | ASE_XPA),
590 mips_cp0_names_mips3264r2,
591 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
592 mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
594 { "mips64r5", 1, bfd_mach_mipsisa64r5, CPU_MIPS64R5,
596 (ASE_MIPS3D | ASE_DSP | ASE_DSPR2 | ASE_DSP64 | ASE_EVA | ASE_MT
597 | ASE_MCU | ASE_VIRT | ASE_VIRT64 | ASE_MSA | ASE_MSA64 | ASE_XPA),
598 mips_cp0_names_mips3264r2,
599 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
600 mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
602 { "mips64r6", 1, bfd_mach_mipsisa64r6, CPU_MIPS64R6,
604 (ASE_EVA | ASE_MSA | ASE_MSA64 | ASE_XPA | ASE_VIRT | ASE_VIRT64
605 | ASE_MCU | ASE_MT | ASE_DSP | ASE_DSPR2 | ASE_DSPR3 | ASE_CRC
606 | ASE_CRC64 | ASE_GINV),
607 mips_cp0_names_mips3264r2,
608 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
609 mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
611 { "interaptiv-mr2", 1, bfd_mach_mips_interaptiv_mr2, CPU_INTERAPTIV_MR2,
613 ASE_MT | ASE_EVA | ASE_DSP | ASE_DSPR2 | ASE_MIPS16E2 | ASE_MIPS16E2_MT,
614 mips_cp0_names_mips3264r2,
615 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
616 mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
618 { "sb1", 1, bfd_mach_mips_sb1, CPU_SB1,
619 ISA_MIPS64 | INSN_SB1, ASE_MIPS3D,
621 mips_cp0sel_names_sb1, ARRAY_SIZE (mips_cp0sel_names_sb1),
622 mips_cp1_names_mips3264, mips_hwr_names_numeric },
624 { "loongson2e", 1, bfd_mach_mips_loongson_2e, CPU_LOONGSON_2E,
625 ISA_MIPS3 | INSN_LOONGSON_2E, 0, mips_cp0_names_numeric,
626 NULL, 0, mips_cp1_names_numeric, mips_hwr_names_numeric },
628 { "loongson2f", 1, bfd_mach_mips_loongson_2f, CPU_LOONGSON_2F,
629 ISA_MIPS3 | INSN_LOONGSON_2F, 0, mips_cp0_names_numeric,
630 NULL, 0, mips_cp1_names_numeric, mips_hwr_names_numeric },
632 { "loongson3a", 1, bfd_mach_mips_loongson_3a, CPU_LOONGSON_3A,
633 ISA_MIPS64R2 | INSN_LOONGSON_3A, 0, mips_cp0_names_numeric,
634 NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
636 { "octeon", 1, bfd_mach_mips_octeon, CPU_OCTEON,
637 ISA_MIPS64R2 | INSN_OCTEON, 0, mips_cp0_names_numeric, NULL, 0,
638 mips_cp1_names_mips3264, mips_hwr_names_numeric },
640 { "octeon+", 1, bfd_mach_mips_octeonp, CPU_OCTEONP,
641 ISA_MIPS64R2 | INSN_OCTEONP, 0, mips_cp0_names_numeric,
642 NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
644 { "octeon2", 1, bfd_mach_mips_octeon2, CPU_OCTEON2,
645 ISA_MIPS64R2 | INSN_OCTEON2, 0, mips_cp0_names_numeric,
646 NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
648 { "octeon3", 1, bfd_mach_mips_octeon3, CPU_OCTEON3,
649 ISA_MIPS64R5 | INSN_OCTEON3, ASE_VIRT | ASE_VIRT64,
650 mips_cp0_names_numeric,
651 NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
653 { "xlr", 1, bfd_mach_mips_xlr, CPU_XLR,
654 ISA_MIPS64 | INSN_XLR, 0,
656 mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
657 mips_cp1_names_mips3264, mips_hwr_names_numeric },
659 /* XLP is mostly like XLR, with the prominent exception it is being
661 { "xlp", 1, bfd_mach_mips_xlr, CPU_XLR,
662 ISA_MIPS64R2 | INSN_XLR, 0,
664 mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
665 mips_cp1_names_mips3264, mips_hwr_names_numeric },
667 /* This entry, mips16, is here only for ISA/processor selection; do
668 not print its name. */
669 { "", 1, bfd_mach_mips16, CPU_MIPS16, ISA_MIPS64,
670 ASE_MIPS16E2 | ASE_MIPS16E2_MT,
671 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
672 mips_hwr_names_numeric },
675 /* ISA and processor type to disassemble for, and register names to use.
676 set_default_mips_dis_options and parse_mips_dis_options fill in these
678 static int mips_processor;
681 static int micromips_ase;
682 static const char * const *mips_gpr_names;
683 static const char * const *mips_fpr_names;
684 static const char * const *mips_cp0_names;
685 static const struct mips_cp0sel_name *mips_cp0sel_names;
686 static int mips_cp0sel_names_len;
687 static const char * const *mips_cp1_names;
688 static const char * const *mips_hwr_names;
691 static int no_aliases; /* If set disassemble as most general inst. */
693 static const struct mips_abi_choice *
694 choose_abi_by_name (const char *name, unsigned int namelen)
696 const struct mips_abi_choice *c;
699 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_abi_choices) && c == NULL; i++)
700 if (strncmp (mips_abi_choices[i].name, name, namelen) == 0
701 && strlen (mips_abi_choices[i].name) == namelen)
702 c = &mips_abi_choices[i];
707 static const struct mips_arch_choice *
708 choose_arch_by_name (const char *name, unsigned int namelen)
710 const struct mips_arch_choice *c = NULL;
713 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
714 if (strncmp (mips_arch_choices[i].name, name, namelen) == 0
715 && strlen (mips_arch_choices[i].name) == namelen)
716 c = &mips_arch_choices[i];
721 static const struct mips_arch_choice *
722 choose_arch_by_number (unsigned long mach)
724 static unsigned long hint_bfd_mach;
725 static const struct mips_arch_choice *hint_arch_choice;
726 const struct mips_arch_choice *c;
729 /* We optimize this because even if the user specifies no
730 flags, this will be done for every instruction! */
731 if (hint_bfd_mach == mach
732 && hint_arch_choice != NULL
733 && hint_arch_choice->bfd_mach == hint_bfd_mach)
734 return hint_arch_choice;
736 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
738 if (mips_arch_choices[i].bfd_mach_valid
739 && mips_arch_choices[i].bfd_mach == mach)
741 c = &mips_arch_choices[i];
742 hint_bfd_mach = mach;
743 hint_arch_choice = c;
749 /* Check if the object uses NewABI conventions. */
752 is_newabi (Elf_Internal_Ehdr *header)
754 /* There are no old-style ABIs which use 64-bit ELF. */
755 if (header->e_ident[EI_CLASS] == ELFCLASS64)
758 /* If a 32-bit ELF file, n32 is a new-style ABI. */
759 if ((header->e_flags & EF_MIPS_ABI2) != 0)
765 /* Check if the object has microMIPS ASE code. */
768 is_micromips (Elf_Internal_Ehdr *header)
770 if ((header->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS) != 0)
776 /* Convert ASE flags from .MIPS.abiflags to internal values. */
779 mips_convert_abiflags_ases (unsigned long afl_ases)
781 unsigned long opcode_ases = 0;
783 if (afl_ases & AFL_ASE_DSP)
784 opcode_ases |= ASE_DSP;
785 if (afl_ases & AFL_ASE_DSPR2)
786 opcode_ases |= ASE_DSPR2;
787 if (afl_ases & AFL_ASE_EVA)
788 opcode_ases |= ASE_EVA;
789 if (afl_ases & AFL_ASE_MCU)
790 opcode_ases |= ASE_MCU;
791 if (afl_ases & AFL_ASE_MDMX)
792 opcode_ases |= ASE_MDMX;
793 if (afl_ases & AFL_ASE_MIPS3D)
794 opcode_ases |= ASE_MIPS3D;
795 if (afl_ases & AFL_ASE_MT)
796 opcode_ases |= ASE_MT;
797 if (afl_ases & AFL_ASE_SMARTMIPS)
798 opcode_ases |= ASE_SMARTMIPS;
799 if (afl_ases & AFL_ASE_VIRT)
800 opcode_ases |= ASE_VIRT;
801 if (afl_ases & AFL_ASE_MSA)
802 opcode_ases |= ASE_MSA;
803 if (afl_ases & AFL_ASE_XPA)
804 opcode_ases |= ASE_XPA;
805 if (afl_ases & AFL_ASE_DSPR3)
806 opcode_ases |= ASE_DSPR3;
807 if (afl_ases & AFL_ASE_MIPS16E2)
808 opcode_ases |= ASE_MIPS16E2;
812 /* Calculate combination ASE flags from regular ASE flags. */
815 mips_calculate_combination_ases (unsigned long opcode_ases)
817 unsigned long combination_ases = 0;
819 if ((opcode_ases & (ASE_XPA | ASE_VIRT)) == (ASE_XPA | ASE_VIRT))
820 combination_ases |= ASE_XPA_VIRT;
821 if ((opcode_ases & (ASE_MIPS16E2 | ASE_MT)) == (ASE_MIPS16E2 | ASE_MT))
822 combination_ases |= ASE_MIPS16E2_MT;
823 return combination_ases;
827 set_default_mips_dis_options (struct disassemble_info *info)
829 const struct mips_arch_choice *chosen_arch;
831 /* Defaults: mipsIII/r3000 (?!), no microMIPS ASE (any compressed code
832 is MIPS16 ASE) (o)32-style ("oldabi") GPR names, and numeric FPR,
833 CP0 register, and HWR names. */
834 mips_isa = ISA_MIPS3;
835 mips_processor = CPU_R3000;
838 mips_gpr_names = mips_gpr_names_oldabi;
839 mips_fpr_names = mips_fpr_names_numeric;
840 mips_cp0_names = mips_cp0_names_numeric;
841 mips_cp0sel_names = NULL;
842 mips_cp0sel_names_len = 0;
843 mips_cp1_names = mips_cp1_names_numeric;
844 mips_hwr_names = mips_hwr_names_numeric;
847 /* Set ISA, architecture, and cp0 register names as best we can. */
848 #if ! SYMTAB_AVAILABLE
849 /* This is running out on a target machine, not in a host tool.
850 FIXME: Where does mips_target_info come from? */
851 target_processor = mips_target_info.processor;
852 mips_isa = mips_target_info.isa;
853 mips_ase = mips_target_info.ase;
855 chosen_arch = choose_arch_by_number (info->mach);
856 if (chosen_arch != NULL)
858 mips_processor = chosen_arch->processor;
859 mips_isa = chosen_arch->isa;
860 mips_ase = chosen_arch->ase;
861 mips_cp0_names = chosen_arch->cp0_names;
862 mips_cp0sel_names = chosen_arch->cp0sel_names;
863 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
864 mips_cp1_names = chosen_arch->cp1_names;
865 mips_hwr_names = chosen_arch->hwr_names;
868 /* Update settings according to the ELF file header flags. */
869 if (info->flavour == bfd_target_elf_flavour && info->section != NULL)
871 struct bfd *abfd = info->section->owner;
872 Elf_Internal_Ehdr *header = elf_elfheader (abfd);
873 Elf_Internal_ABIFlags_v0 *abiflags = NULL;
875 /* We won't ever get here if !HAVE_BFD_MIPS_ELF_GET_ABIFLAGS,
876 because we won't then have a MIPS/ELF BFD, however we need
877 to guard against a link error in a `--enable-targets=...'
878 configuration with a 32-bit host where the MIPS target is
879 a secondary, or with MIPS/ECOFF configurations. */
880 #ifdef HAVE_BFD_MIPS_ELF_GET_ABIFLAGS
881 abiflags = bfd_mips_elf_get_abiflags (abfd);
883 /* If an ELF "newabi" binary, use the n32/(n)64 GPR names. */
884 if (is_newabi (header))
885 mips_gpr_names = mips_gpr_names_newabi;
886 /* If a microMIPS binary, then don't use MIPS16 bindings. */
887 micromips_ase = is_micromips (header);
888 /* OR in any extra ASE flags set in ELF file structures. */
890 mips_ase |= mips_convert_abiflags_ases (abiflags->ases);
891 else if (header->e_flags & EF_MIPS_ARCH_ASE_MDMX)
892 mips_ase |= ASE_MDMX;
895 mips_ase |= mips_calculate_combination_ases (mips_ase);
898 /* Parse an ASE disassembler option and set the corresponding global
899 ASE flag(s). Return TRUE if successful, FALSE otherwise. */
902 parse_mips_ase_option (const char *option)
904 if (CONST_STRNEQ (option, "msa"))
907 if ((mips_isa & INSN_ISA_MASK) == ISA_MIPS64R2
908 || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R3
909 || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R5
910 || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R6)
911 mips_ase |= ASE_MSA64;
915 if (CONST_STRNEQ (option, "virt"))
917 mips_ase |= ASE_VIRT;
918 if (mips_isa & ISA_MIPS64R2
919 || mips_isa & ISA_MIPS64R3
920 || mips_isa & ISA_MIPS64R5
921 || mips_isa & ISA_MIPS64R6)
922 mips_ase |= ASE_VIRT64;
926 if (CONST_STRNEQ (option, "xpa"))
932 if (CONST_STRNEQ (option, "ginv"))
934 mips_ase |= ASE_GINV;
942 parse_mips_dis_option (const char *option, unsigned int len)
944 unsigned int i, optionlen, vallen;
946 const struct mips_abi_choice *chosen_abi;
947 const struct mips_arch_choice *chosen_arch;
949 /* Try to match options that are simple flags */
950 if (CONST_STRNEQ (option, "no-aliases"))
956 if (parse_mips_ase_option (option))
958 mips_ase |= mips_calculate_combination_ases (mips_ase);
962 /* Look for the = that delimits the end of the option name. */
963 for (i = 0; i < len; i++)
964 if (option[i] == '=')
967 if (i == 0) /* Invalid option: no name before '='. */
969 if (i == len) /* Invalid option: no '='. */
971 if (i == (len - 1)) /* Invalid option: no value after '='. */
975 val = option + (optionlen + 1);
976 vallen = len - (optionlen + 1);
978 if (strncmp ("gpr-names", option, optionlen) == 0
979 && strlen ("gpr-names") == optionlen)
981 chosen_abi = choose_abi_by_name (val, vallen);
982 if (chosen_abi != NULL)
983 mips_gpr_names = chosen_abi->gpr_names;
987 if (strncmp ("fpr-names", option, optionlen) == 0
988 && strlen ("fpr-names") == optionlen)
990 chosen_abi = choose_abi_by_name (val, vallen);
991 if (chosen_abi != NULL)
992 mips_fpr_names = chosen_abi->fpr_names;
996 if (strncmp ("cp0-names", option, optionlen) == 0
997 && strlen ("cp0-names") == optionlen)
999 chosen_arch = choose_arch_by_name (val, vallen);
1000 if (chosen_arch != NULL)
1002 mips_cp0_names = chosen_arch->cp0_names;
1003 mips_cp0sel_names = chosen_arch->cp0sel_names;
1004 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
1009 if (strncmp ("cp1-names", option, optionlen) == 0
1010 && strlen ("cp1-names") == optionlen)
1012 chosen_arch = choose_arch_by_name (val, vallen);
1013 if (chosen_arch != NULL)
1014 mips_cp1_names = chosen_arch->cp1_names;
1018 if (strncmp ("hwr-names", option, optionlen) == 0
1019 && strlen ("hwr-names") == optionlen)
1021 chosen_arch = choose_arch_by_name (val, vallen);
1022 if (chosen_arch != NULL)
1023 mips_hwr_names = chosen_arch->hwr_names;
1027 if (strncmp ("reg-names", option, optionlen) == 0
1028 && strlen ("reg-names") == optionlen)
1030 /* We check both ABI and ARCH here unconditionally, so
1031 that "numeric" will do the desirable thing: select
1032 numeric register names for all registers. Other than
1033 that, a given name probably won't match both. */
1034 chosen_abi = choose_abi_by_name (val, vallen);
1035 if (chosen_abi != NULL)
1037 mips_gpr_names = chosen_abi->gpr_names;
1038 mips_fpr_names = chosen_abi->fpr_names;
1040 chosen_arch = choose_arch_by_name (val, vallen);
1041 if (chosen_arch != NULL)
1043 mips_cp0_names = chosen_arch->cp0_names;
1044 mips_cp0sel_names = chosen_arch->cp0sel_names;
1045 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
1046 mips_cp1_names = chosen_arch->cp1_names;
1047 mips_hwr_names = chosen_arch->hwr_names;
1052 /* Invalid option. */
1056 parse_mips_dis_options (const char *options)
1058 const char *option_end;
1060 if (options == NULL)
1063 while (*options != '\0')
1065 /* Skip empty options. */
1066 if (*options == ',')
1072 /* We know that *options is neither NUL or a comma. */
1073 option_end = options + 1;
1074 while (*option_end != ',' && *option_end != '\0')
1077 parse_mips_dis_option (options, option_end - options);
1079 /* Go on to the next one. If option_end points to a comma, it
1080 will be skipped above. */
1081 options = option_end;
1085 static const struct mips_cp0sel_name *
1086 lookup_mips_cp0sel_name (const struct mips_cp0sel_name *names,
1088 unsigned int cp0reg,
1093 for (i = 0; i < len; i++)
1094 if (names[i].cp0reg == cp0reg && names[i].sel == sel)
1099 /* Print register REGNO, of type TYPE, for instruction OPCODE. */
1102 print_reg (struct disassemble_info *info, const struct mips_opcode *opcode,
1103 enum mips_reg_operand_type type, int regno)
1108 info->fprintf_func (info->stream, "%s", mips_gpr_names[regno]);
1112 info->fprintf_func (info->stream, "%s", mips_fpr_names[regno]);
1116 if (opcode->pinfo & (FP_D | FP_S))
1117 info->fprintf_func (info->stream, "$fcc%d", regno);
1119 info->fprintf_func (info->stream, "$cc%d", regno);
1123 if (opcode->membership & INSN_5400)
1124 info->fprintf_func (info->stream, "$f%d", regno);
1126 info->fprintf_func (info->stream, "$v%d", regno);
1130 info->fprintf_func (info->stream, "$ac%d", regno);
1134 if (opcode->name[strlen (opcode->name) - 1] == '0')
1135 info->fprintf_func (info->stream, "%s", mips_cp0_names[regno]);
1136 else if (opcode->name[strlen (opcode->name) - 1] == '1')
1137 info->fprintf_func (info->stream, "%s", mips_cp1_names[regno]);
1139 info->fprintf_func (info->stream, "$%d", regno);
1143 info->fprintf_func (info->stream, "%s", mips_hwr_names[regno]);
1147 info->fprintf_func (info->stream, "$vf%d", regno);
1151 info->fprintf_func (info->stream, "$vi%d", regno);
1154 case OP_REG_R5900_I:
1155 info->fprintf_func (info->stream, "$I");
1158 case OP_REG_R5900_Q:
1159 info->fprintf_func (info->stream, "$Q");
1162 case OP_REG_R5900_R:
1163 info->fprintf_func (info->stream, "$R");
1166 case OP_REG_R5900_ACC:
1167 info->fprintf_func (info->stream, "$ACC");
1171 info->fprintf_func (info->stream, "$w%d", regno);
1174 case OP_REG_MSA_CTRL:
1175 info->fprintf_func (info->stream, "%s", msa_control_names[regno]);
1181 /* Used to track the state carried over from previous operands in
1183 struct mips_print_arg_state {
1184 /* The value of the last OP_INT seen. We only use this for OP_MSB,
1185 where the value is known to be unsigned and small. */
1186 unsigned int last_int;
1188 /* The type and number of the last OP_REG seen. We only use this for
1189 OP_REPEAT_DEST_REG and OP_REPEAT_PREV_REG. */
1190 enum mips_reg_operand_type last_reg_type;
1191 unsigned int last_regno;
1192 unsigned int dest_regno;
1193 unsigned int seen_dest;
1196 /* Initialize STATE for the start of an instruction. */
1199 init_print_arg_state (struct mips_print_arg_state *state)
1201 memset (state, 0, sizeof (*state));
1204 /* Print OP_VU0_SUFFIX or OP_VU0_MATCH_SUFFIX operand OPERAND,
1205 whose value is given by UVAL. */
1208 print_vu0_channel (struct disassemble_info *info,
1209 const struct mips_operand *operand, unsigned int uval)
1211 if (operand->size == 4)
1212 info->fprintf_func (info->stream, "%s%s%s%s",
1213 uval & 8 ? "x" : "",
1214 uval & 4 ? "y" : "",
1215 uval & 2 ? "z" : "",
1216 uval & 1 ? "w" : "");
1217 else if (operand->size == 2)
1218 info->fprintf_func (info->stream, "%c", "xyzw"[uval]);
1223 /* Record information about a register operand. */
1226 mips_seen_register (struct mips_print_arg_state *state,
1228 enum mips_reg_operand_type reg_type)
1230 state->last_reg_type = reg_type;
1231 state->last_regno = regno;
1233 if (!state->seen_dest)
1235 state->seen_dest = 1;
1236 state->dest_regno = regno;
1240 /* Print SAVE/RESTORE instruction operands according to the argument
1241 register mask AMASK, the number of static registers saved NSREG,
1242 the $ra, $s0 and $s1 register specifiers RA, S0 and S1 respectively,
1243 and the frame size FRAME_SIZE. */
1246 mips_print_save_restore (struct disassemble_info *info, unsigned int amask,
1247 unsigned int nsreg, unsigned int ra,
1248 unsigned int s0, unsigned int s1,
1249 unsigned int frame_size)
1251 const fprintf_ftype infprintf = info->fprintf_func;
1252 unsigned int nargs, nstatics, smask, i, j;
1253 void *is = info->stream;
1256 if (amask == MIPS_SVRS_ALL_ARGS)
1261 else if (amask == MIPS_SVRS_ALL_STATICS)
1269 nstatics = amask & 3;
1275 infprintf (is, "%s", mips_gpr_names[4]);
1277 infprintf (is, "-%s", mips_gpr_names[4 + nargs - 1]);
1281 infprintf (is, "%s%d", sep, frame_size);
1284 infprintf (is, ",%s", mips_gpr_names[31]);
1291 if (nsreg > 0) /* $s2-$s8 */
1292 smask |= ((1 << nsreg) - 1) << 2;
1294 for (i = 0; i < 9; i++)
1295 if (smask & (1 << i))
1297 infprintf (is, ",%s", mips_gpr_names[i == 8 ? 30 : (16 + i)]);
1298 /* Skip over string of set bits. */
1299 for (j = i; smask & (2 << j); j++)
1302 infprintf (is, "-%s", mips_gpr_names[j == 8 ? 30 : (16 + j)]);
1305 /* Statics $ax - $a3. */
1307 infprintf (is, ",%s", mips_gpr_names[7]);
1308 else if (nstatics > 0)
1309 infprintf (is, ",%s-%s",
1310 mips_gpr_names[7 - nstatics + 1],
1315 /* Print operand OPERAND of OPCODE, using STATE to track inter-operand state.
1316 UVAL is the encoding of the operand (shifted into bit 0) and BASE_PC is
1317 the base address for OP_PCREL operands. */
1320 print_insn_arg (struct disassemble_info *info,
1321 struct mips_print_arg_state *state,
1322 const struct mips_opcode *opcode,
1323 const struct mips_operand *operand,
1327 const fprintf_ftype infprintf = info->fprintf_func;
1328 void *is = info->stream;
1330 switch (operand->type)
1334 const struct mips_int_operand *int_op;
1336 int_op = (const struct mips_int_operand *) operand;
1337 uval = mips_decode_int_operand (int_op, uval);
1338 state->last_int = uval;
1339 if (int_op->print_hex)
1340 infprintf (is, "0x%x", uval);
1342 infprintf (is, "%d", uval);
1348 const struct mips_mapped_int_operand *mint_op;
1350 mint_op = (const struct mips_mapped_int_operand *) operand;
1351 uval = mint_op->int_map[uval];
1352 state->last_int = uval;
1353 if (mint_op->print_hex)
1354 infprintf (is, "0x%x", uval);
1356 infprintf (is, "%d", uval);
1362 const struct mips_msb_operand *msb_op;
1364 msb_op = (const struct mips_msb_operand *) operand;
1365 uval += msb_op->bias;
1366 if (msb_op->add_lsb)
1367 uval -= state->last_int;
1368 infprintf (is, "0x%x", uval);
1373 case OP_OPTIONAL_REG:
1375 const struct mips_reg_operand *reg_op;
1377 reg_op = (const struct mips_reg_operand *) operand;
1378 uval = mips_decode_reg_operand (reg_op, uval);
1379 print_reg (info, opcode, reg_op->reg_type, uval);
1381 mips_seen_register (state, uval, reg_op->reg_type);
1387 const struct mips_reg_pair_operand *pair_op;
1389 pair_op = (const struct mips_reg_pair_operand *) operand;
1390 print_reg (info, opcode, pair_op->reg_type,
1391 pair_op->reg1_map[uval]);
1392 infprintf (is, ",");
1393 print_reg (info, opcode, pair_op->reg_type,
1394 pair_op->reg2_map[uval]);
1400 const struct mips_pcrel_operand *pcrel_op;
1402 pcrel_op = (const struct mips_pcrel_operand *) operand;
1403 info->target = mips_decode_pcrel_operand (pcrel_op, base_pc, uval);
1405 /* For jumps and branches clear the ISA bit except for
1406 the GDB disassembler. */
1407 if (pcrel_op->include_isa_bit
1408 && info->flavour != bfd_target_unknown_flavour)
1411 (*info->print_address_func) (info->target, info);
1416 infprintf (is, "%d", uval);
1419 case OP_ADDIUSP_INT:
1423 sval = mips_signed_operand (operand, uval) * 4;
1424 if (sval >= -8 && sval < 8)
1426 infprintf (is, "%d", sval);
1430 case OP_CLO_CLZ_DEST:
1432 unsigned int reg1, reg2;
1436 /* If one is zero use the other. */
1437 if (reg1 == reg2 || reg2 == 0)
1438 infprintf (is, "%s", mips_gpr_names[reg1]);
1440 infprintf (is, "%s", mips_gpr_names[reg2]);
1442 /* Bogus, result depends on processor. */
1443 infprintf (is, "%s or %s", mips_gpr_names[reg1],
1444 mips_gpr_names[reg2]);
1450 case OP_NON_ZERO_REG:
1452 print_reg (info, opcode, OP_REG_GP, uval & 31);
1453 mips_seen_register (state, uval, OP_REG_GP);
1457 case OP_LWM_SWM_LIST:
1458 if (operand->size == 2)
1461 infprintf (is, "%s,%s",
1463 mips_gpr_names[31]);
1465 infprintf (is, "%s-%s,%s",
1467 mips_gpr_names[16 + uval],
1468 mips_gpr_names[31]);
1474 s_reg_encode = uval & 0xf;
1475 if (s_reg_encode != 0)
1477 if (s_reg_encode == 1)
1478 infprintf (is, "%s", mips_gpr_names[16]);
1479 else if (s_reg_encode < 9)
1480 infprintf (is, "%s-%s",
1482 mips_gpr_names[15 + s_reg_encode]);
1483 else if (s_reg_encode == 9)
1484 infprintf (is, "%s-%s,%s",
1487 mips_gpr_names[30]);
1489 infprintf (is, "UNKNOWN");
1492 if (uval & 0x10) /* For ra. */
1494 if (s_reg_encode == 0)
1495 infprintf (is, "%s", mips_gpr_names[31]);
1497 infprintf (is, ",%s", mips_gpr_names[31]);
1502 case OP_ENTRY_EXIT_LIST:
1505 unsigned int amask, smask;
1508 amask = (uval >> 3) & 7;
1509 if (amask > 0 && amask < 5)
1511 infprintf (is, "%s", mips_gpr_names[4]);
1513 infprintf (is, "-%s", mips_gpr_names[amask + 3]);
1517 smask = (uval >> 1) & 3;
1520 infprintf (is, "%s??", sep);
1525 infprintf (is, "%s%s", sep, mips_gpr_names[16]);
1527 infprintf (is, "-%s", mips_gpr_names[smask + 15]);
1533 infprintf (is, "%s%s", sep, mips_gpr_names[31]);
1537 if (amask == 5 || amask == 6)
1539 infprintf (is, "%s%s", sep, mips_fpr_names[0]);
1541 infprintf (is, "-%s", mips_fpr_names[1]);
1546 case OP_SAVE_RESTORE_LIST:
1547 /* Should be handled by the caller due to complex behavior. */
1550 case OP_MDMX_IMM_REG:
1556 if ((vsel & 0x10) == 0)
1561 for (fmt = 0; fmt < 3; fmt++, vsel >>= 1)
1562 if ((vsel & 1) == 0)
1564 print_reg (info, opcode, OP_REG_VEC, uval);
1565 infprintf (is, "[%d]", vsel >> 1);
1567 else if ((vsel & 0x08) == 0)
1568 print_reg (info, opcode, OP_REG_VEC, uval);
1570 infprintf (is, "0x%x", uval);
1574 case OP_REPEAT_PREV_REG:
1575 print_reg (info, opcode, state->last_reg_type, state->last_regno);
1578 case OP_REPEAT_DEST_REG:
1579 print_reg (info, opcode, state->last_reg_type, state->dest_regno);
1583 infprintf (is, "$pc");
1587 print_reg (info, opcode, OP_REG_GP, 28);
1591 case OP_VU0_MATCH_SUFFIX:
1592 print_vu0_channel (info, operand, uval);
1596 infprintf (is, "[%d]", uval);
1600 infprintf (is, "[");
1601 print_reg (info, opcode, OP_REG_GP, uval);
1602 infprintf (is, "]");
1607 /* Validate the arguments for INSN, which is described by OPCODE.
1608 Use DECODE_OPERAND to get the encoding of each operand. */
1611 validate_insn_args (const struct mips_opcode *opcode,
1612 const struct mips_operand *(*decode_operand) (const char *),
1615 struct mips_print_arg_state state;
1616 const struct mips_operand *operand;
1620 init_print_arg_state (&state);
1621 for (s = opcode->args; *s; ++s)
1635 operand = decode_operand (s);
1639 uval = mips_extract_operand (operand, insn);
1640 switch (operand->type)
1643 case OP_OPTIONAL_REG:
1645 const struct mips_reg_operand *reg_op;
1647 reg_op = (const struct mips_reg_operand *) operand;
1648 uval = mips_decode_reg_operand (reg_op, uval);
1649 mips_seen_register (&state, uval, reg_op->reg_type);
1655 unsigned int reg1, reg2;
1660 if (reg1 != reg2 || reg1 == 0)
1667 const struct mips_check_prev_operand *prev_op;
1669 prev_op = (const struct mips_check_prev_operand *) operand;
1671 if (!prev_op->zero_ok && uval == 0)
1674 if (((prev_op->less_than_ok && uval < state.last_regno)
1675 || (prev_op->greater_than_ok && uval > state.last_regno)
1676 || (prev_op->equal_ok && uval == state.last_regno)))
1682 case OP_NON_ZERO_REG:
1695 case OP_ADDIUSP_INT:
1696 case OP_CLO_CLZ_DEST:
1697 case OP_LWM_SWM_LIST:
1698 case OP_ENTRY_EXIT_LIST:
1699 case OP_MDMX_IMM_REG:
1700 case OP_REPEAT_PREV_REG:
1701 case OP_REPEAT_DEST_REG:
1705 case OP_VU0_MATCH_SUFFIX:
1708 case OP_SAVE_RESTORE_LIST:
1712 if (*s == 'm' || *s == '+' || *s == '-')
1719 /* Print the arguments for INSN, which is described by OPCODE.
1720 Use DECODE_OPERAND to get the encoding of each operand. Use BASE_PC
1721 as the base of OP_PCREL operands, adjusting by LENGTH if the OP_PCREL
1722 operand is for a branch or jump. */
1725 print_insn_args (struct disassemble_info *info,
1726 const struct mips_opcode *opcode,
1727 const struct mips_operand *(*decode_operand) (const char *),
1728 unsigned int insn, bfd_vma insn_pc, unsigned int length)
1730 const fprintf_ftype infprintf = info->fprintf_func;
1731 void *is = info->stream;
1732 struct mips_print_arg_state state;
1733 const struct mips_operand *operand;
1736 init_print_arg_state (&state);
1737 for (s = opcode->args; *s; ++s)
1744 infprintf (is, "%c", *s);
1749 infprintf (is, "%c%c", *s, *s);
1753 operand = decode_operand (s);
1756 /* xgettext:c-format */
1758 _("# internal error, undefined operand in `%s %s'"),
1759 opcode->name, opcode->args);
1763 if (operand->type == OP_SAVE_RESTORE_LIST)
1765 /* Handle this case here because of the complex behavior. */
1766 unsigned int amask = (insn >> 15) & 0xf;
1767 unsigned int nsreg = (insn >> 23) & 0x7;
1768 unsigned int ra = insn & 0x1000; /* $ra */
1769 unsigned int s0 = insn & 0x800; /* $s0 */
1770 unsigned int s1 = insn & 0x400; /* $s1 */
1771 unsigned int frame_size = (((insn >> 15) & 0xf0)
1772 | ((insn >> 6) & 0x0f)) * 8;
1773 mips_print_save_restore (info, amask, nsreg, ra, s0, s1,
1776 else if (operand->type == OP_REG
1779 && opcode->name[strlen (opcode->name) - 1] == '0')
1781 /* Coprocessor register 0 with sel field. */
1782 const struct mips_cp0sel_name *n;
1783 unsigned int reg, sel;
1785 reg = mips_extract_operand (operand, insn);
1787 operand = decode_operand (s);
1788 sel = mips_extract_operand (operand, insn);
1790 /* CP0 register including 'sel' code for mftc0, to be
1791 printed textually if known. If not known, print both
1792 CP0 register name and sel numerically since CP0 register
1793 with sel 0 may have a name unrelated to register being
1795 n = lookup_mips_cp0sel_name (mips_cp0sel_names,
1796 mips_cp0sel_names_len,
1799 infprintf (is, "%s", n->name);
1801 infprintf (is, "$%d,%d", reg, sel);
1805 bfd_vma base_pc = insn_pc;
1807 /* Adjust the PC relative base so that branch/jump insns use
1808 the following PC as the base but genuinely PC relative
1809 operands use the current PC. */
1810 if (operand->type == OP_PCREL)
1812 const struct mips_pcrel_operand *pcrel_op;
1814 pcrel_op = (const struct mips_pcrel_operand *) operand;
1815 /* The include_isa_bit flag is sufficient to distinguish
1816 branch/jump from other PC relative operands. */
1817 if (pcrel_op->include_isa_bit)
1821 print_insn_arg (info, &state, opcode, operand, base_pc,
1822 mips_extract_operand (operand, insn));
1824 if (*s == 'm' || *s == '+' || *s == '-')
1831 /* Print the mips instruction at address MEMADDR in debugged memory,
1832 on using INFO. Returns length of the instruction, in bytes, which is
1833 always INSNLEN. BIGENDIAN must be 1 if this is big-endian code, 0 if
1834 this is little-endian code. */
1837 print_insn_mips (bfd_vma memaddr,
1839 struct disassemble_info *info)
1841 #define GET_OP(insn, field) \
1842 (((insn) >> OP_SH_##field) & OP_MASK_##field)
1843 static const struct mips_opcode *mips_hash[OP_MASK_OP + 1];
1844 const fprintf_ftype infprintf = info->fprintf_func;
1845 const struct mips_opcode *op;
1846 static bfd_boolean init = 0;
1847 void *is = info->stream;
1849 /* Build a hash table to shorten the search time. */
1854 for (i = 0; i <= OP_MASK_OP; i++)
1856 for (op = mips_opcodes; op < &mips_opcodes[NUMOPCODES]; op++)
1858 if (op->pinfo == INSN_MACRO
1859 || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
1861 if (i == GET_OP (op->match, OP))
1872 info->bytes_per_chunk = INSNLEN;
1873 info->display_endian = info->endian;
1874 info->insn_info_valid = 1;
1875 info->branch_delay_insns = 0;
1876 info->data_size = 0;
1877 info->insn_type = dis_nonbranch;
1881 op = mips_hash[GET_OP (word, OP)];
1884 for (; op < &mips_opcodes[NUMOPCODES]; op++)
1886 if (op->pinfo != INSN_MACRO
1887 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
1888 && (word & op->mask) == op->match)
1890 /* We always disassemble the jalx instruction, except for MIPS r6. */
1891 if (!opcode_is_member (op, mips_isa, mips_ase, mips_processor)
1892 && (strcmp (op->name, "jalx")
1893 || (mips_isa & INSN_ISA_MASK) == ISA_MIPS32R6
1894 || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R6))
1897 /* Figure out instruction type and branch delay information. */
1898 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
1900 if ((op->pinfo & (INSN_WRITE_GPR_31 | INSN_WRITE_1)) != 0)
1901 info->insn_type = dis_jsr;
1903 info->insn_type = dis_branch;
1904 info->branch_delay_insns = 1;
1906 else if ((op->pinfo & (INSN_COND_BRANCH_DELAY
1907 | INSN_COND_BRANCH_LIKELY)) != 0)
1909 if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
1910 info->insn_type = dis_condjsr;
1912 info->insn_type = dis_condbranch;
1913 info->branch_delay_insns = 1;
1915 else if ((op->pinfo & (INSN_STORE_MEMORY
1916 | INSN_LOAD_MEMORY)) != 0)
1917 info->insn_type = dis_dref;
1919 if (!validate_insn_args (op, decode_mips_operand, word))
1922 infprintf (is, "%s", op->name);
1923 if (op->pinfo2 & INSN2_VU0_CHANNEL_SUFFIX)
1927 infprintf (is, ".");
1928 uval = mips_extract_operand (&mips_vu0_channel_mask, word);
1929 print_vu0_channel (info, &mips_vu0_channel_mask, uval);
1934 infprintf (is, "\t");
1935 print_insn_args (info, op, decode_mips_operand, word,
1945 /* Handle undefined instructions. */
1946 info->insn_type = dis_noninsn;
1947 infprintf (is, "0x%x", word);
1951 /* Disassemble an operand for a mips16 instruction. */
1954 print_mips16_insn_arg (struct disassemble_info *info,
1955 struct mips_print_arg_state *state,
1956 const struct mips_opcode *opcode,
1957 char type, bfd_vma memaddr,
1958 unsigned insn, bfd_boolean use_extend,
1959 unsigned extend, bfd_boolean is_offset)
1961 const fprintf_ftype infprintf = info->fprintf_func;
1962 void *is = info->stream;
1963 const struct mips_operand *operand, *ext_operand;
1964 unsigned short ext_size;
1976 infprintf (is, "%c", type);
1980 operand = decode_mips16_operand (type, FALSE);
1983 /* xgettext:c-format */
1984 infprintf (is, _("# internal error, undefined operand in `%s %s'"),
1985 opcode->name, opcode->args);
1989 if (operand->type == OP_SAVE_RESTORE_LIST)
1991 /* Handle this case here because of the complex interaction
1992 with the EXTEND opcode. */
1993 unsigned int amask = extend & 0xf;
1994 unsigned int nsreg = (extend >> 8) & 0x7;
1995 unsigned int ra = insn & 0x40; /* $ra */
1996 unsigned int s0 = insn & 0x20; /* $s0 */
1997 unsigned int s1 = insn & 0x10; /* $s1 */
1998 unsigned int frame_size = ((extend & 0xf0) | (insn & 0x0f)) * 8;
1999 if (frame_size == 0 && !use_extend)
2001 mips_print_save_restore (info, amask, nsreg, ra, s0, s1, frame_size);
2005 if (is_offset && operand->type == OP_INT)
2007 const struct mips_int_operand *int_op;
2009 int_op = (const struct mips_int_operand *) operand;
2010 info->insn_type = dis_dref;
2011 info->data_size = 1 << int_op->shift;
2017 ext_operand = decode_mips16_operand (type, TRUE);
2018 if (ext_operand != operand
2019 || (operand->type == OP_INT && operand->lsb == 0
2020 && mips_opcode_32bit_p (opcode)))
2022 ext_size = ext_operand->size;
2023 operand = ext_operand;
2026 if (operand->size == 26)
2027 uval = ((extend & 0x1f) << 21) | ((extend & 0x3e0) << 11) | insn;
2028 else if (ext_size == 16 || ext_size == 9)
2029 uval = ((extend & 0x1f) << 11) | (extend & 0x7e0) | (insn & 0x1f);
2030 else if (ext_size == 15)
2031 uval = ((extend & 0xf) << 11) | (extend & 0x7f0) | (insn & 0xf);
2032 else if (ext_size == 6)
2033 uval = ((extend >> 6) & 0x1f) | (extend & 0x20);
2035 uval = mips_extract_operand (operand, (extend << 16) | insn);
2037 uval &= (1U << ext_size) - 1;
2039 baseaddr = memaddr + 2;
2040 if (operand->type == OP_PCREL)
2042 const struct mips_pcrel_operand *pcrel_op;
2044 pcrel_op = (const struct mips_pcrel_operand *) operand;
2045 if (!pcrel_op->include_isa_bit && use_extend)
2046 baseaddr = memaddr - 2;
2047 else if (!pcrel_op->include_isa_bit)
2051 /* If this instruction is in the delay slot of a JAL/JALX
2052 instruction, the base address is the address of the
2053 JAL/JALX instruction. If it is in the delay slot of
2054 a JR/JALR instruction, the base address is the address
2055 of the JR/JALR instruction. This test is unreliable:
2056 we have no way of knowing whether the previous word is
2057 instruction or data. */
2058 if (info->read_memory_func (memaddr - 4, buffer, 2, info) == 0
2059 && (((info->endian == BFD_ENDIAN_BIG
2060 ? bfd_getb16 (buffer)
2061 : bfd_getl16 (buffer))
2062 & 0xf800) == 0x1800))
2063 baseaddr = memaddr - 4;
2064 else if (info->read_memory_func (memaddr - 2, buffer, 2,
2066 && (((info->endian == BFD_ENDIAN_BIG
2067 ? bfd_getb16 (buffer)
2068 : bfd_getl16 (buffer))
2069 & 0xf89f) == 0xe800)
2070 && (((info->endian == BFD_ENDIAN_BIG
2071 ? bfd_getb16 (buffer)
2072 : bfd_getl16 (buffer))
2073 & 0x0060) != 0x0060))
2074 baseaddr = memaddr - 2;
2080 print_insn_arg (info, state, opcode, operand, baseaddr + 1, uval);
2086 /* Check if the given address is the last word of a MIPS16 PLT entry.
2087 This word is data and depending on the value it may interfere with
2088 disassembly of further PLT entries. We make use of the fact PLT
2089 symbols are marked BSF_SYNTHETIC. */
2091 is_mips16_plt_tail (struct disassemble_info *info, bfd_vma addr)
2095 && (info->symbols[0]->flags & BSF_SYNTHETIC)
2096 && addr == bfd_asymbol_value (info->symbols[0]) + 12)
2102 /* Whether none, a 32-bit or a 16-bit instruction match has been done. */
2111 /* Disassemble mips16 instructions. */
2114 print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
2116 const fprintf_ftype infprintf = info->fprintf_func;
2119 const struct mips_opcode *op, *opend;
2120 struct mips_print_arg_state state;
2121 void *is = info->stream;
2122 bfd_boolean have_second;
2123 bfd_boolean extend_only;
2124 unsigned int second;
2128 info->bytes_per_chunk = 2;
2129 info->display_endian = info->endian;
2130 info->insn_info_valid = 1;
2131 info->branch_delay_insns = 0;
2132 info->data_size = 0;
2136 #define GET_OP(insn, field) \
2137 (((insn) >> MIPS16OP_SH_##field) & MIPS16OP_MASK_##field)
2138 /* Decode PLT entry's GOT slot address word. */
2139 if (is_mips16_plt_tail (info, memaddr))
2141 info->insn_type = dis_noninsn;
2142 status = (*info->read_memory_func) (memaddr, buffer, 4, info);
2145 unsigned int gotslot;
2147 if (info->endian == BFD_ENDIAN_BIG)
2148 gotslot = bfd_getb32 (buffer);
2150 gotslot = bfd_getl32 (buffer);
2151 infprintf (is, ".word\t0x%x", gotslot);
2158 info->insn_type = dis_nonbranch;
2159 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2163 (*info->memory_error_func) (status, memaddr, info);
2167 extend_only = FALSE;
2169 if (info->endian == BFD_ENDIAN_BIG)
2170 first = bfd_getb16 (buffer);
2172 first = bfd_getl16 (buffer);
2174 status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2178 if (info->endian == BFD_ENDIAN_BIG)
2179 second = bfd_getb16 (buffer);
2181 second = bfd_getl16 (buffer);
2182 full = (first << 16) | second;
2186 have_second = FALSE;
2191 /* FIXME: Should probably use a hash table on the major opcode here. */
2193 opend = mips16_opcodes + bfd_mips16_num_opcodes;
2194 for (op = mips16_opcodes; op < opend; op++)
2196 enum match_kind match;
2198 if (!opcode_is_member (op, mips_isa, mips_ase, mips_processor))
2201 if (op->pinfo == INSN_MACRO
2202 || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
2204 else if (mips_opcode_32bit_p (op))
2207 && (full & op->mask) == op->match)
2212 else if ((first & op->mask) == op->match)
2214 match = MATCH_SHORT;
2218 else if ((first & 0xf800) == 0xf000
2221 && (second & op->mask) == op->match)
2223 if (op->pinfo2 & INSN2_SHORT_ONLY)
2234 if (match != MATCH_NONE)
2238 infprintf (is, "%s", op->name);
2239 if (op->args[0] != '\0')
2240 infprintf (is, "\t");
2242 init_print_arg_state (&state);
2243 for (s = op->args; *s != '\0'; s++)
2247 && GET_OP (full, RX) == GET_OP (full, RY))
2249 /* Skip the register and the comma. */
2255 && GET_OP (full, RZ) == GET_OP (full, RX))
2257 /* Skip the register and the comma. */
2264 && op->name[strlen (op->name) - 1] == '0')
2266 /* Coprocessor register 0 with sel field. */
2267 const struct mips_cp0sel_name *n;
2268 const struct mips_operand *operand;
2269 unsigned int reg, sel;
2271 operand = decode_mips16_operand (*s, TRUE);
2272 reg = mips_extract_operand (operand, (first << 16) | second);
2274 operand = decode_mips16_operand (*s, TRUE);
2275 sel = mips_extract_operand (operand, (first << 16) | second);
2277 /* CP0 register including 'sel' code for mftc0, to be
2278 printed textually if known. If not known, print both
2279 CP0 register name and sel numerically since CP0 register
2280 with sel 0 may have a name unrelated to register being
2282 n = lookup_mips_cp0sel_name (mips_cp0sel_names,
2283 mips_cp0sel_names_len,
2286 infprintf (is, "%s", n->name);
2288 infprintf (is, "$%d,%d", reg, sel);
2294 print_mips16_insn_arg (info, &state, op, *s, memaddr + 2,
2295 second, TRUE, first, s[1] == '(');
2298 print_mips16_insn_arg (info, &state, op, *s, memaddr,
2299 first, FALSE, 0, s[1] == '(');
2301 case MATCH_NONE: /* Stop the compiler complaining. */
2306 /* Figure out branch instruction type and delay slot information. */
2307 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2308 info->branch_delay_insns = 1;
2309 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
2310 || (op->pinfo2 & INSN2_UNCOND_BRANCH) != 0)
2312 if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2313 info->insn_type = dis_jsr;
2315 info->insn_type = dis_branch;
2317 else if ((op->pinfo2 & INSN2_COND_BRANCH) != 0)
2318 info->insn_type = dis_condbranch;
2320 return match == MATCH_FULL ? 4 : 2;
2325 infprintf (is, "0x%x", first);
2326 info->insn_type = dis_noninsn;
2331 /* Disassemble microMIPS instructions. */
2334 print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
2336 const fprintf_ftype infprintf = info->fprintf_func;
2337 const struct mips_opcode *op, *opend;
2338 void *is = info->stream;
2340 unsigned int higher;
2341 unsigned int length;
2345 info->bytes_per_chunk = 2;
2346 info->display_endian = info->endian;
2347 info->insn_info_valid = 1;
2348 info->branch_delay_insns = 0;
2349 info->data_size = 0;
2350 info->insn_type = dis_nonbranch;
2354 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2357 (*info->memory_error_func) (status, memaddr, info);
2363 if (info->endian == BFD_ENDIAN_BIG)
2364 insn = bfd_getb16 (buffer);
2366 insn = bfd_getl16 (buffer);
2368 if ((insn & 0x1c00) == 0x0000 || (insn & 0x1000) == 0x1000)
2370 /* This is a 32-bit microMIPS instruction. */
2373 status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2376 infprintf (is, "micromips 0x%x", higher);
2377 (*info->memory_error_func) (status, memaddr + 2, info);
2381 if (info->endian == BFD_ENDIAN_BIG)
2382 insn = bfd_getb16 (buffer);
2384 insn = bfd_getl16 (buffer);
2386 insn = insn | (higher << 16);
2391 /* FIXME: Should probably use a hash table on the major opcode here. */
2393 opend = micromips_opcodes + bfd_micromips_num_opcodes;
2394 for (op = micromips_opcodes; op < opend; op++)
2396 if (op->pinfo != INSN_MACRO
2397 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
2398 && (insn & op->mask) == op->match
2399 && ((length == 2 && (op->mask & 0xffff0000) == 0)
2400 || (length == 4 && (op->mask & 0xffff0000) != 0)))
2402 if (!validate_insn_args (op, decode_micromips_operand, insn))
2405 infprintf (is, "%s", op->name);
2409 infprintf (is, "\t");
2410 print_insn_args (info, op, decode_micromips_operand, insn,
2411 memaddr + 1, length);
2414 /* Figure out instruction type and branch delay information. */
2416 & (INSN_UNCOND_BRANCH_DELAY | INSN_COND_BRANCH_DELAY)) != 0)
2417 info->branch_delay_insns = 1;
2418 if (((op->pinfo & INSN_UNCOND_BRANCH_DELAY)
2419 | (op->pinfo2 & INSN2_UNCOND_BRANCH)) != 0)
2421 if ((op->pinfo & (INSN_WRITE_GPR_31 | INSN_WRITE_1)) != 0)
2422 info->insn_type = dis_jsr;
2424 info->insn_type = dis_branch;
2426 else if (((op->pinfo & INSN_COND_BRANCH_DELAY)
2427 | (op->pinfo2 & INSN2_COND_BRANCH)) != 0)
2429 if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2430 info->insn_type = dis_condjsr;
2432 info->insn_type = dis_condbranch;
2435 & (INSN_STORE_MEMORY | INSN_LOAD_MEMORY)) != 0)
2436 info->insn_type = dis_dref;
2442 infprintf (is, "0x%x", insn);
2443 info->insn_type = dis_noninsn;
2448 /* Return 1 if a symbol associated with the location being disassembled
2449 indicates a compressed mode, either MIPS16 or microMIPS, according to
2450 MICROMIPS_P. We iterate over all the symbols at the address being
2451 considered assuming if at least one of them indicates code compression,
2452 then such code has been genuinely produced here (other symbols could
2453 have been derived from function symbols defined elsewhere or could
2454 define data). Otherwise, return 0. */
2457 is_compressed_mode_p (struct disassemble_info *info, bfd_boolean micromips_p)
2462 for (i = info->symtab_pos, l = i + info->num_symbols; i < l; i++)
2463 if (((info->symtab[i])->flags & BSF_SYNTHETIC) != 0
2465 && ELF_ST_IS_MIPS16 ((*info->symbols)->udata.i))
2467 && ELF_ST_IS_MICROMIPS ((*info->symbols)->udata.i))))
2469 else if (bfd_asymbol_flavour (info->symtab[i]) == bfd_target_elf_flavour
2470 && info->symtab[i]->section == info->section)
2472 elf_symbol_type *symbol = (elf_symbol_type *) info->symtab[i];
2474 && ELF_ST_IS_MIPS16 (symbol->internal_elf_sym.st_other))
2476 && ELF_ST_IS_MICROMIPS (symbol->internal_elf_sym.st_other)))
2483 /* In an environment where we do not know the symbol type of the
2484 instruction we are forced to assume that the low order bit of the
2485 instructions' address may mark it as a mips16 instruction. If we
2486 are single stepping, or the pc is within the disassembled function,
2487 this works. Otherwise, we need a clue. Sometimes. */
2490 _print_insn_mips (bfd_vma memaddr,
2491 struct disassemble_info *info,
2492 enum bfd_endian endianness)
2494 bfd_byte buffer[INSNLEN];
2497 set_default_mips_dis_options (info);
2498 parse_mips_dis_options (info->disassembler_options);
2500 if (info->mach == bfd_mach_mips16)
2501 return print_insn_mips16 (memaddr, info);
2502 if (info->mach == bfd_mach_mips_micromips)
2503 return print_insn_micromips (memaddr, info);
2506 /* FIXME: If odd address, this is CLEARLY a compressed instruction. */
2507 /* Only a few tools will work this way. */
2511 return print_insn_micromips (memaddr, info);
2513 return print_insn_mips16 (memaddr, info);
2517 #if SYMTAB_AVAILABLE
2518 if (is_compressed_mode_p (info, TRUE))
2519 return print_insn_micromips (memaddr, info);
2520 if (is_compressed_mode_p (info, FALSE))
2521 return print_insn_mips16 (memaddr, info);
2524 status = (*info->read_memory_func) (memaddr, buffer, INSNLEN, info);
2529 if (endianness == BFD_ENDIAN_BIG)
2530 insn = bfd_getb32 (buffer);
2532 insn = bfd_getl32 (buffer);
2534 return print_insn_mips (memaddr, insn, info);
2538 (*info->memory_error_func) (status, memaddr, info);
2544 print_insn_big_mips (bfd_vma memaddr, struct disassemble_info *info)
2546 return _print_insn_mips (memaddr, info, BFD_ENDIAN_BIG);
2550 print_insn_little_mips (bfd_vma memaddr, struct disassemble_info *info)
2552 return _print_insn_mips (memaddr, info, BFD_ENDIAN_LITTLE);
2555 /* Indices into option argument vector for options accepting an argument.
2556 Use MIPS_OPTION_ARG_NONE for options accepting no argument. */
2559 MIPS_OPTION_ARG_NONE = -1,
2560 MIPS_OPTION_ARG_ABI,
2561 MIPS_OPTION_ARG_ARCH,
2562 MIPS_OPTION_ARG_SIZE
2563 } mips_option_arg_t;
2565 /* Valid MIPS disassembler options. */
2569 const char *description;
2570 mips_option_arg_t arg;
2573 { "no-aliases", N_("Use canonical instruction forms.\n"),
2574 MIPS_OPTION_ARG_NONE },
2575 { "msa", N_("Recognize MSA instructions.\n"),
2576 MIPS_OPTION_ARG_NONE },
2577 { "virt", N_("Recognize the virtualization ASE instructions.\n"),
2578 MIPS_OPTION_ARG_NONE },
2579 { "xpa", N_("Recognize the eXtended Physical Address (XPA) ASE\n\
2581 MIPS_OPTION_ARG_NONE },
2582 { "ginv", N_("Recognize the Global INValidate (GINV) ASE "
2584 MIPS_OPTION_ARG_NONE },
2585 { "gpr-names=", N_("Print GPR names according to specified ABI.\n\
2586 Default: based on binary being disassembled.\n"),
2587 MIPS_OPTION_ARG_ABI },
2588 { "fpr-names=", N_("Print FPR names according to specified ABI.\n\
2589 Default: numeric.\n"),
2590 MIPS_OPTION_ARG_ABI },
2591 { "cp0-names=", N_("Print CP0 register names according to specified "
2593 Default: based on binary being disassembled.\n"),
2594 MIPS_OPTION_ARG_ARCH },
2595 { "hwr-names=", N_("Print HWR names according to specified architecture.\n\
2596 Default: based on binary being disassembled.\n"),
2597 MIPS_OPTION_ARG_ARCH },
2598 { "reg-names=", N_("Print GPR and FPR names according to specified ABI.\n"),
2599 MIPS_OPTION_ARG_ABI },
2600 { "reg-names=", N_("Print CP0 register and HWR names according to "
2603 MIPS_OPTION_ARG_ARCH }
2606 /* Build the structure representing valid MIPS disassembler options.
2607 This is done dynamically for maintenance ease purpose; a static
2608 initializer would be unreadable. */
2610 const disasm_options_and_args_t *
2611 disassembler_options_mips (void)
2613 static disasm_options_and_args_t *opts_and_args;
2615 if (opts_and_args == NULL)
2617 size_t num_options = ARRAY_SIZE (mips_options);
2618 size_t num_args = MIPS_OPTION_ARG_SIZE;
2619 disasm_option_arg_t *args;
2620 disasm_options_t *opts;
2624 args = XNEWVEC (disasm_option_arg_t, num_args + 1);
2626 args[MIPS_OPTION_ARG_ABI].name = "ABI";
2627 args[MIPS_OPTION_ARG_ABI].values
2628 = XNEWVEC (const char *, ARRAY_SIZE (mips_abi_choices) + 1);
2629 for (i = 0; i < ARRAY_SIZE (mips_abi_choices); i++)
2630 args[MIPS_OPTION_ARG_ABI].values[i] = mips_abi_choices[i].name;
2631 /* The array we return must be NULL terminated. */
2632 args[MIPS_OPTION_ARG_ABI].values[i] = NULL;
2634 args[MIPS_OPTION_ARG_ARCH].name = "ARCH";
2635 args[MIPS_OPTION_ARG_ARCH].values
2636 = XNEWVEC (const char *, ARRAY_SIZE (mips_arch_choices) + 1);
2637 for (i = 0, j = 0; i < ARRAY_SIZE (mips_arch_choices); i++)
2638 if (*mips_arch_choices[i].name != '\0')
2639 args[MIPS_OPTION_ARG_ARCH].values[j++] = mips_arch_choices[i].name;
2640 /* The array we return must be NULL terminated. */
2641 args[MIPS_OPTION_ARG_ARCH].values[j] = NULL;
2643 /* The array we return must be NULL terminated. */
2644 args[MIPS_OPTION_ARG_SIZE].name = NULL;
2645 args[MIPS_OPTION_ARG_SIZE].values = NULL;
2647 opts_and_args = XNEW (disasm_options_and_args_t);
2648 opts_and_args->args = args;
2650 opts = &opts_and_args->options;
2651 opts->name = XNEWVEC (const char *, num_options + 1);
2652 opts->description = XNEWVEC (const char *, num_options + 1);
2653 opts->arg = XNEWVEC (const disasm_option_arg_t *, num_options + 1);
2654 for (i = 0; i < num_options; i++)
2656 opts->name[i] = mips_options[i].name;
2657 opts->description[i] = _(mips_options[i].description);
2658 if (mips_options[i].arg != MIPS_OPTION_ARG_NONE)
2659 opts->arg[i] = &args[mips_options[i].arg];
2661 opts->arg[i] = NULL;
2663 /* The array we return must be NULL terminated. */
2664 opts->name[i] = NULL;
2665 opts->description[i] = NULL;
2666 opts->arg[i] = NULL;
2669 return opts_and_args;
2673 print_mips_disassembler_options (FILE *stream)
2675 const disasm_options_and_args_t *opts_and_args;
2676 const disasm_option_arg_t *args;
2677 const disasm_options_t *opts;
2682 opts_and_args = disassembler_options_mips ();
2683 opts = &opts_and_args->options;
2684 args = opts_and_args->args;
2686 fprintf (stream, _("\n\
2687 The following MIPS specific disassembler options are supported for use\n\
2688 with the -M switch (multiple options should be separated by commas):\n\n"));
2690 /* Compute the length of the longest option name. */
2691 for (i = 0; opts->name[i] != NULL; i++)
2693 size_t len = strlen (opts->name[i]);
2695 if (opts->arg[i] != NULL)
2696 len += strlen (opts->arg[i]->name);
2701 for (i = 0, max_len++; opts->name[i] != NULL; i++)
2703 fprintf (stream, " %s", opts->name[i]);
2704 if (opts->arg[i] != NULL)
2705 fprintf (stream, "%s", opts->arg[i]->name);
2706 if (opts->description[i] != NULL)
2708 size_t len = strlen (opts->name[i]);
2710 if (opts->arg[i] != NULL)
2711 len += strlen (opts->arg[i]->name);
2713 "%*c %s", (int) (max_len - len), ' ', opts->description[i]);
2715 fprintf (stream, _("\n"));
2718 for (i = 0; args[i].name != NULL; i++)
2720 fprintf (stream, _("\n\
2721 For the options above, the following values are supported for \"%s\":\n "),
2723 for (j = 0; args[i].values[j] != NULL; j++)
2724 fprintf (stream, " %s", args[i].values[j]);
2725 fprintf (stream, _("\n"));
2728 fprintf (stream, _("\n"));