]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - opcodes/mips-dis.c
* mips-dis.c (print_insn_args): Add GET_OP and GET_OP_S local
[thirdparty/binutils-gdb.git] / opcodes / mips-dis.c
1 /* Print mips instructions for GDB, the GNU debugger, or for objdump.
2 Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2012
4 Free Software Foundation, Inc.
5 Contributed by Nobuyuki Hikichi(hikichi@sra.co.jp).
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 \f
45 /* FIXME: These should be shared with gdb somehow. */
46
47 struct mips_cp0sel_name
48 {
49 unsigned int cp0reg;
50 unsigned int sel;
51 const char * const name;
52 };
53
54 /* The mips16 registers. */
55 static const unsigned int mips16_to_32_reg_map[] =
56 {
57 16, 17, 2, 3, 4, 5, 6, 7
58 };
59
60 /* The microMIPS registers with type b. */
61 #define micromips_to_32_reg_b_map mips16_to_32_reg_map
62
63 /* The microMIPS registers with type c. */
64 #define micromips_to_32_reg_c_map mips16_to_32_reg_map
65
66 /* The microMIPS registers with type d. */
67 #define micromips_to_32_reg_d_map mips16_to_32_reg_map
68
69 /* The microMIPS registers with type e. */
70 #define micromips_to_32_reg_e_map mips16_to_32_reg_map
71
72 /* The microMIPS registers with type f. */
73 #define micromips_to_32_reg_f_map mips16_to_32_reg_map
74
75 /* The microMIPS registers with type g. */
76 #define micromips_to_32_reg_g_map mips16_to_32_reg_map
77
78 /* The microMIPS registers with type h. */
79 static const unsigned int micromips_to_32_reg_h_map[] =
80 {
81 5, 5, 6, 4, 4, 4, 4, 4
82 };
83
84 /* The microMIPS registers with type i. */
85 static const unsigned int micromips_to_32_reg_i_map[] =
86 {
87 6, 7, 7, 21, 22, 5, 6, 7
88 };
89
90 /* The microMIPS registers with type j: 32 registers. */
91
92 /* The microMIPS registers with type l. */
93 #define micromips_to_32_reg_l_map mips16_to_32_reg_map
94
95 /* The microMIPS registers with type m. */
96 static const unsigned int micromips_to_32_reg_m_map[] =
97 {
98 0, 17, 2, 3, 16, 18, 19, 20
99 };
100
101 /* The microMIPS registers with type n. */
102 #define micromips_to_32_reg_n_map micromips_to_32_reg_m_map
103
104 /* The microMIPS registers with type p: 32 registers. */
105
106 /* The microMIPS registers with type q. */
107 static const unsigned int micromips_to_32_reg_q_map[] =
108 {
109 0, 17, 2, 3, 4, 5, 6, 7
110 };
111
112 /* reg type s is $29. */
113
114 /* reg type t is the same as the last register. */
115
116 /* reg type y is $31. */
117
118 /* reg type z is $0. */
119
120 /* micromips imm B type. */
121 static const int micromips_imm_b_map[8] =
122 {
123 1, 4, 8, 12, 16, 20, 24, -1
124 };
125
126 /* micromips imm C type. */
127 static const int micromips_imm_c_map[16] =
128 {
129 128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 255, 32768, 65535
130 };
131
132 /* micromips imm D type: (-512..511)<<1. */
133 /* micromips imm E type: (-64..63)<<1. */
134 /* micromips imm F type: (0..63). */
135 /* micromips imm G type: (-1..14). */
136 /* micromips imm H type: (0..15)<<1. */
137 /* micromips imm I type: (-1..126). */
138 /* micromips imm J type: (0..15)<<2. */
139 /* micromips imm L type: (0..15). */
140 /* micromips imm M type: (1..8). */
141 /* micromips imm W type: (0..63)<<2. */
142 /* micromips imm X type: (-8..7). */
143 /* micromips imm Y type: (-258..-3, 2..257)<<2. */
144
145 #define mips16_reg_names(rn) mips_gpr_names[mips16_to_32_reg_map[rn]]
146
147
148 static const char * const mips_gpr_names_numeric[32] =
149 {
150 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
151 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
152 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
153 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
154 };
155
156 static const char * const mips_gpr_names_oldabi[32] =
157 {
158 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
159 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
160 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
161 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
162 };
163
164 static const char * const mips_gpr_names_newabi[32] =
165 {
166 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
167 "a4", "a5", "a6", "a7", "t0", "t1", "t2", "t3",
168 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
169 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
170 };
171
172 static const char * const mips_fpr_names_numeric[32] =
173 {
174 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
175 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
176 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
177 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31"
178 };
179
180 static const char * const mips_fpr_names_32[32] =
181 {
182 "fv0", "fv0f", "fv1", "fv1f", "ft0", "ft0f", "ft1", "ft1f",
183 "ft2", "ft2f", "ft3", "ft3f", "fa0", "fa0f", "fa1", "fa1f",
184 "ft4", "ft4f", "ft5", "ft5f", "fs0", "fs0f", "fs1", "fs1f",
185 "fs2", "fs2f", "fs3", "fs3f", "fs4", "fs4f", "fs5", "fs5f"
186 };
187
188 static const char * const mips_fpr_names_n32[32] =
189 {
190 "fv0", "ft14", "fv1", "ft15", "ft0", "ft1", "ft2", "ft3",
191 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
192 "fa4", "fa5", "fa6", "fa7", "fs0", "ft8", "fs1", "ft9",
193 "fs2", "ft10", "fs3", "ft11", "fs4", "ft12", "fs5", "ft13"
194 };
195
196 static const char * const mips_fpr_names_64[32] =
197 {
198 "fv0", "ft12", "fv1", "ft13", "ft0", "ft1", "ft2", "ft3",
199 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
200 "fa4", "fa5", "fa6", "fa7", "ft8", "ft9", "ft10", "ft11",
201 "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7"
202 };
203
204 static const char * const mips_cp0_names_numeric[32] =
205 {
206 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
207 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
208 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
209 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
210 };
211
212 static const char * const mips_cp0_names_r3000[32] =
213 {
214 "c0_index", "c0_random", "c0_entrylo", "$3",
215 "c0_context", "$5", "$6", "$7",
216 "c0_badvaddr", "$9", "c0_entryhi", "$11",
217 "c0_sr", "c0_cause", "c0_epc", "c0_prid",
218 "$16", "$17", "$18", "$19",
219 "$20", "$21", "$22", "$23",
220 "$24", "$25", "$26", "$27",
221 "$28", "$29", "$30", "$31",
222 };
223
224 static const char * const mips_cp0_names_r4000[32] =
225 {
226 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
227 "c0_context", "c0_pagemask", "c0_wired", "$7",
228 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
229 "c0_sr", "c0_cause", "c0_epc", "c0_prid",
230 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
231 "c0_xcontext", "$21", "$22", "$23",
232 "$24", "$25", "c0_ecc", "c0_cacheerr",
233 "c0_taglo", "c0_taghi", "c0_errorepc", "$31",
234 };
235
236 static const char * const mips_cp0_names_mips3264[32] =
237 {
238 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
239 "c0_context", "c0_pagemask", "c0_wired", "$7",
240 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
241 "c0_status", "c0_cause", "c0_epc", "c0_prid",
242 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
243 "c0_xcontext", "$21", "$22", "c0_debug",
244 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr",
245 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
246 };
247
248 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264[] =
249 {
250 { 16, 1, "c0_config1" },
251 { 16, 2, "c0_config2" },
252 { 16, 3, "c0_config3" },
253 { 18, 1, "c0_watchlo,1" },
254 { 18, 2, "c0_watchlo,2" },
255 { 18, 3, "c0_watchlo,3" },
256 { 18, 4, "c0_watchlo,4" },
257 { 18, 5, "c0_watchlo,5" },
258 { 18, 6, "c0_watchlo,6" },
259 { 18, 7, "c0_watchlo,7" },
260 { 19, 1, "c0_watchhi,1" },
261 { 19, 2, "c0_watchhi,2" },
262 { 19, 3, "c0_watchhi,3" },
263 { 19, 4, "c0_watchhi,4" },
264 { 19, 5, "c0_watchhi,5" },
265 { 19, 6, "c0_watchhi,6" },
266 { 19, 7, "c0_watchhi,7" },
267 { 25, 1, "c0_perfcnt,1" },
268 { 25, 2, "c0_perfcnt,2" },
269 { 25, 3, "c0_perfcnt,3" },
270 { 25, 4, "c0_perfcnt,4" },
271 { 25, 5, "c0_perfcnt,5" },
272 { 25, 6, "c0_perfcnt,6" },
273 { 25, 7, "c0_perfcnt,7" },
274 { 27, 1, "c0_cacheerr,1" },
275 { 27, 2, "c0_cacheerr,2" },
276 { 27, 3, "c0_cacheerr,3" },
277 { 28, 1, "c0_datalo" },
278 { 29, 1, "c0_datahi" }
279 };
280
281 static const char * const mips_cp0_names_mips3264r2[32] =
282 {
283 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
284 "c0_context", "c0_pagemask", "c0_wired", "c0_hwrena",
285 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
286 "c0_status", "c0_cause", "c0_epc", "c0_prid",
287 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
288 "c0_xcontext", "$21", "$22", "c0_debug",
289 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr",
290 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
291 };
292
293 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264r2[] =
294 {
295 { 4, 1, "c0_contextconfig" },
296 { 0, 1, "c0_mvpcontrol" },
297 { 0, 2, "c0_mvpconf0" },
298 { 0, 3, "c0_mvpconf1" },
299 { 1, 1, "c0_vpecontrol" },
300 { 1, 2, "c0_vpeconf0" },
301 { 1, 3, "c0_vpeconf1" },
302 { 1, 4, "c0_yqmask" },
303 { 1, 5, "c0_vpeschedule" },
304 { 1, 6, "c0_vpeschefback" },
305 { 2, 1, "c0_tcstatus" },
306 { 2, 2, "c0_tcbind" },
307 { 2, 3, "c0_tcrestart" },
308 { 2, 4, "c0_tchalt" },
309 { 2, 5, "c0_tccontext" },
310 { 2, 6, "c0_tcschedule" },
311 { 2, 7, "c0_tcschefback" },
312 { 5, 1, "c0_pagegrain" },
313 { 6, 1, "c0_srsconf0" },
314 { 6, 2, "c0_srsconf1" },
315 { 6, 3, "c0_srsconf2" },
316 { 6, 4, "c0_srsconf3" },
317 { 6, 5, "c0_srsconf4" },
318 { 12, 1, "c0_intctl" },
319 { 12, 2, "c0_srsctl" },
320 { 12, 3, "c0_srsmap" },
321 { 15, 1, "c0_ebase" },
322 { 16, 1, "c0_config1" },
323 { 16, 2, "c0_config2" },
324 { 16, 3, "c0_config3" },
325 { 18, 1, "c0_watchlo,1" },
326 { 18, 2, "c0_watchlo,2" },
327 { 18, 3, "c0_watchlo,3" },
328 { 18, 4, "c0_watchlo,4" },
329 { 18, 5, "c0_watchlo,5" },
330 { 18, 6, "c0_watchlo,6" },
331 { 18, 7, "c0_watchlo,7" },
332 { 19, 1, "c0_watchhi,1" },
333 { 19, 2, "c0_watchhi,2" },
334 { 19, 3, "c0_watchhi,3" },
335 { 19, 4, "c0_watchhi,4" },
336 { 19, 5, "c0_watchhi,5" },
337 { 19, 6, "c0_watchhi,6" },
338 { 19, 7, "c0_watchhi,7" },
339 { 23, 1, "c0_tracecontrol" },
340 { 23, 2, "c0_tracecontrol2" },
341 { 23, 3, "c0_usertracedata" },
342 { 23, 4, "c0_tracebpc" },
343 { 25, 1, "c0_perfcnt,1" },
344 { 25, 2, "c0_perfcnt,2" },
345 { 25, 3, "c0_perfcnt,3" },
346 { 25, 4, "c0_perfcnt,4" },
347 { 25, 5, "c0_perfcnt,5" },
348 { 25, 6, "c0_perfcnt,6" },
349 { 25, 7, "c0_perfcnt,7" },
350 { 27, 1, "c0_cacheerr,1" },
351 { 27, 2, "c0_cacheerr,2" },
352 { 27, 3, "c0_cacheerr,3" },
353 { 28, 1, "c0_datalo" },
354 { 28, 2, "c0_taglo1" },
355 { 28, 3, "c0_datalo1" },
356 { 28, 4, "c0_taglo2" },
357 { 28, 5, "c0_datalo2" },
358 { 28, 6, "c0_taglo3" },
359 { 28, 7, "c0_datalo3" },
360 { 29, 1, "c0_datahi" },
361 { 29, 2, "c0_taghi1" },
362 { 29, 3, "c0_datahi1" },
363 { 29, 4, "c0_taghi2" },
364 { 29, 5, "c0_datahi2" },
365 { 29, 6, "c0_taghi3" },
366 { 29, 7, "c0_datahi3" },
367 };
368
369 /* SB-1: MIPS64 (mips_cp0_names_mips3264) with minor mods. */
370 static const char * const mips_cp0_names_sb1[32] =
371 {
372 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
373 "c0_context", "c0_pagemask", "c0_wired", "$7",
374 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
375 "c0_status", "c0_cause", "c0_epc", "c0_prid",
376 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
377 "c0_xcontext", "$21", "$22", "c0_debug",
378 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr_i",
379 "c0_taglo_i", "c0_taghi_i", "c0_errorepc", "c0_desave",
380 };
381
382 static const struct mips_cp0sel_name mips_cp0sel_names_sb1[] =
383 {
384 { 16, 1, "c0_config1" },
385 { 18, 1, "c0_watchlo,1" },
386 { 19, 1, "c0_watchhi,1" },
387 { 22, 0, "c0_perftrace" },
388 { 23, 3, "c0_edebug" },
389 { 25, 1, "c0_perfcnt,1" },
390 { 25, 2, "c0_perfcnt,2" },
391 { 25, 3, "c0_perfcnt,3" },
392 { 25, 4, "c0_perfcnt,4" },
393 { 25, 5, "c0_perfcnt,5" },
394 { 25, 6, "c0_perfcnt,6" },
395 { 25, 7, "c0_perfcnt,7" },
396 { 26, 1, "c0_buserr_pa" },
397 { 27, 1, "c0_cacheerr_d" },
398 { 27, 3, "c0_cacheerr_d_pa" },
399 { 28, 1, "c0_datalo_i" },
400 { 28, 2, "c0_taglo_d" },
401 { 28, 3, "c0_datalo_d" },
402 { 29, 1, "c0_datahi_i" },
403 { 29, 2, "c0_taghi_d" },
404 { 29, 3, "c0_datahi_d" },
405 };
406
407 /* Xlr cop0 register names. */
408 static const char * const mips_cp0_names_xlr[32] = {
409 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
410 "c0_context", "c0_pagemask", "c0_wired", "$7",
411 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
412 "c0_status", "c0_cause", "c0_epc", "c0_prid",
413 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
414 "c0_xcontext", "$21", "$22", "c0_debug",
415 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr_i",
416 "c0_taglo_i", "c0_taghi_i", "c0_errorepc", "c0_desave",
417 };
418
419 /* XLR's CP0 Select Registers. */
420
421 static const struct mips_cp0sel_name mips_cp0sel_names_xlr[] = {
422 { 9, 6, "c0_extintreq" },
423 { 9, 7, "c0_extintmask" },
424 { 15, 1, "c0_ebase" },
425 { 16, 1, "c0_config1" },
426 { 16, 2, "c0_config2" },
427 { 16, 3, "c0_config3" },
428 { 16, 7, "c0_procid2" },
429 { 18, 1, "c0_watchlo,1" },
430 { 18, 2, "c0_watchlo,2" },
431 { 18, 3, "c0_watchlo,3" },
432 { 18, 4, "c0_watchlo,4" },
433 { 18, 5, "c0_watchlo,5" },
434 { 18, 6, "c0_watchlo,6" },
435 { 18, 7, "c0_watchlo,7" },
436 { 19, 1, "c0_watchhi,1" },
437 { 19, 2, "c0_watchhi,2" },
438 { 19, 3, "c0_watchhi,3" },
439 { 19, 4, "c0_watchhi,4" },
440 { 19, 5, "c0_watchhi,5" },
441 { 19, 6, "c0_watchhi,6" },
442 { 19, 7, "c0_watchhi,7" },
443 { 25, 1, "c0_perfcnt,1" },
444 { 25, 2, "c0_perfcnt,2" },
445 { 25, 3, "c0_perfcnt,3" },
446 { 25, 4, "c0_perfcnt,4" },
447 { 25, 5, "c0_perfcnt,5" },
448 { 25, 6, "c0_perfcnt,6" },
449 { 25, 7, "c0_perfcnt,7" },
450 { 27, 1, "c0_cacheerr,1" },
451 { 27, 2, "c0_cacheerr,2" },
452 { 27, 3, "c0_cacheerr,3" },
453 { 28, 1, "c0_datalo" },
454 { 29, 1, "c0_datahi" }
455 };
456
457 static const char * const mips_hwr_names_numeric[32] =
458 {
459 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
460 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
461 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
462 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
463 };
464
465 static const char * const mips_hwr_names_mips3264r2[32] =
466 {
467 "hwr_cpunum", "hwr_synci_step", "hwr_cc", "hwr_ccres",
468 "$4", "$5", "$6", "$7",
469 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
470 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
471 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
472 };
473
474 struct mips_abi_choice
475 {
476 const char * name;
477 const char * const *gpr_names;
478 const char * const *fpr_names;
479 };
480
481 struct mips_abi_choice mips_abi_choices[] =
482 {
483 { "numeric", mips_gpr_names_numeric, mips_fpr_names_numeric },
484 { "32", mips_gpr_names_oldabi, mips_fpr_names_32 },
485 { "n32", mips_gpr_names_newabi, mips_fpr_names_n32 },
486 { "64", mips_gpr_names_newabi, mips_fpr_names_64 },
487 };
488
489 struct mips_arch_choice
490 {
491 const char *name;
492 int bfd_mach_valid;
493 unsigned long bfd_mach;
494 int processor;
495 int isa;
496 const char * const *cp0_names;
497 const struct mips_cp0sel_name *cp0sel_names;
498 unsigned int cp0sel_names_len;
499 const char * const *hwr_names;
500 };
501
502 const struct mips_arch_choice mips_arch_choices[] =
503 {
504 { "numeric", 0, 0, 0, 0,
505 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
506
507 { "r3000", 1, bfd_mach_mips3000, CPU_R3000, ISA_MIPS1,
508 mips_cp0_names_r3000, NULL, 0, mips_hwr_names_numeric },
509 { "r3900", 1, bfd_mach_mips3900, CPU_R3900, ISA_MIPS1,
510 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
511 { "r4000", 1, bfd_mach_mips4000, CPU_R4000, ISA_MIPS3,
512 mips_cp0_names_r4000, NULL, 0, mips_hwr_names_numeric },
513 { "r4010", 1, bfd_mach_mips4010, CPU_R4010, ISA_MIPS2,
514 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
515 { "vr4100", 1, bfd_mach_mips4100, CPU_VR4100, ISA_MIPS3,
516 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
517 { "vr4111", 1, bfd_mach_mips4111, CPU_R4111, ISA_MIPS3,
518 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
519 { "vr4120", 1, bfd_mach_mips4120, CPU_VR4120, ISA_MIPS3,
520 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
521 { "r4300", 1, bfd_mach_mips4300, CPU_R4300, ISA_MIPS3,
522 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
523 { "r4400", 1, bfd_mach_mips4400, CPU_R4400, ISA_MIPS3,
524 mips_cp0_names_r4000, NULL, 0, mips_hwr_names_numeric },
525 { "r4600", 1, bfd_mach_mips4600, CPU_R4600, ISA_MIPS3,
526 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
527 { "r4650", 1, bfd_mach_mips4650, CPU_R4650, ISA_MIPS3,
528 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
529 { "r5000", 1, bfd_mach_mips5000, CPU_R5000, ISA_MIPS4,
530 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
531 { "vr5400", 1, bfd_mach_mips5400, CPU_VR5400, ISA_MIPS4,
532 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
533 { "vr5500", 1, bfd_mach_mips5500, CPU_VR5500, ISA_MIPS4,
534 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
535 { "r6000", 1, bfd_mach_mips6000, CPU_R6000, ISA_MIPS2,
536 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
537 { "rm7000", 1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4,
538 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
539 { "rm9000", 1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4,
540 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
541 { "r8000", 1, bfd_mach_mips8000, CPU_R8000, ISA_MIPS4,
542 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
543 { "r10000", 1, bfd_mach_mips10000, CPU_R10000, ISA_MIPS4,
544 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
545 { "r12000", 1, bfd_mach_mips12000, CPU_R12000, ISA_MIPS4,
546 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
547 { "r14000", 1, bfd_mach_mips14000, CPU_R14000, ISA_MIPS4,
548 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
549 { "r16000", 1, bfd_mach_mips16000, CPU_R16000, ISA_MIPS4,
550 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
551 { "mips5", 1, bfd_mach_mips5, CPU_MIPS5, ISA_MIPS5,
552 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
553
554 /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
555 Note that MIPS-3D and MDMX are not applicable to MIPS32. (See
556 _MIPS32 Architecture For Programmers Volume I: Introduction to the
557 MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
558 page 1. */
559 { "mips32", 1, bfd_mach_mipsisa32, CPU_MIPS32,
560 ISA_MIPS32 | INSN_SMARTMIPS,
561 mips_cp0_names_mips3264,
562 mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
563 mips_hwr_names_numeric },
564
565 { "mips32r2", 1, bfd_mach_mipsisa32r2, CPU_MIPS32R2,
566 (ISA_MIPS32R2 | INSN_SMARTMIPS | INSN_DSP | INSN_DSPR2
567 | INSN_MIPS3D | INSN_MT | INSN_MCU),
568 mips_cp0_names_mips3264r2,
569 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
570 mips_hwr_names_mips3264r2 },
571
572 /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs. */
573 { "mips64", 1, bfd_mach_mipsisa64, CPU_MIPS64,
574 ISA_MIPS64 | INSN_MIPS3D | INSN_MDMX,
575 mips_cp0_names_mips3264,
576 mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
577 mips_hwr_names_numeric },
578
579 { "mips64r2", 1, bfd_mach_mipsisa64r2, CPU_MIPS64R2,
580 (ISA_MIPS64R2 | INSN_MIPS3D | INSN_DSP | INSN_DSPR2
581 | INSN_DSP64 | INSN_MT | INSN_MDMX | INSN_MCU),
582 mips_cp0_names_mips3264r2,
583 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
584 mips_hwr_names_mips3264r2 },
585
586 { "sb1", 1, bfd_mach_mips_sb1, CPU_SB1,
587 ISA_MIPS64 | INSN_MIPS3D | INSN_SB1,
588 mips_cp0_names_sb1,
589 mips_cp0sel_names_sb1, ARRAY_SIZE (mips_cp0sel_names_sb1),
590 mips_hwr_names_numeric },
591
592 { "loongson2e", 1, bfd_mach_mips_loongson_2e, CPU_LOONGSON_2E,
593 ISA_MIPS3 | INSN_LOONGSON_2E, mips_cp0_names_numeric,
594 NULL, 0, mips_hwr_names_numeric },
595
596 { "loongson2f", 1, bfd_mach_mips_loongson_2f, CPU_LOONGSON_2F,
597 ISA_MIPS3 | INSN_LOONGSON_2F, mips_cp0_names_numeric,
598 NULL, 0, mips_hwr_names_numeric },
599
600 { "loongson3a", 1, bfd_mach_mips_loongson_3a, CPU_LOONGSON_3A,
601 ISA_MIPS64 | INSN_LOONGSON_3A, mips_cp0_names_numeric,
602 NULL, 0, mips_hwr_names_numeric },
603
604 { "octeon", 1, bfd_mach_mips_octeon, CPU_OCTEON,
605 ISA_MIPS64R2 | INSN_OCTEON, mips_cp0_names_numeric, NULL, 0,
606 mips_hwr_names_numeric },
607
608 { "octeon+", 1, bfd_mach_mips_octeonp, CPU_OCTEONP,
609 ISA_MIPS64R2 | INSN_OCTEONP, mips_cp0_names_numeric,
610 NULL, 0, mips_hwr_names_numeric },
611
612 { "octeon2", 1, bfd_mach_mips_octeon2, CPU_OCTEON2,
613 ISA_MIPS64R2 | INSN_OCTEON2, mips_cp0_names_numeric,
614 NULL, 0, mips_hwr_names_numeric },
615
616 { "xlr", 1, bfd_mach_mips_xlr, CPU_XLR,
617 ISA_MIPS64 | INSN_XLR,
618 mips_cp0_names_xlr,
619 mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
620 mips_hwr_names_numeric },
621
622 /* XLP is mostly like XLR, with the prominent exception it is being
623 MIPS64R2. */
624 { "xlp", 1, bfd_mach_mips_xlr, CPU_XLR,
625 ISA_MIPS64R2 | INSN_XLR,
626 mips_cp0_names_xlr,
627 mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
628 mips_hwr_names_numeric },
629
630 /* This entry, mips16, is here only for ISA/processor selection; do
631 not print its name. */
632 { "", 1, bfd_mach_mips16, CPU_MIPS16, ISA_MIPS3,
633 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
634 };
635
636 /* ISA and processor type to disassemble for, and register names to use.
637 set_default_mips_dis_options and parse_mips_dis_options fill in these
638 values. */
639 static int mips_processor;
640 static int mips_isa;
641 static int micromips_ase;
642 static const char * const *mips_gpr_names;
643 static const char * const *mips_fpr_names;
644 static const char * const *mips_cp0_names;
645 static const struct mips_cp0sel_name *mips_cp0sel_names;
646 static int mips_cp0sel_names_len;
647 static const char * const *mips_hwr_names;
648
649 /* Other options */
650 static int no_aliases; /* If set disassemble as most general inst. */
651 \f
652 static const struct mips_abi_choice *
653 choose_abi_by_name (const char *name, unsigned int namelen)
654 {
655 const struct mips_abi_choice *c;
656 unsigned int i;
657
658 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_abi_choices) && c == NULL; i++)
659 if (strncmp (mips_abi_choices[i].name, name, namelen) == 0
660 && strlen (mips_abi_choices[i].name) == namelen)
661 c = &mips_abi_choices[i];
662
663 return c;
664 }
665
666 static const struct mips_arch_choice *
667 choose_arch_by_name (const char *name, unsigned int namelen)
668 {
669 const struct mips_arch_choice *c = NULL;
670 unsigned int i;
671
672 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
673 if (strncmp (mips_arch_choices[i].name, name, namelen) == 0
674 && strlen (mips_arch_choices[i].name) == namelen)
675 c = &mips_arch_choices[i];
676
677 return c;
678 }
679
680 static const struct mips_arch_choice *
681 choose_arch_by_number (unsigned long mach)
682 {
683 static unsigned long hint_bfd_mach;
684 static const struct mips_arch_choice *hint_arch_choice;
685 const struct mips_arch_choice *c;
686 unsigned int i;
687
688 /* We optimize this because even if the user specifies no
689 flags, this will be done for every instruction! */
690 if (hint_bfd_mach == mach
691 && hint_arch_choice != NULL
692 && hint_arch_choice->bfd_mach == hint_bfd_mach)
693 return hint_arch_choice;
694
695 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
696 {
697 if (mips_arch_choices[i].bfd_mach_valid
698 && mips_arch_choices[i].bfd_mach == mach)
699 {
700 c = &mips_arch_choices[i];
701 hint_bfd_mach = mach;
702 hint_arch_choice = c;
703 }
704 }
705 return c;
706 }
707
708 /* Check if the object uses NewABI conventions. */
709
710 static int
711 is_newabi (Elf_Internal_Ehdr *header)
712 {
713 /* There are no old-style ABIs which use 64-bit ELF. */
714 if (header->e_ident[EI_CLASS] == ELFCLASS64)
715 return 1;
716
717 /* If a 32-bit ELF file, n32 is a new-style ABI. */
718 if ((header->e_flags & EF_MIPS_ABI2) != 0)
719 return 1;
720
721 return 0;
722 }
723
724 /* Check if the object has microMIPS ASE code. */
725
726 static int
727 is_micromips (Elf_Internal_Ehdr *header)
728 {
729 if ((header->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS) != 0)
730 return 1;
731
732 return 0;
733 }
734
735 static void
736 set_default_mips_dis_options (struct disassemble_info *info)
737 {
738 const struct mips_arch_choice *chosen_arch;
739
740 /* Defaults: mipsIII/r3000 (?!), no microMIPS ASE (any compressed code
741 is MIPS16 ASE) (o)32-style ("oldabi") GPR names, and numeric FPR,
742 CP0 register, and HWR names. */
743 mips_isa = ISA_MIPS3;
744 mips_processor = CPU_R3000;
745 micromips_ase = 0;
746 mips_gpr_names = mips_gpr_names_oldabi;
747 mips_fpr_names = mips_fpr_names_numeric;
748 mips_cp0_names = mips_cp0_names_numeric;
749 mips_cp0sel_names = NULL;
750 mips_cp0sel_names_len = 0;
751 mips_hwr_names = mips_hwr_names_numeric;
752 no_aliases = 0;
753
754 /* Update settings according to the ELF file header flags. */
755 if (info->flavour == bfd_target_elf_flavour && info->section != NULL)
756 {
757 Elf_Internal_Ehdr *header;
758
759 header = elf_elfheader (info->section->owner);
760 /* If an ELF "newabi" binary, use the n32/(n)64 GPR names. */
761 if (is_newabi (header))
762 mips_gpr_names = mips_gpr_names_newabi;
763 /* If a microMIPS binary, then don't use MIPS16 bindings. */
764 micromips_ase = is_micromips (header);
765 }
766
767 /* Set ISA, architecture, and cp0 register names as best we can. */
768 #if ! SYMTAB_AVAILABLE
769 /* This is running out on a target machine, not in a host tool.
770 FIXME: Where does mips_target_info come from? */
771 target_processor = mips_target_info.processor;
772 mips_isa = mips_target_info.isa;
773 #else
774 chosen_arch = choose_arch_by_number (info->mach);
775 if (chosen_arch != NULL)
776 {
777 mips_processor = chosen_arch->processor;
778 mips_isa = chosen_arch->isa;
779 mips_cp0_names = chosen_arch->cp0_names;
780 mips_cp0sel_names = chosen_arch->cp0sel_names;
781 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
782 mips_hwr_names = chosen_arch->hwr_names;
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 /* Look for the = that delimits the end of the option name. */
803 for (i = 0; i < len; i++)
804 if (option[i] == '=')
805 break;
806
807 if (i == 0) /* Invalid option: no name before '='. */
808 return;
809 if (i == len) /* Invalid option: no '='. */
810 return;
811 if (i == (len - 1)) /* Invalid option: no value after '='. */
812 return;
813
814 optionlen = i;
815 val = option + (optionlen + 1);
816 vallen = len - (optionlen + 1);
817
818 if (strncmp ("gpr-names", option, optionlen) == 0
819 && strlen ("gpr-names") == optionlen)
820 {
821 chosen_abi = choose_abi_by_name (val, vallen);
822 if (chosen_abi != NULL)
823 mips_gpr_names = chosen_abi->gpr_names;
824 return;
825 }
826
827 if (strncmp ("fpr-names", option, optionlen) == 0
828 && strlen ("fpr-names") == optionlen)
829 {
830 chosen_abi = choose_abi_by_name (val, vallen);
831 if (chosen_abi != NULL)
832 mips_fpr_names = chosen_abi->fpr_names;
833 return;
834 }
835
836 if (strncmp ("cp0-names", option, optionlen) == 0
837 && strlen ("cp0-names") == optionlen)
838 {
839 chosen_arch = choose_arch_by_name (val, vallen);
840 if (chosen_arch != NULL)
841 {
842 mips_cp0_names = chosen_arch->cp0_names;
843 mips_cp0sel_names = chosen_arch->cp0sel_names;
844 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
845 }
846 return;
847 }
848
849 if (strncmp ("hwr-names", option, optionlen) == 0
850 && strlen ("hwr-names") == optionlen)
851 {
852 chosen_arch = choose_arch_by_name (val, vallen);
853 if (chosen_arch != NULL)
854 mips_hwr_names = chosen_arch->hwr_names;
855 return;
856 }
857
858 if (strncmp ("reg-names", option, optionlen) == 0
859 && strlen ("reg-names") == optionlen)
860 {
861 /* We check both ABI and ARCH here unconditionally, so
862 that "numeric" will do the desirable thing: select
863 numeric register names for all registers. Other than
864 that, a given name probably won't match both. */
865 chosen_abi = choose_abi_by_name (val, vallen);
866 if (chosen_abi != NULL)
867 {
868 mips_gpr_names = chosen_abi->gpr_names;
869 mips_fpr_names = chosen_abi->fpr_names;
870 }
871 chosen_arch = choose_arch_by_name (val, vallen);
872 if (chosen_arch != NULL)
873 {
874 mips_cp0_names = chosen_arch->cp0_names;
875 mips_cp0sel_names = chosen_arch->cp0sel_names;
876 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
877 mips_hwr_names = chosen_arch->hwr_names;
878 }
879 return;
880 }
881
882 /* Invalid option. */
883 }
884
885 static void
886 parse_mips_dis_options (const char *options)
887 {
888 const char *option_end;
889
890 if (options == NULL)
891 return;
892
893 while (*options != '\0')
894 {
895 /* Skip empty options. */
896 if (*options == ',')
897 {
898 options++;
899 continue;
900 }
901
902 /* We know that *options is neither NUL or a comma. */
903 option_end = options + 1;
904 while (*option_end != ',' && *option_end != '\0')
905 option_end++;
906
907 parse_mips_dis_option (options, option_end - options);
908
909 /* Go on to the next one. If option_end points to a comma, it
910 will be skipped above. */
911 options = option_end;
912 }
913 }
914
915 static const struct mips_cp0sel_name *
916 lookup_mips_cp0sel_name (const struct mips_cp0sel_name *names,
917 unsigned int len,
918 unsigned int cp0reg,
919 unsigned int sel)
920 {
921 unsigned int i;
922
923 for (i = 0; i < len; i++)
924 if (names[i].cp0reg == cp0reg && names[i].sel == sel)
925 return &names[i];
926 return NULL;
927 }
928 \f
929 /* Print insn arguments for 32/64-bit code. */
930
931 static void
932 print_insn_args (const char *d,
933 int l,
934 bfd_vma pc,
935 struct disassemble_info *info,
936 const struct mips_opcode *opp)
937 {
938 const fprintf_ftype infprintf = info->fprintf_func;
939 unsigned int lsb, msb, msbd;
940 void *is = info->stream;
941 int op;
942
943 lsb = 0;
944
945 #define GET_OP(insn, field) \
946 (((insn) >> OP_SH_##field) & OP_MASK_##field)
947 #define GET_OP_S(insn, field) \
948 ((GET_OP (insn, field) ^ ((OP_MASK_##field >> 1) + 1)) \
949 - ((OP_MASK_##field >> 1) + 1))
950 for (; *d != '\0'; d++)
951 {
952 switch (*d)
953 {
954 case ',':
955 case '(':
956 case ')':
957 case '[':
958 case ']':
959 infprintf (is, "%c", *d);
960 break;
961
962 case '+':
963 /* Extension character; switch for second char. */
964 d++;
965 switch (*d)
966 {
967 case '\0':
968 /* xgettext:c-format */
969 infprintf (is,
970 _("# internal error, "
971 "incomplete extension sequence (+)"));
972 return;
973
974 case 'A':
975 lsb = GET_OP (l, SHAMT);
976 infprintf (is, "0x%x", lsb);
977 break;
978
979 case 'B':
980 msb = GET_OP (l, INSMSB);
981 infprintf (is, "0x%x", msb - lsb + 1);
982 break;
983
984 case '1':
985 infprintf (is, "0x%x", GET_OP (l, UDI1));
986 break;
987
988 case '2':
989 infprintf (is, "0x%x", GET_OP (l, UDI2));
990 break;
991
992 case '3':
993 infprintf (is, "0x%x", GET_OP (l, UDI3));
994 break;
995
996 case '4':
997 infprintf (is, "0x%x", GET_OP (l, UDI4));
998 break;
999
1000 case 'C':
1001 case 'H':
1002 msbd = GET_OP (l, EXTMSBD);
1003 infprintf (is, "0x%x", msbd + 1);
1004 break;
1005
1006 case 'D':
1007 {
1008 const struct mips_cp0sel_name *n;
1009 unsigned int cp0reg, sel;
1010
1011 cp0reg = GET_OP (l, RD);
1012 sel = GET_OP (l, SEL);
1013
1014 /* CP0 register including 'sel' code for mtcN (et al.), to be
1015 printed textually if known. If not known, print both
1016 CP0 register name and sel numerically since CP0 register
1017 with sel 0 may have a name unrelated to register being
1018 printed. */
1019 n = lookup_mips_cp0sel_name(mips_cp0sel_names,
1020 mips_cp0sel_names_len, cp0reg, sel);
1021 if (n != NULL)
1022 infprintf (is, "%s", n->name);
1023 else
1024 infprintf (is, "$%d,%d", cp0reg, sel);
1025 break;
1026 }
1027
1028 case 'E':
1029 lsb = GET_OP (l, SHAMT) + 32;
1030 infprintf (is, "0x%x", lsb);
1031 break;
1032
1033 case 'F':
1034 msb = GET_OP (l, INSMSB) + 32;
1035 infprintf (is, "0x%x", msb - lsb + 1);
1036 break;
1037
1038 case 'G':
1039 msbd = GET_OP (l, EXTMSBD) + 32;
1040 infprintf (is, "0x%x", msbd + 1);
1041 break;
1042
1043 case 't': /* Coprocessor 0 reg name */
1044 infprintf (is, "%s", mips_cp0_names[GET_OP (l, RT)]);
1045 break;
1046
1047 case 'T': /* Coprocessor 0 reg name */
1048 {
1049 const struct mips_cp0sel_name *n;
1050 unsigned int cp0reg, sel;
1051
1052 cp0reg = GET_OP (l, RT);
1053 sel = GET_OP (l, SEL);
1054
1055 /* CP0 register including 'sel' code for mftc0, to be
1056 printed textually if known. If not known, print both
1057 CP0 register name and sel numerically since CP0 register
1058 with sel 0 may have a name unrelated to register being
1059 printed. */
1060 n = lookup_mips_cp0sel_name(mips_cp0sel_names,
1061 mips_cp0sel_names_len, cp0reg, sel);
1062 if (n != NULL)
1063 infprintf (is, "%s", n->name);
1064 else
1065 infprintf (is, "$%d,%d", cp0reg, sel);
1066 break;
1067 }
1068
1069 case 'x': /* bbit bit index */
1070 infprintf (is, "0x%x", GET_OP (l, BBITIND));
1071 break;
1072
1073 case 'p': /* cins, cins32, exts and exts32 position */
1074 infprintf (is, "0x%x", GET_OP (l, CINSPOS));
1075 break;
1076
1077 case 's': /* cins and exts length-minus-one */
1078 infprintf (is, "0x%x", GET_OP (l, CINSLM1));
1079 break;
1080
1081 case 'S': /* cins32 and exts32 length-minus-one field */
1082 infprintf (is, "0x%x", GET_OP (l, CINSLM1));
1083 break;
1084
1085 case 'Q': /* seqi/snei immediate field */
1086 infprintf (is, "%d", GET_OP_S (l, SEQI));
1087 break;
1088
1089 case 'a': /* 8-bit signed offset in bit 6 */
1090 infprintf (is, "%d", GET_OP_S (l, OFFSET_A));
1091 break;
1092
1093 case 'b': /* 8-bit signed offset in bit 3 */
1094 infprintf (is, "%d", GET_OP_S (l, OFFSET_B));
1095 break;
1096
1097 case 'c': /* 9-bit signed offset in bit 6 */
1098 /* Left shift 4 bits to print the real offset. */
1099 infprintf (is, "%d", GET_OP_S (l, OFFSET_C) << 4);
1100 break;
1101
1102 case 'z':
1103 infprintf (is, "%s", mips_gpr_names[GET_OP (l, RZ)]);
1104 break;
1105
1106 case 'Z':
1107 infprintf (is, "%s", mips_fpr_names[GET_OP (l, FZ)]);
1108 break;
1109
1110 default:
1111 /* xgettext:c-format */
1112 infprintf (is,
1113 _("# internal error, "
1114 "undefined extension sequence (+%c)"),
1115 *d);
1116 return;
1117 }
1118 break;
1119
1120 case '2':
1121 infprintf (is, "0x%x", GET_OP (l, BP));
1122 break;
1123
1124 case '3':
1125 infprintf (is, "0x%x", GET_OP (l, SA3));
1126 break;
1127
1128 case '4':
1129 infprintf (is, "0x%x", GET_OP (l, SA4));
1130 break;
1131
1132 case '5':
1133 infprintf (is, "0x%x", GET_OP (l, IMM8));
1134 break;
1135
1136 case '6':
1137 infprintf (is, "0x%x", GET_OP (l, RS));
1138 break;
1139
1140 case '7':
1141 infprintf (is, "$ac%d", GET_OP (l, DSPACC));
1142 break;
1143
1144 case '8':
1145 infprintf (is, "0x%x", GET_OP (l, WRDSP));
1146 break;
1147
1148 case '9':
1149 infprintf (is, "$ac%d", GET_OP (l, DSPACC_S));
1150 break;
1151
1152 case '0': /* dsp 6-bit signed immediate in bit 20 */
1153 infprintf (is, "%d", GET_OP_S (l, DSPSFT));
1154 break;
1155
1156 case ':': /* dsp 7-bit signed immediate in bit 19 */
1157 infprintf (is, "%d", GET_OP_S (l, DSPSFT_7));
1158 break;
1159
1160 case '~':
1161 infprintf (is, "%d", GET_OP_S (l, OFFSET12));
1162 break;
1163
1164 case '\\':
1165 infprintf (is, "0x%x", GET_OP (l, 3BITPOS));
1166 break;
1167
1168 case '\'':
1169 infprintf (is, "0x%x", GET_OP (l, RDDSP));
1170 break;
1171
1172 case '@': /* dsp 10-bit signed immediate in bit 16 */
1173 infprintf (is, "%d", GET_OP_S (l, IMM10));
1174 break;
1175
1176 case '!':
1177 infprintf (is, "%d", GET_OP (l, MT_U));
1178 break;
1179
1180 case '$':
1181 infprintf (is, "%d", GET_OP (l, MT_H));
1182 break;
1183
1184 case '*':
1185 infprintf (is, "$ac%d", GET_OP (l, MTACC_T));
1186 break;
1187
1188 case '&':
1189 infprintf (is, "$ac%d", GET_OP (l, MTACC_D));
1190 break;
1191
1192 case 'g':
1193 /* Coprocessor register for CTTC1, MTTC2, MTHC2, CTTC2. */
1194 infprintf (is, "$%d", GET_OP (l, RD));
1195 break;
1196
1197 case 's':
1198 case 'b':
1199 case 'r':
1200 case 'v':
1201 infprintf (is, "%s", mips_gpr_names[GET_OP (l, RS)]);
1202 break;
1203
1204 case 't':
1205 case 'w':
1206 infprintf (is, "%s", mips_gpr_names[GET_OP (l, RT)]);
1207 break;
1208
1209 case 'i':
1210 case 'u':
1211 infprintf (is, "0x%x", GET_OP (l, IMMEDIATE));
1212 break;
1213
1214 case 'j': /* Same as i, but sign-extended. */
1215 case 'o':
1216 infprintf (is, "%d", GET_OP_S (l, DELTA));
1217 break;
1218
1219 case 'h':
1220 infprintf (is, "0x%x", GET_OP (l, PREFX));
1221 break;
1222
1223 case 'k':
1224 infprintf (is, "0x%x", GET_OP (l, CACHE));
1225 break;
1226
1227 case 'a':
1228 info->target = (((pc + 4) & ~(bfd_vma) 0x0fffffff)
1229 | (GET_OP (l, TARGET) << 2));
1230 /* For gdb disassembler, force odd address on jalx. */
1231 if (info->flavour == bfd_target_unknown_flavour
1232 && strcmp (opp->name, "jalx") == 0)
1233 info->target |= 1;
1234 (*info->print_address_func) (info->target, info);
1235 break;
1236
1237 case 'p':
1238 /* Sign extend the displacement. */
1239 info->target = (GET_OP_S (l, DELTA) << 2) + pc + INSNLEN;
1240 (*info->print_address_func) (info->target, info);
1241 break;
1242
1243 case 'd':
1244 infprintf (is, "%s", mips_gpr_names[GET_OP (l, RD)]);
1245 break;
1246
1247 case 'U':
1248 {
1249 /* First check for both rd and rt being equal. */
1250 unsigned int reg = GET_OP (l, RD);
1251 if (reg == GET_OP (l, RT))
1252 infprintf (is, "%s", mips_gpr_names[reg]);
1253 else
1254 {
1255 /* If one is zero use the other. */
1256 if (reg == 0)
1257 infprintf (is, "%s", mips_gpr_names[GET_OP (l, RT)]);
1258 else if (GET_OP (l, RT) == 0)
1259 infprintf (is, "%s", mips_gpr_names[reg]);
1260 else /* Bogus, result depends on processor. */
1261 infprintf (is, "%s or %s",
1262 mips_gpr_names[reg],
1263 mips_gpr_names[GET_OP (l, RT)]);
1264 }
1265 }
1266 break;
1267
1268 case 'z':
1269 infprintf (is, "%s", mips_gpr_names[0]);
1270 break;
1271
1272 case '<':
1273 case '1':
1274 infprintf (is, "0x%x", GET_OP (l, SHAMT));
1275 break;
1276
1277 case 'c':
1278 infprintf (is, "0x%x", GET_OP (l, CODE));
1279 break;
1280
1281 case 'q':
1282 infprintf (is, "0x%x", GET_OP (l, CODE2));
1283 break;
1284
1285 case 'C':
1286 infprintf (is, "0x%x", GET_OP (l, COPZ));
1287 break;
1288
1289 case 'B':
1290 infprintf (is, "0x%x", GET_OP (l, CODE20));
1291 break;
1292
1293 case 'J':
1294 infprintf (is, "0x%x", GET_OP (l, CODE19));
1295 break;
1296
1297 case 'S':
1298 case 'V':
1299 infprintf (is, "%s", mips_fpr_names[GET_OP (l, FS)]);
1300 break;
1301
1302 case 'T':
1303 case 'W':
1304 infprintf (is, "%s", mips_fpr_names[GET_OP (l, FT)]);
1305 break;
1306
1307 case 'D':
1308 infprintf (is, "%s", mips_fpr_names[GET_OP (l, FD)]);
1309 break;
1310
1311 case 'R':
1312 infprintf (is, "%s", mips_fpr_names[GET_OP (l, FR)]);
1313 break;
1314
1315 case 'E':
1316 /* Coprocessor register for lwcN instructions, et al.
1317
1318 Note that there is no load/store cp0 instructions, and
1319 that FPU (cp1) instructions disassemble this field using
1320 'T' format. Therefore, until we gain understanding of
1321 cp2 register names, we can simply print the register
1322 numbers. */
1323 infprintf (is, "$%d", GET_OP (l, RT));
1324 break;
1325
1326 case 'G':
1327 /* Coprocessor register for mtcN instructions, et al. Note
1328 that FPU (cp1) instructions disassemble this field using
1329 'S' format. Therefore, we only need to worry about cp0,
1330 cp2, and cp3. */
1331 op = GET_OP (l, OP);
1332 if (op == OP_OP_COP0)
1333 infprintf (is, "%s", mips_cp0_names[GET_OP (l, RD)]);
1334 else
1335 infprintf (is, "$%d", GET_OP (l, RD));
1336 break;
1337
1338 case 'K':
1339 infprintf (is, "%s", mips_hwr_names[GET_OP (l, RD)]);
1340 break;
1341
1342 case 'N':
1343 infprintf (is,
1344 (opp->pinfo & (FP_D | FP_S)) != 0 ? "$fcc%d" : "$cc%d",
1345 GET_OP (l, BCC));
1346 break;
1347
1348 case 'M':
1349 infprintf (is, "$fcc%d", GET_OP (l, CCC));
1350 break;
1351
1352 case 'P':
1353 infprintf (is, "%d", GET_OP (l, PERFREG));
1354 break;
1355
1356 case 'e':
1357 infprintf (is, "%d", GET_OP (l, VECBYTE));
1358 break;
1359
1360 case '%':
1361 infprintf (is, "%d", GET_OP (l, VECALIGN));
1362 break;
1363
1364 case 'H':
1365 infprintf (is, "%d", GET_OP (l, SEL));
1366 break;
1367
1368 case 'O':
1369 infprintf (is, "%d", GET_OP (l, ALN));
1370 break;
1371
1372 case 'Q':
1373 {
1374 unsigned int vsel = GET_OP (l, VSEL);
1375
1376 if ((vsel & 0x10) == 0)
1377 {
1378 int fmt;
1379
1380 vsel &= 0x0f;
1381 for (fmt = 0; fmt < 3; fmt++, vsel >>= 1)
1382 if ((vsel & 1) == 0)
1383 break;
1384 infprintf (is, "$v%d[%d]", GET_OP (l, FT), vsel >> 1);
1385 }
1386 else if ((vsel & 0x08) == 0)
1387 {
1388 infprintf (is, "$v%d", GET_OP (l, FT));
1389 }
1390 else
1391 {
1392 infprintf (is, "0x%x", GET_OP (l, FT));
1393 }
1394 }
1395 break;
1396
1397 case 'X':
1398 infprintf (is, "$v%d", GET_OP (l, FD));
1399 break;
1400
1401 case 'Y':
1402 infprintf (is, "$v%d", GET_OP (l, FS));
1403 break;
1404
1405 case 'Z':
1406 infprintf (is, "$v%d", GET_OP (l, FT));
1407 break;
1408
1409 default:
1410 /* xgettext:c-format */
1411 infprintf (is, _("# internal error, undefined modifier (%c)"), *d);
1412 return;
1413 }
1414 }
1415 }
1416 \f
1417 /* Print the mips instruction at address MEMADDR in debugged memory,
1418 on using INFO. Returns length of the instruction, in bytes, which is
1419 always INSNLEN. BIGENDIAN must be 1 if this is big-endian code, 0 if
1420 this is little-endian code. */
1421
1422 static int
1423 print_insn_mips (bfd_vma memaddr,
1424 int word,
1425 struct disassemble_info *info)
1426 {
1427 static const struct mips_opcode *mips_hash[OP_MASK_OP + 1];
1428 const fprintf_ftype infprintf = info->fprintf_func;
1429 const struct mips_opcode *op;
1430 static bfd_boolean init = 0;
1431 void *is = info->stream;
1432
1433 /* Build a hash table to shorten the search time. */
1434 if (! init)
1435 {
1436 unsigned int i;
1437
1438 for (i = 0; i <= OP_MASK_OP; i++)
1439 {
1440 for (op = mips_opcodes; op < &mips_opcodes[NUMOPCODES]; op++)
1441 {
1442 if (op->pinfo == INSN_MACRO
1443 || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
1444 continue;
1445 if (i == GET_OP (op->match, OP))
1446 {
1447 mips_hash[i] = op;
1448 break;
1449 }
1450 }
1451 }
1452
1453 init = 1;
1454 }
1455
1456 info->bytes_per_chunk = INSNLEN;
1457 info->display_endian = info->endian;
1458 info->insn_info_valid = 1;
1459 info->branch_delay_insns = 0;
1460 info->data_size = 0;
1461 info->insn_type = dis_nonbranch;
1462 info->target = 0;
1463 info->target2 = 0;
1464
1465 op = mips_hash[GET_OP (word, OP)];
1466 if (op != NULL)
1467 {
1468 for (; op < &mips_opcodes[NUMOPCODES]; op++)
1469 {
1470 if (op->pinfo != INSN_MACRO
1471 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
1472 && (word & op->mask) == op->match)
1473 {
1474 const char *d;
1475
1476 /* We always allow to disassemble the jalx instruction. */
1477 if (!opcode_is_member (op, mips_isa, mips_processor)
1478 && strcmp (op->name, "jalx"))
1479 continue;
1480
1481 /* Figure out instruction type and branch delay information. */
1482 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
1483 {
1484 if ((op->pinfo & (INSN_WRITE_GPR_31
1485 | INSN_WRITE_GPR_D)) != 0)
1486 info->insn_type = dis_jsr;
1487 else
1488 info->insn_type = dis_branch;
1489 info->branch_delay_insns = 1;
1490 }
1491 else if ((op->pinfo & (INSN_COND_BRANCH_DELAY
1492 | INSN_COND_BRANCH_LIKELY)) != 0)
1493 {
1494 if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
1495 info->insn_type = dis_condjsr;
1496 else
1497 info->insn_type = dis_condbranch;
1498 info->branch_delay_insns = 1;
1499 }
1500 else if ((op->pinfo & (INSN_STORE_MEMORY
1501 | INSN_LOAD_MEMORY_DELAY)) != 0)
1502 info->insn_type = dis_dref;
1503
1504 infprintf (is, "%s", op->name);
1505
1506 d = op->args;
1507 if (d != NULL && *d != '\0')
1508 {
1509 infprintf (is, "\t");
1510 print_insn_args (d, word, memaddr, info, op);
1511 }
1512
1513 return INSNLEN;
1514 }
1515 }
1516 }
1517 #undef GET_OP_S
1518 #undef GET_OP
1519
1520 /* Handle undefined instructions. */
1521 info->insn_type = dis_noninsn;
1522 infprintf (is, "0x%x", word);
1523 return INSNLEN;
1524 }
1525 \f
1526 /* Disassemble an operand for a mips16 instruction. */
1527
1528 static void
1529 print_mips16_insn_arg (char type,
1530 const struct mips_opcode *op,
1531 int l,
1532 bfd_boolean use_extend,
1533 int extend,
1534 bfd_vma memaddr,
1535 struct disassemble_info *info)
1536 {
1537 const fprintf_ftype infprintf = info->fprintf_func;
1538 void *is = info->stream;
1539
1540 #define GET_OP(insn, field) \
1541 (((insn) >> MIPS16OP_SH_##field) & MIPS16OP_MASK_##field)
1542 #define GET_OP_S(insn, field) \
1543 ((GET_OP (insn, field) ^ ((MIPS16OP_MASK_##field >> 1) + 1)) \
1544 - ((MIPS16OP_MASK_##field >> 1) + 1))
1545 switch (type)
1546 {
1547 case ',':
1548 case '(':
1549 case ')':
1550 infprintf (is, "%c", type);
1551 break;
1552
1553 case 'y':
1554 case 'w':
1555 infprintf (is, "%s", mips16_reg_names (GET_OP (l, RY)));
1556 break;
1557
1558 case 'x':
1559 case 'v':
1560 infprintf (is, "%s", mips16_reg_names (GET_OP (l, RX)));
1561 break;
1562
1563 case 'z':
1564 infprintf (is, "%s", mips16_reg_names (GET_OP (l, RZ)));
1565 break;
1566
1567 case 'Z':
1568 infprintf (is, "%s", mips16_reg_names (GET_OP (l, MOVE32Z)));
1569 break;
1570
1571 case '0':
1572 infprintf (is, "%s", mips_gpr_names[0]);
1573 break;
1574
1575 case 'S':
1576 infprintf (is, "%s", mips_gpr_names[29]);
1577 break;
1578
1579 case 'P':
1580 infprintf (is, "$pc");
1581 break;
1582
1583 case 'R':
1584 infprintf (is, "%s", mips_gpr_names[31]);
1585 break;
1586
1587 case 'X':
1588 infprintf (is, "%s", mips_gpr_names[GET_OP (l, REGR32)]);
1589 break;
1590
1591 case 'Y':
1592 infprintf (is, "%s", mips_gpr_names[MIPS16OP_EXTRACT_REG32R (l)]);
1593 break;
1594
1595 case '<':
1596 case '>':
1597 case '[':
1598 case ']':
1599 case '4':
1600 case '5':
1601 case 'H':
1602 case 'W':
1603 case 'D':
1604 case 'j':
1605 case '6':
1606 case '8':
1607 case 'V':
1608 case 'C':
1609 case 'U':
1610 case 'k':
1611 case 'K':
1612 case 'p':
1613 case 'q':
1614 case 'A':
1615 case 'B':
1616 case 'E':
1617 {
1618 int immed, nbits, shift, signedp, extbits, pcrel, extu, branch;
1619
1620 shift = 0;
1621 signedp = 0;
1622 extbits = 16;
1623 pcrel = 0;
1624 extu = 0;
1625 branch = 0;
1626 switch (type)
1627 {
1628 case '<':
1629 nbits = 3;
1630 immed = GET_OP (l, RZ);
1631 extbits = 5;
1632 extu = 1;
1633 break;
1634 case '>':
1635 nbits = 3;
1636 immed = GET_OP (l, RX);
1637 extbits = 5;
1638 extu = 1;
1639 break;
1640 case '[':
1641 nbits = 3;
1642 immed = GET_OP (l, RZ);
1643 extbits = 6;
1644 extu = 1;
1645 break;
1646 case ']':
1647 nbits = 3;
1648 immed = GET_OP (l, RX);
1649 extbits = 6;
1650 extu = 1;
1651 break;
1652 case '4':
1653 nbits = 4;
1654 immed = GET_OP (l, IMM4);
1655 signedp = 1;
1656 extbits = 15;
1657 break;
1658 case '5':
1659 nbits = 5;
1660 immed = GET_OP (l, IMM5);
1661 info->insn_type = dis_dref;
1662 info->data_size = 1;
1663 break;
1664 case 'H':
1665 nbits = 5;
1666 shift = 1;
1667 immed = GET_OP (l, IMM5);
1668 info->insn_type = dis_dref;
1669 info->data_size = 2;
1670 break;
1671 case 'W':
1672 nbits = 5;
1673 shift = 2;
1674 immed = GET_OP (l, IMM5);
1675 if ((op->pinfo & MIPS16_INSN_READ_PC) == 0
1676 && (op->pinfo & MIPS16_INSN_READ_SP) == 0)
1677 {
1678 info->insn_type = dis_dref;
1679 info->data_size = 4;
1680 }
1681 break;
1682 case 'D':
1683 nbits = 5;
1684 shift = 3;
1685 immed = GET_OP (l, IMM5);
1686 info->insn_type = dis_dref;
1687 info->data_size = 8;
1688 break;
1689 case 'j':
1690 nbits = 5;
1691 immed = GET_OP (l, IMM5);
1692 signedp = 1;
1693 break;
1694 case '6':
1695 nbits = 6;
1696 immed = GET_OP (l, IMM6);
1697 break;
1698 case '8':
1699 nbits = 8;
1700 immed = GET_OP (l, IMM8);
1701 break;
1702 case 'V':
1703 nbits = 8;
1704 shift = 2;
1705 immed = GET_OP (l, IMM8);
1706 /* FIXME: This might be lw, or it might be addiu to $sp or
1707 $pc. We assume it's load. */
1708 info->insn_type = dis_dref;
1709 info->data_size = 4;
1710 break;
1711 case 'C':
1712 nbits = 8;
1713 shift = 3;
1714 immed = GET_OP (l, IMM8);
1715 info->insn_type = dis_dref;
1716 info->data_size = 8;
1717 break;
1718 case 'U':
1719 nbits = 8;
1720 immed = GET_OP (l, IMM8);
1721 extu = 1;
1722 break;
1723 case 'k':
1724 nbits = 8;
1725 immed = GET_OP (l, IMM8);
1726 signedp = 1;
1727 break;
1728 case 'K':
1729 nbits = 8;
1730 shift = 3;
1731 immed = GET_OP (l, IMM8);
1732 signedp = 1;
1733 break;
1734 case 'p':
1735 nbits = 8;
1736 immed = GET_OP (l, IMM8);
1737 signedp = 1;
1738 pcrel = 1;
1739 branch = 1;
1740 break;
1741 case 'q':
1742 nbits = 11;
1743 immed = GET_OP (l, IMM11);
1744 signedp = 1;
1745 pcrel = 1;
1746 branch = 1;
1747 break;
1748 case 'A':
1749 nbits = 8;
1750 shift = 2;
1751 immed = GET_OP (l, IMM8);
1752 pcrel = 1;
1753 /* FIXME: This can be lw or la. We assume it is lw. */
1754 info->insn_type = dis_dref;
1755 info->data_size = 4;
1756 break;
1757 case 'B':
1758 nbits = 5;
1759 shift = 3;
1760 immed = GET_OP (l, IMM5);
1761 pcrel = 1;
1762 info->insn_type = dis_dref;
1763 info->data_size = 8;
1764 break;
1765 case 'E':
1766 nbits = 5;
1767 shift = 2;
1768 immed = GET_OP (l, IMM5);
1769 pcrel = 1;
1770 break;
1771 default:
1772 abort ();
1773 }
1774
1775 if (! use_extend)
1776 {
1777 if (signedp && immed >= (1 << (nbits - 1)))
1778 immed -= 1 << nbits;
1779 immed <<= shift;
1780 if ((type == '<' || type == '>' || type == '[' || type == ']')
1781 && immed == 0)
1782 immed = 8;
1783 }
1784 else
1785 {
1786 if (extbits == 16)
1787 immed |= ((extend & 0x1f) << 11) | (extend & 0x7e0);
1788 else if (extbits == 15)
1789 immed |= ((extend & 0xf) << 11) | (extend & 0x7f0);
1790 else
1791 immed = ((extend >> 6) & 0x1f) | (extend & 0x20);
1792 immed &= (1 << extbits) - 1;
1793 if (! extu && immed >= (1 << (extbits - 1)))
1794 immed -= 1 << extbits;
1795 }
1796
1797 if (! pcrel)
1798 infprintf (is, "%d", immed);
1799 else
1800 {
1801 bfd_vma baseaddr;
1802
1803 if (branch)
1804 {
1805 immed *= 2;
1806 baseaddr = memaddr + 2;
1807 }
1808 else if (use_extend)
1809 baseaddr = memaddr - 2;
1810 else
1811 {
1812 int status;
1813 bfd_byte buffer[2];
1814
1815 baseaddr = memaddr;
1816
1817 /* If this instruction is in the delay slot of a jr
1818 instruction, the base address is the address of the
1819 jr instruction. If it is in the delay slot of jalr
1820 instruction, the base address is the address of the
1821 jalr instruction. This test is unreliable: we have
1822 no way of knowing whether the previous word is
1823 instruction or data. */
1824 status = (*info->read_memory_func) (memaddr - 4, buffer, 2,
1825 info);
1826 if (status == 0
1827 && (((info->endian == BFD_ENDIAN_BIG
1828 ? bfd_getb16 (buffer)
1829 : bfd_getl16 (buffer))
1830 & 0xf800) == 0x1800))
1831 baseaddr = memaddr - 4;
1832 else
1833 {
1834 status = (*info->read_memory_func) (memaddr - 2, buffer,
1835 2, info);
1836 if (status == 0
1837 && (((info->endian == BFD_ENDIAN_BIG
1838 ? bfd_getb16 (buffer)
1839 : bfd_getl16 (buffer))
1840 & 0xf81f) == 0xe800))
1841 baseaddr = memaddr - 2;
1842 }
1843 }
1844 info->target = (baseaddr & ~((1 << shift) - 1)) + immed;
1845 if (pcrel && branch
1846 && info->flavour == bfd_target_unknown_flavour)
1847 /* For gdb disassembler, maintain odd address. */
1848 info->target |= 1;
1849 (*info->print_address_func) (info->target, info);
1850 }
1851 }
1852 break;
1853
1854 case 'a':
1855 {
1856 int jalx = l & 0x400;
1857
1858 if (! use_extend)
1859 extend = 0;
1860 l = ((l & 0x1f) << 23) | ((l & 0x3e0) << 13) | (extend << 2);
1861 if (!jalx && info->flavour == bfd_target_unknown_flavour)
1862 /* For gdb disassembler, maintain odd address. */
1863 l |= 1;
1864 }
1865 info->target = ((memaddr + 4) & ~(bfd_vma) 0x0fffffff) | l;
1866 (*info->print_address_func) (info->target, info);
1867 break;
1868
1869 case 'l':
1870 case 'L':
1871 {
1872 int need_comma, amask, smask;
1873
1874 need_comma = 0;
1875
1876 l = GET_OP (l, IMM6);
1877
1878 amask = (l >> 3) & 7;
1879
1880 if (amask > 0 && amask < 5)
1881 {
1882 infprintf (is, "%s", mips_gpr_names[4]);
1883 if (amask > 1)
1884 infprintf (is, "-%s", mips_gpr_names[amask + 3]);
1885 need_comma = 1;
1886 }
1887
1888 smask = (l >> 1) & 3;
1889 if (smask == 3)
1890 {
1891 infprintf (is, "%s??", need_comma ? "," : "");
1892 need_comma = 1;
1893 }
1894 else if (smask > 0)
1895 {
1896 infprintf (is, "%s%s", need_comma ? "," : "", mips_gpr_names[16]);
1897 if (smask > 1)
1898 infprintf (is, "-%s", mips_gpr_names[smask + 15]);
1899 need_comma = 1;
1900 }
1901
1902 if (l & 1)
1903 {
1904 infprintf (is, "%s%s", need_comma ? "," : "", mips_gpr_names[31]);
1905 need_comma = 1;
1906 }
1907
1908 if (amask == 5 || amask == 6)
1909 {
1910 infprintf (is, "%s$f0", need_comma ? "," : "");
1911 if (amask == 6)
1912 infprintf (is, "-$f1");
1913 }
1914 }
1915 break;
1916
1917 case 'm':
1918 case 'M':
1919 /* MIPS16e save/restore. */
1920 {
1921 int need_comma = 0;
1922 int amask, args, statics;
1923 int nsreg, smask;
1924 int framesz;
1925 int i, j;
1926
1927 l = l & 0x7f;
1928 if (use_extend)
1929 l |= extend << 16;
1930
1931 amask = (l >> 16) & 0xf;
1932 if (amask == MIPS16_ALL_ARGS)
1933 {
1934 args = 4;
1935 statics = 0;
1936 }
1937 else if (amask == MIPS16_ALL_STATICS)
1938 {
1939 args = 0;
1940 statics = 4;
1941 }
1942 else
1943 {
1944 args = amask >> 2;
1945 statics = amask & 3;
1946 }
1947
1948 if (args > 0) {
1949 infprintf (is, "%s", mips_gpr_names[4]);
1950 if (args > 1)
1951 infprintf (is, "-%s", mips_gpr_names[4 + args - 1]);
1952 need_comma = 1;
1953 }
1954
1955 framesz = (((l >> 16) & 0xf0) | (l & 0x0f)) * 8;
1956 if (framesz == 0 && !use_extend)
1957 framesz = 128;
1958
1959 infprintf (is, "%s%d", need_comma ? "," : "", framesz);
1960
1961 if (l & 0x40) /* $ra */
1962 infprintf (is, ",%s", mips_gpr_names[31]);
1963
1964 nsreg = (l >> 24) & 0x7;
1965 smask = 0;
1966 if (l & 0x20) /* $s0 */
1967 smask |= 1 << 0;
1968 if (l & 0x10) /* $s1 */
1969 smask |= 1 << 1;
1970 if (nsreg > 0) /* $s2-$s8 */
1971 smask |= ((1 << nsreg) - 1) << 2;
1972
1973 /* Find first set static reg bit. */
1974 for (i = 0; i < 9; i++)
1975 {
1976 if (smask & (1 << i))
1977 {
1978 infprintf (is, ",%s", mips_gpr_names[i == 8 ? 30 : (16 + i)]);
1979 /* Skip over string of set bits. */
1980 for (j = i; smask & (2 << j); j++)
1981 continue;
1982 if (j > i)
1983 infprintf (is, "-%s", mips_gpr_names[j == 8 ? 30 : (16 + j)]);
1984 i = j + 1;
1985 }
1986 }
1987
1988 /* Statics $ax - $a3. */
1989 if (statics == 1)
1990 infprintf (is, ",%s", mips_gpr_names[7]);
1991 else if (statics > 0)
1992 infprintf (is, ",%s-%s",
1993 mips_gpr_names[7 - statics + 1],
1994 mips_gpr_names[7]);
1995 }
1996 break;
1997
1998 default:
1999 /* xgettext:c-format */
2000 infprintf (is,
2001 _("# internal disassembler error, "
2002 "unrecognised modifier (%c)"),
2003 type);
2004 abort ();
2005 }
2006 }
2007
2008 /* Disassemble mips16 instructions. */
2009
2010 static int
2011 print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
2012 {
2013 const fprintf_ftype infprintf = info->fprintf_func;
2014 int status;
2015 bfd_byte buffer[2];
2016 int length;
2017 int insn;
2018 bfd_boolean use_extend;
2019 int extend = 0;
2020 const struct mips_opcode *op, *opend;
2021 void *is = info->stream;
2022
2023 info->bytes_per_chunk = 2;
2024 info->display_endian = info->endian;
2025 info->insn_info_valid = 1;
2026 info->branch_delay_insns = 0;
2027 info->data_size = 0;
2028 info->insn_type = dis_nonbranch;
2029 info->target = 0;
2030 info->target2 = 0;
2031
2032 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2033 if (status != 0)
2034 {
2035 (*info->memory_error_func) (status, memaddr, info);
2036 return -1;
2037 }
2038
2039 length = 2;
2040
2041 if (info->endian == BFD_ENDIAN_BIG)
2042 insn = bfd_getb16 (buffer);
2043 else
2044 insn = bfd_getl16 (buffer);
2045
2046 /* Handle the extend opcode specially. */
2047 use_extend = FALSE;
2048 if ((insn & 0xf800) == 0xf000)
2049 {
2050 use_extend = TRUE;
2051 extend = insn & 0x7ff;
2052
2053 memaddr += 2;
2054
2055 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2056 if (status != 0)
2057 {
2058 infprintf (is, "extend 0x%x", (unsigned int) extend);
2059 (*info->memory_error_func) (status, memaddr, info);
2060 return -1;
2061 }
2062
2063 if (info->endian == BFD_ENDIAN_BIG)
2064 insn = bfd_getb16 (buffer);
2065 else
2066 insn = bfd_getl16 (buffer);
2067
2068 /* Check for an extend opcode followed by an extend opcode. */
2069 if ((insn & 0xf800) == 0xf000)
2070 {
2071 infprintf (is, "extend 0x%x", (unsigned int) extend);
2072 info->insn_type = dis_noninsn;
2073 return length;
2074 }
2075
2076 length += 2;
2077 }
2078
2079 /* FIXME: Should probably use a hash table on the major opcode here. */
2080
2081 opend = mips16_opcodes + bfd_mips16_num_opcodes;
2082 for (op = mips16_opcodes; op < opend; op++)
2083 {
2084 if (op->pinfo != INSN_MACRO
2085 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
2086 && (insn & op->mask) == op->match)
2087 {
2088 const char *s;
2089
2090 if (strchr (op->args, 'a') != NULL)
2091 {
2092 if (use_extend)
2093 {
2094 infprintf (is, "extend 0x%x", (unsigned int) extend);
2095 info->insn_type = dis_noninsn;
2096 return length - 2;
2097 }
2098
2099 use_extend = FALSE;
2100
2101 memaddr += 2;
2102
2103 status = (*info->read_memory_func) (memaddr, buffer, 2,
2104 info);
2105 if (status == 0)
2106 {
2107 use_extend = TRUE;
2108 if (info->endian == BFD_ENDIAN_BIG)
2109 extend = bfd_getb16 (buffer);
2110 else
2111 extend = bfd_getl16 (buffer);
2112 length += 2;
2113 }
2114 }
2115
2116 infprintf (is, "%s", op->name);
2117 if (op->args[0] != '\0')
2118 infprintf (is, "\t");
2119
2120 for (s = op->args; *s != '\0'; s++)
2121 {
2122 if (*s == ','
2123 && s[1] == 'w'
2124 && GET_OP (insn, RX) == GET_OP (insn, RY))
2125 {
2126 /* Skip the register and the comma. */
2127 ++s;
2128 continue;
2129 }
2130 if (*s == ','
2131 && s[1] == 'v'
2132 && GET_OP (insn, RZ) == GET_OP (insn, RX))
2133 {
2134 /* Skip the register and the comma. */
2135 ++s;
2136 continue;
2137 }
2138 print_mips16_insn_arg (*s, op, insn, use_extend, extend, memaddr,
2139 info);
2140 }
2141
2142 /* Figure out branch instruction type and delay slot information. */
2143 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2144 info->branch_delay_insns = 1;
2145 if ((op->pinfo & (INSN_UNCOND_BRANCH_DELAY
2146 | MIPS16_INSN_UNCOND_BRANCH)) != 0)
2147 {
2148 if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2149 info->insn_type = dis_jsr;
2150 else
2151 info->insn_type = dis_branch;
2152 }
2153 else if ((op->pinfo & MIPS16_INSN_COND_BRANCH) != 0)
2154 info->insn_type = dis_condbranch;
2155
2156 return length;
2157 }
2158 }
2159 #undef GET_OP_S
2160 #undef GET_OP
2161
2162 if (use_extend)
2163 infprintf (is, "0x%x", extend | 0xf000);
2164 infprintf (is, "0x%x", insn);
2165 info->insn_type = dis_noninsn;
2166
2167 return length;
2168 }
2169
2170 /* Disassemble microMIPS instructions. */
2171
2172 static int
2173 print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
2174 {
2175 const fprintf_ftype infprintf = info->fprintf_func;
2176 const struct mips_opcode *op, *opend;
2177 unsigned int lsb, msbd, msb;
2178 void *is = info->stream;
2179 unsigned int regno;
2180 bfd_byte buffer[2];
2181 int lastregno = 0;
2182 int higher;
2183 int length;
2184 int status;
2185 int delta;
2186 int immed;
2187 int insn;
2188
2189 lsb = 0;
2190
2191 info->bytes_per_chunk = 2;
2192 info->display_endian = info->endian;
2193 info->insn_info_valid = 1;
2194 info->branch_delay_insns = 0;
2195 info->data_size = 0;
2196 info->insn_type = dis_nonbranch;
2197 info->target = 0;
2198 info->target2 = 0;
2199
2200 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2201 if (status != 0)
2202 {
2203 (*info->memory_error_func) (status, memaddr, info);
2204 return -1;
2205 }
2206
2207 length = 2;
2208
2209 if (info->endian == BFD_ENDIAN_BIG)
2210 insn = bfd_getb16 (buffer);
2211 else
2212 insn = bfd_getl16 (buffer);
2213
2214 if ((insn & 0xfc00) == 0x7c00)
2215 {
2216 /* This is a 48-bit microMIPS instruction. */
2217 higher = insn;
2218
2219 status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2220 if (status != 0)
2221 {
2222 infprintf (is, "micromips 0x%x", higher);
2223 (*info->memory_error_func) (status, memaddr + 2, info);
2224 return -1;
2225 }
2226 if (info->endian == BFD_ENDIAN_BIG)
2227 insn = bfd_getb16 (buffer);
2228 else
2229 insn = bfd_getl16 (buffer);
2230 higher = (higher << 16) | insn;
2231
2232 status = (*info->read_memory_func) (memaddr + 4, buffer, 2, info);
2233 if (status != 0)
2234 {
2235 infprintf (is, "micromips 0x%x", higher);
2236 (*info->memory_error_func) (status, memaddr + 4, info);
2237 return -1;
2238 }
2239 if (info->endian == BFD_ENDIAN_BIG)
2240 insn = bfd_getb16 (buffer);
2241 else
2242 insn = bfd_getl16 (buffer);
2243 infprintf (is, "0x%x%04x (48-bit insn)", higher, insn);
2244
2245 info->insn_type = dis_noninsn;
2246 return 6;
2247 }
2248 else if ((insn & 0x1c00) == 0x0000 || (insn & 0x1000) == 0x1000)
2249 {
2250 /* This is a 32-bit microMIPS instruction. */
2251 higher = insn;
2252
2253 status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2254 if (status != 0)
2255 {
2256 infprintf (is, "micromips 0x%x", higher);
2257 (*info->memory_error_func) (status, memaddr + 2, info);
2258 return -1;
2259 }
2260
2261 if (info->endian == BFD_ENDIAN_BIG)
2262 insn = bfd_getb16 (buffer);
2263 else
2264 insn = bfd_getl16 (buffer);
2265
2266 insn = insn | (higher << 16);
2267
2268 length += 2;
2269 }
2270
2271 /* FIXME: Should probably use a hash table on the major opcode here. */
2272
2273 #define GET_OP(insn, field) \
2274 (((insn) >> MICROMIPSOP_SH_##field) & MICROMIPSOP_MASK_##field)
2275 #define GET_OP_S(insn, field) \
2276 ((GET_OP (insn, field) ^ ((MICROMIPSOP_MASK_##field >> 1) + 1)) \
2277 - ((MICROMIPSOP_MASK_##field >> 1) + 1))
2278 opend = micromips_opcodes + bfd_micromips_num_opcodes;
2279 for (op = micromips_opcodes; op < opend; op++)
2280 {
2281 if (op->pinfo != INSN_MACRO
2282 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
2283 && (insn & op->mask) == op->match
2284 && ((length == 2 && (op->mask & 0xffff0000) == 0)
2285 || (length == 4 && (op->mask & 0xffff0000) != 0)))
2286 {
2287 const char *s;
2288
2289 infprintf (is, "%s", op->name);
2290 if (op->args[0] != '\0')
2291 infprintf (is, "\t");
2292
2293 for (s = op->args; *s != '\0'; s++)
2294 {
2295 switch (*s)
2296 {
2297 case ',':
2298 case '(':
2299 case ')':
2300 infprintf (is, "%c", *s);
2301 break;
2302
2303 case '.':
2304 infprintf (is, "%d", GET_OP_S (insn, OFFSET10));
2305 break;
2306
2307 case '1':
2308 infprintf (is, "0x%x", GET_OP (insn, STYPE));
2309 break;
2310
2311 case '2':
2312 infprintf (is, "0x%x", GET_OP (insn, BP));
2313 break;
2314
2315 case '3':
2316 infprintf (is, "0x%x", GET_OP (insn, SA3));
2317 break;
2318
2319 case '4':
2320 infprintf (is, "0x%x", GET_OP (insn, SA4));
2321 break;
2322
2323 case '5':
2324 infprintf (is, "0x%x", GET_OP (insn, IMM8));
2325 break;
2326
2327 case '6':
2328 infprintf (is, "0x%x", GET_OP (insn, RS));
2329 break;
2330
2331 case '7':
2332 infprintf (is, "$ac%d", GET_OP (insn, DSPACC));
2333 break;
2334
2335 case '8':
2336 infprintf (is, "0x%x", GET_OP (insn, WRDSP));
2337 break;
2338
2339 case '0': /* DSP 6-bit signed immediate in bit 16. */
2340 delta = (GET_OP (insn, DSPSFT) ^ 0x20) - 0x20;
2341 infprintf (is, "%d", delta);
2342 break;
2343
2344 case '<':
2345 infprintf (is, "0x%x", GET_OP (insn, SHAMT));
2346 break;
2347
2348 case '\\':
2349 infprintf (is, "0x%x", GET_OP (insn, 3BITPOS));
2350 break;
2351
2352 case '^':
2353 infprintf (is, "0x%x", GET_OP (insn, RD));
2354 break;
2355
2356 case '|':
2357 infprintf (is, "0x%x", GET_OP (insn, TRAP));
2358 break;
2359
2360 case '~':
2361 infprintf (is, "%d", GET_OP_S (insn, OFFSET12));
2362 break;
2363
2364 case 'a':
2365 if (strcmp (op->name, "jalx") == 0)
2366 info->target = (((memaddr + 4) & ~(bfd_vma) 0x0fffffff)
2367 | (GET_OP (insn, TARGET) << 2));
2368 else
2369 info->target = (((memaddr + 4) & ~(bfd_vma) 0x07ffffff)
2370 | (GET_OP (insn, TARGET) << 1));
2371 /* For gdb disassembler, force odd address on jalx. */
2372 if (info->flavour == bfd_target_unknown_flavour
2373 && strcmp (op->name, "jalx") == 0)
2374 info->target |= 1;
2375 (*info->print_address_func) (info->target, info);
2376 break;
2377
2378 case 'b':
2379 case 'r':
2380 case 's':
2381 case 'v':
2382 infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS)]);
2383 break;
2384
2385 case 'c':
2386 infprintf (is, "0x%x", GET_OP (insn, CODE));
2387 break;
2388
2389 case 'd':
2390 infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RD)]);
2391 break;
2392
2393 case 'h':
2394 infprintf (is, "0x%x", GET_OP (insn, PREFX));
2395 break;
2396
2397 case 'i':
2398 case 'u':
2399 infprintf (is, "0x%x", GET_OP (insn, IMMEDIATE));
2400 break;
2401
2402 case 'j': /* Same as i, but sign-extended. */
2403 case 'o':
2404 infprintf (is, "%d", GET_OP_S (insn, DELTA));
2405 break;
2406
2407 case 'k':
2408 infprintf (is, "0x%x", GET_OP (insn, CACHE));
2409 break;
2410
2411 case 'n':
2412 {
2413 int s_reg_encode;
2414
2415 immed = GET_OP (insn, RT);
2416 s_reg_encode = immed & 0xf;
2417 if (s_reg_encode != 0)
2418 {
2419 if (s_reg_encode == 1)
2420 infprintf (is, "%s", mips_gpr_names[16]);
2421 else if (s_reg_encode < 9)
2422 infprintf (is, "%s-%s",
2423 mips_gpr_names[16],
2424 mips_gpr_names[15 + s_reg_encode]);
2425 else if (s_reg_encode == 9)
2426 infprintf (is, "%s-%s,%s",
2427 mips_gpr_names[16],
2428 mips_gpr_names[23],
2429 mips_gpr_names[30]);
2430 else
2431 infprintf (is, "UNKNOWN");
2432 }
2433
2434 if (immed & 0x10) /* For ra. */
2435 {
2436 if (s_reg_encode == 0)
2437 infprintf (is, "%s", mips_gpr_names[31]);
2438 else
2439 infprintf (is, ",%s", mips_gpr_names[31]);
2440 }
2441 break;
2442 }
2443
2444 case 'p':
2445 /* Sign-extend the displacement. */
2446 delta = GET_OP_S (insn, DELTA);
2447 info->target = (delta << 1) + memaddr + length;
2448 (*info->print_address_func) (info->target, info);
2449 break;
2450
2451 case 'q':
2452 infprintf (is, "0x%x", GET_OP (insn, CODE2));
2453 break;
2454
2455 case 't':
2456 case 'w':
2457 infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RT)]);
2458 break;
2459
2460 case 'y':
2461 infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS3)]);
2462 break;
2463
2464 case 'z':
2465 infprintf (is, "%s", mips_gpr_names[0]);
2466 break;
2467
2468 case '@': /* DSP 10-bit signed immediate in bit 16. */
2469 delta = (GET_OP (insn, IMM10) ^ 0x200) - 0x200;
2470 infprintf (is, "%d", delta);
2471 break;
2472
2473 case 'B':
2474 infprintf (is, "0x%x", GET_OP (insn, CODE10));
2475 break;
2476
2477 case 'C':
2478 infprintf (is, "0x%x", GET_OP (insn, COPZ));
2479 break;
2480
2481 case 'D':
2482 infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FD)]);
2483 break;
2484
2485 case 'E':
2486 /* Coprocessor register for lwcN instructions, et al.
2487
2488 Note that there is no load/store cp0 instructions, and
2489 that FPU (cp1) instructions disassemble this field using
2490 'T' format. Therefore, until we gain understanding of
2491 cp2 register names, we can simply print the register
2492 numbers. */
2493 infprintf (is, "$%d", GET_OP (insn, RT));
2494 break;
2495
2496 case 'G':
2497 /* Coprocessor register for mtcN instructions, et al. Note
2498 that FPU (cp1) instructions disassemble this field using
2499 'S' format. Therefore, we only need to worry about cp0,
2500 cp2, and cp3.
2501 The microMIPS encoding does not have a coprocessor
2502 identifier field as such, so we must work out the
2503 coprocessor number by looking at the opcode. */
2504 switch (insn
2505 & ~((MICROMIPSOP_MASK_RT << MICROMIPSOP_SH_RT)
2506 | (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS)))
2507 {
2508 case 0x000000fc: /* mfc0 */
2509 case 0x000002fc: /* mtc0 */
2510 case 0x580000fc: /* dmfc0 */
2511 case 0x580002fc: /* dmtc0 */
2512 infprintf (is, "%s", mips_cp0_names[GET_OP (insn, RS)]);
2513 break;
2514 default:
2515 infprintf (is, "$%d", GET_OP (insn, RS));
2516 break;
2517 }
2518 break;
2519
2520 case 'H':
2521 infprintf (is, "%d", GET_OP (insn, SEL));
2522 break;
2523
2524 case 'K':
2525 infprintf (is, "%s", mips_hwr_names[GET_OP (insn, RS)]);
2526 break;
2527
2528 case 'M':
2529 infprintf (is, "$fcc%d", GET_OP (insn, CCC));
2530 break;
2531
2532 case 'N':
2533 infprintf (is,
2534 (op->pinfo & (FP_D | FP_S)) != 0
2535 ? "$fcc%d" : "$cc%d",
2536 GET_OP (insn, BCC));
2537 break;
2538
2539 case 'R':
2540 infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FR)]);
2541 break;
2542
2543 case 'S':
2544 case 'V':
2545 infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FS)]);
2546 break;
2547
2548 case 'T':
2549 infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FT)]);
2550 break;
2551
2552 case '+':
2553 /* Extension character; switch for second char. */
2554 s++;
2555 switch (*s)
2556 {
2557 case 'A':
2558 lsb = GET_OP (insn, EXTLSB);
2559 infprintf (is, "0x%x", lsb);
2560 break;
2561
2562 case 'B':
2563 msb = GET_OP (insn, INSMSB);
2564 infprintf (is, "0x%x", msb - lsb + 1);
2565 break;
2566
2567 case 'C':
2568 case 'H':
2569 msbd = GET_OP (insn, EXTMSBD);
2570 infprintf (is, "0x%x", msbd + 1);
2571 break;
2572
2573 case 'D':
2574 {
2575 const struct mips_cp0sel_name *n;
2576 unsigned int cp0reg, sel;
2577
2578 cp0reg = GET_OP (insn, RS);
2579 sel = GET_OP (insn, SEL);
2580
2581 /* CP0 register including 'sel' code for mtcN
2582 (et al.), to be printed textually if known.
2583 If not known, print both CP0 register name and
2584 sel numerically since CP0 register with sel 0 may
2585 have a name unrelated to register being printed. */
2586 n = lookup_mips_cp0sel_name (mips_cp0sel_names,
2587 mips_cp0sel_names_len,
2588 cp0reg, sel);
2589 if (n != NULL)
2590 infprintf (is, "%s", n->name);
2591 else
2592 infprintf (is, "$%d,%d", cp0reg, sel);
2593 break;
2594 }
2595
2596 case 'E':
2597 lsb = GET_OP (insn, EXTLSB) + 32;
2598 infprintf (is, "0x%x", lsb);
2599 break;
2600
2601 case 'F':
2602 msb = GET_OP (insn, INSMSB) + 32;
2603 infprintf (is, "0x%x", msb - lsb + 1);
2604 break;
2605
2606 case 'G':
2607 msbd = GET_OP (insn, EXTMSBD) + 32;
2608 infprintf (is, "0x%x", msbd + 1);
2609 break;
2610
2611 default:
2612 /* xgettext:c-format */
2613 infprintf (is,
2614 _("# internal disassembler error, "
2615 "unrecognized modifier (+%c)"),
2616 *s);
2617 abort ();
2618 }
2619 break;
2620
2621 case 'm':
2622 /* Extension character; switch for second char. */
2623 s++;
2624 switch (*s)
2625 {
2626 case 'a': /* global pointer. */
2627 infprintf (is, "%s", mips_gpr_names[28]);
2628 break;
2629
2630 case 'b':
2631 regno = micromips_to_32_reg_b_map[GET_OP (insn, MB)];
2632 infprintf (is, "%s", mips_gpr_names[regno]);
2633 break;
2634
2635 case 'c':
2636 regno = micromips_to_32_reg_c_map[GET_OP (insn, MC)];
2637 infprintf (is, "%s", mips_gpr_names[regno]);
2638 break;
2639
2640 case 'd':
2641 regno = micromips_to_32_reg_d_map[GET_OP (insn, MD)];
2642 infprintf (is, "%s", mips_gpr_names[regno]);
2643 break;
2644
2645 case 'e':
2646 regno = micromips_to_32_reg_e_map[GET_OP (insn, ME)];
2647 infprintf (is, "%s", mips_gpr_names[regno]);
2648 break;
2649
2650 case 'f':
2651 /* Save lastregno for "mt" to print out later. */
2652 lastregno = micromips_to_32_reg_f_map[GET_OP (insn, MF)];
2653 infprintf (is, "%s", mips_gpr_names[lastregno]);
2654 break;
2655
2656 case 'g':
2657 regno = micromips_to_32_reg_g_map[GET_OP (insn, MG)];
2658 infprintf (is, "%s", mips_gpr_names[regno]);
2659 break;
2660
2661 case 'h':
2662 regno = micromips_to_32_reg_h_map[GET_OP (insn, MH)];
2663 infprintf (is, "%s", mips_gpr_names[regno]);
2664 break;
2665
2666 case 'i':
2667 regno = micromips_to_32_reg_i_map[GET_OP (insn, MI)];
2668 infprintf (is, "%s", mips_gpr_names[regno]);
2669 break;
2670
2671 case 'j':
2672 infprintf (is, "%s", mips_gpr_names[GET_OP (insn, MJ)]);
2673 break;
2674
2675 case 'l':
2676 regno = micromips_to_32_reg_l_map[GET_OP (insn, ML)];
2677 infprintf (is, "%s", mips_gpr_names[regno]);
2678 break;
2679
2680 case 'm':
2681 regno = micromips_to_32_reg_m_map[GET_OP (insn, MM)];
2682 infprintf (is, "%s", mips_gpr_names[regno]);
2683 break;
2684
2685 case 'n':
2686 regno = micromips_to_32_reg_n_map[GET_OP (insn, MN)];
2687 infprintf (is, "%s", mips_gpr_names[regno]);
2688 break;
2689
2690 case 'p':
2691 /* Save lastregno for "mt" to print out later. */
2692 lastregno = GET_OP (insn, MP);
2693 infprintf (is, "%s", mips_gpr_names[lastregno]);
2694 break;
2695
2696 case 'q':
2697 regno = micromips_to_32_reg_q_map[GET_OP (insn, MQ)];
2698 infprintf (is, "%s", mips_gpr_names[regno]);
2699 break;
2700
2701 case 'r': /* program counter. */
2702 infprintf (is, "$pc");
2703 break;
2704
2705 case 's': /* stack pointer. */
2706 lastregno = 29;
2707 infprintf (is, "%s", mips_gpr_names[29]);
2708 break;
2709
2710 case 't':
2711 infprintf (is, "%s", mips_gpr_names[lastregno]);
2712 break;
2713
2714 case 'z': /* $0. */
2715 infprintf (is, "%s", mips_gpr_names[0]);
2716 break;
2717
2718 case 'A':
2719 /* Sign-extend the immediate. */
2720 immed = GET_OP_S (insn, IMMA) << 2;
2721 infprintf (is, "%d", immed);
2722 break;
2723
2724 case 'B':
2725 immed = micromips_imm_b_map[GET_OP (insn, IMMB)];
2726 infprintf (is, "%d", immed);
2727 break;
2728
2729 case 'C':
2730 immed = micromips_imm_c_map[GET_OP (insn, IMMC)];
2731 infprintf (is, "0x%x", immed);
2732 break;
2733
2734 case 'D':
2735 /* Sign-extend the displacement. */
2736 delta = GET_OP_S (insn, IMMD);
2737 info->target = (delta << 1) + memaddr + length;
2738 (*info->print_address_func) (info->target, info);
2739 break;
2740
2741 case 'E':
2742 /* Sign-extend the displacement. */
2743 delta = GET_OP_S (insn, IMME);
2744 info->target = (delta << 1) + memaddr + length;
2745 (*info->print_address_func) (info->target, info);
2746 break;
2747
2748 case 'F':
2749 immed = GET_OP (insn, IMMF);
2750 infprintf (is, "0x%x", immed);
2751 break;
2752
2753 case 'G':
2754 immed = (insn >> MICROMIPSOP_SH_IMMG) + 1;
2755 immed = (immed & MICROMIPSOP_MASK_IMMG) - 1;
2756 infprintf (is, "%d", immed);
2757 break;
2758
2759 case 'H':
2760 immed = GET_OP (insn, IMMH) << 1;
2761 infprintf (is, "%d", immed);
2762 break;
2763
2764 case 'I':
2765 immed = (insn >> MICROMIPSOP_SH_IMMI) + 1;
2766 immed = (immed & MICROMIPSOP_MASK_IMMI) - 1;
2767 infprintf (is, "%d", immed);
2768 break;
2769
2770 case 'J':
2771 immed = GET_OP (insn, IMMJ) << 2;
2772 infprintf (is, "%d", immed);
2773 break;
2774
2775 case 'L':
2776 immed = GET_OP (insn, IMML);
2777 infprintf (is, "%d", immed);
2778 break;
2779
2780 case 'M':
2781 immed = (insn >> MICROMIPSOP_SH_IMMM) - 1;
2782 immed = (immed & MICROMIPSOP_MASK_IMMM) + 1;
2783 infprintf (is, "%d", immed);
2784 break;
2785
2786 case 'N':
2787 immed = GET_OP (insn, IMMN);
2788 if (immed == 0)
2789 infprintf (is, "%s,%s",
2790 mips_gpr_names[16],
2791 mips_gpr_names[31]);
2792 else
2793 infprintf (is, "%s-%s,%s",
2794 mips_gpr_names[16],
2795 mips_gpr_names[16 + immed],
2796 mips_gpr_names[31]);
2797 break;
2798
2799 case 'O':
2800 immed = GET_OP (insn, IMMO);
2801 infprintf (is, "0x%x", immed);
2802 break;
2803
2804 case 'P':
2805 immed = GET_OP (insn, IMMP) << 2;
2806 infprintf (is, "%d", immed);
2807 break;
2808
2809 case 'Q':
2810 /* Sign-extend the immediate. */
2811 immed = GET_OP_S (insn, IMMQ) << 2;
2812 infprintf (is, "%d", immed);
2813 break;
2814
2815 case 'U':
2816 immed = GET_OP (insn, IMMU) << 2;
2817 infprintf (is, "%d", immed);
2818 break;
2819
2820 case 'W':
2821 immed = GET_OP (insn, IMMW) << 2;
2822 infprintf (is, "%d", immed);
2823 break;
2824
2825 case 'X':
2826 /* Sign-extend the immediate. */
2827 immed = GET_OP_S (insn, IMMX);
2828 infprintf (is, "%d", immed);
2829 break;
2830
2831 case 'Y':
2832 /* Sign-extend the immediate. */
2833 immed = GET_OP_S (insn, IMMY) << 2;
2834 if ((unsigned int) (immed + 8) < 16)
2835 immed ^= 0x400;
2836 infprintf (is, "%d", immed);
2837 break;
2838
2839 default:
2840 /* xgettext:c-format */
2841 infprintf (is,
2842 _("# internal disassembler error, "
2843 "unrecognized modifier (m%c)"),
2844 *s);
2845 abort ();
2846 }
2847 break;
2848
2849 default:
2850 /* xgettext:c-format */
2851 infprintf (is,
2852 _("# internal disassembler error, "
2853 "unrecognized modifier (%c)"),
2854 *s);
2855 abort ();
2856 }
2857 }
2858
2859 /* Figure out instruction type and branch delay information. */
2860 if ((op->pinfo
2861 & (INSN_UNCOND_BRANCH_DELAY | INSN_COND_BRANCH_DELAY)) != 0)
2862 info->branch_delay_insns = 1;
2863 if (((op->pinfo & INSN_UNCOND_BRANCH_DELAY)
2864 | (op->pinfo2 & INSN2_UNCOND_BRANCH)) != 0)
2865 {
2866 if ((op->pinfo & (INSN_WRITE_GPR_31 | INSN_WRITE_GPR_T)) != 0)
2867 info->insn_type = dis_jsr;
2868 else
2869 info->insn_type = dis_branch;
2870 }
2871 else if (((op->pinfo & INSN_COND_BRANCH_DELAY)
2872 | (op->pinfo2 & INSN2_COND_BRANCH)) != 0)
2873 {
2874 if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2875 info->insn_type = dis_condjsr;
2876 else
2877 info->insn_type = dis_condbranch;
2878 }
2879 else if ((op->pinfo
2880 & (INSN_STORE_MEMORY | INSN_LOAD_MEMORY_DELAY)) != 0)
2881 info->insn_type = dis_dref;
2882
2883 return length;
2884 }
2885 }
2886 #undef GET_OP_S
2887 #undef GET_OP
2888
2889 infprintf (is, "0x%x", insn);
2890 info->insn_type = dis_noninsn;
2891
2892 return length;
2893 }
2894
2895 /* Return 1 if a symbol associated with the location being disassembled
2896 indicates a compressed (MIPS16 or microMIPS) mode. We iterate over
2897 all the symbols at the address being considered assuming if at least
2898 one of them indicates code compression, then such code has been
2899 genuinely produced here (other symbols could have been derived from
2900 function symbols defined elsewhere or could define data). Otherwise,
2901 return 0. */
2902
2903 static bfd_boolean
2904 is_compressed_mode_p (struct disassemble_info *info)
2905 {
2906 elf_symbol_type *symbol;
2907 int pos;
2908 int i;
2909
2910 for (i = 0; i < info->num_symbols; i++)
2911 {
2912 pos = info->symtab_pos + i;
2913
2914 if (bfd_asymbol_flavour (info->symtab[pos]) != bfd_target_elf_flavour)
2915 continue;
2916
2917 symbol = (elf_symbol_type *) info->symtab[pos];
2918 if ((!micromips_ase
2919 && ELF_ST_IS_MIPS16 (symbol->internal_elf_sym.st_other))
2920 || (micromips_ase
2921 && ELF_ST_IS_MICROMIPS (symbol->internal_elf_sym.st_other)))
2922 return 1;
2923 }
2924
2925 return 0;
2926 }
2927
2928 /* In an environment where we do not know the symbol type of the
2929 instruction we are forced to assume that the low order bit of the
2930 instructions' address may mark it as a mips16 instruction. If we
2931 are single stepping, or the pc is within the disassembled function,
2932 this works. Otherwise, we need a clue. Sometimes. */
2933
2934 static int
2935 _print_insn_mips (bfd_vma memaddr,
2936 struct disassemble_info *info,
2937 enum bfd_endian endianness)
2938 {
2939 int (*print_insn_compr) (bfd_vma, struct disassemble_info *);
2940 bfd_byte buffer[INSNLEN];
2941 int status;
2942
2943 set_default_mips_dis_options (info);
2944 parse_mips_dis_options (info->disassembler_options);
2945
2946 if (info->mach == bfd_mach_mips16)
2947 return print_insn_mips16 (memaddr, info);
2948 if (info->mach == bfd_mach_mips_micromips)
2949 return print_insn_micromips (memaddr, info);
2950
2951 print_insn_compr = !micromips_ase ? print_insn_mips16 : print_insn_micromips;
2952
2953 #if 1
2954 /* FIXME: If odd address, this is CLEARLY a compressed instruction. */
2955 /* Only a few tools will work this way. */
2956 if (memaddr & 0x01)
2957 return print_insn_compr (memaddr, info);
2958 #endif
2959
2960 #if SYMTAB_AVAILABLE
2961 if (is_compressed_mode_p (info))
2962 return print_insn_compr (memaddr, info);
2963 #endif
2964
2965 status = (*info->read_memory_func) (memaddr, buffer, INSNLEN, info);
2966 if (status == 0)
2967 {
2968 int insn;
2969
2970 if (endianness == BFD_ENDIAN_BIG)
2971 insn = bfd_getb32 (buffer);
2972 else
2973 insn = bfd_getl32 (buffer);
2974
2975 return print_insn_mips (memaddr, insn, info);
2976 }
2977 else
2978 {
2979 (*info->memory_error_func) (status, memaddr, info);
2980 return -1;
2981 }
2982 }
2983
2984 int
2985 print_insn_big_mips (bfd_vma memaddr, struct disassemble_info *info)
2986 {
2987 return _print_insn_mips (memaddr, info, BFD_ENDIAN_BIG);
2988 }
2989
2990 int
2991 print_insn_little_mips (bfd_vma memaddr, struct disassemble_info *info)
2992 {
2993 return _print_insn_mips (memaddr, info, BFD_ENDIAN_LITTLE);
2994 }
2995 \f
2996 void
2997 print_mips_disassembler_options (FILE *stream)
2998 {
2999 unsigned int i;
3000
3001 fprintf (stream, _("\n\
3002 The following MIPS specific disassembler options are supported for use\n\
3003 with the -M switch (multiple options should be separated by commas):\n"));
3004
3005 fprintf (stream, _("\n\
3006 gpr-names=ABI Print GPR names according to specified ABI.\n\
3007 Default: based on binary being disassembled.\n"));
3008
3009 fprintf (stream, _("\n\
3010 fpr-names=ABI Print FPR names according to specified ABI.\n\
3011 Default: numeric.\n"));
3012
3013 fprintf (stream, _("\n\
3014 cp0-names=ARCH Print CP0 register names according to\n\
3015 specified architecture.\n\
3016 Default: based on binary being disassembled.\n"));
3017
3018 fprintf (stream, _("\n\
3019 hwr-names=ARCH Print HWR names according to specified \n\
3020 architecture.\n\
3021 Default: based on binary being disassembled.\n"));
3022
3023 fprintf (stream, _("\n\
3024 reg-names=ABI Print GPR and FPR names according to\n\
3025 specified ABI.\n"));
3026
3027 fprintf (stream, _("\n\
3028 reg-names=ARCH Print CP0 register and HWR names according to\n\
3029 specified architecture.\n"));
3030
3031 fprintf (stream, _("\n\
3032 For the options above, the following values are supported for \"ABI\":\n\
3033 "));
3034 for (i = 0; i < ARRAY_SIZE (mips_abi_choices); i++)
3035 fprintf (stream, " %s", mips_abi_choices[i].name);
3036 fprintf (stream, _("\n"));
3037
3038 fprintf (stream, _("\n\
3039 For the options above, The following values are supported for \"ARCH\":\n\
3040 "));
3041 for (i = 0; i < ARRAY_SIZE (mips_arch_choices); i++)
3042 if (*mips_arch_choices[i].name != '\0')
3043 fprintf (stream, " %s", mips_arch_choices[i].name);
3044 fprintf (stream, _("\n"));
3045
3046 fprintf (stream, _("\n"));
3047 }