Fix RX GAS handling of integer bignums.

* config/tc-rx.c (rx_op): Correct handling of integer bignums.
This commit is contained in:
Nick Clifton 2015-06-08 11:32:38 +01:00
parent 80fb91378c
commit f0e8c65e02
2 changed files with 33 additions and 22 deletions

View File

@ -1,3 +1,7 @@
2015-06-08 Nick Clifton <nickc@redhat.com>
* config/tc-rx.c (rx_op): Correct handling of integer bignums.
2015-06-04 Matthew Wahab <matthew.wahab@arm.com>
* NEWS: Mention ARMv8.1 support in the Aarch64 port.

View File

@ -942,43 +942,50 @@ rx_field5s2 (expressionS exp)
void
rx_op (expressionS exp, int nbytes, int type)
{
int v = 0;
offsetT v = 0;
if ((exp.X_op == O_constant || exp.X_op == O_big)
&& type != RXREL_PCREL)
{
if (exp.X_op == O_big && exp.X_add_number <= 0)
if (exp.X_op == O_big)
{
LITTLENUM_TYPE w[2];
char * ip = rx_bytes.ops + rx_bytes.n_ops;
if (exp.X_add_number == -1)
{
LITTLENUM_TYPE w[2];
char * ip = rx_bytes.ops + rx_bytes.n_ops;
gen_to_words (w, F_PRECISION, 8);
gen_to_words (w, F_PRECISION, 8);
#if RX_OPCODE_BIG_ENDIAN
ip[0] = w[0] >> 8;
ip[1] = w[0];
ip[2] = w[1] >> 8;
ip[3] = w[1];
ip[0] = w[0] >> 8;
ip[1] = w[0];
ip[2] = w[1] >> 8;
ip[3] = w[1];
#else
ip[3] = w[0] >> 8;
ip[2] = w[0];
ip[1] = w[1] >> 8;
ip[0] = w[1];
ip[3] = w[0] >> 8;
ip[2] = w[0];
ip[1] = w[1] >> 8;
ip[0] = w[1];
#endif
rx_bytes.n_ops += 4;
rx_bytes.n_ops += 4;
return;
}
v = ((generic_bignum[1] & LITTLENUM_MASK) << LITTLENUM_NUMBER_OF_BITS)
| (generic_bignum[0] & LITTLENUM_MASK);
}
else
v = exp.X_add_number;
while (nbytes)
{
v = exp.X_add_number;
while (nbytes)
{
#if RX_OPCODE_BIG_ENDIAN
OP ((v >> (8 * (nbytes - 1))) & 0xff);
OP ((v >> (8 * (nbytes - 1))) & 0xff);
#else
OP (v & 0xff);
v >>= 8;
OP (v & 0xff);
v >>= 8;
#endif
nbytes --;
}
nbytes --;
}
}
else