[ARC][committed] Update int_vector_base aux register.
[deliverable/binutils-gdb.git] / opcodes / xgate-dis.c
index f703055586045dd37b0e5b6e663c066bfd41861d..61eeb9971c6c94123a7af3ef4e4de076f47fe45c 100644 (file)
@@ -1,6 +1,5 @@
 /* xgate-dis.c -- Freescale XGATE disassembly
-   Copyright 2009, 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright (C) 2009-2020 Free Software Foundation, Inc.
    Written by Sean Keys (skeys@ipdatasys.com)
 
    This file is part of the GNU opcodes library.
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.
-*/
+   MA 02110-1301, USA.  */
 
-#include <assert.h>
 #include "sysdep.h"
-#include "dis-asm.h"
+#include <assert.h>
+#include "disassemble.h"
 #include "opintl.h"
 #include "libiberty.h"
 #include "ansidecl.h"
 #define XGATE_NINE_SIGNBIT   0x100
 #define XGATE_TEN_SIGNBIT    0x200
 
-/* Structures */
-struct decodeInfo {
+/* Structures.  */
+struct decodeInfo
+{
   unsigned int operMask;
   unsigned int operMasksRegisterBits;
   struct xgate_opcode *opcodePTR;
 };
 
 /* Prototypes for local functions.  */
-static int
-print_insn( bfd_vma, struct disassemble_info *);
-static int
-read_memory( bfd_vma, bfd_byte*, int, struct disassemble_info *);
-static int
-ripBits(unsigned int *, int,
-    struct xgate_opcode *, unsigned int);
-int
-macro_search(char *, char *);
-struct decodeInfo *
-find_match(unsigned int raw_code);
+static int print_insn (bfd_vma, struct disassemble_info *);
+static int read_memory (bfd_vma, bfd_byte*, int, struct disassemble_info *);
+static int ripBits (unsigned int *, int,
+                   struct xgate_opcode *, unsigned int);
+static int macro_search (char *, char *);
+static struct decodeInfo * find_match (unsigned int);
 
-/* statics */
+/* Statics.  */
 static struct decodeInfo *decodeTable;
 static int initialized;
 static char previousOpName[10];
 static unsigned int perviousBin;
 
 /* Disassemble one instruction at address 'memaddr'.  Returns the number
- of bytes used by that instruction.  */
+   of bytes used by that instruction.  */
+
 static int
 print_insn (bfd_vma memaddr, struct disassemble_info* info)
 {
@@ -82,11 +77,11 @@ print_insn (bfd_vma memaddr, struct disassemble_info* info)
   bfd_vma absAddress;
 
   unsigned int operMaskReg = 0;
-  /* initialize our array of opcode masks and check them against our constant
-     table */
+  /* Initialize our array of opcode masks and check them against our constant
+     table */
   if (!initialized)
     {
-      decodeTable = xmalloc(sizeof(struct decodeInfo) * xgate_num_opcodes);
+      decodeTable = xmalloc (sizeof (struct decodeInfo) * xgate_num_opcodes);
       for (i = 0, decodeTablePTR = decodeTable; i < xgate_num_opcodes;
           i++, decodeTablePTR++, opcodePTR++)
         {
@@ -101,208 +96,177 @@ print_insn (bfd_vma memaddr, struct disassemble_info* info)
               mask |= (*s == '0' || *s == '1');
               operandRegisterBits |= (*s == 'r');
             }
-          /* asserting will uncover inconsistencies in our table */
-          assert(
-              (s - opcodePTR->format) == 16 || (s - opcodePTR->format) == 32);
-          assert(opcodePTR->bin_opcode == bin);
+          /* Asserting will uncover inconsistencies in our table.  */
+          assert ((s - opcodePTR->format) == 16 || (s - opcodePTR->format) == 32);
+          assert (opcodePTR->bin_opcode == bin);
+
           decodeTablePTR->operMask = mask;
           decodeTablePTR->operMasksRegisterBits = operandRegisterBits;
           decodeTablePTR->opcodePTR = opcodePTR;
         }
       initialized = 1;
     }
-  /* read 16 bits */
+
+  /* Read 16 bits.  */
   bytesRead += XGATE_TWO_BYTES;
-  status = read_memory(memaddr, buffer, XGATE_TWO_BYTES, info);
+  status = read_memory (memaddr, buffer, XGATE_TWO_BYTES, info);
   if (status == 0)
     {
       raw_code = buffer[0];
       raw_code <<= 8;
       raw_code += buffer[1];
 
-      decodePTR = find_match(raw_code);
+      decodePTR = find_match (raw_code);
       if (decodePTR)
         {
           operMaskReg = decodePTR->operMasksRegisterBits;
           (*info->fprintf_func)(info->stream, "%s", decodePTR->opcodePTR->name);
+
           /* First we compare the shorthand format of the constraints. If we
-           still are unable to pinpoint the operands
-           we analyze the opcodes constraint string. */
-          switch (decodePTR->opcodePTR->sh_format)
-          {
-          case XG_R_C:
-            (*info->fprintf_func)(info->stream, " R%x, CCR",
-                (raw_code >> 8) & 0x7);
-            break;
-          case XG_C_R:
-            (*info->fprintf_func)(info->stream, " CCR, R%x",
-                (raw_code >> 8) & 0x7);
-            break;
-          case XG_R_P:
-            (*info->fprintf_func)(info->stream, " R%x, PC",
-                (raw_code >> 8) & 0x7);
-            break;
-          case XG_INH:
-            break;
-          case XG_R_R_R:
-            if (!strcmp(decodePTR->opcodePTR->constraints, XGATE_OP_TRI))
-              {
-                (*info->fprintf_func)(info->stream, " R%x, R%x, R%x",
-                    (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7,
-                    (raw_code >> 2) & 0x7);
-              }
-            else if (!strcmp(decodePTR->opcodePTR->constraints, XGATE_OP_IDR))
-              {
-                if (raw_code & 0x01)
-                  {
-                    (*info->fprintf_func)(info->stream, " R%x, (R%x, R%x+)",
-                        (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7,
-                        (raw_code >> 2) & 0x7);
-                  }
-                else if (raw_code & 0x02)
-                  {
-                    (*info->fprintf_func)(info->stream, " R%x, (R%x, -R%x)",
-                        (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7,
-                        (raw_code >> 2) & 0x7);
-                  }
-                else
-                  {
-                    (*info->fprintf_func)(info->stream, " R%x, (R%x, R%x)",
-                        (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7,
-                        (raw_code >> 2) & 0x7);
-                  }
-              }
-            else
-              {
-                (*info->fprintf_func)(info->stream, " unhandled mode %s",
-                    decodePTR->opcodePTR->constraints);
-              }
-            break;
-          case XG_R_R:
-            if (!strcmp(decodePTR->opcodePTR->constraints, XGATE_OP_DYA_MON))
-              {
-                operandOne = ripBits(&operMaskReg, 3, decodePTR->opcodePTR,
-                    raw_code);
-                operandTwo = ripBits(&operMaskReg, 3, decodePTR->opcodePTR,
-                    raw_code);
-                (*info->fprintf_func)(info->stream, " R%x, R%x", operandOne,
-                    operandTwo);
-              }
-            else if (!strcmp(decodePTR->opcodePTR->constraints, XGATE_OP_DYA))
-              {
-                operandOne = ripBits(&operMaskReg, 3, opcodePTR, raw_code);
-                operandTwo = ripBits(&operMaskReg, 3, opcodePTR, raw_code);
-                (*info->fprintf_func)(info->stream, " R%x, R%x", operandOne,
-                    operandTwo);
-              }
-            else
-              {
-                (*info->fprintf_func)(info->stream, " unhandled mode %s",
-                    opcodePTR->constraints);
-              }
-            break;
-          case XG_R_R_I:
-            (*info->fprintf_func)(info->stream, " R%x, (R%x, #0x%x)",
-                (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7, raw_code & 0x1f);
-            break;
-          case XG_R:
-            operandOne = ripBits(&operMaskReg, 3, decodePTR->opcodePTR,
-                raw_code);
-            (*info->fprintf_func)(info->stream, " R%x", operandOne);
-            break;
-          case XG_I | XG_PCREL:
-          if (!strcmp(decodePTR->opcodePTR->constraints, XGATE_OP_REL9))
+             still are unable to pinpoint the operands
+             we analyze the opcodes constraint string.  */
+          if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_MON_R_C))
+               {
+                 (*info->fprintf_func)(info->stream, " R%x, CCR",
+                         (raw_code >> 8) & 0x7);
+               }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_MON_C_R))
+            {
+                 (*info->fprintf_func)(info->stream, " CCR, R%x",
+                     (raw_code >> 8) & 0x7);
+            }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_MON_R_P))
+            {
+                 (*info->fprintf_func)(info->stream, " R%x, PC",
+                     (raw_code >> 8) & 0x7);
+            }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_TRI))
+            {
+                  (*info->fprintf_func)(info->stream, " R%x, R%x, R%x",
+                      (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7,
+                      (raw_code >> 2) & 0x7);
+            }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IDR))
+            {
+                  if (raw_code & 0x01)
+                    {
+                      (*info->fprintf_func)(info->stream, " R%x, (R%x, R%x+)",
+                          (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7,
+                          (raw_code >> 2) & 0x7);
+                    }
+                   else if (raw_code & 0x02)
+                          {
+                            (*info->fprintf_func)(info->stream, " R%x, (R%x, -R%x)",
+                                (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7,
+                                (raw_code >> 2) & 0x7);
+                          }
+                   else
+                     {
+                       (*info->fprintf_func)(info->stream, " R%x, (R%x, R%x)",
+                           (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7,
+                           (raw_code >> 2) & 0x7);
+                     }
+            }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_DYA))
+            {
+                 operandOne = ripBits (&operMaskReg, 3, decodePTR->opcodePTR, raw_code);
+                 operandTwo = ripBits (&operMaskReg, 3, decodePTR->opcodePTR, raw_code);
+                ( *info->fprintf_func)(info->stream, " R%x, R%x", operandOne,
+                     operandTwo);
+            }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IDO5))
+            {
+                 (*info->fprintf_func)(info->stream, " R%x, (R%x, #0x%x)",
+                     (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7, raw_code & 0x1f);
+            }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_MON))
             {
-              /* if address is negative handle it accordingly */
+                 operandOne = ripBits (&operMaskReg, 3, decodePTR->opcodePTR,
+                    raw_code);
+                (*info->fprintf_func)(info->stream, " R%x", operandOne);
+            }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_REL9))
+            {
+              /* If address is negative handle it accordingly.  */
               if (raw_code & XGATE_NINE_SIGNBIT)
                 {
-                  relAddr = XGATE_NINE_BITS >> 1; /* clip sign bit */
-                  relAddr = ~relAddr; /* make signed */
-                  relAddr |= (raw_code & 0xFF) + 1; /* apply our value */
-                  relAddr <<= 1; /* multiply by two as per processor docs */
+                  relAddr = XGATE_NINE_BITS >> 1; /* Clip sign bit.  */
+                  relAddr = ~relAddr; /* Make signed.  */
+                  relAddr |= (raw_code & 0xFF) + 1; /* Apply our value.  */
+                  relAddr *= 2; /* Multiply by two as per processor docs.  */
                 }
               else
                 {
                   relAddr = raw_code & 0xff;
-                  relAddr = (relAddr << 1) + 2;
+                  relAddr = relAddr * 2 + 2;
                 }
-              (*info->fprintf_func)(info->stream, " *%d", relAddr);
-              (*info->fprintf_func)(info->stream, "  Abs* 0x");
-              (*info->print_address_func)(memaddr + relAddr, info);
-            }
-          else if (!strcmp(decodePTR->opcodePTR->constraints, XGATE_OP_REL10))
+             (*info->fprintf_func)(info->stream, " *%d", relAddr);
+             (*info->fprintf_func)(info->stream, "  Abs* 0x");
+             (*info->print_address_func)(memaddr + relAddr, info);
+           }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_REL10))
             {
-              /* if address is negative handle it accordingly */
+              /* If address is negative handle it accordingly.  */
               if (raw_code & XGATE_TEN_SIGNBIT)
                 {
-                  relAddr = XGATE_TEN_BITS >> 1; /* clip sign bit */
-                  relAddr = ~relAddr; /* make signed */
-                  relAddr |= (raw_code & 0x1FF) + 1; /* apply our value */
-                  relAddr <<= 1; /* multiply by two as per processor docs */
+                  relAddr = XGATE_TEN_BITS >> 1; /* Clip sign bit.  */
+                  relAddr = ~relAddr; /* Make signed.  */
+                  relAddr |= (raw_code & 0x1FF) + 1; /* Apply our value.  */
+                  relAddr *= 2; /* Multiply by two as per processor docs.  */
                 }
               else
                 {
                   relAddr = raw_code & 0x1FF;
-                  relAddr = (relAddr << 1) + 2;
+                  relAddr = relAddr * 2 + 2;
                 }
               (*info->fprintf_func)(info->stream, " *%d", relAddr);
               (*info->fprintf_func)(info->stream, "  Abs* 0x");
               (*info->print_address_func)(memaddr + relAddr, info);
             }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IMM4))
+            {
+              (*info->fprintf_func)(info->stream, " R%x, #0x%02x",
+              (raw_code >> 8) & 0x7, (raw_code >> 4) & 0xF);
+            }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IMM8))
+            {
+              if (macro_search (decodePTR->opcodePTR->name, previousOpName) &&
+                 previousOpName[0])
+               {
+                 absAddress = (0xFF & raw_code) << 8;
+                 absAddress |= perviousBin & 0xFF;
+                 (*info->fprintf_func)(info->stream, " R%x, #0x%02x Abs* 0x",
+                     (raw_code >> 8) & 0x7, raw_code & 0xff);
+                 (*info->print_address_func)(absAddress, info);
+                 previousOpName[0] = 0;
+               }
+              else
+               {
+                 strcpy (previousOpName, decodePTR->opcodePTR->name);
+                 (*info->fprintf_func)(info->stream, " R%x, #0x%02x",
+                     (raw_code >> 8) & 0x7, raw_code & 0xff);
+               }
+            }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IMM3))
+            {
+                 (*info->fprintf_func)(info->stream, " #0x%x",
+                    (raw_code >> 8) & 0x7);
+            }
+          else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_INH))
+            {
+                 //
+            }
           else
             {
-              (*info->fprintf_func)(info->stream,
-                  " Can't disassemble for mode) %s",
-                  decodePTR->opcodePTR->constraints);
+              (*info->fprintf_func)(info->stream, " unhandled mode %s",
+                                   decodePTR->opcodePTR->constraints);
             }
-          break;
-          case XG_R_I:
-            if (!strcmp(decodePTR->opcodePTR->constraints, XGATE_OP_IMM4))
-              {
-                (*info->fprintf_func)(info->stream, " R%x, #0x%02x",
-                    (raw_code >> 8) & 0x7, (raw_code >> 4) & 0xF);
-              }
-            else if (!strcmp(decodePTR->opcodePTR->constraints, XGATE_OP_IMM8))
-              {
-                if (macro_search(decodePTR->opcodePTR->name, previousOpName) &&
-                    previousOpName[0])
-                  {
-                    absAddress = (0xFF & raw_code) << 8;
-                    absAddress |= perviousBin & 0xFF;
-                    (*info->fprintf_func)(info->stream, " R%x, #0x%02x Abs* 0x",
-                        (raw_code >> 8) & 0x7, raw_code & 0xff);
-                    (*info->print_address_func)(absAddress, info);
-                    previousOpName[0] = 0;
-                  }
-                else
-                  {
-                    strcpy(previousOpName, decodePTR->opcodePTR->name);
-                    (*info->fprintf_func)(info->stream, " R%x, #0x%02x",
-                        (raw_code >> 8) & 0x7, raw_code & 0xff);
-                  }
-              }
-            else
-              {
-                (*info->fprintf_func)(info->stream,
-                    " Can't disassemble for mode %s",
-                    decodePTR->opcodePTR->constraints);
-              }
-            break;
-          case XG_I:
-            (*info->fprintf_func)(info->stream, " #0x%x",
-                (raw_code >> 8) & 0x7);
-            break;
-          default:
-            (*info->fprintf_func)(info->stream, "address mode not found\t %x",
-                opcodePTR->bin_opcode);
-            break;
-          }
           perviousBin = raw_code;
         }
       else
         {
           (*info->fprintf_func)(info->stream,
-              " unable to find opcode match #0%x", raw_code);
+                               " unable to find opcode match #0%x", raw_code);
         }
     }
   return bytesRead;
@@ -329,45 +293,51 @@ read_memory (bfd_vma memaddr, bfd_byte* buffer, int size,
 }
 
 static int
-ripBits(unsigned int *operandBitsRemaining, int numBitsRequested,
-    struct xgate_opcode *opcodePTR, unsigned int memory)
+ripBits (unsigned int *operandBitsRemaining,
+        int numBitsRequested,
+        struct xgate_opcode *opcodePTR,
+        unsigned int memory)
 {
   unsigned int currentBit;
-  int operand;
+  unsigned int operand = 0;
   int numBitsFound;
-  for (operand = 0, numBitsFound = 0, currentBit = 1
-      << ((opcodePTR->size * 8) - 1);
-      (numBitsFound < numBitsRequested) && currentBit; currentBit >>= 1)
+
+  for (numBitsFound = 0, currentBit = 1u << ((opcodePTR->size * 8) - 1);
+       numBitsFound < numBitsRequested && currentBit != 0;
+       currentBit >>= 1)
     {
-      if(currentBit & *operandBitsRemaining) {
-         *operandBitsRemaining &= ~(currentBit); /* consume the current bit */
-         operand <<= 1; /* make room for our next bit */
-         numBitsFound++;
-         operand |= (currentBit & memory) > 0;
-     }
-  }
+      if (currentBit & *operandBitsRemaining)
+       {
+         *operandBitsRemaining &= ~(currentBit); /* Consume the current bit.  */
+         operand <<= 1; /* Make room for our next bit.  */
+         numBitsFound++;
+         operand |= (currentBit & memory) > 0;
+       }
+    }
   return operand;
 }
 
-int
-macro_search(char *currentName, char *lastName)
+static int
+macro_search (char *currentName, char *lastName)
 {
   int i;
   int length = 0;
   char *where;
+
   for (i = 0; i < xgate_num_opcodes; i++)
     {
-      where = strstr(xgate_opcodes[i].constraints, lastName);
+      where = strstr (xgate_opcodes[i].constraints, lastName);
+
       if (where)
         {
-          length = strlen(where);
+          length = strlen (where);
         }
       if (length)
         {
-          where = strstr(xgate_opcodes[i].constraints, currentName);
+          where = strstr (xgate_opcodes[i].constraints, currentName);
           if (where)
             {
-              length = strlen(where);
+              length = strlen (where);
               return 1;
             }
         }
@@ -375,8 +345,8 @@ macro_search(char *currentName, char *lastName)
   return 0;
 }
 
-struct decodeInfo*
-find_match(unsigned int raw_code)
+static struct decodeInfo *
+find_match (unsigned int raw_code)
 {
   struct decodeInfo *decodeTablePTR = 0;
   int i;
@@ -387,16 +357,14 @@ find_match(unsigned int raw_code)
       if ((raw_code & decodeTablePTR->operMask)
           == decodeTablePTR->opcodePTR->bin_opcode)
         {
-          /* make sure we didn't run into a macro or alias */
+          /* Make sure we didn't run into a macro or alias.  */
           if (decodeTablePTR->opcodePTR->cycles_min != 0)
             {
               return decodeTablePTR;
               break;
             }
           else
-            {
-              continue;
-            }
+           continue;
         }
     }
   return 0;
This page took 0.045885 seconds and 4 git commands to generate.