OSDN Git Service

* config/i386/i386-protos.h (split_double_mode): New prototype.
[pf3gnuchains/gcc-fork.git] / gcc / lists.c
index 23529a3..5bf6023 100644 (file)
@@ -1,12 +1,13 @@
 /* List management for the GCC expander.
    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
 /* List management for the GCC expander.
    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+   1999, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+   Free Software Foundation, Inc.
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -15,20 +16,19 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
 
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
+#include "diagnostic-core.h"
 #include "toplev.h"
 #include "rtl.h"
 #include "ggc.h"
 
 static void free_list (rtx *, rtx *);
 #include "toplev.h"
 #include "rtl.h"
 #include "ggc.h"
 
 static void free_list (rtx *, rtx *);
-static void free_DEPS_LIST_node (rtx);
 
 /* Functions for maintaining cache-able lists of EXPR_LIST and INSN_LISTs.  */
 
 
 /* Functions for maintaining cache-able lists of EXPR_LIST and INSN_LISTs.  */
 
@@ -38,10 +38,6 @@ static GTY ((deletable)) rtx unused_insn_list;
 /* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused.  */
 static GTY ((deletable)) rtx unused_expr_list;
 
 /* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused.  */
 static GTY ((deletable)) rtx unused_expr_list;
 
-/* An DEPS_LIST containing all DEPS_LISTs allocated but currently unused.  */
-static GTY ((deletable)) rtx unused_deps_list;
-
-
 /* This function will free an entire list of either EXPR_LIST, INSN_LIST
    or DEPS_LIST nodes.  This is to be used only on lists that consist
    exclusively of nodes of one type only.  This is only called by
 /* This function will free an entire list of either EXPR_LIST, INSN_LIST
    or DEPS_LIST nodes.  This is to be used only on lists that consist
    exclusively of nodes of one type only.  This is only called by
@@ -54,18 +50,14 @@ free_list (rtx *listp, rtx *unused_listp)
   prev_link = *listp;
   link = XEXP (prev_link, 1);
 
   prev_link = *listp;
   link = XEXP (prev_link, 1);
 
-  gcc_assert ((unused_listp != &unused_insn_list
-              || GET_CODE (prev_link) == INSN_LIST)
-             && (unused_listp != &unused_deps_list
-                 || GET_CODE (prev_link) == DEPS_LIST));
-  
+  gcc_assert (unused_listp != &unused_insn_list
+             || GET_CODE (prev_link) == INSN_LIST);
+
   while (link)
     {
   while (link)
     {
-      gcc_assert ((unused_listp != &unused_insn_list
-                  || GET_CODE (prev_link) == INSN_LIST)
-                 && (unused_listp != &unused_deps_list
-                     || GET_CODE (prev_link) == DEPS_LIST));
-  
+      gcc_assert (unused_listp != &unused_insn_list
+                 || GET_CODE (prev_link) == INSN_LIST);
+
       prev_link = link;
       link = XEXP (link, 1);
     }
       prev_link = link;
       link = XEXP (link, 1);
     }
@@ -150,32 +142,7 @@ alloc_EXPR_LIST (int kind, rtx val, rtx next)
       PUT_REG_NOTE_KIND (r, kind);
     }
   else
       PUT_REG_NOTE_KIND (r, kind);
     }
   else
-    r = gen_rtx_EXPR_LIST (kind, val, next);
-
-  return r;
-}
-
-/* This call is used in place of a gen_rtx_DEPS_LIST.  If there is a cached
-   node available, we'll use it, otherwise a call to gen_rtx_DEPS_LIST
-   is made.  */
-rtx
-alloc_DEPS_LIST (rtx val, rtx next, int ds)
-{
-  rtx r;
-
-  if (unused_deps_list)
-    {
-      r = unused_deps_list;
-      unused_deps_list = XEXP (r, 1);
-      XEXP (r, 0) = val;
-      XEXP (r, 1) = next;
-      XINT (r, 2) = ds;
-      PUT_REG_NOTE_KIND (r, VOIDmode);
-
-      gcc_assert (GET_CODE (r) == DEPS_LIST);
-    }
-  else
-    r = gen_rtx_DEPS_LIST (VOIDmode, val, next, ds);
+    r = gen_rtx_EXPR_LIST ((enum machine_mode) kind, val, next);
 
   return r;
 }
 
   return r;
 }
@@ -198,15 +165,6 @@ free_INSN_LIST_list (rtx *listp)
   free_list (listp, &unused_insn_list);
 }
 
   free_list (listp, &unused_insn_list);
 }
 
-/* This function will free up an entire list of DEPS_LIST nodes.  */
-void
-free_DEPS_LIST_list (rtx *listp)
-{
-  if (*listp == 0)
-    return;
-  free_list (listp, &unused_deps_list);
-}
-
 /* This function will free up an individual EXPR_LIST node.  */
 void
 free_EXPR_LIST_node (rtx ptr)
 /* This function will free up an individual EXPR_LIST node.  */
 void
 free_EXPR_LIST_node (rtx ptr)
@@ -224,23 +182,6 @@ free_INSN_LIST_node (rtx ptr)
   unused_insn_list = ptr;
 }
 
   unused_insn_list = ptr;
 }
 
-/* This function will free up an individual DEPS_LIST node.  */
-static void
-free_DEPS_LIST_node (rtx ptr)
-{
-  gcc_assert (GET_CODE (ptr) == DEPS_LIST);
-  XEXP (ptr, 1) = unused_deps_list;
-  unused_deps_list = ptr;
-}
-
-/* Remove and free corresponding to ELEM node in the DEPS_LIST pointed to
-   by LISTP.  */
-void
-remove_free_DEPS_LIST_elem (rtx elem, rtx *listp)
-{
-  free_DEPS_LIST_node (remove_list_elem (elem, listp));
-}
-
 /* Remove and free corresponding to ELEM node in the INSN_LIST pointed to
    by LISTP.  */
 void
 /* Remove and free corresponding to ELEM node in the INSN_LIST pointed to
    by LISTP.  */
 void
@@ -249,20 +190,30 @@ remove_free_INSN_LIST_elem (rtx elem, rtx *listp)
   free_INSN_LIST_node (remove_list_elem (elem, listp));
 }
 
   free_INSN_LIST_node (remove_list_elem (elem, listp));
 }
 
-/* Create and return a copy of the DEPS_LIST LIST.  */
+/* Remove and free the first node in the INSN_LIST pointed to by LISTP.  */
 rtx
 rtx
-copy_DEPS_LIST_list (rtx list)
+remove_free_INSN_LIST_node (rtx *listp)
 {
 {
-  rtx res = NULL_RTX, *resp = &res;
+  rtx node = *listp;
+  rtx elem = XEXP (node, 0);
 
 
-  while (list)
-    {
-      *resp = alloc_DEPS_LIST (XEXP (list, 0), 0, XINT (list, 2));
-      PUT_REG_NOTE_KIND (*resp, REG_NOTE_KIND (list));
-      resp = &XEXP (*resp, 1);
-      list = XEXP (list, 1);
-    }
-  return res;
+  remove_list_node (listp);
+  free_INSN_LIST_node (node);
+
+  return elem;
+}
+
+/* Remove and free the first node in the EXPR_LIST pointed to by LISTP.  */
+rtx
+remove_free_EXPR_LIST_node (rtx *listp)
+{
+  rtx node = *listp;
+  rtx elem = XEXP (node, 0);
+
+  remove_list_node (listp);
+  free_EXPR_LIST_node (node);
+
+  return elem;
 }
 
 #include "gt-lists.h"
 }
 
 #include "gt-lists.h"