* mips-dis.c (print_insn_args): Force mips16 to odd addresses.
authorThiemo Seufer <ths@networkno.de>
Tue, 2 May 2006 11:12:41 +0000 (11:12 +0000)
committerThiemo Seufer <ths@networkno.de>
Tue, 2 May 2006 11:12:41 +0000 (11:12 +0000)
(print_mips16_insn_arg): Force mips16 to odd addresses.

opcodes/ChangeLog
opcodes/mips-dis.c

index c3840802d601dea9efc9937ec3bb6a136882eebf..f4bf38383d1ddb9aaab42ba9685d932d317321c0 100644 (file)
@@ -1,3 +1,10 @@
+2006-05-02  Thiemo Seufer  <ths@mips.com>
+            Nigel Stephens  <nigel@mips.com>
+            David Ung  <davidu@mips.com>
+
+       * mips-dis.c (print_insn_args): Force mips16 to odd addresses.
+       (print_mips16_insn_arg): Force mips16 to odd addresses.
+
 2006-04-30  Thiemo Seufer  <ths@mips.com>
             David Ung  <davidu@mips.com>
 
index ee1e9af0c9ad0b1da37740d3ea3d360821123abe..59e1824f220a58730c1322063879a1660988624b 100644 (file)
@@ -984,6 +984,10 @@ print_insn_args (const char *d,
        case 'a':
          info->target = (((pc + 4) & ~(bfd_vma) 0x0fffffff)
                          | (((l >> OP_SH_TARGET) & OP_MASK_TARGET) << 2));
+         /* For gdb disassembler, force odd address on jalx.  */
+         if (info->flavour == bfd_target_unknown_flavour
+             && strcmp (opp->name, "jalx") == 0)
+           info->target |= 1;
          (*info->print_address_func) (info->target, info);
          break;
 
@@ -1632,15 +1636,26 @@ print_mips16_insn_arg (char type,
                  }
              }
            info->target = (baseaddr & ~((1 << shift) - 1)) + immed;
+           if (pcrel && branch
+               && info->flavour == bfd_target_unknown_flavour)
+             /* For gdb disassembler, maintain odd address.  */
+             info->target |= 1;
            (*info->print_address_func) (info->target, info);
          }
       }
       break;
 
     case 'a':
-      if (! use_extend)
-       extend = 0;
-      l = ((l & 0x1f) << 23) | ((l & 0x3e0) << 13) | (extend << 2);
+      {
+       int jalx = l & 0x400;
+
+       if (! use_extend)
+         extend = 0;
+       l = ((l & 0x1f) << 23) | ((l & 0x3e0) << 13) | (extend << 2);
+       if (!jalx && info->flavour == bfd_target_unknown_flavour)
+         /* For gdb disassembler, maintain odd address.  */
+         l |= 1;
+      }
       info->target = ((memaddr + 4) & ~(bfd_vma) 0x0fffffff) | l;
       (*info->print_address_func) (info->target, info);
       info->insn_type = dis_jsr;