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