summaryrefslogtreecommitdiff
path: root/opcodes
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>1999-07-08 16:14:07 +0000
committerRichard Henderson <rth@redhat.com>1999-07-08 16:14:07 +0000
commit9df31319e84a3cb3999930a846f8a98e66bc1632 (patch)
treeaa88938011632fabd3f040cd095f4ee6f2ba7b09 /opcodes
parentfeb90132a0041e9a0fa9fb338c8f7214039d0f18 (diff)
downloadbinutils-gdb-9df31319e84a3cb3999930a846f8a98e66bc1632.tar.gz
Jakub Jelinek <jj@ultra.linux.cz>
* sparc-dis.c (print_insn_sparc): Differentiate between addition and oring when guessing symbol for comment.
Diffstat (limited to 'opcodes')
-rw-r--r--opcodes/ChangeLog5
-rw-r--r--opcodes/sparc-dis.c15
2 files changed, 15 insertions, 5 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 2ce4c69d06d..bc40b503ed9 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,8 @@
+1999-07-08 Jakub Jelinek <jj@ultra.linux.cz>
+
+ * sparc-dis.c (print_insn_sparc): Differentiate between
+ addition and oring when guessing symbol for comment.
+
1999-07-05 Nick Clifton <nickc@cygnus.com>
* arm-dis.c (print_insn_arm): Display hex equivalent of rotated
diff --git a/opcodes/sparc-dis.c b/opcodes/sparc-dis.c
index 0975b280e28..9fbdb60c8c2 100644
--- a/opcodes/sparc-dis.c
+++ b/opcodes/sparc-dis.c
@@ -283,6 +283,7 @@ print_insn_sparc (memaddr, info)
/* Nonzero means that we have found an instruction which has
the effect of adding or or'ing the imm13 field to rs1. */
int imm_added_to_rs1 = 0;
+ int imm_ored_to_rs1 = 0;
/* Nonzero means that we have found a plus sign in the args
field of the opcode table. */
@@ -293,8 +294,9 @@ print_insn_sparc (memaddr, info)
/* Do we have an `add' or `or' instruction combining an
immediate with rs1? */
- if (opcode->match == 0x80102000 || opcode->match == 0x80002000)
- /* (or) (add) */
+ if (opcode->match == 0x80102000) /* or */
+ imm_ored_to_rs1 = 1;
+ if (opcode->match == 0x80002000) /* add */
imm_added_to_rs1 = 1;
if (X_RS1 (insn) != X_RD (insn)
@@ -670,7 +672,7 @@ print_insn_sparc (memaddr, info)
If so, attempt to print the result of the add or
or (in this context add and or do the same thing)
and its symbolic value. */
- if (imm_added_to_rs1)
+ if (imm_ored_to_rs1 || imm_added_to_rs1)
{
unsigned long prev_insn;
int errcode;
@@ -709,8 +711,11 @@ print_insn_sparc (memaddr, info)
{
(*info->fprintf_func) (stream, "\t! ");
info->target =
- (0xFFFFFFFF & (int) X_IMM22 (prev_insn) << 10)
- | X_SIMM (insn, 13);
+ (0xFFFFFFFF & (int) X_IMM22 (prev_insn) << 10);
+ if (imm_added_to_rs1)
+ info->target += X_SIMM (insn, 13);
+ else
+ info->target |= X_SIMM (insn, 13);
(*info->print_address_func) (info->target, info);
info->insn_type = dis_dref;
info->data_size = 4; /* FIXME!!! */