0a4280108da449257a9d7caa092c1fae42ce734b
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
;
115 (*info
->fprintf_func
) (info
->stream
, "%c", *d
);
122 (*info
->fprintf_func
) (info
->stream
, "%s",
123 reg_names
[(l
>> OP_SH_RS
) & OP_MASK_RS
]);
128 (*info
->fprintf_func
) (info
->stream
, "%s",
129 reg_names
[(l
>> OP_SH_RT
) & OP_MASK_RT
]);
134 (*info
->fprintf_func
) (info
->stream
, "0x%x",
135 (l
>> OP_SH_IMMEDIATE
) & OP_MASK_IMMEDIATE
);
138 case 'j': /* Same as i, but sign-extended. */
140 delta
= (l
>> OP_SH_DELTA
) & OP_MASK_DELTA
;
143 (*info
->fprintf_func
) (info
->stream
, "%d",
148 (*info
->fprintf_func
) (info
->stream
, "0x%x",
149 (unsigned int) ((l
>> OP_SH_PREFX
)
154 (*info
->fprintf_func
) (info
->stream
, "0x%x",
155 (unsigned int) ((l
>> OP_SH_CACHE
)
160 info
->target
= (((pc
+ 4) & ~(bfd_vma
) 0x0fffffff)
161 | (((l
>> OP_SH_TARGET
) & OP_MASK_TARGET
) << 2));
162 (*info
->print_address_func
) (info
->target
, info
);
166 /* Sign extend the displacement. */
167 delta
= (l
>> OP_SH_DELTA
) & OP_MASK_DELTA
;
170 info
->target
= (delta
<< 2) + pc
+ INSNLEN
;
171 (*info
->print_address_func
) (info
->target
, info
);
175 (*info
->fprintf_func
) (info
->stream
, "%s",
176 reg_names
[(l
>> OP_SH_RD
) & OP_MASK_RD
]);
181 /* First check for both rd and rt being equal. */
182 unsigned int reg
= (l
>> OP_SH_RD
) & OP_MASK_RD
;
183 if (reg
== ((l
>> OP_SH_RT
) & OP_MASK_RT
))
184 (*info
->fprintf_func
) (info
->stream
, "%s",
188 /* If one is zero use the other. */
190 (*info
->fprintf_func
) (info
->stream
, "%s",
191 reg_names
[(l
>> OP_SH_RT
) & OP_MASK_RT
]);
192 else if (((l
>> OP_SH_RT
) & OP_MASK_RT
) == 0)
193 (*info
->fprintf_func
) (info
->stream
, "%s",
195 else /* Bogus, result depends on processor. */
196 (*info
->fprintf_func
) (info
->stream
, "%s or %s",
198 reg_names
[(l
>> OP_SH_RT
) & OP_MASK_RT
]);
204 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[0]);
208 (*info
->fprintf_func
) (info
->stream
, "0x%x",
209 (l
>> OP_SH_SHAMT
) & OP_MASK_SHAMT
);
213 (*info
->fprintf_func
) (info
->stream
, "0x%x",
214 (l
>> OP_SH_CODE
) & OP_MASK_CODE
);
218 (*info
->fprintf_func
) (info
->stream
, "0x%x",
219 (l
>> OP_SH_CODE2
) & OP_MASK_CODE2
);
223 (*info
->fprintf_func
) (info
->stream
, "0x%x",
224 (l
>> OP_SH_COPZ
) & OP_MASK_COPZ
);
228 (*info
->fprintf_func
) (info
->stream
, "0x%x",
229 (l
>> OP_SH_CODE20
) & OP_MASK_CODE20
);
233 (*info
->fprintf_func
) (info
->stream
, "0x%x",
234 (l
>> OP_SH_CODE19
) & OP_MASK_CODE19
);
239 (*info
->fprintf_func
) (info
->stream
, "$f%d",
240 (l
>> OP_SH_FS
) & OP_MASK_FS
);
245 (*info
->fprintf_func
) (info
->stream
, "$f%d",
246 (l
>> OP_SH_FT
) & OP_MASK_FT
);
250 (*info
->fprintf_func
) (info
->stream
, "$f%d",
251 (l
>> OP_SH_FD
) & OP_MASK_FD
);
255 (*info
->fprintf_func
) (info
->stream
, "$f%d",
256 (l
>> OP_SH_FR
) & OP_MASK_FR
);
260 (*info
->fprintf_func
) (info
->stream
, "$%d",
261 (l
>> OP_SH_RT
) & OP_MASK_RT
);
265 (*info
->fprintf_func
) (info
->stream
, "$%d",
266 (l
>> OP_SH_RD
) & OP_MASK_RD
);
270 (*info
->fprintf_func
) (info
->stream
, "$fcc%d",
271 (l
>> OP_SH_BCC
) & OP_MASK_BCC
);
275 (*info
->fprintf_func
) (info
->stream
, "$fcc%d",
276 (l
>> OP_SH_CCC
) & OP_MASK_CCC
);
280 (*info
->fprintf_func
) (info
->stream
, "%d",
281 (l
>> OP_SH_PERFREG
) & OP_MASK_PERFREG
);
285 (*info
->fprintf_func
) (info
->stream
, "%d",
286 (l
>> OP_SH_VECBYTE
) & OP_MASK_VECBYTE
);
290 (*info
->fprintf_func
) (info
->stream
, "%d",
291 (l
>> OP_SH_VECALIGN
) & OP_MASK_VECALIGN
);
295 (*info
->fprintf_func
) (info
->stream
, "%d",
296 (l
>> OP_SH_SEL
) & OP_MASK_SEL
);
300 (*info
->fprintf_func
) (info
->stream
, "%d",
301 (l
>> OP_SH_ALN
) & OP_MASK_ALN
);
306 unsigned int vsel
= (l
>> OP_SH_VSEL
) & OP_MASK_VSEL
;
307 if ((vsel
& 0x10) == 0)
311 for (fmt
= 0; fmt
< 3; fmt
++, vsel
>>= 1)
314 (*info
->fprintf_func
) (info
->stream
, "$v%d[%d]",
315 (l
>> OP_SH_FT
) & OP_MASK_FT
,
318 else if ((vsel
& 0x08) == 0)
320 (*info
->fprintf_func
) (info
->stream
, "$v%d",
321 (l
>> OP_SH_FT
) & OP_MASK_FT
);
325 (*info
->fprintf_func
) (info
->stream
, "0x%x",
326 (l
>> OP_SH_FT
) & OP_MASK_FT
);
332 (*info
->fprintf_func
) (info
->stream
, "$v%d",
333 (l
>> OP_SH_FD
) & OP_MASK_FD
);
337 (*info
->fprintf_func
) (info
->stream
, "$v%d",
338 (l
>> OP_SH_FS
) & OP_MASK_FS
);
342 (*info
->fprintf_func
) (info
->stream
, "$v%d",
343 (l
>> OP_SH_FT
) & OP_MASK_FT
);
347 /* xgettext:c-format */
348 (*info
->fprintf_func
) (info
->stream
,
349 _("# internal error, undefined modifier(%c)"),
355 /* Figure out the MIPS ISA and CPU based on the machine number. */
358 mips_isa_type (mach
, isa
, cputype
)
365 case bfd_mach_mips3000
:
366 *cputype
= CPU_R3000
;
369 case bfd_mach_mips3900
:
370 *cputype
= CPU_R3900
;
373 case bfd_mach_mips4000
:
374 *cputype
= CPU_R4000
;
377 case bfd_mach_mips4010
:
378 *cputype
= CPU_R4010
;
381 case bfd_mach_mips4100
:
382 *cputype
= CPU_VR4100
;
385 case bfd_mach_mips4111
:
386 *cputype
= CPU_R4111
;
389 case bfd_mach_mips4120
:
390 *cputype
= CPU_VR4120
;
393 case bfd_mach_mips4300
:
394 *cputype
= CPU_R4300
;
397 case bfd_mach_mips4400
:
398 *cputype
= CPU_R4400
;
401 case bfd_mach_mips4600
:
402 *cputype
= CPU_R4600
;
405 case bfd_mach_mips4650
:
406 *cputype
= CPU_R4650
;
409 case bfd_mach_mips5000
:
410 *cputype
= CPU_R5000
;
413 case bfd_mach_mips5400
:
414 *cputype
= CPU_VR5400
;
417 case bfd_mach_mips5500
:
418 *cputype
= CPU_VR5500
;
421 case bfd_mach_mips6000
:
422 *cputype
= CPU_R6000
;
425 case bfd_mach_mips8000
:
426 *cputype
= CPU_R8000
;
429 case bfd_mach_mips10000
:
430 *cputype
= CPU_R10000
;
433 case bfd_mach_mips12000
:
434 *cputype
= CPU_R12000
;
437 case bfd_mach_mips16
:
438 *cputype
= CPU_MIPS16
;
439 *isa
= ISA_MIPS3
| INSN_MIPS16
;
442 *cputype
= CPU_MIPS5
;
445 case bfd_mach_mips_sb1
:
447 *isa
= ISA_MIPS64
| INSN_MIPS3D
| INSN_SB1
;
449 case bfd_mach_mipsisa32
:
450 *cputype
= CPU_MIPS32
;
451 /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
452 Note that MIPS-3D and MDMX are not applicable to MIPS32. (See
453 _MIPS32 Architecture For Programmers Volume I: Introduction to the
454 MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
456 *isa
= ISA_MIPS32
| INSN_MIPS16
;
458 case bfd_mach_mipsisa64
:
459 *cputype
= CPU_MIPS64
;
460 /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs. */
461 *isa
= ISA_MIPS64
| INSN_MIPS16
| INSN_MIPS3D
| INSN_MDMX
;
465 *cputype
= CPU_R3000
;
471 /* Check if the object uses NewABI conventions. */
475 Elf_Internal_Ehdr
*header
;
477 /* There are no old-style ABIs which use 64-bit ELF. */
478 if (header
->e_ident
[EI_CLASS
] == ELFCLASS64
)
481 /* If a 32-bit ELF file, n32 is a new-style ABI. */
482 if ((header
->e_flags
& EF_MIPS_ABI2
) != 0)
488 /* Print the mips instruction at address MEMADDR in debugged memory,
489 on using INFO. Returns length of the instruction, in bytes, which is
490 always INSNLEN. BIGENDIAN must be 1 if this is big-endian code, 0 if
491 this is little-endian code. */
494 print_insn_mips (memaddr
, word
, info
)
496 unsigned long int word
;
497 struct disassemble_info
*info
;
499 register const struct mips_opcode
*op
;
500 int target_processor
, mips_isa
;
501 static boolean init
= 0;
502 static const struct mips_opcode
*mips_hash
[OP_MASK_OP
+ 1];
504 /* Build a hash table to shorten the search time. */
509 for (i
= 0; i
<= OP_MASK_OP
; i
++)
511 for (op
= mips_opcodes
; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
513 if (op
->pinfo
== INSN_MACRO
)
515 if (i
== ((op
->match
>> OP_SH_OP
) & OP_MASK_OP
))
526 #if ! SYMTAB_AVAILABLE
527 /* This is running out on a target machine, not in a host tool.
528 FIXME: Where does mips_target_info come from? */
529 target_processor
= mips_target_info
.processor
;
530 mips_isa
= mips_target_info
.isa
;
532 mips_isa_type (info
->mach
, &mips_isa
, &target_processor
);
535 info
->bytes_per_chunk
= INSNLEN
;
536 info
->display_endian
= info
->endian
;
537 info
->insn_info_valid
= 1;
538 info
->branch_delay_insns
= 0;
540 info
->insn_type
= dis_nonbranch
;
544 op
= mips_hash
[(word
>> OP_SH_OP
) & OP_MASK_OP
];
547 for (; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
549 if (op
->pinfo
!= INSN_MACRO
&& (word
& op
->mask
) == op
->match
)
551 register const char *d
;
553 /* We always allow to disassemble the jalx instruction. */
554 if (! OPCODE_IS_MEMBER (op
, mips_isa
, target_processor
)
555 && strcmp (op
->name
, "jalx"))
558 /* Figure out instruction type and branch delay information. */
559 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
561 if ((info
->insn_type
& INSN_WRITE_GPR_31
) != 0)
562 info
->insn_type
= dis_jsr
;
564 info
->insn_type
= dis_branch
;
565 info
->branch_delay_insns
= 1;
567 else if ((op
->pinfo
& (INSN_COND_BRANCH_DELAY
568 | INSN_COND_BRANCH_LIKELY
)) != 0)
570 if ((info
->insn_type
& INSN_WRITE_GPR_31
) != 0)
571 info
->insn_type
= dis_condjsr
;
573 info
->insn_type
= dis_condbranch
;
574 info
->branch_delay_insns
= 1;
576 else if ((op
->pinfo
& (INSN_STORE_MEMORY
577 | INSN_LOAD_MEMORY_DELAY
)) != 0)
578 info
->insn_type
= dis_dref
;
580 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
583 if (d
!= NULL
&& *d
!= '\0')
585 (*info
->fprintf_func
) (info
->stream
, "\t");
586 for (; *d
!= '\0'; d
++)
587 print_insn_arg (d
, word
, memaddr
, info
);
595 /* Handle undefined instructions. */
596 info
->insn_type
= dis_noninsn
;
597 (*info
->fprintf_func
) (info
->stream
, "0x%x", word
);
601 /* In an environment where we do not know the symbol type of the
602 instruction we are forced to assume that the low order bit of the
603 instructions' address may mark it as a mips16 instruction. If we
604 are single stepping, or the pc is within the disassembled function,
605 this works. Otherwise, we need a clue. Sometimes. */
608 _print_insn_mips (memaddr
, info
, endianness
)
610 struct disassemble_info
*info
;
611 enum bfd_endian endianness
;
613 bfd_byte buffer
[INSNLEN
];
617 /* FIXME: If odd address, this is CLEARLY a mips 16 instruction. */
618 /* Only a few tools will work this way. */
620 return print_insn_mips16 (memaddr
, info
);
624 if (info
->mach
== bfd_mach_mips16
625 || (info
->flavour
== bfd_target_elf_flavour
626 && info
->symbols
!= NULL
627 && ((*(elf_symbol_type
**) info
->symbols
)->internal_elf_sym
.st_other
629 return print_insn_mips16 (memaddr
, info
);
632 /* Use mips64_reg_names for new ABI. */
633 reg_names
= mips32_reg_names
;
635 if (info
->flavour
== bfd_target_elf_flavour
&& info
->symbols
!= NULL
)
637 Elf_Internal_Ehdr
*header
;
639 header
= elf_elfheader (bfd_asymbol_bfd (*(info
->symbols
)));
640 if (is_newabi (header
))
641 reg_names
= mips64_reg_names
;
644 status
= (*info
->read_memory_func
) (memaddr
, buffer
, INSNLEN
, info
);
649 if (endianness
== BFD_ENDIAN_BIG
)
650 insn
= (unsigned long) bfd_getb32 (buffer
);
652 insn
= (unsigned long) bfd_getl32 (buffer
);
654 return print_insn_mips (memaddr
, insn
, info
);
658 (*info
->memory_error_func
) (status
, memaddr
, info
);
664 print_insn_big_mips (memaddr
, info
)
666 struct disassemble_info
*info
;
668 return _print_insn_mips (memaddr
, info
, BFD_ENDIAN_BIG
);
672 print_insn_little_mips (memaddr
, info
)
674 struct disassemble_info
*info
;
676 return _print_insn_mips (memaddr
, info
, BFD_ENDIAN_LITTLE
);
679 /* Disassemble mips16 instructions. */
682 print_insn_mips16 (memaddr
, info
)
684 struct disassemble_info
*info
;
692 const struct mips_opcode
*op
, *opend
;
694 info
->bytes_per_chunk
= 2;
695 info
->display_endian
= info
->endian
;
696 info
->insn_info_valid
= 1;
697 info
->branch_delay_insns
= 0;
699 info
->insn_type
= dis_nonbranch
;
703 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
706 (*info
->memory_error_func
) (status
, memaddr
, info
);
712 if (info
->endian
== BFD_ENDIAN_BIG
)
713 insn
= bfd_getb16 (buffer
);
715 insn
= bfd_getl16 (buffer
);
717 /* Handle the extend opcode specially. */
719 if ((insn
& 0xf800) == 0xf000)
722 extend
= insn
& 0x7ff;
726 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
729 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
730 (unsigned int) extend
);
731 (*info
->memory_error_func
) (status
, memaddr
, info
);
735 if (info
->endian
== BFD_ENDIAN_BIG
)
736 insn
= bfd_getb16 (buffer
);
738 insn
= bfd_getl16 (buffer
);
740 /* Check for an extend opcode followed by an extend opcode. */
741 if ((insn
& 0xf800) == 0xf000)
743 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
744 (unsigned int) extend
);
745 info
->insn_type
= dis_noninsn
;
752 /* FIXME: Should probably use a hash table on the major opcode here. */
754 opend
= mips16_opcodes
+ bfd_mips16_num_opcodes
;
755 for (op
= mips16_opcodes
; op
< opend
; op
++)
757 if (op
->pinfo
!= INSN_MACRO
&& (insn
& op
->mask
) == op
->match
)
761 if (strchr (op
->args
, 'a') != NULL
)
765 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
766 (unsigned int) extend
);
767 info
->insn_type
= dis_noninsn
;
775 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2,
780 if (info
->endian
== BFD_ENDIAN_BIG
)
781 extend
= bfd_getb16 (buffer
);
783 extend
= bfd_getl16 (buffer
);
788 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
789 if (op
->args
[0] != '\0')
790 (*info
->fprintf_func
) (info
->stream
, "\t");
792 for (s
= op
->args
; *s
!= '\0'; s
++)
796 && (((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)
797 == ((insn
>> MIPS16OP_SH_RY
) & MIPS16OP_MASK_RY
)))
799 /* Skip the register and the comma. */
805 && (((insn
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
)
806 == ((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)))
808 /* Skip the register and the comma. */
812 print_mips16_insn_arg (*s
, op
, insn
, use_extend
, extend
, memaddr
,
816 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
818 info
->branch_delay_insns
= 1;
819 if (info
->insn_type
!= dis_jsr
)
820 info
->insn_type
= dis_branch
;
828 (*info
->fprintf_func
) (info
->stream
, "0x%x", extend
| 0xf000);
829 (*info
->fprintf_func
) (info
->stream
, "0x%x", insn
);
830 info
->insn_type
= dis_noninsn
;
835 /* Disassemble an operand for a mips16 instruction. */
838 print_mips16_insn_arg (type
, op
, l
, use_extend
, extend
, memaddr
, info
)
840 const struct mips_opcode
*op
;
845 struct disassemble_info
*info
;
852 (*info
->fprintf_func
) (info
->stream
, "%c", type
);
857 (*info
->fprintf_func
) (info
->stream
, "%s",
858 mips16_reg_names
[((l
>> MIPS16OP_SH_RY
)
859 & MIPS16OP_MASK_RY
)]);
864 (*info
->fprintf_func
) (info
->stream
, "%s",
865 mips16_reg_names
[((l
>> MIPS16OP_SH_RX
)
866 & MIPS16OP_MASK_RX
)]);
870 (*info
->fprintf_func
) (info
->stream
, "%s",
871 mips16_reg_names
[((l
>> MIPS16OP_SH_RZ
)
872 & MIPS16OP_MASK_RZ
)]);
876 (*info
->fprintf_func
) (info
->stream
, "%s",
877 mips16_reg_names
[((l
>> MIPS16OP_SH_MOVE32Z
)
878 & MIPS16OP_MASK_MOVE32Z
)]);
882 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[0]);
886 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[29]);
890 (*info
->fprintf_func
) (info
->stream
, "$pc");
894 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[31]);
898 (*info
->fprintf_func
) (info
->stream
, "%s",
899 mips32_reg_names
[((l
>> MIPS16OP_SH_REGR32
)
900 & MIPS16OP_MASK_REGR32
)]);
904 (*info
->fprintf_func
) (info
->stream
, "%s",
905 mips32_reg_names
[MIPS16OP_EXTRACT_REG32R (l
)]);
931 int immed
, nbits
, shift
, signedp
, extbits
, pcrel
, extu
, branch
;
943 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
949 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
955 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
961 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
967 immed
= (l
>> MIPS16OP_SH_IMM4
) & MIPS16OP_MASK_IMM4
;
973 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
974 info
->insn_type
= dis_dref
;
980 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
981 info
->insn_type
= dis_dref
;
987 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
988 if ((op
->pinfo
& MIPS16_INSN_READ_PC
) == 0
989 && (op
->pinfo
& MIPS16_INSN_READ_SP
) == 0)
991 info
->insn_type
= dis_dref
;
998 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
999 info
->insn_type
= dis_dref
;
1000 info
->data_size
= 8;
1004 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1009 immed
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1013 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1018 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1019 /* FIXME: This might be lw, or it might be addiu to $sp or
1020 $pc. We assume it's load. */
1021 info
->insn_type
= dis_dref
;
1022 info
->data_size
= 4;
1027 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1028 info
->insn_type
= dis_dref
;
1029 info
->data_size
= 8;
1033 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1038 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1044 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1049 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1053 info
->insn_type
= dis_condbranch
;
1057 immed
= (l
>> MIPS16OP_SH_IMM11
) & MIPS16OP_MASK_IMM11
;
1061 info
->insn_type
= dis_branch
;
1066 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1068 /* FIXME: This can be lw or la. We assume it is lw. */
1069 info
->insn_type
= dis_dref
;
1070 info
->data_size
= 4;
1075 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1077 info
->insn_type
= dis_dref
;
1078 info
->data_size
= 8;
1083 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1092 if (signedp
&& immed
>= (1 << (nbits
- 1)))
1093 immed
-= 1 << nbits
;
1095 if ((type
== '<' || type
== '>' || type
== '[' || type
== ']')
1102 immed
|= ((extend
& 0x1f) << 11) | (extend
& 0x7e0);
1103 else if (extbits
== 15)
1104 immed
|= ((extend
& 0xf) << 11) | (extend
& 0x7f0);
1106 immed
= ((extend
>> 6) & 0x1f) | (extend
& 0x20);
1107 immed
&= (1 << extbits
) - 1;
1108 if (! extu
&& immed
>= (1 << (extbits
- 1)))
1109 immed
-= 1 << extbits
;
1113 (*info
->fprintf_func
) (info
->stream
, "%d", immed
);
1121 baseaddr
= memaddr
+ 2;
1123 else if (use_extend
)
1124 baseaddr
= memaddr
- 2;
1132 /* If this instruction is in the delay slot of a jr
1133 instruction, the base address is the address of the
1134 jr instruction. If it is in the delay slot of jalr
1135 instruction, the base address is the address of the
1136 jalr instruction. This test is unreliable: we have
1137 no way of knowing whether the previous word is
1138 instruction or data. */
1139 status
= (*info
->read_memory_func
) (memaddr
- 4, buffer
, 2,
1142 && (((info
->endian
== BFD_ENDIAN_BIG
1143 ? bfd_getb16 (buffer
)
1144 : bfd_getl16 (buffer
))
1145 & 0xf800) == 0x1800))
1146 baseaddr
= memaddr
- 4;
1149 status
= (*info
->read_memory_func
) (memaddr
- 2, buffer
,
1152 && (((info
->endian
== BFD_ENDIAN_BIG
1153 ? bfd_getb16 (buffer
)
1154 : bfd_getl16 (buffer
))
1155 & 0xf81f) == 0xe800))
1156 baseaddr
= memaddr
- 2;
1159 info
->target
= (baseaddr
& ~((1 << shift
) - 1)) + immed
;
1160 (*info
->print_address_func
) (info
->target
, info
);
1168 l
= ((l
& 0x1f) << 23) | ((l
& 0x3e0) << 13) | (extend
<< 2);
1169 info
->target
= ((memaddr
+ 4) & ~(bfd_vma
) 0x0fffffff) | l
;
1170 (*info
->print_address_func
) (info
->target
, info
);
1171 info
->insn_type
= dis_jsr
;
1172 info
->branch_delay_insns
= 1;
1178 int need_comma
, amask
, smask
;
1182 l
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1184 amask
= (l
>> 3) & 7;
1186 if (amask
> 0 && amask
< 5)
1188 (*info
->fprintf_func
) (info
->stream
, "%s", mips32_reg_names
[4]);
1190 (*info
->fprintf_func
) (info
->stream
, "-%s",
1191 mips32_reg_names
[amask
+ 3]);
1195 smask
= (l
>> 1) & 3;
1198 (*info
->fprintf_func
) (info
->stream
, "%s??",
1199 need_comma
? "," : "");
1204 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1205 need_comma
? "," : "",
1206 mips32_reg_names
[16]);
1208 (*info
->fprintf_func
) (info
->stream
, "-%s",
1209 mips32_reg_names
[smask
+ 15]);
1215 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1216 need_comma
? "," : "",
1217 mips32_reg_names
[31]);
1221 if (amask
== 5 || amask
== 6)
1223 (*info
->fprintf_func
) (info
->stream
, "%s$f0",
1224 need_comma
? "," : "");
1226 (*info
->fprintf_func
) (info
->stream
, "-$f1");
1232 /* xgettext:c-format */
1233 (*info
->fprintf_func
)
1235 _("# internal disassembler error, unrecognised modifier (%c)"),
This page took 0.056532 seconds and 3 git commands to generate.