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_SB1
;
378 case bfd_mach_mipsisa32
:
379 *cputype
= CPU_MIPS32
;
382 case bfd_mach_mipsisa64
:
383 *cputype
= CPU_MIPS64
;
388 *cputype
= CPU_R3000
;
394 /* Check if the object uses NewABI conventions. */
398 Elf_Internal_Ehdr
*header
;
400 /* There are no old-style ABIs which use 64-bit ELF. */
401 if (header
->e_ident
[EI_CLASS
] == ELFCLASS64
)
404 /* If a 32-bit ELF file, N32, EABI32, and EABI64 are new-style ABIs. */
405 if ((header
->e_flags
& EF_MIPS_ABI2
) != 0
406 || (header
->e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI32
407 || (header
->e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
)
413 /* Print the mips instruction at address MEMADDR in debugged memory,
414 on using INFO. Returns length of the instruction, in bytes, which is
415 always INSNLEN. BIGENDIAN must be 1 if this is big-endian code, 0 if
416 this is little-endian code. */
419 print_insn_mips (memaddr
, word
, info
)
421 unsigned long int word
;
422 struct disassemble_info
*info
;
424 register const struct mips_opcode
*op
;
425 int target_processor
, mips_isa
;
426 static boolean init
= 0;
427 static const struct mips_opcode
*mips_hash
[OP_MASK_OP
+ 1];
429 /* Build a hash table to shorten the search time. */
434 for (i
= 0; i
<= OP_MASK_OP
; i
++)
436 for (op
= mips_opcodes
; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
438 if (op
->pinfo
== INSN_MACRO
)
440 if (i
== ((op
->match
>> OP_SH_OP
) & OP_MASK_OP
))
451 #if ! SYMTAB_AVAILABLE
452 /* This is running out on a target machine, not in a host tool.
453 FIXME: Where does mips_target_info come from? */
454 target_processor
= mips_target_info
.processor
;
455 mips_isa
= mips_target_info
.isa
;
457 mips_isa_type (info
->mach
, &mips_isa
, &target_processor
);
460 info
->bytes_per_chunk
= INSNLEN
;
461 info
->display_endian
= info
->endian
;
462 info
->insn_info_valid
= 1;
463 info
->branch_delay_insns
= 0;
465 info
->insn_type
= dis_nonbranch
;
469 op
= mips_hash
[(word
>> OP_SH_OP
) & OP_MASK_OP
];
472 for (; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
474 if (op
->pinfo
!= INSN_MACRO
&& (word
& op
->mask
) == op
->match
)
476 register const char *d
;
478 if (! OPCODE_IS_MEMBER (op
, mips_isa
, target_processor
))
481 /* Figure out instruction type and branch delay information. */
482 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
484 if ((info
->insn_type
& INSN_WRITE_GPR_31
) != 0)
485 info
->insn_type
= dis_jsr
;
487 info
->insn_type
= dis_branch
;
488 info
->branch_delay_insns
= 1;
490 else if ((op
->pinfo
& (INSN_COND_BRANCH_DELAY
491 | INSN_COND_BRANCH_LIKELY
)) != 0)
493 if ((info
->insn_type
& INSN_WRITE_GPR_31
) != 0)
494 info
->insn_type
= dis_condjsr
;
496 info
->insn_type
= dis_condbranch
;
497 info
->branch_delay_insns
= 1;
499 else if ((op
->pinfo
& (INSN_STORE_MEMORY
500 | INSN_LOAD_MEMORY_DELAY
)) != 0)
501 info
->insn_type
= dis_dref
;
503 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
506 if (d
!= NULL
&& *d
!= '\0')
508 (*info
->fprintf_func
) (info
->stream
, "\t");
509 for (; *d
!= '\0'; d
++)
510 print_insn_arg (d
, word
, memaddr
, info
);
518 /* Handle undefined instructions. */
519 info
->insn_type
= dis_noninsn
;
520 (*info
->fprintf_func
) (info
->stream
, "0x%x", word
);
524 /* In an environment where we do not know the symbol type of the
525 instruction we are forced to assume that the low order bit of the
526 instructions' address may mark it as a mips16 instruction. If we
527 are single stepping, or the pc is within the disassembled function,
528 this works. Otherwise, we need a clue. Sometimes. */
531 _print_insn_mips (memaddr
, info
, endianness
)
533 struct disassemble_info
*info
;
534 enum bfd_endian endianness
;
536 bfd_byte buffer
[INSNLEN
];
540 /* FIXME: If odd address, this is CLEARLY a mips 16 instruction. */
541 /* Only a few tools will work this way. */
543 return print_insn_mips16 (memaddr
, info
);
548 || (info
->flavour
== bfd_target_elf_flavour
549 && info
->symbols
!= NULL
550 && ((*(elf_symbol_type
**) info
->symbols
)->internal_elf_sym
.st_other
552 return print_insn_mips16 (memaddr
, info
);
555 /* Use mips64_reg_names for new ABI. */
556 reg_names
= mips32_reg_names
;
558 if (info
->flavour
== bfd_target_elf_flavour
&& info
->symbols
!= NULL
)
560 Elf_Internal_Ehdr
*header
;
562 header
= elf_elfheader (bfd_asymbol_bfd (*(info
->symbols
)));
563 if (is_newabi (header
))
564 reg_names
= mips64_reg_names
;
567 status
= (*info
->read_memory_func
) (memaddr
, buffer
, INSNLEN
, info
);
572 if (endianness
== BFD_ENDIAN_BIG
)
573 insn
= (unsigned long) bfd_getb32 (buffer
);
575 insn
= (unsigned long) bfd_getl32 (buffer
);
577 return print_insn_mips (memaddr
, insn
, info
);
581 (*info
->memory_error_func
) (status
, memaddr
, info
);
587 print_insn_big_mips (memaddr
, info
)
589 struct disassemble_info
*info
;
591 return _print_insn_mips (memaddr
, info
, BFD_ENDIAN_BIG
);
595 print_insn_little_mips (memaddr
, info
)
597 struct disassemble_info
*info
;
599 return _print_insn_mips (memaddr
, info
, BFD_ENDIAN_LITTLE
);
602 /* Disassemble mips16 instructions. */
605 print_insn_mips16 (memaddr
, info
)
607 struct disassemble_info
*info
;
615 const struct mips_opcode
*op
, *opend
;
617 info
->bytes_per_chunk
= 2;
618 info
->display_endian
= info
->endian
;
619 info
->insn_info_valid
= 1;
620 info
->branch_delay_insns
= 0;
622 info
->insn_type
= dis_nonbranch
;
626 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
629 (*info
->memory_error_func
) (status
, memaddr
, info
);
635 if (info
->endian
== BFD_ENDIAN_BIG
)
636 insn
= bfd_getb16 (buffer
);
638 insn
= bfd_getl16 (buffer
);
640 /* Handle the extend opcode specially. */
642 if ((insn
& 0xf800) == 0xf000)
645 extend
= insn
& 0x7ff;
649 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
652 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
653 (unsigned int) extend
);
654 (*info
->memory_error_func
) (status
, memaddr
, info
);
658 if (info
->endian
== BFD_ENDIAN_BIG
)
659 insn
= bfd_getb16 (buffer
);
661 insn
= bfd_getl16 (buffer
);
663 /* Check for an extend opcode followed by an extend opcode. */
664 if ((insn
& 0xf800) == 0xf000)
666 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
667 (unsigned int) extend
);
668 info
->insn_type
= dis_noninsn
;
675 /* FIXME: Should probably use a hash table on the major opcode here. */
677 opend
= mips16_opcodes
+ bfd_mips16_num_opcodes
;
678 for (op
= mips16_opcodes
; op
< opend
; op
++)
680 if (op
->pinfo
!= INSN_MACRO
&& (insn
& op
->mask
) == op
->match
)
684 if (strchr (op
->args
, 'a') != NULL
)
688 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
689 (unsigned int) extend
);
690 info
->insn_type
= dis_noninsn
;
698 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2,
703 if (info
->endian
== BFD_ENDIAN_BIG
)
704 extend
= bfd_getb16 (buffer
);
706 extend
= bfd_getl16 (buffer
);
711 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
712 if (op
->args
[0] != '\0')
713 (*info
->fprintf_func
) (info
->stream
, "\t");
715 for (s
= op
->args
; *s
!= '\0'; s
++)
719 && (((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)
720 == ((insn
>> MIPS16OP_SH_RY
) & MIPS16OP_MASK_RY
)))
722 /* Skip the register and the comma. */
728 && (((insn
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
)
729 == ((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)))
731 /* Skip the register and the comma. */
735 print_mips16_insn_arg (*s
, op
, insn
, use_extend
, extend
, memaddr
,
739 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
741 info
->branch_delay_insns
= 1;
742 if (info
->insn_type
!= dis_jsr
)
743 info
->insn_type
= dis_branch
;
751 (*info
->fprintf_func
) (info
->stream
, "0x%x", extend
| 0xf000);
752 (*info
->fprintf_func
) (info
->stream
, "0x%x", insn
);
753 info
->insn_type
= dis_noninsn
;
758 /* Disassemble an operand for a mips16 instruction. */
761 print_mips16_insn_arg (type
, op
, l
, use_extend
, extend
, memaddr
, info
)
763 const struct mips_opcode
*op
;
768 struct disassemble_info
*info
;
775 (*info
->fprintf_func
) (info
->stream
, "%c", type
);
780 (*info
->fprintf_func
) (info
->stream
, "%s",
781 mips16_reg_names
[((l
>> MIPS16OP_SH_RY
)
782 & MIPS16OP_MASK_RY
)]);
787 (*info
->fprintf_func
) (info
->stream
, "%s",
788 mips16_reg_names
[((l
>> MIPS16OP_SH_RX
)
789 & MIPS16OP_MASK_RX
)]);
793 (*info
->fprintf_func
) (info
->stream
, "%s",
794 mips16_reg_names
[((l
>> MIPS16OP_SH_RZ
)
795 & MIPS16OP_MASK_RZ
)]);
799 (*info
->fprintf_func
) (info
->stream
, "%s",
800 mips16_reg_names
[((l
>> MIPS16OP_SH_MOVE32Z
)
801 & MIPS16OP_MASK_MOVE32Z
)]);
805 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[0]);
809 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[29]);
813 (*info
->fprintf_func
) (info
->stream
, "$pc");
817 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[31]);
821 (*info
->fprintf_func
) (info
->stream
, "%s",
822 mips32_reg_names
[((l
>> MIPS16OP_SH_REGR32
)
823 & MIPS16OP_MASK_REGR32
)]);
827 (*info
->fprintf_func
) (info
->stream
, "%s",
828 mips32_reg_names
[MIPS16OP_EXTRACT_REG32R (l
)]);
854 int immed
, nbits
, shift
, signedp
, extbits
, pcrel
, extu
, branch
;
866 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
872 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
878 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
884 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
890 immed
= (l
>> MIPS16OP_SH_IMM4
) & MIPS16OP_MASK_IMM4
;
896 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
897 info
->insn_type
= dis_dref
;
903 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
904 info
->insn_type
= dis_dref
;
910 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
911 if ((op
->pinfo
& MIPS16_INSN_READ_PC
) == 0
912 && (op
->pinfo
& MIPS16_INSN_READ_SP
) == 0)
914 info
->insn_type
= dis_dref
;
921 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
922 info
->insn_type
= dis_dref
;
927 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
932 immed
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
936 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
941 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
942 /* FIXME: This might be lw, or it might be addiu to $sp or
943 $pc. We assume it's load. */
944 info
->insn_type
= dis_dref
;
950 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
951 info
->insn_type
= dis_dref
;
956 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
961 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
967 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
972 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
976 info
->insn_type
= dis_condbranch
;
980 immed
= (l
>> MIPS16OP_SH_IMM11
) & MIPS16OP_MASK_IMM11
;
984 info
->insn_type
= dis_branch
;
989 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
991 /* FIXME: This can be lw or la. We assume it is lw. */
992 info
->insn_type
= dis_dref
;
998 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1000 info
->insn_type
= dis_dref
;
1001 info
->data_size
= 8;
1006 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1015 if (signedp
&& immed
>= (1 << (nbits
- 1)))
1016 immed
-= 1 << nbits
;
1018 if ((type
== '<' || type
== '>' || type
== '[' || type
== ']')
1025 immed
|= ((extend
& 0x1f) << 11) | (extend
& 0x7e0);
1026 else if (extbits
== 15)
1027 immed
|= ((extend
& 0xf) << 11) | (extend
& 0x7f0);
1029 immed
= ((extend
>> 6) & 0x1f) | (extend
& 0x20);
1030 immed
&= (1 << extbits
) - 1;
1031 if (! extu
&& immed
>= (1 << (extbits
- 1)))
1032 immed
-= 1 << extbits
;
1036 (*info
->fprintf_func
) (info
->stream
, "%d", immed
);
1044 baseaddr
= memaddr
+ 2;
1046 else if (use_extend
)
1047 baseaddr
= memaddr
- 2;
1055 /* If this instruction is in the delay slot of a jr
1056 instruction, the base address is the address of the
1057 jr instruction. If it is in the delay slot of jalr
1058 instruction, the base address is the address of the
1059 jalr instruction. This test is unreliable: we have
1060 no way of knowing whether the previous word is
1061 instruction or data. */
1062 status
= (*info
->read_memory_func
) (memaddr
- 4, buffer
, 2,
1065 && (((info
->endian
== BFD_ENDIAN_BIG
1066 ? bfd_getb16 (buffer
)
1067 : bfd_getl16 (buffer
))
1068 & 0xf800) == 0x1800))
1069 baseaddr
= memaddr
- 4;
1072 status
= (*info
->read_memory_func
) (memaddr
- 2, buffer
,
1075 && (((info
->endian
== BFD_ENDIAN_BIG
1076 ? bfd_getb16 (buffer
)
1077 : bfd_getl16 (buffer
))
1078 & 0xf81f) == 0xe800))
1079 baseaddr
= memaddr
- 2;
1082 info
->target
= (baseaddr
& ~((1 << shift
) - 1)) + immed
;
1083 (*info
->print_address_func
) (info
->target
, info
);
1091 l
= ((l
& 0x1f) << 23) | ((l
& 0x3e0) << 13) | (extend
<< 2);
1092 info
->target
= ((memaddr
+ 4) & ~(bfd_vma
) 0x0fffffff) | l
;
1093 (*info
->print_address_func
) (info
->target
, info
);
1094 info
->insn_type
= dis_jsr
;
1095 info
->branch_delay_insns
= 1;
1101 int need_comma
, amask
, smask
;
1105 l
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1107 amask
= (l
>> 3) & 7;
1109 if (amask
> 0 && amask
< 5)
1111 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[4]);
1113 (*info
->fprintf_func
) (info
->stream
, "-%s",
1114 mips32_reg_names
[amask
+ 3]);
1118 smask
= (l
>> 1) & 3;
1121 (*info
->fprintf_func
) (info
->stream
, "%s??",
1122 need_comma
? "," : "");
1127 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1128 need_comma
? "," : "",
1129 mips32_reg_names
[16]);
1131 (*info
->fprintf_func
) (info
->stream
, "-%s",
1132 mips32_reg_names
[smask
+ 15]);
1138 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1139 need_comma
? "," : "",
1140 mips32_reg_names
[31]);
1144 if (amask
== 5 || amask
== 6)
1146 (*info
->fprintf_func
) (info
->stream
, "%s$f0",
1147 need_comma
? "," : "");
1149 (*info
->fprintf_func
) (info
->stream
, "-$f1");
1155 /* xgettext:c-format */
1156 (*info
->fprintf_func
)
1158 _("# internal disassembler error, unrecognised modifier (%c)"),
This page took 0.053887 seconds and 4 git commands to generate.