From f02d83189ef10e2cec76d5319fdf94971b46e164 Mon Sep 17 00:00:00 2001 From: Chao-ying Fu Date: Wed, 1 May 2013 01:02:01 +0000 Subject: [PATCH] 2013-04-30 Chao-ying Fu * config/tc-mips.c (mips_ip): Add sizelo. For "+C", "+G", and "+H", set sizelo and compare against it. --- gas/ChangeLog | 5 +++++ gas/config/tc-mips.c | 13 ++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index ec756d8fc7e..f152068871a 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2013-04-30 Chao-ying Fu + + * config/tc-mips.c (mips_ip): Add sizelo. + For "+C", "+G", and "+H", set sizelo and compare against it. + 2013-04-29 Nick Clifton * as.c (Options): Add -gdwarf-sections. diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index a9b46e971d9..29d2c022541 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -10790,6 +10790,7 @@ mips_ip (char *str, struct mips_cl_insn *ip) unsigned int destregno = 0; unsigned int lastpos = 0; unsigned int limlo, limhi; + int sizelo; char *s_reset; offsetT min_range, max_range; long opend; @@ -11374,23 +11375,25 @@ mips_ip (char *str, struct mips_cl_insn *ip) case 'C': /* ext size, becomes MSBD. */ limlo = 1; limhi = 32; + sizelo = 1; goto do_msbd; case 'G': limlo = 33; limhi = 64; + sizelo = 33; goto do_msbd; case 'H': limlo = 33; limhi = 64; + sizelo = 1; goto do_msbd; do_msbd: my_getExpression (&imm_expr, s); check_absolute_expr (ip, &imm_expr); - /* Check for negative input so that small negative numbers - will not succeed incorrectly. The checks against - (pos+size) transitively check "size" itself, - assuming that "pos" is reasonable. */ - if ((long) imm_expr.X_add_number < 0 + /* The checks against (pos+size) don't transitively check + "size" itself, assuming that "pos" is reasonable. + We also need to check the lower bound of "size". */ + if ((long) imm_expr.X_add_number < sizelo || ((unsigned long) imm_expr.X_add_number + lastpos) < limlo || ((unsigned long) imm_expr.X_add_number -- 2.30.2