X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fnios2-dis.c;h=6de2079f687a069921084d61078f040f93314b7b;hb=7fb43e53d57d5d1c47fad8a2dece7b90d20b3fd3;hp=51027b5dce49738417f31887a870c5265f328161;hpb=6031ac352c05c5c9f44e24fa1c5a8222a7a7d02d;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/nios2-dis.c b/opcodes/nios2-dis.c index 51027b5dce..6de2079f68 100644 --- a/opcodes/nios2-dis.c +++ b/opcodes/nios2-dis.c @@ -1,5 +1,5 @@ /* Altera Nios II disassemble routines - Copyright (C) 2012-2018 Free Software Foundation, Inc. + Copyright (C) 2012-2020 Free Software Foundation, Inc. Contributed by Nigel Gray (ngray@altera.com). Contributed by Mentor Graphics, Inc. @@ -276,7 +276,7 @@ nios2_print_insn_arg (const char *argptr, { unsigned long i = 0; long s = 0; - bfd_signed_vma o = 0; + int32_t o = 0; struct nios2_reg *reg_base; switch (*argptr) @@ -554,10 +554,12 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_i_type: - s = (int32_t) (GET_IW_I_IMM16 (opcode) << 16) >> 16; + s = ((int32_t) ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000) + - 0x8000); break; case iw_F2I16_type: - s = (int32_t) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16; + s = ((int32_t) ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000) + - 0x8000); break; default: bad_opcode (op); @@ -570,10 +572,12 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_F2X4I12_type: - s = (int32_t) (GET_IW_F2X4I12_IMM12 (opcode) << 20) >> 20; + s = ((int32_t) ((GET_IW_F2X4I12_IMM12 (opcode) & 0xfff) ^ 0x800) + - 0x800); break; case iw_F1X4I12_type: - s = (int32_t) (GET_IW_F1X4I12_IMM12 (opcode) << 20) >> 20; + s = ((int32_t) ((GET_IW_F1X4I12_IMM12 (opcode) & 0xfff) ^ 0x800) + - 0x800); break; default: bad_opcode (op); @@ -673,10 +677,10 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_i_type: - o = (int32_t) (GET_IW_I_IMM16 (opcode) << 16) >> 16; + o = ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000; break; case iw_F2I16_type: - o = (int32_t) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16; + o = ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000; break; default: bad_opcode (op); @@ -690,7 +694,7 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_I10_type: - o = (int32_t) (GET_IW_I10_IMM10 (opcode) << 22) >> 21; + o = (((GET_IW_I10_IMM10 (opcode) & 0x3ff) ^ 0x400) - 0x400) * 2; break; default: bad_opcode (op); @@ -704,7 +708,7 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_T1I7_type: - o = (int32_t) (GET_IW_T1I7_IMM7 (opcode) << 25) >> 24; + o = (((GET_IW_T1I7_IMM7 (opcode) & 0x7f) ^ 0x40) - 0x40) * 2; break; default: bad_opcode (op); @@ -858,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; @@ -867,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)) @@ -887,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, ",");