OSDN Git Service

Index: gcc/ChangeLog
[pf3gnuchains/gcc-fork.git] / gcc / sched-vis.c
index 7e4fdab..2dd20d0 100644 (file)
@@ -1,24 +1,24 @@
 /* Instruction scheduling pass.
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000 Free Software Foundation, Inc.
+   1999, 2000, 2002 Free Software Foundation, Inc.
    Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
    and currently maintained by, Jim Wilson (wilson@cygnus.com)
 
-This file is part of GNU CC.
+This file is part of GCC.
 
-GNU CC 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 version.
+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
+version.
 
-GNU CC is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
 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 GNU CC; 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"
@@ -27,6 +27,8 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "rtl.h"
 #include "tm_p.h"
 #include "regs.h"
+#include "hard-reg-set.h"
+#include "basic-block.h"
 #include "insn-attr.h"
 #include "sched-int.h"
 
@@ -82,11 +84,13 @@ insn_print_units (insn)
 #define MAX_VISUAL_LINES 100
 #define INSN_LEN 30
 int n_visual_lines;
+static unsigned visual_tbl_line_length;
 char *visual_tbl;
 int n_vis_no_unit;
-rtx vis_no_unit[10];
+#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
@@ -133,6 +137,8 @@ get_visual_tbl_length ()
   n += n1;
   n += strlen ("\n") + 2;
 
+  visual_tbl_line_length = n;
+
   /* Compute length of visualization string.  */
   return (MAX_VISUAL_LINES * n);
 }
@@ -468,6 +474,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:
       {
@@ -572,7 +584,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)]);
@@ -586,7 +598,7 @@ print_value (buf, x, verbose)
     case SUBREG:
       print_value (t, SUBREG_REG (x), verbose);
       cur = safe_concat (buf, cur, t);
-      sprintf (t, "#%d", SUBREG_WORD (x));
+      sprintf (t, "#%d", SUBREG_BYTE (x));
       cur = safe_concat (buf, cur, t);
       break;
     case SCRATCH:
@@ -839,8 +851,11 @@ void
 visualize_no_unit (insn)
      rtx insn;
 {
-  vis_no_unit[n_vis_no_unit] = insn;
-  n_vis_no_unit++;
+  if (n_vis_no_unit < MAX_VISUAL_NO_UNIT)
+    {
+      vis_no_unit[n_vis_no_unit] = insn;
+      n_vis_no_unit++;
+    }
 }
 
 /* Print insns scheduled in clock, for visualization.  */
@@ -896,7 +911,9 @@ void
 visualize_stall_cycles (stalls)
      int stalls;
 {
-  int i;
+  static const char *const prefix = ";;       ";
+  const char *suffix = "\n";
+  char *p;
 
   /* If no more room, split table into two.  */
   if (n_visual_lines >= MAX_VISUAL_LINES)
@@ -907,10 +924,21 @@ visualize_stall_cycles (stalls)
 
   n_visual_lines++;
 
-  sprintf (visual_tbl + strlen (visual_tbl), ";;       ");
-  for (i = 0; i < stalls; i++)
-    sprintf (visual_tbl + strlen (visual_tbl), ".");
-  sprintf (visual_tbl + strlen (visual_tbl), "\n");
+  p = visual_tbl + strlen (visual_tbl);
+  strcpy (p, prefix);
+  p += strlen (prefix);
+
+  if ((unsigned) stalls >
+      visual_tbl_line_length - strlen (prefix) - strlen (suffix))
+    {
+      suffix = "[...]\n";
+      stalls = visual_tbl_line_length - strlen (prefix) - strlen (suffix);
+    }
+
+  memset (p, '.', stalls);
+  p += stalls;
+
+  strcpy (p, suffix);
 }
 
 /* Allocate data used for visualization during scheduling.  */