diff options
author | Nick Clifton <nickc@redhat.com> | 2015-06-08 11:32:38 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2015-06-08 11:32:38 +0100 |
commit | f0e8c65e02e84ceb85b569508aa4f54ecb0a8abe (patch) | |
tree | 16d7377b3fd6d93a5694fbcbe3033a6a9abb06c8 /gas/config/tc-rx.c | |
parent | 80fb91378c91a8239817a5ab2b1c3e346109db25 (diff) | |
download | gdb-f0e8c65e02e84ceb85b569508aa4f54ecb0a8abe.zip gdb-f0e8c65e02e84ceb85b569508aa4f54ecb0a8abe.tar.gz gdb-f0e8c65e02e84ceb85b569508aa4f54ecb0a8abe.tar.bz2 |
Fix RX GAS handling of integer bignums.
* config/tc-rx.c (rx_op): Correct handling of integer bignums.
Diffstat (limited to 'gas/config/tc-rx.c')
-rw-r--r-- | gas/config/tc-rx.c | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/gas/config/tc-rx.c b/gas/config/tc-rx.c index 4e58f88..ec54b32 100644 --- a/gas/config/tc-rx.c +++ b/gas/config/tc-rx.c @@ -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 |