[ARC] Allow non-instruction relocations within .text sections
[deliverable/binutils-gdb.git] / opcodes / msp430-dis.c
index c31463881ec96d5351a8c5d00c811597fddb8d15..676a2d855efbc720b440e94359e00d3a9cbfaee6 100644 (file)
@@ -1,8 +1,8 @@
 /* Disassemble MSP430 instructions.
-   Copyright (C) 2002-2013 Free Software Foundation, Inc.
+   Copyright (C) 2002-2016 Free Software Foundation, Inc.
 
    Contributed by Dmitry Diky <diwil@mail.ru>
-        
+
    This file is part of the GNU opcodes library.
 
    This library is free software; you can redistribute it and/or modify
@@ -66,7 +66,7 @@ msp430_nooperands (struct msp430_opcode_s *opcode,
 
   if (opcode->fmt == 0)
     {
-      if ((insn & 0x0f00) != 3 || (insn & 0x0f00) != 2)
+      if ((insn & 0x0f00) != 0x0300 || (insn & 0x0f00) != 0x0200)
        return 0;
 
       strcpy (comm, "emulated...");
@@ -229,10 +229,10 @@ msp430_singleoperand (disassemble_info *info,
                {
                  dst |= extended_dst << 16;
                  if (dst & 0x80000)
-                   dst |= -1 << 20;
+                   dst |= -1U << 20;
                }
              else if (dst & 0x8000)
-               dst |= -1 << 16;
+               dst |= -1U << 16;
              sprintf (op, "%d(r%d)", dst, regd);
            }
        }
@@ -273,7 +273,7 @@ msp430_singleoperand (disassemble_info *info,
                {
                  dst |= extended_dst << 16;
                  if (dst & 0x80000)
-                   dst |= -1 << 20;
+                   dst |= -1U << 20;
                  sprintf (op, "#%d", dst);
                  if (dst > 9 || dst < 0)
                    sprintf (comm, "#0x%05x", dst);
@@ -328,10 +328,10 @@ msp430_singleoperand (disassemble_info *info,
                {
                  dst |= extended_dst << 16;
                  if (dst & 0x80000)
-                   dst |= -1 << 20;
+                   dst |= -1U << 20;
                }
              else if (dst & 0x8000)
-               dst |= -1 << 16;
+               dst |= -1U << 16;
              sprintf (op, "%d(r%d)", dst, regd);
              if (dst > 9 || dst < 0)
                sprintf (comm, "%05x", dst);
@@ -397,7 +397,7 @@ msp430_doubleoperand (disassemble_info *info,
         Rm             Register,
          x(Rm)         Indexed,
          0xXXXX        Relative,
-         &0xXXXX       Absolute 
+         &0xXXXX       Absolute
          emulated_ins   dst
          basic_ins      dst, dst.  */
 
@@ -427,11 +427,11 @@ msp430_doubleoperand (disassemble_info *info,
              sprintf (op1, "0x%04x", PS (dst));
              sprintf (comm1, "PC rel. 0x%04x",
                       PS ((short) addr + 2 + dst));
-             if (extended_dst)
+             if (extension_word)
                {
                  dst |= extended_dst << 16;
                  if (dst & 0x80000)
-                   dst |= -1 << 20;
+                   dst |= -1U << 20;
                  sprintf (op1, "0x%05x", dst & 0xfffff);
                  sprintf (comm1, "PC rel. 0x%05lx",
                           (long)((addr + 2 + dst) & 0xfffff));
@@ -448,7 +448,7 @@ msp430_doubleoperand (disassemble_info *info,
              cmd_len += 4;
              *cycles = 6;
              sprintf (op1, "&0x%04x", PS (dst));
-             if (extended_dst)
+             if (extension_word)
                {
                  dst |= extended_dst << 16;
                  sprintf (op1, "&0x%05x", dst & 0xfffff);
@@ -458,14 +458,14 @@ msp430_doubleoperand (disassemble_info *info,
            {
              /* Indexed.  */
              dst = msp430dis_opcode (addr + 2, info);
-             if (extended_dst)
+             if (extension_word)
                {
                  dst |= extended_dst << 16;
                  if (dst & 0x80000)
-                   dst |= -1 << 20;
+                   dst |= -1U << 20;
                }
              else if (dst & 0x8000)
-               dst |= -1 << 16;
+               dst |= -1U << 16;
              cmd_len += 4;
              *cycles = 6;
              sprintf (op1, "%d(r%d)", dst, regd);
@@ -519,11 +519,11 @@ msp430_doubleoperand (disassemble_info *info,
          sprintf (op1, "#%d", dst);
          if (dst > 9 || dst < 0)
            sprintf (comm1, "#0x%04x", PS (dst));
-         if (extended_src)
+         if (extension_word)
            {
              dst |= extended_src << 16;
              if (dst & 0x80000)
-               dst |= -1 << 20;
+               dst |= -1U << 20;
              sprintf (op1, "#%d", dst);
              if (dst > 9 || dst < 0)
                sprintf (comm1, "0x%05x", dst & 0xfffff);
@@ -543,11 +543,11 @@ msp430_doubleoperand (disassemble_info *info,
          sprintf (op1, "0x%04x", PS (dst));
          sprintf (comm1, "PC rel. 0x%04x",
                   PS ((short) addr + 2 + dst));
-         if (extended_src)
+         if (extension_word)
            {
              dst |= extended_src << 16;
              if (dst & 0x80000)
-               dst |= -1 << 20;
+               dst |= -1U << 20;
              sprintf (op1, "0x%05x", dst & 0xfffff);
              sprintf (comm1, "PC rel. 0x%05lx",
                       (long) ((addr + 2 + dst) & 0xfffff));
@@ -561,7 +561,7 @@ msp430_doubleoperand (disassemble_info *info,
          cmd_len += 2;
          sprintf (op1, "&0x%04x", PS (dst));
          sprintf (comm1, "0x%04x", PS (dst));
-         if (extended_src)
+         if (extension_word)
            {
              dst |= extended_src << 16;
              sprintf (op1, "&0x%05x", dst & 0xfffff);
@@ -580,14 +580,14 @@ msp430_doubleoperand (disassemble_info *info,
          /* Indexed.  */
          dst = msp430dis_opcode (addr + 2, info);
          cmd_len += 2;
-         if (extended_src)
+         if (extension_word)
            {
              dst |= extended_src << 16;
              if (dst & 0x80000)
-               dst |= -1 << 20;
+               dst |= -1U << 20;
            }
          else if (dst & 0x8000)
-           dst |= -1 << 16;
+           dst |= -1U << 16;
          sprintf (op1, "%d(r%d)", dst, regs);
          if (dst > 9 || dst < -9)
            sprintf (comm1, "0x%05x", dst);
@@ -625,11 +625,11 @@ msp430_doubleoperand (disassemble_info *info,
          sprintf (op2, "0x%04x", PS (dst));
          sprintf (comm2, "PC rel. 0x%04x",
                   PS ((short) addr + cmd_len + dst));
-         if (extended_dst)
+         if (extension_word)
            {
              dst |= extended_dst << 16;
              if (dst & 0x80000)
-               dst |= -1 << 20;
+               dst |= -1U << 20;
              sprintf (op2, "0x%05x", dst & 0xfffff);
              sprintf (comm2, "PC rel. 0x%05lx",
                       (long)((addr + cmd_len + dst) & 0xfffff));
@@ -642,7 +642,7 @@ msp430_doubleoperand (disassemble_info *info,
          dst = msp430dis_opcode (addr + cmd_len, info);
          cmd_len += 2;
          sprintf (op2, "&0x%04x", PS (dst));
-         if (extended_dst)
+         if (extension_word)
            {
              dst |= extended_dst << 16;
              sprintf (op2, "&0x%05x", dst & 0xfffff);
@@ -653,14 +653,14 @@ msp430_doubleoperand (disassemble_info *info,
          dst = msp430dis_opcode (addr + cmd_len, info);
          cmd_len += 2;
          if (dst & 0x8000)
-           dst |= -1 << 16;
+           dst |= -1U << 16;
          if (dst > 9 || dst < 0)
            sprintf (comm2, "0x%04x", PS (dst));
-         if (extended_dst)
+         if (extension_word)
            {
              dst |= extended_dst << 16;
              if (dst & 0x80000)
-               dst |= -1 << 20;
+               dst |= -1U << 20;
              if (dst > 9 || dst < 0)
                sprintf (comm2, "0x%05x", dst & 0xfffff);
            }
@@ -759,7 +759,7 @@ msp430_branchinstr (disassemble_info *info,
          dst = msp430dis_opcode (addr + 2, info);
          cmd_len += 2;
          if (dst & 0x8000)
-           dst |= -1 << 16;
+           dst |= -1U << 16;
          sprintf (op1, "%d(r%d)", dst, regs);
        }
     }
@@ -936,7 +936,7 @@ print_insn_msp430 (bfd_vma addr, disassemble_info *info)
                  sprintf (comm1, "20-bit words");
                  bc =".a";
                }
-             
+
              cycles = 2; /*FIXME*/
              cmd_len = 2;
              break;
@@ -984,7 +984,7 @@ print_insn_msp430 (bfd_vma addr, disassemble_info *info)
                  if (strcmp (opcode->name, "bra") != 0)
                    sprintf (op2, "r%d", reg);
                  break;
-                 
+
                case 1: /* MOVA @Rsrc+, Rdst */
                  cmd_len = 2;
                  if (strcmp (opcode->name, "reta") != 0)
@@ -994,7 +994,7 @@ print_insn_msp430 (bfd_vma addr, disassemble_info *info)
                        sprintf (op2, "r%d", reg);
                    }
                  break;
-                 
+
                case 2: /* MOVA &abs20, Rdst */
                  cmd_len = 4;
                  n <<= 16;
@@ -1005,7 +1005,7 @@ print_insn_msp430 (bfd_vma addr, disassemble_info *info)
                  if (strcmp (opcode->name, "bra") != 0)
                    sprintf (op2, "r%d", reg);
                  break;
-                 
+
                case 3: /* MOVA x(Rsrc), Rdst */
                  cmd_len = 4;
                  if (strcmp (opcode->name, "bra") != 0)
@@ -1013,7 +1013,7 @@ print_insn_msp430 (bfd_vma addr, disassemble_info *info)
                  reg = n;
                  n = msp430dis_opcode (addr + 2, info);
                  if (n & 0x8000)
-                   n |= -1 << 16;
+                   n |= -1U << 16;
                  sprintf (op1, "%d(r%d)", n, reg);
                  if (n > 9 || n < 0)
                    {
@@ -1040,7 +1040,7 @@ print_insn_msp430 (bfd_vma addr, disassemble_info *info)
                  sprintf (op1, "r%d", n);
                  n = msp430dis_opcode (addr + 2, info);
                  if (n & 0x8000)
-                   n |= -1 << 16;
+                   n |= -1U << 16;
                  sprintf (op2, "%d(r%d)", n, reg);
                  if (n > 9 || n < 0)
                    {
@@ -1051,20 +1051,20 @@ print_insn_msp430 (bfd_vma addr, disassemble_info *info)
                        sprintf (comm2, "0x%05x", n);
                    }
                  break;
-                 
+
                case 8: /* MOVA #imm20, Rdst */
                  cmd_len = 4;
                  n <<= 16;
                  n |= msp430dis_opcode (addr + 2, info);
                  if (n & 0x80000)
-                   n |= -1 << 20;
+                   n |= -1U << 20;
                  sprintf (op1, "#%d", n);
                  if (n > 9 || n < 0)
                    sprintf (comm1, "0x%05x", n);
                  if (strcmp (opcode->name, "bra") != 0)
                    sprintf (op2, "r%d", reg);
                  break;
-                 
+
                case 12: /* MOVA Rsrc, Rdst */
                  cmd_len = 2;
                  sprintf (op1, "r%d", n);
@@ -1102,7 +1102,7 @@ print_insn_msp430 (bfd_vma addr, disassemble_info *info)
                }
              else if (extension_word)
                {
-                 if (extension_word & (1 << 6))
+                 if (extension_word & BYTE_OPERATION)
                    bc = ".w";
                  else
                    {
@@ -1110,7 +1110,7 @@ print_insn_msp430 (bfd_vma addr, disassemble_info *info)
                      sprintf (comm2, _("Reserved use of A/L and B/W bits detected"));
                    }
                }
-             
+
              break;
            case 1:
              cmd_len +=
@@ -1181,7 +1181,12 @@ print_insn_msp430 (bfd_vma addr, disassemble_info *info)
        prin (stream, "rpt #%d { ", (extension_word & 0xf) + 1);
     }
 
-  if (extension_word && opcode->name[strlen (opcode->name) - 1] != 'x')
+  /* Special case:  RRC with an extension word and the ZC bit set is actually RRU.  */
+  if (extension_word
+      && (extension_word & IGNORE_CARRY_BIT)
+      && strcmp (opcode->name, "rrc") == 0)
+    (*prin) (stream, "rrux%s", bc);
+  else if (extension_word && opcode->name[strlen (opcode->name) - 1] != 'x')
     (*prin) (stream, "%sx%s", opcode->name, bc);
   else
     (*prin) (stream, "%s%s", opcode->name, bc);
This page took 0.0295 seconds and 4 git commands to generate.