mips-dis.c revision 1.1.1.2.2.1 1 /* Print mips instructions for GDB, the GNU debugger, or for objdump.
2 Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2012
4 Free Software Foundation, Inc.
5 Contributed by Nobuyuki Hikichi(hikichi (at) sra.co.jp).
6
7 This file is part of the GNU opcodes library.
8
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)
12 any later version.
13
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.
18
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. */
23
24 #include "sysdep.h"
25 #include "dis-asm.h"
26 #include "libiberty.h"
27 #include "opcode/mips.h"
28 #include "opintl.h"
29
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. */
34
35 #if !defined(EMBEDDED_ENV)
36 #define SYMTAB_AVAILABLE 1
37 #include "elf-bfd.h"
38 #include "elf/mips.h"
39 #endif
40
41 /* Mips instructions are at maximum this many bytes long. */
42 #define INSNLEN 4
43
44
45 /* FIXME: These should be shared with gdb somehow. */
47
48 struct mips_cp0sel_name
49 {
50 unsigned int cp0reg;
51 unsigned int sel;
52 const char * const name;
53 };
54
55 static const char * const mips_gpr_names_numeric[32] =
56 {
57 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
58 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
59 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
60 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
61 };
62
63 static const char * const mips_gpr_names_oldabi[32] =
64 {
65 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
66 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
67 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
68 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
69 };
70
71 static const char * const mips_gpr_names_newabi[32] =
72 {
73 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
74 "a4", "a5", "a6", "a7", "t0", "t1", "t2", "t3",
75 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
76 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
77 };
78
79 static const char * const mips_fpr_names_numeric[32] =
80 {
81 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
82 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
83 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
84 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31"
85 };
86
87 static const char * const mips_fpr_names_32[32] =
88 {
89 "fv0", "fv0f", "fv1", "fv1f", "ft0", "ft0f", "ft1", "ft1f",
90 "ft2", "ft2f", "ft3", "ft3f", "fa0", "fa0f", "fa1", "fa1f",
91 "ft4", "ft4f", "ft5", "ft5f", "fs0", "fs0f", "fs1", "fs1f",
92 "fs2", "fs2f", "fs3", "fs3f", "fs4", "fs4f", "fs5", "fs5f"
93 };
94
95 static const char * const mips_fpr_names_n32[32] =
96 {
97 "fv0", "ft14", "fv1", "ft15", "ft0", "ft1", "ft2", "ft3",
98 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
99 "fa4", "fa5", "fa6", "fa7", "fs0", "ft8", "fs1", "ft9",
100 "fs2", "ft10", "fs3", "ft11", "fs4", "ft12", "fs5", "ft13"
101 };
102
103 static const char * const mips_fpr_names_64[32] =
104 {
105 "fv0", "ft12", "fv1", "ft13", "ft0", "ft1", "ft2", "ft3",
106 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
107 "fa4", "fa5", "fa6", "fa7", "ft8", "ft9", "ft10", "ft11",
108 "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7"
109 };
110
111 static const char * const mips_cp0_names_numeric[32] =
112 {
113 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
114 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
115 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
116 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
117 };
118
119 static const char * const mips_cp1_names_numeric[32] =
120 {
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"
125 };
126
127 static const char * const mips_cp0_names_r3000[32] =
128 {
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",
137 };
138
139 static const char * const mips_cp0_names_r4000[32] =
140 {
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",
149 };
150
151 static const char * const mips_cp0_names_r5900[32] =
152 {
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_sr", "c0_cause", "c0_epc", "c0_prid",
157 "c0_config", "$17", "$18", "$19",
158 "$20", "$21", "$22", "c0_badpaddr",
159 "c0_depc", "c0_perfcnt", "$26", "$27",
160 "c0_taglo", "c0_taghi", "c0_errorepc", "$31"
161 };
162
163 static const struct mips_cp0sel_name mips_cp0sel_names_mipsr5900[] =
164 {
165 { 24, 2, "c0_iab" },
166 { 24, 3, "c0_iabm" },
167 { 24, 4, "c0_dab" },
168 { 24, 5, "c0_dabm" },
169 { 24, 6, "c0_dvb" },
170 { 24, 7, "c0_dvbm" },
171 { 25, 1, "c0_perfcnt,1" },
172 { 25, 2, "c0_perfcnt,2" }
173 };
174
175 static const char * const mips_cp0_names_mips3264[32] =
176 {
177 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
178 "c0_context", "c0_pagemask", "c0_wired", "$7",
179 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
180 "c0_status", "c0_cause", "c0_epc", "c0_prid",
181 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
182 "c0_xcontext", "$21", "$22", "c0_debug",
183 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr",
184 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
185 };
186
187 static const char * const mips_cp1_names_mips3264[32] =
188 {
189 "c1_fir", "c1_ufr", "$2", "$3",
190 "c1_unfr", "$5", "$6", "$7",
191 "$8", "$9", "$10", "$11",
192 "$12", "$13", "$14", "$15",
193 "$16", "$17", "$18", "$19",
194 "$20", "$21", "$22", "$23",
195 "$24", "c1_fccr", "c1_fexr", "$27",
196 "c1_fenr", "$29", "$30", "c1_fcsr"
197 };
198
199 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264[] =
200 {
201 { 16, 1, "c0_config1" },
202 { 16, 2, "c0_config2" },
203 { 16, 3, "c0_config3" },
204 { 18, 1, "c0_watchlo,1" },
205 { 18, 2, "c0_watchlo,2" },
206 { 18, 3, "c0_watchlo,3" },
207 { 18, 4, "c0_watchlo,4" },
208 { 18, 5, "c0_watchlo,5" },
209 { 18, 6, "c0_watchlo,6" },
210 { 18, 7, "c0_watchlo,7" },
211 { 19, 1, "c0_watchhi,1" },
212 { 19, 2, "c0_watchhi,2" },
213 { 19, 3, "c0_watchhi,3" },
214 { 19, 4, "c0_watchhi,4" },
215 { 19, 5, "c0_watchhi,5" },
216 { 19, 6, "c0_watchhi,6" },
217 { 19, 7, "c0_watchhi,7" },
218 { 25, 1, "c0_perfcnt,1" },
219 { 25, 2, "c0_perfcnt,2" },
220 { 25, 3, "c0_perfcnt,3" },
221 { 25, 4, "c0_perfcnt,4" },
222 { 25, 5, "c0_perfcnt,5" },
223 { 25, 6, "c0_perfcnt,6" },
224 { 25, 7, "c0_perfcnt,7" },
225 { 27, 1, "c0_cacheerr,1" },
226 { 27, 2, "c0_cacheerr,2" },
227 { 27, 3, "c0_cacheerr,3" },
228 { 28, 1, "c0_datalo" },
229 { 29, 1, "c0_datahi" }
230 };
231
232 static const char * const mips_cp0_names_mips3264r2[32] =
233 {
234 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
235 "c0_context", "c0_pagemask", "c0_wired", "c0_hwrena",
236 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
237 "c0_status", "c0_cause", "c0_epc", "c0_prid",
238 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
239 "c0_xcontext", "$21", "$22", "c0_debug",
240 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr",
241 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
242 };
243
244 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264r2[] =
245 {
246 { 4, 1, "c0_contextconfig" },
247 { 0, 1, "c0_mvpcontrol" },
248 { 0, 2, "c0_mvpconf0" },
249 { 0, 3, "c0_mvpconf1" },
250 { 1, 1, "c0_vpecontrol" },
251 { 1, 2, "c0_vpeconf0" },
252 { 1, 3, "c0_vpeconf1" },
253 { 1, 4, "c0_yqmask" },
254 { 1, 5, "c0_vpeschedule" },
255 { 1, 6, "c0_vpeschefback" },
256 { 2, 1, "c0_tcstatus" },
257 { 2, 2, "c0_tcbind" },
258 { 2, 3, "c0_tcrestart" },
259 { 2, 4, "c0_tchalt" },
260 { 2, 5, "c0_tccontext" },
261 { 2, 6, "c0_tcschedule" },
262 { 2, 7, "c0_tcschefback" },
263 { 5, 1, "c0_pagegrain" },
264 { 6, 1, "c0_srsconf0" },
265 { 6, 2, "c0_srsconf1" },
266 { 6, 3, "c0_srsconf2" },
267 { 6, 4, "c0_srsconf3" },
268 { 6, 5, "c0_srsconf4" },
269 { 12, 1, "c0_intctl" },
270 { 12, 2, "c0_srsctl" },
271 { 12, 3, "c0_srsmap" },
272 { 15, 1, "c0_ebase" },
273 { 16, 1, "c0_config1" },
274 { 16, 2, "c0_config2" },
275 { 16, 3, "c0_config3" },
276 { 18, 1, "c0_watchlo,1" },
277 { 18, 2, "c0_watchlo,2" },
278 { 18, 3, "c0_watchlo,3" },
279 { 18, 4, "c0_watchlo,4" },
280 { 18, 5, "c0_watchlo,5" },
281 { 18, 6, "c0_watchlo,6" },
282 { 18, 7, "c0_watchlo,7" },
283 { 19, 1, "c0_watchhi,1" },
284 { 19, 2, "c0_watchhi,2" },
285 { 19, 3, "c0_watchhi,3" },
286 { 19, 4, "c0_watchhi,4" },
287 { 19, 5, "c0_watchhi,5" },
288 { 19, 6, "c0_watchhi,6" },
289 { 19, 7, "c0_watchhi,7" },
290 { 23, 1, "c0_tracecontrol" },
291 { 23, 2, "c0_tracecontrol2" },
292 { 23, 3, "c0_usertracedata" },
293 { 23, 4, "c0_tracebpc" },
294 { 25, 1, "c0_perfcnt,1" },
295 { 25, 2, "c0_perfcnt,2" },
296 { 25, 3, "c0_perfcnt,3" },
297 { 25, 4, "c0_perfcnt,4" },
298 { 25, 5, "c0_perfcnt,5" },
299 { 25, 6, "c0_perfcnt,6" },
300 { 25, 7, "c0_perfcnt,7" },
301 { 27, 1, "c0_cacheerr,1" },
302 { 27, 2, "c0_cacheerr,2" },
303 { 27, 3, "c0_cacheerr,3" },
304 { 28, 1, "c0_datalo" },
305 { 28, 2, "c0_taglo1" },
306 { 28, 3, "c0_datalo1" },
307 { 28, 4, "c0_taglo2" },
308 { 28, 5, "c0_datalo2" },
309 { 28, 6, "c0_taglo3" },
310 { 28, 7, "c0_datalo3" },
311 { 29, 1, "c0_datahi" },
312 { 29, 2, "c0_taghi1" },
313 { 29, 3, "c0_datahi1" },
314 { 29, 4, "c0_taghi2" },
315 { 29, 5, "c0_datahi2" },
316 { 29, 6, "c0_taghi3" },
317 { 29, 7, "c0_datahi3" },
318 };
319
320 /* SB-1: MIPS64 (mips_cp0_names_mips3264) with minor mods. */
321 static const char * const mips_cp0_names_sb1[32] =
322 {
323 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
324 "c0_context", "c0_pagemask", "c0_wired", "$7",
325 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
326 "c0_status", "c0_cause", "c0_epc", "c0_prid",
327 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
328 "c0_xcontext", "$21", "$22", "c0_debug",
329 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr_i",
330 "c0_taglo_i", "c0_taghi_i", "c0_errorepc", "c0_desave",
331 };
332
333 static const struct mips_cp0sel_name mips_cp0sel_names_sb1[] =
334 {
335 { 16, 1, "c0_config1" },
336 { 18, 1, "c0_watchlo,1" },
337 { 19, 1, "c0_watchhi,1" },
338 { 22, 0, "c0_perftrace" },
339 { 23, 3, "c0_edebug" },
340 { 25, 1, "c0_perfcnt,1" },
341 { 25, 2, "c0_perfcnt,2" },
342 { 25, 3, "c0_perfcnt,3" },
343 { 25, 4, "c0_perfcnt,4" },
344 { 25, 5, "c0_perfcnt,5" },
345 { 25, 6, "c0_perfcnt,6" },
346 { 25, 7, "c0_perfcnt,7" },
347 { 26, 1, "c0_buserr_pa" },
348 { 27, 1, "c0_cacheerr_d" },
349 { 27, 3, "c0_cacheerr_d_pa" },
350 { 28, 1, "c0_datalo_i" },
351 { 28, 2, "c0_taglo_d" },
352 { 28, 3, "c0_datalo_d" },
353 { 29, 1, "c0_datahi_i" },
354 { 29, 2, "c0_taghi_d" },
355 { 29, 3, "c0_datahi_d" },
356 };
357
358 /* Xlr cop0 register names. */
359 static const char * const mips_cp0_names_xlr[32] = {
360 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
361 "c0_context", "c0_pagemask", "c0_wired", "$7",
362 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
363 "c0_status", "c0_cause", "c0_epc", "c0_prid",
364 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
365 "c0_xcontext", "$21", "$22", "c0_debug",
366 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr_i",
367 "c0_taglo_i", "c0_taghi_i", "c0_errorepc", "c0_desave",
368 };
369
370 /* XLR's CP0 Select Registers. */
371
372 static const struct mips_cp0sel_name mips_cp0sel_names_xlr[] = {
373 { 9, 6, "c0_extintreq" },
374 { 9, 7, "c0_extintmask" },
375 { 15, 1, "c0_ebase" },
376 { 16, 1, "c0_config1" },
377 { 16, 2, "c0_config2" },
378 { 16, 3, "c0_config3" },
379 { 16, 7, "c0_procid2" },
380 { 18, 1, "c0_watchlo,1" },
381 { 18, 2, "c0_watchlo,2" },
382 { 18, 3, "c0_watchlo,3" },
383 { 18, 4, "c0_watchlo,4" },
384 { 18, 5, "c0_watchlo,5" },
385 { 18, 6, "c0_watchlo,6" },
386 { 18, 7, "c0_watchlo,7" },
387 { 19, 1, "c0_watchhi,1" },
388 { 19, 2, "c0_watchhi,2" },
389 { 19, 3, "c0_watchhi,3" },
390 { 19, 4, "c0_watchhi,4" },
391 { 19, 5, "c0_watchhi,5" },
392 { 19, 6, "c0_watchhi,6" },
393 { 19, 7, "c0_watchhi,7" },
394 { 25, 1, "c0_perfcnt,1" },
395 { 25, 2, "c0_perfcnt,2" },
396 { 25, 3, "c0_perfcnt,3" },
397 { 25, 4, "c0_perfcnt,4" },
398 { 25, 5, "c0_perfcnt,5" },
399 { 25, 6, "c0_perfcnt,6" },
400 { 25, 7, "c0_perfcnt,7" },
401 { 27, 1, "c0_cacheerr,1" },
402 { 27, 2, "c0_cacheerr,2" },
403 { 27, 3, "c0_cacheerr,3" },
404 { 28, 1, "c0_datalo" },
405 { 29, 1, "c0_datahi" }
406 };
407
408 static const char * const mips_hwr_names_numeric[32] =
409 {
410 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
411 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
412 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
413 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
414 };
415
416 static const char * const mips_hwr_names_mips3264r2[32] =
417 {
418 "hwr_cpunum", "hwr_synci_step", "hwr_cc", "hwr_ccres",
419 "$4", "$5", "$6", "$7",
420 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
421 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
422 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
423 };
424
425 static const char * const msa_control_names[32] =
426 {
427 "msa_ir", "msa_csr", "msa_access", "msa_save",
428 "msa_modify", "msa_request", "msa_map", "msa_unmap",
429 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
430 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
431 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
432 };
433
434 struct mips_abi_choice
435 {
436 const char * name;
437 const char * const *gpr_names;
438 const char * const *fpr_names;
439 };
440
441 struct mips_abi_choice mips_abi_choices[] =
442 {
443 { "numeric", mips_gpr_names_numeric, mips_fpr_names_numeric },
444 { "32", mips_gpr_names_oldabi, mips_fpr_names_32 },
445 { "n32", mips_gpr_names_newabi, mips_fpr_names_n32 },
446 { "64", mips_gpr_names_newabi, mips_fpr_names_64 },
447 };
448
449 struct mips_arch_choice
450 {
451 const char *name;
452 int bfd_mach_valid;
453 unsigned long bfd_mach;
454 int processor;
455 int isa;
456 int ase;
457 const char * const *cp0_names;
458 const struct mips_cp0sel_name *cp0sel_names;
459 unsigned int cp0sel_names_len;
460 const char * const *cp1_names;
461 const char * const *hwr_names;
462 };
463
464 const struct mips_arch_choice mips_arch_choices[] =
465 {
466 { "numeric", 0, 0, 0, 0, 0,
467 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
468 mips_hwr_names_numeric },
469
470 { "r3000", 1, bfd_mach_mips3000, CPU_R3000, ISA_MIPS1, 0,
471 mips_cp0_names_r3000, NULL, 0, mips_cp1_names_numeric,
472 mips_hwr_names_numeric },
473 { "r3900", 1, bfd_mach_mips3900, CPU_R3900, ISA_MIPS1, 0,
474 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
475 mips_hwr_names_numeric },
476 { "r4000", 1, bfd_mach_mips4000, CPU_R4000, ISA_MIPS3, 0,
477 mips_cp0_names_r4000, NULL, 0, mips_cp1_names_numeric,
478 mips_hwr_names_numeric },
479 { "r4010", 1, bfd_mach_mips4010, CPU_R4010, ISA_MIPS2, 0,
480 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
481 mips_hwr_names_numeric },
482 { "vr4100", 1, bfd_mach_mips4100, CPU_VR4100, ISA_MIPS3, 0,
483 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
484 mips_hwr_names_numeric },
485 { "vr4111", 1, bfd_mach_mips4111, CPU_R4111, ISA_MIPS3, 0,
486 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
487 mips_hwr_names_numeric },
488 { "vr4120", 1, bfd_mach_mips4120, CPU_VR4120, ISA_MIPS3, 0,
489 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
490 mips_hwr_names_numeric },
491 { "r4300", 1, bfd_mach_mips4300, CPU_R4300, ISA_MIPS3, 0,
492 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
493 mips_hwr_names_numeric },
494 { "r4400", 1, bfd_mach_mips4400, CPU_R4400, ISA_MIPS3, 0,
495 mips_cp0_names_r4000, NULL, 0, mips_cp1_names_numeric,
496 mips_hwr_names_numeric },
497 { "r4600", 1, bfd_mach_mips4600, CPU_R4600, ISA_MIPS3, 0,
498 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
499 mips_hwr_names_numeric },
500 { "r4650", 1, bfd_mach_mips4650, CPU_R4650, ISA_MIPS3, 0,
501 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
502 mips_hwr_names_numeric },
503 { "r5000", 1, bfd_mach_mips5000, CPU_R5000, ISA_MIPS4, 0,
504 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
505 mips_hwr_names_numeric },
506 { "vr5400", 1, bfd_mach_mips5400, CPU_VR5400, ISA_MIPS4, 0,
507 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
508 mips_hwr_names_numeric },
509 { "vr5500", 1, bfd_mach_mips5500, CPU_VR5500, ISA_MIPS4, 0,
510 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
511 mips_hwr_names_numeric },
512 { "r5900", 1, bfd_mach_mips5900, CPU_R5900, ISA_MIPS3, 0,
513 mips_cp0_names_r5900, NULL, 0, mips_cp1_names_numeric,
514 mips_hwr_names_numeric },
515 { "r6000", 1, bfd_mach_mips6000, CPU_R6000, ISA_MIPS2, 0,
516 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
517 mips_hwr_names_numeric },
518 { "rm7000", 1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4, 0,
519 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
520 mips_hwr_names_numeric },
521 { "rm9000", 1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4, 0,
522 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
523 mips_hwr_names_numeric },
524 { "r8000", 1, bfd_mach_mips8000, CPU_R8000, ISA_MIPS4, 0,
525 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
526 mips_hwr_names_numeric },
527 { "r10000", 1, bfd_mach_mips10000, CPU_R10000, ISA_MIPS4, 0,
528 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
529 mips_hwr_names_numeric },
530 { "r12000", 1, bfd_mach_mips12000, CPU_R12000, ISA_MIPS4, 0,
531 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
532 mips_hwr_names_numeric },
533 { "r14000", 1, bfd_mach_mips14000, CPU_R14000, ISA_MIPS4, 0,
534 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
535 mips_hwr_names_numeric },
536 { "r16000", 1, bfd_mach_mips16000, CPU_R16000, ISA_MIPS4, 0,
537 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
538 mips_hwr_names_numeric },
539 { "mips5", 1, bfd_mach_mips5, CPU_MIPS5, ISA_MIPS5, 0,
540 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
541 mips_hwr_names_numeric },
542
543 /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
544 Note that MIPS-3D and MDMX are not applicable to MIPS32. (See
545 _MIPS32 Architecture For Programmers Volume I: Introduction to the
546 MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
547 page 1. */
548 { "mips32", 1, bfd_mach_mipsisa32, CPU_MIPS32,
549 ISA_MIPS32, ASE_SMARTMIPS,
550 mips_cp0_names_mips3264,
551 mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
552 mips_cp1_names_mips3264, mips_hwr_names_numeric },
553
554 { "mips32r2", 1, bfd_mach_mipsisa32r2, CPU_MIPS32R2,
555 ISA_MIPS32R2,
556 (ASE_SMARTMIPS | ASE_DSP | ASE_DSPR2 | ASE_EVA | ASE_MIPS3D
557 | ASE_MT | ASE_MCU | ASE_VIRT | ASE_MSA),
558 mips_cp0_names_mips3264r2,
559 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
560 mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
561
562 /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs. */
563 { "mips64", 1, bfd_mach_mipsisa64, CPU_MIPS64,
564 ISA_MIPS64, ASE_MIPS3D | ASE_MDMX,
565 mips_cp0_names_mips3264,
566 mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
567 mips_cp1_names_mips3264, mips_hwr_names_numeric },
568
569 { "mips64r2", 1, bfd_mach_mipsisa64r2, CPU_MIPS64R2,
570 ISA_MIPS64R2,
571 (ASE_MIPS3D | ASE_DSP | ASE_DSPR2 | ASE_DSP64 | ASE_EVA | ASE_MT
572 | ASE_MCU | ASE_VIRT | ASE_VIRT64 | ASE_MSA | ASE_MSA64),
573 mips_cp0_names_mips3264r2,
574 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
575 mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
576
577 { "sb1", 1, bfd_mach_mips_sb1, CPU_SB1,
578 ISA_MIPS64 | INSN_SB1, ASE_MIPS3D,
579 mips_cp0_names_sb1,
580 mips_cp0sel_names_sb1, ARRAY_SIZE (mips_cp0sel_names_sb1),
581 mips_cp1_names_mips3264, mips_hwr_names_numeric },
582
583 { "loongson2e", 1, bfd_mach_mips_loongson_2e, CPU_LOONGSON_2E,
584 ISA_MIPS3 | INSN_LOONGSON_2E, 0, mips_cp0_names_numeric,
585 NULL, 0, mips_cp1_names_numeric, mips_hwr_names_numeric },
586
587 { "loongson2f", 1, bfd_mach_mips_loongson_2f, CPU_LOONGSON_2F,
588 ISA_MIPS3 | INSN_LOONGSON_2F, 0, mips_cp0_names_numeric,
589 NULL, 0, mips_cp1_names_numeric, mips_hwr_names_numeric },
590
591 { "loongson3a", 1, bfd_mach_mips_loongson_3a, CPU_LOONGSON_3A,
592 ISA_MIPS64 | INSN_LOONGSON_3A, 0, mips_cp0_names_numeric,
593 NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
594
595 { "octeon", 1, bfd_mach_mips_octeon, CPU_OCTEON,
596 ISA_MIPS64R2 | INSN_OCTEON, 0, mips_cp0_names_numeric, NULL, 0,
597 mips_cp1_names_mips3264, mips_hwr_names_numeric },
598
599 { "octeon+", 1, bfd_mach_mips_octeonp, CPU_OCTEONP,
600 ISA_MIPS64R2 | INSN_OCTEONP, 0, mips_cp0_names_numeric,
601 NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
602
603 { "octeon2", 1, bfd_mach_mips_octeon2, CPU_OCTEON2,
604 ISA_MIPS64R2 | INSN_OCTEON2, 0, mips_cp0_names_numeric,
605 NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
606
607 { "xlr", 1, bfd_mach_mips_xlr, CPU_XLR,
608 ISA_MIPS64 | INSN_XLR, 0,
609 mips_cp0_names_xlr,
610 mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
611 mips_cp1_names_mips3264, mips_hwr_names_numeric },
612
613 /* XLP is mostly like XLR, with the prominent exception it is being
614 MIPS64R2. */
615 { "xlp", 1, bfd_mach_mips_xlr, CPU_XLR,
616 ISA_MIPS64R2 | INSN_XLR, 0,
617 mips_cp0_names_xlr,
618 mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
619 mips_cp1_names_mips3264, mips_hwr_names_numeric },
620
621 /* This entry, mips16, is here only for ISA/processor selection; do
622 not print its name. */
623 { "", 1, bfd_mach_mips16, CPU_MIPS16, ISA_MIPS3, 0,
624 mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
625 mips_hwr_names_numeric },
626 };
627
628 /* ISA and processor type to disassemble for, and register names to use.
629 set_default_mips_dis_options and parse_mips_dis_options fill in these
630 values. */
631 static int mips_processor;
632 static int mips_isa;
633 static int mips_ase;
634 static int micromips_ase;
635 static const char * const *mips_gpr_names;
636 static const char * const *mips_fpr_names;
637 static const char * const *mips_cp0_names;
638 static const struct mips_cp0sel_name *mips_cp0sel_names;
639 static int mips_cp0sel_names_len;
640 static const char * const *mips_cp1_names;
641 static const char * const *mips_hwr_names;
642
643 /* Other options */
644 static int no_aliases; /* If set disassemble as most general inst. */
645
646 static const struct mips_abi_choice *
648 choose_abi_by_name (const char *name, unsigned int namelen)
649 {
650 const struct mips_abi_choice *c;
651 unsigned int i;
652
653 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_abi_choices) && c == NULL; i++)
654 if (strncmp (mips_abi_choices[i].name, name, namelen) == 0
655 && strlen (mips_abi_choices[i].name) == namelen)
656 c = &mips_abi_choices[i];
657
658 return c;
659 }
660
661 static const struct mips_arch_choice *
662 choose_arch_by_name (const char *name, unsigned int namelen)
663 {
664 const struct mips_arch_choice *c = NULL;
665 unsigned int i;
666
667 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
668 if (strncmp (mips_arch_choices[i].name, name, namelen) == 0
669 && strlen (mips_arch_choices[i].name) == namelen)
670 c = &mips_arch_choices[i];
671
672 return c;
673 }
674
675 static const struct mips_arch_choice *
676 choose_arch_by_number (unsigned long mach)
677 {
678 static unsigned long hint_bfd_mach;
679 static const struct mips_arch_choice *hint_arch_choice;
680 const struct mips_arch_choice *c;
681 unsigned int i;
682
683 /* We optimize this because even if the user specifies no
684 flags, this will be done for every instruction! */
685 if (hint_bfd_mach == mach
686 && hint_arch_choice != NULL
687 && hint_arch_choice->bfd_mach == hint_bfd_mach)
688 return hint_arch_choice;
689
690 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
691 {
692 if (mips_arch_choices[i].bfd_mach_valid
693 && mips_arch_choices[i].bfd_mach == mach)
694 {
695 c = &mips_arch_choices[i];
696 hint_bfd_mach = mach;
697 hint_arch_choice = c;
698 }
699 }
700 return c;
701 }
702
703 /* Check if the object uses NewABI conventions. */
704
705 static int
706 is_newabi (Elf_Internal_Ehdr *header)
707 {
708 /* There are no old-style ABIs which use 64-bit ELF. */
709 if (header->e_ident[EI_CLASS] == ELFCLASS64)
710 return 1;
711
712 /* If a 32-bit ELF file, n32 is a new-style ABI. */
713 if ((header->e_flags & EF_MIPS_ABI2) != 0)
714 return 1;
715
716 return 0;
717 }
718
719 /* Check if the object has microMIPS ASE code. */
720
721 static int
722 is_micromips (Elf_Internal_Ehdr *header)
723 {
724 if ((header->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS) != 0)
725 return 1;
726
727 return 0;
728 }
729
730 static void
731 set_default_mips_dis_options (struct disassemble_info *info)
732 {
733 const struct mips_arch_choice *chosen_arch;
734
735 /* Defaults: mipsIII/r3000 (?!), no microMIPS ASE (any compressed code
736 is MIPS16 ASE) (o)32-style ("oldabi") GPR names, and numeric FPR,
737 CP0 register, and HWR names. */
738 mips_isa = ISA_MIPS3;
739 mips_processor = CPU_R3000;
740 micromips_ase = 0;
741 mips_ase = 0;
742 mips_gpr_names = mips_gpr_names_oldabi;
743 mips_fpr_names = mips_fpr_names_numeric;
744 mips_cp0_names = mips_cp0_names_numeric;
745 mips_cp0sel_names = NULL;
746 mips_cp0sel_names_len = 0;
747 mips_cp1_names = mips_cp1_names_numeric;
748 mips_hwr_names = mips_hwr_names_numeric;
749 no_aliases = 0;
750
751 /* Update settings according to the ELF file header flags. */
752 if (info->flavour == bfd_target_elf_flavour && info->section != NULL)
753 {
754 Elf_Internal_Ehdr *header;
755
756 header = elf_elfheader (info->section->owner);
757 /* If an ELF "newabi" binary, use the n32/(n)64 GPR names. */
758 if (is_newabi (header))
759 mips_gpr_names = mips_gpr_names_newabi;
760 /* If a microMIPS binary, then don't use MIPS16 bindings. */
761 micromips_ase = is_micromips (header);
762 }
763
764 /* Set ISA, architecture, and cp0 register names as best we can. */
765 #if ! SYMTAB_AVAILABLE
766 /* This is running out on a target machine, not in a host tool.
767 FIXME: Where does mips_target_info come from? */
768 target_processor = mips_target_info.processor;
769 mips_isa = mips_target_info.isa;
770 mips_ase = mips_target_info.ase;
771 #else
772 chosen_arch = choose_arch_by_number (info->mach);
773 if (chosen_arch != NULL)
774 {
775 mips_processor = chosen_arch->processor;
776 mips_isa = chosen_arch->isa;
777 mips_ase = chosen_arch->ase;
778 mips_cp0_names = chosen_arch->cp0_names;
779 mips_cp0sel_names = chosen_arch->cp0sel_names;
780 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
781 mips_cp1_names = chosen_arch->cp1_names;
782 mips_hwr_names = chosen_arch->hwr_names;
783 }
784 #endif
785 }
786
787 static void
788 parse_mips_dis_option (const char *option, unsigned int len)
789 {
790 unsigned int i, optionlen, vallen;
791 const char *val;
792 const struct mips_abi_choice *chosen_abi;
793 const struct mips_arch_choice *chosen_arch;
794
795 /* Try to match options that are simple flags */
796 if (CONST_STRNEQ (option, "no-aliases"))
797 {
798 no_aliases = 1;
799 return;
800 }
801
802 if (CONST_STRNEQ (option, "msa"))
803 {
804 mips_ase |= ASE_MSA;
805 if ((mips_isa & INSN_ISA_MASK) == ISA_MIPS64R2)
806 mips_ase |= ASE_MSA64;
807 return;
808 }
809
810 if (CONST_STRNEQ (option, "virt"))
811 {
812 mips_ase |= ASE_VIRT;
813 if (mips_isa & ISA_MIPS64R2)
814 mips_ase |= ASE_VIRT64;
815 return;
816 }
817
818 /* Look for the = that delimits the end of the option name. */
819 for (i = 0; i < len; i++)
820 if (option[i] == '=')
821 break;
822
823 if (i == 0) /* Invalid option: no name before '='. */
824 return;
825 if (i == len) /* Invalid option: no '='. */
826 return;
827 if (i == (len - 1)) /* Invalid option: no value after '='. */
828 return;
829
830 optionlen = i;
831 val = option + (optionlen + 1);
832 vallen = len - (optionlen + 1);
833
834 if (strncmp ("gpr-names", option, optionlen) == 0
835 && strlen ("gpr-names") == optionlen)
836 {
837 chosen_abi = choose_abi_by_name (val, vallen);
838 if (chosen_abi != NULL)
839 mips_gpr_names = chosen_abi->gpr_names;
840 return;
841 }
842
843 if (strncmp ("fpr-names", option, optionlen) == 0
844 && strlen ("fpr-names") == optionlen)
845 {
846 chosen_abi = choose_abi_by_name (val, vallen);
847 if (chosen_abi != NULL)
848 mips_fpr_names = chosen_abi->fpr_names;
849 return;
850 }
851
852 if (strncmp ("cp0-names", option, optionlen) == 0
853 && strlen ("cp0-names") == optionlen)
854 {
855 chosen_arch = choose_arch_by_name (val, vallen);
856 if (chosen_arch != NULL)
857 {
858 mips_cp0_names = chosen_arch->cp0_names;
859 mips_cp0sel_names = chosen_arch->cp0sel_names;
860 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
861 }
862 return;
863 }
864
865 if (strncmp ("cp1-names", option, optionlen) == 0
866 && strlen ("cp1-names") == optionlen)
867 {
868 chosen_arch = choose_arch_by_name (val, vallen);
869 if (chosen_arch != NULL)
870 mips_cp1_names = chosen_arch->cp1_names;
871 return;
872 }
873
874 if (strncmp ("hwr-names", option, optionlen) == 0
875 && strlen ("hwr-names") == optionlen)
876 {
877 chosen_arch = choose_arch_by_name (val, vallen);
878 if (chosen_arch != NULL)
879 mips_hwr_names = chosen_arch->hwr_names;
880 return;
881 }
882
883 if (strncmp ("reg-names", option, optionlen) == 0
884 && strlen ("reg-names") == optionlen)
885 {
886 /* We check both ABI and ARCH here unconditionally, so
887 that "numeric" will do the desirable thing: select
888 numeric register names for all registers. Other than
889 that, a given name probably won't match both. */
890 chosen_abi = choose_abi_by_name (val, vallen);
891 if (chosen_abi != NULL)
892 {
893 mips_gpr_names = chosen_abi->gpr_names;
894 mips_fpr_names = chosen_abi->fpr_names;
895 }
896 chosen_arch = choose_arch_by_name (val, vallen);
897 if (chosen_arch != NULL)
898 {
899 mips_cp0_names = chosen_arch->cp0_names;
900 mips_cp0sel_names = chosen_arch->cp0sel_names;
901 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
902 mips_cp1_names = chosen_arch->cp1_names;
903 mips_hwr_names = chosen_arch->hwr_names;
904 }
905 return;
906 }
907
908 /* Invalid option. */
909 }
910
911 static void
912 parse_mips_dis_options (const char *options)
913 {
914 const char *option_end;
915
916 if (options == NULL)
917 return;
918
919 while (*options != '\0')
920 {
921 /* Skip empty options. */
922 if (*options == ',')
923 {
924 options++;
925 continue;
926 }
927
928 /* We know that *options is neither NUL or a comma. */
929 option_end = options + 1;
930 while (*option_end != ',' && *option_end != '\0')
931 option_end++;
932
933 parse_mips_dis_option (options, option_end - options);
934
935 /* Go on to the next one. If option_end points to a comma, it
936 will be skipped above. */
937 options = option_end;
938 }
939 }
940
941 static const struct mips_cp0sel_name *
942 lookup_mips_cp0sel_name (const struct mips_cp0sel_name *names,
943 unsigned int len,
944 unsigned int cp0reg,
945 unsigned int sel)
946 {
947 unsigned int i;
948
949 for (i = 0; i < len; i++)
950 if (names[i].cp0reg == cp0reg && names[i].sel == sel)
951 return &names[i];
952 return NULL;
953 }
954
955 /* Print register REGNO, of type TYPE, for instruction OPCODE. */
956
957 static void
958 print_reg (struct disassemble_info *info, const struct mips_opcode *opcode,
959 enum mips_reg_operand_type type, int regno)
960 {
961 switch (type)
962 {
963 case OP_REG_GP:
964 info->fprintf_func (info->stream, "%s", mips_gpr_names[regno]);
965 break;
966
967 case OP_REG_FP:
968 info->fprintf_func (info->stream, "%s", mips_fpr_names[regno]);
969 break;
970
971 case OP_REG_CCC:
972 if (opcode->pinfo & (FP_D | FP_S))
973 info->fprintf_func (info->stream, "$fcc%d", regno);
974 else
975 info->fprintf_func (info->stream, "$cc%d", regno);
976 break;
977
978 case OP_REG_VEC:
979 if (opcode->membership & INSN_5400)
980 info->fprintf_func (info->stream, "$f%d", regno);
981 else
982 info->fprintf_func (info->stream, "$v%d", regno);
983 break;
984
985 case OP_REG_ACC:
986 info->fprintf_func (info->stream, "$ac%d", regno);
987 break;
988
989 case OP_REG_COPRO:
990 if (opcode->name[strlen (opcode->name) - 1] == '0')
991 info->fprintf_func (info->stream, "%s", mips_cp0_names[regno]);
992 else if (opcode->name[strlen (opcode->name) - 1] == '1')
993 info->fprintf_func (info->stream, "%s", mips_cp1_names[regno]);
994 else
995 info->fprintf_func (info->stream, "$%d", regno);
996 break;
997
998 case OP_REG_HW:
999 info->fprintf_func (info->stream, "%s", mips_hwr_names[regno]);
1000 break;
1001
1002 case OP_REG_VF:
1003 info->fprintf_func (info->stream, "$vf%d", regno);
1004 break;
1005
1006 case OP_REG_VI:
1007 info->fprintf_func (info->stream, "$vi%d", regno);
1008 break;
1009
1010 case OP_REG_R5900_I:
1011 info->fprintf_func (info->stream, "$I");
1012 break;
1013
1014 case OP_REG_R5900_Q:
1015 info->fprintf_func (info->stream, "$Q");
1016 break;
1017
1018 case OP_REG_R5900_R:
1019 info->fprintf_func (info->stream, "$R");
1020 break;
1021
1022 case OP_REG_R5900_ACC:
1023 info->fprintf_func (info->stream, "$ACC");
1024 break;
1025
1026 case OP_REG_MSA:
1027 info->fprintf_func (info->stream, "$w%d", regno);
1028 break;
1029
1030 case OP_REG_MSA_CTRL:
1031 info->fprintf_func (info->stream, "%s", msa_control_names[regno]);
1032 break;
1033
1034 }
1035 }
1036
1037 /* Used to track the state carried over from previous operands in
1039 an instruction. */
1040 struct mips_print_arg_state {
1041 /* The value of the last OP_INT seen. We only use this for OP_MSB,
1042 where the value is known to be unsigned and small. */
1043 unsigned int last_int;
1044
1045 /* The type and number of the last OP_REG seen. We only use this for
1046 OP_REPEAT_DEST_REG and OP_REPEAT_PREV_REG. */
1047 enum mips_reg_operand_type last_reg_type;
1048 unsigned int last_regno;
1049 };
1050
1051 /* Initialize STATE for the start of an instruction. */
1052
1053 static inline void
1054 init_print_arg_state (struct mips_print_arg_state *state)
1055 {
1056 memset (state, 0, sizeof (*state));
1057 }
1058
1059 /* Print OP_VU0_SUFFIX or OP_VU0_MATCH_SUFFIX operand OPERAND,
1060 whose value is given by UVAL. */
1061
1062 static void
1063 print_vu0_channel (struct disassemble_info *info,
1064 const struct mips_operand *operand, unsigned int uval)
1065 {
1066 if (operand->size == 4)
1067 info->fprintf_func (info->stream, "%s%s%s%s",
1068 uval & 8 ? "x" : "",
1069 uval & 4 ? "y" : "",
1070 uval & 2 ? "z" : "",
1071 uval & 1 ? "w" : "");
1072 else if (operand->size == 2)
1073 info->fprintf_func (info->stream, "%c", "xyzw"[uval]);
1074 else
1075 abort ();
1076 }
1077
1078 /* Print operand OPERAND of OPCODE, using STATE to track inter-operand state.
1079 UVAL is the encoding of the operand (shifted into bit 0) and BASE_PC is
1080 the base address for OP_PCREL operands. */
1081
1082 static void
1083 print_insn_arg (struct disassemble_info *info,
1084 struct mips_print_arg_state *state,
1085 const struct mips_opcode *opcode,
1086 const struct mips_operand *operand,
1087 bfd_vma base_pc,
1088 unsigned int uval)
1089 {
1090 const fprintf_ftype infprintf = info->fprintf_func;
1091 void *is = info->stream;
1092
1093 switch (operand->type)
1094 {
1095 case OP_INT:
1096 {
1097 const struct mips_int_operand *int_op;
1098
1099 int_op = (const struct mips_int_operand *) operand;
1100 uval = mips_decode_int_operand (int_op, uval);
1101 state->last_int = uval;
1102 if (int_op->print_hex)
1103 infprintf (is, "0x%x", uval);
1104 else
1105 infprintf (is, "%d", uval);
1106 }
1107 break;
1108
1109 case OP_MAPPED_INT:
1110 {
1111 const struct mips_mapped_int_operand *mint_op;
1112
1113 mint_op = (const struct mips_mapped_int_operand *) operand;
1114 uval = mint_op->int_map[uval];
1115 state->last_int = uval;
1116 if (mint_op->print_hex)
1117 infprintf (is, "0x%x", uval);
1118 else
1119 infprintf (is, "%d", uval);
1120 }
1121 break;
1122
1123 case OP_MSB:
1124 {
1125 const struct mips_msb_operand *msb_op;
1126
1127 msb_op = (const struct mips_msb_operand *) operand;
1128 uval += msb_op->bias;
1129 if (msb_op->add_lsb)
1130 uval -= state->last_int;
1131 infprintf (is, "0x%x", uval);
1132 }
1133 break;
1134
1135 case OP_REG:
1136 case OP_OPTIONAL_REG:
1137 {
1138 const struct mips_reg_operand *reg_op;
1139
1140 reg_op = (const struct mips_reg_operand *) operand;
1141 uval = mips_decode_reg_operand (reg_op, uval);
1142 print_reg (info, opcode, reg_op->reg_type, uval);
1143
1144 state->last_reg_type = reg_op->reg_type;
1145 state->last_regno = uval;
1146 }
1147 break;
1148
1149 case OP_REG_PAIR:
1150 {
1151 const struct mips_reg_pair_operand *pair_op;
1152
1153 pair_op = (const struct mips_reg_pair_operand *) operand;
1154 print_reg (info, opcode, pair_op->reg_type,
1155 pair_op->reg1_map[uval]);
1156 infprintf (is, ",");
1157 print_reg (info, opcode, pair_op->reg_type,
1158 pair_op->reg2_map[uval]);
1159 }
1160 break;
1161
1162 case OP_PCREL:
1163 {
1164 const struct mips_pcrel_operand *pcrel_op;
1165
1166 pcrel_op = (const struct mips_pcrel_operand *) operand;
1167 info->target = mips_decode_pcrel_operand (pcrel_op, base_pc, uval);
1168
1169 /* Preserve the ISA bit for the GDB disassembler,
1170 otherwise clear it. */
1171 if (info->flavour != bfd_target_unknown_flavour)
1172 info->target &= -2;
1173
1174 (*info->print_address_func) (info->target, info);
1175 }
1176 break;
1177
1178 case OP_PERF_REG:
1179 infprintf (is, "%d", uval);
1180 break;
1181
1182 case OP_ADDIUSP_INT:
1183 {
1184 int sval;
1185
1186 sval = mips_signed_operand (operand, uval) * 4;
1187 if (sval >= -8 && sval < 8)
1188 sval ^= 0x400;
1189 infprintf (is, "%d", sval);
1190 break;
1191 }
1192
1193 case OP_CLO_CLZ_DEST:
1194 {
1195 unsigned int reg1, reg2;
1196
1197 reg1 = uval & 31;
1198 reg2 = uval >> 5;
1199 /* If one is zero use the other. */
1200 if (reg1 == reg2 || reg2 == 0)
1201 infprintf (is, "%s", mips_gpr_names[reg1]);
1202 else if (reg1 == 0)
1203 infprintf (is, "%s", mips_gpr_names[reg2]);
1204 else
1205 /* Bogus, result depends on processor. */
1206 infprintf (is, "%s or %s", mips_gpr_names[reg1],
1207 mips_gpr_names[reg2]);
1208 }
1209 break;
1210
1211 case OP_LWM_SWM_LIST:
1212 if (operand->size == 2)
1213 {
1214 if (uval == 0)
1215 infprintf (is, "%s,%s",
1216 mips_gpr_names[16],
1217 mips_gpr_names[31]);
1218 else
1219 infprintf (is, "%s-%s,%s",
1220 mips_gpr_names[16],
1221 mips_gpr_names[16 + uval],
1222 mips_gpr_names[31]);
1223 }
1224 else
1225 {
1226 int s_reg_encode;
1227
1228 s_reg_encode = uval & 0xf;
1229 if (s_reg_encode != 0)
1230 {
1231 if (s_reg_encode == 1)
1232 infprintf (is, "%s", mips_gpr_names[16]);
1233 else if (s_reg_encode < 9)
1234 infprintf (is, "%s-%s",
1235 mips_gpr_names[16],
1236 mips_gpr_names[15 + s_reg_encode]);
1237 else if (s_reg_encode == 9)
1238 infprintf (is, "%s-%s,%s",
1239 mips_gpr_names[16],
1240 mips_gpr_names[23],
1241 mips_gpr_names[30]);
1242 else
1243 infprintf (is, "UNKNOWN");
1244 }
1245
1246 if (uval & 0x10) /* For ra. */
1247 {
1248 if (s_reg_encode == 0)
1249 infprintf (is, "%s", mips_gpr_names[31]);
1250 else
1251 infprintf (is, ",%s", mips_gpr_names[31]);
1252 }
1253 }
1254 break;
1255
1256 case OP_ENTRY_EXIT_LIST:
1257 {
1258 const char *sep;
1259 unsigned int amask, smask;
1260
1261 sep = "";
1262 amask = (uval >> 3) & 7;
1263 if (amask > 0 && amask < 5)
1264 {
1265 infprintf (is, "%s", mips_gpr_names[4]);
1266 if (amask > 1)
1267 infprintf (is, "-%s", mips_gpr_names[amask + 3]);
1268 sep = ",";
1269 }
1270
1271 smask = (uval >> 1) & 3;
1272 if (smask == 3)
1273 {
1274 infprintf (is, "%s??", sep);
1275 sep = ",";
1276 }
1277 else if (smask > 0)
1278 {
1279 infprintf (is, "%s%s", sep, mips_gpr_names[16]);
1280 if (smask > 1)
1281 infprintf (is, "-%s", mips_gpr_names[smask + 15]);
1282 sep = ",";
1283 }
1284
1285 if (uval & 1)
1286 {
1287 infprintf (is, "%s%s", sep, mips_gpr_names[31]);
1288 sep = ",";
1289 }
1290
1291 if (amask == 5 || amask == 6)
1292 {
1293 infprintf (is, "%s%s", sep, mips_fpr_names[0]);
1294 if (amask == 6)
1295 infprintf (is, "-%s", mips_fpr_names[1]);
1296 }
1297 }
1298 break;
1299
1300 case OP_SAVE_RESTORE_LIST:
1301 /* Should be handled by the caller due to extend behavior. */
1302 abort ();
1303
1304 case OP_MDMX_IMM_REG:
1305 {
1306 unsigned int vsel;
1307
1308 vsel = uval >> 5;
1309 uval &= 31;
1310 if ((vsel & 0x10) == 0)
1311 {
1312 int fmt;
1313
1314 vsel &= 0x0f;
1315 for (fmt = 0; fmt < 3; fmt++, vsel >>= 1)
1316 if ((vsel & 1) == 0)
1317 break;
1318 print_reg (info, opcode, OP_REG_VEC, uval);
1319 infprintf (is, "[%d]", vsel >> 1);
1320 }
1321 else if ((vsel & 0x08) == 0)
1322 print_reg (info, opcode, OP_REG_VEC, uval);
1323 else
1324 infprintf (is, "0x%x", uval);
1325 }
1326 break;
1327
1328 case OP_REPEAT_PREV_REG:
1329 print_reg (info, opcode, state->last_reg_type, state->last_regno);
1330 break;
1331
1332 case OP_REPEAT_DEST_REG:
1333 /* Should always match OP_REPEAT_PREV_REG first. */
1334 abort ();
1335
1336 case OP_PC:
1337 infprintf (is, "$pc");
1338 break;
1339
1340 case OP_VU0_SUFFIX:
1341 case OP_VU0_MATCH_SUFFIX:
1342 print_vu0_channel (info, operand, uval);
1343 break;
1344
1345 case OP_IMM_INDEX:
1346 infprintf (is, "[%d]", uval);
1347 break;
1348
1349 case OP_REG_INDEX:
1350 infprintf (is, "[");
1351 print_reg (info, opcode, OP_REG_GP, uval);
1352 infprintf (is, "]");
1353 break;
1354 }
1355 }
1356
1357 /* Print the arguments for INSN, which is described by OPCODE.
1358 Use DECODE_OPERAND to get the encoding of each operand. Use BASE_PC
1359 as the base of OP_PCREL operands. */
1360
1361 static void
1362 print_insn_args (struct disassemble_info *info,
1363 const struct mips_opcode *opcode,
1364 const struct mips_operand *(*decode_operand) (const char *),
1365 unsigned int insn, bfd_vma base_pc)
1366 {
1367 const fprintf_ftype infprintf = info->fprintf_func;
1368 void *is = info->stream;
1369 struct mips_print_arg_state state;
1370 const struct mips_operand *operand;
1371 const char *s;
1372
1373 init_print_arg_state (&state);
1374 for (s = opcode->args; *s; ++s)
1375 {
1376 switch (*s)
1377 {
1378 case ',':
1379 case '(':
1380 case ')':
1381 infprintf (is, "%c", *s);
1382 break;
1383
1384 case '#':
1385 ++s;
1386 infprintf (is, "%c%c", *s, *s);
1387 break;
1388
1389 default:
1390 operand = decode_operand (s);
1391 if (!operand)
1392 {
1393 /* xgettext:c-format */
1394 infprintf (is,
1395 _("# internal error, undefined operand in `%s %s'"),
1396 opcode->name, opcode->args);
1397 return;
1398 }
1399 if (operand->type == OP_REG
1400 && s[1] == ','
1401 && s[2] == 'H'
1402 && opcode->name[strlen (opcode->name) - 1] == '0')
1403 {
1404 /* Coprocessor register 0 with sel field (MT ASE). */
1405 const struct mips_cp0sel_name *n;
1406 unsigned int reg, sel;
1407
1408 reg = mips_extract_operand (operand, insn);
1409 s += 2;
1410 operand = decode_operand (s);
1411 sel = mips_extract_operand (operand, insn);
1412
1413 /* CP0 register including 'sel' code for mftc0, to be
1414 printed textually if known. If not known, print both
1415 CP0 register name and sel numerically since CP0 register
1416 with sel 0 may have a name unrelated to register being
1417 printed. */
1418 n = lookup_mips_cp0sel_name (mips_cp0sel_names,
1419 mips_cp0sel_names_len,
1420 reg, sel);
1421 if (n != NULL)
1422 infprintf (is, "%s", n->name);
1423 else
1424 infprintf (is, "$%d,%d", reg, sel);
1425 }
1426 else
1427 print_insn_arg (info, &state, opcode, operand, base_pc,
1428 mips_extract_operand (operand, insn));
1429 if (*s == 'm' || *s == '+')
1430 ++s;
1431 break;
1432 }
1433 }
1434 }
1435
1436 /* Print the mips instruction at address MEMADDR in debugged memory,
1438 on using INFO. Returns length of the instruction, in bytes, which is
1439 always INSNLEN. BIGENDIAN must be 1 if this is big-endian code, 0 if
1440 this is little-endian code. */
1441
1442 static int
1443 print_insn_mips (bfd_vma memaddr,
1444 int word,
1445 struct disassemble_info *info)
1446 {
1447 #define GET_OP(insn, field) \
1448 (((insn) >> OP_SH_##field) & OP_MASK_##field)
1449 static const struct mips_opcode *mips_hash[OP_MASK_OP + 1];
1450 const fprintf_ftype infprintf = info->fprintf_func;
1451 const struct mips_opcode *op;
1452 static bfd_boolean init = 0;
1453 void *is = info->stream;
1454
1455 /* Build a hash table to shorten the search time. */
1456 if (! init)
1457 {
1458 unsigned int i;
1459
1460 for (i = 0; i <= OP_MASK_OP; i++)
1461 {
1462 for (op = mips_opcodes; op < &mips_opcodes[NUMOPCODES]; op++)
1463 {
1464 if (op->pinfo == INSN_MACRO
1465 || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
1466 continue;
1467 if (i == GET_OP (op->match, OP))
1468 {
1469 mips_hash[i] = op;
1470 break;
1471 }
1472 }
1473 }
1474
1475 init = 1;
1476 }
1477
1478 info->bytes_per_chunk = INSNLEN;
1479 info->display_endian = info->endian;
1480 info->insn_info_valid = 1;
1481 info->branch_delay_insns = 0;
1482 info->data_size = 0;
1483 info->insn_type = dis_nonbranch;
1484 info->target = 0;
1485 info->target2 = 0;
1486
1487 op = mips_hash[GET_OP (word, OP)];
1488 if (op != NULL)
1489 {
1490 for (; op < &mips_opcodes[NUMOPCODES]; op++)
1491 {
1492 if (op->pinfo != INSN_MACRO
1493 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
1494 && (word & op->mask) == op->match)
1495 {
1496 /* We always allow to disassemble the jalx instruction. */
1497 if (!opcode_is_member (op, mips_isa, mips_ase, mips_processor)
1498 && strcmp (op->name, "jalx"))
1499 continue;
1500
1501 /* Figure out instruction type and branch delay information. */
1502 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
1503 {
1504 if ((op->pinfo & (INSN_WRITE_GPR_31 | INSN_WRITE_1)) != 0)
1505 info->insn_type = dis_jsr;
1506 else
1507 info->insn_type = dis_branch;
1508 info->branch_delay_insns = 1;
1509 }
1510 else if ((op->pinfo & (INSN_COND_BRANCH_DELAY
1511 | INSN_COND_BRANCH_LIKELY)) != 0)
1512 {
1513 if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
1514 info->insn_type = dis_condjsr;
1515 else
1516 info->insn_type = dis_condbranch;
1517 info->branch_delay_insns = 1;
1518 }
1519 else if ((op->pinfo & (INSN_STORE_MEMORY
1520 | INSN_LOAD_MEMORY)) != 0)
1521 info->insn_type = dis_dref;
1522
1523 infprintf (is, "%s", op->name);
1524 if (op->pinfo2 & INSN2_VU0_CHANNEL_SUFFIX)
1525 {
1526 unsigned int uval;
1527
1528 infprintf (is, ".");
1529 uval = mips_extract_operand (&mips_vu0_channel_mask, word);
1530 print_vu0_channel (info, &mips_vu0_channel_mask, uval);
1531 }
1532
1533 if (op->args[0])
1534 {
1535 infprintf (is, "\t");
1536 print_insn_args (info, op, decode_mips_operand, word,
1537 memaddr + 4);
1538 }
1539
1540 return INSNLEN;
1541 }
1542 }
1543 }
1544 #undef GET_OP
1545
1546 /* Handle undefined instructions. */
1547 info->insn_type = dis_noninsn;
1548 infprintf (is, "0x%x", word);
1549 return INSNLEN;
1550 }
1551
1552 /* Disassemble an operand for a mips16 instruction. */
1554
1555 static void
1556 print_mips16_insn_arg (struct disassemble_info *info,
1557 struct mips_print_arg_state *state,
1558 const struct mips_opcode *opcode,
1559 char type, bfd_vma memaddr,
1560 unsigned insn, bfd_boolean use_extend,
1561 unsigned extend, bfd_boolean is_offset)
1562 {
1563 const fprintf_ftype infprintf = info->fprintf_func;
1564 void *is = info->stream;
1565 const struct mips_operand *operand, *ext_operand;
1566 unsigned int uval;
1567 bfd_vma baseaddr;
1568
1569 if (!use_extend)
1570 extend = 0;
1571
1572 switch (type)
1573 {
1574 case ',':
1575 case '(':
1576 case ')':
1577 infprintf (is, "%c", type);
1578 break;
1579
1580 default:
1581 operand = decode_mips16_operand (type, FALSE);
1582 if (!operand)
1583 {
1584 /* xgettext:c-format */
1585 infprintf (is, _("# internal error, undefined operand in `%s %s'"),
1586 opcode->name, opcode->args);
1587 return;
1588 }
1589
1590 if (operand->type == OP_SAVE_RESTORE_LIST)
1591 {
1592 /* Handle this case here because of the complex interation
1593 with the EXTEND opcode. */
1594 unsigned int amask, nargs, nstatics, nsreg, smask, frame_size, i, j;
1595 const char *sep;
1596
1597 amask = extend & 0xf;
1598 if (amask == MIPS16_ALL_ARGS)
1599 {
1600 nargs = 4;
1601 nstatics = 0;
1602 }
1603 else if (amask == MIPS16_ALL_STATICS)
1604 {
1605 nargs = 0;
1606 nstatics = 4;
1607 }
1608 else
1609 {
1610 nargs = amask >> 2;
1611 nstatics = amask & 3;
1612 }
1613
1614 sep = "";
1615 if (nargs > 0)
1616 {
1617 infprintf (is, "%s", mips_gpr_names[4]);
1618 if (nargs > 1)
1619 infprintf (is, "-%s", mips_gpr_names[4 + nargs - 1]);
1620 sep = ",";
1621 }
1622
1623 frame_size = ((extend & 0xf0) | (insn & 0x0f)) * 8;
1624 if (frame_size == 0 && !use_extend)
1625 frame_size = 128;
1626 infprintf (is, "%s%d", sep, frame_size);
1627
1628 if (insn & 0x40) /* $ra */
1629 infprintf (is, ",%s", mips_gpr_names[31]);
1630
1631 nsreg = (extend >> 8) & 0x7;
1632 smask = 0;
1633 if (insn & 0x20) /* $s0 */
1634 smask |= 1 << 0;
1635 if (insn & 0x10) /* $s1 */
1636 smask |= 1 << 1;
1637 if (nsreg > 0) /* $s2-$s8 */
1638 smask |= ((1 << nsreg) - 1) << 2;
1639
1640 for (i = 0; i < 9; i++)
1641 if (smask & (1 << i))
1642 {
1643 infprintf (is, ",%s", mips_gpr_names[i == 8 ? 30 : (16 + i)]);
1644 /* Skip over string of set bits. */
1645 for (j = i; smask & (2 << j); j++)
1646 continue;
1647 if (j > i)
1648 infprintf (is, "-%s", mips_gpr_names[j == 8 ? 30 : (16 + j)]);
1649 i = j + 1;
1650 }
1651 /* Statics $ax - $a3. */
1652 if (nstatics == 1)
1653 infprintf (is, ",%s", mips_gpr_names[7]);
1654 else if (nstatics > 0)
1655 infprintf (is, ",%s-%s",
1656 mips_gpr_names[7 - nstatics + 1],
1657 mips_gpr_names[7]);
1658 break;
1659 }
1660
1661 if (is_offset && operand->type == OP_INT)
1662 {
1663 const struct mips_int_operand *int_op;
1664
1665 int_op = (const struct mips_int_operand *) operand;
1666 info->insn_type = dis_dref;
1667 info->data_size = 1 << int_op->shift;
1668 }
1669
1670 if (operand->size == 26)
1671 /* In this case INSN is the first two bytes of the instruction
1672 and EXTEND is the second two bytes. */
1673 uval = ((insn & 0x1f) << 21) | ((insn & 0x3e0) << 11) | extend;
1674 else
1675 {
1676 /* Calculate the full field value. */
1677 uval = mips_extract_operand (operand, insn);
1678 if (use_extend)
1679 {
1680 ext_operand = decode_mips16_operand (type, TRUE);
1681 if (ext_operand != operand)
1682 {
1683 operand = ext_operand;
1684 if (operand->size == 16)
1685 uval |= ((extend & 0x1f) << 11) | (extend & 0x7e0);
1686 else if (operand->size == 15)
1687 uval |= ((extend & 0xf) << 11) | (extend & 0x7f0);
1688 else
1689 uval = ((extend >> 6) & 0x1f) | (extend & 0x20);
1690 }
1691 }
1692 }
1693
1694 baseaddr = memaddr + 2;
1695 if (operand->type == OP_PCREL)
1696 {
1697 const struct mips_pcrel_operand *pcrel_op;
1698
1699 pcrel_op = (const struct mips_pcrel_operand *) operand;
1700 if (!pcrel_op->include_isa_bit && use_extend)
1701 baseaddr = memaddr - 2;
1702 else if (!pcrel_op->include_isa_bit)
1703 {
1704 bfd_byte buffer[2];
1705
1706 /* If this instruction is in the delay slot of a JR
1707 instruction, the base address is the address of the
1708 JR instruction. If it is in the delay slot of a JALR
1709 instruction, the base address is the address of the
1710 JALR instruction. This test is unreliable: we have
1711 no way of knowing whether the previous word is
1712 instruction or data. */
1713 if (info->read_memory_func (memaddr - 4, buffer, 2, info) == 0
1714 && (((info->endian == BFD_ENDIAN_BIG
1715 ? bfd_getb16 (buffer)
1716 : bfd_getl16 (buffer))
1717 & 0xf800) == 0x1800))
1718 baseaddr = memaddr - 4;
1719 else if (info->read_memory_func (memaddr - 2, buffer, 2,
1720 info) == 0
1721 && (((info->endian == BFD_ENDIAN_BIG
1722 ? bfd_getb16 (buffer)
1723 : bfd_getl16 (buffer))
1724 & 0xf81f) == 0xe800))
1725 baseaddr = memaddr - 2;
1726 else
1727 baseaddr = memaddr;
1728 }
1729 }
1730
1731 print_insn_arg (info, state, opcode, operand, baseaddr + 1, uval);
1732 break;
1733 }
1734 }
1735
1736
1737 /* Check if the given address is the last word of a MIPS16 PLT entry.
1738 This word is data and depending on the value it may interfere with
1739 disassembly of further PLT entries. We make use of the fact PLT
1740 symbols are marked BSF_SYNTHETIC. */
1741 static bfd_boolean
1742 is_mips16_plt_tail (struct disassemble_info *info, bfd_vma addr)
1743 {
1744 if (info->symbols
1745 && info->symbols[0]
1746 && (info->symbols[0]->flags & BSF_SYNTHETIC)
1747 && addr == bfd_asymbol_value (info->symbols[0]) + 12)
1748 return TRUE;
1749
1750 return FALSE;
1751 }
1752
1753 /* Disassemble mips16 instructions. */
1754
1755 static int
1756 print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
1757 {
1758 const fprintf_ftype infprintf = info->fprintf_func;
1759 int status;
1760 bfd_byte buffer[4];
1761 int length;
1762 int insn;
1763 bfd_boolean use_extend;
1764 int extend = 0;
1765 const struct mips_opcode *op, *opend;
1766 struct mips_print_arg_state state;
1767 void *is = info->stream;
1768
1769 info->bytes_per_chunk = 2;
1770 info->display_endian = info->endian;
1771 info->insn_info_valid = 1;
1772 info->branch_delay_insns = 0;
1773 info->data_size = 0;
1774 info->target = 0;
1775 info->target2 = 0;
1776
1777 #define GET_OP(insn, field) \
1778 (((insn) >> MIPS16OP_SH_##field) & MIPS16OP_MASK_##field)
1779 /* Decode PLT entry's GOT slot address word. */
1780 if (is_mips16_plt_tail (info, memaddr))
1781 {
1782 info->insn_type = dis_noninsn;
1783 status = (*info->read_memory_func) (memaddr, buffer, 4, info);
1784 if (status == 0)
1785 {
1786 unsigned int gotslot;
1787
1788 if (info->endian == BFD_ENDIAN_BIG)
1789 gotslot = bfd_getb32 (buffer);
1790 else
1791 gotslot = bfd_getl32 (buffer);
1792 infprintf (is, ".word\t0x%x", gotslot);
1793
1794 return 4;
1795 }
1796 }
1797 else
1798 {
1799 info->insn_type = dis_nonbranch;
1800 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
1801 }
1802 if (status != 0)
1803 {
1804 (*info->memory_error_func) (status, memaddr, info);
1805 return -1;
1806 }
1807
1808 length = 2;
1809
1810 if (info->endian == BFD_ENDIAN_BIG)
1811 insn = bfd_getb16 (buffer);
1812 else
1813 insn = bfd_getl16 (buffer);
1814
1815 /* Handle the extend opcode specially. */
1816 use_extend = FALSE;
1817 if ((insn & 0xf800) == 0xf000)
1818 {
1819 use_extend = TRUE;
1820 extend = insn & 0x7ff;
1821
1822 memaddr += 2;
1823
1824 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
1825 if (status != 0)
1826 {
1827 infprintf (is, "extend 0x%x", (unsigned int) extend);
1828 (*info->memory_error_func) (status, memaddr, info);
1829 return -1;
1830 }
1831
1832 if (info->endian == BFD_ENDIAN_BIG)
1833 insn = bfd_getb16 (buffer);
1834 else
1835 insn = bfd_getl16 (buffer);
1836
1837 /* Check for an extend opcode followed by an extend opcode. */
1838 if ((insn & 0xf800) == 0xf000)
1839 {
1840 infprintf (is, "extend 0x%x", (unsigned int) extend);
1841 info->insn_type = dis_noninsn;
1842 return length;
1843 }
1844
1845 length += 2;
1846 }
1847
1848 /* FIXME: Should probably use a hash table on the major opcode here. */
1849
1850 opend = mips16_opcodes + bfd_mips16_num_opcodes;
1851 for (op = mips16_opcodes; op < opend; op++)
1852 {
1853 if (op->pinfo != INSN_MACRO
1854 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
1855 && (insn & op->mask) == op->match)
1856 {
1857 const char *s;
1858
1859 if (op->args[0] == 'a' || op->args[0] == 'i')
1860 {
1861 if (use_extend)
1862 {
1863 infprintf (is, "extend 0x%x", (unsigned int) extend);
1864 info->insn_type = dis_noninsn;
1865 return length - 2;
1866 }
1867
1868 use_extend = FALSE;
1869
1870 memaddr += 2;
1871
1872 status = (*info->read_memory_func) (memaddr, buffer, 2,
1873 info);
1874 if (status == 0)
1875 {
1876 use_extend = TRUE;
1877 if (info->endian == BFD_ENDIAN_BIG)
1878 extend = bfd_getb16 (buffer);
1879 else
1880 extend = bfd_getl16 (buffer);
1881 length += 2;
1882 }
1883 }
1884
1885 infprintf (is, "%s", op->name);
1886 if (op->args[0] != '\0')
1887 infprintf (is, "\t");
1888
1889 init_print_arg_state (&state);
1890 for (s = op->args; *s != '\0'; s++)
1891 {
1892 if (*s == ','
1893 && s[1] == 'w'
1894 && GET_OP (insn, RX) == GET_OP (insn, RY))
1895 {
1896 /* Skip the register and the comma. */
1897 ++s;
1898 continue;
1899 }
1900 if (*s == ','
1901 && s[1] == 'v'
1902 && GET_OP (insn, RZ) == GET_OP (insn, RX))
1903 {
1904 /* Skip the register and the comma. */
1905 ++s;
1906 continue;
1907 }
1908 print_mips16_insn_arg (info, &state, op, *s, memaddr, insn,
1909 use_extend, extend, s[1] == '(');
1910 }
1911
1912 /* Figure out branch instruction type and delay slot information. */
1913 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
1914 info->branch_delay_insns = 1;
1915 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
1916 || (op->pinfo2 & INSN2_UNCOND_BRANCH) != 0)
1917 {
1918 if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
1919 info->insn_type = dis_jsr;
1920 else
1921 info->insn_type = dis_branch;
1922 }
1923 else if ((op->pinfo2 & INSN2_COND_BRANCH) != 0)
1924 info->insn_type = dis_condbranch;
1925
1926 return length;
1927 }
1928 }
1929 #undef GET_OP
1930
1931 if (use_extend)
1932 infprintf (is, "0x%x", extend | 0xf000);
1933 infprintf (is, "0x%x", insn);
1934 info->insn_type = dis_noninsn;
1935
1936 return length;
1937 }
1938
1939 /* Disassemble microMIPS instructions. */
1940
1941 static int
1942 print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
1943 {
1944 const fprintf_ftype infprintf = info->fprintf_func;
1945 const struct mips_opcode *op, *opend;
1946 void *is = info->stream;
1947 bfd_byte buffer[2];
1948 unsigned int higher;
1949 unsigned int length;
1950 int status;
1951 unsigned int insn;
1952
1953 info->bytes_per_chunk = 2;
1954 info->display_endian = info->endian;
1955 info->insn_info_valid = 1;
1956 info->branch_delay_insns = 0;
1957 info->data_size = 0;
1958 info->insn_type = dis_nonbranch;
1959 info->target = 0;
1960 info->target2 = 0;
1961
1962 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
1963 if (status != 0)
1964 {
1965 (*info->memory_error_func) (status, memaddr, info);
1966 return -1;
1967 }
1968
1969 length = 2;
1970
1971 if (info->endian == BFD_ENDIAN_BIG)
1972 insn = bfd_getb16 (buffer);
1973 else
1974 insn = bfd_getl16 (buffer);
1975
1976 if ((insn & 0xfc00) == 0x7c00)
1977 {
1978 /* This is a 48-bit microMIPS instruction. */
1979 higher = insn;
1980
1981 status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
1982 if (status != 0)
1983 {
1984 infprintf (is, "micromips 0x%x", higher);
1985 (*info->memory_error_func) (status, memaddr + 2, info);
1986 return -1;
1987 }
1988 if (info->endian == BFD_ENDIAN_BIG)
1989 insn = bfd_getb16 (buffer);
1990 else
1991 insn = bfd_getl16 (buffer);
1992 higher = (higher << 16) | insn;
1993
1994 status = (*info->read_memory_func) (memaddr + 4, buffer, 2, info);
1995 if (status != 0)
1996 {
1997 infprintf (is, "micromips 0x%x", higher);
1998 (*info->memory_error_func) (status, memaddr + 4, info);
1999 return -1;
2000 }
2001 if (info->endian == BFD_ENDIAN_BIG)
2002 insn = bfd_getb16 (buffer);
2003 else
2004 insn = bfd_getl16 (buffer);
2005 infprintf (is, "0x%x%04x (48-bit insn)", higher, insn);
2006
2007 info->insn_type = dis_noninsn;
2008 return 6;
2009 }
2010 else if ((insn & 0x1c00) == 0x0000 || (insn & 0x1000) == 0x1000)
2011 {
2012 /* This is a 32-bit microMIPS instruction. */
2013 higher = insn;
2014
2015 status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2016 if (status != 0)
2017 {
2018 infprintf (is, "micromips 0x%x", higher);
2019 (*info->memory_error_func) (status, memaddr + 2, info);
2020 return -1;
2021 }
2022
2023 if (info->endian == BFD_ENDIAN_BIG)
2024 insn = bfd_getb16 (buffer);
2025 else
2026 insn = bfd_getl16 (buffer);
2027
2028 insn = insn | (higher << 16);
2029
2030 length += 2;
2031 }
2032
2033 /* FIXME: Should probably use a hash table on the major opcode here. */
2034
2035 opend = micromips_opcodes + bfd_micromips_num_opcodes;
2036 for (op = micromips_opcodes; op < opend; op++)
2037 {
2038 if (op->pinfo != INSN_MACRO
2039 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
2040 && (insn & op->mask) == op->match
2041 && ((length == 2 && (op->mask & 0xffff0000) == 0)
2042 || (length == 4 && (op->mask & 0xffff0000) != 0)))
2043 {
2044 infprintf (is, "%s", op->name);
2045
2046 if (op->args[0])
2047 {
2048 infprintf (is, "\t");
2049 print_insn_args (info, op, decode_micromips_operand, insn,
2050 memaddr + length + 1);
2051 }
2052
2053 /* Figure out instruction type and branch delay information. */
2054 if ((op->pinfo
2055 & (INSN_UNCOND_BRANCH_DELAY | INSN_COND_BRANCH_DELAY)) != 0)
2056 info->branch_delay_insns = 1;
2057 if (((op->pinfo & INSN_UNCOND_BRANCH_DELAY)
2058 | (op->pinfo2 & INSN2_UNCOND_BRANCH)) != 0)
2059 {
2060 if ((op->pinfo & (INSN_WRITE_GPR_31 | INSN_WRITE_1)) != 0)
2061 info->insn_type = dis_jsr;
2062 else
2063 info->insn_type = dis_branch;
2064 }
2065 else if (((op->pinfo & INSN_COND_BRANCH_DELAY)
2066 | (op->pinfo2 & INSN2_COND_BRANCH)) != 0)
2067 {
2068 if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2069 info->insn_type = dis_condjsr;
2070 else
2071 info->insn_type = dis_condbranch;
2072 }
2073 else if ((op->pinfo
2074 & (INSN_STORE_MEMORY | INSN_LOAD_MEMORY)) != 0)
2075 info->insn_type = dis_dref;
2076
2077 return length;
2078 }
2079 }
2080
2081 infprintf (is, "0x%x", insn);
2082 info->insn_type = dis_noninsn;
2083
2084 return length;
2085 }
2086
2087 /* Return 1 if a symbol associated with the location being disassembled
2088 indicates a compressed (MIPS16 or microMIPS) mode. We iterate over
2089 all the symbols at the address being considered assuming if at least
2090 one of them indicates code compression, then such code has been
2091 genuinely produced here (other symbols could have been derived from
2092 function symbols defined elsewhere or could define data). Otherwise,
2093 return 0. */
2094
2095 static bfd_boolean
2096 is_compressed_mode_p (struct disassemble_info *info)
2097 {
2098 int i;
2099 int l;
2100
2101 for (i = info->symtab_pos, l = i + info->num_symbols; i < l; i++)
2102 if (((info->symtab[i])->flags & BSF_SYNTHETIC) != 0
2103 && ((!micromips_ase
2104 && ELF_ST_IS_MIPS16 ((*info->symbols)->udata.i))
2105 || (micromips_ase
2106 && ELF_ST_IS_MICROMIPS ((*info->symbols)->udata.i))))
2107 return 1;
2108 else if (bfd_asymbol_flavour (info->symtab[i]) == bfd_target_elf_flavour
2109 && info->symtab[i]->section == info->section)
2110 {
2111 elf_symbol_type *symbol = (elf_symbol_type *) info->symtab[i];
2112 if ((!micromips_ase
2113 && ELF_ST_IS_MIPS16 (symbol->internal_elf_sym.st_other))
2114 || (micromips_ase
2115 && ELF_ST_IS_MICROMIPS (symbol->internal_elf_sym.st_other)))
2116 return 1;
2117 }
2118
2119 return 0;
2120 }
2121
2122 /* In an environment where we do not know the symbol type of the
2123 instruction we are forced to assume that the low order bit of the
2124 instructions' address may mark it as a mips16 instruction. If we
2125 are single stepping, or the pc is within the disassembled function,
2126 this works. Otherwise, we need a clue. Sometimes. */
2127
2128 static int
2129 _print_insn_mips (bfd_vma memaddr,
2130 struct disassemble_info *info,
2131 enum bfd_endian endianness)
2132 {
2133 int (*print_insn_compr) (bfd_vma, struct disassemble_info *);
2134 bfd_byte buffer[INSNLEN];
2135 int status;
2136
2137 set_default_mips_dis_options (info);
2138 parse_mips_dis_options (info->disassembler_options);
2139
2140 if (info->mach == bfd_mach_mips16)
2141 return print_insn_mips16 (memaddr, info);
2142 if (info->mach == bfd_mach_mips_micromips)
2143 return print_insn_micromips (memaddr, info);
2144
2145 print_insn_compr = !micromips_ase ? print_insn_mips16 : print_insn_micromips;
2146
2147 #if 1
2148 /* FIXME: If odd address, this is CLEARLY a compressed instruction. */
2149 /* Only a few tools will work this way. */
2150 if (memaddr & 0x01)
2151 return print_insn_compr (memaddr, info);
2152 #endif
2153
2154 #if SYMTAB_AVAILABLE
2155 if (is_compressed_mode_p (info))
2156 return print_insn_compr (memaddr, info);
2157 #endif
2158
2159 status = (*info->read_memory_func) (memaddr, buffer, INSNLEN, info);
2160 if (status == 0)
2161 {
2162 int insn;
2163
2164 if (endianness == BFD_ENDIAN_BIG)
2165 insn = bfd_getb32 (buffer);
2166 else
2167 insn = bfd_getl32 (buffer);
2168
2169 return print_insn_mips (memaddr, insn, info);
2170 }
2171 else
2172 {
2173 (*info->memory_error_func) (status, memaddr, info);
2174 return -1;
2175 }
2176 }
2177
2178 int
2179 print_insn_big_mips (bfd_vma memaddr, struct disassemble_info *info)
2180 {
2181 return _print_insn_mips (memaddr, info, BFD_ENDIAN_BIG);
2182 }
2183
2184 int
2185 print_insn_little_mips (bfd_vma memaddr, struct disassemble_info *info)
2186 {
2187 return _print_insn_mips (memaddr, info, BFD_ENDIAN_LITTLE);
2188 }
2189
2190 void
2192 print_mips_disassembler_options (FILE *stream)
2193 {
2194 unsigned int i;
2195
2196 fprintf (stream, _("\n\
2197 The following MIPS specific disassembler options are supported for use\n\
2198 with the -M switch (multiple options should be separated by commas):\n"));
2199
2200 fprintf (stream, _("\n\
2201 msa Recognize MSA instructions.\n"));
2202
2203 fprintf (stream, _("\n\
2204 virt Recognize the virtualization ASE instructions.\n"));
2205
2206 fprintf (stream, _("\n\
2207 gpr-names=ABI Print GPR names according to specified ABI.\n\
2208 Default: based on binary being disassembled.\n"));
2209
2210 fprintf (stream, _("\n\
2211 fpr-names=ABI Print FPR names according to specified ABI.\n\
2212 Default: numeric.\n"));
2213
2214 fprintf (stream, _("\n\
2215 cp0-names=ARCH Print CP0 register names according to\n\
2216 specified architecture.\n\
2217 Default: based on binary being disassembled.\n"));
2218
2219 fprintf (stream, _("\n\
2220 hwr-names=ARCH Print HWR names according to specified \n\
2221 architecture.\n\
2222 Default: based on binary being disassembled.\n"));
2223
2224 fprintf (stream, _("\n\
2225 reg-names=ABI Print GPR and FPR names according to\n\
2226 specified ABI.\n"));
2227
2228 fprintf (stream, _("\n\
2229 reg-names=ARCH Print CP0 register and HWR names according to\n\
2230 specified architecture.\n"));
2231
2232 fprintf (stream, _("\n\
2233 For the options above, the following values are supported for \"ABI\":\n\
2234 "));
2235 for (i = 0; i < ARRAY_SIZE (mips_abi_choices); i++)
2236 fprintf (stream, " %s", mips_abi_choices[i].name);
2237 fprintf (stream, _("\n"));
2238
2239 fprintf (stream, _("\n\
2240 For the options above, The following values are supported for \"ARCH\":\n\
2241 "));
2242 for (i = 0; i < ARRAY_SIZE (mips_arch_choices); i++)
2243 if (*mips_arch_choices[i].name != '\0')
2244 fprintf (stream, " %s", mips_arch_choices[i].name);
2245 fprintf (stream, _("\n"));
2246
2247 fprintf (stream, _("\n"));
2248 }
2249