OSDN Git Service

* stmt.c (expand_asm_operands): Accept `=' or `+' at any position.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 26 Oct 1998 13:33:07 +0000 (13:33 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 26 Oct 1998 13:33:07 +0000 (13:33 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@23356 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/stmt.c

index 6aedcb2..f7265a6 100644 (file)
@@ -1,3 +1,7 @@
+Mon Oct 26 13:32:31 1998  Richard Henderson  <rth@cygnus.com>
+
+       * stmt.c (expand_asm_operands): Accept `=' or `+' at any position.
+
 Mon Oct 26 12:53:14 1998  Jeffrey A Law  (law@cygnus.com)
 
        * tm.texi (ASM_OUTPUT_MAX_SKIP_ALIGN): Document.
index 46a5bcb..33702db 100644 (file)
@@ -1230,6 +1230,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
       tree val = TREE_VALUE (tail);
       tree type = TREE_TYPE (val);
       char *constraint;
+      char *p;
       int c_len;
       int j;
       int is_inout = 0;
@@ -1247,13 +1248,31 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
       c_len = TREE_STRING_LENGTH (TREE_PURPOSE (tail)) - 1;
       constraint = TREE_STRING_POINTER (TREE_PURPOSE (tail));
 
-      if (c_len == 0
-         || (constraint[0] != '=' && constraint[0] != '+'))
+      /* Allow the `=' or `+' to not be at the beginning of the string,
+        since it wasn't explicitly documented that way, and there is a
+        large body of code that puts it last.  Swap the character to
+        the front, so as not to uglify any place else.  */
+      switch (c_len)
        {
+       default:
+         if ((p = strchr (constraint, '=')) != NULL)
+           break;
+         if ((p = strchr (constraint, '+')) != NULL)
+           break;
+       case 0:
          error ("output operand constraint lacks `='");
          return;
        }
 
+      if (p != constraint)
+       {
+         j = *p;
+         bcopy (constraint, constraint+1, p-constraint);
+         *constraint = j;
+
+         warning ("output constraint `%c' for operand %d is not at the beginning", j, i);
+       }
+
       is_inout = constraint[0] == '+';
       /* Replace '+' with '='.  */
       constraint[0] = '=';