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