* arc-dis.c (BITS): Don't use shifts to mask off bits.
authorAlan Modra <amodra@gmail.com>
Mon, 27 Feb 2012 06:31:57 +0000 (06:31 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 27 Feb 2012 06:31:57 +0000 (06:31 +0000)
(FIELDD): Sign extend with xor,sub.

opcodes/ChangeLog
opcodes/arc-dis.c

index 70d5f34543d61d1037c5b2a8d397f63d2c1c724b..cc0af8e420a2c71962888abc5707e42c7d90e609 100644 (file)
@@ -1,3 +1,8 @@
+2012-02-27  Alan Modra  <amodra@gmail.com>
+
+       * arc-dis.c (BITS): Don't use shifts to mask off bits.
+       (FIELDD): Sign extend with xor,sub.
+
 2012-02-25  Walter Lee  <walt@tilera.com>
 
        * tilegx-opc.c: Handle TILEGX_OPC_LD4S_TLS and TILEGX_OPC_LD_TLS.
index b4cc241615fc939860212db1e49857a9845e5b3f..ac7379d7b7b2bec7f44f85eca0c060c7c00b77d1 100644 (file)
@@ -1,6 +1,6 @@
 /* Instruction printing code for the ARC.
-   Copyright 1994, 1995, 1997, 1998, 2000, 2001, 2002, 2005, 2007, 2009, 2010
-   Free Software Foundation, Inc.
+   Copyright 1994, 1995, 1997, 1998, 2000, 2001, 2002, 2005, 2007, 2009,
+   2010, 2012 Free Software Foundation, Inc.
    Contributed by Doug Evans (dje@cygnus.com).
 
    This file is part of libopcodes.
@@ -60,15 +60,14 @@ typedef enum
 } a4_decoding_class;
 
 #define BIT(word,n)    ((word) & (1 << n))
-#define BITS(word,s,e)  (((word) << (31 - e)) >> (s + (31 - e)))
+#define BITS(word,s,e)  (((word) >> s) & ((1 << (e + 1 - s)) - 1))
 #define OPCODE(word)   (BITS ((word), 27, 31))
 #define FIELDA(word)   (BITS ((word), 21, 26))
 #define FIELDB(word)   (BITS ((word), 15, 20))
 #define FIELDC(word)   (BITS ((word),  9, 14))
 
-/* FIELD D is signed in all of its uses, so we make sure argument is
-   treated as signed for bit shifting purposes:  */
-#define FIELDD(word)   (BITS (((signed int)word), 0, 8))
+/* FIELD D is signed.  */
+#define FIELDD(word)   ((BITS ((word), 0, 8) ^ 0x100) - 0x100)
 
 #define PUT_NEXT_WORD_IN(a)                                            \
   do                                                                   \