Fix extraction of signed constants in nios2 disassembler (again).
authorSandra Loosemore <sandra@codesourcery.com>
Wed, 27 May 2020 06:23:03 +0000 (23:23 -0700)
committerSandra Loosemore <sandra@codesourcery.com>
Wed, 27 May 2020 06:23:03 +0000 (23:23 -0700)
In commit 6031ac352c05c5c9f44e24fa1c5a8222a7a7d02d I added some casts
to explicitly do conversions from unsigned to signed as 32-bit
quantities to address some bugs with different sizes of long and
bfd_signed_vma.  Those casts were removed in the rewrite of the
sign-extension logic in commit 1d61b032265e69317f42e8019e072506f11890c5,
reintroducing the same bugs.  This patch restores the casts.

2020-05-26  Sandra Loosemore  <sandra@codesourcery.com>

opcodes/
* nios2-dis.c (nios2_print_insn_arg): Add explicit casts to
extractions of signed fields.

opcodes/ChangeLog
opcodes/nios2-dis.c

index 83d8815f4fecd62a0bd71c6ecdc0f48aced9f3db..52cbe8e7ae5df195b51253212f46a0afee004e79 100644 (file)
@@ -1,3 +1,10 @@
+2020-05-26  Sandra Loosemore  <sandra@codesourcery.com>
+
+       Fix extraction of signed constants in nios2 disassembler (again).
+
+       * nios2-dis.c (nios2_print_insn_arg): Add explicit casts to
+       extractions of signed fields.
+
 2020-05-26  Stefan Schulze Frielinghaus  <stefansf@linux.ibm.com>
 
        * s390-opc.txt: Relocate vector load/store instructions with
index 0d6d6196be5df7b3fff46ca2d132ad42871b6112..e1eeaccadd55f7119f8baa9c2ba66f2da428eb9e 100644 (file)
@@ -554,10 +554,12 @@ nios2_print_insn_arg (const char *argptr,
       switch (op->format)
        {
        case iw_i_type:
-         s = ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000;
+         s = ((int32_t) ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000)
+              - 0x8000);
          break;
        case iw_F2I16_type:
-         s = ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000;
+         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 = ((GET_IW_F2X4I12_IMM12 (opcode) & 0xfff) ^ 0x800) - 0x800;
+         s = ((int32_t) ((GET_IW_F2X4I12_IMM12 (opcode) & 0xfff) ^ 0x800)
+              - 0x800);
          break;
        case iw_F1X4I12_type:
-         s = ((GET_IW_F1X4I12_IMM12 (opcode) & 0xfff) ^ 0x800) - 0x800;
+         s = ((int32_t) ((GET_IW_F1X4I12_IMM12 (opcode) & 0xfff) ^ 0x800)
+              - 0x800);
          break;
        default:
          bad_opcode (op);
@@ -673,10 +677,12 @@ nios2_print_insn_arg (const char *argptr,
       switch (op->format)
        {
        case iw_i_type:
-         o = ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000;
+         o = ((int32_t) ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000)
+              - 0x8000);
          break;
        case iw_F2I16_type:
-         o = ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000;
+         o = ((int32_t) ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000)
+              - 0x8000);
          break;
        default:
          bad_opcode (op);
@@ -690,7 +696,9 @@ nios2_print_insn_arg (const char *argptr,
       switch (op->format)
        {
        case iw_I10_type:
-         o = (((GET_IW_I10_IMM10 (opcode) & 0x3ff) ^ 0x400) - 0x400) << 1;
+         o = (((int32_t) ((GET_IW_I10_IMM10 (opcode) & 0x3ff) ^ 0x400)
+               - 0x400)
+              << 1);
          break;
        default:
          bad_opcode (op);
@@ -704,7 +712,9 @@ nios2_print_insn_arg (const char *argptr,
       switch (op->format)
        {
        case iw_T1I7_type:
-         o = (((GET_IW_T1I7_IMM7 (opcode) & 0x7f) ^ 0x40) - 0x40) << 1;
+         o = (((int32_t) ((GET_IW_T1I7_IMM7 (opcode) & 0x7f) ^ 0x40)
+               - 0x40)
+              << 1);
          break;
        default:
          bad_opcode (op);