summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2015-04-02 17:13:12 +0100
committerNick Clifton <nickc@redhat.com>2015-04-02 17:13:12 +0100
commitf66adc4eada1884cef90aa978561b9b2008cdaf2 (patch)
tree71ac093b46b12791ec1032bef7c3b8ba79fdf469
parent03e080386e266243b2af667af026b992822085cd (diff)
downloadbinutils-gdb-f66adc4eada1884cef90aa978561b9b2008cdaf2.tar.gz
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.
-rw-r--r--gas/ChangeLog2
-rw-r--r--gas/config/tc-microblaze.c14
2 files changed, 11 insertions, 5 deletions
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 <renlin.li@arm.com>
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)