diff options
author | Richard Henderson <rth@redhat.com> | 1999-07-08 16:14:07 +0000 |
---|---|---|
committer | Richard Henderson <rth@redhat.com> | 1999-07-08 16:14:07 +0000 |
commit | 9df31319e84a3cb3999930a846f8a98e66bc1632 (patch) | |
tree | aa88938011632fabd3f040cd095f4ee6f2ba7b09 /opcodes/sparc-dis.c | |
parent | feb90132a0041e9a0fa9fb338c8f7214039d0f18 (diff) | |
download | fsf-binutils-gdb-9df31319e84a3cb3999930a846f8a98e66bc1632.zip fsf-binutils-gdb-9df31319e84a3cb3999930a846f8a98e66bc1632.tar.gz fsf-binutils-gdb-9df31319e84a3cb3999930a846f8a98e66bc1632.tar.bz2 |
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/sparc-dis.c')
-rw-r--r-- | opcodes/sparc-dis.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/opcodes/sparc-dis.c b/opcodes/sparc-dis.c index 0975b28..9fbdb60 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!!! */ |