OSDN Git Service

CLIX patch from Thomas Dickey via urs@akk.uni-karlsruhe.de (Urs Janssen).
[pf3gnuchains/gcc-fork.git] / gcc / genextract.c
index 97ce57d..f222de1 100644 (file)
@@ -1,5 +1,5 @@
 /* Generate code from machine description to extract operands from insn as rtl.
-   Copyright (C) 1987, 1991, 1992 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1991, 1992, 1993 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -15,7 +15,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 
 #include <stdio.h>
@@ -33,6 +34,9 @@ struct obstack *rtl_obstack = &obstack;
 extern void free ();
 extern rtx read_rtx ();
 
+/* Names for patterns.  Need to allow linking with print-rtl.  */
+char **insn_name_ptr;
+
 /* This structure contains all the information needed to describe one
    set of extractions methods.  Each method may be used by more than 
    one pattern if the operands are in the same place.
@@ -136,7 +140,7 @@ gen_insn (insn)
   link = (struct code_ptr *) xmalloc (sizeof (struct code_ptr));
   link->insn_code = insn_code_number;
 
-  /* See if we find something that already had this extraction method. */
+  /* See if we find something that already had this extraction method.  */
 
   for (p = extractions; p; p = p->next)
     {
@@ -216,13 +220,28 @@ walk_rtx (x, path)
       break;
 
     case MATCH_DUP:
-    case MATCH_OP_DUP:
     case MATCH_PAR_DUP:
       duplocs[dup_count] = copystr (path);
       dupnums[dup_count] = XINT (x, 0);
       dup_count++;
       break;
 
+    case MATCH_OP_DUP:
+      duplocs[dup_count] = copystr (path);
+      dupnums[dup_count] = XINT (x, 0);
+      dup_count++;
+      
+      newpath = (char *) alloca (depth + 2);
+      strcpy (newpath, path);
+      newpath[depth + 1] = 0;
+      
+      for (i = XVECLEN (x, 1) - 1; i >= 0; i--)
+        {
+         newpath[depth] = '0' + i;
+         walk_rtx (XVECEXP (x, 1, i), newpath);
+        }
+      return;
+      
     case MATCH_OPERATOR:
       oplocs[XINT (x, 0)] = copystr (path);
       op_count = MAX (op_count, XINT (x, 0) + 1);
@@ -429,8 +448,6 @@ from the machine description file `md'.  */\n\n");
   printf ("extern rtx *recog_operand_loc[];\n");
   printf ("extern rtx *recog_dup_loc[];\n");
   printf ("extern char recog_dup_num[];\n");
-  printf ("extern\n#ifdef __GNUC__\n__volatile__\n#endif\n");
-  printf ("void fatal_insn_not_found ();\n\n");
 
   printf ("void\ninsn_extract (insn)\n");
   printf ("     rtx insn;\n");
@@ -438,6 +455,7 @@ from the machine description file `md'.  */\n\n");
   printf ("  register rtx *ro = recog_operand;\n");
   printf ("  register rtx **ro_loc = recog_operand_loc;\n");
   printf ("  rtx pat = PATTERN (insn);\n");
+  printf ("  int i;\n\n");
   printf ("  switch (INSN_CODE (insn))\n");
   printf ("    {\n");
   printf ("    case -1:\n");
@@ -485,11 +503,8 @@ from the machine description file `md'.  */\n\n");
       /* The vector in the insn says how many operands it has.
         And all it contains are operands.  In fact, the vector was
         created just for the sake of this function.  */
-      printf ("#if __GNUC__ > 1 && !defined (bcopy)\n");
-      printf ("#define bcopy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT)\n");
-      printf ("#endif\n");
-      printf ("      bcopy (&XVECEXP (pat, 0, 0), ro,\n");
-      printf ("             sizeof (rtx) * XVECLEN (pat, 0));\n");
+      printf ("      for (i = XVECLEN (pat, 0); i >= 0; i--)\n");
+      printf ("          ro[i] = XVECEXP (pat, 0, i);\n");
       printf ("      break;\n\n");
     }