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