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 /* xgettext:c-format */
289 (*info
->fprintf_func
) (info
->stream
,
290 _("# internal error, undefined modifier(%c)"),
296 /* Figure out the MIPS ISA and CPU based on the machine number. */
299 mips_isa_type (mach
, isa
, cputype
)
306 case bfd_mach_mips3000
:
307 *cputype
= CPU_R3000
;
310 case bfd_mach_mips3900
:
311 *cputype
= CPU_R3900
;
314 case bfd_mach_mips4000
:
315 *cputype
= CPU_R4000
;
318 case bfd_mach_mips4010
:
319 *cputype
= CPU_R4010
;
322 case bfd_mach_mips4100
:
323 *cputype
= CPU_VR4100
;
326 case bfd_mach_mips4111
:
327 *cputype
= CPU_R4111
;
330 case bfd_mach_mips4300
:
331 *cputype
= CPU_R4300
;
334 case bfd_mach_mips4400
:
335 *cputype
= CPU_R4400
;
338 case bfd_mach_mips4600
:
339 *cputype
= CPU_R4600
;
342 case bfd_mach_mips4650
:
343 *cputype
= CPU_R4650
;
346 case bfd_mach_mips5000
:
347 *cputype
= CPU_R5000
;
350 case bfd_mach_mips6000
:
351 *cputype
= CPU_R6000
;
354 case bfd_mach_mips8000
:
355 *cputype
= CPU_R8000
;
358 case bfd_mach_mips10000
:
359 *cputype
= CPU_R10000
;
362 case bfd_mach_mips12000
:
363 *cputype
= CPU_R12000
;
366 case bfd_mach_mips16
:
367 *cputype
= CPU_MIPS16
;
371 *cputype
= CPU_MIPS5
;
374 case bfd_mach_mips_sb1
:
376 *isa
= ISA_MIPS64
| INSN_MIPS3D
| INSN_SB1
;
378 case bfd_mach_mipsisa32
:
379 *cputype
= CPU_MIPS32
;
380 /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
381 Note that MIPS-3D is not applicable to MIPS32. (See _MIPS32
382 Architecture For Programmers Volume I: Introduction to the
383 MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
387 case bfd_mach_mipsisa64
:
388 *cputype
= CPU_MIPS64
;
389 /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs. */
390 *isa
= ISA_MIPS64
| INSN_MIPS3D
;
394 *cputype
= CPU_R3000
;
400 /* Check if the object uses NewABI conventions. */
404 Elf_Internal_Ehdr
*header
;
406 /* There are no old-style ABIs which use 64-bit ELF. */
407 if (header
->e_ident
[EI_CLASS
] == ELFCLASS64
)
410 /* If a 32-bit ELF file, n32 is a new-style ABI. */
411 if ((header
->e_flags
& EF_MIPS_ABI2
) != 0)
417 /* Print the mips instruction at address MEMADDR in debugged memory,
418 on using INFO. Returns length of the instruction, in bytes, which is
419 always INSNLEN. BIGENDIAN must be 1 if this is big-endian code, 0 if
420 this is little-endian code. */
423 print_insn_mips (memaddr
, word
, info
)
425 unsigned long int word
;
426 struct disassemble_info
*info
;
428 register const struct mips_opcode
*op
;
429 int target_processor
, mips_isa
;
430 static boolean init
= 0;
431 static const struct mips_opcode
*mips_hash
[OP_MASK_OP
+ 1];
433 /* Build a hash table to shorten the search time. */
438 for (i
= 0; i
<= OP_MASK_OP
; i
++)
440 for (op
= mips_opcodes
; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
442 if (op
->pinfo
== INSN_MACRO
)
444 if (i
== ((op
->match
>> OP_SH_OP
) & OP_MASK_OP
))
455 #if ! SYMTAB_AVAILABLE
456 /* This is running out on a target machine, not in a host tool.
457 FIXME: Where does mips_target_info come from? */
458 target_processor
= mips_target_info
.processor
;
459 mips_isa
= mips_target_info
.isa
;
461 mips_isa_type (info
->mach
, &mips_isa
, &target_processor
);
464 info
->bytes_per_chunk
= INSNLEN
;
465 info
->display_endian
= info
->endian
;
466 info
->insn_info_valid
= 1;
467 info
->branch_delay_insns
= 0;
469 info
->insn_type
= dis_nonbranch
;
473 op
= mips_hash
[(word
>> OP_SH_OP
) & OP_MASK_OP
];
476 for (; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
478 if (op
->pinfo
!= INSN_MACRO
&& (word
& op
->mask
) == op
->match
)
480 register const char *d
;
482 if (! OPCODE_IS_MEMBER (op
, mips_isa
, target_processor
))
485 /* Figure out instruction type and branch delay information. */
486 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
488 if ((info
->insn_type
& INSN_WRITE_GPR_31
) != 0)
489 info
->insn_type
= dis_jsr
;
491 info
->insn_type
= dis_branch
;
492 info
->branch_delay_insns
= 1;
494 else if ((op
->pinfo
& (INSN_COND_BRANCH_DELAY
495 | INSN_COND_BRANCH_LIKELY
)) != 0)
497 if ((info
->insn_type
& INSN_WRITE_GPR_31
) != 0)
498 info
->insn_type
= dis_condjsr
;
500 info
->insn_type
= dis_condbranch
;
501 info
->branch_delay_insns
= 1;
503 else if ((op
->pinfo
& (INSN_STORE_MEMORY
504 | INSN_LOAD_MEMORY_DELAY
)) != 0)
505 info
->insn_type
= dis_dref
;
507 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
510 if (d
!= NULL
&& *d
!= '\0')
512 (*info
->fprintf_func
) (info
->stream
, "\t");
513 for (; *d
!= '\0'; d
++)
514 print_insn_arg (d
, word
, memaddr
, info
);
522 /* Handle undefined instructions. */
523 info
->insn_type
= dis_noninsn
;
524 (*info
->fprintf_func
) (info
->stream
, "0x%x", word
);
528 /* In an environment where we do not know the symbol type of the
529 instruction we are forced to assume that the low order bit of the
530 instructions' address may mark it as a mips16 instruction. If we
531 are single stepping, or the pc is within the disassembled function,
532 this works. Otherwise, we need a clue. Sometimes. */
535 _print_insn_mips (memaddr
, info
, endianness
)
537 struct disassemble_info
*info
;
538 enum bfd_endian endianness
;
540 bfd_byte buffer
[INSNLEN
];
544 /* FIXME: If odd address, this is CLEARLY a mips 16 instruction. */
545 /* Only a few tools will work this way. */
547 return print_insn_mips16 (memaddr
, info
);
552 || (info
->flavour
== bfd_target_elf_flavour
553 && info
->symbols
!= NULL
554 && ((*(elf_symbol_type
**) info
->symbols
)->internal_elf_sym
.st_other
556 return print_insn_mips16 (memaddr
, info
);
559 /* Use mips64_reg_names for new ABI. */
560 reg_names
= mips32_reg_names
;
562 if (info
->flavour
== bfd_target_elf_flavour
&& info
->symbols
!= NULL
)
564 Elf_Internal_Ehdr
*header
;
566 header
= elf_elfheader (bfd_asymbol_bfd (*(info
->symbols
)));
567 if (is_newabi (header
))
568 reg_names
= mips64_reg_names
;
571 status
= (*info
->read_memory_func
) (memaddr
, buffer
, INSNLEN
, info
);
576 if (endianness
== BFD_ENDIAN_BIG
)
577 insn
= (unsigned long) bfd_getb32 (buffer
);
579 insn
= (unsigned long) bfd_getl32 (buffer
);
581 return print_insn_mips (memaddr
, insn
, info
);
585 (*info
->memory_error_func
) (status
, memaddr
, info
);
591 print_insn_big_mips (memaddr
, info
)
593 struct disassemble_info
*info
;
595 return _print_insn_mips (memaddr
, info
, BFD_ENDIAN_BIG
);
599 print_insn_little_mips (memaddr
, info
)
601 struct disassemble_info
*info
;
603 return _print_insn_mips (memaddr
, info
, BFD_ENDIAN_LITTLE
);
606 /* Disassemble mips16 instructions. */
609 print_insn_mips16 (memaddr
, info
)
611 struct disassemble_info
*info
;
619 const struct mips_opcode
*op
, *opend
;
621 info
->bytes_per_chunk
= 2;
622 info
->display_endian
= info
->endian
;
623 info
->insn_info_valid
= 1;
624 info
->branch_delay_insns
= 0;
626 info
->insn_type
= dis_nonbranch
;
630 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
633 (*info
->memory_error_func
) (status
, memaddr
, info
);
639 if (info
->endian
== BFD_ENDIAN_BIG
)
640 insn
= bfd_getb16 (buffer
);
642 insn
= bfd_getl16 (buffer
);
644 /* Handle the extend opcode specially. */
646 if ((insn
& 0xf800) == 0xf000)
649 extend
= insn
& 0x7ff;
653 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
656 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
657 (unsigned int) extend
);
658 (*info
->memory_error_func
) (status
, memaddr
, info
);
662 if (info
->endian
== BFD_ENDIAN_BIG
)
663 insn
= bfd_getb16 (buffer
);
665 insn
= bfd_getl16 (buffer
);
667 /* Check for an extend opcode followed by an extend opcode. */
668 if ((insn
& 0xf800) == 0xf000)
670 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
671 (unsigned int) extend
);
672 info
->insn_type
= dis_noninsn
;
679 /* FIXME: Should probably use a hash table on the major opcode here. */
681 opend
= mips16_opcodes
+ bfd_mips16_num_opcodes
;
682 for (op
= mips16_opcodes
; op
< opend
; op
++)
684 if (op
->pinfo
!= INSN_MACRO
&& (insn
& op
->mask
) == op
->match
)
688 if (strchr (op
->args
, 'a') != NULL
)
692 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
693 (unsigned int) extend
);
694 info
->insn_type
= dis_noninsn
;
702 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2,
707 if (info
->endian
== BFD_ENDIAN_BIG
)
708 extend
= bfd_getb16 (buffer
);
710 extend
= bfd_getl16 (buffer
);
715 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
716 if (op
->args
[0] != '\0')
717 (*info
->fprintf_func
) (info
->stream
, "\t");
719 for (s
= op
->args
; *s
!= '\0'; s
++)
723 && (((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)
724 == ((insn
>> MIPS16OP_SH_RY
) & MIPS16OP_MASK_RY
)))
726 /* Skip the register and the comma. */
732 && (((insn
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
)
733 == ((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)))
735 /* Skip the register and the comma. */
739 print_mips16_insn_arg (*s
, op
, insn
, use_extend
, extend
, memaddr
,
743 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
745 info
->branch_delay_insns
= 1;
746 if (info
->insn_type
!= dis_jsr
)
747 info
->insn_type
= dis_branch
;
755 (*info
->fprintf_func
) (info
->stream
, "0x%x", extend
| 0xf000);
756 (*info
->fprintf_func
) (info
->stream
, "0x%x", insn
);
757 info
->insn_type
= dis_noninsn
;
762 /* Disassemble an operand for a mips16 instruction. */
765 print_mips16_insn_arg (type
, op
, l
, use_extend
, extend
, memaddr
, info
)
767 const struct mips_opcode
*op
;
772 struct disassemble_info
*info
;
779 (*info
->fprintf_func
) (info
->stream
, "%c", type
);
784 (*info
->fprintf_func
) (info
->stream
, "%s",
785 mips16_reg_names
[((l
>> MIPS16OP_SH_RY
)
786 & MIPS16OP_MASK_RY
)]);
791 (*info
->fprintf_func
) (info
->stream
, "%s",
792 mips16_reg_names
[((l
>> MIPS16OP_SH_RX
)
793 & MIPS16OP_MASK_RX
)]);
797 (*info
->fprintf_func
) (info
->stream
, "%s",
798 mips16_reg_names
[((l
>> MIPS16OP_SH_RZ
)
799 & MIPS16OP_MASK_RZ
)]);
803 (*info
->fprintf_func
) (info
->stream
, "%s",
804 mips16_reg_names
[((l
>> MIPS16OP_SH_MOVE32Z
)
805 & MIPS16OP_MASK_MOVE32Z
)]);
809 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[0]);
813 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[29]);
817 (*info
->fprintf_func
) (info
->stream
, "$pc");
821 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[31]);
825 (*info
->fprintf_func
) (info
->stream
, "%s",
826 mips32_reg_names
[((l
>> MIPS16OP_SH_REGR32
)
827 & MIPS16OP_MASK_REGR32
)]);
831 (*info
->fprintf_func
) (info
->stream
, "%s",
832 mips32_reg_names
[MIPS16OP_EXTRACT_REG32R (l
)]);
858 int immed
, nbits
, shift
, signedp
, extbits
, pcrel
, extu
, branch
;
870 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
876 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
882 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
888 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
894 immed
= (l
>> MIPS16OP_SH_IMM4
) & MIPS16OP_MASK_IMM4
;
900 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
901 info
->insn_type
= dis_dref
;
907 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
908 info
->insn_type
= dis_dref
;
914 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
915 if ((op
->pinfo
& MIPS16_INSN_READ_PC
) == 0
916 && (op
->pinfo
& MIPS16_INSN_READ_SP
) == 0)
918 info
->insn_type
= dis_dref
;
925 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
926 info
->insn_type
= dis_dref
;
931 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
936 immed
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
940 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
945 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
946 /* FIXME: This might be lw, or it might be addiu to $sp or
947 $pc. We assume it's load. */
948 info
->insn_type
= dis_dref
;
954 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
955 info
->insn_type
= dis_dref
;
960 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
965 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
971 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
976 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
980 info
->insn_type
= dis_condbranch
;
984 immed
= (l
>> MIPS16OP_SH_IMM11
) & MIPS16OP_MASK_IMM11
;
988 info
->insn_type
= dis_branch
;
993 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
995 /* FIXME: This can be lw or la. We assume it is lw. */
996 info
->insn_type
= dis_dref
;
1002 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1004 info
->insn_type
= dis_dref
;
1005 info
->data_size
= 8;
1010 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1019 if (signedp
&& immed
>= (1 << (nbits
- 1)))
1020 immed
-= 1 << nbits
;
1022 if ((type
== '<' || type
== '>' || type
== '[' || type
== ']')
1029 immed
|= ((extend
& 0x1f) << 11) | (extend
& 0x7e0);
1030 else if (extbits
== 15)
1031 immed
|= ((extend
& 0xf) << 11) | (extend
& 0x7f0);
1033 immed
= ((extend
>> 6) & 0x1f) | (extend
& 0x20);
1034 immed
&= (1 << extbits
) - 1;
1035 if (! extu
&& immed
>= (1 << (extbits
- 1)))
1036 immed
-= 1 << extbits
;
1040 (*info
->fprintf_func
) (info
->stream
, "%d", immed
);
1048 baseaddr
= memaddr
+ 2;
1050 else if (use_extend
)
1051 baseaddr
= memaddr
- 2;
1059 /* If this instruction is in the delay slot of a jr
1060 instruction, the base address is the address of the
1061 jr instruction. If it is in the delay slot of jalr
1062 instruction, the base address is the address of the
1063 jalr instruction. This test is unreliable: we have
1064 no way of knowing whether the previous word is
1065 instruction or data. */
1066 status
= (*info
->read_memory_func
) (memaddr
- 4, buffer
, 2,
1069 && (((info
->endian
== BFD_ENDIAN_BIG
1070 ? bfd_getb16 (buffer
)
1071 : bfd_getl16 (buffer
))
1072 & 0xf800) == 0x1800))
1073 baseaddr
= memaddr
- 4;
1076 status
= (*info
->read_memory_func
) (memaddr
- 2, buffer
,
1079 && (((info
->endian
== BFD_ENDIAN_BIG
1080 ? bfd_getb16 (buffer
)
1081 : bfd_getl16 (buffer
))
1082 & 0xf81f) == 0xe800))
1083 baseaddr
= memaddr
- 2;
1086 info
->target
= (baseaddr
& ~((1 << shift
) - 1)) + immed
;
1087 (*info
->print_address_func
) (info
->target
, info
);
1095 l
= ((l
& 0x1f) << 23) | ((l
& 0x3e0) << 13) | (extend
<< 2);
1096 info
->target
= ((memaddr
+ 4) & ~(bfd_vma
) 0x0fffffff) | l
;
1097 (*info
->print_address_func
) (info
->target
, info
);
1098 info
->insn_type
= dis_jsr
;
1099 info
->branch_delay_insns
= 1;
1105 int need_comma
, amask
, smask
;
1109 l
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1111 amask
= (l
>> 3) & 7;
1113 if (amask
> 0 && amask
< 5)
1115 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[4]);
1117 (*info
->fprintf_func
) (info
->stream
, "-%s",
1118 mips32_reg_names
[amask
+ 3]);
1122 smask
= (l
>> 1) & 3;
1125 (*info
->fprintf_func
) (info
->stream
, "%s??",
1126 need_comma
? "," : "");
1131 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1132 need_comma
? "," : "",
1133 mips32_reg_names
[16]);
1135 (*info
->fprintf_func
) (info
->stream
, "-%s",
1136 mips32_reg_names
[smask
+ 15]);
1142 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1143 need_comma
? "," : "",
1144 mips32_reg_names
[31]);
1148 if (amask
== 5 || amask
== 6)
1150 (*info
->fprintf_func
) (info
->stream
, "%s$f0",
1151 need_comma
? "," : "");
1153 (*info
->fprintf_func
) (info
->stream
, "-$f1");
1159 /* xgettext:c-format */
1160 (*info
->fprintf_func
)
1162 _("# internal disassembler error, unrecognised modifier (%c)"),