This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Commit: RX GAS: Fix handling of non-fp bignums


Hi Guys,

  I am checking in the patch below to fix RX port of GAS's handling of
  integer bignums.  Before this patch they were always being treated as
  floating point values, which did not make a lot of sense.

  Tested with an rx-elf toolchain.

Cheers
  Nick

gas/ChangeLog
2015-06-08  Nick Clifton  <nickc@redhat.com>

	* config/tc-rx.c (rx_op): Correct handling of integer bignums.

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]