MIPS16e2: Add MIPS16e2 ASE support
[external/binutils.git] / opcodes / mips-dis.c
1 /* Print mips instructions for GDB, the GNU debugger, or for objdump.
2    Copyright (C) 1989-2017 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 "dis-asm.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),
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),
606     mips_cp0_names_mips3264r2,
607     mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
608     mips_cp1_names_mips3264, mips_hwr_names_mips3264r2 },
609
610   { "sb1",      1, bfd_mach_mips_sb1, CPU_SB1,
611     ISA_MIPS64 | INSN_SB1,  ASE_MIPS3D,
612     mips_cp0_names_sb1,
613     mips_cp0sel_names_sb1, ARRAY_SIZE (mips_cp0sel_names_sb1),
614     mips_cp1_names_mips3264, mips_hwr_names_numeric },
615
616   { "loongson2e",   1, bfd_mach_mips_loongson_2e, CPU_LOONGSON_2E,
617     ISA_MIPS3 | INSN_LOONGSON_2E, 0, mips_cp0_names_numeric,
618     NULL, 0, mips_cp1_names_numeric, mips_hwr_names_numeric },
619
620   { "loongson2f",   1, bfd_mach_mips_loongson_2f, CPU_LOONGSON_2F,
621     ISA_MIPS3 | INSN_LOONGSON_2F, 0, mips_cp0_names_numeric,
622     NULL, 0, mips_cp1_names_numeric, mips_hwr_names_numeric },
623
624   { "loongson3a",   1, bfd_mach_mips_loongson_3a, CPU_LOONGSON_3A,
625     ISA_MIPS64R2 | INSN_LOONGSON_3A, 0, mips_cp0_names_numeric,
626     NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
627
628   { "octeon",   1, bfd_mach_mips_octeon, CPU_OCTEON,
629     ISA_MIPS64R2 | INSN_OCTEON, 0, mips_cp0_names_numeric, NULL, 0,
630     mips_cp1_names_mips3264, mips_hwr_names_numeric },
631
632   { "octeon+",   1, bfd_mach_mips_octeonp, CPU_OCTEONP,
633     ISA_MIPS64R2 | INSN_OCTEONP, 0, mips_cp0_names_numeric,
634     NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
635
636   { "octeon2",   1, bfd_mach_mips_octeon2, CPU_OCTEON2,
637     ISA_MIPS64R2 | INSN_OCTEON2, 0, mips_cp0_names_numeric,
638     NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
639
640   { "octeon3",   1, bfd_mach_mips_octeon3, CPU_OCTEON3,
641     ISA_MIPS64R5 | INSN_OCTEON3, ASE_VIRT | ASE_VIRT64,
642     mips_cp0_names_numeric,
643     NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
644
645   { "xlr", 1, bfd_mach_mips_xlr, CPU_XLR,
646     ISA_MIPS64 | INSN_XLR, 0,
647     mips_cp0_names_xlr,
648     mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
649     mips_cp1_names_mips3264, mips_hwr_names_numeric },
650
651   /* XLP is mostly like XLR, with the prominent exception it is being
652      MIPS64R2.  */
653   { "xlp", 1, bfd_mach_mips_xlr, CPU_XLR,
654     ISA_MIPS64R2 | INSN_XLR, 0,
655     mips_cp0_names_xlr,
656     mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
657     mips_cp1_names_mips3264, mips_hwr_names_numeric },
658
659   /* This entry, mips16, is here only for ISA/processor selection; do
660      not print its name.  */
661   { "",         1, bfd_mach_mips16, CPU_MIPS16, ISA_MIPS64,
662     ASE_MIPS16E2 | ASE_MIPS16E2_MT,
663     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
664     mips_hwr_names_numeric },
665 };
666
667 /* ISA and processor type to disassemble for, and register names to use.
668    set_default_mips_dis_options and parse_mips_dis_options fill in these
669    values.  */
670 static int mips_processor;
671 static int mips_isa;
672 static int mips_ase;
673 static int micromips_ase;
674 static const char * const *mips_gpr_names;
675 static const char * const *mips_fpr_names;
676 static const char * const *mips_cp0_names;
677 static const struct mips_cp0sel_name *mips_cp0sel_names;
678 static int mips_cp0sel_names_len;
679 static const char * const *mips_cp1_names;
680 static const char * const *mips_hwr_names;
681
682 /* Other options */
683 static int no_aliases;  /* If set disassemble as most general inst.  */
684 \f
685 static const struct mips_abi_choice *
686 choose_abi_by_name (const char *name, unsigned int namelen)
687 {
688   const struct mips_abi_choice *c;
689   unsigned int i;
690
691   for (i = 0, c = NULL; i < ARRAY_SIZE (mips_abi_choices) && c == NULL; i++)
692     if (strncmp (mips_abi_choices[i].name, name, namelen) == 0
693         && strlen (mips_abi_choices[i].name) == namelen)
694       c = &mips_abi_choices[i];
695
696   return c;
697 }
698
699 static const struct mips_arch_choice *
700 choose_arch_by_name (const char *name, unsigned int namelen)
701 {
702   const struct mips_arch_choice *c = NULL;
703   unsigned int i;
704
705   for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
706     if (strncmp (mips_arch_choices[i].name, name, namelen) == 0
707         && strlen (mips_arch_choices[i].name) == namelen)
708       c = &mips_arch_choices[i];
709
710   return c;
711 }
712
713 static const struct mips_arch_choice *
714 choose_arch_by_number (unsigned long mach)
715 {
716   static unsigned long hint_bfd_mach;
717   static const struct mips_arch_choice *hint_arch_choice;
718   const struct mips_arch_choice *c;
719   unsigned int i;
720
721   /* We optimize this because even if the user specifies no
722      flags, this will be done for every instruction!  */
723   if (hint_bfd_mach == mach
724       && hint_arch_choice != NULL
725       && hint_arch_choice->bfd_mach == hint_bfd_mach)
726     return hint_arch_choice;
727
728   for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
729     {
730       if (mips_arch_choices[i].bfd_mach_valid
731           && mips_arch_choices[i].bfd_mach == mach)
732         {
733           c = &mips_arch_choices[i];
734           hint_bfd_mach = mach;
735           hint_arch_choice = c;
736         }
737     }
738   return c;
739 }
740
741 /* Check if the object uses NewABI conventions.  */
742
743 static int
744 is_newabi (Elf_Internal_Ehdr *header)
745 {
746   /* There are no old-style ABIs which use 64-bit ELF.  */
747   if (header->e_ident[EI_CLASS] == ELFCLASS64)
748     return 1;
749
750   /* If a 32-bit ELF file, n32 is a new-style ABI.  */
751   if ((header->e_flags & EF_MIPS_ABI2) != 0)
752     return 1;
753
754   return 0;
755 }
756
757 /* Check if the object has microMIPS ASE code.  */
758
759 static int
760 is_micromips (Elf_Internal_Ehdr *header)
761 {
762   if ((header->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS) != 0)
763     return 1;
764
765   return 0;
766 }
767
768 /* Convert ASE flags from .MIPS.abiflags to internal values.  */
769
770 static unsigned long
771 mips_convert_abiflags_ases (unsigned long afl_ases)
772 {
773   unsigned long opcode_ases = 0;
774
775   if (afl_ases & AFL_ASE_DSP)
776     opcode_ases |= ASE_DSP;
777   if (afl_ases & AFL_ASE_DSPR2)
778     opcode_ases |= ASE_DSPR2;
779   if (afl_ases & AFL_ASE_EVA)
780     opcode_ases |= ASE_EVA;
781   if (afl_ases & AFL_ASE_MCU)
782     opcode_ases |= ASE_MCU;
783   if (afl_ases & AFL_ASE_MDMX)
784     opcode_ases |= ASE_MDMX;
785   if (afl_ases & AFL_ASE_MIPS3D)
786     opcode_ases |= ASE_MIPS3D;
787   if (afl_ases & AFL_ASE_MT)
788     opcode_ases |= ASE_MT;
789   if (afl_ases & AFL_ASE_SMARTMIPS)
790     opcode_ases |= ASE_SMARTMIPS;
791   if (afl_ases & AFL_ASE_VIRT)
792     opcode_ases |= ASE_VIRT;
793   if (afl_ases & AFL_ASE_MSA)
794     opcode_ases |= ASE_MSA;
795   if (afl_ases & AFL_ASE_XPA)
796     opcode_ases |= ASE_XPA;
797   if (afl_ases & AFL_ASE_DSPR3)
798     opcode_ases |= ASE_DSPR3;
799   if (afl_ases & AFL_ASE_MIPS16E2)
800     opcode_ases |= ASE_MIPS16E2;
801   if ((afl_ases & (AFL_ASE_MIPS16E2 | AFL_ASE_MT))
802       == (AFL_ASE_MIPS16E2 | AFL_ASE_MT))
803     opcode_ases |= ASE_MIPS16E2_MT;
804   return opcode_ases;
805 }
806
807 static void
808 set_default_mips_dis_options (struct disassemble_info *info)
809 {
810   const struct mips_arch_choice *chosen_arch;
811
812   /* Defaults: mipsIII/r3000 (?!), no microMIPS ASE (any compressed code
813      is MIPS16 ASE) (o)32-style ("oldabi") GPR names, and numeric FPR,
814      CP0 register, and HWR names.  */
815   mips_isa = ISA_MIPS3;
816   mips_processor = CPU_R3000;
817   micromips_ase = 0;
818   mips_ase = 0;
819   mips_gpr_names = mips_gpr_names_oldabi;
820   mips_fpr_names = mips_fpr_names_numeric;
821   mips_cp0_names = mips_cp0_names_numeric;
822   mips_cp0sel_names = NULL;
823   mips_cp0sel_names_len = 0;
824   mips_cp1_names = mips_cp1_names_numeric;
825   mips_hwr_names = mips_hwr_names_numeric;
826   no_aliases = 0;
827
828   /* Set ISA, architecture, and cp0 register names as best we can.  */
829 #if ! SYMTAB_AVAILABLE
830   /* This is running out on a target machine, not in a host tool.
831      FIXME: Where does mips_target_info come from?  */
832   target_processor = mips_target_info.processor;
833   mips_isa = mips_target_info.isa;
834   mips_ase = mips_target_info.ase;
835 #else
836   chosen_arch = choose_arch_by_number (info->mach);
837   if (chosen_arch != NULL)
838     {
839       mips_processor = chosen_arch->processor;
840       mips_isa = chosen_arch->isa;
841       mips_ase = chosen_arch->ase;
842       mips_cp0_names = chosen_arch->cp0_names;
843       mips_cp0sel_names = chosen_arch->cp0sel_names;
844       mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
845       mips_cp1_names = chosen_arch->cp1_names;
846       mips_hwr_names = chosen_arch->hwr_names;
847     }
848
849   /* Update settings according to the ELF file header flags.  */
850   if (info->flavour == bfd_target_elf_flavour && info->section != NULL)
851     {
852       struct bfd *abfd = info->section->owner;
853       Elf_Internal_Ehdr *header = elf_elfheader (abfd);
854       Elf_Internal_ABIFlags_v0 *abiflags = NULL;
855
856       /* We won't ever get here if !HAVE_BFD_MIPS_ELF_GET_ABIFLAGS,
857          because we won't then have a MIPS/ELF BFD, however we need
858          to guard against a link error in a `--enable-targets=...'
859          configuration with a 32-bit host where the MIPS target is
860          a secondary, or with MIPS/ECOFF configurations.  */
861 #ifdef HAVE_BFD_MIPS_ELF_GET_ABIFLAGS
862       abiflags = bfd_mips_elf_get_abiflags (abfd);
863 #endif
864       /* If an ELF "newabi" binary, use the n32/(n)64 GPR names.  */
865       if (is_newabi (header))
866         mips_gpr_names = mips_gpr_names_newabi;
867       /* If a microMIPS binary, then don't use MIPS16 bindings.  */
868       micromips_ase = is_micromips (header);
869       /* OR in any extra ASE flags set in ELF file structures.  */
870       if (abiflags)
871         mips_ase |= mips_convert_abiflags_ases (abiflags->ases);
872       else if (header->e_flags & EF_MIPS_ARCH_ASE_MDMX)
873         mips_ase |= ASE_MDMX;
874     }
875 #endif
876 }
877
878 static void
879 parse_mips_dis_option (const char *option, unsigned int len)
880 {
881   unsigned int i, optionlen, vallen;
882   const char *val;
883   const struct mips_abi_choice *chosen_abi;
884   const struct mips_arch_choice *chosen_arch;
885
886   /* Try to match options that are simple flags */
887   if (CONST_STRNEQ (option, "no-aliases"))
888     {
889       no_aliases = 1;
890       return;
891     }
892
893   if (CONST_STRNEQ (option, "msa"))
894     {
895       mips_ase |= ASE_MSA;
896       if ((mips_isa & INSN_ISA_MASK) == ISA_MIPS64R2
897            || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R3
898            || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R5
899            || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R6)
900           mips_ase |= ASE_MSA64;
901       return;
902     }
903
904   if (CONST_STRNEQ (option, "virt"))
905     {
906       mips_ase |= ASE_VIRT;
907       if (mips_isa & ISA_MIPS64R2
908           || mips_isa & ISA_MIPS64R3
909           || mips_isa & ISA_MIPS64R5
910           || mips_isa & ISA_MIPS64R6)
911         mips_ase |= ASE_VIRT64;
912       return;
913     }
914
915   if (CONST_STRNEQ (option, "xpa"))
916     {
917       mips_ase |= ASE_XPA;
918       return;
919     }
920
921
922   /* Look for the = that delimits the end of the option name.  */
923   for (i = 0; i < len; i++)
924     if (option[i] == '=')
925       break;
926
927   if (i == 0)           /* Invalid option: no name before '='.  */
928     return;
929   if (i == len)         /* Invalid option: no '='.  */
930     return;
931   if (i == (len - 1))   /* Invalid option: no value after '='.  */
932     return;
933
934   optionlen = i;
935   val = option + (optionlen + 1);
936   vallen = len - (optionlen + 1);
937
938   if (strncmp ("gpr-names", option, optionlen) == 0
939       && strlen ("gpr-names") == optionlen)
940     {
941       chosen_abi = choose_abi_by_name (val, vallen);
942       if (chosen_abi != NULL)
943         mips_gpr_names = chosen_abi->gpr_names;
944       return;
945     }
946
947   if (strncmp ("fpr-names", option, optionlen) == 0
948       && strlen ("fpr-names") == optionlen)
949     {
950       chosen_abi = choose_abi_by_name (val, vallen);
951       if (chosen_abi != NULL)
952         mips_fpr_names = chosen_abi->fpr_names;
953       return;
954     }
955
956   if (strncmp ("cp0-names", option, optionlen) == 0
957       && strlen ("cp0-names") == optionlen)
958     {
959       chosen_arch = choose_arch_by_name (val, vallen);
960       if (chosen_arch != NULL)
961         {
962           mips_cp0_names = chosen_arch->cp0_names;
963           mips_cp0sel_names = chosen_arch->cp0sel_names;
964           mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
965         }
966       return;
967     }
968
969   if (strncmp ("cp1-names", option, optionlen) == 0
970       && strlen ("cp1-names") == optionlen)
971     {
972       chosen_arch = choose_arch_by_name (val, vallen);
973       if (chosen_arch != NULL)
974         mips_cp1_names = chosen_arch->cp1_names;
975       return;
976     }
977
978   if (strncmp ("hwr-names", option, optionlen) == 0
979       && strlen ("hwr-names") == optionlen)
980     {
981       chosen_arch = choose_arch_by_name (val, vallen);
982       if (chosen_arch != NULL)
983         mips_hwr_names = chosen_arch->hwr_names;
984       return;
985     }
986
987   if (strncmp ("reg-names", option, optionlen) == 0
988       && strlen ("reg-names") == optionlen)
989     {
990       /* We check both ABI and ARCH here unconditionally, so
991          that "numeric" will do the desirable thing: select
992          numeric register names for all registers.  Other than
993          that, a given name probably won't match both.  */
994       chosen_abi = choose_abi_by_name (val, vallen);
995       if (chosen_abi != NULL)
996         {
997           mips_gpr_names = chosen_abi->gpr_names;
998           mips_fpr_names = chosen_abi->fpr_names;
999         }
1000       chosen_arch = choose_arch_by_name (val, vallen);
1001       if (chosen_arch != NULL)
1002         {
1003           mips_cp0_names = chosen_arch->cp0_names;
1004           mips_cp0sel_names = chosen_arch->cp0sel_names;
1005           mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
1006           mips_cp1_names = chosen_arch->cp1_names;
1007           mips_hwr_names = chosen_arch->hwr_names;
1008         }
1009       return;
1010     }
1011
1012   /* Invalid option.  */
1013 }
1014
1015 static void
1016 parse_mips_dis_options (const char *options)
1017 {
1018   const char *option_end;
1019
1020   if (options == NULL)
1021     return;
1022
1023   while (*options != '\0')
1024     {
1025       /* Skip empty options.  */
1026       if (*options == ',')
1027         {
1028           options++;
1029           continue;
1030         }
1031
1032       /* We know that *options is neither NUL or a comma.  */
1033       option_end = options + 1;
1034       while (*option_end != ',' && *option_end != '\0')
1035         option_end++;
1036
1037       parse_mips_dis_option (options, option_end - options);
1038
1039       /* Go on to the next one.  If option_end points to a comma, it
1040          will be skipped above.  */
1041       options = option_end;
1042     }
1043 }
1044
1045 static const struct mips_cp0sel_name *
1046 lookup_mips_cp0sel_name (const struct mips_cp0sel_name *names,
1047                          unsigned int len,
1048                          unsigned int cp0reg,
1049                          unsigned int sel)
1050 {
1051   unsigned int i;
1052
1053   for (i = 0; i < len; i++)
1054     if (names[i].cp0reg == cp0reg && names[i].sel == sel)
1055       return &names[i];
1056   return NULL;
1057 }
1058
1059 /* Print register REGNO, of type TYPE, for instruction OPCODE.  */
1060
1061 static void
1062 print_reg (struct disassemble_info *info, const struct mips_opcode *opcode,
1063            enum mips_reg_operand_type type, int regno)
1064 {
1065   switch (type)
1066     {
1067     case OP_REG_GP:
1068       info->fprintf_func (info->stream, "%s", mips_gpr_names[regno]);
1069       break;
1070
1071     case OP_REG_FP:
1072       info->fprintf_func (info->stream, "%s", mips_fpr_names[regno]);
1073       break;
1074
1075     case OP_REG_CCC:
1076       if (opcode->pinfo & (FP_D | FP_S))
1077         info->fprintf_func (info->stream, "$fcc%d", regno);
1078       else
1079         info->fprintf_func (info->stream, "$cc%d", regno);
1080       break;
1081
1082     case OP_REG_VEC:
1083       if (opcode->membership & INSN_5400)
1084         info->fprintf_func (info->stream, "$f%d", regno);
1085       else
1086         info->fprintf_func (info->stream, "$v%d", regno);
1087       break;
1088
1089     case OP_REG_ACC:
1090       info->fprintf_func (info->stream, "$ac%d", regno);
1091       break;
1092
1093     case OP_REG_COPRO:
1094       if (opcode->name[strlen (opcode->name) - 1] == '0')
1095         info->fprintf_func (info->stream, "%s", mips_cp0_names[regno]);
1096       else if (opcode->name[strlen (opcode->name) - 1] == '1')
1097         info->fprintf_func (info->stream, "%s", mips_cp1_names[regno]);
1098       else
1099         info->fprintf_func (info->stream, "$%d", regno);
1100       break;
1101
1102     case OP_REG_HW:
1103       info->fprintf_func (info->stream, "%s", mips_hwr_names[regno]);
1104       break;
1105
1106     case OP_REG_VF:
1107       info->fprintf_func (info->stream, "$vf%d", regno);
1108       break;
1109
1110     case OP_REG_VI:
1111       info->fprintf_func (info->stream, "$vi%d", regno);
1112       break;
1113
1114     case OP_REG_R5900_I:
1115       info->fprintf_func (info->stream, "$I");
1116       break;
1117
1118     case OP_REG_R5900_Q:
1119       info->fprintf_func (info->stream, "$Q");
1120       break;
1121
1122     case OP_REG_R5900_R:
1123       info->fprintf_func (info->stream, "$R");
1124       break;
1125
1126     case OP_REG_R5900_ACC:
1127       info->fprintf_func (info->stream, "$ACC");
1128       break;
1129
1130     case OP_REG_MSA:
1131       info->fprintf_func (info->stream, "$w%d", regno);
1132       break;
1133
1134     case OP_REG_MSA_CTRL:
1135       info->fprintf_func (info->stream, "%s", msa_control_names[regno]);
1136       break;
1137
1138     }
1139 }
1140 \f
1141 /* Used to track the state carried over from previous operands in
1142    an instruction.  */
1143 struct mips_print_arg_state {
1144   /* The value of the last OP_INT seen.  We only use this for OP_MSB,
1145      where the value is known to be unsigned and small.  */
1146   unsigned int last_int;
1147
1148   /* The type and number of the last OP_REG seen.  We only use this for
1149      OP_REPEAT_DEST_REG and OP_REPEAT_PREV_REG.  */
1150   enum mips_reg_operand_type last_reg_type;
1151   unsigned int last_regno;
1152   unsigned int dest_regno;
1153   unsigned int seen_dest;
1154 };
1155
1156 /* Initialize STATE for the start of an instruction.  */
1157
1158 static inline void
1159 init_print_arg_state (struct mips_print_arg_state *state)
1160 {
1161   memset (state, 0, sizeof (*state));
1162 }
1163
1164 /* Print OP_VU0_SUFFIX or OP_VU0_MATCH_SUFFIX operand OPERAND,
1165    whose value is given by UVAL.  */
1166
1167 static void
1168 print_vu0_channel (struct disassemble_info *info,
1169                    const struct mips_operand *operand, unsigned int uval)
1170 {
1171   if (operand->size == 4)
1172     info->fprintf_func (info->stream, "%s%s%s%s",
1173                         uval & 8 ? "x" : "",
1174                         uval & 4 ? "y" : "",
1175                         uval & 2 ? "z" : "",
1176                         uval & 1 ? "w" : "");
1177   else if (operand->size == 2)
1178     info->fprintf_func (info->stream, "%c", "xyzw"[uval]);
1179   else
1180     abort ();
1181 }
1182
1183 /* Record information about a register operand.  */
1184
1185 static void
1186 mips_seen_register (struct mips_print_arg_state *state,
1187                     unsigned int regno,
1188                     enum mips_reg_operand_type reg_type)
1189 {
1190   state->last_reg_type = reg_type;
1191   state->last_regno = regno;
1192
1193   if (!state->seen_dest)
1194     {
1195       state->seen_dest = 1;
1196       state->dest_regno = regno;
1197     }
1198 }
1199
1200 /* Print operand OPERAND of OPCODE, using STATE to track inter-operand state.
1201    UVAL is the encoding of the operand (shifted into bit 0) and BASE_PC is
1202    the base address for OP_PCREL operands.  */
1203
1204 static void
1205 print_insn_arg (struct disassemble_info *info,
1206                 struct mips_print_arg_state *state,
1207                 const struct mips_opcode *opcode,
1208                 const struct mips_operand *operand,
1209                 bfd_vma base_pc,
1210                 unsigned int uval)
1211 {
1212   const fprintf_ftype infprintf = info->fprintf_func;
1213   void *is = info->stream;
1214
1215   switch (operand->type)
1216     {
1217     case OP_INT:
1218       {
1219         const struct mips_int_operand *int_op;
1220
1221         int_op = (const struct mips_int_operand *) operand;
1222         uval = mips_decode_int_operand (int_op, uval);
1223         state->last_int = uval;
1224         if (int_op->print_hex)
1225           infprintf (is, "0x%x", uval);
1226         else
1227           infprintf (is, "%d", uval);
1228       }
1229       break;
1230
1231     case OP_MAPPED_INT:
1232       {
1233         const struct mips_mapped_int_operand *mint_op;
1234
1235         mint_op = (const struct mips_mapped_int_operand *) operand;
1236         uval = mint_op->int_map[uval];
1237         state->last_int = uval;
1238         if (mint_op->print_hex)
1239           infprintf (is, "0x%x", uval);
1240         else
1241           infprintf (is, "%d", uval);
1242       }
1243       break;
1244
1245     case OP_MSB:
1246       {
1247         const struct mips_msb_operand *msb_op;
1248
1249         msb_op = (const struct mips_msb_operand *) operand;
1250         uval += msb_op->bias;
1251         if (msb_op->add_lsb)
1252           uval -= state->last_int;
1253         infprintf (is, "0x%x", uval);
1254       }
1255       break;
1256
1257     case OP_REG:
1258     case OP_OPTIONAL_REG:
1259       {
1260         const struct mips_reg_operand *reg_op;
1261
1262         reg_op = (const struct mips_reg_operand *) operand;
1263         uval = mips_decode_reg_operand (reg_op, uval);
1264         print_reg (info, opcode, reg_op->reg_type, uval);
1265
1266         mips_seen_register (state, uval, reg_op->reg_type);
1267       }
1268       break;
1269
1270     case OP_REG_PAIR:
1271       {
1272         const struct mips_reg_pair_operand *pair_op;
1273
1274         pair_op = (const struct mips_reg_pair_operand *) operand;
1275         print_reg (info, opcode, pair_op->reg_type,
1276                    pair_op->reg1_map[uval]);
1277         infprintf (is, ",");
1278         print_reg (info, opcode, pair_op->reg_type,
1279                    pair_op->reg2_map[uval]);
1280       }
1281       break;
1282
1283     case OP_PCREL:
1284       {
1285         const struct mips_pcrel_operand *pcrel_op;
1286
1287         pcrel_op = (const struct mips_pcrel_operand *) operand;
1288         info->target = mips_decode_pcrel_operand (pcrel_op, base_pc, uval);
1289
1290         /* For jumps and branches clear the ISA bit except for
1291            the GDB disassembler.  */
1292         if (pcrel_op->include_isa_bit
1293             && info->flavour != bfd_target_unknown_flavour)
1294           info->target &= -2;
1295
1296         (*info->print_address_func) (info->target, info);
1297       }
1298       break;
1299
1300     case OP_PERF_REG:
1301       infprintf (is, "%d", uval);
1302       break;
1303
1304     case OP_ADDIUSP_INT:
1305       {
1306         int sval;
1307
1308         sval = mips_signed_operand (operand, uval) * 4;
1309         if (sval >= -8 && sval < 8)
1310           sval ^= 0x400;
1311         infprintf (is, "%d", sval);
1312         break;
1313       }
1314
1315     case OP_CLO_CLZ_DEST:
1316       {
1317         unsigned int reg1, reg2;
1318
1319         reg1 = uval & 31;
1320         reg2 = uval >> 5;
1321         /* If one is zero use the other.  */
1322         if (reg1 == reg2 || reg2 == 0)
1323           infprintf (is, "%s", mips_gpr_names[reg1]);
1324         else if (reg1 == 0)
1325           infprintf (is, "%s", mips_gpr_names[reg2]);
1326         else
1327           /* Bogus, result depends on processor.  */
1328           infprintf (is, "%s or %s", mips_gpr_names[reg1],
1329                      mips_gpr_names[reg2]);
1330       }
1331       break;
1332
1333     case OP_SAME_RS_RT:
1334     case OP_CHECK_PREV:
1335     case OP_NON_ZERO_REG:
1336       {
1337         print_reg (info, opcode, OP_REG_GP, uval & 31);
1338         mips_seen_register (state, uval, OP_REG_GP);
1339       }
1340       break;
1341
1342     case OP_LWM_SWM_LIST:
1343       if (operand->size == 2)
1344         {
1345           if (uval == 0)
1346             infprintf (is, "%s,%s",
1347                        mips_gpr_names[16],
1348                        mips_gpr_names[31]);
1349           else
1350             infprintf (is, "%s-%s,%s",
1351                        mips_gpr_names[16],
1352                        mips_gpr_names[16 + uval],
1353                        mips_gpr_names[31]);
1354         }
1355       else
1356         {
1357           int s_reg_encode;
1358
1359           s_reg_encode = uval & 0xf;
1360           if (s_reg_encode != 0)
1361             {
1362               if (s_reg_encode == 1)
1363                 infprintf (is, "%s", mips_gpr_names[16]);
1364               else if (s_reg_encode < 9)
1365                 infprintf (is, "%s-%s",
1366                            mips_gpr_names[16],
1367                            mips_gpr_names[15 + s_reg_encode]);
1368               else if (s_reg_encode == 9)
1369                 infprintf (is, "%s-%s,%s",
1370                            mips_gpr_names[16],
1371                            mips_gpr_names[23],
1372                            mips_gpr_names[30]);
1373               else
1374                 infprintf (is, "UNKNOWN");
1375             }
1376
1377           if (uval & 0x10) /* For ra.  */
1378             {
1379               if (s_reg_encode == 0)
1380                 infprintf (is, "%s", mips_gpr_names[31]);
1381               else
1382                 infprintf (is, ",%s", mips_gpr_names[31]);
1383             }
1384         }
1385       break;
1386
1387     case OP_ENTRY_EXIT_LIST:
1388       {
1389         const char *sep;
1390         unsigned int amask, smask;
1391
1392         sep = "";
1393         amask = (uval >> 3) & 7;
1394         if (amask > 0 && amask < 5)
1395           {
1396             infprintf (is, "%s", mips_gpr_names[4]);
1397             if (amask > 1)
1398               infprintf (is, "-%s", mips_gpr_names[amask + 3]);
1399             sep = ",";
1400           }
1401
1402         smask = (uval >> 1) & 3;
1403         if (smask == 3)
1404           {
1405             infprintf (is, "%s??", sep);
1406             sep = ",";
1407           }
1408         else if (smask > 0)
1409           {
1410             infprintf (is, "%s%s", sep, mips_gpr_names[16]);
1411             if (smask > 1)
1412               infprintf (is, "-%s", mips_gpr_names[smask + 15]);
1413             sep = ",";
1414           }
1415
1416         if (uval & 1)
1417           {
1418             infprintf (is, "%s%s", sep, mips_gpr_names[31]);
1419             sep = ",";
1420           }
1421
1422         if (amask == 5 || amask == 6)
1423           {
1424             infprintf (is, "%s%s", sep, mips_fpr_names[0]);
1425             if (amask == 6)
1426               infprintf (is, "-%s", mips_fpr_names[1]);
1427           }
1428       }
1429       break;
1430
1431     case OP_SAVE_RESTORE_LIST:
1432       /* Should be handled by the caller due to extend behavior.  */
1433       abort ();
1434
1435     case OP_MDMX_IMM_REG:
1436       {
1437         unsigned int vsel;
1438
1439         vsel = uval >> 5;
1440         uval &= 31;
1441         if ((vsel & 0x10) == 0)
1442           {
1443             int fmt;
1444
1445             vsel &= 0x0f;
1446             for (fmt = 0; fmt < 3; fmt++, vsel >>= 1)
1447               if ((vsel & 1) == 0)
1448                 break;
1449             print_reg (info, opcode, OP_REG_VEC, uval);
1450             infprintf (is, "[%d]", vsel >> 1);
1451           }
1452         else if ((vsel & 0x08) == 0)
1453           print_reg (info, opcode, OP_REG_VEC, uval);
1454         else
1455           infprintf (is, "0x%x", uval);
1456       }
1457       break;
1458
1459     case OP_REPEAT_PREV_REG:
1460       print_reg (info, opcode, state->last_reg_type, state->last_regno);
1461       break;
1462
1463     case OP_REPEAT_DEST_REG:
1464       print_reg (info, opcode, state->last_reg_type, state->dest_regno);
1465       break;
1466
1467     case OP_PC:
1468       infprintf (is, "$pc");
1469       break;
1470
1471     case OP_REG28:
1472       print_reg (info, opcode, OP_REG_GP, 28);
1473       break;
1474
1475     case OP_VU0_SUFFIX:
1476     case OP_VU0_MATCH_SUFFIX:
1477       print_vu0_channel (info, operand, uval);
1478       break;
1479
1480     case OP_IMM_INDEX:
1481       infprintf (is, "[%d]", uval);
1482       break;
1483
1484     case OP_REG_INDEX:
1485       infprintf (is, "[");
1486       print_reg (info, opcode, OP_REG_GP, uval);
1487       infprintf (is, "]");
1488       break;
1489     }
1490 }
1491
1492 /* Validate the arguments for INSN, which is described by OPCODE.
1493    Use DECODE_OPERAND to get the encoding of each operand.  */
1494
1495 static bfd_boolean
1496 validate_insn_args (const struct mips_opcode *opcode,
1497                     const struct mips_operand *(*decode_operand) (const char *),
1498                     unsigned int insn)
1499 {
1500   struct mips_print_arg_state state;
1501   const struct mips_operand *operand;
1502   const char *s;
1503   unsigned int uval;
1504
1505   init_print_arg_state (&state);
1506   for (s = opcode->args; *s; ++s)
1507     {
1508       switch (*s)
1509         {
1510         case ',':
1511         case '(':
1512         case ')':
1513           break;
1514
1515         case '#':
1516           ++s;
1517           break;
1518
1519         default:
1520           operand = decode_operand (s);
1521
1522           if (operand)
1523             {
1524               uval = mips_extract_operand (operand, insn);
1525               switch (operand->type)
1526                 {
1527                 case OP_REG:
1528                 case OP_OPTIONAL_REG:
1529                   {
1530                     const struct mips_reg_operand *reg_op;
1531
1532                     reg_op = (const struct mips_reg_operand *) operand;
1533                     uval = mips_decode_reg_operand (reg_op, uval);
1534                     mips_seen_register (&state, uval, reg_op->reg_type);
1535                   }
1536                 break;
1537
1538                 case OP_SAME_RS_RT:
1539                   {
1540                     unsigned int reg1, reg2;
1541
1542                     reg1 = uval & 31;
1543                     reg2 = uval >> 5;
1544
1545                     if (reg1 != reg2 || reg1 == 0)
1546                       return FALSE;
1547                   }
1548                 break;
1549
1550                 case OP_CHECK_PREV:
1551                   {
1552                     const struct mips_check_prev_operand *prev_op;
1553
1554                     prev_op = (const struct mips_check_prev_operand *) operand;
1555
1556                     if (!prev_op->zero_ok && uval == 0)
1557                       return FALSE;
1558
1559                     if (((prev_op->less_than_ok && uval < state.last_regno)
1560                         || (prev_op->greater_than_ok && uval > state.last_regno)
1561                         || (prev_op->equal_ok && uval == state.last_regno)))
1562                       break;
1563
1564                     return FALSE;
1565                   }
1566
1567                 case OP_NON_ZERO_REG:
1568                   {
1569                     if (uval == 0)
1570                       return FALSE;
1571                   }
1572                 break;
1573
1574                 case OP_INT:
1575                 case OP_MAPPED_INT:
1576                 case OP_MSB:
1577                 case OP_REG_PAIR:
1578                 case OP_PCREL:
1579                 case OP_PERF_REG:
1580                 case OP_ADDIUSP_INT:
1581                 case OP_CLO_CLZ_DEST:
1582                 case OP_LWM_SWM_LIST:
1583                 case OP_ENTRY_EXIT_LIST:
1584                 case OP_MDMX_IMM_REG:
1585                 case OP_REPEAT_PREV_REG:
1586                 case OP_REPEAT_DEST_REG:
1587                 case OP_PC:
1588                 case OP_REG28:
1589                 case OP_VU0_SUFFIX:
1590                 case OP_VU0_MATCH_SUFFIX:
1591                 case OP_IMM_INDEX:
1592                 case OP_REG_INDEX:
1593                   break;
1594
1595                 case OP_SAVE_RESTORE_LIST:
1596                 /* Should be handled by the caller due to extend behavior.  */
1597                   abort ();
1598                 }
1599             }
1600           if (*s == 'm' || *s == '+' || *s == '-')
1601             ++s;
1602         }
1603     }
1604   return TRUE;
1605 }
1606
1607 /* Print the arguments for INSN, which is described by OPCODE.
1608    Use DECODE_OPERAND to get the encoding of each operand.  Use BASE_PC
1609    as the base of OP_PCREL operands, adjusting by LENGTH if the OP_PCREL
1610    operand is for a branch or jump.  */
1611
1612 static void
1613 print_insn_args (struct disassemble_info *info,
1614                  const struct mips_opcode *opcode,
1615                  const struct mips_operand *(*decode_operand) (const char *),
1616                  unsigned int insn, bfd_vma insn_pc, unsigned int length)
1617 {
1618   const fprintf_ftype infprintf = info->fprintf_func;
1619   void *is = info->stream;
1620   struct mips_print_arg_state state;
1621   const struct mips_operand *operand;
1622   const char *s;
1623
1624   init_print_arg_state (&state);
1625   for (s = opcode->args; *s; ++s)
1626     {
1627       switch (*s)
1628         {
1629         case ',':
1630         case '(':
1631         case ')':
1632           infprintf (is, "%c", *s);
1633           break;
1634
1635         case '#':
1636           ++s;
1637           infprintf (is, "%c%c", *s, *s);
1638           break;
1639
1640         default:
1641           operand = decode_operand (s);
1642           if (!operand)
1643             {
1644               /* xgettext:c-format */
1645               infprintf (is,
1646                          _("# internal error, undefined operand in `%s %s'"),
1647                          opcode->name, opcode->args);
1648               return;
1649             }
1650           if (operand->type == OP_REG
1651               && s[1] == ','
1652               && s[2] == 'H'
1653               && opcode->name[strlen (opcode->name) - 1] == '0')
1654             {
1655               /* Coprocessor register 0 with sel field.  */
1656               const struct mips_cp0sel_name *n;
1657               unsigned int reg, sel;
1658
1659               reg = mips_extract_operand (operand, insn);
1660               s += 2;
1661               operand = decode_operand (s);
1662               sel = mips_extract_operand (operand, insn);
1663
1664               /* CP0 register including 'sel' code for mftc0, to be
1665                  printed textually if known.  If not known, print both
1666                  CP0 register name and sel numerically since CP0 register
1667                  with sel 0 may have a name unrelated to register being
1668                  printed.  */
1669               n = lookup_mips_cp0sel_name (mips_cp0sel_names,
1670                                            mips_cp0sel_names_len,
1671                                            reg, sel);
1672               if (n != NULL)
1673                 infprintf (is, "%s", n->name);
1674               else
1675                 infprintf (is, "$%d,%d", reg, sel);
1676             }
1677           else
1678             {
1679               bfd_vma base_pc = insn_pc;
1680
1681               /* Adjust the PC relative base so that branch/jump insns use
1682                  the following PC as the base but genuinely PC relative
1683                  operands use the current PC.  */
1684               if (operand->type == OP_PCREL)
1685                 {
1686                   const struct mips_pcrel_operand *pcrel_op;
1687
1688                   pcrel_op = (const struct mips_pcrel_operand *) operand;
1689                   /* The include_isa_bit flag is sufficient to distinguish
1690                      branch/jump from other PC relative operands.  */
1691                   if (pcrel_op->include_isa_bit)
1692                     base_pc += length;
1693                 }
1694
1695               print_insn_arg (info, &state, opcode, operand, base_pc,
1696                               mips_extract_operand (operand, insn));
1697             }
1698           if (*s == 'm' || *s == '+' || *s == '-')
1699             ++s;
1700           break;
1701         }
1702     }
1703 }
1704 \f
1705 /* Print the mips instruction at address MEMADDR in debugged memory,
1706    on using INFO.  Returns length of the instruction, in bytes, which is
1707    always INSNLEN.  BIGENDIAN must be 1 if this is big-endian code, 0 if
1708    this is little-endian code.  */
1709
1710 static int
1711 print_insn_mips (bfd_vma memaddr,
1712                  int word,
1713                  struct disassemble_info *info)
1714 {
1715 #define GET_OP(insn, field)                     \
1716   (((insn) >> OP_SH_##field) & OP_MASK_##field)
1717   static const struct mips_opcode *mips_hash[OP_MASK_OP + 1];
1718   const fprintf_ftype infprintf = info->fprintf_func;
1719   const struct mips_opcode *op;
1720   static bfd_boolean init = 0;
1721   void *is = info->stream;
1722
1723   /* Build a hash table to shorten the search time.  */
1724   if (! init)
1725     {
1726       unsigned int i;
1727
1728       for (i = 0; i <= OP_MASK_OP; i++)
1729         {
1730           for (op = mips_opcodes; op < &mips_opcodes[NUMOPCODES]; op++)
1731             {
1732               if (op->pinfo == INSN_MACRO
1733                   || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
1734                 continue;
1735               if (i == GET_OP (op->match, OP))
1736                 {
1737                   mips_hash[i] = op;
1738                   break;
1739                 }
1740             }
1741         }
1742
1743       init = 1;
1744     }
1745
1746   info->bytes_per_chunk = INSNLEN;
1747   info->display_endian = info->endian;
1748   info->insn_info_valid = 1;
1749   info->branch_delay_insns = 0;
1750   info->data_size = 0;
1751   info->insn_type = dis_nonbranch;
1752   info->target = 0;
1753   info->target2 = 0;
1754
1755   op = mips_hash[GET_OP (word, OP)];
1756   if (op != NULL)
1757     {
1758       for (; op < &mips_opcodes[NUMOPCODES]; op++)
1759         {
1760           if (op->pinfo != INSN_MACRO
1761               && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
1762               && (word & op->mask) == op->match)
1763             {
1764               /* We always disassemble the jalx instruction, except for MIPS r6.  */
1765               if (!opcode_is_member (op, mips_isa, mips_ase, mips_processor)
1766                  && (strcmp (op->name, "jalx")
1767                      || (mips_isa & INSN_ISA_MASK) == ISA_MIPS32R6
1768                      || (mips_isa & INSN_ISA_MASK) == ISA_MIPS64R6))
1769                 continue;
1770
1771               /* Figure out instruction type and branch delay information.  */
1772               if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
1773                 {
1774                   if ((op->pinfo & (INSN_WRITE_GPR_31 | INSN_WRITE_1)) != 0)
1775                     info->insn_type = dis_jsr;
1776                   else
1777                     info->insn_type = dis_branch;
1778                   info->branch_delay_insns = 1;
1779                 }
1780               else if ((op->pinfo & (INSN_COND_BRANCH_DELAY
1781                                      | INSN_COND_BRANCH_LIKELY)) != 0)
1782                 {
1783                   if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
1784                     info->insn_type = dis_condjsr;
1785                   else
1786                     info->insn_type = dis_condbranch;
1787                   info->branch_delay_insns = 1;
1788                 }
1789               else if ((op->pinfo & (INSN_STORE_MEMORY
1790                                      | INSN_LOAD_MEMORY)) != 0)
1791                 info->insn_type = dis_dref;
1792
1793               if (!validate_insn_args (op, decode_mips_operand, word))
1794                 continue;
1795
1796               infprintf (is, "%s", op->name);
1797               if (op->pinfo2 & INSN2_VU0_CHANNEL_SUFFIX)
1798                 {
1799                   unsigned int uval;
1800
1801                   infprintf (is, ".");
1802                   uval = mips_extract_operand (&mips_vu0_channel_mask, word);
1803                   print_vu0_channel (info, &mips_vu0_channel_mask, uval);
1804                 }
1805
1806               if (op->args[0])
1807                 {
1808                   infprintf (is, "\t");
1809                   print_insn_args (info, op, decode_mips_operand, word,
1810                                    memaddr, 4);
1811                 }
1812
1813               return INSNLEN;
1814             }
1815         }
1816     }
1817 #undef GET_OP
1818
1819   /* Handle undefined instructions.  */
1820   info->insn_type = dis_noninsn;
1821   infprintf (is, "0x%x", word);
1822   return INSNLEN;
1823 }
1824 \f
1825 /* Disassemble an operand for a mips16 instruction.  */
1826
1827 static void
1828 print_mips16_insn_arg (struct disassemble_info *info,
1829                        struct mips_print_arg_state *state,
1830                        const struct mips_opcode *opcode,
1831                        char type, bfd_vma memaddr,
1832                        unsigned insn, bfd_boolean use_extend,
1833                        unsigned extend, bfd_boolean is_offset)
1834 {
1835   const fprintf_ftype infprintf = info->fprintf_func;
1836   void *is = info->stream;
1837   const struct mips_operand *operand, *ext_operand;
1838   unsigned short ext_size;
1839   unsigned int uval;
1840   bfd_vma baseaddr;
1841
1842   if (!use_extend)
1843     extend = 0;
1844
1845   switch (type)
1846     {
1847     case ',':
1848     case '(':
1849     case ')':
1850       infprintf (is, "%c", type);
1851       break;
1852
1853     default:
1854       operand = decode_mips16_operand (type, FALSE);
1855       if (!operand)
1856         {
1857           /* xgettext:c-format */
1858           infprintf (is, _("# internal error, undefined operand in `%s %s'"),
1859                      opcode->name, opcode->args);
1860           return;
1861         }
1862
1863       if (operand->type == OP_SAVE_RESTORE_LIST)
1864         {
1865           /* Handle this case here because of the complex interaction
1866              with the EXTEND opcode.  */
1867           unsigned int amask, nargs, nstatics, nsreg, smask, frame_size, i, j;
1868           const char *sep;
1869
1870           amask = extend & 0xf;
1871           if (amask == MIPS16_ALL_ARGS)
1872             {
1873               nargs = 4;
1874               nstatics = 0;
1875             }
1876           else if (amask == MIPS16_ALL_STATICS)
1877             {
1878               nargs = 0;
1879               nstatics = 4;
1880             }
1881           else
1882             {
1883               nargs = amask >> 2;
1884               nstatics = amask & 3;
1885             }
1886
1887           sep = "";
1888           if (nargs > 0)
1889             {
1890               infprintf (is, "%s", mips_gpr_names[4]);
1891               if (nargs > 1)
1892                 infprintf (is, "-%s", mips_gpr_names[4 + nargs - 1]);
1893               sep = ",";
1894             }
1895
1896           frame_size = ((extend & 0xf0) | (insn & 0x0f)) * 8;
1897           if (frame_size == 0 && !use_extend)
1898             frame_size = 128;
1899           infprintf (is, "%s%d", sep, frame_size);
1900
1901           if (insn & 0x40)              /* $ra */
1902             infprintf (is, ",%s", mips_gpr_names[31]);
1903
1904           nsreg = (extend >> 8) & 0x7;
1905           smask = 0;
1906           if (insn & 0x20)              /* $s0 */
1907             smask |= 1 << 0;
1908           if (insn & 0x10)              /* $s1 */
1909             smask |= 1 << 1;
1910           if (nsreg > 0)                /* $s2-$s8 */
1911             smask |= ((1 << nsreg) - 1) << 2;
1912
1913           for (i = 0; i < 9; i++)
1914             if (smask & (1 << i))
1915               {
1916                 infprintf (is, ",%s", mips_gpr_names[i == 8 ? 30 : (16 + i)]);
1917                 /* Skip over string of set bits.  */
1918                 for (j = i; smask & (2 << j); j++)
1919                   continue;
1920                 if (j > i)
1921                   infprintf (is, "-%s", mips_gpr_names[j == 8 ? 30 : (16 + j)]);
1922                 i = j + 1;
1923               }
1924           /* Statics $ax - $a3.  */
1925           if (nstatics == 1)
1926             infprintf (is, ",%s", mips_gpr_names[7]);
1927           else if (nstatics > 0)
1928             infprintf (is, ",%s-%s",
1929                        mips_gpr_names[7 - nstatics + 1],
1930                        mips_gpr_names[7]);
1931           break;
1932         }
1933
1934       if (is_offset && operand->type == OP_INT)
1935         {
1936           const struct mips_int_operand *int_op;
1937
1938           int_op = (const struct mips_int_operand *) operand;
1939           info->insn_type = dis_dref;
1940           info->data_size = 1 << int_op->shift;
1941         }
1942
1943       ext_size = 0;
1944       if (use_extend)
1945         {
1946           ext_operand = decode_mips16_operand (type, TRUE);
1947           if (ext_operand != operand
1948               || (operand->type == OP_INT && operand->lsb == 0
1949                   && mips_opcode_32bit_p (opcode)))
1950             {
1951               ext_size = ext_operand->size;
1952               operand = ext_operand;
1953             }
1954         }
1955       if (operand->size == 26)
1956         uval = ((extend & 0x1f) << 21) | ((extend & 0x3e0) << 11) | insn;
1957       else if (ext_size == 16 || ext_size == 9)
1958         uval = ((extend & 0x1f) << 11) | (extend & 0x7e0) | (insn & 0x1f);
1959       else if (ext_size == 15)
1960         uval = ((extend & 0xf) << 11) | (extend & 0x7f0) | (insn & 0xf);
1961       else if (ext_size == 6)
1962         uval = ((extend >> 6) & 0x1f) | (extend & 0x20);
1963       else
1964         uval = mips_extract_operand (operand, (extend << 16) | insn);
1965       if (ext_size == 9)
1966         uval &= (1U << ext_size) - 1;
1967
1968       baseaddr = memaddr + 2;
1969       if (operand->type == OP_PCREL)
1970         {
1971           const struct mips_pcrel_operand *pcrel_op;
1972
1973           pcrel_op = (const struct mips_pcrel_operand *) operand;
1974           if (!pcrel_op->include_isa_bit && use_extend)
1975             baseaddr = memaddr - 2;
1976           else if (!pcrel_op->include_isa_bit)
1977             {
1978               bfd_byte buffer[2];
1979
1980               /* If this instruction is in the delay slot of a JAL/JALX
1981                  instruction, the base address is the address of the
1982                  JAL/JALX instruction.  If it is in the delay slot of
1983                  a JR/JALR instruction, the base address is the address
1984                  of the JR/JALR instruction.  This test is unreliable:
1985                  we have no way of knowing whether the previous word is
1986                  instruction or data.  */
1987               if (info->read_memory_func (memaddr - 4, buffer, 2, info) == 0
1988                   && (((info->endian == BFD_ENDIAN_BIG
1989                         ? bfd_getb16 (buffer)
1990                         : bfd_getl16 (buffer))
1991                        & 0xf800) == 0x1800))
1992                 baseaddr = memaddr - 4;
1993               else if (info->read_memory_func (memaddr - 2, buffer, 2,
1994                                                info) == 0
1995                        && (((info->endian == BFD_ENDIAN_BIG
1996                              ? bfd_getb16 (buffer)
1997                              : bfd_getl16 (buffer))
1998                             & 0xf89f) == 0xe800)
1999                        && (((info->endian == BFD_ENDIAN_BIG
2000                              ? bfd_getb16 (buffer)
2001                              : bfd_getl16 (buffer))
2002                             & 0x0060) != 0x0060))
2003                 baseaddr = memaddr - 2;
2004               else
2005                 baseaddr = memaddr;
2006             }
2007         }
2008
2009       print_insn_arg (info, state, opcode, operand, baseaddr + 1, uval);
2010       break;
2011     }
2012 }
2013
2014
2015 /* Check if the given address is the last word of a MIPS16 PLT entry.
2016    This word is data and depending on the value it may interfere with
2017    disassembly of further PLT entries.  We make use of the fact PLT
2018    symbols are marked BSF_SYNTHETIC.  */
2019 static bfd_boolean
2020 is_mips16_plt_tail (struct disassemble_info *info, bfd_vma addr)
2021 {
2022   if (info->symbols
2023       && info->symbols[0]
2024       && (info->symbols[0]->flags & BSF_SYNTHETIC)
2025       && addr == bfd_asymbol_value (info->symbols[0]) + 12)
2026     return TRUE;
2027
2028   return FALSE;
2029 }
2030
2031 /* Whether none, a 32-bit or a 16-bit instruction match has been done.  */
2032
2033 enum match_kind
2034 {
2035   MATCH_NONE,
2036   MATCH_FULL,
2037   MATCH_SHORT
2038 };
2039
2040 /* Disassemble mips16 instructions.  */
2041
2042 static int
2043 print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
2044 {
2045   const fprintf_ftype infprintf = info->fprintf_func;
2046   int status;
2047   bfd_byte buffer[4];
2048   const struct mips_opcode *op, *opend;
2049   struct mips_print_arg_state state;
2050   void *is = info->stream;
2051   bfd_boolean have_second;
2052   bfd_boolean extend_only;
2053   unsigned int second;
2054   unsigned int first;
2055   unsigned int full;
2056
2057   info->bytes_per_chunk = 2;
2058   info->display_endian = info->endian;
2059   info->insn_info_valid = 1;
2060   info->branch_delay_insns = 0;
2061   info->data_size = 0;
2062   info->target = 0;
2063   info->target2 = 0;
2064
2065 #define GET_OP(insn, field) \
2066   (((insn) >> MIPS16OP_SH_##field) & MIPS16OP_MASK_##field)
2067   /* Decode PLT entry's GOT slot address word.  */
2068   if (is_mips16_plt_tail (info, memaddr))
2069     {
2070       info->insn_type = dis_noninsn;
2071       status = (*info->read_memory_func) (memaddr, buffer, 4, info);
2072       if (status == 0)
2073         {
2074           unsigned int gotslot;
2075
2076           if (info->endian == BFD_ENDIAN_BIG)
2077             gotslot = bfd_getb32 (buffer);
2078           else
2079             gotslot = bfd_getl32 (buffer);
2080           infprintf (is, ".word\t0x%x", gotslot);
2081
2082           return 4;
2083         }
2084     }
2085   else
2086     {
2087       info->insn_type = dis_nonbranch;
2088       status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2089     }
2090   if (status != 0)
2091     {
2092       (*info->memory_error_func) (status, memaddr, info);
2093       return -1;
2094     }
2095
2096   extend_only = FALSE;
2097
2098   if (info->endian == BFD_ENDIAN_BIG)
2099     first = bfd_getb16 (buffer);
2100   else
2101     first = bfd_getl16 (buffer);
2102
2103   status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2104   if (status == 0)
2105     {
2106       have_second = TRUE;
2107       if (info->endian == BFD_ENDIAN_BIG)
2108         second = bfd_getb16 (buffer);
2109       else
2110         second = bfd_getl16 (buffer);
2111       full = (first << 16) | second;
2112     }
2113   else
2114     {
2115       have_second = FALSE;
2116       second = 0;
2117       full = first;
2118     }
2119
2120   /* FIXME: Should probably use a hash table on the major opcode here.  */
2121
2122   opend = mips16_opcodes + bfd_mips16_num_opcodes;
2123   for (op = mips16_opcodes; op < opend; op++)
2124     {
2125       enum match_kind match;
2126
2127       if (!opcode_is_member (op, mips_isa, mips_ase, mips_processor))
2128         continue;
2129
2130       if (op->pinfo == INSN_MACRO
2131           || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
2132         match = MATCH_NONE;
2133       else if (mips_opcode_32bit_p (op))
2134         {
2135           if (have_second
2136               && (full & op->mask) == op->match)
2137             match = MATCH_FULL;
2138           else
2139             match = MATCH_NONE;
2140         }
2141       else if ((first & op->mask) == op->match)
2142         {
2143           match = MATCH_SHORT;
2144           second = 0;
2145           full = first;
2146         }
2147       else if ((first & 0xf800) == 0xf000
2148                && have_second
2149                && !extend_only
2150                && (second & op->mask) == op->match)
2151         {
2152           if (op->pinfo2 & INSN2_SHORT_ONLY)
2153             {
2154               match = MATCH_NONE;
2155               extend_only = TRUE;
2156             }
2157           else
2158             match = MATCH_FULL;
2159         }
2160       else
2161         match = MATCH_NONE;
2162
2163       if (match != MATCH_NONE)
2164         {
2165           const char *s;
2166
2167           infprintf (is, "%s", op->name);
2168           if (op->args[0] != '\0')
2169             infprintf (is, "\t");
2170
2171           init_print_arg_state (&state);
2172           for (s = op->args; *s != '\0'; s++)
2173             {
2174               if (*s == ','
2175                   && s[1] == 'w'
2176                   && GET_OP (full, RX) == GET_OP (full, RY))
2177                 {
2178                   /* Skip the register and the comma.  */
2179                   ++s;
2180                   continue;
2181                 }
2182               if (*s == ','
2183                   && s[1] == 'v'
2184                   && GET_OP (full, RZ) == GET_OP (full, RX))
2185                 {
2186                   /* Skip the register and the comma.  */
2187                   ++s;
2188                   continue;
2189                 }
2190               if (s[0] == 'N'
2191                   && s[1] == ','
2192                   && s[2] == 'O'
2193                   && op->name[strlen (op->name) - 1] == '0')
2194                 {
2195                   /* Coprocessor register 0 with sel field.  */
2196                   const struct mips_cp0sel_name *n;
2197                   const struct mips_operand *operand;
2198                   unsigned int reg, sel;
2199
2200                   operand = decode_mips16_operand (*s, TRUE);
2201                   reg = mips_extract_operand (operand, (first << 16) | second);
2202                   s += 2;
2203                   operand = decode_mips16_operand (*s, TRUE);
2204                   sel = mips_extract_operand (operand, (first << 16) | second);
2205
2206                   /* CP0 register including 'sel' code for mftc0, to be
2207                      printed textually if known.  If not known, print both
2208                      CP0 register name and sel numerically since CP0 register
2209                      with sel 0 may have a name unrelated to register being
2210                      printed.  */
2211                   n = lookup_mips_cp0sel_name (mips_cp0sel_names,
2212                                                mips_cp0sel_names_len,
2213                                                reg, sel);
2214                   if (n != NULL)
2215                     infprintf (is, "%s", n->name);
2216                   else
2217                     infprintf (is, "$%d,%d", reg, sel);
2218                 }
2219               else
2220                 switch (match)
2221                   {
2222                     case MATCH_FULL:
2223                       print_mips16_insn_arg (info, &state, op, *s, memaddr + 2,
2224                                              second, TRUE, first, s[1] == '(');
2225                       break;
2226                     case MATCH_SHORT:
2227                       print_mips16_insn_arg (info, &state, op, *s, memaddr,
2228                                              first, FALSE, 0, s[1] == '(');
2229                       break;
2230                     case MATCH_NONE:    /* Stop the compiler complaining.  */
2231                       break;
2232                   }
2233             }
2234
2235           /* Figure out branch instruction type and delay slot information.  */
2236           if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2237             info->branch_delay_insns = 1;
2238           if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
2239               || (op->pinfo2 & INSN2_UNCOND_BRANCH) != 0)
2240             {
2241               if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2242                 info->insn_type = dis_jsr;
2243               else
2244                 info->insn_type = dis_branch;
2245             }
2246           else if ((op->pinfo2 & INSN2_COND_BRANCH) != 0)
2247             info->insn_type = dis_condbranch;
2248
2249           return match == MATCH_FULL ? 4 : 2;
2250         }
2251     }
2252 #undef GET_OP
2253
2254   infprintf (is, "0x%x", first);
2255   info->insn_type = dis_noninsn;
2256
2257   return 2;
2258 }
2259
2260 /* Disassemble microMIPS instructions.  */
2261
2262 static int
2263 print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
2264 {
2265   const fprintf_ftype infprintf = info->fprintf_func;
2266   const struct mips_opcode *op, *opend;
2267   void *is = info->stream;
2268   bfd_byte buffer[2];
2269   unsigned int higher;
2270   unsigned int length;
2271   int status;
2272   unsigned int insn;
2273
2274   info->bytes_per_chunk = 2;
2275   info->display_endian = info->endian;
2276   info->insn_info_valid = 1;
2277   info->branch_delay_insns = 0;
2278   info->data_size = 0;
2279   info->insn_type = dis_nonbranch;
2280   info->target = 0;
2281   info->target2 = 0;
2282
2283   status = (*info->read_memory_func) (memaddr, buffer, 2, info);
2284   if (status != 0)
2285     {
2286       (*info->memory_error_func) (status, memaddr, info);
2287       return -1;
2288     }
2289
2290   length = 2;
2291
2292   if (info->endian == BFD_ENDIAN_BIG)
2293     insn = bfd_getb16 (buffer);
2294   else
2295     insn = bfd_getl16 (buffer);
2296
2297   if ((insn & 0x1c00) == 0x0000 || (insn & 0x1000) == 0x1000)
2298     {
2299       /* This is a 32-bit microMIPS instruction.  */
2300       higher = insn;
2301
2302       status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
2303       if (status != 0)
2304         {
2305           infprintf (is, "micromips 0x%x", higher);
2306           (*info->memory_error_func) (status, memaddr + 2, info);
2307           return -1;
2308         }
2309
2310       if (info->endian == BFD_ENDIAN_BIG)
2311         insn = bfd_getb16 (buffer);
2312       else
2313         insn = bfd_getl16 (buffer);
2314
2315       insn = insn | (higher << 16);
2316
2317       length += 2;
2318     }
2319
2320   /* FIXME: Should probably use a hash table on the major opcode here.  */
2321
2322   opend = micromips_opcodes + bfd_micromips_num_opcodes;
2323   for (op = micromips_opcodes; op < opend; op++)
2324     {
2325       if (op->pinfo != INSN_MACRO
2326           && !(no_aliases && (op->pinfo2 & INSN2_ALIAS))
2327           && (insn & op->mask) == op->match
2328           && ((length == 2 && (op->mask & 0xffff0000) == 0)
2329               || (length == 4 && (op->mask & 0xffff0000) != 0)))
2330         {
2331           if (!validate_insn_args (op, decode_micromips_operand, insn))
2332             continue;
2333
2334           infprintf (is, "%s", op->name);
2335
2336           if (op->args[0])
2337             {
2338               infprintf (is, "\t");
2339               print_insn_args (info, op, decode_micromips_operand, insn,
2340                                memaddr + 1, length);
2341             }
2342
2343           /* Figure out instruction type and branch delay information.  */
2344           if ((op->pinfo
2345                & (INSN_UNCOND_BRANCH_DELAY | INSN_COND_BRANCH_DELAY)) != 0)
2346             info->branch_delay_insns = 1;
2347           if (((op->pinfo & INSN_UNCOND_BRANCH_DELAY)
2348                | (op->pinfo2 & INSN2_UNCOND_BRANCH)) != 0)
2349             {
2350               if ((op->pinfo & (INSN_WRITE_GPR_31 | INSN_WRITE_1)) != 0)
2351                 info->insn_type = dis_jsr;
2352               else
2353                 info->insn_type = dis_branch;
2354             }
2355           else if (((op->pinfo & INSN_COND_BRANCH_DELAY)
2356                     | (op->pinfo2 & INSN2_COND_BRANCH)) != 0)
2357             {
2358               if ((op->pinfo & INSN_WRITE_GPR_31) != 0)
2359                 info->insn_type = dis_condjsr;
2360               else
2361                 info->insn_type = dis_condbranch;
2362             }
2363           else if ((op->pinfo
2364                     & (INSN_STORE_MEMORY | INSN_LOAD_MEMORY)) != 0)
2365             info->insn_type = dis_dref;
2366
2367           return length;
2368         }
2369     }
2370
2371   infprintf (is, "0x%x", insn);
2372   info->insn_type = dis_noninsn;
2373
2374   return length;
2375 }
2376
2377 /* Return 1 if a symbol associated with the location being disassembled
2378    indicates a compressed mode, either MIPS16 or microMIPS, according to
2379    MICROMIPS_P.  We iterate over all the symbols at the address being
2380    considered assuming if at least one of them indicates code compression,
2381    then such code has been genuinely produced here (other symbols could
2382    have been derived from function symbols defined elsewhere or could
2383    define data).  Otherwise, return 0.  */
2384
2385 static bfd_boolean
2386 is_compressed_mode_p (struct disassemble_info *info, bfd_boolean micromips_p)
2387 {
2388   int i;
2389   int l;
2390
2391   for (i = info->symtab_pos, l = i + info->num_symbols; i < l; i++)
2392     if (((info->symtab[i])->flags & BSF_SYNTHETIC) != 0
2393         && ((!micromips_p
2394              && ELF_ST_IS_MIPS16 ((*info->symbols)->udata.i))
2395             || (micromips_p
2396                 && ELF_ST_IS_MICROMIPS ((*info->symbols)->udata.i))))
2397       return 1;
2398     else if (bfd_asymbol_flavour (info->symtab[i]) == bfd_target_elf_flavour
2399               && info->symtab[i]->section == info->section)
2400       {
2401         elf_symbol_type *symbol = (elf_symbol_type *) info->symtab[i];
2402         if ((!micromips_p
2403              && ELF_ST_IS_MIPS16 (symbol->internal_elf_sym.st_other))
2404             || (micromips_p
2405                 && ELF_ST_IS_MICROMIPS (symbol->internal_elf_sym.st_other)))
2406           return 1;
2407       }
2408
2409   return 0;
2410 }
2411
2412 /* In an environment where we do not know the symbol type of the
2413    instruction we are forced to assume that the low order bit of the
2414    instructions' address may mark it as a mips16 instruction.  If we
2415    are single stepping, or the pc is within the disassembled function,
2416    this works.  Otherwise, we need a clue.  Sometimes.  */
2417
2418 static int
2419 _print_insn_mips (bfd_vma memaddr,
2420                   struct disassemble_info *info,
2421                   enum bfd_endian endianness)
2422 {
2423   bfd_byte buffer[INSNLEN];
2424   int status;
2425
2426   set_default_mips_dis_options (info);
2427   parse_mips_dis_options (info->disassembler_options);
2428
2429   if (info->mach == bfd_mach_mips16)
2430     return print_insn_mips16 (memaddr, info);
2431   if (info->mach == bfd_mach_mips_micromips)
2432     return print_insn_micromips (memaddr, info);
2433
2434 #if 1
2435   /* FIXME: If odd address, this is CLEARLY a compressed instruction.  */
2436   /* Only a few tools will work this way.  */
2437   if (memaddr & 0x01)
2438     {
2439       if (micromips_ase)
2440         return print_insn_micromips (memaddr, info);
2441       else
2442         return print_insn_mips16 (memaddr, info);
2443     }
2444 #endif
2445
2446 #if SYMTAB_AVAILABLE
2447   if (is_compressed_mode_p (info, TRUE))
2448     return print_insn_micromips (memaddr, info);
2449   if (is_compressed_mode_p (info, FALSE))
2450     return print_insn_mips16 (memaddr, info);
2451 #endif
2452
2453   status = (*info->read_memory_func) (memaddr, buffer, INSNLEN, info);
2454   if (status == 0)
2455     {
2456       int insn;
2457
2458       if (endianness == BFD_ENDIAN_BIG)
2459         insn = bfd_getb32 (buffer);
2460       else
2461         insn = bfd_getl32 (buffer);
2462
2463       return print_insn_mips (memaddr, insn, info);
2464     }
2465   else
2466     {
2467       (*info->memory_error_func) (status, memaddr, info);
2468       return -1;
2469     }
2470 }
2471
2472 int
2473 print_insn_big_mips (bfd_vma memaddr, struct disassemble_info *info)
2474 {
2475   return _print_insn_mips (memaddr, info, BFD_ENDIAN_BIG);
2476 }
2477
2478 int
2479 print_insn_little_mips (bfd_vma memaddr, struct disassemble_info *info)
2480 {
2481   return _print_insn_mips (memaddr, info, BFD_ENDIAN_LITTLE);
2482 }
2483 \f
2484 void
2485 print_mips_disassembler_options (FILE *stream)
2486 {
2487   unsigned int i;
2488
2489   fprintf (stream, _("\n\
2490 The following MIPS specific disassembler options are supported for use\n\
2491 with the -M switch (multiple options should be separated by commas):\n"));
2492
2493   fprintf (stream, _("\n\
2494   no-aliases               Use canonical instruction forms.\n"));
2495
2496   fprintf (stream, _("\n\
2497   msa                      Recognize MSA instructions.\n"));
2498
2499   fprintf (stream, _("\n\
2500   virt                     Recognize the virtualization ASE instructions.\n"));
2501
2502   fprintf (stream, _("\n\
2503   xpa                      Recognize the eXtended Physical Address (XPA)\n\
2504                            ASE instructions.\n"));
2505
2506   fprintf (stream, _("\n\
2507   gpr-names=ABI            Print GPR names according to specified ABI.\n\
2508                            Default: based on binary being disassembled.\n"));
2509
2510   fprintf (stream, _("\n\
2511   fpr-names=ABI            Print FPR names according to specified ABI.\n\
2512                            Default: numeric.\n"));
2513
2514   fprintf (stream, _("\n\
2515   cp0-names=ARCH           Print CP0 register names according to\n\
2516                            specified architecture.\n\
2517                            Default: based on binary being disassembled.\n"));
2518
2519   fprintf (stream, _("\n\
2520   hwr-names=ARCH           Print HWR names according to specified \n\
2521                            architecture.\n\
2522                            Default: based on binary being disassembled.\n"));
2523
2524   fprintf (stream, _("\n\
2525   reg-names=ABI            Print GPR and FPR names according to\n\
2526                            specified ABI.\n"));
2527
2528   fprintf (stream, _("\n\
2529   reg-names=ARCH           Print CP0 register and HWR names according to\n\
2530                            specified architecture.\n"));
2531
2532   fprintf (stream, _("\n\
2533   For the options above, the following values are supported for \"ABI\":\n\
2534    "));
2535   for (i = 0; i < ARRAY_SIZE (mips_abi_choices); i++)
2536     fprintf (stream, " %s", mips_abi_choices[i].name);
2537   fprintf (stream, _("\n"));
2538
2539   fprintf (stream, _("\n\
2540   For the options above, The following values are supported for \"ARCH\":\n\
2541    "));
2542   for (i = 0; i < ARRAY_SIZE (mips_arch_choices); i++)
2543     if (*mips_arch_choices[i].name != '\0')
2544       fprintf (stream, " %s", mips_arch_choices[i].name);
2545   fprintf (stream, _("\n"));
2546
2547   fprintf (stream, _("\n"));
2548 }