ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/mon/src/disass/mips-dis.c
Revision: 1.1
Committed: 2007-06-07T09:51:56Z (16 years, 11 months ago) by gbeauche
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Log Message:
Add MIPS disassembler invoked as "dm" and "dmel" (little-endian) for now.

File Contents

# Content
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
4 Free Software Foundation, Inc.
5 Contributed by Nobuyuki Hikichi(hikichi@sra.co.jp).
6
7 This file is part of GDB, GAS, and the GNU binutils.
8
9 This program 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 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public 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 "dis-asm.h"
25 #include "mips.h"
26 #include "opintl.h"
27
28
29 #define EMBEDDED_ENV 1
30
31 /* FIXME: the following code snippets are not part of the original
32 binutils disassembler and should be moved elsewhere. */
33
34 #ifndef ARRAY_SIZE
35 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
36 #endif
37
38 static bfd_vma
39 bfd_getb16 (const void *p)
40 {
41 const bfd_byte *addr = p;
42 return (addr[0] << 8) | addr[1];
43 }
44
45 static bfd_vma
46 bfd_getl16 (const void *p)
47 {
48 const bfd_byte *addr = p;
49 return (addr[1] << 8) | addr[0];
50 }
51
52 static bfd_vma
53 bfd_getb32 (const void *p)
54 {
55 const bfd_byte *addr = p;
56 unsigned long v;
57
58 v = (unsigned long) addr[0] << 24;
59 v |= (unsigned long) addr[1] << 16;
60 v |= (unsigned long) addr[2] << 8;
61 v |= (unsigned long) addr[3];
62 return v;
63 }
64
65 static bfd_vma
66 bfd_getl32 (const void *p)
67 {
68 const bfd_byte *addr = p;
69 unsigned long v;
70
71 v = (unsigned long) addr[0];
72 v |= (unsigned long) addr[1] << 8;
73 v |= (unsigned long) addr[2] << 16;
74 v |= (unsigned long) addr[3] << 24;
75 return v;
76 }
77
78
79 /* FIXME: These are needed to figure out if the code is mips16 or
80 not. The low bit of the address is often a good indicator. No
81 symbol table is available when this code runs out in an embedded
82 system as when it is used for disassembler support in a monitor. */
83
84 #if !defined(EMBEDDED_ENV)
85 #define SYMTAB_AVAILABLE 1
86 #include "elf-bfd.h"
87 #include "elf/mips.h"
88 #endif
89
90 /* Mips instructions are at maximum this many bytes long. */
91 #define INSNLEN 4
92
93
94 /* FIXME: These should be shared with gdb somehow. */
95
96 struct mips_cp0sel_name
97 {
98 unsigned int cp0reg;
99 unsigned int sel;
100 const char * const name;
101 };
102
103 /* The mips16 registers. */
104 static const unsigned int mips16_to_32_reg_map[] =
105 {
106 16, 17, 2, 3, 4, 5, 6, 7
107 };
108
109 #define mips16_reg_names(rn) mips_gpr_names[mips16_to_32_reg_map[rn]]
110
111
112 static const char * const mips_gpr_names_numeric[32] =
113 {
114 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
115 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
116 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
117 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
118 };
119
120 static const char * const mips_gpr_names_oldabi[32] =
121 {
122 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
123 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
124 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
125 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
126 };
127
128 static const char * const mips_gpr_names_newabi[32] =
129 {
130 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
131 "a4", "a5", "a6", "a7", "t0", "t1", "t2", "t3",
132 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
133 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
134 };
135
136 static const char * const mips_fpr_names_numeric[32] =
137 {
138 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
139 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
140 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
141 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31"
142 };
143
144 static const char * const mips_fpr_names_32[32] =
145 {
146 "fv0", "fv0f", "fv1", "fv1f", "ft0", "ft0f", "ft1", "ft1f",
147 "ft2", "ft2f", "ft3", "ft3f", "fa0", "fa0f", "fa1", "fa1f",
148 "ft4", "ft4f", "ft5", "ft5f", "fs0", "fs0f", "fs1", "fs1f",
149 "fs2", "fs2f", "fs3", "fs3f", "fs4", "fs4f", "fs5", "fs5f"
150 };
151
152 static const char * const mips_fpr_names_n32[32] =
153 {
154 "fv0", "ft14", "fv1", "ft15", "ft0", "ft1", "ft2", "ft3",
155 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
156 "fa4", "fa5", "fa6", "fa7", "fs0", "ft8", "fs1", "ft9",
157 "fs2", "ft10", "fs3", "ft11", "fs4", "ft12", "fs5", "ft13"
158 };
159
160 static const char * const mips_fpr_names_64[32] =
161 {
162 "fv0", "ft12", "fv1", "ft13", "ft0", "ft1", "ft2", "ft3",
163 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
164 "fa4", "fa5", "fa6", "fa7", "ft8", "ft9", "ft10", "ft11",
165 "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7"
166 };
167
168 static const char * const mips_cp0_names_numeric[32] =
169 {
170 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
171 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
172 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
173 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
174 };
175
176 static const char * const mips_cp0_names_mips3264[32] =
177 {
178 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
179 "c0_context", "c0_pagemask", "c0_wired", "$7",
180 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
181 "c0_status", "c0_cause", "c0_epc", "c0_prid",
182 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
183 "c0_xcontext", "$21", "$22", "c0_debug",
184 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr",
185 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
186 };
187
188 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264[] =
189 {
190 { 16, 1, "c0_config1" },
191 { 16, 2, "c0_config2" },
192 { 16, 3, "c0_config3" },
193 { 18, 1, "c0_watchlo,1" },
194 { 18, 2, "c0_watchlo,2" },
195 { 18, 3, "c0_watchlo,3" },
196 { 18, 4, "c0_watchlo,4" },
197 { 18, 5, "c0_watchlo,5" },
198 { 18, 6, "c0_watchlo,6" },
199 { 18, 7, "c0_watchlo,7" },
200 { 19, 1, "c0_watchhi,1" },
201 { 19, 2, "c0_watchhi,2" },
202 { 19, 3, "c0_watchhi,3" },
203 { 19, 4, "c0_watchhi,4" },
204 { 19, 5, "c0_watchhi,5" },
205 { 19, 6, "c0_watchhi,6" },
206 { 19, 7, "c0_watchhi,7" },
207 { 25, 1, "c0_perfcnt,1" },
208 { 25, 2, "c0_perfcnt,2" },
209 { 25, 3, "c0_perfcnt,3" },
210 { 25, 4, "c0_perfcnt,4" },
211 { 25, 5, "c0_perfcnt,5" },
212 { 25, 6, "c0_perfcnt,6" },
213 { 25, 7, "c0_perfcnt,7" },
214 { 27, 1, "c0_cacheerr,1" },
215 { 27, 2, "c0_cacheerr,2" },
216 { 27, 3, "c0_cacheerr,3" },
217 { 28, 1, "c0_datalo" },
218 { 29, 1, "c0_datahi" }
219 };
220
221 static const char * const mips_cp0_names_mips3264r2[32] =
222 {
223 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
224 "c0_context", "c0_pagemask", "c0_wired", "c0_hwrena",
225 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
226 "c0_status", "c0_cause", "c0_epc", "c0_prid",
227 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
228 "c0_xcontext", "$21", "$22", "c0_debug",
229 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr",
230 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
231 };
232
233 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264r2[] =
234 {
235 { 4, 1, "c0_contextconfig" },
236 { 0, 1, "c0_mvpcontrol" },
237 { 0, 2, "c0_mvpconf0" },
238 { 0, 3, "c0_mvpconf1" },
239 { 1, 1, "c0_vpecontrol" },
240 { 1, 2, "c0_vpeconf0" },
241 { 1, 3, "c0_vpeconf1" },
242 { 1, 4, "c0_yqmask" },
243 { 1, 5, "c0_vpeschedule" },
244 { 1, 6, "c0_vpeschefback" },
245 { 2, 1, "c0_tcstatus" },
246 { 2, 2, "c0_tcbind" },
247 { 2, 3, "c0_tcrestart" },
248 { 2, 4, "c0_tchalt" },
249 { 2, 5, "c0_tccontext" },
250 { 2, 6, "c0_tcschedule" },
251 { 2, 7, "c0_tcschefback" },
252 { 5, 1, "c0_pagegrain" },
253 { 6, 1, "c0_srsconf0" },
254 { 6, 2, "c0_srsconf1" },
255 { 6, 3, "c0_srsconf2" },
256 { 6, 4, "c0_srsconf3" },
257 { 6, 5, "c0_srsconf4" },
258 { 12, 1, "c0_intctl" },
259 { 12, 2, "c0_srsctl" },
260 { 12, 3, "c0_srsmap" },
261 { 15, 1, "c0_ebase" },
262 { 16, 1, "c0_config1" },
263 { 16, 2, "c0_config2" },
264 { 16, 3, "c0_config3" },
265 { 18, 1, "c0_watchlo,1" },
266 { 18, 2, "c0_watchlo,2" },
267 { 18, 3, "c0_watchlo,3" },
268 { 18, 4, "c0_watchlo,4" },
269 { 18, 5, "c0_watchlo,5" },
270 { 18, 6, "c0_watchlo,6" },
271 { 18, 7, "c0_watchlo,7" },
272 { 19, 1, "c0_watchhi,1" },
273 { 19, 2, "c0_watchhi,2" },
274 { 19, 3, "c0_watchhi,3" },
275 { 19, 4, "c0_watchhi,4" },
276 { 19, 5, "c0_watchhi,5" },
277 { 19, 6, "c0_watchhi,6" },
278 { 19, 7, "c0_watchhi,7" },
279 { 23, 1, "c0_tracecontrol" },
280 { 23, 2, "c0_tracecontrol2" },
281 { 23, 3, "c0_usertracedata" },
282 { 23, 4, "c0_tracebpc" },
283 { 25, 1, "c0_perfcnt,1" },
284 { 25, 2, "c0_perfcnt,2" },
285 { 25, 3, "c0_perfcnt,3" },
286 { 25, 4, "c0_perfcnt,4" },
287 { 25, 5, "c0_perfcnt,5" },
288 { 25, 6, "c0_perfcnt,6" },
289 { 25, 7, "c0_perfcnt,7" },
290 { 27, 1, "c0_cacheerr,1" },
291 { 27, 2, "c0_cacheerr,2" },
292 { 27, 3, "c0_cacheerr,3" },
293 { 28, 1, "c0_datalo" },
294 { 28, 2, "c0_taglo1" },
295 { 28, 3, "c0_datalo1" },
296 { 28, 4, "c0_taglo2" },
297 { 28, 5, "c0_datalo2" },
298 { 28, 6, "c0_taglo3" },
299 { 28, 7, "c0_datalo3" },
300 { 29, 1, "c0_datahi" },
301 { 29, 2, "c0_taghi1" },
302 { 29, 3, "c0_datahi1" },
303 { 29, 4, "c0_taghi2" },
304 { 29, 5, "c0_datahi2" },
305 { 29, 6, "c0_taghi3" },
306 { 29, 7, "c0_datahi3" },
307 };
308
309 /* SB-1: MIPS64 (mips_cp0_names_mips3264) with minor mods. */
310 static const char * const mips_cp0_names_sb1[32] =
311 {
312 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1",
313 "c0_context", "c0_pagemask", "c0_wired", "$7",
314 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare",
315 "c0_status", "c0_cause", "c0_epc", "c0_prid",
316 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi",
317 "c0_xcontext", "$21", "$22", "c0_debug",
318 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr_i",
319 "c0_taglo_i", "c0_taghi_i", "c0_errorepc", "c0_desave",
320 };
321
322 static const struct mips_cp0sel_name mips_cp0sel_names_sb1[] =
323 {
324 { 16, 1, "c0_config1" },
325 { 18, 1, "c0_watchlo,1" },
326 { 19, 1, "c0_watchhi,1" },
327 { 22, 0, "c0_perftrace" },
328 { 23, 3, "c0_edebug" },
329 { 25, 1, "c0_perfcnt,1" },
330 { 25, 2, "c0_perfcnt,2" },
331 { 25, 3, "c0_perfcnt,3" },
332 { 25, 4, "c0_perfcnt,4" },
333 { 25, 5, "c0_perfcnt,5" },
334 { 25, 6, "c0_perfcnt,6" },
335 { 25, 7, "c0_perfcnt,7" },
336 { 26, 1, "c0_buserr_pa" },
337 { 27, 1, "c0_cacheerr_d" },
338 { 27, 3, "c0_cacheerr_d_pa" },
339 { 28, 1, "c0_datalo_i" },
340 { 28, 2, "c0_taglo_d" },
341 { 28, 3, "c0_datalo_d" },
342 { 29, 1, "c0_datahi_i" },
343 { 29, 2, "c0_taghi_d" },
344 { 29, 3, "c0_datahi_d" },
345 };
346
347 static const char * const mips_hwr_names_numeric[32] =
348 {
349 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
350 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
351 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
352 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
353 };
354
355 static const char * const mips_hwr_names_mips3264r2[32] =
356 {
357 "hwr_cpunum", "hwr_synci_step", "hwr_cc", "hwr_ccres",
358 "$4", "$5", "$6", "$7",
359 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
360 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
361 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31"
362 };
363
364 struct mips_abi_choice
365 {
366 const char * name;
367 const char * const *gpr_names;
368 const char * const *fpr_names;
369 };
370
371 struct mips_abi_choice mips_abi_choices[] =
372 {
373 { "numeric", mips_gpr_names_numeric, mips_fpr_names_numeric },
374 { "32", mips_gpr_names_oldabi, mips_fpr_names_32 },
375 { "n32", mips_gpr_names_newabi, mips_fpr_names_n32 },
376 { "64", mips_gpr_names_newabi, mips_fpr_names_64 },
377 };
378
379 struct mips_arch_choice
380 {
381 const char *name;
382 int bfd_mach_valid;
383 unsigned long bfd_mach;
384 int processor;
385 int isa;
386 const char * const *cp0_names;
387 const struct mips_cp0sel_name *cp0sel_names;
388 unsigned int cp0sel_names_len;
389 const char * const *hwr_names;
390 };
391
392 const struct mips_arch_choice mips_arch_choices[] =
393 {
394 { "numeric", 0, 0, 0, 0,
395 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
396
397 { "r3000", 1, bfd_mach_mips3000, CPU_R3000, ISA_MIPS1,
398 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
399 { "r3900", 1, bfd_mach_mips3900, CPU_R3900, ISA_MIPS1,
400 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
401 { "r4000", 1, bfd_mach_mips4000, CPU_R4000, ISA_MIPS3,
402 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
403 { "r4010", 1, bfd_mach_mips4010, CPU_R4010, ISA_MIPS2,
404 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
405 { "vr4100", 1, bfd_mach_mips4100, CPU_VR4100, ISA_MIPS3,
406 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
407 { "vr4111", 1, bfd_mach_mips4111, CPU_R4111, ISA_MIPS3,
408 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
409 { "vr4120", 1, bfd_mach_mips4120, CPU_VR4120, ISA_MIPS3,
410 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
411 { "r4300", 1, bfd_mach_mips4300, CPU_R4300, ISA_MIPS3,
412 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
413 { "r4400", 1, bfd_mach_mips4400, CPU_R4400, ISA_MIPS3,
414 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
415 { "r4600", 1, bfd_mach_mips4600, CPU_R4600, ISA_MIPS3,
416 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
417 { "r4650", 1, bfd_mach_mips4650, CPU_R4650, ISA_MIPS3,
418 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
419 { "r5000", 1, bfd_mach_mips5000, CPU_R5000, ISA_MIPS4,
420 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
421 { "vr5400", 1, bfd_mach_mips5400, CPU_VR5400, ISA_MIPS4,
422 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
423 { "vr5500", 1, bfd_mach_mips5500, CPU_VR5500, ISA_MIPS4,
424 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
425 { "r6000", 1, bfd_mach_mips6000, CPU_R6000, ISA_MIPS2,
426 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
427 { "rm7000", 1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4,
428 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
429 { "rm9000", 1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4,
430 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
431 { "r8000", 1, bfd_mach_mips8000, CPU_R8000, ISA_MIPS4,
432 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
433 { "r10000", 1, bfd_mach_mips10000, CPU_R10000, ISA_MIPS4,
434 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
435 { "r12000", 1, bfd_mach_mips12000, CPU_R12000, ISA_MIPS4,
436 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
437 { "mips5", 1, bfd_mach_mips5, CPU_MIPS5, ISA_MIPS5,
438 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
439
440 /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
441 Note that MIPS-3D and MDMX are not applicable to MIPS32. (See
442 _MIPS32 Architecture For Programmers Volume I: Introduction to the
443 MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
444 page 1. */
445 { "mips32", 1, bfd_mach_mipsisa32, CPU_MIPS32,
446 ISA_MIPS32 | INSN_MIPS16 | INSN_SMARTMIPS,
447 mips_cp0_names_mips3264,
448 mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
449 mips_hwr_names_numeric },
450
451 { "mips32r2", 1, bfd_mach_mipsisa32r2, CPU_MIPS32R2,
452 (ISA_MIPS32R2 | INSN_MIPS16 | INSN_SMARTMIPS | INSN_DSP | INSN_MIPS3D
453 | INSN_MT),
454 mips_cp0_names_mips3264r2,
455 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
456 mips_hwr_names_mips3264r2 },
457
458 /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs. */
459 { "mips64", 1, bfd_mach_mipsisa64, CPU_MIPS64,
460 ISA_MIPS64 | INSN_MIPS16 | INSN_MIPS3D | INSN_MDMX,
461 mips_cp0_names_mips3264,
462 mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
463 mips_hwr_names_numeric },
464
465 { "mips64r2", 1, bfd_mach_mipsisa64r2, CPU_MIPS64R2,
466 (ISA_MIPS64R2 | INSN_MIPS16 | INSN_MIPS3D | INSN_DSP | INSN_DSP64
467 | INSN_MT | INSN_MDMX),
468 mips_cp0_names_mips3264r2,
469 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
470 mips_hwr_names_mips3264r2 },
471
472 { "sb1", 1, bfd_mach_mips_sb1, CPU_SB1,
473 ISA_MIPS64 | INSN_MIPS3D | INSN_SB1,
474 mips_cp0_names_sb1,
475 mips_cp0sel_names_sb1, ARRAY_SIZE (mips_cp0sel_names_sb1),
476 mips_hwr_names_numeric },
477
478 /* This entry, mips16, is here only for ISA/processor selection; do
479 not print its name. */
480 { "", 1, bfd_mach_mips16, CPU_MIPS16, ISA_MIPS3 | INSN_MIPS16,
481 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
482 };
483
484 /* ISA and processor type to disassemble for, and register names to use.
485 set_default_mips_dis_options and parse_mips_dis_options fill in these
486 values. */
487 static int mips_processor;
488 static int mips_isa;
489 static const char * const *mips_gpr_names;
490 static const char * const *mips_fpr_names;
491 static const char * const *mips_cp0_names;
492 static const struct mips_cp0sel_name *mips_cp0sel_names;
493 static int mips_cp0sel_names_len;
494 static const char * const *mips_hwr_names;
495
496 /* Other options */
497 static int no_aliases; /* If set disassemble as most general inst. */
498
499 static const struct mips_abi_choice *
500 choose_abi_by_name (const char *name, unsigned int namelen)
501 {
502 const struct mips_abi_choice *c;
503 unsigned int i;
504
505 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_abi_choices) && c == NULL; i++)
506 if (strncmp (mips_abi_choices[i].name, name, namelen) == 0
507 && strlen (mips_abi_choices[i].name) == namelen)
508 c = &mips_abi_choices[i];
509
510 return c;
511 }
512
513 static const struct mips_arch_choice *
514 choose_arch_by_name (const char *name, unsigned int namelen)
515 {
516 const struct mips_arch_choice *c = NULL;
517 unsigned int i;
518
519 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
520 if (strncmp (mips_arch_choices[i].name, name, namelen) == 0
521 && strlen (mips_arch_choices[i].name) == namelen)
522 c = &mips_arch_choices[i];
523
524 return c;
525 }
526
527 static const struct mips_arch_choice *
528 choose_arch_by_number (unsigned long mach)
529 {
530 static unsigned long hint_bfd_mach;
531 static const struct mips_arch_choice *hint_arch_choice;
532 const struct mips_arch_choice *c;
533 unsigned int i;
534
535 /* We optimize this because even if the user specifies no
536 flags, this will be done for every instruction! */
537 if (hint_bfd_mach == mach
538 && hint_arch_choice != NULL
539 && hint_arch_choice->bfd_mach == hint_bfd_mach)
540 return hint_arch_choice;
541
542 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
543 {
544 if (mips_arch_choices[i].bfd_mach_valid
545 && mips_arch_choices[i].bfd_mach == mach)
546 {
547 c = &mips_arch_choices[i];
548 hint_bfd_mach = mach;
549 hint_arch_choice = c;
550 }
551 }
552 return c;
553 }
554
555 /* Check if the object uses NewABI conventions. */
556
557 #if SYMTAB_AVAILABLE
558 static int
559 is_newabi (Elf_Internal_Ehdr *header)
560 {
561 /* There are no old-style ABIs which use 64-bit ELF. */
562 if (header->e_ident[EI_CLASS] == ELFCLASS64)
563 return 1;
564
565 /* If a 32-bit ELF file, n32 is a new-style ABI. */
566 if ((header->e_flags & EF_MIPS_ABI2) != 0)
567 return 1;
568
569 return 0;
570 }
571 #endif
572
573 static void
574 set_default_mips_dis_options (struct disassemble_info *info)
575 {
576 const struct mips_arch_choice *chosen_arch;
577
578 /* Defaults: mipsIII/r3000 (?!), (o)32-style ("oldabi") GPR names,
579 and numeric FPR, CP0 register, and HWR names. */
580 mips_isa = ISA_MIPS3;
581 mips_processor = CPU_R3000;
582 mips_gpr_names = mips_gpr_names_oldabi;
583 mips_fpr_names = mips_fpr_names_numeric;
584 mips_cp0_names = mips_cp0_names_numeric;
585 mips_cp0sel_names = NULL;
586 mips_cp0sel_names_len = 0;
587 mips_hwr_names = mips_hwr_names_numeric;
588 no_aliases = 0;
589
590 /* If an ELF "newabi" binary, use the n32/(n)64 GPR names. */
591 #if SYMTAB_AVAILABLE
592 if (info->flavour == bfd_target_elf_flavour && info->section != NULL)
593 {
594 Elf_Internal_Ehdr *header;
595
596 header = elf_elfheader (info->section->owner);
597 if (is_newabi (header))
598 mips_gpr_names = mips_gpr_names_newabi;
599 }
600 #endif
601
602 /* Set ISA, architecture, and cp0 register names as best we can. */
603 #if ! SYMTAB_AVAILABLE && 0
604 /* This is running out on a target machine, not in a host tool.
605 FIXME: Where does mips_target_info come from? */
606 mips_processor = mips_target_info.processor;
607 mips_isa = mips_target_info.isa;
608 #else
609 chosen_arch = choose_arch_by_number (info->mach);
610 if (chosen_arch != NULL)
611 {
612 mips_processor = chosen_arch->processor;
613 mips_isa = chosen_arch->isa;
614 mips_cp0_names = chosen_arch->cp0_names;
615 mips_cp0sel_names = chosen_arch->cp0sel_names;
616 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
617 mips_hwr_names = chosen_arch->hwr_names;
618 }
619 #endif
620 }
621
622 static void
623 parse_mips_dis_option (const char *option, unsigned int len)
624 {
625 unsigned int i, optionlen, vallen;
626 const char *val;
627 const struct mips_abi_choice *chosen_abi;
628 const struct mips_arch_choice *chosen_arch;
629
630 /* Try to match options that are simple flags */
631 if (CONST_STRNEQ (option, "no-aliases"))
632 {
633 no_aliases = 1;
634 return;
635 }
636
637 /* Look for the = that delimits the end of the option name. */
638 for (i = 0; i < len; i++)
639 if (option[i] == '=')
640 break;
641
642 if (i == 0) /* Invalid option: no name before '='. */
643 return;
644 if (i == len) /* Invalid option: no '='. */
645 return;
646 if (i == (len - 1)) /* Invalid option: no value after '='. */
647 return;
648
649 optionlen = i;
650 val = option + (optionlen + 1);
651 vallen = len - (optionlen + 1);
652
653 if (strncmp ("gpr-names", option, optionlen) == 0
654 && strlen ("gpr-names") == optionlen)
655 {
656 chosen_abi = choose_abi_by_name (val, vallen);
657 if (chosen_abi != NULL)
658 mips_gpr_names = chosen_abi->gpr_names;
659 return;
660 }
661
662 if (strncmp ("fpr-names", option, optionlen) == 0
663 && strlen ("fpr-names") == optionlen)
664 {
665 chosen_abi = choose_abi_by_name (val, vallen);
666 if (chosen_abi != NULL)
667 mips_fpr_names = chosen_abi->fpr_names;
668 return;
669 }
670
671 if (strncmp ("cp0-names", option, optionlen) == 0
672 && strlen ("cp0-names") == optionlen)
673 {
674 chosen_arch = choose_arch_by_name (val, vallen);
675 if (chosen_arch != NULL)
676 {
677 mips_cp0_names = chosen_arch->cp0_names;
678 mips_cp0sel_names = chosen_arch->cp0sel_names;
679 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
680 }
681 return;
682 }
683
684 if (strncmp ("hwr-names", option, optionlen) == 0
685 && strlen ("hwr-names") == optionlen)
686 {
687 chosen_arch = choose_arch_by_name (val, vallen);
688 if (chosen_arch != NULL)
689 mips_hwr_names = chosen_arch->hwr_names;
690 return;
691 }
692
693 if (strncmp ("reg-names", option, optionlen) == 0
694 && strlen ("reg-names") == optionlen)
695 {
696 /* We check both ABI and ARCH here unconditionally, so
697 that "numeric" will do the desirable thing: select
698 numeric register names for all registers. Other than
699 that, a given name probably won't match both. */
700 chosen_abi = choose_abi_by_name (val, vallen);
701 if (chosen_abi != NULL)
702 {
703 mips_gpr_names = chosen_abi->gpr_names;
704 mips_fpr_names = chosen_abi->fpr_names;
705 }
706 chosen_arch = choose_arch_by_name (val, vallen);
707 if (chosen_arch != NULL)
708 {
709 mips_cp0_names = chosen_arch->cp0_names;
710 mips_cp0sel_names = chosen_arch->cp0sel_names;
711 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
712 mips_hwr_names = chosen_arch->hwr_names;
713 }
714 return;
715 }
716
717 /* Invalid option. */
718 }
719
720 static void
721 parse_mips_dis_options (const char *options)
722 {
723 const char *option_end;
724
725 if (options == NULL)
726 return;
727
728 while (*options != '\0')
729 {
730 /* Skip empty options. */
731 if (*options == ',')
732 {
733 options++;
734 continue;
735 }
736
737 /* We know that *options is neither NUL or a comma. */
738 option_end = options + 1;
739 while (*option_end != ',' && *option_end != '\0')
740 option_end++;
741
742 parse_mips_dis_option (options, option_end - options);
743
744 /* Go on to the next one. If option_end points to a comma, it
745 will be skipped above. */
746 options = option_end;
747 }
748 }
749
750 static const struct mips_cp0sel_name *
751 lookup_mips_cp0sel_name (const struct mips_cp0sel_name *names,
752 unsigned int len,
753 unsigned int cp0reg,
754 unsigned int sel)
755 {
756 unsigned int i;
757
758 for (i = 0; i < len; i++)
759 if (names[i].cp0reg == cp0reg && names[i].sel == sel)
760 return &names[i];
761 return NULL;
762 }
763
764 /* Print insn arguments for 32/64-bit code. */
765
766 static void
767 print_insn_args (const char *d,
768 register unsigned long int l,
769 bfd_vma pc,
770 struct disassemble_info *info,
771 const struct mips_opcode *opp)
772 {
773 int op, delta;
774 unsigned int lsb, msb, msbd;
775
776 lsb = 0;
777
778 for (; *d != '\0'; d++)
779 {
780 switch (*d)
781 {
782 case ',':
783 case '(':
784 case ')':
785 case '[':
786 case ']':
787 (*info->fprintf_func) (info->stream, "%c", *d);
788 break;
789
790 case '+':
791 /* Extension character; switch for second char. */
792 d++;
793 switch (*d)
794 {
795 case '\0':
796 /* xgettext:c-format */
797 (*info->fprintf_func) (info->stream,
798 _("# internal error, incomplete extension sequence (+)"));
799 return;
800
801 case 'A':
802 lsb = (l >> OP_SH_SHAMT) & OP_MASK_SHAMT;
803 (*info->fprintf_func) (info->stream, "0x%x", lsb);
804 break;
805
806 case 'B':
807 msb = (l >> OP_SH_INSMSB) & OP_MASK_INSMSB;
808 (*info->fprintf_func) (info->stream, "0x%x", msb - lsb + 1);
809 break;
810
811 case '1':
812 (*info->fprintf_func) (info->stream, "0x%lx",
813 (l >> OP_SH_UDI1) & OP_MASK_UDI1);
814 break;
815
816 case '2':
817 (*info->fprintf_func) (info->stream, "0x%lx",
818 (l >> OP_SH_UDI2) & OP_MASK_UDI2);
819 break;
820
821 case '3':
822 (*info->fprintf_func) (info->stream, "0x%lx",
823 (l >> OP_SH_UDI3) & OP_MASK_UDI3);
824 break;
825
826 case '4':
827 (*info->fprintf_func) (info->stream, "0x%lx",
828 (l >> OP_SH_UDI4) & OP_MASK_UDI4);
829 break;
830
831 case 'C':
832 case 'H':
833 msbd = (l >> OP_SH_EXTMSBD) & OP_MASK_EXTMSBD;
834 (*info->fprintf_func) (info->stream, "0x%x", msbd + 1);
835 break;
836
837 case 'D':
838 {
839 const struct mips_cp0sel_name *n;
840 unsigned int cp0reg, sel;
841
842 cp0reg = (l >> OP_SH_RD) & OP_MASK_RD;
843 sel = (l >> OP_SH_SEL) & OP_MASK_SEL;
844
845 /* CP0 register including 'sel' code for mtcN (et al.), to be
846 printed textually if known. If not known, print both
847 CP0 register name and sel numerically since CP0 register
848 with sel 0 may have a name unrelated to register being
849 printed. */
850 n = lookup_mips_cp0sel_name(mips_cp0sel_names,
851 mips_cp0sel_names_len, cp0reg, sel);
852 if (n != NULL)
853 (*info->fprintf_func) (info->stream, "%s", n->name);
854 else
855 (*info->fprintf_func) (info->stream, "$%d,%d", cp0reg, sel);
856 break;
857 }
858
859 case 'E':
860 lsb = ((l >> OP_SH_SHAMT) & OP_MASK_SHAMT) + 32;
861 (*info->fprintf_func) (info->stream, "0x%x", lsb);
862 break;
863
864 case 'F':
865 msb = ((l >> OP_SH_INSMSB) & OP_MASK_INSMSB) + 32;
866 (*info->fprintf_func) (info->stream, "0x%x", msb - lsb + 1);
867 break;
868
869 case 'G':
870 msbd = ((l >> OP_SH_EXTMSBD) & OP_MASK_EXTMSBD) + 32;
871 (*info->fprintf_func) (info->stream, "0x%x", msbd + 1);
872 break;
873
874 case 't': /* Coprocessor 0 reg name */
875 (*info->fprintf_func) (info->stream, "%s",
876 mips_cp0_names[(l >> OP_SH_RT) &
877 OP_MASK_RT]);
878 break;
879
880 case 'T': /* Coprocessor 0 reg name */
881 {
882 const struct mips_cp0sel_name *n;
883 unsigned int cp0reg, sel;
884
885 cp0reg = (l >> OP_SH_RT) & OP_MASK_RT;
886 sel = (l >> OP_SH_SEL) & OP_MASK_SEL;
887
888 /* CP0 register including 'sel' code for mftc0, to be
889 printed textually if known. If not known, print both
890 CP0 register name and sel numerically since CP0 register
891 with sel 0 may have a name unrelated to register being
892 printed. */
893 n = lookup_mips_cp0sel_name(mips_cp0sel_names,
894 mips_cp0sel_names_len, cp0reg, sel);
895 if (n != NULL)
896 (*info->fprintf_func) (info->stream, "%s", n->name);
897 else
898 (*info->fprintf_func) (info->stream, "$%d,%d", cp0reg, sel);
899 break;
900 }
901
902 default:
903 /* xgettext:c-format */
904 (*info->fprintf_func) (info->stream,
905 _("# internal error, undefined extension sequence (+%c)"),
906 *d);
907 return;
908 }
909 break;
910
911 case '3':
912 (*info->fprintf_func) (info->stream, "0x%lx",
913 (l >> OP_SH_SA3) & OP_MASK_SA3);
914 break;
915
916 case '4':
917 (*info->fprintf_func) (info->stream, "0x%lx",
918 (l >> OP_SH_SA4) & OP_MASK_SA4);
919 break;
920
921 case '5':
922 (*info->fprintf_func) (info->stream, "0x%lx",
923 (l >> OP_SH_IMM8) & OP_MASK_IMM8);
924 break;
925
926 case '6':
927 (*info->fprintf_func) (info->stream, "0x%lx",
928 (l >> OP_SH_RS) & OP_MASK_RS);
929 break;
930
931 case '7':
932 (*info->fprintf_func) (info->stream, "$ac%ld",
933 (l >> OP_SH_DSPACC) & OP_MASK_DSPACC);
934 break;
935
936 case '8':
937 (*info->fprintf_func) (info->stream, "0x%lx",
938 (l >> OP_SH_WRDSP) & OP_MASK_WRDSP);
939 break;
940
941 case '9':
942 (*info->fprintf_func) (info->stream, "$ac%ld",
943 (l >> OP_SH_DSPACC_S) & OP_MASK_DSPACC_S);
944 break;
945
946 case '0': /* dsp 6-bit signed immediate in bit 20 */
947 delta = ((l >> OP_SH_DSPSFT) & OP_MASK_DSPSFT);
948 if (delta & 0x20) /* test sign bit */
949 delta |= ~OP_MASK_DSPSFT;
950 (*info->fprintf_func) (info->stream, "%d", delta);
951 break;
952
953 case ':': /* dsp 7-bit signed immediate in bit 19 */
954 delta = ((l >> OP_SH_DSPSFT_7) & OP_MASK_DSPSFT_7);
955 if (delta & 0x40) /* test sign bit */
956 delta |= ~OP_MASK_DSPSFT_7;
957 (*info->fprintf_func) (info->stream, "%d", delta);
958 break;
959
960 case '\'':
961 (*info->fprintf_func) (info->stream, "0x%lx",
962 (l >> OP_SH_RDDSP) & OP_MASK_RDDSP);
963 break;
964
965 case '@': /* dsp 10-bit signed immediate in bit 16 */
966 delta = ((l >> OP_SH_IMM10) & OP_MASK_IMM10);
967 if (delta & 0x200) /* test sign bit */
968 delta |= ~OP_MASK_IMM10;
969 (*info->fprintf_func) (info->stream, "%d", delta);
970 break;
971
972 case '!':
973 (*info->fprintf_func) (info->stream, "%ld",
974 (l >> OP_SH_MT_U) & OP_MASK_MT_U);
975 break;
976
977 case '$':
978 (*info->fprintf_func) (info->stream, "%ld",
979 (l >> OP_SH_MT_H) & OP_MASK_MT_H);
980 break;
981
982 case '*':
983 (*info->fprintf_func) (info->stream, "$ac%ld",
984 (l >> OP_SH_MTACC_T) & OP_MASK_MTACC_T);
985 break;
986
987 case '&':
988 (*info->fprintf_func) (info->stream, "$ac%ld",
989 (l >> OP_SH_MTACC_D) & OP_MASK_MTACC_D);
990 break;
991
992 case 'g':
993 /* Coprocessor register for CTTC1, MTTC2, MTHC2, CTTC2. */
994 (*info->fprintf_func) (info->stream, "$%ld",
995 (l >> OP_SH_RD) & OP_MASK_RD);
996 break;
997
998 case 's':
999 case 'b':
1000 case 'r':
1001 case 'v':
1002 (*info->fprintf_func) (info->stream, "%s",
1003 mips_gpr_names[(l >> OP_SH_RS) & OP_MASK_RS]);
1004 break;
1005
1006 case 't':
1007 case 'w':
1008 (*info->fprintf_func) (info->stream, "%s",
1009 mips_gpr_names[(l >> OP_SH_RT) & OP_MASK_RT]);
1010 break;
1011
1012 case 'i':
1013 case 'u':
1014 (*info->fprintf_func) (info->stream, "0x%lx",
1015 (l >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE);
1016 break;
1017
1018 case 'j': /* Same as i, but sign-extended. */
1019 case 'o':
1020 delta = (l >> OP_SH_DELTA) & OP_MASK_DELTA;
1021 if (delta & 0x8000)
1022 delta |= ~0xffff;
1023 (*info->fprintf_func) (info->stream, "%d",
1024 delta);
1025 break;
1026
1027 case 'h':
1028 (*info->fprintf_func) (info->stream, "0x%x",
1029 (unsigned int) ((l >> OP_SH_PREFX)
1030 & OP_MASK_PREFX));
1031 break;
1032
1033 case 'k':
1034 (*info->fprintf_func) (info->stream, "0x%x",
1035 (unsigned int) ((l >> OP_SH_CACHE)
1036 & OP_MASK_CACHE));
1037 break;
1038
1039 case 'a':
1040 info->target = (((pc + 4) & ~(bfd_vma) 0x0fffffff)
1041 | (((l >> OP_SH_TARGET) & OP_MASK_TARGET) << 2));
1042 /* For gdb disassembler, force odd address on jalx. */
1043 if (info->flavour == bfd_target_unknown_flavour
1044 && strcmp (opp->name, "jalx") == 0)
1045 info->target |= 1;
1046 (*info->print_address_func) (info->target, info);
1047 break;
1048
1049 case 'p':
1050 /* Sign extend the displacement. */
1051 delta = (l >> OP_SH_DELTA) & OP_MASK_DELTA;
1052 if (delta & 0x8000)
1053 delta |= ~0xffff;
1054 info->target = (delta << 2) + pc + INSNLEN;
1055 (*info->print_address_func) (info->target, info);
1056 break;
1057
1058 case 'd':
1059 (*info->fprintf_func) (info->stream, "%s",
1060 mips_gpr_names[(l >> OP_SH_RD) & OP_MASK_RD]);
1061 break;
1062
1063 case 'U':
1064 {
1065 /* First check for both rd and rt being equal. */
1066 unsigned int reg = (l >> OP_SH_RD) & OP_MASK_RD;
1067 if (reg == ((l >> OP_SH_RT) & OP_MASK_RT))
1068 (*info->fprintf_func) (info->stream, "%s",
1069 mips_gpr_names[reg]);
1070 else
1071 {
1072 /* If one is zero use the other. */
1073 if (reg == 0)
1074 (*info->fprintf_func) (info->stream, "%s",
1075 mips_gpr_names[(l >> OP_SH_RT) & OP_MASK_RT]);
1076 else if (((l >> OP_SH_RT) & OP_MASK_RT) == 0)
1077 (*info->fprintf_func) (info->stream, "%s",
1078 mips_gpr_names[reg]);
1079 else /* Bogus, result depends on processor. */
1080 (*info->fprintf_func) (info->stream, "%s or %s",
1081 mips_gpr_names[reg],
1082 mips_gpr_names[(l >> OP_SH_RT) & OP_MASK_RT]);
1083 }
1084 }
1085 break;
1086
1087 case 'z':
1088 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[0]);
1089 break;
1090
1091 case '<':
1092 (*info->fprintf_func) (info->stream, "0x%lx",
1093 (l >> OP_SH_SHAMT) & OP_MASK_SHAMT);
1094 break;
1095
1096 case 'c':
1097 (*info->fprintf_func) (info->stream, "0x%lx",
1098 (l >> OP_SH_CODE) & OP_MASK_CODE);
1099 break;
1100
1101 case 'q':
1102 (*info->fprintf_func) (info->stream, "0x%lx",
1103 (l >> OP_SH_CODE2) & OP_MASK_CODE2);
1104 break;
1105
1106 case 'C':
1107 (*info->fprintf_func) (info->stream, "0x%lx",
1108 (l >> OP_SH_COPZ) & OP_MASK_COPZ);
1109 break;
1110
1111 case 'B':
1112 (*info->fprintf_func) (info->stream, "0x%lx",
1113
1114 (l >> OP_SH_CODE20) & OP_MASK_CODE20);
1115 break;
1116
1117 case 'J':
1118 (*info->fprintf_func) (info->stream, "0x%lx",
1119 (l >> OP_SH_CODE19) & OP_MASK_CODE19);
1120 break;
1121
1122 case 'S':
1123 case 'V':
1124 (*info->fprintf_func) (info->stream, "%s",
1125 mips_fpr_names[(l >> OP_SH_FS) & OP_MASK_FS]);
1126 break;
1127
1128 case 'T':
1129 case 'W':
1130 (*info->fprintf_func) (info->stream, "%s",
1131 mips_fpr_names[(l >> OP_SH_FT) & OP_MASK_FT]);
1132 break;
1133
1134 case 'D':
1135 (*info->fprintf_func) (info->stream, "%s",
1136 mips_fpr_names[(l >> OP_SH_FD) & OP_MASK_FD]);
1137 break;
1138
1139 case 'R':
1140 (*info->fprintf_func) (info->stream, "%s",
1141 mips_fpr_names[(l >> OP_SH_FR) & OP_MASK_FR]);
1142 break;
1143
1144 case 'E':
1145 /* Coprocessor register for lwcN instructions, et al.
1146
1147 Note that there is no load/store cp0 instructions, and
1148 that FPU (cp1) instructions disassemble this field using
1149 'T' format. Therefore, until we gain understanding of
1150 cp2 register names, we can simply print the register
1151 numbers. */
1152 (*info->fprintf_func) (info->stream, "$%ld",
1153 (l >> OP_SH_RT) & OP_MASK_RT);
1154 break;
1155
1156 case 'G':
1157 /* Coprocessor register for mtcN instructions, et al. Note
1158 that FPU (cp1) instructions disassemble this field using
1159 'S' format. Therefore, we only need to worry about cp0,
1160 cp2, and cp3. */
1161 op = (l >> OP_SH_OP) & OP_MASK_OP;
1162 if (op == OP_OP_COP0)
1163 (*info->fprintf_func) (info->stream, "%s",
1164 mips_cp0_names[(l >> OP_SH_RD) & OP_MASK_RD]);
1165 else
1166 (*info->fprintf_func) (info->stream, "$%ld",
1167 (l >> OP_SH_RD) & OP_MASK_RD);
1168 break;
1169
1170 case 'K':
1171 (*info->fprintf_func) (info->stream, "%s",
1172 mips_hwr_names[(l >> OP_SH_RD) & OP_MASK_RD]);
1173 break;
1174
1175 case 'N':
1176 (*info->fprintf_func) (info->stream,
1177 ((opp->pinfo & (FP_D | FP_S)) != 0
1178 ? "$fcc%ld" : "$cc%ld"),
1179 (l >> OP_SH_BCC) & OP_MASK_BCC);
1180 break;
1181
1182 case 'M':
1183 (*info->fprintf_func) (info->stream, "$fcc%ld",
1184 (l >> OP_SH_CCC) & OP_MASK_CCC);
1185 break;
1186
1187 case 'P':
1188 (*info->fprintf_func) (info->stream, "%ld",
1189 (l >> OP_SH_PERFREG) & OP_MASK_PERFREG);
1190 break;
1191
1192 case 'e':
1193 (*info->fprintf_func) (info->stream, "%ld",
1194 (l >> OP_SH_VECBYTE) & OP_MASK_VECBYTE);
1195 break;
1196
1197 case '%':
1198 (*info->fprintf_func) (info->stream, "%ld",
1199 (l >> OP_SH_VECALIGN) & OP_MASK_VECALIGN);
1200 break;
1201
1202 case 'H':
1203 (*info->fprintf_func) (info->stream, "%ld",
1204 (l >> OP_SH_SEL) & OP_MASK_SEL);
1205 break;
1206
1207 case 'O':
1208 (*info->fprintf_func) (info->stream, "%ld",
1209 (l >> OP_SH_ALN) & OP_MASK_ALN);
1210 break;
1211
1212 case 'Q':
1213 {
1214 unsigned int vsel = (l >> OP_SH_VSEL) & OP_MASK_VSEL;
1215
1216 if ((vsel & 0x10) == 0)
1217 {
1218 int fmt;
1219
1220 vsel &= 0x0f;
1221 for (fmt = 0; fmt < 3; fmt++, vsel >>= 1)
1222 if ((vsel & 1) == 0)
1223 break;
1224 (*info->fprintf_func) (info->stream, "$v%ld[%d]",
1225 (l >> OP_SH_FT) & OP_MASK_FT,
1226 vsel >> 1);
1227 }
1228 else if ((vsel & 0x08) == 0)
1229 {
1230 (*info->fprintf_func) (info->stream, "$v%ld",
1231 (l >> OP_SH_FT) & OP_MASK_FT);
1232 }
1233 else
1234 {
1235 (*info->fprintf_func) (info->stream, "0x%lx",
1236 (l >> OP_SH_FT) & OP_MASK_FT);
1237 }
1238 }
1239 break;
1240
1241 case 'X':
1242 (*info->fprintf_func) (info->stream, "$v%ld",
1243 (l >> OP_SH_FD) & OP_MASK_FD);
1244 break;
1245
1246 case 'Y':
1247 (*info->fprintf_func) (info->stream, "$v%ld",
1248 (l >> OP_SH_FS) & OP_MASK_FS);
1249 break;
1250
1251 case 'Z':
1252 (*info->fprintf_func) (info->stream, "$v%ld",
1253 (l >> OP_SH_FT) & OP_MASK_FT);
1254 break;
1255
1256 default:
1257 /* xgettext:c-format */
1258 (*info->fprintf_func) (info->stream,
1259 _("# internal error, undefined modifier(%c)"),
1260 *d);
1261 return;
1262 }
1263 }
1264 }
1265
1266 /* Print the mips instruction at address MEMADDR in debugged memory,
1267 on using INFO. Returns length of the instruction, in bytes, which is
1268 always INSNLEN. BIGENDIAN must be 1 if this is big-endian code, 0 if
1269 this is little-endian code. */
1270
1271 static int
1272 print_insn_mips (bfd_vma memaddr,
1273 unsigned long int word,
1274 struct disassemble_info *info)
1275 {
1276 const struct mips_opcode *op;
1277 static bfd_boolean init = 0;
1278 static const struct mips_opcode *mips_hash[OP_MASK_OP + 1];
1279
1280 /* Build a hash table to shorten the search time. */
1281 if (! init)
1282 {
1283 unsigned int i;
1284
1285 for (i = 0; i <= OP_MASK_OP; i++)
1286 {
1287 for (op = mips_opcodes; op < &mips_opcodes[NUMOPCODES]; op++)
1288 {
1289 if (op->pinfo == INSN_MACRO
1290 || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
1291 continue;
1292 if (i == ((op->match >> OP_SH_OP) & OP_MASK_OP))
1293 {
1294 mips_hash[i] = op;
1295 break;
1296 }
1297 }
1298 }
1299
1300 init = 1;
1301 }
1302
1303 info->bytes_per_chunk = INSNLEN;
1304 info->display_endian = info->endian;
1305 info->insn_info_valid = 1;
1306 info->branch_delay_insns = 0;
1307 info->data_size = 0;
1308 info->insn_type = dis_nonbranch;
1309 info->target = 0;
1310 info->target2 = 0;
1311
1312 op = mips_hash[(word >> OP_SH_OP) & OP_MASK_OP];
1313 if (op != NULL)
1314 {
1315 for (; op < &mips_opcodes[NUMOPCODES]; op++)
1316 {
1317 if (op->pinfo != INSN_MACRO
1318 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
1319 && (word & op->mask) == op->match)
1320 {
1321 const char *d;
1322
1323 /* We always allow to disassemble the jalx instruction. */
1324 if (! OPCODE_IS_MEMBER (op, mips_isa, mips_processor)
1325 && strcmp (op->name, "jalx"))
1326 continue;
1327
1328 /* Figure out instruction type and branch delay information. */
1329 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
1330 {
1331 if ((info->insn_type & INSN_WRITE_GPR_31) != 0)
1332 info->insn_type = dis_jsr;
1333 else
1334 info->insn_type = dis_branch;
1335 info->branch_delay_insns = 1;
1336 }
1337 else if ((op->pinfo & (INSN_COND_BRANCH_DELAY
1338 | INSN_COND_BRANCH_LIKELY)) != 0)
1339 {
1340 if ((info->insn_type & INSN_WRITE_GPR_31) != 0)
1341 info->insn_type = dis_condjsr;
1342 else
1343 info->insn_type = dis_condbranch;
1344 info->branch_delay_insns = 1;
1345 }
1346 else if ((op->pinfo & (INSN_STORE_MEMORY
1347 | INSN_LOAD_MEMORY_DELAY)) != 0)
1348 info->insn_type = dis_dref;
1349
1350 (*info->fprintf_func) (info->stream, "%s", op->name);
1351
1352 d = op->args;
1353 if (d != NULL && *d != '\0')
1354 {
1355 (*info->fprintf_func) (info->stream, "\t");
1356 print_insn_args (d, word, memaddr, info, op);
1357 }
1358
1359 return INSNLEN;
1360 }
1361 }
1362 }
1363
1364 /* Handle undefined instructions. */
1365 info->insn_type = dis_noninsn;
1366 (*info->fprintf_func) (info->stream, "0x%lx", word);
1367 return INSNLEN;
1368 }
1369
1370 /* Disassemble an operand for a mips16 instruction. */
1371
1372 static void
1373 print_mips16_insn_arg (char type,
1374 const struct mips_opcode *op,
1375 int l,
1376 bfd_boolean use_extend,
1377 int extend,
1378 bfd_vma memaddr,
1379 struct disassemble_info *info)
1380 {
1381 switch (type)
1382 {
1383 case ',':
1384 case '(':
1385 case ')':
1386 (*info->fprintf_func) (info->stream, "%c", type);
1387 break;
1388
1389 case 'y':
1390 case 'w':
1391 (*info->fprintf_func) (info->stream, "%s",
1392 mips16_reg_names(((l >> MIPS16OP_SH_RY)
1393 & MIPS16OP_MASK_RY)));
1394 break;
1395
1396 case 'x':
1397 case 'v':
1398 (*info->fprintf_func) (info->stream, "%s",
1399 mips16_reg_names(((l >> MIPS16OP_SH_RX)
1400 & MIPS16OP_MASK_RX)));
1401 break;
1402
1403 case 'z':
1404 (*info->fprintf_func) (info->stream, "%s",
1405 mips16_reg_names(((l >> MIPS16OP_SH_RZ)
1406 & MIPS16OP_MASK_RZ)));
1407 break;
1408
1409 case 'Z':
1410 (*info->fprintf_func) (info->stream, "%s",
1411 mips16_reg_names(((l >> MIPS16OP_SH_MOVE32Z)
1412 & MIPS16OP_MASK_MOVE32Z)));
1413 break;
1414
1415 case '0':
1416 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[0]);
1417 break;
1418
1419 case 'S':
1420 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[29]);
1421 break;
1422
1423 case 'P':
1424 (*info->fprintf_func) (info->stream, "$pc");
1425 break;
1426
1427 case 'R':
1428 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[31]);
1429 break;
1430
1431 case 'X':
1432 (*info->fprintf_func) (info->stream, "%s",
1433 mips_gpr_names[((l >> MIPS16OP_SH_REGR32)
1434 & MIPS16OP_MASK_REGR32)]);
1435 break;
1436
1437 case 'Y':
1438 (*info->fprintf_func) (info->stream, "%s",
1439 mips_gpr_names[MIPS16OP_EXTRACT_REG32R (l)]);
1440 break;
1441
1442 case '<':
1443 case '>':
1444 case '[':
1445 case ']':
1446 case '4':
1447 case '5':
1448 case 'H':
1449 case 'W':
1450 case 'D':
1451 case 'j':
1452 case '6':
1453 case '8':
1454 case 'V':
1455 case 'C':
1456 case 'U':
1457 case 'k':
1458 case 'K':
1459 case 'p':
1460 case 'q':
1461 case 'A':
1462 case 'B':
1463 case 'E':
1464 {
1465 int immed, nbits, shift, signedp, extbits, pcrel, extu, branch;
1466
1467 shift = 0;
1468 signedp = 0;
1469 extbits = 16;
1470 pcrel = 0;
1471 extu = 0;
1472 branch = 0;
1473 switch (type)
1474 {
1475 case '<':
1476 nbits = 3;
1477 immed = (l >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
1478 extbits = 5;
1479 extu = 1;
1480 break;
1481 case '>':
1482 nbits = 3;
1483 immed = (l >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
1484 extbits = 5;
1485 extu = 1;
1486 break;
1487 case '[':
1488 nbits = 3;
1489 immed = (l >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
1490 extbits = 6;
1491 extu = 1;
1492 break;
1493 case ']':
1494 nbits = 3;
1495 immed = (l >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
1496 extbits = 6;
1497 extu = 1;
1498 break;
1499 case '4':
1500 nbits = 4;
1501 immed = (l >> MIPS16OP_SH_IMM4) & MIPS16OP_MASK_IMM4;
1502 signedp = 1;
1503 extbits = 15;
1504 break;
1505 case '5':
1506 nbits = 5;
1507 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1508 info->insn_type = dis_dref;
1509 info->data_size = 1;
1510 break;
1511 case 'H':
1512 nbits = 5;
1513 shift = 1;
1514 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1515 info->insn_type = dis_dref;
1516 info->data_size = 2;
1517 break;
1518 case 'W':
1519 nbits = 5;
1520 shift = 2;
1521 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1522 if ((op->pinfo & MIPS16_INSN_READ_PC) == 0
1523 && (op->pinfo & MIPS16_INSN_READ_SP) == 0)
1524 {
1525 info->insn_type = dis_dref;
1526 info->data_size = 4;
1527 }
1528 break;
1529 case 'D':
1530 nbits = 5;
1531 shift = 3;
1532 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1533 info->insn_type = dis_dref;
1534 info->data_size = 8;
1535 break;
1536 case 'j':
1537 nbits = 5;
1538 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1539 signedp = 1;
1540 break;
1541 case '6':
1542 nbits = 6;
1543 immed = (l >> MIPS16OP_SH_IMM6) & MIPS16OP_MASK_IMM6;
1544 break;
1545 case '8':
1546 nbits = 8;
1547 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1548 break;
1549 case 'V':
1550 nbits = 8;
1551 shift = 2;
1552 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1553 /* FIXME: This might be lw, or it might be addiu to $sp or
1554 $pc. We assume it's load. */
1555 info->insn_type = dis_dref;
1556 info->data_size = 4;
1557 break;
1558 case 'C':
1559 nbits = 8;
1560 shift = 3;
1561 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1562 info->insn_type = dis_dref;
1563 info->data_size = 8;
1564 break;
1565 case 'U':
1566 nbits = 8;
1567 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1568 extu = 1;
1569 break;
1570 case 'k':
1571 nbits = 8;
1572 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1573 signedp = 1;
1574 break;
1575 case 'K':
1576 nbits = 8;
1577 shift = 3;
1578 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1579 signedp = 1;
1580 break;
1581 case 'p':
1582 nbits = 8;
1583 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1584 signedp = 1;
1585 pcrel = 1;
1586 branch = 1;
1587 info->insn_type = dis_condbranch;
1588 break;
1589 case 'q':
1590 nbits = 11;
1591 immed = (l >> MIPS16OP_SH_IMM11) & MIPS16OP_MASK_IMM11;
1592 signedp = 1;
1593 pcrel = 1;
1594 branch = 1;
1595 info->insn_type = dis_branch;
1596 break;
1597 case 'A':
1598 nbits = 8;
1599 shift = 2;
1600 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
1601 pcrel = 1;
1602 /* FIXME: This can be lw or la. We assume it is lw. */
1603 info->insn_type = dis_dref;
1604 info->data_size = 4;
1605 break;
1606 case 'B':
1607 nbits = 5;
1608 shift = 3;
1609 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1610 pcrel = 1;
1611 info->insn_type = dis_dref;
1612 info->data_size = 8;
1613 break;
1614 case 'E':
1615 nbits = 5;
1616 shift = 2;
1617 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
1618 pcrel = 1;
1619 break;
1620 default:
1621 abort ();
1622 }
1623
1624 if (! use_extend)
1625 {
1626 if (signedp && immed >= (1 << (nbits - 1)))
1627 immed -= 1 << nbits;
1628 immed <<= shift;
1629 if ((type == '<' || type == '>' || type == '[' || type == ']')
1630 && immed == 0)
1631 immed = 8;
1632 }
1633 else
1634 {
1635 if (extbits == 16)
1636 immed |= ((extend & 0x1f) << 11) | (extend & 0x7e0);
1637 else if (extbits == 15)
1638 immed |= ((extend & 0xf) << 11) | (extend & 0x7f0);
1639 else
1640 immed = ((extend >> 6) & 0x1f) | (extend & 0x20);
1641 immed &= (1 << extbits) - 1;
1642 if (! extu && immed >= (1 << (extbits - 1)))
1643 immed -= 1 << extbits;
1644 }
1645
1646 if (! pcrel)
1647 (*info->fprintf_func) (info->stream, "%d", immed);
1648 else
1649 {
1650 bfd_vma baseaddr;
1651
1652 if (branch)
1653 {
1654 immed *= 2;
1655 baseaddr = memaddr + 2;
1656 }
1657 else if (use_extend)
1658 baseaddr = memaddr - 2;
1659 else
1660 {
1661 int status;
1662 bfd_byte buffer[2];
1663
1664 baseaddr = memaddr;
1665
1666 /* If this instruction is in the delay slot of a jr
1667 instruction, the base address is the address of the
1668 jr instruction. If it is in the delay slot of jalr
1669 instruction, the base address is the address of the
1670 jalr instruction. This test is unreliable: we have
1671 no way of knowing whether the previous word is
1672 instruction or data. */
1673 status = (*info->read_memory_func) (memaddr - 4, buffer, 2,
1674 info);
1675 if (status == 0
1676 && (((info->endian == BFD_ENDIAN_BIG
1677 ? bfd_getb16 (buffer)
1678 : bfd_getl16 (buffer))
1679 & 0xf800) == 0x1800))
1680 baseaddr = memaddr - 4;
1681 else
1682 {
1683 status = (*info->read_memory_func) (memaddr - 2, buffer,
1684 2, info);
1685 if (status == 0
1686 && (((info->endian == BFD_ENDIAN_BIG
1687 ? bfd_getb16 (buffer)
1688 : bfd_getl16 (buffer))
1689 & 0xf81f) == 0xe800))
1690 baseaddr = memaddr - 2;
1691 }
1692 }
1693 info->target = (baseaddr & ~((1 << shift) - 1)) + immed;
1694 if (pcrel && branch
1695 && info->flavour == bfd_target_unknown_flavour)
1696 /* For gdb disassembler, maintain odd address. */
1697 info->target |= 1;
1698 (*info->print_address_func) (info->target, info);
1699 }
1700 }
1701 break;
1702
1703 case 'a':
1704 {
1705 int jalx = l & 0x400;
1706
1707 if (! use_extend)
1708 extend = 0;
1709 l = ((l & 0x1f) << 23) | ((l & 0x3e0) << 13) | (extend << 2);
1710 if (!jalx && info->flavour == bfd_target_unknown_flavour)
1711 /* For gdb disassembler, maintain odd address. */
1712 l |= 1;
1713 }
1714 info->target = ((memaddr + 4) & ~(bfd_vma) 0x0fffffff) | l;
1715 (*info->print_address_func) (info->target, info);
1716 info->insn_type = dis_jsr;
1717 info->branch_delay_insns = 1;
1718 break;
1719
1720 case 'l':
1721 case 'L':
1722 {
1723 int need_comma, amask, smask;
1724
1725 need_comma = 0;
1726
1727 l = (l >> MIPS16OP_SH_IMM6) & MIPS16OP_MASK_IMM6;
1728
1729 amask = (l >> 3) & 7;
1730
1731 if (amask > 0 && amask < 5)
1732 {
1733 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[4]);
1734 if (amask > 1)
1735 (*info->fprintf_func) (info->stream, "-%s",
1736 mips_gpr_names[amask + 3]);
1737 need_comma = 1;
1738 }
1739
1740 smask = (l >> 1) & 3;
1741 if (smask == 3)
1742 {
1743 (*info->fprintf_func) (info->stream, "%s??",
1744 need_comma ? "," : "");
1745 need_comma = 1;
1746 }
1747 else if (smask > 0)
1748 {
1749 (*info->fprintf_func) (info->stream, "%s%s",
1750 need_comma ? "," : "",
1751 mips_gpr_names[16]);
1752 if (smask > 1)
1753 (*info->fprintf_func) (info->stream, "-%s",
1754 mips_gpr_names[smask + 15]);
1755 need_comma = 1;
1756 }
1757
1758 if (l & 1)
1759 {
1760 (*info->fprintf_func) (info->stream, "%s%s",
1761 need_comma ? "," : "",
1762 mips_gpr_names[31]);
1763 need_comma = 1;
1764 }
1765
1766 if (amask == 5 || amask == 6)
1767 {
1768 (*info->fprintf_func) (info->stream, "%s$f0",
1769 need_comma ? "," : "");
1770 if (amask == 6)
1771 (*info->fprintf_func) (info->stream, "-$f1");
1772 }
1773 }
1774 break;
1775
1776 case 'm':
1777 case 'M':
1778 /* MIPS16e save/restore. */
1779 {
1780 int need_comma = 0;
1781 int amask, args, statics;
1782 int nsreg, smask;
1783 int framesz;
1784 int i, j;
1785
1786 l = l & 0x7f;
1787 if (use_extend)
1788 l |= extend << 16;
1789
1790 amask = (l >> 16) & 0xf;
1791 if (amask == MIPS16_ALL_ARGS)
1792 {
1793 args = 4;
1794 statics = 0;
1795 }
1796 else if (amask == MIPS16_ALL_STATICS)
1797 {
1798 args = 0;
1799 statics = 4;
1800 }
1801 else
1802 {
1803 args = amask >> 2;
1804 statics = amask & 3;
1805 }
1806
1807 if (args > 0) {
1808 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[4]);
1809 if (args > 1)
1810 (*info->fprintf_func) (info->stream, "-%s",
1811 mips_gpr_names[4 + args - 1]);
1812 need_comma = 1;
1813 }
1814
1815 framesz = (((l >> 16) & 0xf0) | (l & 0x0f)) * 8;
1816 if (framesz == 0 && !use_extend)
1817 framesz = 128;
1818
1819 (*info->fprintf_func) (info->stream, "%s%d",
1820 need_comma ? "," : "",
1821 framesz);
1822
1823 if (l & 0x40) /* $ra */
1824 (*info->fprintf_func) (info->stream, ",%s", mips_gpr_names[31]);
1825
1826 nsreg = (l >> 24) & 0x7;
1827 smask = 0;
1828 if (l & 0x20) /* $s0 */
1829 smask |= 1 << 0;
1830 if (l & 0x10) /* $s1 */
1831 smask |= 1 << 1;
1832 if (nsreg > 0) /* $s2-$s8 */
1833 smask |= ((1 << nsreg) - 1) << 2;
1834
1835 /* Find first set static reg bit. */
1836 for (i = 0; i < 9; i++)
1837 {
1838 if (smask & (1 << i))
1839 {
1840 (*info->fprintf_func) (info->stream, ",%s",
1841 mips_gpr_names[i == 8 ? 30 : (16 + i)]);
1842 /* Skip over string of set bits. */
1843 for (j = i; smask & (2 << j); j++)
1844 continue;
1845 if (j > i)
1846 (*info->fprintf_func) (info->stream, "-%s",
1847 mips_gpr_names[j == 8 ? 30 : (16 + j)]);
1848 i = j + 1;
1849 }
1850 }
1851
1852 /* Statics $ax - $a3. */
1853 if (statics == 1)
1854 (*info->fprintf_func) (info->stream, ",%s", mips_gpr_names[7]);
1855 else if (statics > 0)
1856 (*info->fprintf_func) (info->stream, ",%s-%s",
1857 mips_gpr_names[7 - statics + 1],
1858 mips_gpr_names[7]);
1859 }
1860 break;
1861
1862 default:
1863 /* xgettext:c-format */
1864 (*info->fprintf_func)
1865 (info->stream,
1866 _("# internal disassembler error, unrecognised modifier (%c)"),
1867 type);
1868 abort ();
1869 }
1870 }
1871
1872 /* Disassemble mips16 instructions. */
1873
1874 static int
1875 print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
1876 {
1877 int status;
1878 bfd_byte buffer[2];
1879 int length;
1880 int insn;
1881 bfd_boolean use_extend;
1882 int extend = 0;
1883 const struct mips_opcode *op, *opend;
1884
1885 info->bytes_per_chunk = 2;
1886 info->display_endian = info->endian;
1887 info->insn_info_valid = 1;
1888 info->branch_delay_insns = 0;
1889 info->data_size = 0;
1890 info->insn_type = dis_nonbranch;
1891 info->target = 0;
1892 info->target2 = 0;
1893
1894 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
1895 if (status != 0)
1896 {
1897 (*info->memory_error_func) (status, memaddr, info);
1898 return -1;
1899 }
1900
1901 length = 2;
1902
1903 if (info->endian == BFD_ENDIAN_BIG)
1904 insn = bfd_getb16 (buffer);
1905 else
1906 insn = bfd_getl16 (buffer);
1907
1908 /* Handle the extend opcode specially. */
1909 use_extend = FALSE;
1910 if ((insn & 0xf800) == 0xf000)
1911 {
1912 use_extend = TRUE;
1913 extend = insn & 0x7ff;
1914
1915 memaddr += 2;
1916
1917 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
1918 if (status != 0)
1919 {
1920 (*info->fprintf_func) (info->stream, "extend 0x%x",
1921 (unsigned int) extend);
1922 (*info->memory_error_func) (status, memaddr, info);
1923 return -1;
1924 }
1925
1926 if (info->endian == BFD_ENDIAN_BIG)
1927 insn = bfd_getb16 (buffer);
1928 else
1929 insn = bfd_getl16 (buffer);
1930
1931 /* Check for an extend opcode followed by an extend opcode. */
1932 if ((insn & 0xf800) == 0xf000)
1933 {
1934 (*info->fprintf_func) (info->stream, "extend 0x%x",
1935 (unsigned int) extend);
1936 info->insn_type = dis_noninsn;
1937 return length;
1938 }
1939
1940 length += 2;
1941 }
1942
1943 /* FIXME: Should probably use a hash table on the major opcode here. */
1944
1945 opend = mips16_opcodes + bfd_mips16_num_opcodes;
1946 for (op = mips16_opcodes; op < opend; op++)
1947 {
1948 if (op->pinfo != INSN_MACRO
1949 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
1950 && (insn & op->mask) == op->match)
1951 {
1952 const char *s;
1953
1954 if (strchr (op->args, 'a') != NULL)
1955 {
1956 if (use_extend)
1957 {
1958 (*info->fprintf_func) (info->stream, "extend 0x%x",
1959 (unsigned int) extend);
1960 info->insn_type = dis_noninsn;
1961 return length - 2;
1962 }
1963
1964 use_extend = FALSE;
1965
1966 memaddr += 2;
1967
1968 status = (*info->read_memory_func) (memaddr, buffer, 2,
1969 info);
1970 if (status == 0)
1971 {
1972 use_extend = TRUE;
1973 if (info->endian == BFD_ENDIAN_BIG)
1974 extend = bfd_getb16 (buffer);
1975 else
1976 extend = bfd_getl16 (buffer);
1977 length += 2;
1978 }
1979 }
1980
1981 (*info->fprintf_func) (info->stream, "%s", op->name);
1982 if (op->args[0] != '\0')
1983 (*info->fprintf_func) (info->stream, "\t");
1984
1985 for (s = op->args; *s != '\0'; s++)
1986 {
1987 if (*s == ','
1988 && s[1] == 'w'
1989 && (((insn >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX)
1990 == ((insn >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY)))
1991 {
1992 /* Skip the register and the comma. */
1993 ++s;
1994 continue;
1995 }
1996 if (*s == ','
1997 && s[1] == 'v'
1998 && (((insn >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ)
1999 == ((insn >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX)))
2000 {
2001 /* Skip the register and the comma. */
2002 ++s;
2003 continue;
2004 }
2005 print_mips16_insn_arg (*s, op, insn, use_extend, extend, memaddr,
2006 info);
2007 }
2008
2009 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2010 {
2011 info->branch_delay_insns = 1;
2012 if (info->insn_type != dis_jsr)
2013 info->insn_type = dis_branch;
2014 }
2015
2016 return length;
2017 }
2018 }
2019
2020 if (use_extend)
2021 (*info->fprintf_func) (info->stream, "0x%x", extend | 0xf000);
2022 (*info->fprintf_func) (info->stream, "0x%x", insn);
2023 info->insn_type = dis_noninsn;
2024
2025 return length;
2026 }
2027
2028 /* In an environment where we do not know the symbol type of the
2029 instruction we are forced to assume that the low order bit of the
2030 instructions' address may mark it as a mips16 instruction. If we
2031 are single stepping, or the pc is within the disassembled function,
2032 this works. Otherwise, we need a clue. Sometimes. */
2033
2034 static int
2035 _print_insn_mips (bfd_vma memaddr,
2036 struct disassemble_info *info,
2037 enum bfd_endian endianness)
2038 {
2039 bfd_byte buffer[INSNLEN];
2040 int status;
2041
2042 set_default_mips_dis_options (info);
2043 parse_mips_dis_options (info->disassembler_options);
2044
2045 #if 1
2046 /* FIXME: If odd address, this is CLEARLY a mips 16 instruction. */
2047 /* Only a few tools will work this way. */
2048 if (memaddr & 0x01)
2049 return print_insn_mips16 (memaddr, info);
2050 #endif
2051
2052 #if SYMTAB_AVAILABLE
2053 if (info->mach == bfd_mach_mips16
2054 || (info->flavour == bfd_target_elf_flavour
2055 && info->symbols != NULL
2056 && ((*(elf_symbol_type **) info->symbols)->internal_elf_sym.st_other
2057 == STO_MIPS16)))
2058 return print_insn_mips16 (memaddr, info);
2059 #endif
2060
2061 status = (*info->read_memory_func) (memaddr, buffer, INSNLEN, info);
2062 if (status == 0)
2063 {
2064 unsigned long insn;
2065
2066 if (endianness == BFD_ENDIAN_BIG)
2067 insn = (unsigned long) bfd_getb32 (buffer);
2068 else
2069 insn = (unsigned long) bfd_getl32 (buffer);
2070
2071 return print_insn_mips (memaddr, insn, info);
2072 }
2073 else
2074 {
2075 (*info->memory_error_func) (status, memaddr, info);
2076 return -1;
2077 }
2078 }
2079
2080 int
2081 print_insn_big_mips (bfd_vma memaddr, struct disassemble_info *info)
2082 {
2083 return _print_insn_mips (memaddr, info, BFD_ENDIAN_BIG);
2084 }
2085
2086 int
2087 print_insn_little_mips (bfd_vma memaddr, struct disassemble_info *info)
2088 {
2089 return _print_insn_mips (memaddr, info, BFD_ENDIAN_LITTLE);
2090 }
2091
2092 void
2093 print_mips_disassembler_options (FILE *stream)
2094 {
2095 unsigned int i;
2096
2097 fprintf (stream, _("\n\
2098 The following MIPS specific disassembler options are supported for use\n\
2099 with the -M switch (multiple options should be separated by commas):\n"));
2100
2101 fprintf (stream, _("\n\
2102 gpr-names=ABI Print GPR names according to specified ABI.\n\
2103 Default: based on binary being disassembled.\n"));
2104
2105 fprintf (stream, _("\n\
2106 fpr-names=ABI Print FPR names according to specified ABI.\n\
2107 Default: numeric.\n"));
2108
2109 fprintf (stream, _("\n\
2110 cp0-names=ARCH Print CP0 register names according to\n\
2111 specified architecture.\n\
2112 Default: based on binary being disassembled.\n"));
2113
2114 fprintf (stream, _("\n\
2115 hwr-names=ARCH Print HWR names according to specified \n\
2116 architecture.\n\
2117 Default: based on binary being disassembled.\n"));
2118
2119 fprintf (stream, _("\n\
2120 reg-names=ABI Print GPR and FPR names according to\n\
2121 specified ABI.\n"));
2122
2123 fprintf (stream, _("\n\
2124 reg-names=ARCH Print CP0 register and HWR names according to\n\
2125 specified architecture.\n"));
2126
2127 fprintf (stream, _("\n\
2128 For the options above, the following values are supported for \"ABI\":\n\
2129 "));
2130 for (i = 0; i < ARRAY_SIZE (mips_abi_choices); i++)
2131 fprintf (stream, " %s", mips_abi_choices[i].name);
2132 fprintf (stream, _("\n"));
2133
2134 fprintf (stream, _("\n\
2135 For the options above, The following values are supported for \"ARCH\":\n\
2136 "));
2137 for (i = 0; i < ARRAY_SIZE (mips_arch_choices); i++)
2138 if (*mips_arch_choices[i].name != '\0')
2139 fprintf (stream, " %s", mips_arch_choices[i].name);
2140 fprintf (stream, _("\n"));
2141
2142 fprintf (stream, _("\n"));
2143 }