52efafe38b44ae80d84daebb056e0d09e239004c
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)"),
384 void set_mips_isa_type (int mach
, int * isa
, int *cputype
)
386 int target_processor
= 0 ;
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
;
485 #endif /* symbol table available */
487 /* Print the mips instruction at address MEMADDR in debugged memory,
488 on using INFO. Returns length of the instruction, in bytes, which is
489 always 4. BIGENDIAN must be 1 if this is big-endian code, 0 if
490 this is little-endian code. */
493 _print_insn_mips (memaddr
, word
, info
)
495 unsigned long int word
;
496 struct disassemble_info
*info
;
498 register const struct mips_opcode
*op
;
499 int target_processor
, mips_isa
;
500 static boolean init
= 0;
501 static const struct mips_opcode
*mips_hash
[OP_MASK_OP
+ 1];
503 /* Build a hash table to shorten the search time. */
508 for (i
= 0; i
<= OP_MASK_OP
; i
++)
510 for (op
= mips_opcodes
; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
512 if (op
->pinfo
== INSN_MACRO
)
514 if (i
== ((op
->match
>> OP_SH_OP
) & OP_MASK_OP
))
524 #if ! SYMTAB_AVAILABLE
525 /* This is running out on a target machine, not in a host tool */
526 target_processor
= mips_target_info
.processor
;
527 mips_isa
= mips_target_info
.isa
;
529 set_mips_isa_type(info
->mach
, &target_processor
, &mips_isa
) ;
532 info
->bytes_per_chunk
= 4;
533 info
->display_endian
= info
->endian
;
535 op
= mips_hash
[(word
>> OP_SH_OP
) & OP_MASK_OP
];
538 for (; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
540 if (op
->pinfo
!= INSN_MACRO
&& (word
& op
->mask
) == op
->match
)
542 register const char *d
;
545 if ((op
->membership
& INSN_ISA
) == INSN_ISA1
)
547 else if ((op
->membership
& INSN_ISA
) == INSN_ISA2
)
549 else if ((op
->membership
& INSN_ISA
) == INSN_ISA3
)
551 else if ((op
->membership
& INSN_ISA
) == INSN_ISA4
)
556 if (insn_isa
> mips_isa
557 && (target_processor
== 4650
558 && op
->membership
& INSN_4650
) == 0
559 && (target_processor
== 4010
560 && op
->membership
& INSN_4010
) == 0
561 && (target_processor
== 4100
562 && op
->membership
& INSN_4100
) == 0
563 /* start-sanitize-vr4320 */
564 && (target_processor
== 4320
565 && op
->membership
& INSN_4320
) == 0
566 /* end-sanitize-vr4320 */
567 /* start-sanitize-vr5400 */
568 && (target_processor
== 5400
569 && op
->membership
& INSN_5400
) == 0
570 /* end-sanitize-vr5400 */
571 /* start-sanitize-r5900 */
572 && (target_processor
== 5900
573 && op
->membership
& INSN_5900
) == 0
574 /* end-sanitize-r5900 */
575 /* start-sanitize-tx49 */
576 && (target_processor
== 4900
577 && op
->membership
& INSN_4900
) == 0
578 /* end-sanitize-tx49 */
579 && (target_processor
== 3900
580 && op
->membership
& INSN_3900
) == 0)
583 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
586 if (d
!= NULL
&& *d
!= '\0')
588 /* start-sanitize-r5900 */
589 /* If this is an opcode completer, then do not emit
590 a tab after the opcode. */
591 if (*d
!= '&' && *d
!= ';')
592 /* end-sanitize-r5900 */
593 (*info
->fprintf_func
) (info
->stream
, "\t");
594 for (; *d
!= '\0'; d
++)
595 /* start-sanitize-r5900 */
596 /* If this is an escape character, go ahead and print the
597 next character in the arg string verbatim. */
601 (*info
->fprintf_func
) (info
->stream
, "%c", *d
);
604 /* end-sanitize-r5900 */
605 print_insn_arg (d
, word
, memaddr
, info
);
613 /* Handle undefined instructions. */
614 (*info
->fprintf_func
) (info
->stream
, "0x%x", word
);
619 /* In an environment where we do not know the symbol type of the instruction
620 we are forces to assumd the low order bit of the instructions address
621 may mark it as a mips16 instruction. If we are sincle stepping or the
622 pc is within the disassembled function, this works. Otherwise,
623 we need a clue. Sometimes. */
627 print_insn_big_mips (memaddr
, info
)
629 struct disassemble_info
*info
;
635 /* FIXME: If odd address, this is CLEARLY a mips 16 instruction */
636 /* Only a few tools will work this way */
638 return print_insn_mips16 (memaddr
, info
);
643 || (info
->flavour
== bfd_target_elf_flavour
644 && info
->symbols
!= NULL
645 && ((*(elf_symbol_type
**) info
->symbols
)->internal_elf_sym
.st_other
647 return print_insn_mips16 (memaddr
, info
);
650 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 4, info
);
652 return _print_insn_mips (memaddr
, (unsigned long) bfd_getb32 (buffer
),
656 (*info
->memory_error_func
) (status
, memaddr
, info
);
662 print_insn_little_mips (memaddr
, info
)
664 struct disassemble_info
*info
;
669 /* start-sanitize-sky */
672 /* bfd_mach_dvp_p is a macro which may evaluate its arguments more than
673 once. Since dvp_mach_type is a function, ensure it's only called
675 int mach
= dvp_info_mach_type (info
);
677 if (bfd_mach_dvp_p (info
->mach
)
678 || bfd_mach_dvp_p (mach
))
679 return print_insn_dvp (memaddr
, info
);
682 /* end-sanitize-sky */
685 if (memaddr
& 0x01) return print_insn_mips16 (memaddr
, info
);
690 || (info
->flavour
== bfd_target_elf_flavour
691 && info
->symbols
!= NULL
692 && ((*(elf_symbol_type
**) info
->symbols
)->internal_elf_sym
.st_other
694 return print_insn_mips16 (memaddr
, info
);
697 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 4, info
);
699 return _print_insn_mips (memaddr
, (unsigned long) bfd_getl32 (buffer
),
703 (*info
->memory_error_func
) (status
, memaddr
, info
);
708 /* Disassemble mips16 instructions. */
711 print_insn_mips16 (memaddr
, info
)
713 struct disassemble_info
*info
;
721 const struct mips_opcode
*op
, *opend
;
723 info
->bytes_per_chunk
= 2;
724 info
->display_endian
= info
->endian
;
726 info
->insn_info_valid
= 1;
727 info
->branch_delay_insns
= 0;
729 info
->insn_type
= dis_nonbranch
;
733 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
736 (*info
->memory_error_func
) (status
, memaddr
, info
);
742 if (info
->endian
== BFD_ENDIAN_BIG
)
743 insn
= bfd_getb16 (buffer
);
745 insn
= bfd_getl16 (buffer
);
747 /* Handle the extend opcode specially. */
749 if ((insn
& 0xf800) == 0xf000)
752 extend
= insn
& 0x7ff;
756 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
759 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
760 (unsigned int) extend
);
761 (*info
->memory_error_func
) (status
, memaddr
, info
);
765 if (info
->endian
== BFD_ENDIAN_BIG
)
766 insn
= bfd_getb16 (buffer
);
768 insn
= bfd_getl16 (buffer
);
770 /* Check for an extend opcode followed by an extend opcode. */
771 if ((insn
& 0xf800) == 0xf000)
773 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
774 (unsigned int) extend
);
775 info
->insn_type
= dis_noninsn
;
782 /* FIXME: Should probably use a hash table on the major opcode here. */
784 opend
= mips16_opcodes
+ bfd_mips16_num_opcodes
;
785 for (op
= mips16_opcodes
; op
< opend
; op
++)
787 if (op
->pinfo
!= INSN_MACRO
&& (insn
& op
->mask
) == op
->match
)
791 if (strchr (op
->args
, 'a') != NULL
)
795 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
796 (unsigned int) extend
);
797 info
->insn_type
= dis_noninsn
;
805 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2,
810 if (info
->endian
== BFD_ENDIAN_BIG
)
811 extend
= bfd_getb16 (buffer
);
813 extend
= bfd_getl16 (buffer
);
818 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
819 if (op
->args
[0] != '\0')
820 (*info
->fprintf_func
) (info
->stream
, "\t");
822 for (s
= op
->args
; *s
!= '\0'; s
++)
826 && (((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)
827 == ((insn
>> MIPS16OP_SH_RY
) & MIPS16OP_MASK_RY
)))
829 /* Skip the register and the comma. */
835 && (((insn
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
)
836 == ((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)))
838 /* Skip the register and the comma. */
842 print_mips16_insn_arg (*s
, op
, insn
, use_extend
, extend
, memaddr
,
846 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
848 info
->branch_delay_insns
= 1;
849 if (info
->insn_type
!= dis_jsr
)
850 info
->insn_type
= dis_branch
;
858 (*info
->fprintf_func
) (info
->stream
, "0x%x", extend
| 0xf000);
859 (*info
->fprintf_func
) (info
->stream
, "0x%x", insn
);
860 info
->insn_type
= dis_noninsn
;
865 /* Disassemble an operand for a mips16 instruction. */
868 print_mips16_insn_arg (type
, op
, l
, use_extend
, extend
, memaddr
, info
)
870 const struct mips_opcode
*op
;
875 struct disassemble_info
*info
;
882 (*info
->fprintf_func
) (info
->stream
, "%c", type
);
887 (*info
->fprintf_func
) (info
->stream
, "$%s",
888 mips16_reg_names
[((l
>> MIPS16OP_SH_RY
)
889 & MIPS16OP_MASK_RY
)]);
894 (*info
->fprintf_func
) (info
->stream
, "$%s",
895 mips16_reg_names
[((l
>> MIPS16OP_SH_RX
)
896 & MIPS16OP_MASK_RX
)]);
900 (*info
->fprintf_func
) (info
->stream
, "$%s",
901 mips16_reg_names
[((l
>> MIPS16OP_SH_RZ
)
902 & MIPS16OP_MASK_RZ
)]);
906 (*info
->fprintf_func
) (info
->stream
, "$%s",
907 mips16_reg_names
[((l
>> MIPS16OP_SH_MOVE32Z
)
908 & MIPS16OP_MASK_MOVE32Z
)]);
912 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[0]);
916 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[29]);
920 (*info
->fprintf_func
) (info
->stream
, "$pc");
924 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[31]);
928 (*info
->fprintf_func
) (info
->stream
, "$%s",
929 reg_names
[((l
>> MIPS16OP_SH_REGR32
)
930 & MIPS16OP_MASK_REGR32
)]);
934 (*info
->fprintf_func
) (info
->stream
, "$%s",
935 reg_names
[MIPS16OP_EXTRACT_REG32R (l
)]);
961 int immed
, nbits
, shift
, signedp
, extbits
, pcrel
, extu
, branch
;
973 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
979 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
985 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
991 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
997 immed
= (l
>> MIPS16OP_SH_IMM4
) & MIPS16OP_MASK_IMM4
;
1003 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1004 info
->insn_type
= dis_dref
;
1005 info
->data_size
= 1;
1010 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1011 info
->insn_type
= dis_dref
;
1012 info
->data_size
= 2;
1017 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1018 if ((op
->pinfo
& MIPS16_INSN_READ_PC
) == 0
1019 && (op
->pinfo
& MIPS16_INSN_READ_SP
) == 0)
1021 info
->insn_type
= dis_dref
;
1022 info
->data_size
= 4;
1028 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1029 info
->insn_type
= dis_dref
;
1030 info
->data_size
= 8;
1034 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1039 immed
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1043 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1048 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1049 /* FIXME: This might be lw, or it might be addiu to $sp or
1050 $pc. We assume it's load. */
1051 info
->insn_type
= dis_dref
;
1052 info
->data_size
= 4;
1057 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1058 info
->insn_type
= dis_dref
;
1059 info
->data_size
= 8;
1063 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1068 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1074 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1079 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1083 info
->insn_type
= dis_condbranch
;
1087 immed
= (l
>> MIPS16OP_SH_IMM11
) & MIPS16OP_MASK_IMM11
;
1091 info
->insn_type
= dis_branch
;
1096 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
1098 /* FIXME: This can be lw or la. We assume it is lw. */
1099 info
->insn_type
= dis_dref
;
1100 info
->data_size
= 4;
1105 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1107 info
->insn_type
= dis_dref
;
1108 info
->data_size
= 8;
1113 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
1122 if (signedp
&& immed
>= (1 << (nbits
- 1)))
1123 immed
-= 1 << nbits
;
1125 if ((type
== '<' || type
== '>' || type
== '[' || type
== ']')
1132 immed
|= ((extend
& 0x1f) << 11) | (extend
& 0x7e0);
1133 else if (extbits
== 15)
1134 immed
|= ((extend
& 0xf) << 11) | (extend
& 0x7f0);
1136 immed
= ((extend
>> 6) & 0x1f) | (extend
& 0x20);
1137 immed
&= (1 << extbits
) - 1;
1138 if (! extu
&& immed
>= (1 << (extbits
- 1)))
1139 immed
-= 1 << extbits
;
1143 (*info
->fprintf_func
) (info
->stream
, "%d", immed
);
1152 baseaddr
= memaddr
+ 2;
1154 else if (use_extend
)
1155 baseaddr
= memaddr
- 2;
1163 /* If this instruction is in the delay slot of a jr
1164 instruction, the base address is the address of the
1165 jr instruction. If it is in the delay slot of jalr
1166 instruction, the base address is the address of the
1167 jalr instruction. This test is unreliable: we have
1168 no way of knowing whether the previous word is
1169 instruction or data. */
1170 status
= (*info
->read_memory_func
) (memaddr
- 4, buffer
, 2,
1173 && (((info
->endian
== BFD_ENDIAN_BIG
1174 ? bfd_getb16 (buffer
)
1175 : bfd_getl16 (buffer
))
1176 & 0xf800) == 0x1800))
1177 baseaddr
= memaddr
- 4;
1180 status
= (*info
->read_memory_func
) (memaddr
- 2, buffer
,
1183 && (((info
->endian
== BFD_ENDIAN_BIG
1184 ? bfd_getb16 (buffer
)
1185 : bfd_getl16 (buffer
))
1186 & 0xf81f) == 0xe800))
1187 baseaddr
= memaddr
- 2;
1190 val
= (baseaddr
& ~ ((1 << shift
) - 1)) + immed
;
1191 (*info
->print_address_func
) (val
, info
);
1200 l
= ((l
& 0x1f) << 23) | ((l
& 0x3e0) << 13) | (extend
<< 2);
1201 (*info
->print_address_func
) ((memaddr
& 0xf0000000) | l
, info
);
1202 info
->insn_type
= dis_jsr
;
1203 info
->target
= (memaddr
& 0xf0000000) | l
;
1204 info
->branch_delay_insns
= 1;
1210 int need_comma
, amask
, smask
;
1214 l
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
1216 amask
= (l
>> 3) & 7;
1218 if (amask
> 0 && amask
< 5)
1220 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[4]);
1222 (*info
->fprintf_func
) (info
->stream
, "-$%s",
1223 reg_names
[amask
+ 3]);
1227 smask
= (l
>> 1) & 3;
1230 (*info
->fprintf_func
) (info
->stream
, "%s??",
1231 need_comma
? "," : "");
1236 (*info
->fprintf_func
) (info
->stream
, "%s$%s",
1237 need_comma
? "," : "",
1240 (*info
->fprintf_func
) (info
->stream
, "-$%s",
1241 reg_names
[smask
+ 15]);
1247 (*info
->fprintf_func
) (info
->stream
, "%s$%s",
1248 need_comma
? "," : "",
1253 if (amask
== 5 || amask
== 6)
1255 (*info
->fprintf_func
) (info
->stream
, "%s$f0",
1256 need_comma
? "," : "");
1258 (*info
->fprintf_func
) (info
->stream
, "-$f1");
This page took 0.05686 seconds and 4 git commands to generate.