From: Nick Clifton Date: Thu, 2 Apr 2015 16:13:12 +0000 (+0100) Subject: Second fix for microblaze gas port's ability to parse constants. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f66adc4eada1884cef90aa978561b9b2008cdaf2;p=binutils-gdb.git Second fix for microblaze gas port's ability to parse constants. PR gas/18189 * config/tc-microblaze.c (parse_imm): Use offsetT as the type for min and max parameters. Sign extend values before testing. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index e08b0f72cbf..a2383a91e3e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -2,7 +2,7 @@ PR gas/18189 * config/tc-microblaze.c (parse_imm): Use offsetT as the type for - min and max parameters. + min and max parameters. Sign extend values before testing. 2015-04-02 Renlin Li diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c index 6f0e795781a..3309e59823d 100644 --- a/gas/config/tc-microblaze.c +++ b/gas/config/tc-microblaze.c @@ -736,11 +736,17 @@ parse_imm (char * s, expressionS * e, offsetT min, offsetT max) ; /* An error message has already been emitted. */ else if ((e->X_op != O_constant && e->X_op != O_symbol) ) as_fatal (_("operand must be a constant or a label")); - else if ((e->X_op == O_constant) && (e->X_add_number < min - || e->X_add_number > max)) + else if (e->X_op == O_constant) { - as_fatal (_("operand must be absolute in range %lx..%lx, not %lx"), - (long) min, (long) max, (long) e->X_add_number); + /* Special case: sign extend negative 32-bit values to 64-bits. */ + if ((e->X_add_number >> 31) == 1) + e->X_add_number |= (-1 << 31); + + if (e->X_add_number < min || e->X_add_number > max) + { + as_fatal (_("operand must be absolute in range %lx..%lx, not %lx"), + (long) min, (long) max, (long) e->X_add_number); + } } if (atp)