? gas/testsuite/gas/mips/rol64.d
[deliverable/binutils-gdb.git] / opcodes / sh64-dis.c
index 2c760673bd20f9266f55e04c93b7533ee3a9486f..10c0f3102e8c54416be459bb9b34ee136be797bf 100644 (file)
@@ -55,10 +55,6 @@ static unsigned long *shmedia_opcode_mask_table;
 
 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
@@ -555,15 +551,15 @@ print_insn_sh64x_media (memaddr, info)
   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))
@@ -575,6 +571,10 @@ print_insn_sh64x (memaddr, info, pfun_compact, endian)
       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)
@@ -633,27 +633,6 @@ print_insn_sh64x (memaddr, info, pfun_compact, endian)
        }
     }
 
-  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;
 }
This page took 0.02503 seconds and 4 git commands to generate.