This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] v850: Handle out-of-range assembler constants on 64-bit hosts
- From: Segher Boessenkool <segher at kernel dot crashing dot org>
- To: binutils at sourceware dot org
- Cc: Segher Boessenkool <segher at kernel dot crashing dot org>
- Date: Tue, 9 Mar 2010 18:59:45 +0100
- Subject: [PATCH] v850: Handle out-of-range assembler constants on 64-bit hosts
Tested on x86_64-linux cross to frv-elf, no new failures. Okay to apply?
Segher
---
gas/config/tc-v850.c | 19 ++++++++++++++++++-
1 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/gas/config/tc-v850.c b/gas/config/tc-v850.c
index c6c3439..e0ac162 100644
--- a/gas/config/tc-v850.c
+++ b/gas/config/tc-v850.c
@@ -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];
--
1.6.5.2.154.g549c