summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorChao-ying Fu <fu@mips.com>2013-05-01 01:02:01 +0000
committerChao-ying Fu <fu@mips.com>2013-05-01 01:02:01 +0000
commitb8af23eb82d461a96aa348d05bc1a149d1237bc4 (patch)
tree037a0bc5c3ebd7f64ede683154f19bdd66d3cab6 /gas
parentb2ab9e68f5e50e88eb33bf01771c3d62ad51fc00 (diff)
downloadbinutils-redhat-b8af23eb82d461a96aa348d05bc1a149d1237bc4.tar.gz
2013-04-30 Chao-ying Fu <Chao-ying.Fu@imgtec.com>
* config/tc-mips.c (mips_ip): Add sizelo. For "+C", "+G", and "+H", set sizelo and compare against it.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-mips.c13
2 files changed, 13 insertions, 5 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index ec756d8fc7..f152068871 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2013-04-30 Chao-ying Fu <Chao-ying.Fu@imgtec.com>
+
+ * config/tc-mips.c (mips_ip): Add sizelo.
+ For "+C", "+G", and "+H", set sizelo and compare against it.
+
2013-04-29 Nick Clifton <nickc@redhat.com>
* as.c (Options): Add -gdwarf-sections.
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index a9b46e971d..29d2c02254 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