aboutsummaryrefslogtreecommitdiff
path: root/opcodes/arc-dis.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2012-02-27 06:31:57 +0000
committerAlan Modra <amodra@gmail.com>2012-02-27 06:31:57 +0000
commitcdb062354ec534d97597dcfa20fd032c799dd0c1 (patch)
treea886139b36eb2b6ca213e27741db8aa5c4e38c25 /opcodes/arc-dis.c
parent0d8abe3096bbaa819dd08679d5098d16c4bdd1e1 (diff)
downloadgdb-cdb062354ec534d97597dcfa20fd032c799dd0c1.zip
gdb-cdb062354ec534d97597dcfa20fd032c799dd0c1.tar.gz
gdb-cdb062354ec534d97597dcfa20fd032c799dd0c1.tar.bz2
* arc-dis.c (BITS): Don't use shifts to mask off bits.
(FIELDD): Sign extend with xor,sub.
Diffstat (limited to 'opcodes/arc-dis.c')
-rw-r--r--opcodes/arc-dis.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/opcodes/arc-dis.c b/opcodes/arc-dis.c
index b4cc241..ac7379d 100644
--- a/opcodes/arc-dis.c
+++ b/opcodes/arc-dis.c
@@ -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 \