]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Fix RX GAS handling of integer bignums.
authorNick Clifton <nickc@redhat.com>
Mon, 8 Jun 2015 10:32:38 +0000 (11:32 +0100)
committerNick Clifton <nickc@redhat.com>
Mon, 8 Jun 2015 10:32:38 +0000 (11:32 +0100)
* config/tc-rx.c (rx_op): Correct handling of integer bignums.

gas/ChangeLog
gas/config/tc-rx.c

index 2893726a026034cd9020e3b5105205108c607483..4b78a5134e315dbb0cf876371eb90bbc6b7d3205 100644 (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.
index 4e58f883cff77df8c65de87004d8d1efe2c8e77c..ec54b3237bcee26a48fd7cb9904a8733e21c7e9e 100644 (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