At the point where check_VecOperands()/VEX_check_operands() get run,
authorJan Beulich <jbeulich@novell.com>
Tue, 31 Jul 2012 07:41:39 +0000 (07:41 +0000)
committerJan Beulich <jbeulich@novell.com>
Tue, 31 Jul 2012 07:41:39 +0000 (07:41 +0000)
all other instruction attributes already matched, so any mismatch here
will tell the user more precisely what is wrong than using an eventual
(and very likely to occur) more generic error encountered on a
subsequent iteration through the template matching loop.

2012-07-31  Jan Beulich <jbeulich@suse.com>

* config/tc-i386.c (match_template): New local variable
'specific_error'. Set it from i.error after failed
check_VecOperands or VEX_check_operands. Use it if set in
preference to i.error when actually issuing disagnostic.

gas/ChangeLog
gas/config/tc-i386.c

index a1a4998081fb9ff4d8c0c8f401b3aec4be3ceab9..600871d7e402beb648833b7cdd2481955a6c94dc 100644 (file)
@@ -1,3 +1,10 @@
+2012-07-31  Jan Beulich <jbeulich@suse.com>
+
+       * config/tc-i386.c (match_template): New local variable
+       'specific_error'. Set it from i.error after failed
+       check_VecOperands or VEX_check_operands. Use it if set in
+       preference to i.error when actually issuing disagnostic.
+
 2012-07-30  Nick Clifton  <nickc@redhat.com>
 
        * po/gas.pot: Updated template.
index 9bd2f64cdb669ef5f6cf4b9bf3e467fd86c11063..b8c08e83030df9a660d6c579257e455a34f762b6 100644 (file)
@@ -4015,6 +4015,7 @@ match_template (void)
   unsigned int j;
   unsigned int found_cpu_match;
   unsigned int check_register;
+  enum i386_error specific_error = 0;
 
 #if MAX_OPERANDS != 5
 # error "MAX_OPERANDS must be 5."
@@ -4311,13 +4312,12 @@ check_reverse:
          continue;
        }
 
-      /* Check if vector operands are valid.  */
-      if (check_VecOperands (t))
-       continue;
-
-      /* Check if VEX operands are valid.  */
-      if (VEX_check_operands (t))
-       continue;
+      /* Check if vector and VEX operands are valid.  */
+      if (check_VecOperands (t) || VEX_check_operands (t))
+       {
+         specific_error = i.error;
+         continue;
+       }
 
       /* We've found a match; break out of loop.  */
       break;
@@ -4327,7 +4327,7 @@ check_reverse:
     {
       /* We found no match.  */
       const char *err_msg;
-      switch (i.error)
+      switch (specific_error ? specific_error : i.error)
        {
        default:
          abort ();