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