1 /* Print mips instructions for GDB, the GNU debugger, or for objdump.
2 Copyright (c) 1989, 91-97, 1998 Free Software Foundation, Inc.
3 Contributed by Nobuyuki Hikichi(hikichi@sra.co.jp).
5 This file is part of GDB, GAS, and the GNU binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
24 #include "opcode/mips.h"
27 /* FIXME: These are needed to figure out if the code is mips16 or
28 not. The low bit of the address is often a good indicator. No
29 symbol table is available when this code runs out in an embedded
30 system as when it is used for disassembler support in a monitor. */
32 #if !defined(EMBEDDED_ENV)
33 #define SYMTAB_AVAILABLE 1
38 static int print_insn_mips16
PARAMS ((bfd_vma
, struct disassemble_info
*));
39 static void print_mips16_insn_arg
40 PARAMS ((int, const struct mips_opcode
*, int, boolean
, int, bfd_vma
,
41 struct disassemble_info
*));
43 /* Mips instructions are never longer than this many bytes. */
46 static void print_insn_arg
PARAMS ((const char *, unsigned long, bfd_vma
,
47 struct disassemble_info
*));
48 static int _print_insn_mips
PARAMS ((bfd_vma
, unsigned long int,
49 struct disassemble_info
*));
52 /* FIXME: This should be shared with gdb somehow. */
53 #define REGISTER_NAMES \
54 { "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", \
55 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", \
56 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", \
57 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra", \
58 "sr", "lo", "hi", "bad", "cause","pc", \
59 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
60 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
61 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",\
62 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",\
63 "fsr", "fir", "fp", "inx", "rand", "tlblo","ctxt", "tlbhi",\
67 static CONST
char * CONST reg_names
[] = REGISTER_NAMES
;
69 /* The mips16 register names. */
70 static const char * const mips16_reg_names
[] =
72 "s0", "s1", "v0", "v1", "a0", "a1", "a2", "a3"
77 print_insn_arg (d
, l
, pc
, info
)
79 register unsigned long int l
;
81 struct disassemble_info
*info
;
90 /* start-sanitize-cygnus */
93 /* end-sanitize-cygnus */
94 /* start-sanitize-r5900 */
97 /* end-sanitize-r5900 */
98 (*info
->fprintf_func
) (info
->stream
, "%c", *d
);
105 (*info
->fprintf_func
) (info
->stream
, "$%s",
106 reg_names
[(l
>> OP_SH_RS
) & OP_MASK_RS
]);
111 (*info
->fprintf_func
) (info
->stream
, "$%s",
112 reg_names
[(l
>> OP_SH_RT
) & OP_MASK_RT
]);
117 (*info
->fprintf_func
) (info
->stream
, "0x%x",
118 (l
>> OP_SH_IMMEDIATE
) & OP_MASK_IMMEDIATE
);
121 case 'j': /* same as i, but sign-extended */
123 delta
= (l
>> OP_SH_DELTA
) & OP_MASK_DELTA
;
126 (*info
->fprintf_func
) (info
->stream
, "%d",
131 (*info
->fprintf_func
) (info
->stream
, "0x%x",
132 (unsigned int) ((l
>> OP_SH_PREFX
)
137 (*info
->fprintf_func
) (info
->stream
, "0x%x",
138 (unsigned int) ((l
>> OP_SH_CACHE
)
143 (*info
->print_address_func
)
144 (((pc
& 0xF0000000) | (((l
>> OP_SH_TARGET
) & OP_MASK_TARGET
) << 2)),
149 /* sign extend the displacement */
150 delta
= (l
>> OP_SH_DELTA
) & OP_MASK_DELTA
;
153 (*info
->print_address_func
)
154 ((delta
<< 2) + pc
+ 4,
159 (*info
->fprintf_func
) (info
->stream
, "$%s",
160 reg_names
[(l
>> OP_SH_RD
) & OP_MASK_RD
]);
164 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[0]);
168 (*info
->fprintf_func
) (info
->stream
, "0x%x",
169 (l
>> OP_SH_SHAMT
) & OP_MASK_SHAMT
);
173 (*info
->fprintf_func
) (info
->stream
, "0x%x",
174 (l
>> OP_SH_CODE
) & OP_MASK_CODE
);
179 (*info
->fprintf_func
) (info
->stream
, "0x%x",
180 (l
>> OP_SH_CODE2
) & OP_MASK_CODE2
);
184 (*info
->fprintf_func
) (info
->stream
, "0x%x",
185 (l
>> OP_SH_COPZ
) & OP_MASK_COPZ
);
189 (*info
->fprintf_func
) (info
->stream
, "0x%x",
190 (l
>> OP_SH_SYSCALL
) & OP_MASK_SYSCALL
);
195 (*info
->fprintf_func
) (info
->stream
, "$f%d",
196 (l
>> OP_SH_FS
) & OP_MASK_FS
);
199 /* start-sanitize-r5900 */
201 (*info
->fprintf_func
) (info
->stream
, "0x%x",
206 (*info
->fprintf_func
) (info
->stream
, "vi27");
210 (*info
->fprintf_func
) (info
->stream
, "vf%d",
211 (l
>> OP_SH_FT
) & OP_MASK_FT
);
214 (*info
->fprintf_func
) (info
->stream
, "vf%d",
215 (l
>> OP_SH_FS
) & OP_MASK_FS
);
218 (*info
->fprintf_func
) (info
->stream
, "vf%d",
219 (l
>> OP_SH_FD
) & OP_MASK_FD
);
223 (*info
->fprintf_func
) (info
->stream
, "vi%d",
224 (l
>> OP_SH_FT
) & OP_MASK_FT
);
227 (*info
->fprintf_func
) (info
->stream
, "vi%d",
228 (l
>> OP_SH_FS
) & OP_MASK_FS
);
231 (*info
->fprintf_func
) (info
->stream
, "vi%d",
232 (l
>> OP_SH_FD
) & OP_MASK_FD
);
236 (*info
->fprintf_func
) (info
->stream
, "vf%d",
237 (l
>> OP_SH_FT
) & OP_MASK_FT
);
238 switch ((l
>> 23) & 0x3)
241 (*info
->fprintf_func
) (info
->stream
, "x");
244 (*info
->fprintf_func
) (info
->stream
, "y");
247 (*info
->fprintf_func
) (info
->stream
, "z");
250 (*info
->fprintf_func
) (info
->stream
, "w");
258 (*info
->fprintf_func
) (info
->stream
, ".xyz\t");
262 (*info
->fprintf_func
) (info
->stream
, ".");
264 (*info
->fprintf_func
) (info
->stream
, "w");
266 (*info
->fprintf_func
) (info
->stream
, "x");
268 (*info
->fprintf_func
) (info
->stream
, "y");
270 (*info
->fprintf_func
) (info
->stream
, "z");
271 (*info
->fprintf_func
) (info
->stream
, "\t");
275 (*info
->fprintf_func
) (info
->stream
, "vf%d",
276 (l
>> OP_SH_FS
) & OP_MASK_FS
);
277 switch ((l
>> 21) & 0x3)
280 (*info
->fprintf_func
) (info
->stream
, "x");
283 (*info
->fprintf_func
) (info
->stream
, "y");
286 (*info
->fprintf_func
) (info
->stream
, "z");
289 (*info
->fprintf_func
) (info
->stream
, "w");
294 (*info
->fprintf_func
) (info
->stream
, "I");
298 (*info
->fprintf_func
) (info
->stream
, "Q");
302 (*info
->fprintf_func
) (info
->stream
, "R");
306 (*info
->fprintf_func
) (info
->stream
, "ACC");
310 delta
= (l
>> 6) & 0x7fff;
312 (*info
->print_address_func
) (delta
, info
);
315 /* end-sanitize-r5900 */
319 (*info
->fprintf_func
) (info
->stream
, "$f%d",
320 (l
>> OP_SH_FT
) & OP_MASK_FT
);
324 (*info
->fprintf_func
) (info
->stream
, "$f%d",
325 (l
>> OP_SH_FD
) & OP_MASK_FD
);
329 (*info
->fprintf_func
) (info
->stream
, "$f%d",
330 (l
>> OP_SH_FR
) & OP_MASK_FR
);
334 (*info
->fprintf_func
) (info
->stream
, "$%d",
335 (l
>> OP_SH_RT
) & OP_MASK_RT
);
339 (*info
->fprintf_func
) (info
->stream
, "$%d",
340 (l
>> OP_SH_RD
) & OP_MASK_RD
);
344 (*info
->fprintf_func
) (info
->stream
, "$fcc%d",
345 (l
>> OP_SH_BCC
) & OP_MASK_BCC
);
349 (*info
->fprintf_func
) (info
->stream
, "$fcc%d",
350 (l
>> OP_SH_CCC
) & OP_MASK_CCC
);
354 (*info
->fprintf_func
) (info
->stream
, "%d",
355 (l
>> OP_SH_PERFREG
) & OP_MASK_PERFREG
);
358 /* start-sanitize-cygnus */
360 (*info
->fprintf_func
) (info
->stream
, "%d",
361 (l
>> OP_SH_VECBYTE
) & OP_MASK_VECBYTE
);
365 (*info
->fprintf_func
) (info
->stream
, "%d",
366 (l
>> OP_SH_VECALIGN
) & OP_MASK_VECALIGN
);
368 /* end-sanitize-cygnus */
371 /* xgettext:c-format */
372 (*info
->fprintf_func
) (info
->stream
,
373 _("# internal error, undefined modifier(%c)"),
381 /* Figure out the MIPS ISA and CPU based on the machine number.
382 FIXME: What does this have to do with SYMTAB_AVAILABLE? */
385 set_mips_isa_type (mach
, isa
, cputype
)
390 int target_processor
= 0;
395 /* start-sanitize-tx19 */
396 case bfd_mach_mips1900
:
397 target_processor
= 1900;
400 /* end-sanitize-tx19 */
401 case bfd_mach_mips3000
:
402 target_processor
= 3000;
405 case bfd_mach_mips3900
:
406 target_processor
= 3900;
409 case bfd_mach_mips4000
:
410 target_processor
= 4000;
413 case bfd_mach_mips4010
:
414 target_processor
= 4010;
417 case bfd_mach_mips4100
:
418 target_processor
= 4100;
421 /* start-sanitize-vr4xxx */
422 case bfd_mach_mips4121
:
423 target_processor
= 4121;
426 /* end-sanitize-vr4xxx */
427 case bfd_mach_mips4300
:
428 target_processor
= 4300;
431 /* start-sanitize-vr4320 */
432 case bfd_mach_mips4320
:
433 target_processor
= 4320;
436 /* end-sanitize-vr4320 */
437 case bfd_mach_mips4400
:
438 target_processor
= 4400;
441 case bfd_mach_mips4600
:
442 target_processor
= 4600;
445 case bfd_mach_mips4650
:
446 target_processor
= 4650;
449 /* start-sanitize-tx49 */
450 case bfd_mach_mips4900
:
451 target_processor
= 4900;
454 /* end-sanitize-tx49 */
455 case bfd_mach_mips5000
:
456 target_processor
= 5000;
459 /* start-sanitize-cygnus */
460 case bfd_mach_mips5400
:
461 target_processor
= 5400;
464 /* end-sanitize-cygnus */
465 /* start-sanitize-r5900 */
466 case bfd_mach_mips5900
:
467 target_processor
= 5900;
470 /* end-sanitize-r5900 */
471 case bfd_mach_mips6000
:
472 target_processor
= 6000;
475 case bfd_mach_mips8000
:
476 target_processor
= 8000;
479 case bfd_mach_mips10000
:
480 target_processor
= 10000;
483 case bfd_mach_mips16
:
484 target_processor
= 16;
488 target_processor
= 3000;
495 *cputype
= target_processor
;
498 #endif /* SYMTAB_AVAILABLE */
500 /* Print the mips instruction at address MEMADDR in debugged memory,
501 on using INFO. Returns length of the instruction, in bytes, which is
502 always 4. BIGENDIAN must be 1 if this is big-endian code, 0 if
503 this is little-endian code. */
506 _print_insn_mips (memaddr
, word
, info
)
508 unsigned long int word
;
509 struct disassemble_info
*info
;
511 register const struct mips_opcode
*op
;
512 int target_processor
, mips_isa
;
513 static boolean init
= 0;
514 static const struct mips_opcode
*mips_hash
[OP_MASK_OP
+ 1];
516 /* Build a hash table to shorten the search time. */
521 for (i
= 0; i
<= OP_MASK_OP
; i
++)
523 for (op
= mips_opcodes
; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
525 if (op
->pinfo
== INSN_MACRO
)
527 if (i
== ((op
->match
>> OP_SH_OP
) & OP_MASK_OP
))
538 #if ! SYMTAB_AVAILABLE
539 /* This is running out on a target machine, not in a host tool.
540 FIXME: Where does mips_target_info come from? */
541 target_processor
= mips_target_info
.processor
;
542 mips_isa
= mips_target_info
.isa
;
544 set_mips_isa_type (info
->mach
, &mips_isa
, &target_processor
);
547 info
->bytes_per_chunk
= 4;
548 info
->display_endian
= info
->endian
;
550 op
= mips_hash
[(word
>> OP_SH_OP
) & OP_MASK_OP
];
553 for (; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
555 if (op
->pinfo
!= INSN_MACRO
&& (word
& op
->mask
) == op
->match
)
557 register const char *d
;
560 if ((op
->membership
& INSN_ISA
) == INSN_ISA1
)
562 else if ((op
->membership
& INSN_ISA
) == INSN_ISA2
)
564 else if ((op
->membership
& INSN_ISA
) == INSN_ISA3
)
566 else if ((op
->membership
& INSN_ISA
) == INSN_ISA4
)
571 if (insn_isa
> mips_isa
572 && (target_processor
== 4650
573 && op
->membership
& INSN_4650
) == 0
574 && (target_processor
== 4010
575 && op
->membership
& INSN_4010
) == 0
576 && (target_processor
== 4100
577 && op
->membership
& INSN_4100
) == 0
578 /* start-sanitize-vr4xxx */
579 && (target_processor
== 4121
580 && op
->membership
& INSN_4121
) == 0
581 /* end-sanitize-vr4xxx */
582 /* start-sanitize-vr4320 */
583 && (target_processor
== 4320
584 && op
->membership
& INSN_4320
) == 0
585 /* end-sanitize-vr4320 */
586 /* start-sanitize-cygnus */
587 && (target_processor
== 5400
588 && op
->membership
& INSN_5400
) == 0
589 /* end-sanitize-cygnus */
590 /* start-sanitize-r5900 */
591 && (target_processor
== 5900
592 && op
->membership
& INSN_5900
) == 0
593 /* end-sanitize-r5900 */
594 /* start-sanitize-tx49 */
595 && (target_processor
== 4900
596 && op
->membership
& INSN_4900
) == 0
597 /* end-sanitize-tx49 */
598 && (target_processor
== 3900
599 && op
->membership
& INSN_3900
) == 0)
602 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
605 if (d
!= NULL
&& *d
!= '\0')
607 /* start-sanitize-r5900 */
608 /* If this is an opcode completer, then do not emit
609 a tab after the opcode. */
610 if (*d
!= '&' && *d
!= ';')
611 /* end-sanitize-r5900 */
612 (*info
->fprintf_func
) (info
->stream
, "\t");
613 for (; *d
!= '\0'; d
++)
614 /* start-sanitize-r5900 */
615 /* If this is an escape character, go ahead and print the
616 next character in the arg string verbatim. */
620 (*info
->fprintf_func
) (info
->stream
, "%c", *d
);
623 /* end-sanitize-r5900 */
624 print_insn_arg (d
, word
, memaddr
, info
);
632 /* Handle undefined instructions. */
633 (*info
->fprintf_func
) (info
->stream
, "0x%x", word
);
638 /* In an environment where we do not know the symbol type of the
639 instruction we are forced to assume that the low order bit of the
640 instructions' address may mark it as a mips16 instruction. If we
641 are single stepping, or the pc is within the disassembled function,
642 this works. Otherwise, we need a clue. Sometimes. */
645 print_insn_big_mips (memaddr
, info
)
647 struct disassemble_info
*info
;
653 /* FIXME: If odd address, this is CLEARLY a mips 16 instruction. */
654 /* Only a few tools will work this way. */
656 return print_insn_mips16 (memaddr
, info
);
661 || (info
->flavour
== bfd_target_elf_flavour
662 && info
->symbols
!= NULL
663 && ((*(elf_symbol_type
**) info
->symbols
)->internal_elf_sym
.st_other
665 return print_insn_mips16 (memaddr
, info
);
668 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 4, info
);
670 return _print_insn_mips (memaddr
, (unsigned long) bfd_getb32 (buffer
),
674 (*info
->memory_error_func
) (status
, memaddr
, info
);
680 print_insn_little_mips (memaddr
, info
)
682 struct disassemble_info
*info
;
687 /* start-sanitize-sky */
690 /* bfd_mach_dvp_p is a macro which may evaluate its arguments more than
691 once. Since dvp_mach_type is a function, ensure it's only called
693 int mach
= dvp_info_mach_type (info
);
695 if (bfd_mach_dvp_p (info
->mach
)
696 || bfd_mach_dvp_p (mach
))
697 return print_insn_dvp (memaddr
, info
);
700 /* end-sanitize-sky */
704 return print_insn_mips16 (memaddr
, info
);
709 || (info
->flavour
== bfd_target_elf_flavour
710 && info
->symbols
!= NULL
711 && ((*(elf_symbol_type
**) info
->symbols
)->internal_elf_sym
.st_other
713 return print_insn_mips16 (memaddr
, info
);
716 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 4, info
);
718 return _print_insn_mips (memaddr
, (unsigned long) bfd_getl32 (buffer
),
722 (*info
->memory_error_func
) (status
, memaddr
, info
);
727 /* Disassemble mips16 instructions. */
730 print_insn_mips16 (memaddr
, info
)
732 struct disassemble_info
*info
;
740 const struct mips_opcode
*op
, *opend
;
742 info
->bytes_per_chunk
= 2;
743 info
->display_endian
= info
->endian
;
745 info
->insn_info_valid
= 1;
746 info
->branch_delay_insns
= 0;
748 info
->insn_type
= dis_nonbranch
;
752 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
755 (*info
->memory_error_func
) (status
, memaddr
, info
);
761 if (info
->endian
== BFD_ENDIAN_BIG
)
762 insn
= bfd_getb16 (buffer
);
764 insn
= bfd_getl16 (buffer
);
766 /* Handle the extend opcode specially. */
768 if ((insn
& 0xf800) == 0xf000)
771 extend
= insn
& 0x7ff;
775 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
778 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
779 (unsigned int) extend
);
780 (*info
->memory_error_func
) (status
, memaddr
, info
);
784 if (info
->endian
== BFD_ENDIAN_BIG
)
785 insn
= bfd_getb16 (buffer
);
787 insn
= bfd_getl16 (buffer
);
789 /* Check for an extend opcode followed by an extend opcode. */
790 if ((insn
& 0xf800) == 0xf000)
792 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
793 (unsigned int) extend
);
794 info
->insn_type
= dis_noninsn
;
801 /* FIXME: Should probably use a hash table on the major opcode here. */
803 opend
= mips16_opcodes
+ bfd_mips16_num_opcodes
;
804 for (op
= mips16_opcodes
; op
< opend
; op
++)
806 if (op
->pinfo
!= INSN_MACRO
&& (insn
& op
->mask
) == op
->match
)
810 if (strchr (op
->args
, 'a') != NULL
)
814 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
815 (unsigned int) extend
);
816 info
->insn_type
= dis_noninsn
;
824 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2,
829 if (info
->endian
== BFD_ENDIAN_BIG
)
830 extend
= bfd_getb16 (buffer
);
832 extend
= bfd_getl16 (buffer
);
837 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
838 if (op
->args
[0] != '\0')
839 (*info
->fprintf_func
) (info
->stream
, "\t");
841 for (s
= op
->args
; *s
!= '\0'; s
++)
845 && (((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)
846 == ((insn
>> MIPS16OP_SH_RY
) & MIPS16OP_MASK_RY
)))
848 /* Skip the register and the comma. */
854 && (((insn
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
)
855 == ((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)))
857 /* Skip the register and the comma. */
861 print_mips16_insn_arg (*s
, op
, insn
, use_extend
, extend
, memaddr
,
865 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
867 info
->branch_delay_insns
= 1;
868 if (info
->insn_type
!= dis_jsr
)
869 info
->insn_type
= dis_branch
;
877 (*info
->fprintf_func
) (info
->stream
, "0x%x", extend
| 0xf000);
878 (*info
->fprintf_func
) (info
->stream
, "0x%x", insn
);
879 info
->insn_type
= dis_noninsn
;
884 /* Disassemble an operand for a mips16 instruction. */
887 print_mips16_insn_arg (type
, op
, l
, use_extend
, extend
, memaddr
, info
)
889 const struct mips_opcode
*op
;
894 struct disassemble_info
*info
;
901 (*info
->fprintf_func
) (info
->stream
, "%c", type
);
906 (*info
->fprintf_func
) (info
->stream
, "$%s",
907 mips16_reg_names
[((l
>> MIPS16OP_SH_RY
)
908 & MIPS16OP_MASK_RY
)]);
913 (*info
->fprintf_func
) (info
->stream
, "$%s",
914 mips16_reg_names
[((l
>> MIPS16OP_SH_RX
)
915 & MIPS16OP_MASK_RX
)]);
919 (*info
->fprintf_func
) (info
->stream
, "$%s",
920 mips16_reg_names
[((l
>> MIPS16OP_SH_RZ
)
921 & MIPS16OP_MASK_RZ
)]);
925 (*info
->fprintf_func
) (info
->stream
, "$%s",
926 mips16_reg_names
[((l
>> MIPS16OP_SH_MOVE32Z
)
927 & MIPS16OP_MASK_MOVE32Z
)]);
931 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[0]);
935 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[29]);
939 (*info
->fprintf_func
) (info
->stream
, "$pc");
943 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[31]);
947 (*info
->fprintf_func
) (info
->stream
, "$%s",
948 reg_names
[((l
>> MIPS16OP_SH_REGR32
)
949 & MIPS16OP_MASK_REGR32
)]);
953 (*info
->fprintf_func
) (info
->stream
, "$%s",
954 reg_names
[MIPS16OP_EXTRACT_REG32R (l
)]);
980 int immed
, nbits
, shift
, signedp
, extbits
, pcrel
, extu
, branch
;
992 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
998 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
1004 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
1010 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
1016 immed
= (l
>> MIPS16OP_SH_IMM4
) & MIPS16OP_MASK_IMM4
;
1022 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1023 info
->insn_type
= dis_dref
;
1024 info
->data_size
= 1;
1029 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1030 info
->insn_type
= dis_dref
;
1031 info
->data_size
= 2;
1036 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1037 if ((op
->pinfo
& MIPS16_INSN_READ_PC
) == 0
1038 && (op
->pinfo
& MIPS16_INSN_READ_SP
) == 0)
1040 info
->insn_type
= dis_dref
;
1041 info
->data_size
= 4;
1047 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1048 info
->insn_type
= dis_dref
;
1049 info
->data_size
= 8;
1053 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1058 immed
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1062 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1067 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1068 /* FIXME: This might be lw, or it might be addiu to $sp or
1069 $pc. We assume it's load. */
1070 info
->insn_type
= dis_dref
;
1071 info
->data_size
= 4;
1076 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1077 info
->insn_type
= dis_dref
;
1078 info
->data_size
= 8;
1082 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1087 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1093 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1098 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1102 info
->insn_type
= dis_condbranch
;
1106 immed
= (l
>> MIPS16OP_SH_IMM11
) & MIPS16OP_MASK_IMM11
;
1110 info
->insn_type
= dis_branch
;
1115 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1117 /* FIXME: This can be lw or la. We assume it is lw. */
1118 info
->insn_type
= dis_dref
;
1119 info
->data_size
= 4;
1124 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1126 info
->insn_type
= dis_dref
;
1127 info
->data_size
= 8;
1132 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1141 if (signedp
&& immed
>= (1 << (nbits
- 1)))
1142 immed
-= 1 << nbits
;
1144 if ((type
== '<' || type
== '>' || type
== '[' || type
== ']')
1151 immed
|= ((extend
& 0x1f) << 11) | (extend
& 0x7e0);
1152 else if (extbits
== 15)
1153 immed
|= ((extend
& 0xf) << 11) | (extend
& 0x7f0);
1155 immed
= ((extend
>> 6) & 0x1f) | (extend
& 0x20);
1156 immed
&= (1 << extbits
) - 1;
1157 if (! extu
&& immed
>= (1 << (extbits
- 1)))
1158 immed
-= 1 << extbits
;
1162 (*info
->fprintf_func
) (info
->stream
, "%d", immed
);
1171 baseaddr
= memaddr
+ 2;
1173 else if (use_extend
)
1174 baseaddr
= memaddr
- 2;
1182 /* If this instruction is in the delay slot of a jr
1183 instruction, the base address is the address of the
1184 jr instruction. If it is in the delay slot of jalr
1185 instruction, the base address is the address of the
1186 jalr instruction. This test is unreliable: we have
1187 no way of knowing whether the previous word is
1188 instruction or data. */
1189 status
= (*info
->read_memory_func
) (memaddr
- 4, buffer
, 2,
1192 && (((info
->endian
== BFD_ENDIAN_BIG
1193 ? bfd_getb16 (buffer
)
1194 : bfd_getl16 (buffer
))
1195 & 0xf800) == 0x1800))
1196 baseaddr
= memaddr
- 4;
1199 status
= (*info
->read_memory_func
) (memaddr
- 2, buffer
,
1202 && (((info
->endian
== BFD_ENDIAN_BIG
1203 ? bfd_getb16 (buffer
)
1204 : bfd_getl16 (buffer
))
1205 & 0xf81f) == 0xe800))
1206 baseaddr
= memaddr
- 2;
1209 val
= (baseaddr
& ~ ((1 << shift
) - 1)) + immed
;
1210 (*info
->print_address_func
) (val
, info
);
1219 l
= ((l
& 0x1f) << 23) | ((l
& 0x3e0) << 13) | (extend
<< 2);
1220 (*info
->print_address_func
) ((memaddr
& 0xf0000000) | l
, info
);
1221 info
->insn_type
= dis_jsr
;
1222 info
->target
= (memaddr
& 0xf0000000) | l
;
1223 info
->branch_delay_insns
= 1;
1229 int need_comma
, amask
, smask
;
1233 l
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1235 amask
= (l
>> 3) & 7;
1237 if (amask
> 0 && amask
< 5)
1239 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[4]);
1241 (*info
->fprintf_func
) (info
->stream
, "-$%s",
1242 reg_names
[amask
+ 3]);
1246 smask
= (l
>> 1) & 3;
1249 (*info
->fprintf_func
) (info
->stream
, "%s??",
1250 need_comma
? "," : "");
1255 (*info
->fprintf_func
) (info
->stream
, "%s$%s",
1256 need_comma
? "," : "",
1259 (*info
->fprintf_func
) (info
->stream
, "-$%s",
1260 reg_names
[smask
+ 15]);
1266 (*info
->fprintf_func
) (info
->stream
, "%s$%s",
1267 need_comma
? "," : "",
1272 if (amask
== 5 || amask
== 6)
1274 (*info
->fprintf_func
) (info
->stream
, "%s$f0",
1275 need_comma
? "," : "");
1277 (*info
->fprintf_func
) (info
->stream
, "-$f1");