From: Martin Hunt Date: Tue, 23 Jul 1996 17:59:22 +0000 (+0000) Subject: start-sanitize-d10v X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9305039104d98456e975a675e65d791fa0a3e80b;p=binutils-gdb.git start-sanitize-d10v Tue Jul 23 10:49:36 1996 Martin M. Hunt * config/tc-d10v.c (md_apply_fix3): Fix all instruction addresses to be right-shifted by 2. end-sanitize-d10v --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 9f626b47154..194b96ce2b4 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,4 +1,9 @@ start-sanitize-d10v +Tue Jul 23 10:49:36 1996 Martin M. Hunt + + * config/tc-d10v.c (md_apply_fix3): Fix all instruction + addresses to be right-shifted by 2. + Mon Jul 22 11:32:36 1996 Martin M. Hunt * config/tc-d10v.c: Many changes to get relocs working. diff --git a/gas/config/tc-d10v.c b/gas/config/tc-d10v.c index c1a9465ae1a..9316165f622 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); */