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