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