OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [sched-vis.c] - Diff between revs 154 and 816

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 154 Rev 816
/* Instruction scheduling pass.
/* Instruction scheduling pass.
   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
   1999, 2000, 2002, 2003, 2004, 2005, 2007
   1999, 2000, 2002, 2003, 2004, 2005, 2007
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
   Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
   Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
   and currently maintained by, Jim Wilson (wilson@cygnus.com)
   and currently maintained by, Jim Wilson (wilson@cygnus.com)
 
 
This file is part of GCC.
This file is part of GCC.
 
 
GCC is free software; you can redistribute it and/or modify it under
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
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
Software Foundation; either version 3, or (at your option) any later
version.
version.
 
 
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
<http://www.gnu.org/licenses/>.  */


#include "config.h"
#include "config.h"
#include "system.h"
#include "system.h"
#include "coretypes.h"
#include "coretypes.h"
#include "tm.h"
#include "tm.h"
#include "rtl.h"
#include "rtl.h"
#include "obstack.h"
#include "obstack.h"
#include "hard-reg-set.h"
#include "hard-reg-set.h"
#include "basic-block.h"
#include "basic-block.h"
#include "real.h"
#include "real.h"
#include "sched-int.h"
#include "sched-int.h"
#include "tree-pass.h"
#include "tree-pass.h"
 
 
static char *safe_concat (char *, char *, const char *);
static char *safe_concat (char *, char *, const char *);
static void print_exp (char *, rtx, int);
static void print_exp (char *, rtx, int);
static void print_value (char *, rtx, int);
static void print_value (char *, rtx, int);
static void print_pattern (char *, rtx, int);
static void print_pattern (char *, rtx, int);
 
 
#define BUF_LEN 2048
#define BUF_LEN 2048
 
 
static char *
static char *
safe_concat (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.  */
  char *end = buf + BUF_LEN - 2;        /* Leave room for null.  */
  int c;
  int c;
 
 
  if (cur > end)
  if (cur > end)
    {
    {
      *end = '\0';
      *end = '\0';
      return end;
      return end;
    }
    }
 
 
  while (cur < end && (c = *str++) != '\0')
  while (cur < end && (c = *str++) != '\0')
    *cur++ = c;
    *cur++ = c;
 
 
  *cur = '\0';
  *cur = '\0';
  return cur;
  return cur;
}
}
 
 
/* This recognizes rtx, I classified as expressions.  These are always
/* This recognizes rtx, I classified as expressions.  These are always
   represent some action on values or results of other expression, that
   represent some action on values or results of other expression, that
   may be stored in objects representing values.  */
   may be stored in objects representing values.  */
 
 
static void
static void
print_exp (char *buf, rtx x, int verbose)
print_exp (char *buf, rtx x, int verbose)
{
{
  char tmp[BUF_LEN];
  char tmp[BUF_LEN];
  const char *st[4];
  const char *st[4];
  char *cur = buf;
  char *cur = buf;
  const char *fun = (char *) 0;
  const char *fun = (char *) 0;
  const char *sep;
  const char *sep;
  rtx op[4];
  rtx op[4];
  int i;
  int i;
 
 
  for (i = 0; i < 4; i++)
  for (i = 0; i < 4; i++)
    {
    {
      st[i] = (char *) 0;
      st[i] = (char *) 0;
      op[i] = NULL_RTX;
      op[i] = NULL_RTX;
    }
    }
 
 
  switch (GET_CODE (x))
  switch (GET_CODE (x))
    {
    {
    case PLUS:
    case PLUS:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      if (GET_CODE (XEXP (x, 1)) == CONST_INT
      if (GET_CODE (XEXP (x, 1)) == CONST_INT
          && INTVAL (XEXP (x, 1)) < 0)
          && INTVAL (XEXP (x, 1)) < 0)
        {
        {
          st[1] = "-";
          st[1] = "-";
          op[1] = GEN_INT (-INTVAL (XEXP (x, 1)));
          op[1] = GEN_INT (-INTVAL (XEXP (x, 1)));
        }
        }
      else
      else
        {
        {
          st[1] = "+";
          st[1] = "+";
          op[1] = XEXP (x, 1);
          op[1] = XEXP (x, 1);
        }
        }
      break;
      break;
    case LO_SUM:
    case LO_SUM:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "+low(";
      st[1] = "+low(";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      st[2] = ")";
      st[2] = ")";
      break;
      break;
    case MINUS:
    case MINUS:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "-";
      st[1] = "-";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case COMPARE:
    case COMPARE:
      fun = "cmp";
      fun = "cmp";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case NEG:
    case NEG:
      st[0] = "-";
      st[0] = "-";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case MULT:
    case MULT:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "*";
      st[1] = "*";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case DIV:
    case DIV:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "/";
      st[1] = "/";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case UDIV:
    case UDIV:
      fun = "udiv";
      fun = "udiv";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case MOD:
    case MOD:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "%";
      st[1] = "%";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case UMOD:
    case UMOD:
      fun = "umod";
      fun = "umod";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case SMIN:
    case SMIN:
      fun = "smin";
      fun = "smin";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case SMAX:
    case SMAX:
      fun = "smax";
      fun = "smax";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case UMIN:
    case UMIN:
      fun = "umin";
      fun = "umin";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case UMAX:
    case UMAX:
      fun = "umax";
      fun = "umax";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case NOT:
    case NOT:
      st[0] = "!";
      st[0] = "!";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case AND:
    case AND:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "&";
      st[1] = "&";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case IOR:
    case IOR:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "|";
      st[1] = "|";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case XOR:
    case XOR:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "^";
      st[1] = "^";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case ASHIFT:
    case ASHIFT:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "<<";
      st[1] = "<<";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case LSHIFTRT:
    case LSHIFTRT:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = " 0>>";
      st[1] = " 0>>";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case ASHIFTRT:
    case ASHIFTRT:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = ">>";
      st[1] = ">>";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case ROTATE:
    case ROTATE:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "<-<";
      st[1] = "<-<";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case ROTATERT:
    case ROTATERT:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = ">->";
      st[1] = ">->";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case ABS:
    case ABS:
      fun = "abs";
      fun = "abs";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case SQRT:
    case SQRT:
      fun = "sqrt";
      fun = "sqrt";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case FFS:
    case FFS:
      fun = "ffs";
      fun = "ffs";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case EQ:
    case EQ:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "==";
      st[1] = "==";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case NE:
    case NE:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "!=";
      st[1] = "!=";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case GT:
    case GT:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = ">";
      st[1] = ">";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case GTU:
    case GTU:
      fun = "gtu";
      fun = "gtu";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case LT:
    case LT:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "<";
      st[1] = "<";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case LTU:
    case LTU:
      fun = "ltu";
      fun = "ltu";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case GE:
    case GE:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = ">=";
      st[1] = ">=";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case GEU:
    case GEU:
      fun = "geu";
      fun = "geu";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case LE:
    case LE:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "<=";
      st[1] = "<=";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case LEU:
    case LEU:
      fun = "leu";
      fun = "leu";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      break;
      break;
    case SIGN_EXTRACT:
    case SIGN_EXTRACT:
      fun = (verbose) ? "sign_extract" : "sxt";
      fun = (verbose) ? "sign_extract" : "sxt";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      op[2] = XEXP (x, 2);
      op[2] = XEXP (x, 2);
      break;
      break;
    case ZERO_EXTRACT:
    case ZERO_EXTRACT:
      fun = (verbose) ? "zero_extract" : "zxt";
      fun = (verbose) ? "zero_extract" : "zxt";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      op[2] = XEXP (x, 2);
      op[2] = XEXP (x, 2);
      break;
      break;
    case SIGN_EXTEND:
    case SIGN_EXTEND:
      fun = (verbose) ? "sign_extend" : "sxn";
      fun = (verbose) ? "sign_extend" : "sxn";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case ZERO_EXTEND:
    case ZERO_EXTEND:
      fun = (verbose) ? "zero_extend" : "zxn";
      fun = (verbose) ? "zero_extend" : "zxn";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case FLOAT_EXTEND:
    case FLOAT_EXTEND:
      fun = (verbose) ? "float_extend" : "fxn";
      fun = (verbose) ? "float_extend" : "fxn";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case TRUNCATE:
    case TRUNCATE:
      fun = (verbose) ? "trunc" : "trn";
      fun = (verbose) ? "trunc" : "trn";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case FLOAT_TRUNCATE:
    case FLOAT_TRUNCATE:
      fun = (verbose) ? "float_trunc" : "ftr";
      fun = (verbose) ? "float_trunc" : "ftr";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case FLOAT:
    case FLOAT:
      fun = (verbose) ? "float" : "flt";
      fun = (verbose) ? "float" : "flt";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case UNSIGNED_FLOAT:
    case UNSIGNED_FLOAT:
      fun = (verbose) ? "uns_float" : "ufl";
      fun = (verbose) ? "uns_float" : "ufl";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case FIX:
    case FIX:
      fun = "fix";
      fun = "fix";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case UNSIGNED_FIX:
    case UNSIGNED_FIX:
      fun = (verbose) ? "uns_fix" : "ufx";
      fun = (verbose) ? "uns_fix" : "ufx";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case PRE_DEC:
    case PRE_DEC:
      st[0] = "--";
      st[0] = "--";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case PRE_INC:
    case PRE_INC:
      st[0] = "++";
      st[0] = "++";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      break;
      break;
    case POST_DEC:
    case POST_DEC:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "--";
      st[1] = "--";
      break;
      break;
    case POST_INC:
    case POST_INC:
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = "++";
      st[1] = "++";
      break;
      break;
    case CALL:
    case CALL:
      st[0] = "call ";
      st[0] = "call ";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      if (verbose)
      if (verbose)
        {
        {
          st[1] = " argc:";
          st[1] = " argc:";
          op[1] = XEXP (x, 1);
          op[1] = XEXP (x, 1);
        }
        }
      break;
      break;
    case IF_THEN_ELSE:
    case IF_THEN_ELSE:
      st[0] = "{(";
      st[0] = "{(";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      st[1] = ")?";
      st[1] = ")?";
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      st[2] = ":";
      st[2] = ":";
      op[2] = XEXP (x, 2);
      op[2] = XEXP (x, 2);
      st[3] = "}";
      st[3] = "}";
      break;
      break;
    case TRAP_IF:
    case TRAP_IF:
      fun = "trap_if";
      fun = "trap_if";
      op[0] = TRAP_CONDITION (x);
      op[0] = TRAP_CONDITION (x);
      break;
      break;
    case PREFETCH:
    case PREFETCH:
      fun = "prefetch";
      fun = "prefetch";
      op[0] = XEXP (x, 0);
      op[0] = XEXP (x, 0);
      op[1] = XEXP (x, 1);
      op[1] = XEXP (x, 1);
      op[2] = XEXP (x, 2);
      op[2] = XEXP (x, 2);
      break;
      break;
    case UNSPEC:
    case UNSPEC:
    case UNSPEC_VOLATILE:
    case UNSPEC_VOLATILE:
      {
      {
        cur = safe_concat (buf, cur, "unspec");
        cur = safe_concat (buf, cur, "unspec");
        if (GET_CODE (x) == UNSPEC_VOLATILE)
        if (GET_CODE (x) == UNSPEC_VOLATILE)
          cur = safe_concat (buf, cur, "/v");
          cur = safe_concat (buf, cur, "/v");
        cur = safe_concat (buf, cur, "[");
        cur = safe_concat (buf, cur, "[");
        sep = "";
        sep = "";
        for (i = 0; i < XVECLEN (x, 0); i++)
        for (i = 0; i < XVECLEN (x, 0); i++)
          {
          {
            print_pattern (tmp, XVECEXP (x, 0, i), verbose);
            print_pattern (tmp, XVECEXP (x, 0, i), verbose);
            cur = safe_concat (buf, cur, sep);
            cur = safe_concat (buf, cur, sep);
            cur = safe_concat (buf, cur, tmp);
            cur = safe_concat (buf, cur, tmp);
            sep = ",";
            sep = ",";
          }
          }
        cur = safe_concat (buf, cur, "] ");
        cur = safe_concat (buf, cur, "] ");
        sprintf (tmp, "%d", XINT (x, 1));
        sprintf (tmp, "%d", XINT (x, 1));
        cur = safe_concat (buf, cur, tmp);
        cur = safe_concat (buf, cur, tmp);
      }
      }
      break;
      break;
    default:
    default:
      /* If (verbose) debug_rtx (x);  */
      /* If (verbose) debug_rtx (x);  */
      st[0] = GET_RTX_NAME (GET_CODE (x));
      st[0] = GET_RTX_NAME (GET_CODE (x));
      break;
      break;
    }
    }
 
 
  /* Print this as a function?  */
  /* Print this as a function?  */
  if (fun)
  if (fun)
    {
    {
      cur = safe_concat (buf, cur, fun);
      cur = safe_concat (buf, cur, fun);
      cur = safe_concat (buf, cur, "(");
      cur = safe_concat (buf, cur, "(");
    }
    }
 
 
  for (i = 0; i < 4; i++)
  for (i = 0; i < 4; i++)
    {
    {
      if (st[i])
      if (st[i])
        cur = safe_concat (buf, cur, st[i]);
        cur = safe_concat (buf, cur, st[i]);
 
 
      if (op[i])
      if (op[i])
        {
        {
          if (fun && i != 0)
          if (fun && i != 0)
            cur = safe_concat (buf, cur, ",");
            cur = safe_concat (buf, cur, ",");
 
 
          print_value (tmp, op[i], verbose);
          print_value (tmp, op[i], verbose);
          cur = safe_concat (buf, cur, tmp);
          cur = safe_concat (buf, cur, tmp);
        }
        }
    }
    }
 
 
  if (fun)
  if (fun)
    cur = safe_concat (buf, cur, ")");
    cur = safe_concat (buf, cur, ")");
}               /* print_exp */
}               /* print_exp */
 
 
/* Prints rtxes, I customarily classified as values.  They're constants,
/* Prints rtxes, I customarily classified as values.  They're constants,
   registers, labels, symbols and memory accesses.  */
   registers, labels, symbols and memory accesses.  */
 
 
static void
static void
print_value (char *buf, rtx x, int verbose)
print_value (char *buf, rtx x, int verbose)
{
{
  char t[BUF_LEN];
  char t[BUF_LEN];
  char *cur = buf;
  char *cur = buf;
 
 
  switch (GET_CODE (x))
  switch (GET_CODE (x))
    {
    {
    case CONST_INT:
    case CONST_INT:
      sprintf (t, HOST_WIDE_INT_PRINT_HEX, INTVAL (x));
      sprintf (t, HOST_WIDE_INT_PRINT_HEX, INTVAL (x));
      cur = safe_concat (buf, cur, t);
      cur = safe_concat (buf, cur, t);
      break;
      break;
    case CONST_DOUBLE:
    case CONST_DOUBLE:
      if (FLOAT_MODE_P (GET_MODE (x)))
      if (FLOAT_MODE_P (GET_MODE (x)))
        real_to_decimal (t, CONST_DOUBLE_REAL_VALUE (x), sizeof (t), 0, 1);
        real_to_decimal (t, CONST_DOUBLE_REAL_VALUE (x), sizeof (t), 0, 1);
      else
      else
        sprintf (t, "<0x%lx,0x%lx>", (long) CONST_DOUBLE_LOW (x), (long) CONST_DOUBLE_HIGH (x));
        sprintf (t, "<0x%lx,0x%lx>", (long) CONST_DOUBLE_LOW (x), (long) CONST_DOUBLE_HIGH (x));
      cur = safe_concat (buf, cur, t);
      cur = safe_concat (buf, cur, t);
      break;
      break;
    case CONST_STRING:
    case CONST_STRING:
      cur = safe_concat (buf, cur, "\"");
      cur = safe_concat (buf, cur, "\"");
      cur = safe_concat (buf, cur, XSTR (x, 0));
      cur = safe_concat (buf, cur, XSTR (x, 0));
      cur = safe_concat (buf, cur, "\"");
      cur = safe_concat (buf, cur, "\"");
      break;
      break;
    case SYMBOL_REF:
    case SYMBOL_REF:
      cur = safe_concat (buf, cur, "`");
      cur = safe_concat (buf, cur, "`");
      cur = safe_concat (buf, cur, XSTR (x, 0));
      cur = safe_concat (buf, cur, XSTR (x, 0));
      cur = safe_concat (buf, cur, "'");
      cur = safe_concat (buf, cur, "'");
      break;
      break;
    case LABEL_REF:
    case LABEL_REF:
      sprintf (t, "L%d", INSN_UID (XEXP (x, 0)));
      sprintf (t, "L%d", INSN_UID (XEXP (x, 0)));
      cur = safe_concat (buf, cur, t);
      cur = safe_concat (buf, cur, t);
      break;
      break;
    case CONST:
    case CONST:
      print_value (t, XEXP (x, 0), verbose);
      print_value (t, XEXP (x, 0), verbose);
      cur = safe_concat (buf, cur, "const(");
      cur = safe_concat (buf, cur, "const(");
      cur = safe_concat (buf, cur, t);
      cur = safe_concat (buf, cur, t);
      cur = safe_concat (buf, cur, ")");
      cur = safe_concat (buf, cur, ")");
      break;
      break;
    case HIGH:
    case HIGH:
      print_value (t, XEXP (x, 0), verbose);
      print_value (t, XEXP (x, 0), verbose);
      cur = safe_concat (buf, cur, "high(");
      cur = safe_concat (buf, cur, "high(");
      cur = safe_concat (buf, cur, t);
      cur = safe_concat (buf, cur, t);
      cur = safe_concat (buf, cur, ")");
      cur = safe_concat (buf, cur, ")");
      break;
      break;
    case REG:
    case REG:
      if (REGNO (x) < FIRST_PSEUDO_REGISTER)
      if (REGNO (x) < FIRST_PSEUDO_REGISTER)
        {
        {
          int c = reg_names[REGNO (x)][0];
          int c = reg_names[REGNO (x)][0];
          if (ISDIGIT (c))
          if (ISDIGIT (c))
            cur = safe_concat (buf, cur, "%");
            cur = safe_concat (buf, cur, "%");
 
 
          cur = safe_concat (buf, cur, reg_names[REGNO (x)]);
          cur = safe_concat (buf, cur, reg_names[REGNO (x)]);
        }
        }
      else
      else
        {
        {
          sprintf (t, "r%d", REGNO (x));
          sprintf (t, "r%d", REGNO (x));
          cur = safe_concat (buf, cur, t);
          cur = safe_concat (buf, cur, t);
        }
        }
      if (verbose
      if (verbose
#ifdef INSN_SCHEDULING
#ifdef INSN_SCHEDULING
          && !current_sched_info
          && !current_sched_info
#endif
#endif
         )
         )
        {
        {
          sprintf (t, ":%s", GET_MODE_NAME (GET_MODE (x)));
          sprintf (t, ":%s", GET_MODE_NAME (GET_MODE (x)));
          cur = safe_concat (buf, cur, t);
          cur = safe_concat (buf, cur, t);
        }
        }
      break;
      break;
    case SUBREG:
    case SUBREG:
      print_value (t, SUBREG_REG (x), verbose);
      print_value (t, SUBREG_REG (x), verbose);
      cur = safe_concat (buf, cur, t);
      cur = safe_concat (buf, cur, t);
      sprintf (t, "#%d", SUBREG_BYTE (x));
      sprintf (t, "#%d", SUBREG_BYTE (x));
      cur = safe_concat (buf, cur, t);
      cur = safe_concat (buf, cur, t);
      break;
      break;
    case SCRATCH:
    case SCRATCH:
      cur = safe_concat (buf, cur, "scratch");
      cur = safe_concat (buf, cur, "scratch");
      break;
      break;
    case CC0:
    case CC0:
      cur = safe_concat (buf, cur, "cc0");
      cur = safe_concat (buf, cur, "cc0");
      break;
      break;
    case PC:
    case PC:
      cur = safe_concat (buf, cur, "pc");
      cur = safe_concat (buf, cur, "pc");
      break;
      break;
    case MEM:
    case MEM:
      print_value (t, XEXP (x, 0), verbose);
      print_value (t, XEXP (x, 0), verbose);
      cur = safe_concat (buf, cur, "[");
      cur = safe_concat (buf, cur, "[");
      cur = safe_concat (buf, cur, t);
      cur = safe_concat (buf, cur, t);
      cur = safe_concat (buf, cur, "]");
      cur = safe_concat (buf, cur, "]");
      break;
      break;
    default:
    default:
      print_exp (t, x, verbose);
      print_exp (t, x, verbose);
      cur = safe_concat (buf, cur, t);
      cur = safe_concat (buf, cur, t);
      break;
      break;
    }
    }
}                               /* print_value */
}                               /* print_value */
 
 
/* The next step in insn detalization, its pattern recognition.  */
/* The next step in insn detalization, its pattern recognition.  */
 
 
static void
static void
print_pattern (char *buf, rtx x, int verbose)
print_pattern (char *buf, rtx x, int verbose)
{
{
  char t1[BUF_LEN], t2[BUF_LEN], t3[BUF_LEN];
  char t1[BUF_LEN], t2[BUF_LEN], t3[BUF_LEN];
 
 
  switch (GET_CODE (x))
  switch (GET_CODE (x))
    {
    {
    case SET:
    case SET:
      print_value (t1, SET_DEST (x), verbose);
      print_value (t1, SET_DEST (x), verbose);
      print_value (t2, SET_SRC (x), verbose);
      print_value (t2, SET_SRC (x), verbose);
      sprintf (buf, "%s=%s", t1, t2);
      sprintf (buf, "%s=%s", t1, t2);
      break;
      break;
    case RETURN:
    case RETURN:
      sprintf (buf, "return");
      sprintf (buf, "return");
      break;
      break;
    case CALL:
    case CALL:
      print_exp (buf, x, verbose);
      print_exp (buf, x, verbose);
      break;
      break;
    case CLOBBER:
    case CLOBBER:
      print_value (t1, XEXP (x, 0), verbose);
      print_value (t1, XEXP (x, 0), verbose);
      sprintf (buf, "clobber %s", t1);
      sprintf (buf, "clobber %s", t1);
      break;
      break;
    case USE:
    case USE:
      print_value (t1, XEXP (x, 0), verbose);
      print_value (t1, XEXP (x, 0), verbose);
      sprintf (buf, "use %s", t1);
      sprintf (buf, "use %s", t1);
      break;
      break;
    case COND_EXEC:
    case COND_EXEC:
      if (GET_CODE (COND_EXEC_TEST (x)) == NE
      if (GET_CODE (COND_EXEC_TEST (x)) == NE
          && XEXP (COND_EXEC_TEST (x), 1) == const0_rtx)
          && XEXP (COND_EXEC_TEST (x), 1) == const0_rtx)
        print_value (t1, XEXP (COND_EXEC_TEST (x), 0), verbose);
        print_value (t1, XEXP (COND_EXEC_TEST (x), 0), verbose);
      else if (GET_CODE (COND_EXEC_TEST (x)) == EQ
      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] = '!';
          t1[0] = '!';
          print_value (t1 + 1, XEXP (COND_EXEC_TEST (x), 0), verbose);
          print_value (t1 + 1, XEXP (COND_EXEC_TEST (x), 0), verbose);
        }
        }
      else
      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);
      print_pattern (t2, COND_EXEC_CODE (x), verbose);
      sprintf (buf, "(%s) %s", t1, t2);
      sprintf (buf, "(%s) %s", t1, t2);
      break;
      break;
    case PARALLEL:
    case PARALLEL:
      {
      {
        int i;
        int i;
 
 
        sprintf (t1, "{");
        sprintf (t1, "{");
        for (i = 0; i < XVECLEN (x, 0); i++)
        for (i = 0; i < XVECLEN (x, 0); i++)
          {
          {
            print_pattern (t2, XVECEXP (x, 0, i), verbose);
            print_pattern (t2, XVECEXP (x, 0, i), verbose);
            sprintf (t3, "%s%s;", t1, t2);
            sprintf (t3, "%s%s;", t1, t2);
            strcpy (t1, t3);
            strcpy (t1, t3);
          }
          }
        sprintf (buf, "%s}", t1);
        sprintf (buf, "%s}", t1);
      }
      }
      break;
      break;
    case SEQUENCE:
    case SEQUENCE:
      /* Should never see SEQUENCE codes until after reorg.  */
      /* Should never see SEQUENCE codes until after reorg.  */
      gcc_unreachable ();
      gcc_unreachable ();
    case ASM_INPUT:
    case ASM_INPUT:
      sprintf (buf, "asm {%s}", XSTR (x, 0));
      sprintf (buf, "asm {%s}", XSTR (x, 0));
      break;
      break;
    case ADDR_VEC:
    case ADDR_VEC:
      break;
      break;
    case ADDR_DIFF_VEC:
    case ADDR_DIFF_VEC:
      print_value (buf, XEXP (x, 0), verbose);
      print_value (buf, XEXP (x, 0), verbose);
      break;
      break;
    case TRAP_IF:
    case TRAP_IF:
      print_value (t1, TRAP_CONDITION (x), verbose);
      print_value (t1, TRAP_CONDITION (x), verbose);
      sprintf (buf, "trap_if %s", t1);
      sprintf (buf, "trap_if %s", t1);
      break;
      break;
    case UNSPEC:
    case UNSPEC:
      {
      {
        int i;
        int i;
 
 
        sprintf (t1, "unspec{");
        sprintf (t1, "unspec{");
        for (i = 0; i < XVECLEN (x, 0); i++)
        for (i = 0; i < XVECLEN (x, 0); i++)
          {
          {
            print_pattern (t2, XVECEXP (x, 0, i), verbose);
            print_pattern (t2, XVECEXP (x, 0, i), verbose);
            sprintf (t3, "%s%s;", t1, t2);
            sprintf (t3, "%s%s;", t1, t2);
            strcpy (t1, t3);
            strcpy (t1, t3);
          }
          }
        sprintf (buf, "%s}", t1);
        sprintf (buf, "%s}", t1);
      }
      }
      break;
      break;
    case UNSPEC_VOLATILE:
    case UNSPEC_VOLATILE:
      {
      {
        int i;
        int i;
 
 
        sprintf (t1, "unspec/v{");
        sprintf (t1, "unspec/v{");
        for (i = 0; i < XVECLEN (x, 0); i++)
        for (i = 0; i < XVECLEN (x, 0); i++)
          {
          {
            print_pattern (t2, XVECEXP (x, 0, i), verbose);
            print_pattern (t2, XVECEXP (x, 0, i), verbose);
            sprintf (t3, "%s%s;", t1, t2);
            sprintf (t3, "%s%s;", t1, t2);
            strcpy (t1, t3);
            strcpy (t1, t3);
          }
          }
        sprintf (buf, "%s}", t1);
        sprintf (buf, "%s}", t1);
      }
      }
      break;
      break;
    default:
    default:
      print_value (buf, x, verbose);
      print_value (buf, x, verbose);
    }
    }
}                               /* print_pattern */
}                               /* print_pattern */
 
 
/* This is the main function in rtl visualization mechanism. It
/* This is the main function in rtl visualization mechanism. It
   accepts an rtx and tries to recognize it as an insn, then prints it
   accepts an rtx and tries to recognize it as an insn, then prints it
   properly in human readable form, resembling assembler mnemonics.
   properly in human readable form, resembling assembler mnemonics.
   For every insn it prints its UID and BB the insn belongs too.
   For every insn it prints its UID and BB the insn belongs too.
   (Probably the last "option" should be extended somehow, since it
   (Probably the last "option" should be extended somehow, since it
   depends now on sched.c inner variables ...)  */
   depends now on sched.c inner variables ...)  */
 
 
void
void
print_insn (char *buf, rtx x, int verbose)
print_insn (char *buf, rtx x, int verbose)
{
{
  char t[BUF_LEN];
  char t[BUF_LEN];
  rtx insn = x;
  rtx insn = x;
 
 
  switch (GET_CODE (x))
  switch (GET_CODE (x))
    {
    {
    case INSN:
    case INSN:
      print_pattern (t, PATTERN (x), verbose);
      print_pattern (t, PATTERN (x), verbose);
#ifdef INSN_SCHEDULING
#ifdef INSN_SCHEDULING
      if (verbose && current_sched_info)
      if (verbose && current_sched_info)
        sprintf (buf, "%s: %s", (*current_sched_info->print_insn) (x, 1),
        sprintf (buf, "%s: %s", (*current_sched_info->print_insn) (x, 1),
                 t);
                 t);
      else
      else
#endif
#endif
        sprintf (buf, " %4d %s", INSN_UID (x), t);
        sprintf (buf, " %4d %s", INSN_UID (x), t);
      break;
      break;
    case JUMP_INSN:
    case JUMP_INSN:
      print_pattern (t, PATTERN (x), verbose);
      print_pattern (t, PATTERN (x), verbose);
#ifdef INSN_SCHEDULING
#ifdef INSN_SCHEDULING
      if (verbose && current_sched_info)
      if (verbose && current_sched_info)
        sprintf (buf, "%s: jump %s", (*current_sched_info->print_insn) (x, 1),
        sprintf (buf, "%s: jump %s", (*current_sched_info->print_insn) (x, 1),
                 t);
                 t);
      else
      else
#endif
#endif
        sprintf (buf, " %4d %s", INSN_UID (x), t);
        sprintf (buf, " %4d %s", INSN_UID (x), t);
      break;
      break;
    case CALL_INSN:
    case CALL_INSN:
      x = PATTERN (insn);
      x = PATTERN (insn);
      if (GET_CODE (x) == PARALLEL)
      if (GET_CODE (x) == PARALLEL)
        {
        {
          x = XVECEXP (x, 0, 0);
          x = XVECEXP (x, 0, 0);
          print_pattern (t, x, verbose);
          print_pattern (t, x, verbose);
        }
        }
      else
      else
        strcpy (t, "call <...>");
        strcpy (t, "call <...>");
#ifdef INSN_SCHEDULING
#ifdef INSN_SCHEDULING
      if (verbose && current_sched_info)
      if (verbose && current_sched_info)
        sprintf (buf, "%s: %s", (*current_sched_info->print_insn) (x, 1), t);
        sprintf (buf, "%s: %s", (*current_sched_info->print_insn) (x, 1), t);
      else
      else
#endif
#endif
        sprintf (buf, " %4d %s", INSN_UID (insn), t);
        sprintf (buf, " %4d %s", INSN_UID (insn), t);
      break;
      break;
    case CODE_LABEL:
    case CODE_LABEL:
      sprintf (buf, "L%d:", INSN_UID (x));
      sprintf (buf, "L%d:", INSN_UID (x));
      break;
      break;
    case BARRIER:
    case BARRIER:
      sprintf (buf, "i%4d: barrier", INSN_UID (x));
      sprintf (buf, "i%4d: barrier", INSN_UID (x));
      break;
      break;
    case NOTE:
    case NOTE:
      if (NOTE_LINE_NUMBER (x) > 0)
      if (NOTE_LINE_NUMBER (x) > 0)
        {
        {
          expanded_location xloc;
          expanded_location xloc;
          NOTE_EXPANDED_LOCATION (xloc, x);
          NOTE_EXPANDED_LOCATION (xloc, x);
          sprintf (buf, " %4d note \"%s\" %d", INSN_UID (x),
          sprintf (buf, " %4d note \"%s\" %d", INSN_UID (x),
                   xloc.file, xloc.line);
                   xloc.file, xloc.line);
        }
        }
      else
      else
        sprintf (buf, " %4d %s", INSN_UID (x),
        sprintf (buf, " %4d %s", INSN_UID (x),
                 GET_NOTE_INSN_NAME (NOTE_LINE_NUMBER (x)));
                 GET_NOTE_INSN_NAME (NOTE_LINE_NUMBER (x)));
      break;
      break;
    default:
    default:
      sprintf (buf, "i%4d  <What %s?>", INSN_UID (x),
      sprintf (buf, "i%4d  <What %s?>", INSN_UID (x),
               GET_RTX_NAME (GET_CODE (x)));
               GET_RTX_NAME (GET_CODE (x)));
    }
    }
}                               /* print_insn */
}                               /* print_insn */
 
 
 
 
/* Emit a slim dump of X (an insn) to the file F, including any register
/* Emit a slim dump of X (an insn) to the file F, including any register
   note attached to the instruction.  */
   note attached to the instruction.  */
void
void
dump_insn_slim (FILE *f, rtx x)
dump_insn_slim (FILE *f, rtx x)
{
{
  char t[BUF_LEN + 32];
  char t[BUF_LEN + 32];
  rtx note;
  rtx note;
 
 
  print_insn (t, x, 1);
  print_insn (t, x, 1);
  fputs (t, f);
  fputs (t, f);
  putc ('\n', f);
  putc ('\n', f);
  if (INSN_P (x) && REG_NOTES (x))
  if (INSN_P (x) && REG_NOTES (x))
    for (note = REG_NOTES (x); note; note = XEXP (note, 1))
    for (note = REG_NOTES (x); note; note = XEXP (note, 1))
      {
      {
        print_value (t, XEXP (note, 0), 1);
        print_value (t, XEXP (note, 0), 1);
        fprintf (f, "      %s: %s\n",
        fprintf (f, "      %s: %s\n",
                 GET_REG_NOTE_NAME (REG_NOTE_KIND (note)), t);
                 GET_REG_NOTE_NAME (REG_NOTE_KIND (note)), t);
      }
      }
}
}
 
 
/* Emit a slim dump of X (an insn) to stderr.  */
/* Emit a slim dump of X (an insn) to stderr.  */
void
void
debug_insn_slim (rtx x)
debug_insn_slim (rtx x)
{
{
  dump_insn_slim (stderr, x);
  dump_insn_slim (stderr, x);
}
}
 
 
/* Provide a slim dump the instruction chain starting at FIRST to F, honoring
/* Provide a slim dump the instruction chain starting at FIRST to F, honoring
   the dump flags given in FLAGS.  Currently, TDF_BLOCKS and TDF_DETAILS
   the dump flags given in FLAGS.  Currently, TDF_BLOCKS and TDF_DETAILS
   include more information on the basic blocks.  */
   include more information on the basic blocks.  */
void
void
print_rtl_slim_with_bb (FILE *f, rtx first, int flags)
print_rtl_slim_with_bb (FILE *f, rtx first, int flags)
{
{
  basic_block current_bb = NULL;
  basic_block current_bb = NULL;
  rtx insn;
  rtx insn;
 
 
  for (insn = first; NULL != insn; insn = NEXT_INSN (insn))
  for (insn = first; NULL != insn; insn = NEXT_INSN (insn))
    {
    {
      if ((flags & TDF_BLOCKS)
      if ((flags & TDF_BLOCKS)
          && (INSN_P (insn) || GET_CODE (insn) == NOTE)
          && (INSN_P (insn) || GET_CODE (insn) == NOTE)
          && BLOCK_FOR_INSN (insn)
          && BLOCK_FOR_INSN (insn)
          && !current_bb)
          && !current_bb)
        {
        {
          current_bb = BLOCK_FOR_INSN (insn);
          current_bb = BLOCK_FOR_INSN (insn);
          dump_bb_info (current_bb, true, false, flags, ";; ", f);
          dump_bb_info (current_bb, true, false, flags, ";; ", f);
        }
        }
 
 
      dump_insn_slim (f, insn);
      dump_insn_slim (f, insn);
 
 
      if ((flags & TDF_BLOCKS)
      if ((flags & TDF_BLOCKS)
          && current_bb
          && current_bb
          && insn == BB_END (current_bb))
          && insn == BB_END (current_bb))
        {
        {
          dump_bb_info (current_bb, false, true, flags, ";; ", f);
          dump_bb_info (current_bb, false, true, flags, ";; ", f);
          current_bb = NULL;
          current_bb = NULL;
        }
        }
    }
    }
}
}
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.