OSDN Git Service

gcc:
[pf3gnuchains/gcc-fork.git] / gcc / sched-vis.c
index 9d761d1..91f25e7 100644 (file)
@@ -1,6 +1,6 @@
 /* Instruction scheduling pass.
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000 Free Software Foundation, Inc.
+   1999, 2000, 2002, 2003 Free Software Foundation, Inc.
    Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
    and currently maintained by, Jim Wilson (wilson@cygnus.com)
 
@@ -17,12 +17,14 @@ 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
-along with GCC; see the file COPYING.  If not, write to the Free the
-Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+along with GCC; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.  */
 \f
 #include "config.h"
 #include "system.h"
+#include "coretypes.h"
+#include "tm.h"
 #include "toplev.h"
 #include "rtl.h"
 #include "tm_p.h"
@@ -30,6 +32,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "hard-reg-set.h"
 #include "basic-block.h"
 #include "insn-attr.h"
+#include "real.h"
 #include "sched-int.h"
 #include "target.h"
 
@@ -44,18 +47,16 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 static int target_units = 0;
 
-static char *safe_concat PARAMS ((char *, char *, const char *));
-static int get_visual_tbl_length PARAMS ((void));
-static void print_exp PARAMS ((char *, rtx, int));
-static void print_value PARAMS ((char *, rtx, int));
-static void print_pattern PARAMS ((char *, rtx, int));
-static void print_insn PARAMS ((char *, rtx, int));
+static char *safe_concat (char *, char *, const char *);
+static int get_visual_tbl_length (void);
+static void print_exp (char *, rtx, int);
+static void print_value (char *, rtx, int);
+static void print_pattern (char *, rtx, int);
 
 /* Print names of units on which insn can/should execute, for debugging.  */
 
 void
-insn_print_units (insn)
-     rtx insn;
+insn_print_units (rtx insn)
 {
   int i;
   int unit = insn_unit (insn);
@@ -92,11 +93,11 @@ int n_vis_no_unit;
 #define MAX_VISUAL_NO_UNIT 20
 rtx vis_no_unit[MAX_VISUAL_NO_UNIT];
 
-/* Finds units that are in use in this fuction.  Required only
+/* Finds units that are in use in this function.  Required only
    for visualization.  */
 
 void
-init_target_units ()
+init_target_units (void)
 {
   rtx insn;
   int unit;
@@ -118,13 +119,14 @@ init_target_units ()
 /* Return the length of the visualization table.  */
 
 static int
-get_visual_tbl_length ()
+get_visual_tbl_length (void)
 {
   int unit, i;
   int n, n1;
   char *s;
 
-  if (targetm.sched.use_dfa_pipeline_interface)
+  if (targetm.sched.use_dfa_pipeline_interface
+      && (*targetm.sched.use_dfa_pipeline_interface) ())
     {
       visual_tbl_line_length = 1;
       return 1; /* Can't return 0 because that will cause problems
@@ -155,7 +157,7 @@ get_visual_tbl_length ()
 /* Init block visualization debugging info.  */
 
 void
-init_block_visualization ()
+init_block_visualization (void)
 {
   strcpy (visual_tbl, "");
   n_visual_lines = 0;
@@ -165,10 +167,7 @@ init_block_visualization ()
 #define BUF_LEN 2048
 
 static char *
-safe_concat (buf, cur, str)
-     char *buf;
-     char *cur;
-     const char *str;
+safe_concat (char *buf, char *cur, const char *str)
 {
   char *end = buf + BUF_LEN - 2;       /* Leave room for null.  */
   int c;
@@ -191,10 +190,7 @@ safe_concat (buf, cur, str)
    may be stored in objects representing values.  */
 
 static void
-print_exp (buf, x, verbose)
-     char *buf;
-     rtx x;
-     int verbose;
+print_exp (char *buf, rtx x, int verbose)
 {
   char tmp[BUF_LEN];
   const char *st[4];
@@ -483,6 +479,12 @@ print_exp (buf, x, verbose)
       fun = "trap_if";
       op[0] = TRAP_CONDITION (x);
       break;
+    case PREFETCH:
+      fun = "prefetch";
+      op[0] = XEXP (x, 0);
+      op[1] = XEXP (x, 1);
+      op[2] = XEXP (x, 2);
+      break;
     case UNSPEC:
     case UNSPEC_VOLATILE:
       {
@@ -535,14 +537,11 @@ print_exp (buf, x, verbose)
     cur = safe_concat (buf, cur, ")");
 }              /* print_exp */
 
-/* Prints rtxes, I customly classified as values.  They're constants,
+/* Prints rtxes, I customarily classified as values.  They're constants,
    registers, labels, symbols and memory accesses.  */
 
 static void
-print_value (buf, x, verbose)
-     char *buf;
-     rtx x;
-     int verbose;
+print_value (char *buf, rtx x, int verbose)
 {
   char t[BUF_LEN];
   char *cur = buf;
@@ -554,7 +553,10 @@ print_value (buf, x, verbose)
       cur = safe_concat (buf, cur, t);
       break;
     case CONST_DOUBLE:
-      sprintf (t, "<0x%lx,0x%lx>", (long) XWINT (x, 2), (long) XWINT (x, 3));
+      if (FLOAT_MODE_P (GET_MODE (x)))
+       real_to_decimal (t, CONST_DOUBLE_REAL_VALUE (x), sizeof (t), 0, 1);
+      else
+       sprintf (t, "<0x%lx,0x%lx>", (long) XWINT (x, 2), (long) XWINT (x, 3));
       cur = safe_concat (buf, cur, t);
       break;
     case CONST_STRING:
@@ -587,7 +589,7 @@ print_value (buf, x, verbose)
       if (REGNO (x) < FIRST_PSEUDO_REGISTER)
        {
          int c = reg_names[REGNO (x)][0];
-         if (c >= '0' && c <= '9')
+         if (ISDIGIT (c))
            cur = safe_concat (buf, cur, "%");
 
          cur = safe_concat (buf, cur, reg_names[REGNO (x)]);
@@ -629,10 +631,7 @@ print_value (buf, x, verbose)
 /* The next step in insn detalization, its pattern recognition.  */
 
 static void
-print_pattern (buf, x, verbose)
-     char *buf;
-     rtx x;
-     int verbose;
+print_pattern (char *buf, rtx x, int verbose)
 {
   char t1[BUF_LEN], t2[BUF_LEN], t3[BUF_LEN];
 
@@ -662,13 +661,13 @@ print_pattern (buf, x, verbose)
          && XEXP (COND_EXEC_TEST (x), 1) == const0_rtx)
        print_value (t1, XEXP (COND_EXEC_TEST (x), 0), verbose);
       else if (GET_CODE (COND_EXEC_TEST (x)) == EQ
-               && XEXP (COND_EXEC_TEST (x), 1) == const0_rtx)
-        {
+              && XEXP (COND_EXEC_TEST (x), 1) == const0_rtx)
+       {
          t1[0] = '!';
          print_value (t1 + 1, XEXP (COND_EXEC_TEST (x), 0), verbose);
        }
       else
-        print_value (t1, COND_EXEC_TEST (x), verbose);
+       print_value (t1, COND_EXEC_TEST (x), verbose);
       print_pattern (t2, COND_EXEC_CODE (x), verbose);
       sprintf (buf, "(%s) %s", t1, t2);
       break;
@@ -687,18 +686,8 @@ print_pattern (buf, x, verbose)
       }
       break;
     case SEQUENCE:
-      {
-       int i;
-
-       sprintf (t1, "%%{");
-       for (i = 0; i < XVECLEN (x, 0); i++)
-         {
-           print_insn (t2, XVECEXP (x, 0, i), verbose);
-           sprintf (t3, "%s%s;", t1, t2);
-           strcpy (t1, t3);
-         }
-       sprintf (buf, "%s%%}", t1);
-      }
+      /* Should never see SEQUENCE codes until after reorg.  */
+      abort ();
       break;
     case ASM_INPUT:
       sprintf (buf, "asm {%s}", XSTR (x, 0));
@@ -752,11 +741,8 @@ print_pattern (buf, x, verbose)
    (Probably the last "option" should be extended somehow, since it
    depends now on sched.c inner variables ...)  */
 
-static void
-print_insn (buf, x, verbose)
-     char *buf;
-     rtx x;
-     int verbose;
+void
+print_insn (char *buf, rtx x, int verbose)
 {
   char t[BUF_LEN];
   rtx insn = x;
@@ -822,8 +808,7 @@ print_insn (buf, x, verbose)
    description should never use the following function.  */
 
 void
-print_block_visualization (s)
-     const char *s;
+print_block_visualization (const char *s)
 {
   int unit, i;
 
@@ -852,8 +837,7 @@ print_block_visualization (s)
 /* Print insns in the 'no_unit' column of visualization.  */
 
 void
-visualize_no_unit (insn)
-     rtx insn;
+visualize_no_unit (rtx insn)
 {
   if (n_vis_no_unit < MAX_VISUAL_NO_UNIT)
     {
@@ -865,8 +849,7 @@ visualize_no_unit (insn)
 /* Print insns scheduled in clock, for visualization.  */
 
 void
-visualize_scheduled_insns (clock)
-     int clock;
+visualize_scheduled_insns (int clock)
 {
   int i, unit;
 
@@ -912,10 +895,9 @@ visualize_scheduled_insns (clock)
 /* Print stalled cycles.  */
 
 void
-visualize_stall_cycles (stalls)
-     int stalls;
+visualize_stall_cycles (int stalls)
 {
-  const char *prefix = ";;       ";
+  static const char *const prefix = ";;       ";
   const char *suffix = "\n";
   char *p;
 
@@ -932,7 +914,7 @@ visualize_stall_cycles (stalls)
   strcpy (p, prefix);
   p += strlen (prefix);
 
-  if ((unsigned)stalls >
+  if ((unsigned) stalls >
       visual_tbl_line_length - strlen (prefix) - strlen (suffix))
     {
       suffix = "[...]\n";
@@ -948,7 +930,7 @@ visualize_stall_cycles (stalls)
 /* Allocate data used for visualization during scheduling.  */
 
 void
-visualize_alloc ()
+visualize_alloc (void)
 {
   visual_tbl = xmalloc (get_visual_tbl_length ());
 }
@@ -956,7 +938,7 @@ visualize_alloc ()
 /* Free data used for visualization.  */
 
 void
-visualize_free ()
+visualize_free (void)
 {
   free (visual_tbl);
 }