static void initialize_shmedia_opcode_mask_table PARAMS ((void));
static int print_insn_shmedia PARAMS ((bfd_vma, disassemble_info *));
-static int print_insn_sh64x
- PARAMS ((bfd_vma, disassemble_info *,
- int (*) PARAMS ((bfd_vma, struct disassemble_info *)),
- enum bfd_endian));
static const char *creg_name PARAMS ((int));
static boolean init_sh64_disasm_info PARAMS ((struct disassemble_info *));
static enum sh64_elf_cr_type sh64_get_contents_type_disasm
return print_insn_shmedia (memaddr, info);
}
-/* Main entry to disassemble SHcompact or SHmedia insns. */
+/* Main entry to disassemble SHmedia insns.
+ If we see an SHcompact instruction, return -2. */
-static int
-print_insn_sh64x (memaddr, info, pfun_compact, endian)
+int
+print_insn_sh64 (memaddr, info)
bfd_vma memaddr;
struct disassemble_info *info;
- int (*pfun_compact) PARAMS ((bfd_vma, struct disassemble_info *));
- enum bfd_endian endian;
{
+ enum bfd_endian endian = info->endian;
enum sh64_elf_cr_type cr_type;
if (info->private_data == NULL && ! init_sh64_disasm_info (info))
int length = 4 - (memaddr % 4);
info->display_endian = endian;
+ /* If we got an uneven address to indicate SHmedia, adjust it. */
+ if (cr_type == CRT_SH5_ISA32 && length == 3)
+ memaddr--, length = 4;
+
/* Only disassemble on four-byte boundaries. Addresses that are not
a multiple of four can happen after a data region. */
if (cr_type == CRT_SH5_ISA32 && length == 4)
}
}
- return (*pfun_compact) (memaddr, info);
-}
-
-/* Main entry to disassemble SHcompact or SHmedia insns, big endian. */
-
-int
-print_insn_sh64 (memaddr, info)
- bfd_vma memaddr;
- struct disassemble_info *info;
-{
- return
- print_insn_sh64x (memaddr, info, print_insn_sh, BFD_ENDIAN_BIG);
-}
-
-/* Main entry to disassemble SHcompact or SHmedia insns, little endian. */
-
-int
-print_insn_sh64l (memaddr, info)
- bfd_vma memaddr;
- struct disassemble_info *info;
-{
- return
- print_insn_sh64x (memaddr, info, print_insn_shl, BFD_ENDIAN_LITTLE);
+ /* SH1 .. SH4 instruction, let caller handle it. */
+ return -2;
}