tic4x: sign extension using shifts
authorAlan Modra <amodra@gmail.com>
Sun, 12 Jan 2020 09:46:22 +0000 (20:16 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 13 Jan 2020 01:42:05 +0000 (12:12 +1030)
Don't do that.  Especially don't use shift counts that assume the type
being shifted is 32 bits when the type is long/unsigned long.  Also
reverts part of a change I made on 2019-12-11 to tic4x_print_register
that on closer inspection turns out to be unnecessary.

include/
* opcode/tic4x.h (EXTR): Delete.
(EXTRU, EXTRS, INSERTU, INSERTS): Rewrite without zero/sign
extension using shifts.  Do trim INSERTU value to specified bitfield.
opcodes/
* tic4x-dis.c (tic4x_print_register): Remove dead code.
gas/
* config/tc-tic4x.c (tic4x_operands_match): Correct tic3x trap
insertion.

gas/ChangeLog
gas/config/tc-tic4x.c
include/ChangeLog
include/opcode/tic4x.h
opcodes/ChangeLog
opcodes/tic4x-dis.c

index 245bd743634b5ce74e95874b0f8235857e20859b..4186fbd05e31ca736567fd85c1d021b7d0cec2e2 100644 (file)
@@ -1,3 +1,8 @@
+2020-01-13  Alan Modra  <amodra@gmail.com>
+
+       * config/tc-tic4x.c (tic4x_operands_match): Correct tic3x trap
+       insertion.
+
 2020-01-10  Alan Modra  <amodra@gmail.com>
 
        * testsuite/gas/elf/pr14891.s: Don't start directives in first column.
index 913120d9abacd0d0e044d895d03c69832a26f24f..cc477b62bbca1d626e05d94e3e4d7ba46a91accf 100644 (file)
@@ -2193,7 +2193,7 @@ tic4x_operands_match (tic4x_inst_t *inst, tic4x_insn_t *tinsn, int check)
                }
              else if (exp->X_add_number < 32 && IS_CPU_TIC3X (tic4x_cpu))
                {
-                 INSERTU (opcode, exp->X_add_number | 0x20, 4, 0);
+                 INSERTU (opcode, exp->X_add_number | 0x20, 5, 0);
                  continue;
                }
              else
index 91765c5be61c29352e4509b3a0b19942660ef1f9..3e2cdcaeb48dbcffe69a210abf46ae200794140d 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-13  Alan Modra  <amodra@gmail.com>
+
+       * opcode/tic4x.h (EXTR): Delete.
+       (EXTRU, EXTRS, INSERTU, INSERTS): Rewrite without zero/sign
+       extension using shifts.  Do trim INSERTU value to specified bitfield.
+
 2020-01-10  Alan Modra  <amodra@gmail.com>
 
        * opcode/spu.h: Formatting.
index 66b4ebfd0826b495a97f77694d8a7605e01f3ddf..04e3f0853d2b8eabd5408eb32e115f65dc00c01e 100644 (file)
 #define IS_CPU_TIC4X(v) ((v) ==  0 || (v) == 40 || (v) == 44)
 
 /* Define some bitfield extraction/insertion macros.  */
-#define EXTR(inst, m, l)          ((inst) << (31 - (m)) >> (31 - ((m) - (l)))) 
-#define EXTRU(inst, m, l)         EXTR ((unsigned long)(inst), (m), (l))
-#define EXTRS(inst, m, l)         EXTR ((long)(inst), (m), (l))
-#define INSERTU(inst, val, m, l)  (inst |= ((val) << (l))) 
-#define INSERTS(inst, val, m, l)  INSERTU (inst, ((val) & ((1 << ((m) - (l) + 1)) - 1)), m, l)
+#define EXTRU(inst, m, l) \
+  (((inst) >> (l)) & ((2u << ((m) - (l))) - 1))
+#define EXTRS(inst, m, l) \
+  ((int) ((EXTRU (inst, m, l) ^ (1u << ((m) - (l)))) - (1u << ((m) - (l)))))
+#define INSERTU(inst, val, m, l) \
+  ((inst) |= ((val) & ((2u << ((m) - (l))) - 1)) << (l))
+#define INSERTS INSERTU
 
 /* Define register numbers.  */
 typedef enum
index feeb7c55357227efc12b7d80f9f352572d8cdae1..26d1e6c4a2c142e2a7df8e87463ca9ac422e5f41 100644 (file)
@@ -1,3 +1,7 @@
+2020-01-13  Alan Modra  <amodra@gmail.com>
+
+       * tic4x-dis.c (tic4x_print_register): Remove dead code.
+
 2020-01-13  Alan Modra  <amodra@gmail.com>
 
        * fr30-ibld.c: Regenerate.
index 1d7946918b706418cd392eaa6804139cf6b3c2d1..34e270b71387ff53fa7139e04c9ae59f3fc37598 100644 (file)
@@ -148,8 +148,7 @@ tic4x_print_register (struct disassemble_info *info, unsigned long regno)
              = (tic4x_register_t *)(tic4x_registers + i);
        }
     }
-  if (regno > (IS_CPU_TIC4X (tic4x_version) ? TIC4X_REG_MAX : TIC3X_REG_MAX)
-      || registertable[regno] == NULL)
+  if (regno > (IS_CPU_TIC4X (tic4x_version) ? TIC4X_REG_MAX : TIC3X_REG_MAX))
     return 0;
   if (info != NULL)
     (*info->fprintf_func) (info->stream, "%s", registertable[regno]->name);