diff options
author | Martin Hunt <hunt@redhat.com> | 1996-07-23 17:59:22 +0000 |
---|---|---|
committer | Martin Hunt <hunt@redhat.com> | 1996-07-23 17:59:22 +0000 |
commit | 9305039104d98456e975a675e65d791fa0a3e80b (patch) | |
tree | ad50976e446c8dce5939bd460cd25adabcd7dd03 /gas/config/tc-d10v.c | |
parent | 11609502f01db9382e273363a43335f621300629 (diff) | |
download | gdb-9305039104d98456e975a675e65d791fa0a3e80b.zip gdb-9305039104d98456e975a675e65d791fa0a3e80b.tar.gz gdb-9305039104d98456e975a675e65d791fa0a3e80b.tar.bz2 |
start-sanitize-d10v
Tue Jul 23 10:49:36 1996 Martin M. Hunt <hunt@pizza.cygnus.com>
* config/tc-d10v.c (md_apply_fix3): Fix all instruction
addresses to be right-shifted by 2.
end-sanitize-d10v
Diffstat (limited to 'gas/config/tc-d10v.c')
-rw-r--r-- | gas/config/tc-d10v.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/gas/config/tc-d10v.c b/gas/config/tc-d10v.c index c1a9465..9316165 100644 --- a/gas/config/tc-d10v.c +++ b/gas/config/tc-d10v.c @@ -369,6 +369,7 @@ d10v_insert_operand (insn, op_type, value, left) shift += 15; bits = d10v_operands[op_type].bits; + /* truncate to the proper number of bits */ /* FIXME: overflow checking here? */ value &= 0x7FFFFFFF >> (31 - bits); @@ -866,9 +867,9 @@ md_apply_fix3 (fixp, valuep, seg) valueT *valuep; segT seg; { - valueT value; char *where; unsigned long insn; + long value; int op_type; int left=0; @@ -911,9 +912,23 @@ md_apply_fix3 (fixp, valuep, seg) value, and stuff the instruction back again. */ where = fixp->fx_frag->fr_literal + fixp->fx_where; insn = bfd_getb32 ((unsigned char *) where); - /* printf(" insn=%x value=%x\n",insn,value); */ - insn = d10v_insert_operand (insn, op_type, (offsetT) value, left); + switch (fixp->fx_r_type) + { + case BFD_RELOC_D10V_10_PCREL_L: + case BFD_RELOC_D10V_10_PCREL_R: + case BFD_RELOC_D10V_18_PCREL: + /* instruction addresses are always right-shifted by 2 + and pc-relative */ + if (!fixp->fx_pcrel) + value -= fixp->fx_where; + value >>= 2; + default: + break; + } + /* printf(" insn=%x value=%x where=%x pcrel=%x\n",insn,value,fixp->fx_where,fixp->fx_pcrel); */ + + insn = d10v_insert_operand (insn, op_type, (offsetT)value, left); /* printf(" new insn=%x\n",insn); */ |