[MIPS/GAS] Split Loongson EXT Instructions from loongson3a.
[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   if (CONST_STRNEQ (option, "loongson-ext"))
952     {
953       mips_ase |= ASE_LOONGSON_EXT;
954       return TRUE;
955     }
956
957   return FALSE;
958 }
959
960 static void
961 parse_mips_dis_option (const char *option, unsigned int len)
962 {
963   unsigned int i, optionlen, vallen;
964   const char *val;
965   const struct mips_abi_choice *chosen_abi;
966   const struct mips_arch_choice *chosen_arch;
967
968   /* Try to match options that are simple flags */
969   if (CONST_STRNEQ (option, "no-aliases"))
970     {
971       no_aliases = 1;
972       return;
973     }
974
975   if (parse_mips_ase_option (option))
976     {
977       mips_ase |= mips_calculate_combination_ases (mips_ase);
978       return;
979     }
980
981   /* Look for the = that delimits the end of the option name.  */
982   for (i = 0; i < len; i++)
983     if (option[i] == '=')
984       break;
985
986   if (i == 0)           /* Invalid option: no name before '='.  */
987     return;
988   if (i == len)         /* Invalid option: no '='.  */
989     return;
990   if (i == (len - 1))   /* Invalid option: no value after '='.  */
991     return;
992
993   optionlen = i;
994   val = option + (optionlen + 1);
995   vallen = len - (optionlen + 1);
996
997   if (strncmp ("gpr-names", option, optionlen) == 0
998       && strlen ("gpr-names") == optionlen)
999     {
1000       chosen_abi = choose_abi_by_name (val, vallen);
1001       if (chosen_abi != NULL)
1002         mips_gpr_names = chosen_abi->gpr_names;
1003       return;
1004     }
1005
1006   if (strncmp ("fpr-names", option, optionlen) == 0
1007       && strlen ("fpr-names") == optionlen)
1008     {
1009       chosen_abi = choose_abi_by_name (val, vallen);
1010       if (chosen_abi != NULL)
1011         mips_fpr_names = chosen_abi->fpr_names;
1012       return;
1013     }
1014
1015   if (strncmp ("cp0-names", option, optionlen) == 0
1016       && strlen ("cp0-names") == optionlen)
1017     {
1018       chosen_arch = choose_arch_by_name (val, vallen);
1019       if (chosen_arch != NULL)
1020         {
1021           mips_cp0_names = chosen_arch->cp0_names;
1022           mips_cp0sel_names = chosen_arch->cp0sel_names;
1023           mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
1024         }
1025       return;
1026     }
1027
1028   if (strncmp ("cp1-names", option, optionlen) == 0
1029       && strlen ("cp1-names") == optionlen)
1030     {
1031       chosen_arch = choose_arch_by_name (val, vallen);
1032       if (chosen_arch != NULL)
1033         mips_cp1_names = chosen_arch->cp1_names;
1034       return;
1035     }
1036
1037   if (strncmp ("hwr-names", option, optionlen) == 0
1038       && strlen ("hwr-names") == optionlen)
1039     {
1040       chosen_arch = choose_arch_by_name (val, vallen);
1041       if (chosen_arch != NULL)
1042         mips_hwr_names = chosen_arch->hwr_names;
1043       return;
1044     }
1045
1046   if (strncmp ("reg-names", option, optionlen) == 0
1047       && strlen ("reg-names") == optionlen)
1048     {
1049       /* We check both ABI and ARCH here unconditionally, so
1050          that "numeric" will do the desirable thing: select
1051          numeric register names for all registers.  Other than
1052          that, a given name probably won't match both.  */
1053       chosen_abi = choose_abi_by_name (val, vallen);
1054       if (chosen_abi != NULL)
1055         {
1056           mips_gpr_names = chosen_abi->gpr_names;
1057           mips_fpr_names = chosen_abi->fpr_names;
1058         }
1059       chosen_arch = choose_arch_by_name (val, vallen);
1060       if (chosen_arch != NULL)
1061         {
1062           mips_cp0_names = chosen_arch->cp0_names;
1063           mips_cp0sel_names = chosen_arch->cp0sel_names;
1064           mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
1065           mips_cp1_names = chosen_arch->cp1_names;
1066           mips_hwr_names = chosen_arch->hwr_names;
1067         }
1068       return;
1069     }
1070
1071   /* Invalid option.  */
1072 }
1073
1074 static void
1075 parse_mips_dis_options (const char *options)
1076 {
1077   const char *option_end;
1078
1079   if (options == NULL)
1080     return;
1081
1082   while (*options != '\0')
1083     {
1084       /* Skip empty options.  */
1085       if (*options == ',')
1086         {
1087           options++;
1088           continue;
1089         }
1090
1091       /* We know that *options is neither NUL or a comma.  */
1092       option_end = options + 1;
1093       while (*option_end != ',' && *option_end != '\0')
1094         option_end++;
1095
1096       parse_mips_dis_option (options, option_end - options);
1097
1098       /* Go on to the next one.  If option_end points to a comma, it
1099          will be skipped above.  */
1100       options = option_end;
1101     }
1102 }
1103
1104 static const struct mips_cp0sel_name *
1105 lookup_mips_cp0sel_name (const struct mips_cp0sel_name *names,
1106                          unsigned int len,
1107                          unsigned int cp0reg,
1108                          unsigned int sel)
1109 {
1110   unsigned int i;
1111
1112   for (i = 0; i < len; i++)
1113     if (names[i].cp0reg == cp0reg && names[i].sel == sel)
1114       return &names[i];
1115   return NULL;
1116 }
1117
1118 /* Print register REGNO, of type TYPE, for instruction OPCODE.  */
1119
1120 static void
1121 print_reg (struct disassemble_info *info, const struct mips_opcode *opcode,
1122            enum mips_reg_operand_type type, int regno)
1123 {
1124   switch (type)
1125     {
1126     case OP_REG_GP:
1127       info->fprintf_func (info->stream, "%s", mips_gpr_names[regno]);
1128       break;
1129
1130     case OP_REG_FP:
1131       info->fprintf_func (info->stream, "%s", mips_fpr_names[regno]);
1132       break;
1133
1134     case OP_REG_CCC:
1135       if (opcode->pinfo & (FP_D | FP_S))
1136         info->fprintf_func (info->stream, "$fcc%d", regno);
1137       else
1138         info->fprintf_func (info->stream, "$cc%d", regno);
1139       break;
1140
1141     case OP_REG_VEC:
1142       if (opcode->membership & INSN_5400)
1143         info->fprintf_func (info->stream, "$f%d", regno);
1144       else
1145         info->fprintf_func (info->stream, "$v%d", regno);
1146       break;
1147
1148     case OP_REG_ACC:
1149       info->fprintf_func (info->stream, "$ac%d", regno);
1150       break;
1151
1152     case OP_REG_COPRO:
1153       if (opcode->name[strlen (opcode->name) - 1] == '0')
1154         info->fprintf_func (info->stream, "%s", mips_cp0_names[regno]);
1155       else if (opcode->name[strlen (opcode->name) - 1] == '1')
1156         info->fprintf_func (info->stream, "%s", mips_cp1_names[regno]);
1157       else
1158         info->fprintf_func (info->stream, "$%d", regno);
1159       break;
1160
1161     case OP_REG_HW:
1162       info->fprintf_func (info->stream, "%s", mips_hwr_names[regno]);
1163       break;
1164
1165     case OP_REG_VF:
1166       info->fprintf_func (info->stream, "$vf%d", regno);
1167       break;
1168
1169     case OP_REG_VI:
1170       info->fprintf_func (info->stream, "$vi%d", regno);
1171       break;
1172
1173     case OP_REG_R5900_I:
1174       info->fprintf_func (info->stream, "$I");
1175       break;
1176
1177     case OP_REG_R5900_Q:
1178       info->fprintf_func (info->stream, "$Q");
1179       break;
1180
1181     case OP_REG_R5900_R:
1182       info->fprintf_func (info->stream, "$R");
1183       break;
1184
1185     case OP_REG_R5900_ACC:
1186       info->fprintf_func (info->stream, "$ACC");
1187       break;
1188
1189     case OP_REG_MSA:
1190       info->fprintf_func (info->stream, "$w%d", regno);
1191       break;
1192
1193     case OP_REG_MSA_CTRL:
1194       info->fprintf_func (info->stream, "%s", msa_control_names[regno]);
1195       break;
1196
1197     }
1198 }
1199 \f
1200 /* Used to track the state carried over from previous operands in
1201    an instruction.  */
1202 struct mips_print_arg_state {
1203   /* The value of the last OP_INT seen.  We only use this for OP_MSB,
1204      where the value is known to be unsigned and small.  */
1205   unsigned int last_int;
1206
1207   /* The type and number of the last OP_REG seen.  We only use this for
1208      OP_REPEAT_DEST_REG and OP_REPEAT_PREV_REG.  */
1209   enum mips_reg_operand_type last_reg_type;
1210   unsigned int last_regno;
1211   unsigned int dest_regno;
1212   unsigned int seen_dest;
1213 };
1214
1215 /* Initialize STATE for the start of an instruction.  */
1216
1217 static inline void
1218 init_print_arg_state (struct mips_print_arg_state *state)
1219 {
1220   memset (state, 0, sizeof (*state));
1221 }
1222
1223 /* Print OP_VU0_SUFFIX or OP_VU0_MATCH_SUFFIX operand OPERAND,
1224    whose value is given by UVAL.  */
1225
1226 static void
1227 print_vu0_channel (struct disassemble_info *info,
1228                    const struct mips_operand *operand, unsigned int uval)
1229 {
1230   if (operand->size == 4)
1231     info->fprintf_func (info->stream, "%s%s%s%s",
1232                         uval & 8 ? "x" : "",
1233                         uval & 4 ? "y" : "",
1234                         uval & 2 ? "z" : "",
1235                         uval & 1 ? "w" : "");
1236   else if (operand->size == 2)
1237     info->fprintf_func (info->stream, "%c", "xyzw"[uval]);
1238   else
1239     abort ();
1240 }
1241
1242 /* Record information about a register operand.  */
1243
1244 static void
1245 mips_seen_register (struct mips_print_arg_state *state,
1246                     unsigned int regno,
1247                     enum mips_reg_operand_type reg_type)
1248 {
1249   state->last_reg_type = reg_type;
1250   state->last_regno = regno;
1251
1252   if (!state->seen_dest)
1253     {
1254       state->seen_dest = 1;
1255       state->dest_regno = regno;
1256     }
1257 }
1258
1259 /* Print SAVE/RESTORE instruction operands according to the argument
1260    register mask AMASK, the number of static registers saved NSREG,
1261    the $ra, $s0 and $s1 register specifiers RA, S0 and S1 respectively,
1262    and the frame size FRAME_SIZE.  */
1263
1264 static void
1265 mips_print_save_restore (struct disassemble_info *info, unsigned int amask,
1266                          unsigned int nsreg, unsigned int ra,
1267                          unsigned int s0, unsigned int s1,
1268                          unsigned int frame_size)
1269 {
1270   const fprintf_ftype infprintf = info->fprintf_func;
1271   unsigned int nargs, nstatics, smask, i, j;
1272   void *is = info->stream;
1273   const char *sep;
1274
1275   if (amask == MIPS_SVRS_ALL_ARGS)
1276     {
1277       nargs = 4;
1278       nstatics = 0;
1279     }
1280   else if (amask == MIPS_SVRS_ALL_STATICS)
1281     {
1282       nargs = 0;
1283       nstatics = 4;
1284     }
1285   else
1286     {
1287       nargs = amask >> 2;
1288       nstatics = amask & 3;
1289     }
1290
1291   sep = "";
1292   if (nargs > 0)
1293     {
1294       infprintf (is, "%s", mips_gpr_names[4]);
1295       if (nargs > 1)
1296         infprintf (is, "-%s", mips_gpr_names[4 + nargs - 1]);
1297       sep = ",";
1298     }
1299
1300   infprintf (is, "%s%d", sep, frame_size);
1301
1302   if (ra)                       /* $ra */
1303     infprintf (is, ",%s", mips_gpr_names[31]);
1304
1305   smask = 0;
1306   if (s0)                       /* $s0 */
1307     smask |= 1 << 0;
1308   if (s1)                       /* $s1 */
1309     smask |= 1 << 1;
1310   if (nsreg > 0)                /* $s2-$s8 */
1311     smask |= ((1 << nsreg) - 1) << 2;
1312
1313   for (i = 0; i < 9; i++)
1314     if (smask & (1 << i))
1315       {
1316         infprintf (is, ",%s", mips_gpr_names[i == 8 ? 30 : (16 + i)]);
1317         /* Skip over string of set bits.  */
1318         for (j = i; smask & (2 << j); j++)
1319           continue;
1320         if (j > i)
1321           infprintf (is, "-%s", mips_gpr_names[j == 8 ? 30 : (16 + j)]);
1322         i = j + 1;
1323       }
1324   /* Statics $ax - $a3.  */
1325   if (nstatics == 1)
1326     infprintf (is, ",%s", mips_gpr_names[7]);
1327   else if (nstatics > 0)
1328     infprintf (is, ",%s-%s",
1329                mips_gpr_names[7 - nstatics + 1],
1330                mips_gpr_names[7]);
1331 }
1332
1333
1334 /* Print operand OPERAND of OPCODE, using STATE to track inter-operand state.
1335    UVAL is the encoding of the operand (shifted into bit 0) and BASE_PC is
1336    the base address for OP_PCREL operands.  */
1337
1338 static void
1339 print_insn_arg (struct disassemble_info *info,
1340                 struct mips_print_arg_state *state,
1341                 const struct mips_opcode *opcode,
1342                 const struct mips_operand *operand,
1343                 bfd_vma base_pc,
1344                 unsigned int uval)
1345 {
1346   const fprintf_ftype infprintf = info->fprintf_func;
1347   void *is = info->stream;
1348
1349   switch (operand->type)
1350     {
1351     case OP_INT:
1352       {
1353         const struct mips_int_operand *int_op;
1354
1355         int_op = (const struct mips_int_operand *) operand;
1356         uval = mips_decode_int_operand (int_op, uval);
1357         state->last_int = uval;
1358         if (int_op->print_hex)
1359           infprintf (is, "0x%x", uval);
1360         else
1361           infprintf (is, "%d", uval);
1362       }
1363       break;
1364
1365     case OP_MAPPED_INT:
1366       {
1367         const struct mips_mapped_int_operand *mint_op;
1368
1369         mint_op = (const struct mips_mapped_int_operand *) operand;
1370         uval = mint_op->int_map[uval];
1371         state->last_int = uval;
1372         if (mint_op->print_hex)
1373           infprintf (is, "0x%x", uval);
1374         else
1375           infprintf (is, "%d", uval);
1376       }
1377       break;
1378
1379     case OP_MSB:
1380       {
1381         const struct mips_msb_operand *msb_op;
1382
1383         msb_op = (const struct mips_msb_operand *) operand;
1384         uval += msb_op->bias;
1385         if (msb_op->add_lsb)
1386           uval -= state->last_int;
1387         infprintf (is, "0x%x", uval);
1388       }
1389       break;
1390
1391     case OP_REG:
1392     case OP_OPTIONAL_REG:
1393       {
1394         const struct mips_reg_operand *reg_op;
1395
1396         reg_op = (const struct mips_reg_operand *) operand;
1397         uval = mips_decode_reg_operand (reg_op, uval);
1398         print_reg (info, opcode, reg_op->reg_type, uval);
1399
1400         mips_seen_register (state, uval, reg_op->reg_type);
1401       }
1402       break;
1403
1404     case OP_REG_PAIR:
1405       {
1406         const struct mips_reg_pair_operand *pair_op;
1407
1408         pair_op = (const struct mips_reg_pair_operand *) operand;
1409         print_reg (info, opcode, pair_op->reg_type,
1410                    pair_op->reg1_map[uval]);
1411         infprintf (is, ",");
1412         print_reg (info, opcode, pair_op->reg_type,
1413                    pair_op->reg2_map[uval]);
1414       }
1415       break;
1416
1417     case OP_PCREL:
1418       {
1419         const struct mips_pcrel_operand *pcrel_op;
1420
1421         pcrel_op = (const struct mips_pcrel_operand *) operand;
1422         info->target = mips_decode_pcrel_operand (pcrel_op, base_pc, uval);
1423
1424         /* For jumps and branches clear the ISA bit except for
1425            the GDB disassembler.  */
1426         if (pcrel_op->include_isa_bit
1427             && info->flavour != bfd_target_unknown_flavour)
1428           info->target &= -2;
1429
1430         (*info->print_address_func) (info->target, info);
1431       }
1432       break;
1433
1434     case OP_PERF_REG:
1435       infprintf (is, "%d", uval);
1436       break;
1437
1438     case OP_ADDIUSP_INT:
1439       {
1440         int sval;
1441
1442         sval = mips_signed_operand (operand, uval) * 4;
1443         if (sval >= -8 && sval < 8)
1444           sval ^= 0x400;
1445         infprintf (is, "%d", sval);
1446         break;
1447       }
1448
1449     case OP_CLO_CLZ_DEST:
1450       {
1451         unsigned int reg1, reg2;
1452
1453         reg1 = uval & 31;
1454         reg2 = uval >> 5;
1455         /* If one is zero use the other.  */
1456         if (reg1 == reg2 || reg2 == 0)
1457           infprintf (is, "%s", mips_gpr_names[reg1]);
1458         else if (reg1 == 0)
1459           infprintf (is, "%s", mips_gpr_names[reg2]);
1460         else
1461           /* Bogus, result depends on processor.  */
1462           infprintf (is, "%s or %s", mips_gpr_names[reg1],
1463                      mips_gpr_names[reg2]);
1464       }
1465       break;
1466
1467     case OP_SAME_RS_RT:
1468     case OP_CHECK_PREV:
1469     case OP_NON_ZERO_REG:
1470       {
1471         print_reg (info, opcode, OP_REG_GP, uval & 31);
1472         mips_seen_register (state, uval, OP_REG_GP);
1473       }
1474       break;
1475
1476     case OP_LWM_SWM_LIST:
1477       if (operand->size == 2)
1478         {
1479           if (uval == 0)
1480             infprintf (is, "%s,%s",
1481                        mips_gpr_names[16],
1482                        mips_gpr_names[31]);
1483           else
1484             infprintf (is, "%s-%s,%s",
1485                        mips_gpr_names[16],
1486                        mips_gpr_names[16 + uval],
1487                        mips_gpr_names[31]);
1488         }
1489       else
1490         {
1491           int s_reg_encode;
1492
1493           s_reg_encode = uval & 0xf;
1494           if (s_reg_encode != 0)
1495             {
1496               if (s_reg_encode == 1)
1497                 infprintf (is, "%s", mips_gpr_names[16]);
1498               else if (s_reg_encode < 9)
1499                 infprintf (is, "%s-%s",
1500                            mips_gpr_names[16],
1501                            mips_gpr_names[15 + s_reg_encode]);
1502               else if (s_reg_encode == 9)
1503                 infprintf (is, "%s-%s,%s",
1504                            mips_gpr_names[16],
1505                            mips_gpr_names[23],
1506                            mips_gpr_names[30]);
1507               else
1508                 infprintf (is, "UNKNOWN");
1509             }
1510
1511           if (uval & 0x10) /* For ra.  */
1512             {
1513               if (s_reg_encode == 0)
1514                 infprintf (is, "%s", mips_gpr_names[31]);
1515               else
1516                 infprintf (is, ",%s", mips_gpr_names[31]);
1517             }
1518         }
1519       break;
1520
1521     case OP_ENTRY_EXIT_LIST:
1522       {
1523         const char *sep;
1524         unsigned int amask, smask;
1525
1526         sep = "";
1527         amask = (uval >> 3) & 7;
1528         if (amask > 0 && amask < 5)
1529           {
1530             infprintf (is, "%s", mips_gpr_names[4]);
1531             if (amask > 1)
1532               infprintf (is, "-%s", mips_gpr_names[amask + 3]);
1533             sep = ",";
1534           }
1535
1536         smask = (uval >> 1) & 3;
1537         if (smask == 3)
1538           {
1539             infprintf (is, "%s??", sep);
1540             sep = ",";
1541           }
1542         else if (smask > 0)
1543           {
1544             infprintf (is, "%s%s", sep, mips_gpr_names[16]);
1545             if (smask > 1)
1546               infprintf (is, "-%s", mips_gpr_names[smask + 15]);
1547             sep = ",";
1548           }
1549
1550         if (uval & 1)
1551           {
1552             infprintf (is, "%s%s", sep, mips_gpr_names[31]);
1553             sep = ",";
1554           }
1555
1556         if (amask == 5 || amask == 6)
1557           {
1558             infprintf (is, "%s%s", sep, mips_fpr_names[0]);
1559             if (amask == 6)
1560               infprintf (is, "-%s", mips_fpr_names[1]);
1561           }
1562       }
1563       break;
1564
1565     case OP_SAVE_RESTORE_LIST:
1566       /* Should be handled by the caller due to complex behavior.  */
1567       abort ();
1568
1569     case OP_MDMX_IMM_REG:
1570       {
1571         unsigned int vsel;
1572
1573         vsel = uval >> 5;
1574         uval &= 31;
1575         if ((vsel & 0x10) == 0)
1576           {
1577             int fmt;
1578
1579             vsel &= 0x0f;
1580             for (fmt = 0; fmt < 3; fmt++, vsel >>= 1)
1581               if ((vsel & 1) == 0)
1582                 break;
1583             print_reg (info, opcode, OP_REG_VEC, uval);
1584             infprintf (is, "[%d]", vsel >> 1);
1585           }
1586         else if ((vsel & 0x08) == 0)
1587           print_reg (info, opcode, OP_REG_VEC, uval);
1588         else
1589           infprintf (is, "0x%x", uval);
1590       }
1591       break;
1592
1593     case OP_REPEAT_PREV_REG:
1594       print_reg (info, opcode, state->last_reg_type, state->last_regno);
1595       break;
1596
1597     case OP_REPEAT_DEST_REG:
1598       print_reg (info, opcode, state->last_reg_type, state->dest_regno);
1599       break;
1600
1601     case OP_PC:
1602       infprintf (is, "$pc");
1603       break;
1604
1605     case OP_REG28:
1606       print_reg (info, opcode, OP_REG_GP, 28);
1607       break;
1608
1609     case OP_VU0_SUFFIX:
1610     case OP_VU0_MATCH_SUFFIX:
1611       print_vu0_channel (info, operand, uval);
1612       break;
1613
1614     case OP_IMM_INDEX:
1615       infprintf (is, "[%d]", uval);
1616       break;
1617
1618     case OP_REG_INDEX:
1619       infprintf (is, "[");
1620       print_reg (info, opcode, OP_REG_GP, uval);
1621       infprintf (is, "]");
1622       break;
1623     }
1624 }
1625
1626 /* Validate the arguments for INSN, which is described by OPCODE.
1627    Use DECODE_OPERAND to get the encoding of each operand.  */
1628
1629 static bfd_boolean
1630 validate_insn_args (const struct mips_opcode *opcode,
1631                     const struct mips_operand *(*decode_operand) (const char *),
1632                     unsigned int insn)
1633 {
1634   struct mips_print_arg_state state;
1635   const struct mips_operand *operand;
1636   const char *s;
1637   unsigned int uval;
1638
1639   init_print_arg_state (&state);
1640   for (s = opcode->args; *s; ++s)
1641     {
1642       switch (*s)
1643         {
1644         case ',':
1645         case '(':
1646         case ')':
1647           break;
1648
1649         case '#':
1650           ++s;
1651           break;
1652
1653         default:
1654           operand = decode_operand (s);
1655
1656           if (operand)
1657             {
1658               uval = mips_extract_operand (operand, insn);
1659               switch (operand->type)
1660                 {
1661                 case OP_REG:
1662                 case OP_OPTIONAL_REG:
1663                   {
1664                     const struct mips_reg_operand *reg_op;
1665
1666                     reg_op = (const struct mips_reg_operand *) operand;
1667                     uval = mips_decode_reg_operand (reg_op, uval);
1668                     mips_seen_register (&state, uval, reg_op->reg_type);
1669                   }
1670                 break;
1671
1672                 case OP_SAME_RS_RT:
1673                   {
1674                     unsigned int reg1, reg2;
1675
1676                     reg1 = uval & 31;
1677                     reg2 = uval >> 5;
1678
1679                     if (reg1 != reg2 || reg1 == 0)
1680                       return FALSE;
1681                   }
1682                 break;
1683
1684                 case OP_CHECK_PREV:
1685                   {
1686                     const struct mips_check_prev_operand *prev_op;
1687
1688                     prev_op = (const struct mips_check_prev_operand *) operand;
1689
1690                     if (!prev_op->zero_ok && uval == 0)
1691                       return FALSE;
1692
1693                     if (((prev_op->less_than_ok && uval < state.last_regno)
1694                         || (prev_op->greater_than_ok && uval > state.last_regno)
1695                         || (prev_op->equal_ok && uval == state.last_regno)))
1696                       break;
1697
1698                     return FALSE;
1699                   }
1700
1701                 case OP_NON_ZERO_REG:
1702                   {
1703                     if (uval == 0)
1704                       return FALSE;
1705                   }
1706                 break;
1707
1708                 case OP_INT:
1709                 case OP_MAPPED_INT:
1710                 case OP_MSB:
1711                 case OP_REG_PAIR:
1712                 case OP_PCREL:
1713                 case OP_PERF_REG:
1714                 case OP_ADDIUSP_INT:
1715                 case OP_CLO_CLZ_DEST:
1716                 case OP_LWM_SWM_LIST:
1717                 case OP_ENTRY_EXIT_LIST:
1718                 case OP_MDMX_IMM_REG:
1719                 case OP_REPEAT_PREV_REG:
1720                 case OP_REPEAT_DEST_REG:
1721                 case OP_PC:
1722                 case OP_REG28:
1723                 case OP_VU0_SUFFIX:
1724                 case OP_VU0_MATCH_SUFFIX:
1725                 case OP_IMM_INDEX:
1726                 case OP_REG_INDEX:
1727                 case OP_SAVE_RESTORE_LIST:
1728                   break;
1729                 }
1730             }
1731           if (*s == 'm' || *s == '+' || *s == '-')
1732             ++s;
1733         }
1734     }
1735   return TRUE;
1736 }
1737
1738 /* Print the arguments for INSN, which is described by OPCODE.
1739    Use DECODE_OPERAND to get the encoding of each operand.  Use BASE_PC
1740    as the base of OP_PCREL operands, adjusting by LENGTH if the OP_PCREL
1741    operand is for a branch or jump.  */
1742
1743 static void
1744 print_insn_args (struct disassemble_info *info,
1745                  const struct mips_opcode *opcode,
1746                  const struct mips_operand *(*decode_operand) (const char *),
1747                  unsigned int insn, bfd_vma insn_pc, unsigned int length)
1748 {
1749   const fprintf_ftype infprintf = info->fprintf_func;
1750   void *is = info->stream;
1751   struct mips_print_arg_state state;
1752   const struct mips_operand *operand;
1753   const char *s;
1754
1755   init_print_arg_state (&state);
1756   for (s = opcode->args; *s; ++s)
1757     {
1758       switch (*s)
1759         {
1760         case ',':
1761         case '(':
1762         case ')':
1763           infprintf (is, "%c", *s);
1764           break;
1765
1766         case '#':
1767           ++s;
1768           infprintf (is, "%c%c", *s, *s);
1769           break;
1770
1771         default:
1772           operand = decode_operand (s);
1773           if (!operand)
1774             {
1775               /* xgettext:c-format */
1776               infprintf (is,
1777                          _("# internal error, undefined operand in `%s %s'"),
1778                          opcode->name, opcode->args);
1779               return;
1780             }
1781
1782           if (operand->type == OP_SAVE_RESTORE_LIST)
1783             {
1784               /* Handle this case here because of the complex behavior.  */
1785               unsigned int amask = (insn >> 15) & 0xf;
1786               unsigned int nsreg = (insn >> 23) & 0x7;
1787               unsigned int ra = insn & 0x1000;                  /* $ra */
1788               unsigned int s0 = insn & 0x800;                   /* $s0 */
1789               unsigned int s1 = insn & 0x400;                   /* $s1 */
1790               unsigned int frame_size = (((insn >> 15) & 0xf0)
1791                                          | ((insn >> 6) & 0x0f)) * 8;
1792               mips_print_save_restore (info, amask, nsreg, ra, s0, s1,
1793                                        frame_size);
1794             }
1795           else if (operand->type == OP_REG
1796                    && s[1] == ','
1797                    && s[2] == 'H'
1798                    && opcode->name[strlen (opcode->name) - 1] == '0')
1799             {
1800               /* Coprocessor register 0 with sel field.  */
1801               const struct mips_cp0sel_name *n;
1802               unsigned int reg, sel;
1803
1804               reg = mips_extract_operand (operand, insn);
1805               s += 2;
1806               operand = decode_operand (s);
1807               sel = mips_extract_operand (operand, insn);
1808
1809               /* CP0 register including 'sel' code for mftc0, to be
1810                  printed textually if known.  If not known, print both
1811                  CP0 register name and sel numerically since CP0 register
1812                  with sel 0 may have a name unrelated to register being
1813                  printed.  */
1814               n = lookup_mips_cp0sel_name (mips_cp0sel_names,
1815                                            mips_cp0sel_names_len,
1816                                            reg, sel);
1817               if (n != NULL)
1818                 infprintf (is, "%s", n->name);
1819               else
1820                 infprintf (is, "$%d,%d", reg, sel);
1821             }
1822           else
1823             {
1824               bfd_vma base_pc = insn_pc;
1825
1826               /* Adjust the PC relative base so that branch/jump insns use
1827                  the following PC as the base but genuinely PC relative
1828                  operands use the current PC.  */
1829               if (operand->type == OP_PCREL)
1830                 {
1831                   const struct mips_pcrel_operand *pcrel_op;
1832
1833                   pcrel_op = (const struct mips_pcrel_operand *) operand;
1834                   /* The include_isa_bit flag is sufficient to distinguish
1835                      branch/jump from other PC relative operands.  */
1836                   if (pcrel_op->include_isa_bit)
1837                     base_pc += length;
1838                 }
1839
1840               print_insn_arg (info, &state, opcode, operand, base_pc,
1841                               mips_extract_operand (operand, insn));
1842             }
1843           if (*s == 'm' || *s == '+' || *s == '-')
1844             ++s;
1845           break;
1846         }
1847     }
1848 }
1849 \f
1850 /* Print the mips instruction at address MEMADDR in debugged memory,
1851    on using INFO.  Returns length of the instruction, in bytes, which is
1852    always INSNLEN.  BIGENDIAN must be 1 if this is big-endian code, 0 if
1853    this is little-endian code.  */
1854
1855 static int
1856 print_insn_mips (bfd_vma memaddr,
1857                  int word,
1858                  struct disassemble_info *info)
1859 {
1860 #define GET_OP(insn, field)                     \
1861   (((insn) >> OP_SH_##field) & OP_MASK_##field)
1862   static const struct mips_opcode *mips_hash[OP_MASK_OP + 1];
1863   const fprintf_ftype infprintf = info->fprintf_func;
1864   const struct mips_opcode *op;
1865   static bfd_boolean init = 0;
1866   void *is = info->stream;
1867
1868   /* Build a hash table to shorten the search time.  */
1869   if (! init)
1870     {
1871       unsigned int i;
1872
1873       for (i = 0; i <= OP_MASK_OP; i++)
1874         {
1875           for (op = mips_opcodes; op < &mips_opcodes[NUMOPCODES]; op++)
1876             {
1877               if (op->pinfo == INSN_MACRO
1878                   || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
1879                 continue;
1880               if (i == GET_OP (op->match, OP))
1881                 {
1882                   mips_hash[i] = op;
1883                   break;
1884                 }
1885             }
1886         }
1887
1888       init = 1;
1889     }
1890
1891   info->bytes_per_chunk = INSNLEN;
1892   info->display_endian = info->endian;
1893   info->insn_info_valid = 1;
1894   info->branch_delay_insns = 0;
1895   info->data_size = 0;
1896   info->insn_type = dis_nonbranch;
1897   info->target = 0;
1898   info->target2 = 0;
1899
1900   op = mips_hash[GET_OP (word, OP)];
1901   if (op != NULL)
1902     {
1903       for (; op < &mips_opcodes[NUMOPCODES]; op++)
1904         {
1905           if (op->pinfo != INSN_MACRO
1906               && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
1907               && (word & op->mask) == op->match)
1908             {
1909               /* We always disassemble the jalx instruction, except for MIPS r6.  */
1910               if (!opcode_is_member (op, mips_isa, mips_ase, mips_processor)
1911                  && (strcmp (op->name, "jalx")
1912                      || (mips_isa & INSN_ISA_MASK) == ISA_MIPS32R6
1913                      || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R6))
1914                 continue;
1915
1916               /* Figure out instruction type and branch delay information.  */
1917               if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
1918                 {
1919                   if ((op->pinfo & (INSN_WRITE_GPR_31 | INSN_WRITE_1)) != 0)
1920                     info->insn_type = dis_jsr;
1921                   else
1922                     info->insn_type = dis_branch;
1923                   info->branch_delay_insns = 1;
1924                 }
1925               else if ((op->pinfo & (INSN_COND_BRANCH_DELAY
1926                                      | INSN_COND_BRANCH_LIKELY)) != 0)
1927                 {
1928                   if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
1929                     info->insn_type = dis_condjsr;
1930                   else
1931                     info->insn_type = dis_condbranch;
1932                   info->branch_delay_insns = 1;
1933                 }
1934               else if ((op->pinfo & (INSN_STORE_MEMORY
1935                                      | INSN_LOAD_MEMORY)) != 0)
1936                 info->insn_type = dis_dref;
1937
1938               if (!validate_insn_args (op, decode_mips_operand, word))
1939                 continue;
1940
1941               infprintf (is, "%s", op->name);
1942               if (op->pinfo2 & INSN2_VU0_CHANNEL_SUFFIX)
1943                 {
1944                   unsigned int uval;
1945
1946                   infprintf (is, ".");
1947                   uval = mips_extract_operand (&mips_vu0_channel_mask, word);
1948                   print_vu0_channel (info, &mips_vu0_channel_mask, uval);
1949                 }
1950
1951               if (op->args[0])
1952                 {
1953                   infprintf (is, "\t");
1954                   print_insn_args (info, op, decode_mips_operand, word,
1955                                    memaddr, 4);
1956                 }
1957
1958               return INSNLEN;
1959             }
1960         }
1961     }
1962 #undef GET_OP
1963
1964   /* Handle undefined instructions.  */
1965   info->insn_type = dis_noninsn;
1966   infprintf (is, "0x%x", word);
1967   return INSNLEN;
1968 }
1969 \f
1970 /* Disassemble an operand for a mips16 instruction.  */
1971
1972 static void
1973 print_mips16_insn_arg (struct disassemble_info *info,
1974                        struct mips_print_arg_state *state,
1975                        const struct mips_opcode *opcode,
1976                        char type, bfd_vma memaddr,
1977                        unsigned insn, bfd_boolean use_extend,
1978                        unsigned extend, bfd_boolean is_offset)
1979 {
1980   const fprintf_ftype infprintf = info->fprintf_func;
1981   void *is = info->stream;
1982   const struct mips_operand *operand, *ext_operand;
1983   unsigned short ext_size;
1984   unsigned int uval;
1985   bfd_vma baseaddr;
1986
1987   if (!use_extend)
1988     extend = 0;
1989
1990   switch (type)
1991     {
1992     case ',':
1993     case '(':
1994     case ')':
1995       infprintf (is, "%c", type);
1996       break;
1997
1998     default:
1999       operand = decode_mips16_operand (type, FALSE);
2000       if (!operand)
2001         {
2002           /* xgettext:c-format */
2003           infprintf (is, _("# internal error, undefined operand in `%s %s'"),
2004                      opcode->name, opcode->args);
2005           return;
2006         }
2007
2008       if (operand->type == OP_SAVE_RESTORE_LIST)
2009         {
2010           /* Handle this case here because of the complex interaction
2011              with the EXTEND opcode.  */
2012           unsigned int amask = extend & 0xf;
2013           unsigned int nsreg = (extend >> 8) & 0x7;
2014           unsigned int ra = insn & 0x40;                        /* $ra */
2015           unsigned int s0 = insn & 0x20;                        /* $s0 */
2016           unsigned int s1 = insn & 0x10;                        /* $s1 */
2017           unsigned int frame_size = ((extend & 0xf0) | (insn & 0x0f)) * 8;
2018           if (frame_size == 0 && !use_extend)
2019             frame_size = 128;
2020           mips_print_save_restore (info, amask, nsreg, ra, s0, s1, frame_size);
2021           break;
2022         }
2023
2024       if (is_offset && operand->type == OP_INT)
2025         {
2026           const struct mips_int_operand *int_op;
2027
2028           int_op = (const struct mips_int_operand *) operand;
2029           info->insn_type = dis_dref;
2030           info->data_size = 1 << int_op->shift;
2031         }
2032
2033       ext_size = 0;
2034       if (use_extend)
2035         {
2036           ext_operand = decode_mips16_operand (type, TRUE);
2037           if (ext_operand != operand
2038               || (operand->type == OP_INT && operand->lsb == 0
2039                   && mips_opcode_32bit_p (opcode)))
2040             {
2041               ext_size = ext_operand->size;
2042               operand = ext_operand;
2043             }
2044         }
2045       if (operand->size == 26)
2046         uval = ((extend & 0x1f) << 21) | ((extend & 0x3e0) << 11) | insn;
2047       else if (ext_size == 16 || ext_size == 9)
2048         uval = ((extend & 0x1f) << 11) | (extend & 0x7e0) | (insn & 0x1f);
2049       else if (ext_size == 15)
2050         uval = ((extend & 0xf) << 11) | (extend & 0x7f0) | (insn & 0xf);
2051       else if (ext_size == 6)
2052         uval = ((extend >> 6) & 0x1f) | (extend & 0x20);
2053       else
2054         uval = mips_extract_operand (operand, (extend << 16) | insn);
2055       if (ext_size == 9)
2056         uval &= (1U << ext_size) - 1;
2057
2058       baseaddr = memaddr + 2;
2059       if (operand->type == OP_PCREL)
2060         {
2061           const struct mips_pcrel_operand *pcrel_op;
2062
2063           pcrel_op = (const struct mips_pcrel_operand *) operand;
2064           if (!pcrel_op->include_isa_bit && use_extend)
2065             baseaddr = memaddr - 2;
2066           else if (!pcrel_op->include_isa_bit)
2067             {
2068               bfd_byte buffer[2];
2069
2070               /* If this instruction is in the delay slot of a JAL/JALX
2071                  instruction, the base address is the address of the
2072                  JAL/JALX instruction.  If it is in the delay slot of
2073                  a JR/JALR instruction, the base address is the address
2074                  of the JR/JALR instruction.  This test is unreliable:
2075                  we have no way of knowing whether the previous word is
2076                  instruction or data.  */
2077               if (info->read_memory_func (memaddr - 4, buffer, 2, info) == 0
2078                   && (((info->endian == BFD_ENDIAN_BIG
2079                         ? bfd_getb16 (buffer)
2080                         : bfd_getl16 (buffer))
2081                        & 0xf800) == 0x1800))
2082                 baseaddr = memaddr - 4;
2083               else if (info->read_memory_func (memaddr - 2, buffer, 2,
2084                                                info) == 0
2085                        && (((info->endian == BFD_ENDIAN_BIG
2086                              ? bfd_getb16 (buffer)
2087                              : bfd_getl16 (buffer))
2088                             & 0xf89f) == 0xe800)
2089                        && (((info->endian == BFD_ENDIAN_BIG
2090                              ? bfd_getb16 (buffer)
2091                              : bfd_getl16 (buffer))
2092                             & 0x0060) != 0x0060))
2093                 baseaddr = memaddr - 2;
2094               else
2095                 baseaddr = memaddr;
2096             }
2097         }
2098
2099       print_insn_arg (info, state, opcode, operand, baseaddr + 1, uval);
2100       break;
2101     }
2102 }
2103
2104
2105 /* Check if the given address is the last word of a MIPS16 PLT entry.
2106    This word is data and depending on the value it may interfere with
2107    disassembly of further PLT entries.  We make use of the fact PLT
2108    symbols are marked BSF_SYNTHETIC.  */
2109 static bfd_boolean
2110 is_mips16_plt_tail (struct disassemble_info *info, bfd_vma addr)
2111 {
2112   if (info->symbols
2113       && info->symbols[0]
2114       && (info->symbols[0]->flags & BSF_SYNTHETIC)
2115       && addr == bfd_asymbol_value (info->symbols[0]) + 12)
2116     return TRUE;
2117
2118   return FALSE;
2119 }
2120
2121 /* Whether none, a 32-bit or a 16-bit instruction match has been done.  */
2122
2123 enum match_kind
2124 {
2125   MATCH_NONE,
2126   MATCH_FULL,
2127   MATCH_SHORT
2128 };
2129
2130 /* Disassemble mips16 instructions.  */
2131
2132 static int
2133 print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
2134 {
2135   const fprintf_ftype infprintf = info->fprintf_func;
2136   int status;
2137   bfd_byte buffer[4];
2138   const struct mips_opcode *op, *opend;
2139   struct mips_print_arg_state state;
2140   void *is = info->stream;
2141   bfd_boolean have_second;
2142   bfd_boolean extend_only;
2143   unsigned int second;
2144   unsigned int first;
2145   unsigned int full;
2146
2147   info->bytes_per_chunk = 2;
2148   info->display_endian = info->endian;
2149   info->insn_info_valid = 1;
2150   info->branch_delay_insns = 0;
2151   info->data_size = 0;
2152   info->target = 0;
2153   info->target2 = 0;
2154
2155 #define GET_OP(insn, field) \
2156   (((insn) >> MIPS16OP_SH_##field) & MIPS16OP_MASK_##field)
2157   /* Decode PLT entry's GOT slot address word.  */
2158   if (is_mips16_plt_tail (info, memaddr))
2159     {
2160       info->insn_type = dis_noninsn;
2161       status = (*info->read_memory_func) (memaddr, buffer, 4, info);
2162       if (status == 0)
2163         {
2164           unsigned int gotslot;
2165
2166           if (info->endian == BFD_ENDIAN_BIG)
2167             gotslot = bfd_getb32 (buffer);
2168           else
2169             gotslot = bfd_getl32 (buffer);
2170           infprintf (is, ".word\t0x%x", gotslot);
2171
2172           return 4;
2173         }
2174     }
2175   else
2176     {
2177       info->insn_type = dis_nonbranch;
2178       status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2179     }
2180   if (status != 0)
2181     {
2182       (*info->memory_error_func) (status, memaddr, info);
2183       return -1;
2184     }
2185
2186   extend_only = FALSE;
2187
2188   if (info->endian == BFD_ENDIAN_BIG)
2189     first = bfd_getb16 (buffer);
2190   else
2191     first = bfd_getl16 (buffer);
2192
2193   status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2194   if (status == 0)
2195     {
2196       have_second = TRUE;
2197       if (info->endian == BFD_ENDIAN_BIG)
2198         second = bfd_getb16 (buffer);
2199       else
2200         second = bfd_getl16 (buffer);
2201       full = (first << 16) | second;
2202     }
2203   else
2204     {
2205       have_second = FALSE;
2206       second = 0;
2207       full = first;
2208     }
2209
2210   /* FIXME: Should probably use a hash table on the major opcode here.  */
2211
2212   opend = mips16_opcodes + bfd_mips16_num_opcodes;
2213   for (op = mips16_opcodes; op < opend; op++)
2214     {
2215       enum match_kind match;
2216
2217       if (!opcode_is_member (op, mips_isa, mips_ase, mips_processor))
2218         continue;
2219
2220       if (op->pinfo == INSN_MACRO
2221           || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
2222         match = MATCH_NONE;
2223       else if (mips_opcode_32bit_p (op))
2224         {
2225           if (have_second
2226               && (full & op->mask) == op->match)
2227             match = MATCH_FULL;
2228           else
2229             match = MATCH_NONE;
2230         }
2231       else if ((first & op->mask) == op->match)
2232         {
2233           match = MATCH_SHORT;
2234           second = 0;
2235           full = first;
2236         }
2237       else if ((first & 0xf800) == 0xf000
2238                && have_second
2239                && !extend_only
2240                && (second & op->mask) == op->match)
2241         {
2242           if (op->pinfo2 & INSN2_SHORT_ONLY)
2243             {
2244               match = MATCH_NONE;
2245               extend_only = TRUE;
2246             }
2247           else
2248             match = MATCH_FULL;
2249         }
2250       else
2251         match = MATCH_NONE;
2252
2253       if (match != MATCH_NONE)
2254         {
2255           const char *s;
2256
2257           infprintf (is, "%s", op->name);
2258           if (op->args[0] != '\0')
2259             infprintf (is, "\t");
2260
2261           init_print_arg_state (&state);
2262           for (s = op->args; *s != '\0'; s++)
2263             {
2264               if (*s == ','
2265                   && s[1] == 'w'
2266                   && GET_OP (full, RX) == GET_OP (full, RY))
2267                 {
2268                   /* Skip the register and the comma.  */
2269                   ++s;
2270                   continue;
2271                 }
2272               if (*s == ','
2273                   && s[1] == 'v'
2274                   && GET_OP (full, RZ) == GET_OP (full, RX))
2275                 {
2276                   /* Skip the register and the comma.  */
2277                   ++s;
2278                   continue;
2279                 }
2280               if (s[0] == 'N'
2281                   && s[1] == ','
2282                   && s[2] == 'O'
2283                   && op->name[strlen (op->name) - 1] == '0')
2284                 {
2285                   /* Coprocessor register 0 with sel field.  */
2286                   const struct mips_cp0sel_name *n;
2287                   const struct mips_operand *operand;
2288                   unsigned int reg, sel;
2289
2290                   operand = decode_mips16_operand (*s, TRUE);
2291                   reg = mips_extract_operand (operand, (first << 16) | second);
2292                   s += 2;
2293                   operand = decode_mips16_operand (*s, TRUE);
2294                   sel = mips_extract_operand (operand, (first << 16) | second);
2295
2296                   /* CP0 register including 'sel' code for mftc0, to be
2297                      printed textually if known.  If not known, print both
2298                      CP0 register name and sel numerically since CP0 register
2299                      with sel 0 may have a name unrelated to register being
2300                      printed.  */
2301                   n = lookup_mips_cp0sel_name (mips_cp0sel_names,
2302                                                mips_cp0sel_names_len,
2303                                                reg, sel);
2304                   if (n != NULL)
2305                     infprintf (is, "%s", n->name);
2306                   else
2307                     infprintf (is, "$%d,%d", reg, sel);
2308                 }
2309               else
2310                 switch (match)
2311                   {
2312                     case MATCH_FULL:
2313                       print_mips16_insn_arg (info, &state, op, *s, memaddr + 2,
2314                                              second, TRUE, first, s[1] == '(');
2315                       break;
2316                     case MATCH_SHORT:
2317                       print_mips16_insn_arg (info, &state, op, *s, memaddr,
2318                                              first, FALSE, 0, s[1] == '(');
2319                       break;
2320                     case MATCH_NONE:    /* Stop the compiler complaining.  */
2321                       break;
2322                   }
2323             }
2324
2325           /* Figure out branch instruction type and delay slot information.  */
2326           if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2327             info->branch_delay_insns = 1;
2328           if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
2329               || (op->pinfo2 & INSN2_UNCOND_BRANCH) != 0)
2330             {
2331               if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2332                 info->insn_type = dis_jsr;
2333               else
2334                 info->insn_type = dis_branch;
2335             }
2336           else if ((op->pinfo2 & INSN2_COND_BRANCH) != 0)
2337             info->insn_type = dis_condbranch;
2338
2339           return match == MATCH_FULL ? 4 : 2;
2340         }
2341     }
2342 #undef GET_OP
2343
2344   infprintf (is, "0x%x", first);
2345   info->insn_type = dis_noninsn;
2346
2347   return 2;
2348 }
2349
2350 /* Disassemble microMIPS instructions.  */
2351
2352 static int
2353 print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
2354 {
2355   const fprintf_ftype infprintf = info->fprintf_func;
2356   const struct mips_opcode *op, *opend;
2357   void *is = info->stream;
2358   bfd_byte buffer[2];
2359   unsigned int higher;
2360   unsigned int length;
2361   int status;
2362   unsigned int insn;
2363
2364   info->bytes_per_chunk = 2;
2365   info->display_endian = info->endian;
2366   info->insn_info_valid = 1;
2367   info->branch_delay_insns = 0;
2368   info->data_size = 0;
2369   info->insn_type = dis_nonbranch;
2370   info->target = 0;
2371   info->target2 = 0;
2372
2373   status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2374   if (status != 0)
2375     {
2376       (*info->memory_error_func) (status, memaddr, info);
2377       return -1;
2378     }
2379
2380   length = 2;
2381
2382   if (info->endian == BFD_ENDIAN_BIG)
2383     insn = bfd_getb16 (buffer);
2384   else
2385     insn = bfd_getl16 (buffer);
2386
2387   if ((insn & 0x1c00) == 0x0000 || (insn & 0x1000) == 0x1000)
2388     {
2389       /* This is a 32-bit microMIPS instruction.  */
2390       higher = insn;
2391
2392       status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2393       if (status != 0)
2394         {
2395           infprintf (is, "micromips 0x%x", higher);
2396           (*info->memory_error_func) (status, memaddr + 2, info);
2397           return -1;
2398         }
2399
2400       if (info->endian == BFD_ENDIAN_BIG)
2401         insn = bfd_getb16 (buffer);
2402       else
2403         insn = bfd_getl16 (buffer);
2404
2405       insn = insn | (higher << 16);
2406
2407       length += 2;
2408     }
2409
2410   /* FIXME: Should probably use a hash table on the major opcode here.  */
2411
2412   opend = micromips_opcodes + bfd_micromips_num_opcodes;
2413   for (op = micromips_opcodes; op < opend; op++)
2414     {
2415       if (op->pinfo != INSN_MACRO
2416           && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
2417           && (insn & op->mask) == op->match
2418           && ((length == 2 && (op->mask & 0xffff0000) == 0)
2419               || (length == 4 && (op->mask & 0xffff0000) != 0)))
2420         {
2421           if (!validate_insn_args (op, decode_micromips_operand, insn))
2422             continue;
2423
2424           infprintf (is, "%s", op->name);
2425
2426           if (op->args[0])
2427             {
2428               infprintf (is, "\t");
2429               print_insn_args (info, op, decode_micromips_operand, insn,
2430                                memaddr + 1, length);
2431             }
2432
2433           /* Figure out instruction type and branch delay information.  */
2434           if ((op->pinfo
2435                & (INSN_UNCOND_BRANCH_DELAY | INSN_COND_BRANCH_DELAY)) != 0)
2436             info->branch_delay_insns = 1;
2437           if (((op->pinfo & INSN_UNCOND_BRANCH_DELAY)
2438                | (op->pinfo2 & INSN2_UNCOND_BRANCH)) != 0)
2439             {
2440               if ((op->pinfo & (INSN_WRITE_GPR_31 | INSN_WRITE_1)) != 0)
2441                 info->insn_type = dis_jsr;
2442               else
2443                 info->insn_type = dis_branch;
2444             }
2445           else if (((op->pinfo & INSN_COND_BRANCH_DELAY)
2446                     | (op->pinfo2 & INSN2_COND_BRANCH)) != 0)
2447             {
2448               if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2449                 info->insn_type = dis_condjsr;
2450               else
2451                 info->insn_type = dis_condbranch;
2452             }
2453           else if ((op->pinfo
2454                     & (INSN_STORE_MEMORY | INSN_LOAD_MEMORY)) != 0)
2455             info->insn_type = dis_dref;
2456
2457           return length;
2458         }
2459     }
2460
2461   infprintf (is, "0x%x", insn);
2462   info->insn_type = dis_noninsn;
2463
2464   return length;
2465 }
2466
2467 /* Return 1 if a symbol associated with the location being disassembled
2468    indicates a compressed mode, either MIPS16 or microMIPS, according to
2469    MICROMIPS_P.  We iterate over all the symbols at the address being
2470    considered assuming if at least one of them indicates code compression,
2471    then such code has been genuinely produced here (other symbols could
2472    have been derived from function symbols defined elsewhere or could
2473    define data).  Otherwise, return 0.  */
2474
2475 static bfd_boolean
2476 is_compressed_mode_p (struct disassemble_info *info, bfd_boolean micromips_p)
2477 {
2478   int i;
2479   int l;
2480
2481   for (i = info->symtab_pos, l = i + info->num_symbols; i < l; i++)
2482     if (((info->symtab[i])->flags & BSF_SYNTHETIC) != 0
2483         && ((!micromips_p
2484              && ELF_ST_IS_MIPS16 ((*info->symbols)->udata.i))
2485             || (micromips_p
2486                 && ELF_ST_IS_MICROMIPS ((*info->symbols)->udata.i))))
2487       return 1;
2488     else if (bfd_asymbol_flavour (info->symtab[i]) == bfd_target_elf_flavour
2489               && info->symtab[i]->section == info->section)
2490       {
2491         elf_symbol_type *symbol = (elf_symbol_type *) info->symtab[i];
2492         if ((!micromips_p
2493              && ELF_ST_IS_MIPS16 (symbol->internal_elf_sym.st_other))
2494             || (micromips_p
2495                 && ELF_ST_IS_MICROMIPS (symbol->internal_elf_sym.st_other)))
2496           return 1;
2497       }
2498
2499   return 0;
2500 }
2501
2502 /* In an environment where we do not know the symbol type of the
2503    instruction we are forced to assume that the low order bit of the
2504    instructions' address may mark it as a mips16 instruction.  If we
2505    are single stepping, or the pc is within the disassembled function,
2506    this works.  Otherwise, we need a clue.  Sometimes.  */
2507
2508 static int
2509 _print_insn_mips (bfd_vma memaddr,
2510                   struct disassemble_info *info,
2511                   enum bfd_endian endianness)
2512 {
2513   bfd_byte buffer[INSNLEN];
2514   int status;
2515
2516   set_default_mips_dis_options (info);
2517   parse_mips_dis_options (info->disassembler_options);
2518
2519   if (info->mach == bfd_mach_mips16)
2520     return print_insn_mips16 (memaddr, info);
2521   if (info->mach == bfd_mach_mips_micromips)
2522     return print_insn_micromips (memaddr, info);
2523
2524 #if 1
2525   /* FIXME: If odd address, this is CLEARLY a compressed instruction.  */
2526   /* Only a few tools will work this way.  */
2527   if (memaddr & 0x01)
2528     {
2529       if (micromips_ase)
2530         return print_insn_micromips (memaddr, info);
2531       else
2532         return print_insn_mips16 (memaddr, info);
2533     }
2534 #endif
2535
2536 #if SYMTAB_AVAILABLE
2537   if (is_compressed_mode_p (info, TRUE))
2538     return print_insn_micromips (memaddr, info);
2539   if (is_compressed_mode_p (info, FALSE))
2540     return print_insn_mips16 (memaddr, info);
2541 #endif
2542
2543   status = (*info->read_memory_func) (memaddr, buffer, INSNLEN, info);
2544   if (status == 0)
2545     {
2546       int insn;
2547
2548       if (endianness == BFD_ENDIAN_BIG)
2549         insn = bfd_getb32 (buffer);
2550       else
2551         insn = bfd_getl32 (buffer);
2552
2553       return print_insn_mips (memaddr, insn, info);
2554     }
2555   else
2556     {
2557       (*info->memory_error_func) (status, memaddr, info);
2558       return -1;
2559     }
2560 }
2561
2562 int
2563 print_insn_big_mips (bfd_vma memaddr, struct disassemble_info *info)
2564 {
2565   return _print_insn_mips (memaddr, info, BFD_ENDIAN_BIG);
2566 }
2567
2568 int
2569 print_insn_little_mips (bfd_vma memaddr, struct disassemble_info *info)
2570 {
2571   return _print_insn_mips (memaddr, info, BFD_ENDIAN_LITTLE);
2572 }
2573 \f
2574 /* Indices into option argument vector for options accepting an argument.
2575    Use MIPS_OPTION_ARG_NONE for options accepting no argument.  */
2576 typedef enum
2577 {
2578   MIPS_OPTION_ARG_NONE = -1,
2579   MIPS_OPTION_ARG_ABI,
2580   MIPS_OPTION_ARG_ARCH,
2581   MIPS_OPTION_ARG_SIZE
2582 } mips_option_arg_t;
2583
2584 /* Valid MIPS disassembler options.  */
2585 static struct
2586 {
2587   const char *name;
2588   const char *description;
2589   mips_option_arg_t arg;
2590 } mips_options[] =
2591 {
2592   { "no-aliases", N_("Use canonical instruction forms.\n"),
2593                   MIPS_OPTION_ARG_NONE },
2594   { "msa",        N_("Recognize MSA instructions.\n"),
2595                   MIPS_OPTION_ARG_NONE },
2596   { "virt",       N_("Recognize the virtualization ASE instructions.\n"),
2597                   MIPS_OPTION_ARG_NONE },
2598   { "xpa",        N_("Recognize the eXtended Physical Address (XPA) ASE\n\
2599                   instructions.\n"),
2600                   MIPS_OPTION_ARG_NONE },
2601   { "ginv",       N_("Recognize the Global INValidate (GINV) ASE "
2602                      "instructions.\n"),
2603                   MIPS_OPTION_ARG_NONE },
2604   { "loongson-mmi",
2605                   N_("Recognize the Loongson MultiMedia extensions "
2606                      "Instructions (MMI) ASE instructions.\n"),
2607                   MIPS_OPTION_ARG_NONE },
2608   { "loongson-cam",
2609                   N_("Recognize the Loongson Content Address Memory (CAM) "
2610                      " instructions.\n"),
2611                   MIPS_OPTION_ARG_NONE },
2612   { "loongson-ext",
2613                   N_("Recognize the Loongson EXTensions (EXT) "
2614                      " instructions.\n"),
2615                   MIPS_OPTION_ARG_NONE },
2616   { "gpr-names=", N_("Print GPR names according to specified ABI.\n\
2617                   Default: based on binary being disassembled.\n"),
2618                   MIPS_OPTION_ARG_ABI },
2619   { "fpr-names=", N_("Print FPR names according to specified ABI.\n\
2620                   Default: numeric.\n"),
2621                   MIPS_OPTION_ARG_ABI },
2622   { "cp0-names=", N_("Print CP0 register names according to specified "
2623                      "architecture.\n\
2624                   Default: based on binary being disassembled.\n"),
2625                   MIPS_OPTION_ARG_ARCH },
2626   { "hwr-names=", N_("Print HWR names according to specified architecture.\n\
2627                   Default: based on binary being disassembled.\n"),
2628                   MIPS_OPTION_ARG_ARCH },
2629   { "reg-names=", N_("Print GPR and FPR names according to specified ABI.\n"),
2630                   MIPS_OPTION_ARG_ABI },
2631   { "reg-names=", N_("Print CP0 register and HWR names according to "
2632                      "specified\n\
2633                   architecture."),
2634                   MIPS_OPTION_ARG_ARCH }
2635 };
2636
2637 /* Build the structure representing valid MIPS disassembler options.
2638    This is done dynamically for maintenance ease purpose; a static
2639    initializer would be unreadable.  */
2640
2641 const disasm_options_and_args_t *
2642 disassembler_options_mips (void)
2643 {
2644   static disasm_options_and_args_t *opts_and_args;
2645
2646   if (opts_and_args == NULL)
2647     {
2648       size_t num_options = ARRAY_SIZE (mips_options);
2649       size_t num_args = MIPS_OPTION_ARG_SIZE;
2650       disasm_option_arg_t *args;
2651       disasm_options_t *opts;
2652       size_t i;
2653       size_t j;
2654
2655       args = XNEWVEC (disasm_option_arg_t, num_args + 1);
2656
2657       args[MIPS_OPTION_ARG_ABI].name = "ABI";
2658       args[MIPS_OPTION_ARG_ABI].values
2659         = XNEWVEC (const char *, ARRAY_SIZE (mips_abi_choices) + 1);
2660       for (i = 0; i < ARRAY_SIZE (mips_abi_choices); i++)
2661         args[MIPS_OPTION_ARG_ABI].values[i] = mips_abi_choices[i].name;
2662       /* The array we return must be NULL terminated.  */
2663       args[MIPS_OPTION_ARG_ABI].values[i] = NULL;
2664
2665       args[MIPS_OPTION_ARG_ARCH].name = "ARCH";
2666       args[MIPS_OPTION_ARG_ARCH].values
2667         = XNEWVEC (const char *, ARRAY_SIZE (mips_arch_choices) + 1);
2668       for (i = 0, j = 0; i < ARRAY_SIZE (mips_arch_choices); i++)
2669         if (*mips_arch_choices[i].name != '\0')
2670           args[MIPS_OPTION_ARG_ARCH].values[j++] = mips_arch_choices[i].name;
2671       /* The array we return must be NULL terminated.  */
2672       args[MIPS_OPTION_ARG_ARCH].values[j] = NULL;
2673
2674       /* The array we return must be NULL terminated.  */
2675       args[MIPS_OPTION_ARG_SIZE].name = NULL;
2676       args[MIPS_OPTION_ARG_SIZE].values = NULL;
2677
2678       opts_and_args = XNEW (disasm_options_and_args_t);
2679       opts_and_args->args = args;
2680
2681       opts = &opts_and_args->options;
2682       opts->name = XNEWVEC (const char *, num_options + 1);
2683       opts->description = XNEWVEC (const char *, num_options + 1);
2684       opts->arg = XNEWVEC (const disasm_option_arg_t *, num_options + 1);
2685       for (i = 0; i < num_options; i++)
2686         {
2687           opts->name[i] = mips_options[i].name;
2688           opts->description[i] = _(mips_options[i].description);
2689           if (mips_options[i].arg != MIPS_OPTION_ARG_NONE)
2690             opts->arg[i] = &args[mips_options[i].arg];
2691           else
2692             opts->arg[i] = NULL;
2693         }
2694       /* The array we return must be NULL terminated.  */
2695       opts->name[i] = NULL;
2696       opts->description[i] = NULL;
2697       opts->arg[i] = NULL;
2698     }
2699
2700   return opts_and_args;
2701 }
2702
2703 void
2704 print_mips_disassembler_options (FILE *stream)
2705 {
2706   const disasm_options_and_args_t *opts_and_args;
2707   const disasm_option_arg_t *args;
2708   const disasm_options_t *opts;
2709   size_t max_len = 0;
2710   size_t i;
2711   size_t j;
2712
2713   opts_and_args = disassembler_options_mips ();
2714   opts = &opts_and_args->options;
2715   args = opts_and_args->args;
2716
2717   fprintf (stream, _("\n\
2718 The following MIPS specific disassembler options are supported for use\n\
2719 with the -M switch (multiple options should be separated by commas):\n\n"));
2720
2721   /* Compute the length of the longest option name.  */
2722   for (i = 0; opts->name[i] != NULL; i++)
2723     {
2724       size_t len = strlen (opts->name[i]);
2725
2726       if (opts->arg[i] != NULL)
2727         len += strlen (opts->arg[i]->name);
2728       if (max_len < len)
2729         max_len = len;
2730     }
2731
2732   for (i = 0, max_len++; opts->name[i] != NULL; i++)
2733     {
2734       fprintf (stream, "  %s", opts->name[i]);
2735       if (opts->arg[i] != NULL)
2736         fprintf (stream, "%s", opts->arg[i]->name);
2737       if (opts->description[i] != NULL)
2738         {
2739           size_t len = strlen (opts->name[i]);
2740
2741           if (opts->arg[i] != NULL)
2742             len += strlen (opts->arg[i]->name);
2743           fprintf (stream,
2744                    "%*c %s", (int) (max_len - len), ' ', opts->description[i]);
2745         }
2746       fprintf (stream, _("\n"));
2747     }
2748
2749   for (i = 0; args[i].name != NULL; i++)
2750     {
2751       fprintf (stream, _("\n\
2752   For the options above, the following values are supported for \"%s\":\n   "),
2753                args[i].name);
2754       for (j = 0; args[i].values[j] != NULL; j++)
2755         fprintf (stream, " %s", args[i].values[j]);
2756       fprintf (stream, _("\n"));
2757     }
2758
2759   fprintf (stream, _("\n"));
2760 }