aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorMartin Hunt <hunt@redhat.com>1996-07-23 17:59:22 +0000
committerMartin Hunt <hunt@redhat.com>1996-07-23 17:59:22 +0000
commit9305039104d98456e975a675e65d791fa0a3e80b (patch)
treead50976e446c8dce5939bd460cd25adabcd7dd03 /gas
parent11609502f01db9382e273363a43335f621300629 (diff)
downloadfsf-binutils-gdb-9305039104d98456e975a675e65d791fa0a3e80b.zip
fsf-binutils-gdb-9305039104d98456e975a675e65d791fa0a3e80b.tar.gz
fsf-binutils-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')
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-d10v.c21
2 files changed, 23 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 9f626b4..194b96c 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,4 +1,9 @@
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.
+
Mon Jul 22 11:32:36 1996 Martin M. Hunt <hunt@pizza.cygnus.com>
* 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 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); */