Change regcache list to be an hash map
[deliverable/binutils-gdb.git] / opcodes / nios2-dis.c
index cc6fff226b409ac2e46c703d1b21427e578a6100..6de2079f687a069921084d61078f040f93314b7b 100644 (file)
@@ -1,5 +1,5 @@
 /* Altera Nios II disassemble routines
-   Copyright (C) 2012-2017 Free Software Foundation, Inc.
+   Copyright (C) 2012-2020 Free Software Foundation, Inc.
    Contributed by Nigel Gray (ngray@altera.com).
    Contributed by Mentor Graphics, Inc.
 
@@ -22,6 +22,7 @@
 
 #include "sysdep.h"
 #include "disassemble.h"
+#include "opintl.h"
 #include "opcode/nios2.h"
 #include "libiberty.h"
 #include <string.h>
@@ -130,9 +131,9 @@ nios2_init_opcode_hash (nios2_disassembler_state *state)
              (nios2_opcode_hash *) malloc (sizeof (nios2_opcode_hash));
            if (new_hash == NULL)
              {
-               fprintf (stderr,
-                        "error allocating memory...broken disassembler\n");
-               abort ();
+               /* xgettext:c-format */
+               opcodes_error_handler (_("out of memory"));
+               exit (1);
              }
            new_hash->opcode = op;
            new_hash->next = NULL;
@@ -257,8 +258,10 @@ nios2_control_regs (void)
 static void
 bad_opcode (const struct nios2_opcode *op)
 {
-  fprintf (stderr, "Internal error: broken opcode descriptor for `%s %s'\n",
-          op->name, op->args);
+  opcodes_error_handler
+    /* xgettext:c-format */
+    (_("internal error: broken opcode descriptor for `%s %s'"),
+     op->name, op->args);
   abort ();
 }
 
@@ -272,6 +275,8 @@ nios2_print_insn_arg (const char *argptr,
                      const struct nios2_opcode *op)
 {
   unsigned long i = 0;
+  long s = 0;
+  int32_t o = 0;
   struct nios2_reg *reg_base;
 
   switch (*argptr)
@@ -549,15 +554,17 @@ nios2_print_insn_arg (const char *argptr,
       switch (op->format)
        {
        case iw_i_type:
-         i = (signed) (GET_IW_I_IMM16 (opcode) << 16) >> 16;
+         s = ((int32_t) ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000)
+              - 0x8000);
          break;
        case iw_F2I16_type:
-         i = (signed) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16;
+         s = ((int32_t) ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000)
+              - 0x8000);
          break;
        default:
          bad_opcode (op);
        }
-      (*info->fprintf_func) (info->stream, "%ld", i);
+      (*info->fprintf_func) (info->stream, "%ld", s);
       break;
 
     case 'I':
@@ -565,15 +572,17 @@ nios2_print_insn_arg (const char *argptr,
       switch (op->format)
        {
        case iw_F2X4I12_type:
-         i = (signed) (GET_IW_F2X4I12_IMM12 (opcode) << 20) >> 20;
+         s = ((int32_t) ((GET_IW_F2X4I12_IMM12 (opcode) & 0xfff) ^ 0x800)
+              - 0x800);
          break;
        case iw_F1X4I12_type:
-         i = (signed) (GET_IW_F1X4I12_IMM12 (opcode) << 20) >> 20;
+         s = ((int32_t) ((GET_IW_F1X4I12_IMM12 (opcode) & 0xfff) ^ 0x800)
+              - 0x800);
          break;
        default:
          bad_opcode (op);
        }
-      (*info->fprintf_func) (info->stream, "%ld", i);
+      (*info->fprintf_func) (info->stream, "%ld", s);
       break;
 
     case 'u':
@@ -668,15 +677,15 @@ nios2_print_insn_arg (const char *argptr,
       switch (op->format)
        {
        case iw_i_type:
-         i = (signed) (GET_IW_I_IMM16 (opcode) << 16) >> 16;
+         o = ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000;
          break;
        case iw_F2I16_type:
-         i = (signed) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16;
+         o = ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000;
          break;
        default:
          bad_opcode (op);
        }
-      address = address + 4 + i;
+      address = address + 4 + o;
       (*info->print_address_func) (address, info);
       break;
 
@@ -685,12 +694,12 @@ nios2_print_insn_arg (const char *argptr,
       switch (op->format)
        {
        case iw_I10_type:
-         i = (signed) (GET_IW_I10_IMM10 (opcode) << 22) >> 21;
+         o = (((GET_IW_I10_IMM10 (opcode) & 0x3ff) ^ 0x400) - 0x400) * 2;
          break;
        default:
          bad_opcode (op);
        }
-      address = address + 2 + i;
+      address = address + 2 + o;
       (*info->print_address_func) (address, info);
       break;
 
@@ -699,12 +708,12 @@ nios2_print_insn_arg (const char *argptr,
       switch (op->format)
        {
        case iw_T1I7_type:
-         i = (signed) (GET_IW_T1I7_IMM7 (opcode) << 25) >> 24;
+         o = (((GET_IW_T1I7_IMM7 (opcode) & 0x7f) ^ 0x40) - 0x40) * 2;
          break;
        default:
          bad_opcode (op);
        }
-      address = address + 2 + i;
+      address = address + 2 + o;
       (*info->print_address_func) (address, info);
       break;
 
@@ -853,7 +862,7 @@ nios2_print_insn_arg (const char *argptr,
                if (i & (1 << 10))
                  reglist |= (1 << 28);
                if (i & (1 << 11))
-                 reglist |= (1 << 31);
+                 reglist |= (1u << 31);
              }
            else
              reglist = i << 2;
@@ -862,7 +871,7 @@ nios2_print_insn_arg (const char *argptr,
 
          case iw_L5I4X1_type:
            /* Encoding for push.n/pop.n.  */
-           reglist |= (1 << 31);
+           reglist |= (1u << 31);
            if (GET_IW_L5I4X1_FP (opcode))
              reglist |= (1 << 28);
            if (GET_IW_L5I4X1_CS (opcode))
@@ -882,7 +891,7 @@ nios2_print_insn_arg (const char *argptr,
        for (k = (dir == 1 ? 0 : 31);
             (dir == 1 && k < 32) || (dir == -1 && k >= 0);
             k += dir)
-         if (reglist & (1 << k))
+         if (reglist & (1u << k))
            {
              if (t)
                (*info->fprintf_func) (info->stream, ",");
This page took 0.026034 seconds and 4 git commands to generate.