diff options
author | Alan Modra <amodra@gmail.com> | 2000-05-14 11:48:42 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2000-05-14 11:48:42 +0000 |
commit | 4132022df14e11a413f383a14042b49c663979ba (patch) | |
tree | 56cd3af0ba7d1c1658adc090dce69e8b0aa15f99 /gas/config/tc-h8300.c | |
parent | e3a696124456c88ac2d10d7ae119b6375cf2a34f (diff) | |
download | binutils-4132022df14e11a413f383a14042b49c663979ba.zip binutils-4132022df14e11a413f383a14042b49c663979ba.tar.gz binutils-4132022df14e11a413f383a14042b49c663979ba.tar.bz2 |
Kazu Hirata's output reloc for mov.
Don't rely on short being 16 bits.
Diffstat (limited to 'gas/config/tc-h8300.c')
-rw-r--r-- | gas/config/tc-h8300.c | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/gas/config/tc-h8300.c b/gas/config/tc-h8300.c index 736d6b9..2b63b00 100644 --- a/gas/config/tc-h8300.c +++ b/gas/config/tc-h8300.c @@ -1,5 +1,6 @@ /* 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. @@ -886,6 +887,11 @@ do_a_fix_imm (offset, operand, relaxmode) bytes[1] = operand->exp.X_add_number >> 16; bytes[2] = operand->exp.X_add_number >> 8; 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; } @@ -915,19 +921,15 @@ do_a_fix_imm (offset, operand, relaxmode) idx = R_MOV16B1; else 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; case L_8: size = 1; where = 0; idx = R_RELBYTE; - /* This used to use a cast to char, but that fails if char is an - unsigned type. We can't use `signed char', as that isn't valid - 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; + operand->exp.X_add_number = + ((operand->exp.X_add_number & 0xff) ^ 0x80) - 0x80; } fix_new_exp (frag_now, @@ -1114,13 +1116,8 @@ build_bytes (this_try, operand) } operand[i].exp.X_add_number -= 1; - /* This used to use a cast to char, but that fails if char is an - unsigned type. We can't use `signed char', as that isn't valid - 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; + operand[i].exp.X_add_number = + ((operand[i].exp.X_add_number & 0xff) ^ 0x80) - 0x80; fix_new_exp (frag_now, output - frag_now->fr_literal + where, @@ -1151,7 +1148,8 @@ build_bytes (this_try, operand) (unsigned long) operand->exp.X_add_number); } 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, output - frag_now->fr_literal, 4, |