[MIPS/GAS] Add Loongson EXT2 Instructions support.
[external/binutils.git] / opcodes / mips-dis.c
1 /* Print mips instructions for GDB, the GNU debugger, or for objdump.
2    Copyright (C) 1989-2018 Free Software Foundation, Inc.
3    Contributed by Nobuyuki Hikichi(hikichi@sra.co.jp).
4
5    This file is part of the GNU opcodes library.
6
7    This library is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3, or (at your option)
10    any later version.
11
12    It is distributed in the hope that it will be useful, but WITHOUT
13    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15    License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21
22 #include "sysdep.h"
23 #include "disassemble.h"
24 #include "libiberty.h"
25 #include "opcode/mips.h"
26 #include "opintl.h"
27
28 /* FIXME: These are needed to figure out if the code is mips16 or
29    not. The low bit of the address is often a good indicator.  No
30    symbol table is available when this code runs out in an embedded
31    system as when it is used for disassembler support in a monitor.  */
32
33 #if !defined(EMBEDDED_ENV)
34 #define SYMTAB_AVAILABLE 1
35 #include "elf-bfd.h"
36 #include "elf/mips.h"
37 #endif
38
39 /* Mips instructions are at maximum this many bytes long.  */
40 #define INSNLEN 4
41
42 \f
43 /* FIXME: These should be shared with gdb somehow.  */
44
45 struct mips_cp0sel_name
46 {
47   unsigned int cp0reg;
48   unsigned int sel;
49   const char * const name;
50 };
51
52 static const char * const mips_gpr_names_numeric[32] =
53 {
54   "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
55   "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
56   "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
57   "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31"
58 };
59
60 static const char * const mips_gpr_names_oldabi[32] =
61 {
62   "zero", "at",   "v0",   "v1",   "a0",   "a1",   "a2",   "a3",
63   "t0",   "t1",   "t2",   "t3",   "t4",   "t5",   "t6",   "t7",
64   "s0",   "s1",   "s2",   "s3",   "s4",   "s5",   "s6",   "s7",
65   "t8",   "t9",   "k0",   "k1",   "gp",   "sp",   "s8",   "ra"
66 };
67
68 static const char * const mips_gpr_names_newabi[32] =
69 {
70   "zero", "at",   "v0",   "v1",   "a0",   "a1",   "a2",   "a3",
71   "a4",   "a5",   "a6",   "a7",   "t0",   "t1",   "t2",   "t3",
72   "s0",   "s1",   "s2",   "s3",   "s4",   "s5",   "s6",   "s7",
73   "t8",   "t9",   "k0",   "k1",   "gp",   "sp",   "s8",   "ra"
74 };
75
76 static const char * const mips_fpr_names_numeric[32] =
77 {
78   "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
79   "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
80   "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
81   "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31"
82 };
83
84 static const char * const mips_fpr_names_32[32] =
85 {
86   "fv0",  "fv0f", "fv1",  "fv1f", "ft0",  "ft0f", "ft1",  "ft1f",
87   "ft2",  "ft2f", "ft3",  "ft3f", "fa0",  "fa0f", "fa1",  "fa1f",
88   "ft4",  "ft4f", "ft5",  "ft5f", "fs0",  "fs0f", "fs1",  "fs1f",
89   "fs2",  "fs2f", "fs3",  "fs3f", "fs4",  "fs4f", "fs5",  "fs5f"
90 };
91
92 static const char * const mips_fpr_names_n32[32] =
93 {
94   "fv0",  "ft14", "fv1",  "ft15", "ft0",  "ft1",  "ft2",  "ft3",
95   "ft4",  "ft5",  "ft6",  "ft7",  "fa0",  "fa1",  "fa2",  "fa3",
96   "fa4",  "fa5",  "fa6",  "fa7",  "fs0",  "ft8",  "fs1",  "ft9",
97   "fs2",  "ft10", "fs3",  "ft11", "fs4",  "ft12", "fs5",  "ft13"
98 };
99
100 static const char * const mips_fpr_names_64[32] =
101 {
102   "fv0",  "ft12", "fv1",  "ft13", "ft0",  "ft1",  "ft2",  "ft3",
103   "ft4",  "ft5",  "ft6",  "ft7",  "fa0",  "fa1",  "fa2",  "fa3",
104   "fa4",  "fa5",  "fa6",  "fa7",  "ft8",  "ft9",  "ft10", "ft11",
105   "fs0",  "fs1",  "fs2",  "fs3",  "fs4",  "fs5",  "fs6",  "fs7"
106 };
107
108 static const char * const mips_cp0_names_numeric[32] =
109 {
110   "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
111   "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
112   "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
113   "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31"
114 };
115
116 static const char * const mips_cp1_names_numeric[32] =
117 {
118   "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
119   "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
120   "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
121   "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31"
122 };
123
124 static const char * const mips_cp0_names_r3000[32] =
125 {
126   "c0_index",     "c0_random",    "c0_entrylo",   "$3",
127   "c0_context",   "$5",           "$6",           "$7",
128   "c0_badvaddr",  "$9",           "c0_entryhi",   "$11",
129   "c0_sr",        "c0_cause",     "c0_epc",       "c0_prid",
130   "$16",          "$17",          "$18",          "$19",
131   "$20",          "$21",          "$22",          "$23",
132   "$24",          "$25",          "$26",          "$27",
133   "$28",          "$29",          "$30",          "$31",
134 };
135
136 static const char * const mips_cp0_names_r4000[32] =
137 {
138   "c0_index",     "c0_random",    "c0_entrylo0",  "c0_entrylo1",
139   "c0_context",   "c0_pagemask",  "c0_wired",     "$7",
140   "c0_badvaddr",  "c0_count",     "c0_entryhi",   "c0_compare",
141   "c0_sr",        "c0_cause",     "c0_epc",       "c0_prid",
142   "c0_config",    "c0_lladdr",    "c0_watchlo",   "c0_watchhi",
143   "c0_xcontext",  "$21",          "$22",          "$23",
144   "$24",          "$25",          "c0_ecc",       "c0_cacheerr",
145   "c0_taglo",     "c0_taghi",     "c0_errorepc",  "$31",
146 };
147
148 static const char * const mips_cp0_names_r5900[32] =
149 {
150   "c0_index",     "c0_random",    "c0_entrylo0",  "c0_entrylo1",
151   "c0_context",   "c0_pagemask",  "c0_wired",     "$7",
152   "c0_badvaddr",  "c0_count",     "c0_entryhi",   "c0_compare",
153   "c0_sr",        "c0_cause",     "c0_epc",       "c0_prid",
154   "c0_config",    "$17",          "$18",          "$19",
155   "$20",          "$21",          "$22",          "c0_badpaddr",
156   "c0_depc",      "c0_perfcnt",   "$26",          "$27",
157   "c0_taglo",     "c0_taghi",     "c0_errorepc",  "$31"
158 };
159
160 static const char * const mips_cp0_names_mips3264[32] =
161 {
162   "c0_index",     "c0_random",    "c0_entrylo0",  "c0_entrylo1",
163   "c0_context",   "c0_pagemask",  "c0_wired",     "$7",
164   "c0_badvaddr",  "c0_count",     "c0_entryhi",   "c0_compare",
165   "c0_status",    "c0_cause",     "c0_epc",       "c0_prid",
166   "c0_config",    "c0_lladdr",    "c0_watchlo",   "c0_watchhi",
167   "c0_xcontext",  "$21",          "$22",          "c0_debug",
168   "c0_depc",      "c0_perfcnt",   "c0_errctl",    "c0_cacheerr",
169   "c0_taglo",     "c0_taghi",     "c0_errorepc",  "c0_desave",
170 };
171
172 static const char * const mips_cp1_names_mips3264[32] =
173 {
174   "c1_fir",       "c1_ufr",       "$2",           "$3",
175   "c1_unfr",      "$5",           "$6",           "$7",
176   "$8",           "$9",           "$10",          "$11",
177   "$12",          "$13",          "$14",          "$15",
178   "$16",          "$17",          "$18",          "$19",
179   "$20",          "$21",          "$22",          "$23",
180   "$24",          "c1_fccr",      "c1_fexr",      "$27",
181   "c1_fenr",      "$29",          "$30",          "c1_fcsr"
182 };
183
184 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264[] =
185 {
186   { 16, 1, "c0_config1"         },
187   { 16, 2, "c0_config2"         },
188   { 16, 3, "c0_config3"         },
189   { 18, 1, "c0_watchlo,1"       },
190   { 18, 2, "c0_watchlo,2"       },
191   { 18, 3, "c0_watchlo,3"       },
192   { 18, 4, "c0_watchlo,4"       },
193   { 18, 5, "c0_watchlo,5"       },
194   { 18, 6, "c0_watchlo,6"       },
195   { 18, 7, "c0_watchlo,7"       },
196   { 19, 1, "c0_watchhi,1"       },
197   { 19, 2, "c0_watchhi,2"       },
198   { 19, 3, "c0_watchhi,3"       },
199   { 19, 4, "c0_watchhi,4"       },
200   { 19, 5, "c0_watchhi,5"       },
201   { 19, 6, "c0_watchhi,6"       },
202   { 19, 7, "c0_watchhi,7"       },
203   { 25, 1, "c0_perfcnt,1"       },
204   { 25, 2, "c0_perfcnt,2"       },
205   { 25, 3, "c0_perfcnt,3"       },
206   { 25, 4, "c0_perfcnt,4"       },
207   { 25, 5, "c0_perfcnt,5"       },
208   { 25, 6, "c0_perfcnt,6"       },
209   { 25, 7, "c0_perfcnt,7"       },
210   { 27, 1, "c0_cacheerr,1"      },
211   { 27, 2, "c0_cacheerr,2"      },
212   { 27, 3, "c0_cacheerr,3"      },
213   { 28, 1, "c0_datalo"          },
214   { 29, 1, "c0_datahi"          }
215 };
216
217 static const char * const mips_cp0_names_mips3264r2[32] =
218 {
219   "c0_index",     "c0_random",    "c0_entrylo0",  "c0_entrylo1",
220   "c0_context",   "c0_pagemask",  "c0_wired",     "c0_hwrena",
221   "c0_badvaddr",  "c0_count",     "c0_entryhi",   "c0_compare",
222   "c0_status",    "c0_cause",     "c0_epc",       "c0_prid",
223   "c0_config",    "c0_lladdr",    "c0_watchlo",   "c0_watchhi",
224   "c0_xcontext",  "$21",          "$22",          "c0_debug",
225   "c0_depc",      "c0_perfcnt",   "c0_errctl",    "c0_cacheerr",
226   "c0_taglo",     "c0_taghi",     "c0_errorepc",  "c0_desave",
227 };
228
229 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264r2[] =
230 {
231   {  4, 1, "c0_contextconfig"   },
232   {  0, 1, "c0_mvpcontrol"      },
233   {  0, 2, "c0_mvpconf0"        },
234   {  0, 3, "c0_mvpconf1"        },
235   {  1, 1, "c0_vpecontrol"      },
236   {  1, 2, "c0_vpeconf0"        },
237   {  1, 3, "c0_vpeconf1"        },
238   {  1, 4, "c0_yqmask"          },
239   {  1, 5, "c0_vpeschedule"     },
240   {  1, 6, "c0_vpeschefback"    },
241   {  2, 1, "c0_tcstatus"        },
242   {  2, 2, "c0_tcbind"          },
243   {  2, 3, "c0_tcrestart"       },
244   {  2, 4, "c0_tchalt"          },
245   {  2, 5, "c0_tccontext"       },
246   {  2, 6, "c0_tcschedule"      },
247   {  2, 7, "c0_tcschefback"     },
248   {  5, 1, "c0_pagegrain"       },
249   {  6, 1, "c0_srsconf0"        },
250   {  6, 2, "c0_srsconf1"        },
251   {  6, 3, "c0_srsconf2"        },
252   {  6, 4, "c0_srsconf3"        },
253   {  6, 5, "c0_srsconf4"        },
254   { 12, 1, "c0_intctl"          },
255   { 12, 2, "c0_srsctl"          },
256   { 12, 3, "c0_srsmap"          },
257   { 15, 1, "c0_ebase"           },
258   { 16, 1, "c0_config1"         },
259   { 16, 2, "c0_config2"         },
260   { 16, 3, "c0_config3"         },
261   { 18, 1, "c0_watchlo,1"       },
262   { 18, 2, "c0_watchlo,2"       },
263   { 18, 3, "c0_watchlo,3"       },
264   { 18, 4, "c0_watchlo,4"       },
265   { 18, 5, "c0_watchlo,5"       },
266   { 18, 6, "c0_watchlo,6"       },
267   { 18, 7, "c0_watchlo,7"       },
268   { 19, 1, "c0_watchhi,1"       },
269   { 19, 2, "c0_watchhi,2"       },
270   { 19, 3, "c0_watchhi,3"       },
271   { 19, 4, "c0_watchhi,4"       },
272   { 19, 5, "c0_watchhi,5"       },
273   { 19, 6, "c0_watchhi,6"       },
274   { 19, 7, "c0_watchhi,7"       },
275   { 23, 1, "c0_tracecontrol"    },
276   { 23, 2, "c0_tracecontrol2"   },
277   { 23, 3, "c0_usertracedata"   },
278   { 23, 4, "c0_tracebpc"        },
279   { 25, 1, "c0_perfcnt,1"       },
280   { 25, 2, "c0_perfcnt,2"       },
281   { 25, 3, "c0_perfcnt,3"       },
282   { 25, 4, "c0_perfcnt,4"       },
283   { 25, 5, "c0_perfcnt,5"       },
284   { 25, 6, "c0_perfcnt,6"       },
285   { 25, 7, "c0_perfcnt,7"       },
286   { 27, 1, "c0_cacheerr,1"      },
287   { 27, 2, "c0_cacheerr,2"      },
288   { 27, 3, "c0_cacheerr,3"      },
289   { 28, 1, "c0_datalo"          },
290   { 28, 2, "c0_taglo1"          },
291   { 28, 3, "c0_datalo1"         },
292   { 28, 4, "c0_taglo2"          },
293   { 28, 5, "c0_datalo2"         },
294   { 28, 6, "c0_taglo3"          },
295   { 28, 7, "c0_datalo3"         },
296   { 29, 1, "c0_datahi"          },
297   { 29, 2, "c0_taghi1"          },
298   { 29, 3, "c0_datahi1"         },
299   { 29, 4, "c0_taghi2"          },
300   { 29, 5, "c0_datahi2"         },
301   { 29, 6, "c0_taghi3"          },
302   { 29, 7, "c0_datahi3"         },
303 };
304
305 /* SB-1: MIPS64 (mips_cp0_names_mips3264) with minor mods.  */
306 static const char * const mips_cp0_names_sb1[32] =
307 {
308   "c0_index",     "c0_random",    "c0_entrylo0",  "c0_entrylo1",
309   "c0_context",   "c0_pagemask",  "c0_wired",     "$7",
310   "c0_badvaddr",  "c0_count",     "c0_entryhi",   "c0_compare",
311   "c0_status",    "c0_cause",     "c0_epc",       "c0_prid",
312   "c0_config",    "c0_lladdr",    "c0_watchlo",   "c0_watchhi",
313   "c0_xcontext",  "$21",          "$22",          "c0_debug",
314   "c0_depc",      "c0_perfcnt",   "c0_errctl",    "c0_cacheerr_i",
315   "c0_taglo_i",   "c0_taghi_i",   "c0_errorepc",  "c0_desave",
316 };
317
318 static const struct mips_cp0sel_name mips_cp0sel_names_sb1[] =
319 {
320   { 16, 1, "c0_config1"         },
321   { 18, 1, "c0_watchlo,1"       },
322   { 19, 1, "c0_watchhi,1"       },
323   { 22, 0, "c0_perftrace"       },
324   { 23, 3, "c0_edebug"          },
325   { 25, 1, "c0_perfcnt,1"       },
326   { 25, 2, "c0_perfcnt,2"       },
327   { 25, 3, "c0_perfcnt,3"       },
328   { 25, 4, "c0_perfcnt,4"       },
329   { 25, 5, "c0_perfcnt,5"       },
330   { 25, 6, "c0_perfcnt,6"       },
331   { 25, 7, "c0_perfcnt,7"       },
332   { 26, 1, "c0_buserr_pa"       },
333   { 27, 1, "c0_cacheerr_d"      },
334   { 27, 3, "c0_cacheerr_d_pa"   },
335   { 28, 1, "c0_datalo_i"        },
336   { 28, 2, "c0_taglo_d"         },
337   { 28, 3, "c0_datalo_d"        },
338   { 29, 1, "c0_datahi_i"        },
339   { 29, 2, "c0_taghi_d"         },
340   { 29, 3, "c0_datahi_d"        },
341 };
342
343 /* Xlr cop0 register names.  */
344 static const char * const mips_cp0_names_xlr[32] = {
345   "c0_index",     "c0_random",    "c0_entrylo0",  "c0_entrylo1",
346   "c0_context",   "c0_pagemask",  "c0_wired",     "$7",
347   "c0_badvaddr",  "c0_count",     "c0_entryhi",   "c0_compare",
348   "c0_status",    "c0_cause",     "c0_epc",       "c0_prid",
349   "c0_config",    "c0_lladdr",    "c0_watchlo",   "c0_watchhi",
350   "c0_xcontext",  "$21",          "$22",          "c0_debug",
351   "c0_depc",      "c0_perfcnt",   "c0_errctl",    "c0_cacheerr_i",
352   "c0_taglo_i",   "c0_taghi_i",   "c0_errorepc",  "c0_desave",
353 };
354
355 /* XLR's CP0 Select Registers.  */
356
357 static const struct mips_cp0sel_name mips_cp0sel_names_xlr[] = {
358   {  9, 6, "c0_extintreq"       },
359   {  9, 7, "c0_extintmask"      },
360   { 15, 1, "c0_ebase"           },
361   { 16, 1, "c0_config1"         },
362   { 16, 2, "c0_config2"         },
363   { 16, 3, "c0_config3"         },
364   { 16, 7, "c0_procid2"         },
365   { 18, 1, "c0_watchlo,1"       },
366   { 18, 2, "c0_watchlo,2"       },
367   { 18, 3, "c0_watchlo,3"       },
368   { 18, 4, "c0_watchlo,4"       },
369   { 18, 5, "c0_watchlo,5"       },
370   { 18, 6, "c0_watchlo,6"       },
371   { 18, 7, "c0_watchlo,7"       },
372   { 19, 1, "c0_watchhi,1"       },
373   { 19, 2, "c0_watchhi,2"       },
374   { 19, 3, "c0_watchhi,3"       },
375   { 19, 4, "c0_watchhi,4"       },
376   { 19, 5, "c0_watchhi,5"       },
377   { 19, 6, "c0_watchhi,6"       },
378   { 19, 7, "c0_watchhi,7"       },
379   { 25, 1, "c0_perfcnt,1"       },
380   { 25, 2, "c0_perfcnt,2"       },
381   { 25, 3, "c0_perfcnt,3"       },
382   { 25, 4, "c0_perfcnt,4"       },
383   { 25, 5, "c0_perfcnt,5"       },
384   { 25, 6, "c0_perfcnt,6"       },
385   { 25, 7, "c0_perfcnt,7"       },
386   { 27, 1, "c0_cacheerr,1"      },
387   { 27, 2, "c0_cacheerr,2"      },
388   { 27, 3, "c0_cacheerr,3"      },
389   { 28, 1, "c0_datalo"          },
390   { 29, 1, "c0_datahi"          }
391 };
392
393 static const char * const mips_hwr_names_numeric[32] =
394 {
395   "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
396   "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
397   "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
398   "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31"
399 };
400
401 static const char * const mips_hwr_names_mips3264r2[32] =
402 {
403   "hwr_cpunum",   "hwr_synci_step", "hwr_cc",     "hwr_ccres",
404   "$4",          "$5",            "$6",           "$7",
405   "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
406   "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
407   "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31"
408 };
409
410 static const char * const msa_control_names[32] =
411 {
412   "msa_ir",     "msa_csr",      "msa_access",   "msa_save",
413   "msa_modify", "msa_request",  "msa_map",      "msa_unmap",
414   "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
415   "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
416   "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31"
417 };
418
419 struct mips_abi_choice
420 {
421   const char * name;
422   const char * const *gpr_names;
423   const char * const *fpr_names;
424 };
425
426 struct mips_abi_choice mips_abi_choices[] =
427 {
428   { "numeric", mips_gpr_names_numeric, mips_fpr_names_numeric },
429   { "32", mips_gpr_names_oldabi, mips_fpr_names_32 },
430   { "n32", mips_gpr_names_newabi, mips_fpr_names_n32 },
431   { "64", mips_gpr_names_newabi, mips_fpr_names_64 },
432 };
433
434 struct mips_arch_choice
435 {
436   const char *name;
437   int bfd_mach_valid;
438   unsigned long bfd_mach;
439   int processor;
440   int isa;
441   int ase;
442   const char * const *cp0_names;
443   const struct mips_cp0sel_name *cp0sel_names;
444   unsigned int cp0sel_names_len;
445   const char * const *cp1_names;
446   const char * const *hwr_names;
447 };
448
449 const struct mips_arch_choice mips_arch_choices[] =
450 {
451   { "numeric",  0, 0, 0, 0, 0,
452     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
453     mips_hwr_names_numeric },
454
455   { "r3000",    1, bfd_mach_mips3000, CPU_R3000, ISA_MIPS1, 0,
456     mips_cp0_names_r3000, NULL, 0, mips_cp1_names_numeric,
457     mips_hwr_names_numeric },
458   { "r3900",    1, bfd_mach_mips3900, CPU_R3900, ISA_MIPS1, 0,
459     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
460     mips_hwr_names_numeric },
461   { "r4000",    1, bfd_mach_mips4000, CPU_R4000, ISA_MIPS3, 0,
462     mips_cp0_names_r4000, NULL, 0, mips_cp1_names_numeric,
463     mips_hwr_names_numeric },
464   { "r4010",    1, bfd_mach_mips4010, CPU_R4010, ISA_MIPS2, 0,
465     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
466     mips_hwr_names_numeric },
467   { "vr4100",   1, bfd_mach_mips4100, CPU_VR4100, ISA_MIPS3, 0,
468     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
469     mips_hwr_names_numeric },
470   { "vr4111",   1, bfd_mach_mips4111, CPU_R4111, ISA_MIPS3, 0,
471     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
472     mips_hwr_names_numeric },
473   { "vr4120",   1, bfd_mach_mips4120, CPU_VR4120, ISA_MIPS3, 0,
474     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
475     mips_hwr_names_numeric },
476   { "r4300",    1, bfd_mach_mips4300, CPU_R4300, ISA_MIPS3, 0,
477     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
478     mips_hwr_names_numeric },
479   { "r4400",    1, bfd_mach_mips4400, CPU_R4400, ISA_MIPS3, 0,
480     mips_cp0_names_r4000, NULL, 0, mips_cp1_names_numeric,
481     mips_hwr_names_numeric },
482   { "r4600",    1, bfd_mach_mips4600, CPU_R4600, ISA_MIPS3, 0,
483     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
484     mips_hwr_names_numeric },
485   { "r4650",    1, bfd_mach_mips4650, CPU_R4650, ISA_MIPS3, 0,
486     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
487     mips_hwr_names_numeric },
488   { "r5000",    1, bfd_mach_mips5000, CPU_R5000, ISA_MIPS4, 0,
489     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
490     mips_hwr_names_numeric },
491   { "vr5400",   1, bfd_mach_mips5400, CPU_VR5400, ISA_MIPS4, 0,
492     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
493     mips_hwr_names_numeric },
494   { "vr5500",   1, bfd_mach_mips5500, CPU_VR5500, ISA_MIPS4, 0,
495     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
496     mips_hwr_names_numeric },
497   { "r5900",    1, bfd_mach_mips5900, CPU_R5900, ISA_MIPS3, 0,
498     mips_cp0_names_r5900, NULL, 0, mips_cp1_names_numeric,
499     mips_hwr_names_numeric },
500   { "r6000",    1, bfd_mach_mips6000, CPU_R6000, ISA_MIPS2, 0,
501     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
502     mips_hwr_names_numeric },
503   { "rm7000",   1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4, 0,
504     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
505     mips_hwr_names_numeric },
506   { "rm9000",   1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4, 0,
507     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
508     mips_hwr_names_numeric },
509   { "r8000",    1, bfd_mach_mips8000, CPU_R8000, ISA_MIPS4, 0,
510     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
511     mips_hwr_names_numeric },
512   { "r10000",   1, bfd_mach_mips10000, CPU_R10000, ISA_MIPS4, 0,
513     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
514     mips_hwr_names_numeric },
515   { "r12000",   1, bfd_mach_mips12000, CPU_R12000, ISA_MIPS4, 0,
516     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
517     mips_hwr_names_numeric },
518   { "r14000",   1, bfd_mach_mips14000, CPU_R14000, ISA_MIPS4, 0,
519     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
520     mips_hwr_names_numeric },
521   { "r16000",   1, bfd_mach_mips16000, CPU_R16000, ISA_MIPS4, 0,
522     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
523     mips_hwr_names_numeric },
524   { "mips5",    1, bfd_mach_mips5, CPU_MIPS5, ISA_MIPS5, 0,
525     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
526     mips_hwr_names_numeric },
527
528   /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
529      Note that MIPS-3D and MDMX are not applicable to MIPS32.  (See
530      _MIPS32 Architecture For Programmers Volume I: Introduction to the
531      MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
532      page 1.  */
533   { "mips32",   1, bfd_mach_mipsisa32, CPU_MIPS32,
534     ISA_MIPS32,  ASE_SMARTMIPS,
535     mips_cp0_names_mips3264,
536     mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
537     mips_cp1_names_mips3264, mips_hwr_names_numeric },
538
539   { "mips32r2", 1, bfd_mach_mipsisa32r2, CPU_MIPS32R2,
540     ISA_MIPS32R2,
541     (ASE_SMARTMIPS | ASE_DSP | ASE_DSPR2 | ASE_EVA | ASE_MIPS3D
542      | ASE_MT | ASE_MCU | ASE_VIRT | ASE_MSA | ASE_XPA),
543     mips_cp0_names_mips3264r2,
544     mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
545     mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
546
547   { "mips32r3", 1, bfd_mach_mipsisa32r3, CPU_MIPS32R3,
548     ISA_MIPS32R3,
549     (ASE_SMARTMIPS | ASE_DSP | ASE_DSPR2 | ASE_EVA | ASE_MIPS3D
550      | ASE_MT | ASE_MCU | ASE_VIRT | ASE_MSA | ASE_XPA),
551     mips_cp0_names_mips3264r2,
552     mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
553     mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
554
555   { "mips32r5", 1, bfd_mach_mipsisa32r5, CPU_MIPS32R5,
556     ISA_MIPS32R5,
557     (ASE_SMARTMIPS | ASE_DSP | ASE_DSPR2 | ASE_EVA | ASE_MIPS3D
558      | ASE_MT | ASE_MCU | ASE_VIRT | ASE_MSA | ASE_XPA),
559     mips_cp0_names_mips3264r2,
560     mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
561     mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
562
563   { "mips32r6", 1, bfd_mach_mipsisa32r6, CPU_MIPS32R6,
564     ISA_MIPS32R6,
565     (ASE_EVA | ASE_MSA | ASE_VIRT | ASE_XPA | ASE_MCU | ASE_MT | ASE_DSP
566      | ASE_DSPR2 | ASE_DSPR3 | ASE_CRC | ASE_GINV),
567     mips_cp0_names_mips3264r2,
568     mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
569     mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
570
571   /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs.  */
572   { "mips64",   1, bfd_mach_mipsisa64, CPU_MIPS64,
573     ISA_MIPS64,  ASE_MIPS3D | ASE_MDMX,
574     mips_cp0_names_mips3264,
575     mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
576     mips_cp1_names_mips3264, mips_hwr_names_numeric },
577
578   { "mips64r2", 1, bfd_mach_mipsisa64r2, CPU_MIPS64R2,
579     ISA_MIPS64R2,
580     (ASE_MIPS3D | ASE_DSP | ASE_DSPR2 | ASE_DSP64 | ASE_EVA | ASE_MT
581      | ASE_MCU | ASE_VIRT | ASE_VIRT64 | ASE_MSA | ASE_MSA64 | ASE_XPA),
582     mips_cp0_names_mips3264r2,
583     mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
584     mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
585
586   { "mips64r3", 1, bfd_mach_mipsisa64r3, CPU_MIPS64R3,
587     ISA_MIPS64R3,
588     (ASE_MIPS3D | ASE_DSP | ASE_DSPR2 | ASE_DSP64 | ASE_EVA | ASE_MT
589      | ASE_MCU | ASE_VIRT | ASE_VIRT64 | ASE_MSA | ASE_MSA64 | ASE_XPA),
590     mips_cp0_names_mips3264r2,
591     mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
592     mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
593
594   { "mips64r5", 1, bfd_mach_mipsisa64r5, CPU_MIPS64R5,
595     ISA_MIPS64R5,
596     (ASE_MIPS3D | ASE_DSP | ASE_DSPR2 | ASE_DSP64 | ASE_EVA | ASE_MT
597      | ASE_MCU | ASE_VIRT | ASE_VIRT64 | ASE_MSA | ASE_MSA64 | ASE_XPA),
598     mips_cp0_names_mips3264r2,
599     mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
600     mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
601
602   { "mips64r6", 1, bfd_mach_mipsisa64r6, CPU_MIPS64R6,
603     ISA_MIPS64R6,
604     (ASE_EVA | ASE_MSA | ASE_MSA64 | ASE_XPA | ASE_VIRT | ASE_VIRT64
605      | ASE_MCU | ASE_MT | ASE_DSP | ASE_DSPR2 | ASE_DSPR3 | ASE_CRC
606      | ASE_CRC64 | ASE_GINV),
607     mips_cp0_names_mips3264r2,
608     mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
609     mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
610
611   { "interaptiv-mr2",   1, bfd_mach_mips_interaptiv_mr2, CPU_INTERAPTIV_MR2,
612     ISA_MIPS32R3,
613     ASE_MT | ASE_EVA | ASE_DSP | ASE_DSPR2 | ASE_MIPS16E2 | ASE_MIPS16E2_MT,
614     mips_cp0_names_mips3264r2,
615     mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
616     mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
617
618   { "sb1",      1, bfd_mach_mips_sb1, CPU_SB1,
619     ISA_MIPS64 | INSN_SB1,  ASE_MIPS3D,
620     mips_cp0_names_sb1,
621     mips_cp0sel_names_sb1, ARRAY_SIZE (mips_cp0sel_names_sb1),
622     mips_cp1_names_mips3264, mips_hwr_names_numeric },
623
624   { "loongson2e",   1, bfd_mach_mips_loongson_2e, CPU_LOONGSON_2E,
625     ISA_MIPS3 | INSN_LOONGSON_2E, 0, mips_cp0_names_numeric,
626     NULL, 0, mips_cp1_names_numeric, mips_hwr_names_numeric },
627
628   { "loongson2f",   1, bfd_mach_mips_loongson_2f, CPU_LOONGSON_2F,
629     ISA_MIPS3 | INSN_LOONGSON_2F, ASE_LOONGSON_MMI, mips_cp0_names_numeric,
630     NULL, 0, mips_cp1_names_numeric, mips_hwr_names_numeric },
631
632   { "loongson3a",   1, bfd_mach_mips_loongson_3a, CPU_LOONGSON_3A,
633     ISA_MIPS64R2, ASE_LOONGSON_MMI | ASE_LOONGSON_CAM | ASE_LOONGSON_EXT,
634     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_mips3264,
635     mips_hwr_names_numeric },
636
637   { "octeon",   1, bfd_mach_mips_octeon, CPU_OCTEON,
638     ISA_MIPS64R2 | INSN_OCTEON, 0, mips_cp0_names_numeric, NULL, 0,
639     mips_cp1_names_mips3264, mips_hwr_names_numeric },
640
641   { "octeon+",   1, bfd_mach_mips_octeonp, CPU_OCTEONP,
642     ISA_MIPS64R2 | INSN_OCTEONP, 0, mips_cp0_names_numeric,
643     NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
644
645   { "octeon2",   1, bfd_mach_mips_octeon2, CPU_OCTEON2,
646     ISA_MIPS64R2 | INSN_OCTEON2, 0, mips_cp0_names_numeric,
647     NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
648
649   { "octeon3",   1, bfd_mach_mips_octeon3, CPU_OCTEON3,
650     ISA_MIPS64R5 | INSN_OCTEON3, ASE_VIRT | ASE_VIRT64,
651     mips_cp0_names_numeric,
652     NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
653
654   { "xlr", 1, bfd_mach_mips_xlr, CPU_XLR,
655     ISA_MIPS64 | INSN_XLR, 0,
656     mips_cp0_names_xlr,
657     mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
658     mips_cp1_names_mips3264, mips_hwr_names_numeric },
659
660   /* XLP is mostly like XLR, with the prominent exception it is being
661      MIPS64R2.  */
662   { "xlp", 1, bfd_mach_mips_xlr, CPU_XLR,
663     ISA_MIPS64R2 | INSN_XLR, 0,
664     mips_cp0_names_xlr,
665     mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
666     mips_cp1_names_mips3264, mips_hwr_names_numeric },
667
668   /* This entry, mips16, is here only for ISA/processor selection; do
669      not print its name.  */
670   { "",         1, bfd_mach_mips16, CPU_MIPS16, ISA_MIPS64,
671     ASE_MIPS16E2 | ASE_MIPS16E2_MT,
672     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
673     mips_hwr_names_numeric },
674 };
675
676 /* ISA and processor type to disassemble for, and register names to use.
677    set_default_mips_dis_options and parse_mips_dis_options fill in these
678    values.  */
679 static int mips_processor;
680 static int mips_isa;
681 static int mips_ase;
682 static int micromips_ase;
683 static const char * const *mips_gpr_names;
684 static const char * const *mips_fpr_names;
685 static const char * const *mips_cp0_names;
686 static const struct mips_cp0sel_name *mips_cp0sel_names;
687 static int mips_cp0sel_names_len;
688 static const char * const *mips_cp1_names;
689 static const char * const *mips_hwr_names;
690
691 /* Other options */
692 static int no_aliases;  /* If set disassemble as most general inst.  */
693 \f
694 static const struct mips_abi_choice *
695 choose_abi_by_name (const char *name, unsigned int namelen)
696 {
697   const struct mips_abi_choice *c;
698   unsigned int i;
699
700   for (i = 0, c = NULL; i < ARRAY_SIZE (mips_abi_choices) && c == NULL; i++)
701     if (strncmp (mips_abi_choices[i].name, name, namelen) == 0
702         && strlen (mips_abi_choices[i].name) == namelen)
703       c = &mips_abi_choices[i];
704
705   return c;
706 }
707
708 static const struct mips_arch_choice *
709 choose_arch_by_name (const char *name, unsigned int namelen)
710 {
711   const struct mips_arch_choice *c = NULL;
712   unsigned int i;
713
714   for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
715     if (strncmp (mips_arch_choices[i].name, name, namelen) == 0
716         && strlen (mips_arch_choices[i].name) == namelen)
717       c = &mips_arch_choices[i];
718
719   return c;
720 }
721
722 static const struct mips_arch_choice *
723 choose_arch_by_number (unsigned long mach)
724 {
725   static unsigned long hint_bfd_mach;
726   static const struct mips_arch_choice *hint_arch_choice;
727   const struct mips_arch_choice *c;
728   unsigned int i;
729
730   /* We optimize this because even if the user specifies no
731      flags, this will be done for every instruction!  */
732   if (hint_bfd_mach == mach
733       && hint_arch_choice != NULL
734       && hint_arch_choice->bfd_mach == hint_bfd_mach)
735     return hint_arch_choice;
736
737   for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
738     {
739       if (mips_arch_choices[i].bfd_mach_valid
740           && mips_arch_choices[i].bfd_mach == mach)
741         {
742           c = &mips_arch_choices[i];
743           hint_bfd_mach = mach;
744           hint_arch_choice = c;
745         }
746     }
747   return c;
748 }
749
750 /* Check if the object uses NewABI conventions.  */
751
752 static int
753 is_newabi (Elf_Internal_Ehdr *header)
754 {
755   /* There are no old-style ABIs which use 64-bit ELF.  */
756   if (header->e_ident[EI_CLASS] == ELFCLASS64)
757     return 1;
758
759   /* If a 32-bit ELF file, n32 is a new-style ABI.  */
760   if ((header->e_flags & EF_MIPS_ABI2) != 0)
761     return 1;
762
763   return 0;
764 }
765
766 /* Check if the object has microMIPS ASE code.  */
767
768 static int
769 is_micromips (Elf_Internal_Ehdr *header)
770 {
771   if ((header->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS) != 0)
772     return 1;
773
774   return 0;
775 }
776
777 /* Convert ASE flags from .MIPS.abiflags to internal values.  */
778
779 static unsigned long
780 mips_convert_abiflags_ases (unsigned long afl_ases)
781 {
782   unsigned long opcode_ases = 0;
783
784   if (afl_ases & AFL_ASE_DSP)
785     opcode_ases |= ASE_DSP;
786   if (afl_ases & AFL_ASE_DSPR2)
787     opcode_ases |= ASE_DSPR2;
788   if (afl_ases & AFL_ASE_EVA)
789     opcode_ases |= ASE_EVA;
790   if (afl_ases & AFL_ASE_MCU)
791     opcode_ases |= ASE_MCU;
792   if (afl_ases & AFL_ASE_MDMX)
793     opcode_ases |= ASE_MDMX;
794   if (afl_ases & AFL_ASE_MIPS3D)
795     opcode_ases |= ASE_MIPS3D;
796   if (afl_ases & AFL_ASE_MT)
797     opcode_ases |= ASE_MT;
798   if (afl_ases & AFL_ASE_SMARTMIPS)
799     opcode_ases |= ASE_SMARTMIPS;
800   if (afl_ases & AFL_ASE_VIRT)
801     opcode_ases |= ASE_VIRT;
802   if (afl_ases & AFL_ASE_MSA)
803     opcode_ases |= ASE_MSA;
804   if (afl_ases & AFL_ASE_XPA)
805     opcode_ases |= ASE_XPA;
806   if (afl_ases & AFL_ASE_DSPR3)
807     opcode_ases |= ASE_DSPR3;
808   if (afl_ases & AFL_ASE_MIPS16E2)
809     opcode_ases |= ASE_MIPS16E2;
810   return opcode_ases;
811 }
812
813 /* Calculate combination ASE flags from regular ASE flags.  */
814
815 static unsigned long
816 mips_calculate_combination_ases (unsigned long opcode_ases)
817 {
818   unsigned long combination_ases = 0;
819
820   if ((opcode_ases & (ASE_XPA | ASE_VIRT)) == (ASE_XPA | ASE_VIRT))
821     combination_ases |= ASE_XPA_VIRT;
822   if ((opcode_ases & (ASE_MIPS16E2 | ASE_MT)) == (ASE_MIPS16E2 | ASE_MT))
823     combination_ases |= ASE_MIPS16E2_MT;
824   return combination_ases;
825 }
826
827 static void
828 set_default_mips_dis_options (struct disassemble_info *info)
829 {
830   const struct mips_arch_choice *chosen_arch;
831
832   /* Defaults: mipsIII/r3000 (?!), no microMIPS ASE (any compressed code
833      is MIPS16 ASE) (o)32-style ("oldabi") GPR names, and numeric FPR,
834      CP0 register, and HWR names.  */
835   mips_isa = ISA_MIPS3;
836   mips_processor = CPU_R3000;
837   micromips_ase = 0;
838   mips_ase = 0;
839   mips_gpr_names = mips_gpr_names_oldabi;
840   mips_fpr_names = mips_fpr_names_numeric;
841   mips_cp0_names = mips_cp0_names_numeric;
842   mips_cp0sel_names = NULL;
843   mips_cp0sel_names_len = 0;
844   mips_cp1_names = mips_cp1_names_numeric;
845   mips_hwr_names = mips_hwr_names_numeric;
846   no_aliases = 0;
847
848   /* Set ISA, architecture, and cp0 register names as best we can.  */
849 #if ! SYMTAB_AVAILABLE
850   /* This is running out on a target machine, not in a host tool.
851      FIXME: Where does mips_target_info come from?  */
852   target_processor = mips_target_info.processor;
853   mips_isa = mips_target_info.isa;
854   mips_ase = mips_target_info.ase;
855 #else
856   chosen_arch = choose_arch_by_number (info->mach);
857   if (chosen_arch != NULL)
858     {
859       mips_processor = chosen_arch->processor;
860       mips_isa = chosen_arch->isa;
861       mips_ase = chosen_arch->ase;
862       mips_cp0_names = chosen_arch->cp0_names;
863       mips_cp0sel_names = chosen_arch->cp0sel_names;
864       mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
865       mips_cp1_names = chosen_arch->cp1_names;
866       mips_hwr_names = chosen_arch->hwr_names;
867     }
868
869   /* Update settings according to the ELF file header flags.  */
870   if (info->flavour == bfd_target_elf_flavour && info->section != NULL)
871     {
872       struct bfd *abfd = info->section->owner;
873       Elf_Internal_Ehdr *header = elf_elfheader (abfd);
874       Elf_Internal_ABIFlags_v0 *abiflags = NULL;
875
876       /* We won't ever get here if !HAVE_BFD_MIPS_ELF_GET_ABIFLAGS,
877          because we won't then have a MIPS/ELF BFD, however we need
878          to guard against a link error in a `--enable-targets=...'
879          configuration with a 32-bit host where the MIPS target is
880          a secondary, or with MIPS/ECOFF configurations.  */
881 #ifdef HAVE_BFD_MIPS_ELF_GET_ABIFLAGS
882       abiflags = bfd_mips_elf_get_abiflags (abfd);
883 #endif
884       /* If an ELF "newabi" binary, use the n32/(n)64 GPR names.  */
885       if (is_newabi (header))
886         mips_gpr_names = mips_gpr_names_newabi;
887       /* If a microMIPS binary, then don't use MIPS16 bindings.  */
888       micromips_ase = is_micromips (header);
889       /* OR in any extra ASE flags set in ELF file structures.  */
890       if (abiflags)
891         mips_ase |= mips_convert_abiflags_ases (abiflags->ases);
892       else if (header->e_flags & EF_MIPS_ARCH_ASE_MDMX)
893         mips_ase |= ASE_MDMX;
894     }
895 #endif
896   mips_ase |= mips_calculate_combination_ases (mips_ase);
897 }
898
899 /* Parse an ASE disassembler option and set the corresponding global
900    ASE flag(s).  Return TRUE if successful, FALSE otherwise.  */
901
902 static bfd_boolean
903 parse_mips_ase_option (const char *option)
904 {
905   if (CONST_STRNEQ (option, "msa"))
906     {
907       mips_ase |= ASE_MSA;
908       if ((mips_isa & INSN_ISA_MASK) == ISA_MIPS64R2
909            || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R3
910            || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R5
911            || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R6)
912           mips_ase |= ASE_MSA64;
913       return TRUE;
914     }
915
916   if (CONST_STRNEQ (option, "virt"))
917     {
918       mips_ase |= ASE_VIRT;
919       if (mips_isa & ISA_MIPS64R2
920           || mips_isa & ISA_MIPS64R3
921           || mips_isa & ISA_MIPS64R5
922           || mips_isa & ISA_MIPS64R6)
923         mips_ase |= ASE_VIRT64;
924       return TRUE;
925     }
926
927   if (CONST_STRNEQ (option, "xpa"))
928     {
929       mips_ase |= ASE_XPA;
930       return TRUE;
931     }
932
933   if (CONST_STRNEQ (option, "ginv"))
934     {
935       mips_ase |= ASE_GINV;
936       return TRUE;
937     }
938
939   if (CONST_STRNEQ (option, "loongson-mmi"))
940     {
941       mips_ase |= ASE_LOONGSON_MMI;
942       return TRUE;
943     }
944
945   if (CONST_STRNEQ (option, "loongson-cam"))
946     {
947       mips_ase |= ASE_LOONGSON_CAM;
948       return TRUE;
949     }
950   
951   /* Put here for match ext2 frist */
952   if (CONST_STRNEQ (option, "loongson-ext2"))
953     {
954       mips_ase |= ASE_LOONGSON_EXT2;
955       return TRUE;
956     }
957
958   if (CONST_STRNEQ (option, "loongson-ext"))
959     {
960       mips_ase |= ASE_LOONGSON_EXT;
961       return TRUE;
962     }
963
964   return FALSE;
965 }
966
967 static void
968 parse_mips_dis_option (const char *option, unsigned int len)
969 {
970   unsigned int i, optionlen, vallen;
971   const char *val;
972   const struct mips_abi_choice *chosen_abi;
973   const struct mips_arch_choice *chosen_arch;
974
975   /* Try to match options that are simple flags */
976   if (CONST_STRNEQ (option, "no-aliases"))
977     {
978       no_aliases = 1;
979       return;
980     }
981
982   if (parse_mips_ase_option (option))
983     {
984       mips_ase |= mips_calculate_combination_ases (mips_ase);
985       return;
986     }
987
988   /* Look for the = that delimits the end of the option name.  */
989   for (i = 0; i < len; i++)
990     if (option[i] == '=')
991       break;
992
993   if (i == 0)           /* Invalid option: no name before '='.  */
994     return;
995   if (i == len)         /* Invalid option: no '='.  */
996     return;
997   if (i == (len - 1))   /* Invalid option: no value after '='.  */
998     return;
999
1000   optionlen = i;
1001   val = option + (optionlen + 1);
1002   vallen = len - (optionlen + 1);
1003
1004   if (strncmp ("gpr-names", option, optionlen) == 0
1005       && strlen ("gpr-names") == optionlen)
1006     {
1007       chosen_abi = choose_abi_by_name (val, vallen);
1008       if (chosen_abi != NULL)
1009         mips_gpr_names = chosen_abi->gpr_names;
1010       return;
1011     }
1012
1013   if (strncmp ("fpr-names", option, optionlen) == 0
1014       && strlen ("fpr-names") == optionlen)
1015     {
1016       chosen_abi = choose_abi_by_name (val, vallen);
1017       if (chosen_abi != NULL)
1018         mips_fpr_names = chosen_abi->fpr_names;
1019       return;
1020     }
1021
1022   if (strncmp ("cp0-names", option, optionlen) == 0
1023       && strlen ("cp0-names") == optionlen)
1024     {
1025       chosen_arch = choose_arch_by_name (val, vallen);
1026       if (chosen_arch != NULL)
1027         {
1028           mips_cp0_names = chosen_arch->cp0_names;
1029           mips_cp0sel_names = chosen_arch->cp0sel_names;
1030           mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
1031         }
1032       return;
1033     }
1034
1035   if (strncmp ("cp1-names", option, optionlen) == 0
1036       && strlen ("cp1-names") == optionlen)
1037     {
1038       chosen_arch = choose_arch_by_name (val, vallen);
1039       if (chosen_arch != NULL)
1040         mips_cp1_names = chosen_arch->cp1_names;
1041       return;
1042     }
1043
1044   if (strncmp ("hwr-names", option, optionlen) == 0
1045       && strlen ("hwr-names") == optionlen)
1046     {
1047       chosen_arch = choose_arch_by_name (val, vallen);
1048       if (chosen_arch != NULL)
1049         mips_hwr_names = chosen_arch->hwr_names;
1050       return;
1051     }
1052
1053   if (strncmp ("reg-names", option, optionlen) == 0
1054       && strlen ("reg-names") == optionlen)
1055     {
1056       /* We check both ABI and ARCH here unconditionally, so
1057          that "numeric" will do the desirable thing: select
1058          numeric register names for all registers.  Other than
1059          that, a given name probably won't match both.  */
1060       chosen_abi = choose_abi_by_name (val, vallen);
1061       if (chosen_abi != NULL)
1062         {
1063           mips_gpr_names = chosen_abi->gpr_names;
1064           mips_fpr_names = chosen_abi->fpr_names;
1065         }
1066       chosen_arch = choose_arch_by_name (val, vallen);
1067       if (chosen_arch != NULL)
1068         {
1069           mips_cp0_names = chosen_arch->cp0_names;
1070           mips_cp0sel_names = chosen_arch->cp0sel_names;
1071           mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
1072           mips_cp1_names = chosen_arch->cp1_names;
1073           mips_hwr_names = chosen_arch->hwr_names;
1074         }
1075       return;
1076     }
1077
1078   /* Invalid option.  */
1079 }
1080
1081 static void
1082 parse_mips_dis_options (const char *options)
1083 {
1084   const char *option_end;
1085
1086   if (options == NULL)
1087     return;
1088
1089   while (*options != '\0')
1090     {
1091       /* Skip empty options.  */
1092       if (*options == ',')
1093         {
1094           options++;
1095           continue;
1096         }
1097
1098       /* We know that *options is neither NUL or a comma.  */
1099       option_end = options + 1;
1100       while (*option_end != ',' && *option_end != '\0')
1101         option_end++;
1102
1103       parse_mips_dis_option (options, option_end - options);
1104
1105       /* Go on to the next one.  If option_end points to a comma, it
1106          will be skipped above.  */
1107       options = option_end;
1108     }
1109 }
1110
1111 static const struct mips_cp0sel_name *
1112 lookup_mips_cp0sel_name (const struct mips_cp0sel_name *names,
1113                          unsigned int len,
1114                          unsigned int cp0reg,
1115                          unsigned int sel)
1116 {
1117   unsigned int i;
1118
1119   for (i = 0; i < len; i++)
1120     if (names[i].cp0reg == cp0reg && names[i].sel == sel)
1121       return &names[i];
1122   return NULL;
1123 }
1124
1125 /* Print register REGNO, of type TYPE, for instruction OPCODE.  */
1126
1127 static void
1128 print_reg (struct disassemble_info *info, const struct mips_opcode *opcode,
1129            enum mips_reg_operand_type type, int regno)
1130 {
1131   switch (type)
1132     {
1133     case OP_REG_GP:
1134       info->fprintf_func (info->stream, "%s", mips_gpr_names[regno]);
1135       break;
1136
1137     case OP_REG_FP:
1138       info->fprintf_func (info->stream, "%s", mips_fpr_names[regno]);
1139       break;
1140
1141     case OP_REG_CCC:
1142       if (opcode->pinfo & (FP_D | FP_S))
1143         info->fprintf_func (info->stream, "$fcc%d", regno);
1144       else
1145         info->fprintf_func (info->stream, "$cc%d", regno);
1146       break;
1147
1148     case OP_REG_VEC:
1149       if (opcode->membership & INSN_5400)
1150         info->fprintf_func (info->stream, "$f%d", regno);
1151       else
1152         info->fprintf_func (info->stream, "$v%d", regno);
1153       break;
1154
1155     case OP_REG_ACC:
1156       info->fprintf_func (info->stream, "$ac%d", regno);
1157       break;
1158
1159     case OP_REG_COPRO:
1160       if (opcode->name[strlen (opcode->name) - 1] == '0')
1161         info->fprintf_func (info->stream, "%s", mips_cp0_names[regno]);
1162       else if (opcode->name[strlen (opcode->name) - 1] == '1')
1163         info->fprintf_func (info->stream, "%s", mips_cp1_names[regno]);
1164       else
1165         info->fprintf_func (info->stream, "$%d", regno);
1166       break;
1167
1168     case OP_REG_HW:
1169       info->fprintf_func (info->stream, "%s", mips_hwr_names[regno]);
1170       break;
1171
1172     case OP_REG_VF:
1173       info->fprintf_func (info->stream, "$vf%d", regno);
1174       break;
1175
1176     case OP_REG_VI:
1177       info->fprintf_func (info->stream, "$vi%d", regno);
1178       break;
1179
1180     case OP_REG_R5900_I:
1181       info->fprintf_func (info->stream, "$I");
1182       break;
1183
1184     case OP_REG_R5900_Q:
1185       info->fprintf_func (info->stream, "$Q");
1186       break;
1187
1188     case OP_REG_R5900_R:
1189       info->fprintf_func (info->stream, "$R");
1190       break;
1191
1192     case OP_REG_R5900_ACC:
1193       info->fprintf_func (info->stream, "$ACC");
1194       break;
1195
1196     case OP_REG_MSA:
1197       info->fprintf_func (info->stream, "$w%d", regno);
1198       break;
1199
1200     case OP_REG_MSA_CTRL:
1201       info->fprintf_func (info->stream, "%s", msa_control_names[regno]);
1202       break;
1203
1204     }
1205 }
1206 \f
1207 /* Used to track the state carried over from previous operands in
1208    an instruction.  */
1209 struct mips_print_arg_state {
1210   /* The value of the last OP_INT seen.  We only use this for OP_MSB,
1211      where the value is known to be unsigned and small.  */
1212   unsigned int last_int;
1213
1214   /* The type and number of the last OP_REG seen.  We only use this for
1215      OP_REPEAT_DEST_REG and OP_REPEAT_PREV_REG.  */
1216   enum mips_reg_operand_type last_reg_type;
1217   unsigned int last_regno;
1218   unsigned int dest_regno;
1219   unsigned int seen_dest;
1220 };
1221
1222 /* Initialize STATE for the start of an instruction.  */
1223
1224 static inline void
1225 init_print_arg_state (struct mips_print_arg_state *state)
1226 {
1227   memset (state, 0, sizeof (*state));
1228 }
1229
1230 /* Print OP_VU0_SUFFIX or OP_VU0_MATCH_SUFFIX operand OPERAND,
1231    whose value is given by UVAL.  */
1232
1233 static void
1234 print_vu0_channel (struct disassemble_info *info,
1235                    const struct mips_operand *operand, unsigned int uval)
1236 {
1237   if (operand->size == 4)
1238     info->fprintf_func (info->stream, "%s%s%s%s",
1239                         uval & 8 ? "x" : "",
1240                         uval & 4 ? "y" : "",
1241                         uval & 2 ? "z" : "",
1242                         uval & 1 ? "w" : "");
1243   else if (operand->size == 2)
1244     info->fprintf_func (info->stream, "%c", "xyzw"[uval]);
1245   else
1246     abort ();
1247 }
1248
1249 /* Record information about a register operand.  */
1250
1251 static void
1252 mips_seen_register (struct mips_print_arg_state *state,
1253                     unsigned int regno,
1254                     enum mips_reg_operand_type reg_type)
1255 {
1256   state->last_reg_type = reg_type;
1257   state->last_regno = regno;
1258
1259   if (!state->seen_dest)
1260     {
1261       state->seen_dest = 1;
1262       state->dest_regno = regno;
1263     }
1264 }
1265
1266 /* Print SAVE/RESTORE instruction operands according to the argument
1267    register mask AMASK, the number of static registers saved NSREG,
1268    the $ra, $s0 and $s1 register specifiers RA, S0 and S1 respectively,
1269    and the frame size FRAME_SIZE.  */
1270
1271 static void
1272 mips_print_save_restore (struct disassemble_info *info, unsigned int amask,
1273                          unsigned int nsreg, unsigned int ra,
1274                          unsigned int s0, unsigned int s1,
1275                          unsigned int frame_size)
1276 {
1277   const fprintf_ftype infprintf = info->fprintf_func;
1278   unsigned int nargs, nstatics, smask, i, j;
1279   void *is = info->stream;
1280   const char *sep;
1281
1282   if (amask == MIPS_SVRS_ALL_ARGS)
1283     {
1284       nargs = 4;
1285       nstatics = 0;
1286     }
1287   else if (amask == MIPS_SVRS_ALL_STATICS)
1288     {
1289       nargs = 0;
1290       nstatics = 4;
1291     }
1292   else
1293     {
1294       nargs = amask >> 2;
1295       nstatics = amask & 3;
1296     }
1297
1298   sep = "";
1299   if (nargs > 0)
1300     {
1301       infprintf (is, "%s", mips_gpr_names[4]);
1302       if (nargs > 1)
1303         infprintf (is, "-%s", mips_gpr_names[4 + nargs - 1]);
1304       sep = ",";
1305     }
1306
1307   infprintf (is, "%s%d", sep, frame_size);
1308
1309   if (ra)                       /* $ra */
1310     infprintf (is, ",%s", mips_gpr_names[31]);
1311
1312   smask = 0;
1313   if (s0)                       /* $s0 */
1314     smask |= 1 << 0;
1315   if (s1)                       /* $s1 */
1316     smask |= 1 << 1;
1317   if (nsreg > 0)                /* $s2-$s8 */
1318     smask |= ((1 << nsreg) - 1) << 2;
1319
1320   for (i = 0; i < 9; i++)
1321     if (smask & (1 << i))
1322       {
1323         infprintf (is, ",%s", mips_gpr_names[i == 8 ? 30 : (16 + i)]);
1324         /* Skip over string of set bits.  */
1325         for (j = i; smask & (2 << j); j++)
1326           continue;
1327         if (j > i)
1328           infprintf (is, "-%s", mips_gpr_names[j == 8 ? 30 : (16 + j)]);
1329         i = j + 1;
1330       }
1331   /* Statics $ax - $a3.  */
1332   if (nstatics == 1)
1333     infprintf (is, ",%s", mips_gpr_names[7]);
1334   else if (nstatics > 0)
1335     infprintf (is, ",%s-%s",
1336                mips_gpr_names[7 - nstatics + 1],
1337                mips_gpr_names[7]);
1338 }
1339
1340
1341 /* Print operand OPERAND of OPCODE, using STATE to track inter-operand state.
1342    UVAL is the encoding of the operand (shifted into bit 0) and BASE_PC is
1343    the base address for OP_PCREL operands.  */
1344
1345 static void
1346 print_insn_arg (struct disassemble_info *info,
1347                 struct mips_print_arg_state *state,
1348                 const struct mips_opcode *opcode,
1349                 const struct mips_operand *operand,
1350                 bfd_vma base_pc,
1351                 unsigned int uval)
1352 {
1353   const fprintf_ftype infprintf = info->fprintf_func;
1354   void *is = info->stream;
1355
1356   switch (operand->type)
1357     {
1358     case OP_INT:
1359       {
1360         const struct mips_int_operand *int_op;
1361
1362         int_op = (const struct mips_int_operand *) operand;
1363         uval = mips_decode_int_operand (int_op, uval);
1364         state->last_int = uval;
1365         if (int_op->print_hex)
1366           infprintf (is, "0x%x", uval);
1367         else
1368           infprintf (is, "%d", uval);
1369       }
1370       break;
1371
1372     case OP_MAPPED_INT:
1373       {
1374         const struct mips_mapped_int_operand *mint_op;
1375
1376         mint_op = (const struct mips_mapped_int_operand *) operand;
1377         uval = mint_op->int_map[uval];
1378         state->last_int = uval;
1379         if (mint_op->print_hex)
1380           infprintf (is, "0x%x", uval);
1381         else
1382           infprintf (is, "%d", uval);
1383       }
1384       break;
1385
1386     case OP_MSB:
1387       {
1388         const struct mips_msb_operand *msb_op;
1389
1390         msb_op = (const struct mips_msb_operand *) operand;
1391         uval += msb_op->bias;
1392         if (msb_op->add_lsb)
1393           uval -= state->last_int;
1394         infprintf (is, "0x%x", uval);
1395       }
1396       break;
1397
1398     case OP_REG:
1399     case OP_OPTIONAL_REG:
1400       {
1401         const struct mips_reg_operand *reg_op;
1402
1403         reg_op = (const struct mips_reg_operand *) operand;
1404         uval = mips_decode_reg_operand (reg_op, uval);
1405         print_reg (info, opcode, reg_op->reg_type, uval);
1406
1407         mips_seen_register (state, uval, reg_op->reg_type);
1408       }
1409       break;
1410
1411     case OP_REG_PAIR:
1412       {
1413         const struct mips_reg_pair_operand *pair_op;
1414
1415         pair_op = (const struct mips_reg_pair_operand *) operand;
1416         print_reg (info, opcode, pair_op->reg_type,
1417                    pair_op->reg1_map[uval]);
1418         infprintf (is, ",");
1419         print_reg (info, opcode, pair_op->reg_type,
1420                    pair_op->reg2_map[uval]);
1421       }
1422       break;
1423
1424     case OP_PCREL:
1425       {
1426         const struct mips_pcrel_operand *pcrel_op;
1427
1428         pcrel_op = (const struct mips_pcrel_operand *) operand;
1429         info->target = mips_decode_pcrel_operand (pcrel_op, base_pc, uval);
1430
1431         /* For jumps and branches clear the ISA bit except for
1432            the GDB disassembler.  */
1433         if (pcrel_op->include_isa_bit
1434             && info->flavour != bfd_target_unknown_flavour)
1435           info->target &= -2;
1436
1437         (*info->print_address_func) (info->target, info);
1438       }
1439       break;
1440
1441     case OP_PERF_REG:
1442       infprintf (is, "%d", uval);
1443       break;
1444
1445     case OP_ADDIUSP_INT:
1446       {
1447         int sval;
1448
1449         sval = mips_signed_operand (operand, uval) * 4;
1450         if (sval >= -8 && sval < 8)
1451           sval ^= 0x400;
1452         infprintf (is, "%d", sval);
1453         break;
1454       }
1455
1456     case OP_CLO_CLZ_DEST:
1457       {
1458         unsigned int reg1, reg2;
1459
1460         reg1 = uval & 31;
1461         reg2 = uval >> 5;
1462         /* If one is zero use the other.  */
1463         if (reg1 == reg2 || reg2 == 0)
1464           infprintf (is, "%s", mips_gpr_names[reg1]);
1465         else if (reg1 == 0)
1466           infprintf (is, "%s", mips_gpr_names[reg2]);
1467         else
1468           /* Bogus, result depends on processor.  */
1469           infprintf (is, "%s or %s", mips_gpr_names[reg1],
1470                      mips_gpr_names[reg2]);
1471       }
1472       break;
1473
1474     case OP_SAME_RS_RT:
1475     case OP_CHECK_PREV:
1476     case OP_NON_ZERO_REG:
1477       {
1478         print_reg (info, opcode, OP_REG_GP, uval & 31);
1479         mips_seen_register (state, uval, OP_REG_GP);
1480       }
1481       break;
1482
1483     case OP_LWM_SWM_LIST:
1484       if (operand->size == 2)
1485         {
1486           if (uval == 0)
1487             infprintf (is, "%s,%s",
1488                        mips_gpr_names[16],
1489                        mips_gpr_names[31]);
1490           else
1491             infprintf (is, "%s-%s,%s",
1492                        mips_gpr_names[16],
1493                        mips_gpr_names[16 + uval],
1494                        mips_gpr_names[31]);
1495         }
1496       else
1497         {
1498           int s_reg_encode;
1499
1500           s_reg_encode = uval & 0xf;
1501           if (s_reg_encode != 0)
1502             {
1503               if (s_reg_encode == 1)
1504                 infprintf (is, "%s", mips_gpr_names[16]);
1505               else if (s_reg_encode < 9)
1506                 infprintf (is, "%s-%s",
1507                            mips_gpr_names[16],
1508                            mips_gpr_names[15 + s_reg_encode]);
1509               else if (s_reg_encode == 9)
1510                 infprintf (is, "%s-%s,%s",
1511                            mips_gpr_names[16],
1512                            mips_gpr_names[23],
1513                            mips_gpr_names[30]);
1514               else
1515                 infprintf (is, "UNKNOWN");
1516             }
1517
1518           if (uval & 0x10) /* For ra.  */
1519             {
1520               if (s_reg_encode == 0)
1521                 infprintf (is, "%s", mips_gpr_names[31]);
1522               else
1523                 infprintf (is, ",%s", mips_gpr_names[31]);
1524             }
1525         }
1526       break;
1527
1528     case OP_ENTRY_EXIT_LIST:
1529       {
1530         const char *sep;
1531         unsigned int amask, smask;
1532
1533         sep = "";
1534         amask = (uval >> 3) & 7;
1535         if (amask > 0 && amask < 5)
1536           {
1537             infprintf (is, "%s", mips_gpr_names[4]);
1538             if (amask > 1)
1539               infprintf (is, "-%s", mips_gpr_names[amask + 3]);
1540             sep = ",";
1541           }
1542
1543         smask = (uval >> 1) & 3;
1544         if (smask == 3)
1545           {
1546             infprintf (is, "%s??", sep);
1547             sep = ",";
1548           }
1549         else if (smask > 0)
1550           {
1551             infprintf (is, "%s%s", sep, mips_gpr_names[16]);
1552             if (smask > 1)
1553               infprintf (is, "-%s", mips_gpr_names[smask + 15]);
1554             sep = ",";
1555           }
1556
1557         if (uval & 1)
1558           {
1559             infprintf (is, "%s%s", sep, mips_gpr_names[31]);
1560             sep = ",";
1561           }
1562
1563         if (amask == 5 || amask == 6)
1564           {
1565             infprintf (is, "%s%s", sep, mips_fpr_names[0]);
1566             if (amask == 6)
1567               infprintf (is, "-%s", mips_fpr_names[1]);
1568           }
1569       }
1570       break;
1571
1572     case OP_SAVE_RESTORE_LIST:
1573       /* Should be handled by the caller due to complex behavior.  */
1574       abort ();
1575
1576     case OP_MDMX_IMM_REG:
1577       {
1578         unsigned int vsel;
1579
1580         vsel = uval >> 5;
1581         uval &= 31;
1582         if ((vsel & 0x10) == 0)
1583           {
1584             int fmt;
1585
1586             vsel &= 0x0f;
1587             for (fmt = 0; fmt < 3; fmt++, vsel >>= 1)
1588               if ((vsel & 1) == 0)
1589                 break;
1590             print_reg (info, opcode, OP_REG_VEC, uval);
1591             infprintf (is, "[%d]", vsel >> 1);
1592           }
1593         else if ((vsel & 0x08) == 0)
1594           print_reg (info, opcode, OP_REG_VEC, uval);
1595         else
1596           infprintf (is, "0x%x", uval);
1597       }
1598       break;
1599
1600     case OP_REPEAT_PREV_REG:
1601       print_reg (info, opcode, state->last_reg_type, state->last_regno);
1602       break;
1603
1604     case OP_REPEAT_DEST_REG:
1605       print_reg (info, opcode, state->last_reg_type, state->dest_regno);
1606       break;
1607
1608     case OP_PC:
1609       infprintf (is, "$pc");
1610       break;
1611
1612     case OP_REG28:
1613       print_reg (info, opcode, OP_REG_GP, 28);
1614       break;
1615
1616     case OP_VU0_SUFFIX:
1617     case OP_VU0_MATCH_SUFFIX:
1618       print_vu0_channel (info, operand, uval);
1619       break;
1620
1621     case OP_IMM_INDEX:
1622       infprintf (is, "[%d]", uval);
1623       break;
1624
1625     case OP_REG_INDEX:
1626       infprintf (is, "[");
1627       print_reg (info, opcode, OP_REG_GP, uval);
1628       infprintf (is, "]");
1629       break;
1630     }
1631 }
1632
1633 /* Validate the arguments for INSN, which is described by OPCODE.
1634    Use DECODE_OPERAND to get the encoding of each operand.  */
1635
1636 static bfd_boolean
1637 validate_insn_args (const struct mips_opcode *opcode,
1638                     const struct mips_operand *(*decode_operand) (const char *),
1639                     unsigned int insn)
1640 {
1641   struct mips_print_arg_state state;
1642   const struct mips_operand *operand;
1643   const char *s;
1644   unsigned int uval;
1645
1646   init_print_arg_state (&state);
1647   for (s = opcode->args; *s; ++s)
1648     {
1649       switch (*s)
1650         {
1651         case ',':
1652         case '(':
1653         case ')':
1654           break;
1655
1656         case '#':
1657           ++s;
1658           break;
1659
1660         default:
1661           operand = decode_operand (s);
1662
1663           if (operand)
1664             {
1665               uval = mips_extract_operand (operand, insn);
1666               switch (operand->type)
1667                 {
1668                 case OP_REG:
1669                 case OP_OPTIONAL_REG:
1670                   {
1671                     const struct mips_reg_operand *reg_op;
1672
1673                     reg_op = (const struct mips_reg_operand *) operand;
1674                     uval = mips_decode_reg_operand (reg_op, uval);
1675                     mips_seen_register (&state, uval, reg_op->reg_type);
1676                   }
1677                 break;
1678
1679                 case OP_SAME_RS_RT:
1680                   {
1681                     unsigned int reg1, reg2;
1682
1683                     reg1 = uval & 31;
1684                     reg2 = uval >> 5;
1685
1686                     if (reg1 != reg2 || reg1 == 0)
1687                       return FALSE;
1688                   }
1689                 break;
1690
1691                 case OP_CHECK_PREV:
1692                   {
1693                     const struct mips_check_prev_operand *prev_op;
1694
1695                     prev_op = (const struct mips_check_prev_operand *) operand;
1696
1697                     if (!prev_op->zero_ok && uval == 0)
1698                       return FALSE;
1699
1700                     if (((prev_op->less_than_ok && uval < state.last_regno)
1701                         || (prev_op->greater_than_ok && uval > state.last_regno)
1702                         || (prev_op->equal_ok && uval == state.last_regno)))
1703                       break;
1704
1705                     return FALSE;
1706                   }
1707
1708                 case OP_NON_ZERO_REG:
1709                   {
1710                     if (uval == 0)
1711                       return FALSE;
1712                   }
1713                 break;
1714
1715                 case OP_INT:
1716                 case OP_MAPPED_INT:
1717                 case OP_MSB:
1718                 case OP_REG_PAIR:
1719                 case OP_PCREL:
1720                 case OP_PERF_REG:
1721                 case OP_ADDIUSP_INT:
1722                 case OP_CLO_CLZ_DEST:
1723                 case OP_LWM_SWM_LIST:
1724                 case OP_ENTRY_EXIT_LIST:
1725                 case OP_MDMX_IMM_REG:
1726                 case OP_REPEAT_PREV_REG:
1727                 case OP_REPEAT_DEST_REG:
1728                 case OP_PC:
1729                 case OP_REG28:
1730                 case OP_VU0_SUFFIX:
1731                 case OP_VU0_MATCH_SUFFIX:
1732                 case OP_IMM_INDEX:
1733                 case OP_REG_INDEX:
1734                 case OP_SAVE_RESTORE_LIST:
1735                   break;
1736                 }
1737             }
1738           if (*s == 'm' || *s == '+' || *s == '-')
1739             ++s;
1740         }
1741     }
1742   return TRUE;
1743 }
1744
1745 /* Print the arguments for INSN, which is described by OPCODE.
1746    Use DECODE_OPERAND to get the encoding of each operand.  Use BASE_PC
1747    as the base of OP_PCREL operands, adjusting by LENGTH if the OP_PCREL
1748    operand is for a branch or jump.  */
1749
1750 static void
1751 print_insn_args (struct disassemble_info *info,
1752                  const struct mips_opcode *opcode,
1753                  const struct mips_operand *(*decode_operand) (const char *),
1754                  unsigned int insn, bfd_vma insn_pc, unsigned int length)
1755 {
1756   const fprintf_ftype infprintf = info->fprintf_func;
1757   void *is = info->stream;
1758   struct mips_print_arg_state state;
1759   const struct mips_operand *operand;
1760   const char *s;
1761
1762   init_print_arg_state (&state);
1763   for (s = opcode->args; *s; ++s)
1764     {
1765       switch (*s)
1766         {
1767         case ',':
1768         case '(':
1769         case ')':
1770           infprintf (is, "%c", *s);
1771           break;
1772
1773         case '#':
1774           ++s;
1775           infprintf (is, "%c%c", *s, *s);
1776           break;
1777
1778         default:
1779           operand = decode_operand (s);
1780           if (!operand)
1781             {
1782               /* xgettext:c-format */
1783               infprintf (is,
1784                          _("# internal error, undefined operand in `%s %s'"),
1785                          opcode->name, opcode->args);
1786               return;
1787             }
1788
1789           if (operand->type == OP_SAVE_RESTORE_LIST)
1790             {
1791               /* Handle this case here because of the complex behavior.  */
1792               unsigned int amask = (insn >> 15) & 0xf;
1793               unsigned int nsreg = (insn >> 23) & 0x7;
1794               unsigned int ra = insn & 0x1000;                  /* $ra */
1795               unsigned int s0 = insn & 0x800;                   /* $s0 */
1796               unsigned int s1 = insn & 0x400;                   /* $s1 */
1797               unsigned int frame_size = (((insn >> 15) & 0xf0)
1798                                          | ((insn >> 6) & 0x0f)) * 8;
1799               mips_print_save_restore (info, amask, nsreg, ra, s0, s1,
1800                                        frame_size);
1801             }
1802           else if (operand->type == OP_REG
1803                    && s[1] == ','
1804                    && s[2] == 'H'
1805                    && opcode->name[strlen (opcode->name) - 1] == '0')
1806             {
1807               /* Coprocessor register 0 with sel field.  */
1808               const struct mips_cp0sel_name *n;
1809               unsigned int reg, sel;
1810
1811               reg = mips_extract_operand (operand, insn);
1812               s += 2;
1813               operand = decode_operand (s);
1814               sel = mips_extract_operand (operand, insn);
1815
1816               /* CP0 register including 'sel' code for mftc0, to be
1817                  printed textually if known.  If not known, print both
1818                  CP0 register name and sel numerically since CP0 register
1819                  with sel 0 may have a name unrelated to register being
1820                  printed.  */
1821               n = lookup_mips_cp0sel_name (mips_cp0sel_names,
1822                                            mips_cp0sel_names_len,
1823                                            reg, sel);
1824               if (n != NULL)
1825                 infprintf (is, "%s", n->name);
1826               else
1827                 infprintf (is, "$%d,%d", reg, sel);
1828             }
1829           else
1830             {
1831               bfd_vma base_pc = insn_pc;
1832
1833               /* Adjust the PC relative base so that branch/jump insns use
1834                  the following PC as the base but genuinely PC relative
1835                  operands use the current PC.  */
1836               if (operand->type == OP_PCREL)
1837                 {
1838                   const struct mips_pcrel_operand *pcrel_op;
1839
1840                   pcrel_op = (const struct mips_pcrel_operand *) operand;
1841                   /* The include_isa_bit flag is sufficient to distinguish
1842                      branch/jump from other PC relative operands.  */
1843                   if (pcrel_op->include_isa_bit)
1844                     base_pc += length;
1845                 }
1846
1847               print_insn_arg (info, &state, opcode, operand, base_pc,
1848                               mips_extract_operand (operand, insn));
1849             }
1850           if (*s == 'm' || *s == '+' || *s == '-')
1851             ++s;
1852           break;
1853         }
1854     }
1855 }
1856 \f
1857 /* Print the mips instruction at address MEMADDR in debugged memory,
1858    on using INFO.  Returns length of the instruction, in bytes, which is
1859    always INSNLEN.  BIGENDIAN must be 1 if this is big-endian code, 0 if
1860    this is little-endian code.  */
1861
1862 static int
1863 print_insn_mips (bfd_vma memaddr,
1864                  int word,
1865                  struct disassemble_info *info)
1866 {
1867 #define GET_OP(insn, field)                     \
1868   (((insn) >> OP_SH_##field) & OP_MASK_##field)
1869   static const struct mips_opcode *mips_hash[OP_MASK_OP + 1];
1870   const fprintf_ftype infprintf = info->fprintf_func;
1871   const struct mips_opcode *op;
1872   static bfd_boolean init = 0;
1873   void *is = info->stream;
1874
1875   /* Build a hash table to shorten the search time.  */
1876   if (! init)
1877     {
1878       unsigned int i;
1879
1880       for (i = 0; i <= OP_MASK_OP; i++)
1881         {
1882           for (op = mips_opcodes; op < &mips_opcodes[NUMOPCODES]; op++)
1883             {
1884               if (op->pinfo == INSN_MACRO
1885                   || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
1886                 continue;
1887               if (i == GET_OP (op->match, OP))
1888                 {
1889                   mips_hash[i] = op;
1890                   break;
1891                 }
1892             }
1893         }
1894
1895       init = 1;
1896     }
1897
1898   info->bytes_per_chunk = INSNLEN;
1899   info->display_endian = info->endian;
1900   info->insn_info_valid = 1;
1901   info->branch_delay_insns = 0;
1902   info->data_size = 0;
1903   info->insn_type = dis_nonbranch;
1904   info->target = 0;
1905   info->target2 = 0;
1906
1907   op = mips_hash[GET_OP (word, OP)];
1908   if (op != NULL)
1909     {
1910       for (; op < &mips_opcodes[NUMOPCODES]; op++)
1911         {
1912           if (op->pinfo != INSN_MACRO
1913               && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
1914               && (word & op->mask) == op->match)
1915             {
1916               /* We always disassemble the jalx instruction, except for MIPS r6.  */
1917               if (!opcode_is_member (op, mips_isa, mips_ase, mips_processor)
1918                  && (strcmp (op->name, "jalx")
1919                      || (mips_isa & INSN_ISA_MASK) == ISA_MIPS32R6
1920                      || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R6))
1921                 continue;
1922
1923               /* Figure out instruction type and branch delay information.  */
1924               if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
1925                 {
1926                   if ((op->pinfo & (INSN_WRITE_GPR_31 | INSN_WRITE_1)) != 0)
1927                     info->insn_type = dis_jsr;
1928                   else
1929                     info->insn_type = dis_branch;
1930                   info->branch_delay_insns = 1;
1931                 }
1932               else if ((op->pinfo & (INSN_COND_BRANCH_DELAY
1933                                      | INSN_COND_BRANCH_LIKELY)) != 0)
1934                 {
1935                   if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
1936                     info->insn_type = dis_condjsr;
1937                   else
1938                     info->insn_type = dis_condbranch;
1939                   info->branch_delay_insns = 1;
1940                 }
1941               else if ((op->pinfo & (INSN_STORE_MEMORY
1942                                      | INSN_LOAD_MEMORY)) != 0)
1943                 info->insn_type = dis_dref;
1944
1945               if (!validate_insn_args (op, decode_mips_operand, word))
1946                 continue;
1947
1948               infprintf (is, "%s", op->name);
1949               if (op->pinfo2 & INSN2_VU0_CHANNEL_SUFFIX)
1950                 {
1951                   unsigned int uval;
1952
1953                   infprintf (is, ".");
1954                   uval = mips_extract_operand (&mips_vu0_channel_mask, word);
1955                   print_vu0_channel (info, &mips_vu0_channel_mask, uval);
1956                 }
1957
1958               if (op->args[0])
1959                 {
1960                   infprintf (is, "\t");
1961                   print_insn_args (info, op, decode_mips_operand, word,
1962                                    memaddr, 4);
1963                 }
1964
1965               return INSNLEN;
1966             }
1967         }
1968     }
1969 #undef GET_OP
1970
1971   /* Handle undefined instructions.  */
1972   info->insn_type = dis_noninsn;
1973   infprintf (is, "0x%x", word);
1974   return INSNLEN;
1975 }
1976 \f
1977 /* Disassemble an operand for a mips16 instruction.  */
1978
1979 static void
1980 print_mips16_insn_arg (struct disassemble_info *info,
1981                        struct mips_print_arg_state *state,
1982                        const struct mips_opcode *opcode,
1983                        char type, bfd_vma memaddr,
1984                        unsigned insn, bfd_boolean use_extend,
1985                        unsigned extend, bfd_boolean is_offset)
1986 {
1987   const fprintf_ftype infprintf = info->fprintf_func;
1988   void *is = info->stream;
1989   const struct mips_operand *operand, *ext_operand;
1990   unsigned short ext_size;
1991   unsigned int uval;
1992   bfd_vma baseaddr;
1993
1994   if (!use_extend)
1995     extend = 0;
1996
1997   switch (type)
1998     {
1999     case ',':
2000     case '(':
2001     case ')':
2002       infprintf (is, "%c", type);
2003       break;
2004
2005     default:
2006       operand = decode_mips16_operand (type, FALSE);
2007       if (!operand)
2008         {
2009           /* xgettext:c-format */
2010           infprintf (is, _("# internal error, undefined operand in `%s %s'"),
2011                      opcode->name, opcode->args);
2012           return;
2013         }
2014
2015       if (operand->type == OP_SAVE_RESTORE_LIST)
2016         {
2017           /* Handle this case here because of the complex interaction
2018              with the EXTEND opcode.  */
2019           unsigned int amask = extend & 0xf;
2020           unsigned int nsreg = (extend >> 8) & 0x7;
2021           unsigned int ra = insn & 0x40;                        /* $ra */
2022           unsigned int s0 = insn & 0x20;                        /* $s0 */
2023           unsigned int s1 = insn & 0x10;                        /* $s1 */
2024           unsigned int frame_size = ((extend & 0xf0) | (insn & 0x0f)) * 8;
2025           if (frame_size == 0 && !use_extend)
2026             frame_size = 128;
2027           mips_print_save_restore (info, amask, nsreg, ra, s0, s1, frame_size);
2028           break;
2029         }
2030
2031       if (is_offset && operand->type == OP_INT)
2032         {
2033           const struct mips_int_operand *int_op;
2034
2035           int_op = (const struct mips_int_operand *) operand;
2036           info->insn_type = dis_dref;
2037           info->data_size = 1 << int_op->shift;
2038         }
2039
2040       ext_size = 0;
2041       if (use_extend)
2042         {
2043           ext_operand = decode_mips16_operand (type, TRUE);
2044           if (ext_operand != operand
2045               || (operand->type == OP_INT && operand->lsb == 0
2046                   && mips_opcode_32bit_p (opcode)))
2047             {
2048               ext_size = ext_operand->size;
2049               operand = ext_operand;
2050             }
2051         }
2052       if (operand->size == 26)
2053         uval = ((extend & 0x1f) << 21) | ((extend & 0x3e0) << 11) | insn;
2054       else if (ext_size == 16 || ext_size == 9)
2055         uval = ((extend & 0x1f) << 11) | (extend & 0x7e0) | (insn & 0x1f);
2056       else if (ext_size == 15)
2057         uval = ((extend & 0xf) << 11) | (extend & 0x7f0) | (insn & 0xf);
2058       else if (ext_size == 6)
2059         uval = ((extend >> 6) & 0x1f) | (extend & 0x20);
2060       else
2061         uval = mips_extract_operand (operand, (extend << 16) | insn);
2062       if (ext_size == 9)
2063         uval &= (1U << ext_size) - 1;
2064
2065       baseaddr = memaddr + 2;
2066       if (operand->type == OP_PCREL)
2067         {
2068           const struct mips_pcrel_operand *pcrel_op;
2069
2070           pcrel_op = (const struct mips_pcrel_operand *) operand;
2071           if (!pcrel_op->include_isa_bit && use_extend)
2072             baseaddr = memaddr - 2;
2073           else if (!pcrel_op->include_isa_bit)
2074             {
2075               bfd_byte buffer[2];
2076
2077               /* If this instruction is in the delay slot of a JAL/JALX
2078                  instruction, the base address is the address of the
2079                  JAL/JALX instruction.  If it is in the delay slot of
2080                  a JR/JALR instruction, the base address is the address
2081                  of the JR/JALR instruction.  This test is unreliable:
2082                  we have no way of knowing whether the previous word is
2083                  instruction or data.  */
2084               if (info->read_memory_func (memaddr - 4, buffer, 2, info) == 0
2085                   && (((info->endian == BFD_ENDIAN_BIG
2086                         ? bfd_getb16 (buffer)
2087                         : bfd_getl16 (buffer))
2088                        & 0xf800) == 0x1800))
2089                 baseaddr = memaddr - 4;
2090               else if (info->read_memory_func (memaddr - 2, buffer, 2,
2091                                                info) == 0
2092                        && (((info->endian == BFD_ENDIAN_BIG
2093                              ? bfd_getb16 (buffer)
2094                              : bfd_getl16 (buffer))
2095                             & 0xf89f) == 0xe800)
2096                        && (((info->endian == BFD_ENDIAN_BIG
2097                              ? bfd_getb16 (buffer)
2098                              : bfd_getl16 (buffer))
2099                             & 0x0060) != 0x0060))
2100                 baseaddr = memaddr - 2;
2101               else
2102                 baseaddr = memaddr;
2103             }
2104         }
2105
2106       print_insn_arg (info, state, opcode, operand, baseaddr + 1, uval);
2107       break;
2108     }
2109 }
2110
2111
2112 /* Check if the given address is the last word of a MIPS16 PLT entry.
2113    This word is data and depending on the value it may interfere with
2114    disassembly of further PLT entries.  We make use of the fact PLT
2115    symbols are marked BSF_SYNTHETIC.  */
2116 static bfd_boolean
2117 is_mips16_plt_tail (struct disassemble_info *info, bfd_vma addr)
2118 {
2119   if (info->symbols
2120       && info->symbols[0]
2121       && (info->symbols[0]->flags & BSF_SYNTHETIC)
2122       && addr == bfd_asymbol_value (info->symbols[0]) + 12)
2123     return TRUE;
2124
2125   return FALSE;
2126 }
2127
2128 /* Whether none, a 32-bit or a 16-bit instruction match has been done.  */
2129
2130 enum match_kind
2131 {
2132   MATCH_NONE,
2133   MATCH_FULL,
2134   MATCH_SHORT
2135 };
2136
2137 /* Disassemble mips16 instructions.  */
2138
2139 static int
2140 print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
2141 {
2142   const fprintf_ftype infprintf = info->fprintf_func;
2143   int status;
2144   bfd_byte buffer[4];
2145   const struct mips_opcode *op, *opend;
2146   struct mips_print_arg_state state;
2147   void *is = info->stream;
2148   bfd_boolean have_second;
2149   bfd_boolean extend_only;
2150   unsigned int second;
2151   unsigned int first;
2152   unsigned int full;
2153
2154   info->bytes_per_chunk = 2;
2155   info->display_endian = info->endian;
2156   info->insn_info_valid = 1;
2157   info->branch_delay_insns = 0;
2158   info->data_size = 0;
2159   info->target = 0;
2160   info->target2 = 0;
2161
2162 #define GET_OP(insn, field) \
2163   (((insn) >> MIPS16OP_SH_##field) & MIPS16OP_MASK_##field)
2164   /* Decode PLT entry's GOT slot address word.  */
2165   if (is_mips16_plt_tail (info, memaddr))
2166     {
2167       info->insn_type = dis_noninsn;
2168       status = (*info->read_memory_func) (memaddr, buffer, 4, info);
2169       if (status == 0)
2170         {
2171           unsigned int gotslot;
2172
2173           if (info->endian == BFD_ENDIAN_BIG)
2174             gotslot = bfd_getb32 (buffer);
2175           else
2176             gotslot = bfd_getl32 (buffer);
2177           infprintf (is, ".word\t0x%x", gotslot);
2178
2179           return 4;
2180         }
2181     }
2182   else
2183     {
2184       info->insn_type = dis_nonbranch;
2185       status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2186     }
2187   if (status != 0)
2188     {
2189       (*info->memory_error_func) (status, memaddr, info);
2190       return -1;
2191     }
2192
2193   extend_only = FALSE;
2194
2195   if (info->endian == BFD_ENDIAN_BIG)
2196     first = bfd_getb16 (buffer);
2197   else
2198     first = bfd_getl16 (buffer);
2199
2200   status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2201   if (status == 0)
2202     {
2203       have_second = TRUE;
2204       if (info->endian == BFD_ENDIAN_BIG)
2205         second = bfd_getb16 (buffer);
2206       else
2207         second = bfd_getl16 (buffer);
2208       full = (first << 16) | second;
2209     }
2210   else
2211     {
2212       have_second = FALSE;
2213       second = 0;
2214       full = first;
2215     }
2216
2217   /* FIXME: Should probably use a hash table on the major opcode here.  */
2218
2219   opend = mips16_opcodes + bfd_mips16_num_opcodes;
2220   for (op = mips16_opcodes; op < opend; op++)
2221     {
2222       enum match_kind match;
2223
2224       if (!opcode_is_member (op, mips_isa, mips_ase, mips_processor))
2225         continue;
2226
2227       if (op->pinfo == INSN_MACRO
2228           || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
2229         match = MATCH_NONE;
2230       else if (mips_opcode_32bit_p (op))
2231         {
2232           if (have_second
2233               && (full & op->mask) == op->match)
2234             match = MATCH_FULL;
2235           else
2236             match = MATCH_NONE;
2237         }
2238       else if ((first & op->mask) == op->match)
2239         {
2240           match = MATCH_SHORT;
2241           second = 0;
2242           full = first;
2243         }
2244       else if ((first & 0xf800) == 0xf000
2245                && have_second
2246                && !extend_only
2247                && (second & op->mask) == op->match)
2248         {
2249           if (op->pinfo2 & INSN2_SHORT_ONLY)
2250             {
2251               match = MATCH_NONE;
2252               extend_only = TRUE;
2253             }
2254           else
2255             match = MATCH_FULL;
2256         }
2257       else
2258         match = MATCH_NONE;
2259
2260       if (match != MATCH_NONE)
2261         {
2262           const char *s;
2263
2264           infprintf (is, "%s", op->name);
2265           if (op->args[0] != '\0')
2266             infprintf (is, "\t");
2267
2268           init_print_arg_state (&state);
2269           for (s = op->args; *s != '\0'; s++)
2270             {
2271               if (*s == ','
2272                   && s[1] == 'w'
2273                   && GET_OP (full, RX) == GET_OP (full, RY))
2274                 {
2275                   /* Skip the register and the comma.  */
2276                   ++s;
2277                   continue;
2278                 }
2279               if (*s == ','
2280                   && s[1] == 'v'
2281                   && GET_OP (full, RZ) == GET_OP (full, RX))
2282                 {
2283                   /* Skip the register and the comma.  */
2284                   ++s;
2285                   continue;
2286                 }
2287               if (s[0] == 'N'
2288                   && s[1] == ','
2289                   && s[2] == 'O'
2290                   && op->name[strlen (op->name) - 1] == '0')
2291                 {
2292                   /* Coprocessor register 0 with sel field.  */
2293                   const struct mips_cp0sel_name *n;
2294                   const struct mips_operand *operand;
2295                   unsigned int reg, sel;
2296
2297                   operand = decode_mips16_operand (*s, TRUE);
2298                   reg = mips_extract_operand (operand, (first << 16) | second);
2299                   s += 2;
2300                   operand = decode_mips16_operand (*s, TRUE);
2301                   sel = mips_extract_operand (operand, (first << 16) | second);
2302
2303                   /* CP0 register including 'sel' code for mftc0, to be
2304                      printed textually if known.  If not known, print both
2305                      CP0 register name and sel numerically since CP0 register
2306                      with sel 0 may have a name unrelated to register being
2307                      printed.  */
2308                   n = lookup_mips_cp0sel_name (mips_cp0sel_names,
2309                                                mips_cp0sel_names_len,
2310                                                reg, sel);
2311                   if (n != NULL)
2312                     infprintf (is, "%s", n->name);
2313                   else
2314                     infprintf (is, "$%d,%d", reg, sel);
2315                 }
2316               else
2317                 switch (match)
2318                   {
2319                     case MATCH_FULL:
2320                       print_mips16_insn_arg (info, &state, op, *s, memaddr + 2,
2321                                              second, TRUE, first, s[1] == '(');
2322                       break;
2323                     case MATCH_SHORT:
2324                       print_mips16_insn_arg (info, &state, op, *s, memaddr,
2325                                              first, FALSE, 0, s[1] == '(');
2326                       break;
2327                     case MATCH_NONE:    /* Stop the compiler complaining.  */
2328                       break;
2329                   }
2330             }
2331
2332           /* Figure out branch instruction type and delay slot information.  */
2333           if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2334             info->branch_delay_insns = 1;
2335           if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
2336               || (op->pinfo2 & INSN2_UNCOND_BRANCH) != 0)
2337             {
2338               if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2339                 info->insn_type = dis_jsr;
2340               else
2341                 info->insn_type = dis_branch;
2342             }
2343           else if ((op->pinfo2 & INSN2_COND_BRANCH) != 0)
2344             info->insn_type = dis_condbranch;
2345
2346           return match == MATCH_FULL ? 4 : 2;
2347         }
2348     }
2349 #undef GET_OP
2350
2351   infprintf (is, "0x%x", first);
2352   info->insn_type = dis_noninsn;
2353
2354   return 2;
2355 }
2356
2357 /* Disassemble microMIPS instructions.  */
2358
2359 static int
2360 print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
2361 {
2362   const fprintf_ftype infprintf = info->fprintf_func;
2363   const struct mips_opcode *op, *opend;
2364   void *is = info->stream;
2365   bfd_byte buffer[2];
2366   unsigned int higher;
2367   unsigned int length;
2368   int status;
2369   unsigned int insn;
2370
2371   info->bytes_per_chunk = 2;
2372   info->display_endian = info->endian;
2373   info->insn_info_valid = 1;
2374   info->branch_delay_insns = 0;
2375   info->data_size = 0;
2376   info->insn_type = dis_nonbranch;
2377   info->target = 0;
2378   info->target2 = 0;
2379
2380   status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2381   if (status != 0)
2382     {
2383       (*info->memory_error_func) (status, memaddr, info);
2384       return -1;
2385     }
2386
2387   length = 2;
2388
2389   if (info->endian == BFD_ENDIAN_BIG)
2390     insn = bfd_getb16 (buffer);
2391   else
2392     insn = bfd_getl16 (buffer);
2393
2394   if ((insn & 0x1c00) == 0x0000 || (insn & 0x1000) == 0x1000)
2395     {
2396       /* This is a 32-bit microMIPS instruction.  */
2397       higher = insn;
2398
2399       status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2400       if (status != 0)
2401         {
2402           infprintf (is, "micromips 0x%x", higher);
2403           (*info->memory_error_func) (status, memaddr + 2, info);
2404           return -1;
2405         }
2406
2407       if (info->endian == BFD_ENDIAN_BIG)
2408         insn = bfd_getb16 (buffer);
2409       else
2410         insn = bfd_getl16 (buffer);
2411
2412       insn = insn | (higher << 16);
2413
2414       length += 2;
2415     }
2416
2417   /* FIXME: Should probably use a hash table on the major opcode here.  */
2418
2419   opend = micromips_opcodes + bfd_micromips_num_opcodes;
2420   for (op = micromips_opcodes; op < opend; op++)
2421     {
2422       if (op->pinfo != INSN_MACRO
2423           && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
2424           && (insn & op->mask) == op->match
2425           && ((length == 2 && (op->mask & 0xffff0000) == 0)
2426               || (length == 4 && (op->mask & 0xffff0000) != 0)))
2427         {
2428           if (!validate_insn_args (op, decode_micromips_operand, insn))
2429             continue;
2430
2431           infprintf (is, "%s", op->name);
2432
2433           if (op->args[0])
2434             {
2435               infprintf (is, "\t");
2436               print_insn_args (info, op, decode_micromips_operand, insn,
2437                                memaddr + 1, length);
2438             }
2439
2440           /* Figure out instruction type and branch delay information.  */
2441           if ((op->pinfo
2442                & (INSN_UNCOND_BRANCH_DELAY | INSN_COND_BRANCH_DELAY)) != 0)
2443             info->branch_delay_insns = 1;
2444           if (((op->pinfo & INSN_UNCOND_BRANCH_DELAY)
2445                | (op->pinfo2 & INSN2_UNCOND_BRANCH)) != 0)
2446             {
2447               if ((op->pinfo & (INSN_WRITE_GPR_31 | INSN_WRITE_1)) != 0)
2448                 info->insn_type = dis_jsr;
2449               else
2450                 info->insn_type = dis_branch;
2451             }
2452           else if (((op->pinfo & INSN_COND_BRANCH_DELAY)
2453                     | (op->pinfo2 & INSN2_COND_BRANCH)) != 0)
2454             {
2455               if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2456                 info->insn_type = dis_condjsr;
2457               else
2458                 info->insn_type = dis_condbranch;
2459             }
2460           else if ((op->pinfo
2461                     & (INSN_STORE_MEMORY | INSN_LOAD_MEMORY)) != 0)
2462             info->insn_type = dis_dref;
2463
2464           return length;
2465         }
2466     }
2467
2468   infprintf (is, "0x%x", insn);
2469   info->insn_type = dis_noninsn;
2470
2471   return length;
2472 }
2473
2474 /* Return 1 if a symbol associated with the location being disassembled
2475    indicates a compressed mode, either MIPS16 or microMIPS, according to
2476    MICROMIPS_P.  We iterate over all the symbols at the address being
2477    considered assuming if at least one of them indicates code compression,
2478    then such code has been genuinely produced here (other symbols could
2479    have been derived from function symbols defined elsewhere or could
2480    define data).  Otherwise, return 0.  */
2481
2482 static bfd_boolean
2483 is_compressed_mode_p (struct disassemble_info *info, bfd_boolean micromips_p)
2484 {
2485   int i;
2486   int l;
2487
2488   for (i = info->symtab_pos, l = i + info->num_symbols; i < l; i++)
2489     if (((info->symtab[i])->flags & BSF_SYNTHETIC) != 0
2490         && ((!micromips_p
2491              && ELF_ST_IS_MIPS16 ((*info->symbols)->udata.i))
2492             || (micromips_p
2493                 && ELF_ST_IS_MICROMIPS ((*info->symbols)->udata.i))))
2494       return 1;
2495     else if (bfd_asymbol_flavour (info->symtab[i]) == bfd_target_elf_flavour
2496               && info->symtab[i]->section == info->section)
2497       {
2498         elf_symbol_type *symbol = (elf_symbol_type *) info->symtab[i];
2499         if ((!micromips_p
2500              && ELF_ST_IS_MIPS16 (symbol->internal_elf_sym.st_other))
2501             || (micromips_p
2502                 && ELF_ST_IS_MICROMIPS (symbol->internal_elf_sym.st_other)))
2503           return 1;
2504       }
2505
2506   return 0;
2507 }
2508
2509 /* In an environment where we do not know the symbol type of the
2510    instruction we are forced to assume that the low order bit of the
2511    instructions' address may mark it as a mips16 instruction.  If we
2512    are single stepping, or the pc is within the disassembled function,
2513    this works.  Otherwise, we need a clue.  Sometimes.  */
2514
2515 static int
2516 _print_insn_mips (bfd_vma memaddr,
2517                   struct disassemble_info *info,
2518                   enum bfd_endian endianness)
2519 {
2520   bfd_byte buffer[INSNLEN];
2521   int status;
2522
2523   set_default_mips_dis_options (info);
2524   parse_mips_dis_options (info->disassembler_options);
2525
2526   if (info->mach == bfd_mach_mips16)
2527     return print_insn_mips16 (memaddr, info);
2528   if (info->mach == bfd_mach_mips_micromips)
2529     return print_insn_micromips (memaddr, info);
2530
2531 #if 1
2532   /* FIXME: If odd address, this is CLEARLY a compressed instruction.  */
2533   /* Only a few tools will work this way.  */
2534   if (memaddr & 0x01)
2535     {
2536       if (micromips_ase)
2537         return print_insn_micromips (memaddr, info);
2538       else
2539         return print_insn_mips16 (memaddr, info);
2540     }
2541 #endif
2542
2543 #if SYMTAB_AVAILABLE
2544   if (is_compressed_mode_p (info, TRUE))
2545     return print_insn_micromips (memaddr, info);
2546   if (is_compressed_mode_p (info, FALSE))
2547     return print_insn_mips16 (memaddr, info);
2548 #endif
2549
2550   status = (*info->read_memory_func) (memaddr, buffer, INSNLEN, info);
2551   if (status == 0)
2552     {
2553       int insn;
2554
2555       if (endianness == BFD_ENDIAN_BIG)
2556         insn = bfd_getb32 (buffer);
2557       else
2558         insn = bfd_getl32 (buffer);
2559
2560       return print_insn_mips (memaddr, insn, info);
2561     }
2562   else
2563     {
2564       (*info->memory_error_func) (status, memaddr, info);
2565       return -1;
2566     }
2567 }
2568
2569 int
2570 print_insn_big_mips (bfd_vma memaddr, struct disassemble_info *info)
2571 {
2572   return _print_insn_mips (memaddr, info, BFD_ENDIAN_BIG);
2573 }
2574
2575 int
2576 print_insn_little_mips (bfd_vma memaddr, struct disassemble_info *info)
2577 {
2578   return _print_insn_mips (memaddr, info, BFD_ENDIAN_LITTLE);
2579 }
2580 \f
2581 /* Indices into option argument vector for options accepting an argument.
2582    Use MIPS_OPTION_ARG_NONE for options accepting no argument.  */
2583 typedef enum
2584 {
2585   MIPS_OPTION_ARG_NONE = -1,
2586   MIPS_OPTION_ARG_ABI,
2587   MIPS_OPTION_ARG_ARCH,
2588   MIPS_OPTION_ARG_SIZE
2589 } mips_option_arg_t;
2590
2591 /* Valid MIPS disassembler options.  */
2592 static struct
2593 {
2594   const char *name;
2595   const char *description;
2596   mips_option_arg_t arg;
2597 } mips_options[] =
2598 {
2599   { "no-aliases", N_("Use canonical instruction forms.\n"),
2600                   MIPS_OPTION_ARG_NONE },
2601   { "msa",        N_("Recognize MSA instructions.\n"),
2602                   MIPS_OPTION_ARG_NONE },
2603   { "virt",       N_("Recognize the virtualization ASE instructions.\n"),
2604                   MIPS_OPTION_ARG_NONE },
2605   { "xpa",        N_("Recognize the eXtended Physical Address (XPA) ASE\n\
2606                   instructions.\n"),
2607                   MIPS_OPTION_ARG_NONE },
2608   { "ginv",       N_("Recognize the Global INValidate (GINV) ASE "
2609                      "instructions.\n"),
2610                   MIPS_OPTION_ARG_NONE },
2611   { "loongson-mmi",
2612                   N_("Recognize the Loongson MultiMedia extensions "
2613                      "Instructions (MMI) ASE instructions.\n"),
2614                   MIPS_OPTION_ARG_NONE },
2615   { "loongson-cam",
2616                   N_("Recognize the Loongson Content Address Memory (CAM) "
2617                      " instructions.\n"),
2618                   MIPS_OPTION_ARG_NONE },
2619   { "loongson-ext",
2620                   N_("Recognize the Loongson EXTensions (EXT) "
2621                      " instructions.\n"),
2622                   MIPS_OPTION_ARG_NONE },
2623   { "loongson-ext2",
2624                   N_("Recognize the Loongson EXTensions R2 (EXT2) "
2625                      " instructions.\n"),
2626                   MIPS_OPTION_ARG_NONE },
2627   { "gpr-names=", N_("Print GPR names according to specified ABI.\n\
2628                   Default: based on binary being disassembled.\n"),
2629                   MIPS_OPTION_ARG_ABI },
2630   { "fpr-names=", N_("Print FPR names according to specified ABI.\n\
2631                   Default: numeric.\n"),
2632                   MIPS_OPTION_ARG_ABI },
2633   { "cp0-names=", N_("Print CP0 register names according to specified "
2634                      "architecture.\n\
2635                   Default: based on binary being disassembled.\n"),
2636                   MIPS_OPTION_ARG_ARCH },
2637   { "hwr-names=", N_("Print HWR names according to specified architecture.\n\
2638                   Default: based on binary being disassembled.\n"),
2639                   MIPS_OPTION_ARG_ARCH },
2640   { "reg-names=", N_("Print GPR and FPR names according to specified ABI.\n"),
2641                   MIPS_OPTION_ARG_ABI },
2642   { "reg-names=", N_("Print CP0 register and HWR names according to "
2643                      "specified\n\
2644                   architecture."),
2645                   MIPS_OPTION_ARG_ARCH }
2646 };
2647
2648 /* Build the structure representing valid MIPS disassembler options.
2649    This is done dynamically for maintenance ease purpose; a static
2650    initializer would be unreadable.  */
2651
2652 const disasm_options_and_args_t *
2653 disassembler_options_mips (void)
2654 {
2655   static disasm_options_and_args_t *opts_and_args;
2656
2657   if (opts_and_args == NULL)
2658     {
2659       size_t num_options = ARRAY_SIZE (mips_options);
2660       size_t num_args = MIPS_OPTION_ARG_SIZE;
2661       disasm_option_arg_t *args;
2662       disasm_options_t *opts;
2663       size_t i;
2664       size_t j;
2665
2666       args = XNEWVEC (disasm_option_arg_t, num_args + 1);
2667
2668       args[MIPS_OPTION_ARG_ABI].name = "ABI";
2669       args[MIPS_OPTION_ARG_ABI].values
2670         = XNEWVEC (const char *, ARRAY_SIZE (mips_abi_choices) + 1);
2671       for (i = 0; i < ARRAY_SIZE (mips_abi_choices); i++)
2672         args[MIPS_OPTION_ARG_ABI].values[i] = mips_abi_choices[i].name;
2673       /* The array we return must be NULL terminated.  */
2674       args[MIPS_OPTION_ARG_ABI].values[i] = NULL;
2675
2676       args[MIPS_OPTION_ARG_ARCH].name = "ARCH";
2677       args[MIPS_OPTION_ARG_ARCH].values
2678         = XNEWVEC (const char *, ARRAY_SIZE (mips_arch_choices) + 1);
2679       for (i = 0, j = 0; i < ARRAY_SIZE (mips_arch_choices); i++)
2680         if (*mips_arch_choices[i].name != '\0')
2681           args[MIPS_OPTION_ARG_ARCH].values[j++] = mips_arch_choices[i].name;
2682       /* The array we return must be NULL terminated.  */
2683       args[MIPS_OPTION_ARG_ARCH].values[j] = NULL;
2684
2685       /* The array we return must be NULL terminated.  */
2686       args[MIPS_OPTION_ARG_SIZE].name = NULL;
2687       args[MIPS_OPTION_ARG_SIZE].values = NULL;
2688
2689       opts_and_args = XNEW (disasm_options_and_args_t);
2690       opts_and_args->args = args;
2691
2692       opts = &opts_and_args->options;
2693       opts->name = XNEWVEC (const char *, num_options + 1);
2694       opts->description = XNEWVEC (const char *, num_options + 1);
2695       opts->arg = XNEWVEC (const disasm_option_arg_t *, num_options + 1);
2696       for (i = 0; i < num_options; i++)
2697         {
2698           opts->name[i] = mips_options[i].name;
2699           opts->description[i] = _(mips_options[i].description);
2700           if (mips_options[i].arg != MIPS_OPTION_ARG_NONE)
2701             opts->arg[i] = &args[mips_options[i].arg];
2702           else
2703             opts->arg[i] = NULL;
2704         }
2705       /* The array we return must be NULL terminated.  */
2706       opts->name[i] = NULL;
2707       opts->description[i] = NULL;
2708       opts->arg[i] = NULL;
2709     }
2710
2711   return opts_and_args;
2712 }
2713
2714 void
2715 print_mips_disassembler_options (FILE *stream)
2716 {
2717   const disasm_options_and_args_t *opts_and_args;
2718   const disasm_option_arg_t *args;
2719   const disasm_options_t *opts;
2720   size_t max_len = 0;
2721   size_t i;
2722   size_t j;
2723
2724   opts_and_args = disassembler_options_mips ();
2725   opts = &opts_and_args->options;
2726   args = opts_and_args->args;
2727
2728   fprintf (stream, _("\n\
2729 The following MIPS specific disassembler options are supported for use\n\
2730 with the -M switch (multiple options should be separated by commas):\n\n"));
2731
2732   /* Compute the length of the longest option name.  */
2733   for (i = 0; opts->name[i] != NULL; i++)
2734     {
2735       size_t len = strlen (opts->name[i]);
2736
2737       if (opts->arg[i] != NULL)
2738         len += strlen (opts->arg[i]->name);
2739       if (max_len < len)
2740         max_len = len;
2741     }
2742
2743   for (i = 0, max_len++; opts->name[i] != NULL; i++)
2744     {
2745       fprintf (stream, "  %s", opts->name[i]);
2746       if (opts->arg[i] != NULL)
2747         fprintf (stream, "%s", opts->arg[i]->name);
2748       if (opts->description[i] != NULL)
2749         {
2750           size_t len = strlen (opts->name[i]);
2751
2752           if (opts->arg[i] != NULL)
2753             len += strlen (opts->arg[i]->name);
2754           fprintf (stream,
2755                    "%*c %s", (int) (max_len - len), ' ', opts->description[i]);
2756         }
2757       fprintf (stream, _("\n"));
2758     }
2759
2760   for (i = 0; args[i].name != NULL; i++)
2761     {
2762       fprintf (stream, _("\n\
2763   For the options above, the following values are supported for \"%s\":\n   "),
2764                args[i].name);
2765       for (j = 0; args[i].values[j] != NULL; j++)
2766         fprintf (stream, " %s", args[i].values[j]);
2767       fprintf (stream, _("\n"));
2768     }
2769
2770   fprintf (stream, _("\n"));
2771 }