From ad6cec4372cbd9c17151f4b6b84759a2fb30f2b2 Mon Sep 17 00:00:00 2001 From: Matthew Gretton-Dann Date: Wed, 7 Dec 2011 16:46:35 +0000 Subject: [PATCH] * gas/config/tc-arm.c (ARM_IT_MAX_OPERANDS): New define. (arm_it): Use ARM_IT_MAX_OPERANDS. (neon_select_shape): Ensure we have matched all operands. * gas/testsuite/gas/arm/neon-suffix-bad.l: Add testcase. * gas/testsuite/gas/arm/neon-suffix-bad.s: Likewise. --- gas/ChangeLog | 6 ++++++ gas/config/tc-arm.c | 9 +++++++-- gas/testsuite/ChangeLog | 5 +++++ gas/testsuite/gas/arm/neon-suffix-bad.l | 4 +++- gas/testsuite/gas/arm/neon-suffix-bad.s | 3 ++- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index cc62920dbf3..d52c5b68dbf 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2011-11-07 Matthew Gretton-Dann + + * config/tc-arm.c (ARM_IT_MAX_OPERANDS): New define. + (arm_it): Use ARM_IT_MAX_OPERANDS. + (neon_select_shape): Ensure we have matched all operands. + 2011-11-07 Matthew Gretton-Dann * config/tc-arm.c (parse_neon_mov): Update which_operand diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 52a90300cde..064267ed13f 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -351,6 +351,9 @@ enum it_instruction_type IT_INSN /* The IT insn has been parsed. */ }; +/* The maximum number of operands we need. */ +#define ARM_IT_MAX_OPERANDS 6 + struct arm_it { const char * error; @@ -402,7 +405,7 @@ struct arm_it unsigned negative : 1; /* Index register was negated. */ unsigned shifted : 1; /* Shift applied to operation. */ unsigned shift_kind : 3; /* Shift operation (enum shift_kind). */ - } operands[6]; + } operands[ARM_IT_MAX_OPERANDS]; }; static struct arm_it inst; @@ -12415,7 +12418,9 @@ neon_select_shape (enum neon_shape shape, ...) if (!matches) break; } - if (matches) + if (matches && (j >= ARM_IT_MAX_OPERANDS || !inst.operands[j].present)) + /* We've matched all the entries in the shape table, and we don't + have any left over operands which have not been matched. */ break; } diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 187928867aa..8d6e8b67fb5 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-07 Matthew Gretton-Dann + + * gas/arm/neon-suffix-bad.l: Add testcase. + * gas/arm/neon-suffix-bad.s: Likewise. + 2011-12-05 Richard Earnshaw * gas/arm/attr-any-armv4t.d: New test. diff --git a/gas/testsuite/gas/arm/neon-suffix-bad.l b/gas/testsuite/gas/arm/neon-suffix-bad.l index 4c44f6b1cb1..091429dc11a 100644 --- a/gas/testsuite/gas/arm/neon-suffix-bad.l +++ b/gas/testsuite/gas/arm/neon-suffix-bad.l @@ -2,6 +2,8 @@ [^:]*:3: Error: invalid neon suffix for non neon instruction [^:]*:4: Error: invalid neon suffix for non neon instruction [^:]*:5: Error: invalid neon suffix for non neon instruction -[^:]*:8: Error: invalid neon suffix for non neon instruction +[^:]*:6: Error: invalid instruction shape -- `vcvt.f64.s32 d0,s0,#11' [^:]*:9: Error: invalid neon suffix for non neon instruction [^:]*:10: Error: invalid neon suffix for non neon instruction +[^:]*:11: Error: invalid neon suffix for non neon instruction +[^:]*:12: Error: invalid instruction shape -- `vcvt.f64.s32 d0,s0,#11' diff --git a/gas/testsuite/gas/arm/neon-suffix-bad.s b/gas/testsuite/gas/arm/neon-suffix-bad.s index 288dba762b3..20c60fe89f5 100644 --- a/gas/testsuite/gas/arm/neon-suffix-bad.s +++ b/gas/testsuite/gas/arm/neon-suffix-bad.s @@ -3,10 +3,11 @@ add.f32 r0, r0, r0 faddd.f32 d0, d0, d0 faddd.f64 d0, d0, d0 +vcvt.f64.s32 d0, s0, #11 .thumb add.f32 r0, r0, r0 faddd.f32 d0, d0, d0 faddd.f64 d0, d0, d0 - +vcvt.f64.s32 d0, s0, #11 -- 2.30.2