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-vr5400 */
93 /* end-sanitize-vr5400 */
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-vr5400 */
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-vr5400 */
371 /* xgettext:c-format */
372 (*info
->fprintf_func
) (info
->stream
,
373 _("# internal error, undefined modifier(%c)"),
379 /* Print the mips instruction at address MEMADDR in debugged memory,
380 on using INFO. Returns length of the instruction, in bytes, which is
381 always 4. BIGENDIAN must be 1 if this is big-endian code, 0 if
382 this is little-endian code. */
386 static set_mips_isa_type(int mach
,int * isa
, int *cputype
)
390 /* start-sanitize-tx19 */
391 case bfd_mach_mips1900
:
392 target_processor
= 1900;
395 /* end-sanitize-tx19 */
396 case bfd_mach_mips3000
:
397 target_processor
= 3000;
400 case bfd_mach_mips3900
:
401 target_processor
= 3900;
404 case bfd_mach_mips4000
:
405 target_processor
= 4000;
408 case bfd_mach_mips4010
:
409 target_processor
= 4010;
412 case bfd_mach_mips4100
:
413 target_processor
= 4100;
416 case bfd_mach_mips4300
:
417 target_processor
= 4300;
420 /* start-sanitize-vr4320 */
421 case bfd_mach_mips4320
:
422 target_processor
= 4320;
425 /* end-sanitize-vr4320 */
426 case bfd_mach_mips4400
:
427 target_processor
= 4400;
430 case bfd_mach_mips4600
:
431 target_processor
= 4600;
434 case bfd_mach_mips4650
:
435 target_processor
= 4650;
438 /* start-sanitize-tx49 */
439 case bfd_mach_mips4900
:
440 target_processor
= 4900;
443 /* end-sanitize-tx49 */
444 case bfd_mach_mips5000
:
445 target_processor
= 5000;
448 /* start-sanitize-vr5400 */
449 case bfd_mach_mips5400
:
450 target_processor
= 5400;
453 /* end-sanitize-vr5400 */
454 /* start-sanitize-r5900 */
455 case bfd_mach_mips5900
:
456 target_processor
= 5900;
459 /* end-sanitize-r5900 */
460 case bfd_mach_mips6000
:
461 target_processor
= 6000;
464 case bfd_mach_mips8000
:
465 target_processor
= 8000;
468 case bfd_mach_mips10000
:
469 target_processor
= 10000;
472 case bfd_mach_mips16
:
473 target_processor
= 16;
477 target_processor
= 3000;
483 *cputype
= target_processor
;
486 #endif /* symbol table available */
489 _print_insn_mips (memaddr
, word
, info
)
491 unsigned long int word
;
492 struct disassemble_info
*info
;
494 register const struct mips_opcode
*op
;
495 int target_processor
, mips_isa
;
496 static boolean init
= 0;
497 static const struct mips_opcode
*mips_hash
[OP_MASK_OP
+ 1];
499 /* Build a hash table to shorten the search time. */
504 for (i
= 0; i
<= OP_MASK_OP
; i
++)
506 for (op
= mips_opcodes
; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
508 if (op
->pinfo
== INSN_MACRO
)
510 if (i
== ((op
->match
>> OP_SH_OP
) & OP_MASK_OP
))
520 #if ! SYMTAB_AVAILABLE
521 /* This is running out on a target machine, not in a host tool */
522 target_processor
= mips_target_info
.processor
;
523 mips_isa
= mips_target_info
.isa
;
525 set_mips_isa_type(info
->mach
,&target_processor
,&mips_isa
) ;
528 info
->bytes_per_chunk
= 4;
529 info
->display_endian
= info
->endian
;
531 op
= mips_hash
[(word
>> OP_SH_OP
) & OP_MASK_OP
];
534 for (; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
536 if (op
->pinfo
!= INSN_MACRO
&& (word
& op
->mask
) == op
->match
)
538 register const char *d
;
541 if ((op
->membership
& INSN_ISA
) == INSN_ISA1
)
543 else if ((op
->membership
& INSN_ISA
) == INSN_ISA2
)
545 else if ((op
->membership
& INSN_ISA
) == INSN_ISA3
)
547 else if ((op
->membership
& INSN_ISA
) == INSN_ISA4
)
552 if (insn_isa
> mips_isa
553 && (target_processor
== 4650
554 && op
->membership
& INSN_4650
) == 0
555 && (target_processor
== 4010
556 && op
->membership
& INSN_4010
) == 0
557 && (target_processor
== 4100
558 && op
->membership
& INSN_4100
) == 0
559 /* start-sanitize-vr4320 */
560 && (target_processor
== 4320
561 && op
->membership
& INSN_4320
) == 0
562 /* end-sanitize-vr4320 */
563 /* start-sanitize-vr5400 */
564 && (target_processor
== 5400
565 && op
->membership
& INSN_5400
) == 0
566 /* end-sanitize-vr5400 */
567 /* start-sanitize-r5900 */
568 && (target_processor
== 5900
569 && op
->membership
& INSN_5900
) == 0
570 /* end-sanitize-r5900 */
571 /* start-sanitize-tx49 */
572 && (target_processor
== 4900
573 && op
->membership
& INSN_4900
) == 0
574 /* end-sanitize-tx49 */
575 && (target_processor
== 3900
576 && op
->membership
& INSN_3900
) == 0)
579 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
582 if (d
!= NULL
&& *d
!= '\0')
584 /* start-sanitize-r5900 */
585 /* If this is an opcode completer, then do not emit
586 a tab after the opcode. */
587 if (*d
!= '&' && *d
!= ';')
588 /* end-sanitize-r5900 */
589 (*info
->fprintf_func
) (info
->stream
, "\t");
590 for (; *d
!= '\0'; d
++)
591 /* start-sanitize-r5900 */
592 /* If this is an escape character, go ahead and print the
593 next character in the arg string verbatim. */
597 (*info
->fprintf_func
) (info
->stream
, "%c", *d
);
600 /* end-sanitize-r5900 */
601 print_insn_arg (d
, word
, memaddr
, info
);
609 /* Handle undefined instructions. */
610 (*info
->fprintf_func
) (info
->stream
, "0x%x", word
);
615 /* In an environment where we do not know the symbol type of the instruction
616 we are forces to assumd the low order bit of the instructions address
617 may mark it as a mips16 instruction. If we are sincle stepping or the
618 pc is within the disassembled function, this works. Otherwise,
619 we need a clue. Sometimes.
624 print_insn_big_mips (memaddr
, info
)
626 struct disassemble_info
*info
;
632 /* FIXME: If odd address, this is CLEARLY a mips 16 instruction */
633 /* Only a few tools will work this way */
634 if (memaddr
& 0x01) return print_insn_mips16 (memaddr
, info
);
639 || (info
->flavour
== bfd_target_elf_flavour
640 && info
->symbols
!= NULL
641 && ((*(elf_symbol_type
**) info
->symbols
)->internal_elf_sym
.st_other
643 return print_insn_mips16 (memaddr
, info
);
646 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 4, info
);
648 return _print_insn_mips (memaddr
, (unsigned long) bfd_getb32 (buffer
),
652 (*info
->memory_error_func
) (status
, memaddr
, info
);
658 print_insn_little_mips (memaddr
, info
)
660 struct disassemble_info
*info
;
665 /* start-sanitize-sky */
668 /* bfd_mach_dvp_p is a macro which may evaluate its arguments more than
669 once. Since dvp_mach_type is a function, ensure it's only called
671 int mach
= dvp_info_mach_type (info
);
673 if (bfd_mach_dvp_p (info
->mach
)
674 || bfd_mach_dvp_p (mach
))
675 return print_insn_dvp (memaddr
, info
);
678 /* end-sanitize-sky */
681 if (memaddr
& 0x01) return print_insn_mips16 (memaddr
, info
);
686 || (info
->flavour
== bfd_target_elf_flavour
687 && info
->symbols
!= NULL
688 && ((*(elf_symbol_type
**) info
->symbols
)->internal_elf_sym
.st_other
690 return print_insn_mips16 (memaddr
, info
);
693 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 4, info
);
695 return _print_insn_mips (memaddr
, (unsigned long) bfd_getl32 (buffer
),
699 (*info
->memory_error_func
) (status
, memaddr
, info
);
704 /* Disassemble mips16 instructions. */
707 print_insn_mips16 (memaddr
, info
)
709 struct disassemble_info
*info
;
717 const struct mips_opcode
*op
, *opend
;
719 info
->bytes_per_chunk
= 2;
720 info
->display_endian
= info
->endian
;
722 info
->insn_info_valid
= 1;
723 info
->branch_delay_insns
= 0;
725 info
->insn_type
= dis_nonbranch
;
729 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
732 (*info
->memory_error_func
) (status
, memaddr
, info
);
738 if (info
->endian
== BFD_ENDIAN_BIG
)
739 insn
= bfd_getb16 (buffer
);
741 insn
= bfd_getl16 (buffer
);
743 /* Handle the extend opcode specially. */
745 if ((insn
& 0xf800) == 0xf000)
748 extend
= insn
& 0x7ff;
752 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
755 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
756 (unsigned int) extend
);
757 (*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 /* Check for an extend opcode followed by an extend opcode. */
767 if ((insn
& 0xf800) == 0xf000)
769 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
770 (unsigned int) extend
);
771 info
->insn_type
= dis_noninsn
;
778 /* FIXME: Should probably use a hash table on the major opcode here. */
780 opend
= mips16_opcodes
+ bfd_mips16_num_opcodes
;
781 for (op
= mips16_opcodes
; op
< opend
; op
++)
783 if (op
->pinfo
!= INSN_MACRO
&& (insn
& op
->mask
) == op
->match
)
787 if (strchr (op
->args
, 'a') != NULL
)
791 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
792 (unsigned int) extend
);
793 info
->insn_type
= dis_noninsn
;
801 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2,
806 if (info
->endian
== BFD_ENDIAN_BIG
)
807 extend
= bfd_getb16 (buffer
);
809 extend
= bfd_getl16 (buffer
);
814 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
815 if (op
->args
[0] != '\0')
816 (*info
->fprintf_func
) (info
->stream
, "\t");
818 for (s
= op
->args
; *s
!= '\0'; s
++)
822 && (((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)
823 == ((insn
>> MIPS16OP_SH_RY
) & MIPS16OP_MASK_RY
)))
825 /* Skip the register and the comma. */
831 && (((insn
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
)
832 == ((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)))
834 /* Skip the register and the comma. */
838 print_mips16_insn_arg (*s
, op
, insn
, use_extend
, extend
, memaddr
,
842 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
844 info
->branch_delay_insns
= 1;
845 if (info
->insn_type
!= dis_jsr
)
846 info
->insn_type
= dis_branch
;
854 (*info
->fprintf_func
) (info
->stream
, "0x%x", extend
| 0xf000);
855 (*info
->fprintf_func
) (info
->stream
, "0x%x", insn
);
856 info
->insn_type
= dis_noninsn
;
861 /* Disassemble an operand for a mips16 instruction. */
864 print_mips16_insn_arg (type
, op
, l
, use_extend
, extend
, memaddr
, info
)
866 const struct mips_opcode
*op
;
871 struct disassemble_info
*info
;
878 (*info
->fprintf_func
) (info
->stream
, "%c", type
);
883 (*info
->fprintf_func
) (info
->stream
, "$%s",
884 mips16_reg_names
[((l
>> MIPS16OP_SH_RY
)
885 & MIPS16OP_MASK_RY
)]);
890 (*info
->fprintf_func
) (info
->stream
, "$%s",
891 mips16_reg_names
[((l
>> MIPS16OP_SH_RX
)
892 & MIPS16OP_MASK_RX
)]);
896 (*info
->fprintf_func
) (info
->stream
, "$%s",
897 mips16_reg_names
[((l
>> MIPS16OP_SH_RZ
)
898 & MIPS16OP_MASK_RZ
)]);
902 (*info
->fprintf_func
) (info
->stream
, "$%s",
903 mips16_reg_names
[((l
>> MIPS16OP_SH_MOVE32Z
)
904 & MIPS16OP_MASK_MOVE32Z
)]);
908 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[0]);
912 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[29]);
916 (*info
->fprintf_func
) (info
->stream
, "$pc");
920 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[31]);
924 (*info
->fprintf_func
) (info
->stream
, "$%s",
925 reg_names
[((l
>> MIPS16OP_SH_REGR32
)
926 & MIPS16OP_MASK_REGR32
)]);
930 (*info
->fprintf_func
) (info
->stream
, "$%s",
931 reg_names
[MIPS16OP_EXTRACT_REG32R (l
)]);
957 int immed
, nbits
, shift
, signedp
, extbits
, pcrel
, extu
, branch
;
969 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
975 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
981 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
987 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
993 immed
= (l
>> MIPS16OP_SH_IMM4
) & MIPS16OP_MASK_IMM4
;
999 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1000 info
->insn_type
= dis_dref
;
1001 info
->data_size
= 1;
1006 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1007 info
->insn_type
= dis_dref
;
1008 info
->data_size
= 2;
1013 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1014 if ((op
->pinfo
& MIPS16_INSN_READ_PC
) == 0
1015 && (op
->pinfo
& MIPS16_INSN_READ_SP
) == 0)
1017 info
->insn_type
= dis_dref
;
1018 info
->data_size
= 4;
1024 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1025 info
->insn_type
= dis_dref
;
1026 info
->data_size
= 8;
1030 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1035 immed
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1039 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1044 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1045 /* FIXME: This might be lw, or it might be addiu to $sp or
1046 $pc. We assume it's load. */
1047 info
->insn_type
= dis_dref
;
1048 info
->data_size
= 4;
1053 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1054 info
->insn_type
= dis_dref
;
1055 info
->data_size
= 8;
1059 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1064 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1070 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1075 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1079 info
->insn_type
= dis_condbranch
;
1083 immed
= (l
>> MIPS16OP_SH_IMM11
) & MIPS16OP_MASK_IMM11
;
1087 info
->insn_type
= dis_branch
;
1092 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1094 /* FIXME: This can be lw or la. We assume it is lw. */
1095 info
->insn_type
= dis_dref
;
1096 info
->data_size
= 4;
1101 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1103 info
->insn_type
= dis_dref
;
1104 info
->data_size
= 8;
1109 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1118 if (signedp
&& immed
>= (1 << (nbits
- 1)))
1119 immed
-= 1 << nbits
;
1121 if ((type
== '<' || type
== '>' || type
== '[' || type
== ']')
1128 immed
|= ((extend
& 0x1f) << 11) | (extend
& 0x7e0);
1129 else if (extbits
== 15)
1130 immed
|= ((extend
& 0xf) << 11) | (extend
& 0x7f0);
1132 immed
= ((extend
>> 6) & 0x1f) | (extend
& 0x20);
1133 immed
&= (1 << extbits
) - 1;
1134 if (! extu
&& immed
>= (1 << (extbits
- 1)))
1135 immed
-= 1 << extbits
;
1139 (*info
->fprintf_func
) (info
->stream
, "%d", immed
);
1148 baseaddr
= memaddr
+ 2;
1150 else if (use_extend
)
1151 baseaddr
= memaddr
- 2;
1159 /* If this instruction is in the delay slot of a jr
1160 instruction, the base address is the address of the
1161 jr instruction. If it is in the delay slot of jalr
1162 instruction, the base address is the address of the
1163 jalr instruction. This test is unreliable: we have
1164 no way of knowing whether the previous word is
1165 instruction or data. */
1166 status
= (*info
->read_memory_func
) (memaddr
- 4, buffer
, 2,
1169 && (((info
->endian
== BFD_ENDIAN_BIG
1170 ? bfd_getb16 (buffer
)
1171 : bfd_getl16 (buffer
))
1172 & 0xf800) == 0x1800))
1173 baseaddr
= memaddr
- 4;
1176 status
= (*info
->read_memory_func
) (memaddr
- 2, buffer
,
1179 && (((info
->endian
== BFD_ENDIAN_BIG
1180 ? bfd_getb16 (buffer
)
1181 : bfd_getl16 (buffer
))
1182 & 0xf81f) == 0xe800))
1183 baseaddr
= memaddr
- 2;
1186 val
= (baseaddr
& ~ ((1 << shift
) - 1)) + immed
;
1187 (*info
->print_address_func
) (val
, info
);
1196 l
= ((l
& 0x1f) << 23) | ((l
& 0x3e0) << 13) | (extend
<< 2);
1197 (*info
->print_address_func
) ((memaddr
& 0xf0000000) | l
, info
);
1198 info
->insn_type
= dis_jsr
;
1199 info
->target
= (memaddr
& 0xf0000000) | l
;
1200 info
->branch_delay_insns
= 1;
1206 int need_comma
, amask
, smask
;
1210 l
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1212 amask
= (l
>> 3) & 7;
1214 if (amask
> 0 && amask
< 5)
1216 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[4]);
1218 (*info
->fprintf_func
) (info
->stream
, "-$%s",
1219 reg_names
[amask
+ 3]);
1223 smask
= (l
>> 1) & 3;
1226 (*info
->fprintf_func
) (info
->stream
, "%s??",
1227 need_comma
? "," : "");
1232 (*info
->fprintf_func
) (info
->stream
, "%s$%s",
1233 need_comma
? "," : "",
1236 (*info
->fprintf_func
) (info
->stream
, "-$%s",
1237 reg_names
[smask
+ 15]);
1243 (*info
->fprintf_func
) (info
->stream
, "%s$%s",
1244 need_comma
? "," : "",
1249 if (amask
== 5 || amask
== 6)
1251 (*info
->fprintf_func
) (info
->stream
, "%s$f0",
1252 need_comma
? "," : "");
1254 (*info
->fprintf_func
) (info
->stream
, "-$f1");
This page took 0.070351 seconds and 5 git commands to generate.