/* Altera Nios II disassemble routines
- Copyright (C) 2012-2015 Free Software Foundation, Inc.
+ Copyright (C) 2012-2020 Free Software Foundation, Inc.
Contributed by Nigel Gray (ngray@altera.com).
Contributed by Mentor Graphics, Inc.
MA 02110-1301, USA. */
#include "sysdep.h"
-#include "dis-asm.h"
+#include "disassemble.h"
+#include "opintl.h"
#include "opcode/nios2.h"
#include "libiberty.h"
#include <string.h>
NULL,
0
};
-
+
/* Function to initialize the opcode hash table. */
static void
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;
nios2_coprocessor_regs (void)
{
static struct nios2_reg *cached = NULL;
-
+
if (!cached)
{
int i;
nios2_control_regs (void)
{
static struct nios2_reg *cached = NULL;
-
+
if (!cached)
{
int i;
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 ();
}
const struct nios2_opcode *op)
{
unsigned long i = 0;
+ long s = 0;
+ bfd_signed_vma o = 0;
struct nios2_reg *reg_base;
switch (*argptr)
switch (op->format)
{
case iw_i_type:
- i = (signed) (GET_IW_I_IMM16 (opcode) << 16) >> 16;
+ s = ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000;
break;
case iw_F2I16_type:
- i = (signed) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16;
+ s = ((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':
switch (op->format)
{
case iw_F2X4I12_type:
- i = (signed) (GET_IW_F2X4I12_IMM12 (opcode) << 20) >> 20;
+ s = ((GET_IW_F2X4I12_IMM12 (opcode) & 0xfff) ^ 0x800) - 0x800;
break;
case iw_F1X4I12_type:
- i = (signed) (GET_IW_F1X4I12_IMM12 (opcode) << 20) >> 20;
+ s = ((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':
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;
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) << 1;
break;
default:
bad_opcode (op);
}
- address = address + 2 + i;
+ address = address + 2 + o;
(*info->print_address_func) (address, info);
break;
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) << 1;
break;
default:
bad_opcode (op);
}
- address = address + 2 + i;
+ address = address + 2 + o;
(*info->print_address_func) (address, info);
break;
if (i & (1 << 10))
reglist |= (1 << 28);
if (i & (1 << 11))
- reglist |= (1 << 31);
+ reglist |= (1u << 31);
}
else
reglist = i << 2;
dir = GET_IW_F1X4L17_REGMASK (opcode) ? 1 : -1;
break;
-
+
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))
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, ",");
(*info->fprintf_func) (info->stream, "--");
i = GET_IW_F1X4I12_A (opcode);
- (*info->fprintf_func) (info->stream, "(%s)",
+ (*info->fprintf_func) (info->stream, "(%s)",
nios2_builtin_regs[i].name);
if (GET_IW_F1X4L17_ID (opcode))