From ad6cec4372cbd9c17151f4b6b84759a2fb30f2b2 Mon Sep 17 00:00:00 2001
From: Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
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  <matthew.gretton-dann@arm.com>
+
+	* 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  <matthew.gretton-dann@arm.com>
 
 	* 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  <matthew.gretton-dann@arm.com>
+
+	* gas/arm/neon-suffix-bad.l: Add testcase.
+	* gas/arm/neon-suffix-bad.s: Likewise.
+
 2011-12-05  Richard Earnshaw  <rearnsha@arm.com>
 
 	* 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