2010-03-13 Segher Boessenkool <segher@kernel.crashing.org>
authorSegher Boessenkool <segher@kernel.crashing.org>
Sat, 13 Mar 2010 15:54:21 +0000 (15:54 +0000)
committerSegher Boessenkool <segher@kernel.crashing.org>
Sat, 13 Mar 2010 15:54:21 +0000 (15:54 +0000)
        * config/tc-v850.c (v850_insert_operand): Handle out-of-range
        assembler constants on 64-bit hosts.

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

index 4ff6ed3..32b0da6 100644 (file)
@@ -1,3 +1,8 @@
+2010-03-13  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * config/tc-v850.c (v850_insert_operand): Handle out-of-range
+       assembler constants on 64-bit hosts.
+
 2010-03-10  Mike Frysinger  <michael.frysinger@analog.com>
 
        * bfin-defs.h, bfin-lex.l, bfin-parse.y, tc-bfin.c, tc-bfin.h:
index c6c3439..e0ac162 100644 (file)
@@ -1536,7 +1536,24 @@ v850_insert_operand (unsigned long insn,
                min = 0;
            }
 
-         if (val < (offsetT) min || val > (offsetT) max)
+         /* Some people write constants with the sign extension done by
+            hand but only up to 32 bits.  This shouldn't really be valid,
+            but, to permit this code to assemble on a 64-bit host, we
+            sign extend the 32-bit value to 64 bits if so doing makes the
+            value valid.  */
+         if (val > max
+             && (offsetT) (val - 0x80000000 - 0x80000000) >= min
+             && (offsetT) (val - 0x80000000 - 0x80000000) <= max)
+           val = val - 0x80000000 - 0x80000000;
+
+         /* Similarly, people write expressions like ~(1<<15), and expect
+            this to be OK for a 32-bit unsigned value.  */
+         else if (val < min
+                  && (offsetT) (val + 0x80000000 + 0x80000000) >= min
+                  && (offsetT) (val + 0x80000000 + 0x80000000) <= max)
+           val = val + 0x80000000 + 0x80000000;
+
+         else if (val < (offsetT) min || val > (offsetT) max)
            {
              char buf [128];