| Index: opcodes/cgen-asm.c
|
| diff --git a/opcodes/cgen-asm.c b/opcodes/cgen-asm.c
|
| index f5fde408290c2ff7e5051192de9ace2459fd762d..901a578f54588d8e52396a0c8d951eddf22b2081 100644
|
| --- a/opcodes/cgen-asm.c
|
| +++ b/opcodes/cgen-asm.c
|
| @@ -1,6 +1,6 @@
|
| /* CGEN generic assembler support code.
|
| - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007
|
| - Free Software Foundation, Inc.
|
| + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007,
|
| + 2011 Free Software Foundation, Inc.
|
|
|
| This file is part of libopcodes.
|
|
|
| @@ -268,7 +268,23 @@ cgen_parse_signed_integer (CGEN_CPU_DESC cd,
|
| &result, &value);
|
| /* FIXME: Examine `result'. */
|
| if (!errmsg)
|
| - *valuep = value;
|
| + {
|
| + /* Handle the case where a hex value is parsed on a 64-bit host.
|
| + A value like 0xffffe000 is clearly intended to be a negative
|
| + 16-bit value, but on a 64-bit host it will be parsed by gas
|
| + as 0x00000000ffffe000.
|
| +
|
| + The shifts below are designed not to produce compile time
|
| + warnings on a 32-bit host. */
|
| + if (sizeof (value) > 4
|
| + && result == CGEN_PARSE_OPERAND_RESULT_NUMBER
|
| + && value > 0
|
| + && (value & 0x80000000)
|
| + && ((value >> 31) == 1))
|
| + value |= -1 << 31;
|
| +
|
| + *valuep = value;
|
| + }
|
| return errmsg;
|
| }
|
|
|
|
|