Kazu Hirata's output reloc for mov.
Don't rely on short being 16 bits.
This commit is contained in:
parent
e3a6961244
commit
4132022df1
|
@ -1,3 +1,15 @@
|
||||||
|
2000-05-14 Alan Modra <alan@linuxcare.com.au>
|
||||||
|
|
||||||
|
* config/tc-h8300.c (do_a_fix_imm): Don't rely on `short' being 16
|
||||||
|
bits. Instead explicitly mask and sign extend. Do the 8 bit mask
|
||||||
|
and sign extend without an if statement.
|
||||||
|
(build_bytes): Likewise.
|
||||||
|
|
||||||
|
2000-05-14 Kazu Hirata <kazu@hxi.com>
|
||||||
|
|
||||||
|
* config/tc-h8300.c (do_a_fix_imm): Output a reloc for no
|
||||||
|
X_add_symbol L_32 case.
|
||||||
|
|
||||||
2000-05-14 David O'Brien <obrien@FreeBSD.org>
|
2000-05-14 David O'Brien <obrien@FreeBSD.org>
|
||||||
|
|
||||||
* config/te-freebsd.h: New file.
|
* config/te-freebsd.h: New file.
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/* tc-h8300.c -- Assemble code for the Hitachi H8/300
|
/* tc-h8300.c -- Assemble code for the Hitachi H8/300
|
||||||
Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation.
|
Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 2000
|
||||||
|
Free Software Foundation.
|
||||||
|
|
||||||
This file is part of GAS, the GNU Assembler.
|
This file is part of GAS, the GNU Assembler.
|
||||||
|
|
||||||
|
@ -886,6 +887,11 @@ do_a_fix_imm (offset, operand, relaxmode)
|
||||||
bytes[1] = operand->exp.X_add_number >> 16;
|
bytes[1] = operand->exp.X_add_number >> 16;
|
||||||
bytes[2] = operand->exp.X_add_number >> 8;
|
bytes[2] = operand->exp.X_add_number >> 8;
|
||||||
bytes[3] = operand->exp.X_add_number >> 0;
|
bytes[3] = operand->exp.X_add_number >> 0;
|
||||||
|
if (relaxmode != 0)
|
||||||
|
{
|
||||||
|
idx = (relaxmode == 2) ? R_MOV24B1 : R_MOVL1;
|
||||||
|
fix_new_exp (frag_now, offset, 4, &operand->exp, 0, idx);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -915,19 +921,15 @@ do_a_fix_imm (offset, operand, relaxmode)
|
||||||
idx = R_MOV16B1;
|
idx = R_MOV16B1;
|
||||||
else
|
else
|
||||||
idx = R_RELWORD;
|
idx = R_RELWORD;
|
||||||
operand->exp.X_add_number = (short)operand->exp.X_add_number;
|
operand->exp.X_add_number =
|
||||||
|
((operand->exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
|
||||||
break;
|
break;
|
||||||
case L_8:
|
case L_8:
|
||||||
size = 1;
|
size = 1;
|
||||||
where = 0;
|
where = 0;
|
||||||
idx = R_RELBYTE;
|
idx = R_RELBYTE;
|
||||||
/* This used to use a cast to char, but that fails if char is an
|
operand->exp.X_add_number =
|
||||||
unsigned type. We can't use `signed char', as that isn't valid
|
((operand->exp.X_add_number & 0xff) ^ 0x80) - 0x80;
|
||||||
K&R C. */
|
|
||||||
if (operand->exp.X_add_number & 0x80)
|
|
||||||
operand->exp.X_add_number |= ((offsetT) -1 << 8);
|
|
||||||
else
|
|
||||||
operand->exp.X_add_number &= 0xff;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fix_new_exp (frag_now,
|
fix_new_exp (frag_now,
|
||||||
|
@ -1114,13 +1116,8 @@ build_bytes (this_try, operand)
|
||||||
}
|
}
|
||||||
|
|
||||||
operand[i].exp.X_add_number -= 1;
|
operand[i].exp.X_add_number -= 1;
|
||||||
/* This used to use a cast to char, but that fails if char is an
|
operand[i].exp.X_add_number =
|
||||||
unsigned type. We can't use `signed char', as that isn't valid
|
((operand[i].exp.X_add_number & 0xff) ^ 0x80) - 0x80;
|
||||||
K&R C. */
|
|
||||||
if (operand[i].exp.X_add_number & 0x80)
|
|
||||||
operand[i].exp.X_add_number |= ((offsetT) -1 << 8);
|
|
||||||
else
|
|
||||||
operand[i].exp.X_add_number &= 0xff;
|
|
||||||
|
|
||||||
fix_new_exp (frag_now,
|
fix_new_exp (frag_now,
|
||||||
output - frag_now->fr_literal + where,
|
output - frag_now->fr_literal + where,
|
||||||
|
@ -1151,7 +1148,8 @@ build_bytes (this_try, operand)
|
||||||
(unsigned long) operand->exp.X_add_number);
|
(unsigned long) operand->exp.X_add_number);
|
||||||
}
|
}
|
||||||
if (!Hmode)
|
if (!Hmode)
|
||||||
operand[i].exp.X_add_number = (short) operand[i].exp.X_add_number;
|
operand[i].exp.X_add_number =
|
||||||
|
((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
|
||||||
fix_new_exp (frag_now,
|
fix_new_exp (frag_now,
|
||||||
output - frag_now->fr_literal,
|
output - frag_now->fr_literal,
|
||||||
4,
|
4,
|
||||||
|
|
Loading…
Reference in New Issue