1 /* Print mips instructions for GDB, the GNU debugger, or for objdump.
2 Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 Free Software Foundation, Inc.
5 Contributed by Nobuyuki Hikichi(hikichi@sra.co.jp).
7 This file is part of GDB, GAS, and the GNU binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
25 #include "opcode/mips.h"
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. */
33 #if !defined(EMBEDDED_ENV)
34 #define SYMTAB_AVAILABLE 1
39 /* Mips instructions are at maximum this many bytes long. */
42 static int _print_insn_mips
43 PARAMS ((bfd_vma
, struct disassemble_info
*, enum bfd_endian
));
44 static int print_insn_mips
45 PARAMS ((bfd_vma
, unsigned long int, struct disassemble_info
*));
46 static void print_insn_arg
47 PARAMS ((const char *, unsigned long, bfd_vma
, struct disassemble_info
*));
48 static void mips_isa_type
49 PARAMS ((int, int *, int *));
50 static int print_insn_mips16
51 PARAMS ((bfd_vma
, struct disassemble_info
*));
53 PARAMS ((Elf_Internal_Ehdr
*));
54 static void print_mips16_insn_arg
55 PARAMS ((int, const struct mips_opcode
*, int, boolean
, int, bfd_vma
,
56 struct disassemble_info
*));
58 /* FIXME: These should be shared with gdb somehow. */
60 /* The mips16 register names. */
61 static const char * const mips16_reg_names
[] = {
62 "s0", "s1", "v0", "v1", "a0", "a1", "a2", "a3"
65 static const char * const mips32_reg_names
[] = {
66 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
67 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
68 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
69 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
70 "sr", "lo", "hi", "bad", "cause", "pc",
71 "fv0", "$f1", "fv1", "$f3", "ft0", "$f5", "ft1", "$f7",
72 "ft2", "$f9", "ft3", "$f11", "fa0", "$f13", "fa1", "$f15",
73 "ft4", "f17", "ft5", "f19", "fs0", "f21", "fs1", "f23",
74 "fs2", "$f25", "fs3", "$f27", "fs4", "$f29", "fs5", "$f31",
75 "fsr", "fir", "fp", "inx", "rand", "tlblo", "ctxt", "tlbhi",
79 static const char * const mips64_reg_names
[] = {
80 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
81 "a4", "a5", "a6", "a7", "t0", "t1", "t2", "t3",
82 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
83 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
84 "sr", "lo", "hi", "bad", "cause", "pc",
85 "fv0", "$f1", "fv1", "$f3", "ft0", "ft1", "ft2", "ft3",
86 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3",
87 "fa4", "fa5", "fa6", "fa7", "ft8", "ft9", "ft10", "ft11",
88 "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7",
89 "fsr", "fir", "fp", "inx", "rand", "tlblo", "ctxt", "tlbhi",
93 /* Scalar register names. _print_insn_mips() decides which register name
95 static const char * const *reg_names
= NULL
;
97 /* Print insn arguments for 32/64-bit code. */
100 print_insn_arg (d
, l
, pc
, info
)
102 register unsigned long int l
;
104 struct disassemble_info
*info
;
113 (*info
->fprintf_func
) (info
->stream
, "%c", *d
);
120 (*info
->fprintf_func
) (info
->stream
, "%s",
121 reg_names
[(l
>> OP_SH_RS
) & OP_MASK_RS
]);
126 (*info
->fprintf_func
) (info
->stream
, "%s",
127 reg_names
[(l
>> OP_SH_RT
) & OP_MASK_RT
]);
132 (*info
->fprintf_func
) (info
->stream
, "0x%x",
133 (l
>> OP_SH_IMMEDIATE
) & OP_MASK_IMMEDIATE
);
136 case 'j': /* Same as i, but sign-extended. */
138 delta
= (l
>> OP_SH_DELTA
) & OP_MASK_DELTA
;
141 (*info
->fprintf_func
) (info
->stream
, "%d",
146 (*info
->fprintf_func
) (info
->stream
, "0x%x",
147 (unsigned int) ((l
>> OP_SH_PREFX
)
152 (*info
->fprintf_func
) (info
->stream
, "0x%x",
153 (unsigned int) ((l
>> OP_SH_CACHE
)
158 info
->target
= (((pc
+ 4) & ~(bfd_vma
) 0x0fffffff)
159 | (((l
>> OP_SH_TARGET
) & OP_MASK_TARGET
) << 2));
160 (*info
->print_address_func
) (info
->target
, info
);
164 /* Sign extend the displacement. */
165 delta
= (l
>> OP_SH_DELTA
) & OP_MASK_DELTA
;
168 info
->target
= (delta
<< 2) + pc
+ INSNLEN
;
169 (*info
->print_address_func
) (info
->target
, info
);
173 (*info
->fprintf_func
) (info
->stream
, "%s",
174 reg_names
[(l
>> OP_SH_RD
) & OP_MASK_RD
]);
179 /* First check for both rd and rt being equal. */
180 unsigned int reg
= (l
>> OP_SH_RD
) & OP_MASK_RD
;
181 if (reg
== ((l
>> OP_SH_RT
) & OP_MASK_RT
))
182 (*info
->fprintf_func
) (info
->stream
, "%s",
186 /* If one is zero use the other. */
188 (*info
->fprintf_func
) (info
->stream
, "%s",
189 reg_names
[(l
>> OP_SH_RT
) & OP_MASK_RT
]);
190 else if (((l
>> OP_SH_RT
) & OP_MASK_RT
) == 0)
191 (*info
->fprintf_func
) (info
->stream
, "%s",
193 else /* Bogus, result depends on processor. */
194 (*info
->fprintf_func
) (info
->stream
, "%s or %s",
196 reg_names
[(l
>> OP_SH_RT
) & OP_MASK_RT
]);
202 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[0]);
206 (*info
->fprintf_func
) (info
->stream
, "0x%x",
207 (l
>> OP_SH_SHAMT
) & OP_MASK_SHAMT
);
211 (*info
->fprintf_func
) (info
->stream
, "0x%x",
212 (l
>> OP_SH_CODE
) & OP_MASK_CODE
);
216 (*info
->fprintf_func
) (info
->stream
, "0x%x",
217 (l
>> OP_SH_CODE2
) & OP_MASK_CODE2
);
221 (*info
->fprintf_func
) (info
->stream
, "0x%x",
222 (l
>> OP_SH_COPZ
) & OP_MASK_COPZ
);
226 (*info
->fprintf_func
) (info
->stream
, "0x%x",
227 (l
>> OP_SH_CODE20
) & OP_MASK_CODE20
);
231 (*info
->fprintf_func
) (info
->stream
, "0x%x",
232 (l
>> OP_SH_CODE19
) & OP_MASK_CODE19
);
237 (*info
->fprintf_func
) (info
->stream
, "$f%d",
238 (l
>> OP_SH_FS
) & OP_MASK_FS
);
243 (*info
->fprintf_func
) (info
->stream
, "$f%d",
244 (l
>> OP_SH_FT
) & OP_MASK_FT
);
248 (*info
->fprintf_func
) (info
->stream
, "$f%d",
249 (l
>> OP_SH_FD
) & OP_MASK_FD
);
253 (*info
->fprintf_func
) (info
->stream
, "$f%d",
254 (l
>> OP_SH_FR
) & OP_MASK_FR
);
258 (*info
->fprintf_func
) (info
->stream
, "$%d",
259 (l
>> OP_SH_RT
) & OP_MASK_RT
);
263 (*info
->fprintf_func
) (info
->stream
, "$%d",
264 (l
>> OP_SH_RD
) & OP_MASK_RD
);
268 (*info
->fprintf_func
) (info
->stream
, "$fcc%d",
269 (l
>> OP_SH_BCC
) & OP_MASK_BCC
);
273 (*info
->fprintf_func
) (info
->stream
, "$fcc%d",
274 (l
>> OP_SH_CCC
) & OP_MASK_CCC
);
278 (*info
->fprintf_func
) (info
->stream
, "%d",
279 (l
>> OP_SH_PERFREG
) & OP_MASK_PERFREG
);
283 (*info
->fprintf_func
) (info
->stream
, "%d",
284 (l
>> OP_SH_SEL
) & OP_MASK_SEL
);
288 (*info
->fprintf_func
) (info
->stream
, "%d",
289 (l
>> OP_SH_ALN
) & OP_MASK_ALN
);
294 unsigned int vsel
= (l
>> OP_SH_VSEL
) & OP_MASK_VSEL
;
295 if ((vsel
& 0x10) == 0)
299 for (fmt
= 0; fmt
< 3; fmt
++, vsel
>>= 1)
302 (*info
->fprintf_func
) (info
->stream
, "$v%d[%d]",
303 (l
>> OP_SH_FT
) & OP_MASK_FT
,
306 else if ((vsel
& 0x08) == 0)
308 (*info
->fprintf_func
) (info
->stream
, "$v%d",
309 (l
>> OP_SH_FT
) & OP_MASK_FT
);
313 (*info
->fprintf_func
) (info
->stream
, "0x%x",
314 (l
>> OP_SH_FT
) & OP_MASK_FT
);
320 (*info
->fprintf_func
) (info
->stream
, "$v%d",
321 (l
>> OP_SH_FD
) & OP_MASK_FD
);
325 (*info
->fprintf_func
) (info
->stream
, "$v%d",
326 (l
>> OP_SH_FS
) & OP_MASK_FS
);
330 (*info
->fprintf_func
) (info
->stream
, "$v%d",
331 (l
>> OP_SH_FT
) & OP_MASK_FT
);
335 /* xgettext:c-format */
336 (*info
->fprintf_func
) (info
->stream
,
337 _("# internal error, undefined modifier(%c)"),
343 /* Figure out the MIPS ISA and CPU based on the machine number. */
346 mips_isa_type (mach
, isa
, cputype
)
353 case bfd_mach_mips3000
:
354 *cputype
= CPU_R3000
;
357 case bfd_mach_mips3900
:
358 *cputype
= CPU_R3900
;
361 case bfd_mach_mips4000
:
362 *cputype
= CPU_R4000
;
365 case bfd_mach_mips4010
:
366 *cputype
= CPU_R4010
;
369 case bfd_mach_mips4100
:
370 *cputype
= CPU_VR4100
;
373 case bfd_mach_mips4111
:
374 *cputype
= CPU_R4111
;
377 case bfd_mach_mips4300
:
378 *cputype
= CPU_R4300
;
381 case bfd_mach_mips4400
:
382 *cputype
= CPU_R4400
;
385 case bfd_mach_mips4600
:
386 *cputype
= CPU_R4600
;
389 case bfd_mach_mips4650
:
390 *cputype
= CPU_R4650
;
393 case bfd_mach_mips5000
:
394 *cputype
= CPU_R5000
;
397 case bfd_mach_mips6000
:
398 *cputype
= CPU_R6000
;
401 case bfd_mach_mips8000
:
402 *cputype
= CPU_R8000
;
405 case bfd_mach_mips10000
:
406 *cputype
= CPU_R10000
;
409 case bfd_mach_mips12000
:
410 *cputype
= CPU_R12000
;
413 case bfd_mach_mips16
:
414 *cputype
= CPU_MIPS16
;
415 *isa
= ISA_MIPS3
| INSN_MIPS16
;
418 *cputype
= CPU_MIPS5
;
421 case bfd_mach_mips_sb1
:
423 *isa
= ISA_MIPS64
| INSN_MIPS3D
| INSN_SB1
;
425 case bfd_mach_mipsisa32
:
426 *cputype
= CPU_MIPS32
;
427 /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
428 Note that MIPS-3D and MDMX are not applicable to MIPS32. (See
429 _MIPS32 Architecture For Programmers Volume I: Introduction to the
430 MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
432 *isa
= ISA_MIPS32
| INSN_MIPS16
;
434 case bfd_mach_mipsisa64
:
435 *cputype
= CPU_MIPS64
;
436 /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs. */
437 *isa
= ISA_MIPS64
| INSN_MIPS16
| INSN_MIPS3D
| INSN_MDMX
;
441 *cputype
= CPU_R3000
;
447 /* Check if the object uses NewABI conventions. */
451 Elf_Internal_Ehdr
*header
;
453 /* There are no old-style ABIs which use 64-bit ELF. */
454 if (header
->e_ident
[EI_CLASS
] == ELFCLASS64
)
457 /* If a 32-bit ELF file, n32 is a new-style ABI. */
458 if ((header
->e_flags
& EF_MIPS_ABI2
) != 0)
464 /* Print the mips instruction at address MEMADDR in debugged memory,
465 on using INFO. Returns length of the instruction, in bytes, which is
466 always INSNLEN. BIGENDIAN must be 1 if this is big-endian code, 0 if
467 this is little-endian code. */
470 print_insn_mips (memaddr
, word
, info
)
472 unsigned long int word
;
473 struct disassemble_info
*info
;
475 register const struct mips_opcode
*op
;
476 int target_processor
, mips_isa
;
477 static boolean init
= 0;
478 static const struct mips_opcode
*mips_hash
[OP_MASK_OP
+ 1];
480 /* Build a hash table to shorten the search time. */
485 for (i
= 0; i
<= OP_MASK_OP
; i
++)
487 for (op
= mips_opcodes
; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
489 if (op
->pinfo
== INSN_MACRO
)
491 if (i
== ((op
->match
>> OP_SH_OP
) & OP_MASK_OP
))
502 #if ! SYMTAB_AVAILABLE
503 /* This is running out on a target machine, not in a host tool.
504 FIXME: Where does mips_target_info come from? */
505 target_processor
= mips_target_info
.processor
;
506 mips_isa
= mips_target_info
.isa
;
508 mips_isa_type (info
->mach
, &mips_isa
, &target_processor
);
511 info
->bytes_per_chunk
= INSNLEN
;
512 info
->display_endian
= info
->endian
;
513 info
->insn_info_valid
= 1;
514 info
->branch_delay_insns
= 0;
516 info
->insn_type
= dis_nonbranch
;
520 op
= mips_hash
[(word
>> OP_SH_OP
) & OP_MASK_OP
];
523 for (; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
525 if (op
->pinfo
!= INSN_MACRO
&& (word
& op
->mask
) == op
->match
)
527 register const char *d
;
529 if (! OPCODE_IS_MEMBER (op
, mips_isa
, target_processor
))
532 /* Figure out instruction type and branch delay information. */
533 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
535 if ((info
->insn_type
& INSN_WRITE_GPR_31
) != 0)
536 info
->insn_type
= dis_jsr
;
538 info
->insn_type
= dis_branch
;
539 info
->branch_delay_insns
= 1;
541 else if ((op
->pinfo
& (INSN_COND_BRANCH_DELAY
542 | INSN_COND_BRANCH_LIKELY
)) != 0)
544 if ((info
->insn_type
& INSN_WRITE_GPR_31
) != 0)
545 info
->insn_type
= dis_condjsr
;
547 info
->insn_type
= dis_condbranch
;
548 info
->branch_delay_insns
= 1;
550 else if ((op
->pinfo
& (INSN_STORE_MEMORY
551 | INSN_LOAD_MEMORY_DELAY
)) != 0)
552 info
->insn_type
= dis_dref
;
554 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
557 if (d
!= NULL
&& *d
!= '\0')
559 (*info
->fprintf_func
) (info
->stream
, "\t");
560 for (; *d
!= '\0'; d
++)
561 print_insn_arg (d
, word
, memaddr
, info
);
569 /* Handle undefined instructions. */
570 info
->insn_type
= dis_noninsn
;
571 (*info
->fprintf_func
) (info
->stream
, "0x%x", word
);
575 /* In an environment where we do not know the symbol type of the
576 instruction we are forced to assume that the low order bit of the
577 instructions' address may mark it as a mips16 instruction. If we
578 are single stepping, or the pc is within the disassembled function,
579 this works. Otherwise, we need a clue. Sometimes. */
582 _print_insn_mips (memaddr
, info
, endianness
)
584 struct disassemble_info
*info
;
585 enum bfd_endian endianness
;
587 bfd_byte buffer
[INSNLEN
];
591 /* FIXME: If odd address, this is CLEARLY a mips 16 instruction. */
592 /* Only a few tools will work this way. */
594 return print_insn_mips16 (memaddr
, info
);
599 || (info
->flavour
== bfd_target_elf_flavour
600 && info
->symbols
!= NULL
601 && ((*(elf_symbol_type
**) info
->symbols
)->internal_elf_sym
.st_other
603 return print_insn_mips16 (memaddr
, info
);
606 /* Use mips64_reg_names for new ABI. */
607 reg_names
= mips32_reg_names
;
609 if (info
->flavour
== bfd_target_elf_flavour
&& info
->symbols
!= NULL
)
611 Elf_Internal_Ehdr
*header
;
613 header
= elf_elfheader (bfd_asymbol_bfd (*(info
->symbols
)));
614 if (is_newabi (header
))
615 reg_names
= mips64_reg_names
;
618 status
= (*info
->read_memory_func
) (memaddr
, buffer
, INSNLEN
, info
);
623 if (endianness
== BFD_ENDIAN_BIG
)
624 insn
= (unsigned long) bfd_getb32 (buffer
);
626 insn
= (unsigned long) bfd_getl32 (buffer
);
628 return print_insn_mips (memaddr
, insn
, info
);
632 (*info
->memory_error_func
) (status
, memaddr
, info
);
638 print_insn_big_mips (memaddr
, info
)
640 struct disassemble_info
*info
;
642 return _print_insn_mips (memaddr
, info
, BFD_ENDIAN_BIG
);
646 print_insn_little_mips (memaddr
, info
)
648 struct disassemble_info
*info
;
650 return _print_insn_mips (memaddr
, info
, BFD_ENDIAN_LITTLE
);
653 /* Disassemble mips16 instructions. */
656 print_insn_mips16 (memaddr
, info
)
658 struct disassemble_info
*info
;
666 const struct mips_opcode
*op
, *opend
;
668 info
->bytes_per_chunk
= 2;
669 info
->display_endian
= info
->endian
;
670 info
->insn_info_valid
= 1;
671 info
->branch_delay_insns
= 0;
673 info
->insn_type
= dis_nonbranch
;
677 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
680 (*info
->memory_error_func
) (status
, memaddr
, info
);
686 if (info
->endian
== BFD_ENDIAN_BIG
)
687 insn
= bfd_getb16 (buffer
);
689 insn
= bfd_getl16 (buffer
);
691 /* Handle the extend opcode specially. */
693 if ((insn
& 0xf800) == 0xf000)
696 extend
= insn
& 0x7ff;
700 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
703 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
704 (unsigned int) extend
);
705 (*info
->memory_error_func
) (status
, memaddr
, info
);
709 if (info
->endian
== BFD_ENDIAN_BIG
)
710 insn
= bfd_getb16 (buffer
);
712 insn
= bfd_getl16 (buffer
);
714 /* Check for an extend opcode followed by an extend opcode. */
715 if ((insn
& 0xf800) == 0xf000)
717 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
718 (unsigned int) extend
);
719 info
->insn_type
= dis_noninsn
;
726 /* FIXME: Should probably use a hash table on the major opcode here. */
728 opend
= mips16_opcodes
+ bfd_mips16_num_opcodes
;
729 for (op
= mips16_opcodes
; op
< opend
; op
++)
731 if (op
->pinfo
!= INSN_MACRO
&& (insn
& op
->mask
) == op
->match
)
735 if (strchr (op
->args
, 'a') != NULL
)
739 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
740 (unsigned int) extend
);
741 info
->insn_type
= dis_noninsn
;
749 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2,
754 if (info
->endian
== BFD_ENDIAN_BIG
)
755 extend
= bfd_getb16 (buffer
);
757 extend
= bfd_getl16 (buffer
);
762 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
763 if (op
->args
[0] != '\0')
764 (*info
->fprintf_func
) (info
->stream
, "\t");
766 for (s
= op
->args
; *s
!= '\0'; s
++)
770 && (((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)
771 == ((insn
>> MIPS16OP_SH_RY
) & MIPS16OP_MASK_RY
)))
773 /* Skip the register and the comma. */
779 && (((insn
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
)
780 == ((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)))
782 /* Skip the register and the comma. */
786 print_mips16_insn_arg (*s
, op
, insn
, use_extend
, extend
, memaddr
,
790 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
792 info
->branch_delay_insns
= 1;
793 if (info
->insn_type
!= dis_jsr
)
794 info
->insn_type
= dis_branch
;
802 (*info
->fprintf_func
) (info
->stream
, "0x%x", extend
| 0xf000);
803 (*info
->fprintf_func
) (info
->stream
, "0x%x", insn
);
804 info
->insn_type
= dis_noninsn
;
809 /* Disassemble an operand for a mips16 instruction. */
812 print_mips16_insn_arg (type
, op
, l
, use_extend
, extend
, memaddr
, info
)
814 const struct mips_opcode
*op
;
819 struct disassemble_info
*info
;
826 (*info
->fprintf_func
) (info
->stream
, "%c", type
);
831 (*info
->fprintf_func
) (info
->stream
, "%s",
832 mips16_reg_names
[((l
>> MIPS16OP_SH_RY
)
833 & MIPS16OP_MASK_RY
)]);
838 (*info
->fprintf_func
) (info
->stream
, "%s",
839 mips16_reg_names
[((l
>> MIPS16OP_SH_RX
)
840 & MIPS16OP_MASK_RX
)]);
844 (*info
->fprintf_func
) (info
->stream
, "%s",
845 mips16_reg_names
[((l
>> MIPS16OP_SH_RZ
)
846 & MIPS16OP_MASK_RZ
)]);
850 (*info
->fprintf_func
) (info
->stream
, "%s",
851 mips16_reg_names
[((l
>> MIPS16OP_SH_MOVE32Z
)
852 & MIPS16OP_MASK_MOVE32Z
)]);
856 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[0]);
860 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[29]);
864 (*info
->fprintf_func
) (info
->stream
, "$pc");
868 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[31]);
872 (*info
->fprintf_func
) (info
->stream
, "%s",
873 mips32_reg_names
[((l
>> MIPS16OP_SH_REGR32
)
874 & MIPS16OP_MASK_REGR32
)]);
878 (*info
->fprintf_func
) (info
->stream
, "%s",
879 mips32_reg_names
[MIPS16OP_EXTRACT_REG32R (l
)]);
905 int immed
, nbits
, shift
, signedp
, extbits
, pcrel
, extu
, branch
;
917 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
923 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
929 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
935 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
941 immed
= (l
>> MIPS16OP_SH_IMM4
) & MIPS16OP_MASK_IMM4
;
947 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
948 info
->insn_type
= dis_dref
;
954 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
955 info
->insn_type
= dis_dref
;
961 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
962 if ((op
->pinfo
& MIPS16_INSN_READ_PC
) == 0
963 && (op
->pinfo
& MIPS16_INSN_READ_SP
) == 0)
965 info
->insn_type
= dis_dref
;
972 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
973 info
->insn_type
= dis_dref
;
978 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
983 immed
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
987 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
992 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
993 /* FIXME: This might be lw, or it might be addiu to $sp or
994 $pc. We assume it's load. */
995 info
->insn_type
= dis_dref
;
1001 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1002 info
->insn_type
= dis_dref
;
1003 info
->data_size
= 8;
1007 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1012 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1018 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1023 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1027 info
->insn_type
= dis_condbranch
;
1031 immed
= (l
>> MIPS16OP_SH_IMM11
) & MIPS16OP_MASK_IMM11
;
1035 info
->insn_type
= dis_branch
;
1040 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1042 /* FIXME: This can be lw or la. We assume it is lw. */
1043 info
->insn_type
= dis_dref
;
1044 info
->data_size
= 4;
1049 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1051 info
->insn_type
= dis_dref
;
1052 info
->data_size
= 8;
1057 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1066 if (signedp
&& immed
>= (1 << (nbits
- 1)))
1067 immed
-= 1 << nbits
;
1069 if ((type
== '<' || type
== '>' || type
== '[' || type
== ']')
1076 immed
|= ((extend
& 0x1f) << 11) | (extend
& 0x7e0);
1077 else if (extbits
== 15)
1078 immed
|= ((extend
& 0xf) << 11) | (extend
& 0x7f0);
1080 immed
= ((extend
>> 6) & 0x1f) | (extend
& 0x20);
1081 immed
&= (1 << extbits
) - 1;
1082 if (! extu
&& immed
>= (1 << (extbits
- 1)))
1083 immed
-= 1 << extbits
;
1087 (*info
->fprintf_func
) (info
->stream
, "%d", immed
);
1095 baseaddr
= memaddr
+ 2;
1097 else if (use_extend
)
1098 baseaddr
= memaddr
- 2;
1106 /* If this instruction is in the delay slot of a jr
1107 instruction, the base address is the address of the
1108 jr instruction. If it is in the delay slot of jalr
1109 instruction, the base address is the address of the
1110 jalr instruction. This test is unreliable: we have
1111 no way of knowing whether the previous word is
1112 instruction or data. */
1113 status
= (*info
->read_memory_func
) (memaddr
- 4, buffer
, 2,
1116 && (((info
->endian
== BFD_ENDIAN_BIG
1117 ? bfd_getb16 (buffer
)
1118 : bfd_getl16 (buffer
))
1119 & 0xf800) == 0x1800))
1120 baseaddr
= memaddr
- 4;
1123 status
= (*info
->read_memory_func
) (memaddr
- 2, buffer
,
1126 && (((info
->endian
== BFD_ENDIAN_BIG
1127 ? bfd_getb16 (buffer
)
1128 : bfd_getl16 (buffer
))
1129 & 0xf81f) == 0xe800))
1130 baseaddr
= memaddr
- 2;
1133 info
->target
= (baseaddr
& ~((1 << shift
) - 1)) + immed
;
1134 (*info
->print_address_func
) (info
->target
, info
);
1142 l
= ((l
& 0x1f) << 23) | ((l
& 0x3e0) << 13) | (extend
<< 2);
1143 info
->target
= ((memaddr
+ 4) & ~(bfd_vma
) 0x0fffffff) | l
;
1144 (*info
->print_address_func
) (info
->target
, info
);
1145 info
->insn_type
= dis_jsr
;
1146 info
->branch_delay_insns
= 1;
1152 int need_comma
, amask
, smask
;
1156 l
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1158 amask
= (l
>> 3) & 7;
1160 if (amask
> 0 && amask
< 5)
1162 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[4]);
1164 (*info
->fprintf_func
) (info
->stream
, "-%s",
1165 mips32_reg_names
[amask
+ 3]);
1169 smask
= (l
>> 1) & 3;
1172 (*info
->fprintf_func
) (info
->stream
, "%s??",
1173 need_comma
? "," : "");
1178 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1179 need_comma
? "," : "",
1180 mips32_reg_names
[16]);
1182 (*info
->fprintf_func
) (info
->stream
, "-%s",
1183 mips32_reg_names
[smask
+ 15]);
1189 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1190 need_comma
? "," : "",
1191 mips32_reg_names
[31]);
1195 if (amask
== 5 || amask
== 6)
1197 (*info
->fprintf_func
) (info
->stream
, "%s$f0",
1198 need_comma
? "," : "");
1200 (*info
->fprintf_func
) (info
->stream
, "-$f1");
1206 /* xgettext:c-format */
1207 (*info
->fprintf_func
)
1209 _("# internal disassembler error, unrecognised modifier (%c)"),