/* Generate attribute information (insn-attr.h) from machine description.
   Copyright (C) 1991-2013 Free Software Foundation, Inc.
   Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)

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 3, or (at your option) any later
version.

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 GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */


#include "bconfig.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include "rtl.h"
#include "errors.h"
#include "read-md.h"
#include "gensupport.h"


static void gen_attr (rtx);

static vec<rtx> const_attrs, reservations;


static void
gen_attr (rtx attr)
{
  const char *p;
  int is_const = GET_CODE (XEXP (attr, 2)) == CONST;

  if (is_const)
    const_attrs.safe_push (attr);

  printf ("#define HAVE_ATTR_%s 1\n", XSTR (attr, 0));

  /* If numeric attribute, don't need to write an enum.  */
  if (GET_CODE (attr) == DEFINE_ENUM_ATTR)
    printf ("extern enum %s get_attr_%s (%s);\n\n",
	    XSTR (attr, 1), XSTR (attr, 0), (is_const ? "void" : "rtx"));
  else
    {
      p = XSTR (attr, 1);
      if (*p == '\0')
	printf ("extern int get_attr_%s (%s);\n", XSTR (attr, 0),
		(is_const ? "void" : "rtx"));
      else
	printf ("extern enum attr_%s get_attr_%s (%s);\n\n",
		XSTR (attr, 0), XSTR (attr, 0), (is_const ? "void" : "rtx"));
    }

  /* If `length' attribute, write additional function definitions and define
     variables used by `insn_current_length'.  */
  if (! strcmp (XSTR (attr, 0), "length"))
    {
      puts ("\
extern void shorten_branches (rtx);\n\
extern int insn_default_length (rtx);\n\
extern int insn_min_length (rtx);\n\
extern int insn_variable_length_p (rtx);\n\
extern int insn_current_length (rtx);\n\n\
#include \"insn-addr.h\"\n");
    }
}

/* Check that attribute NAME is used in define_insn_reservation condition
   EXP.  Return true if it is.  */
static bool
check_tune_attr (const char *name, rtx exp)
{
  switch (GET_CODE (exp))
    {
    case AND:
      if (check_tune_attr (name, XEXP (exp, 0)))
	return true;
      return check_tune_attr (name, XEXP (exp, 1));

    case IOR:
      return (check_tune_attr (name, XEXP (exp, 0))
	      && check_tune_attr (name, XEXP (exp, 1)));

    case EQ_ATTR:
      return strcmp (XSTR (exp, 0), name) == 0;

    default:
      return false;
    }
}

/* Try to find a const attribute (usually cpu or tune) that is used
   in all define_insn_reservation conditions.  */
static bool
find_tune_attr (rtx exp)
{
  unsigned int i;
  rtx attr;

  switch (GET_CODE (exp))
    {
    case AND:
    case IOR:
      if (find_tune_attr (XEXP (exp, 0)))
	return true;
      return find_tune_attr (XEXP (exp, 1));

    case EQ_ATTR:
      if (strcmp (XSTR (exp, 0), "alternative") == 0)
	return false;

      FOR_EACH_VEC_ELT (const_attrs, i, attr)
	if (strcmp (XSTR (attr, 0), XSTR (exp, 0)) == 0)
	  {
	    unsigned int j;
	    rtx resv;

	    FOR_EACH_VEC_ELT (reservations, j, resv)
	      if (! check_tune_attr (XSTR (attr, 0), XEXP (resv, 2)))
		return false;
	    return true;
	  }
      return false;

    default:
      return false;
    }
}

int
main (int argc, char **argv)
{
  rtx desc;
  int have_delay = 0;
  int have_annul_true = 0;
  int have_annul_false = 0;
  int num_insn_reservations = 0;
  int i;

  progname = "genattr";

  if (!init_rtx_reader_args (argc, argv))
    return (FATAL_EXIT_CODE);

  puts ("/* Generated automatically by the program `genattr'");
  puts ("   from the machine description file `md'.  */\n");
  puts ("#ifndef GCC_INSN_ATTR_H");
  puts ("#define GCC_INSN_ATTR_H\n");

  puts ("#include \"insn-attr-common.h\"\n");

  /* Read the machine description.  */

  while (1)
    {
      int line_no, insn_code_number;

      desc = read_md_rtx (&line_no, &insn_code_number);
      if (desc == NULL)
	break;

      if (GET_CODE (desc) == DEFINE_ATTR
	  || GET_CODE (desc) == DEFINE_ENUM_ATTR)
	gen_attr (desc);

      else if (GET_CODE (desc) == DEFINE_DELAY)
        {
	  if (! have_delay)
	    {
	      printf ("extern int num_delay_slots (rtx);\n");
	      printf ("extern int eligible_for_delay (rtx, int, rtx, int);\n\n");
	      printf ("extern int const_num_delay_slots (rtx);\n\n");
	      have_delay = 1;
	    }

	  for (i = 0; i < XVECLEN (desc, 1); i += 3)
	    {
	      if (XVECEXP (desc, 1, i + 1) && ! have_annul_true)
		{
		  printf ("#define ANNUL_IFTRUE_SLOTS\n");
		  printf ("extern int eligible_for_annul_true (rtx, int, rtx, int);\n");
		  have_annul_true = 1;
		}

	      if (XVECEXP (desc, 1, i + 2) && ! have_annul_false)
		{
		  printf ("#define ANNUL_IFFALSE_SLOTS\n");
		  printf ("extern int eligible_for_annul_false (rtx, int, rtx, int);\n");
		  have_annul_false = 1;
		}
	    }
        }

      else if (GET_CODE (desc) == DEFINE_INSN_RESERVATION)
	{
	  num_insn_reservations++;
	  reservations.safe_push (desc);
	}
    }

  if (num_insn_reservations > 0)
    {
      bool has_tune_attr
	= find_tune_attr (XEXP (reservations[0], 2));
      /* Output interface for pipeline hazards recognition based on
	 DFA (deterministic finite state automata.  */
      printf ("\n/* DFA based pipeline interface.  */");
      printf ("\n#ifndef AUTOMATON_ALTS\n");
      printf ("#define AUTOMATON_ALTS 0\n");
      printf ("#endif\n\n");
      printf ("\n#ifndef AUTOMATON_STATE_ALTS\n");
      printf ("#define AUTOMATON_STATE_ALTS 0\n");
      printf ("#endif\n\n");
      printf ("#ifndef CPU_UNITS_QUERY\n");
      printf ("#define CPU_UNITS_QUERY 0\n");
      printf ("#endif\n\n");
      /* Interface itself: */
      if (has_tune_attr)
	{
	  printf ("/* Initialize fn pointers for internal_dfa_insn_code\n");
	  printf ("   and insn_default_latency.  */\n");
	  printf ("extern void init_sched_attrs (void);\n\n");
	  printf ("/* Internal insn code number used by automata.  */\n");
	  printf ("extern int (*internal_dfa_insn_code) (rtx);\n\n");
	  printf ("/* Insn latency time defined in define_insn_reservation. */\n");
	  printf ("extern int (*insn_default_latency) (rtx);\n\n");
	}
      else
	{
	  printf ("#define init_sched_attrs() do { } while (0)\n\n");
	  printf ("/* Internal insn code number used by automata.  */\n");
	  printf ("extern int internal_dfa_insn_code (rtx);\n\n");
	  printf ("/* Insn latency time defined in define_insn_reservation. */\n");
	  printf ("extern int insn_default_latency (rtx);\n\n");
	}
      printf ("/* Return nonzero if there is a bypass for given insn\n");
      printf ("   which is a data producer.  */\n");
      printf ("extern int bypass_p (rtx);\n\n");
      printf ("/* Insn latency time on data consumed by the 2nd insn.\n");
      printf ("   Use the function if bypass_p returns nonzero for\n");
      printf ("   the 1st insn. */\n");
      printf ("extern int insn_latency (rtx, rtx);\n\n");
      printf ("/* Maximal insn latency time possible of all bypasses for this insn.\n");
      printf ("   Use the function if bypass_p returns nonzero for\n");
      printf ("   the 1st insn. */\n");
      printf ("extern int maximal_insn_latency (rtx);\n\n");
      printf ("\n#if AUTOMATON_ALTS\n");
      printf ("/* The following function returns number of alternative\n");
      printf ("   reservations of given insn.  It may be used for better\n");
      printf ("   insns scheduling heuristics. */\n");
      printf ("extern int insn_alts (rtx);\n\n");
      printf ("#endif\n\n");
      printf ("/* Maximal possible number of insns waiting results being\n");
      printf ("   produced by insns whose execution is not finished. */\n");
      printf ("extern const int max_insn_queue_index;\n\n");
      printf ("/* Pointer to data describing current state of DFA.  */\n");
      printf ("typedef void *state_t;\n\n");
      printf ("/* Size of the data in bytes.  */\n");
      printf ("extern int state_size (void);\n\n");
      printf ("/* Initiate given DFA state, i.e. Set up the state\n");
      printf ("   as all functional units were not reserved.  */\n");
      printf ("extern void state_reset (state_t);\n");
      printf ("/* The following function returns negative value if given\n");
      printf ("   insn can be issued in processor state described by given\n");
      printf ("   DFA state.  In this case, the DFA state is changed to\n");
      printf ("   reflect the current and future reservations by given\n");
      printf ("   insn.  Otherwise the function returns minimal time\n");
      printf ("   delay to issue the insn.  This delay may be zero\n");
      printf ("   for superscalar or VLIW processors.  If the second\n");
      printf ("   parameter is NULL the function changes given DFA state\n");
      printf ("   as new processor cycle started.  */\n");
      printf ("extern int state_transition (state_t, rtx);\n");
      printf ("\n#if AUTOMATON_STATE_ALTS\n");
      printf ("/* The following function returns number of possible\n");
      printf ("   alternative reservations of given insn in given\n");
      printf ("   DFA state.  It may be used for better insns scheduling\n");
      printf ("   heuristics.  By default the function is defined if\n");
      printf ("   macro AUTOMATON_STATE_ALTS is defined because its\n");
      printf ("   implementation may require much memory.  */\n");
      printf ("extern int state_alts (state_t, rtx);\n");
      printf ("#endif\n\n");
      printf ("extern int min_issue_delay (state_t, rtx);\n");
      printf ("/* The following function returns nonzero if no one insn\n");
      printf ("   can be issued in current DFA state. */\n");
      printf ("extern int state_dead_lock_p (state_t);\n");
      printf ("/* The function returns minimal delay of issue of the 2nd\n");
      printf ("   insn after issuing the 1st insn in given DFA state.\n");
      printf ("   The 1st insn should be issued in given state (i.e.\n");
      printf ("    state_transition should return negative value for\n");
      printf ("    the insn and the state).  Data dependencies between\n");
      printf ("    the insns are ignored by the function.  */\n");
      printf
	("extern int min_insn_conflict_delay (state_t, rtx, rtx);\n");
      printf ("/* The following function outputs reservations for given\n");
      printf ("   insn as they are described in the corresponding\n");
      printf ("   define_insn_reservation.  */\n");
      printf ("extern void print_reservation (FILE *, rtx);\n");
      printf ("\n#if CPU_UNITS_QUERY\n");
      printf ("/* The following function returns code of functional unit\n");
      printf ("   with given name (see define_cpu_unit). */\n");
      printf ("extern int get_cpu_unit_code (const char *);\n");
      printf ("/* The following function returns nonzero if functional\n");
      printf ("   unit with given code is currently reserved in given\n");
      printf ("   DFA state.  */\n");
      printf ("extern int cpu_unit_reservation_p (state_t, int);\n");
      printf ("#endif\n\n");
      printf ("/* The following function returns true if insn\n");
      printf ("   has a dfa reservation.  */\n");
      printf ("extern bool insn_has_dfa_reservation_p (rtx);\n\n");
      printf ("/* Clean insn code cache.  It should be called if there\n");
      printf ("   is a chance that condition value in a\n");
      printf ("   define_insn_reservation will be changed after\n");
      printf ("   last call of dfa_start.  */\n");
      printf ("extern void dfa_clean_insn_cache (void);\n\n");
      printf ("extern void dfa_clear_single_insn_cache (rtx);\n\n");
      printf ("/* Initiate and finish work with DFA.  They should be\n");
      printf ("   called as the first and the last interface\n");
      printf ("   functions.  */\n");
      printf ("extern void dfa_start (void);\n");
      printf ("extern void dfa_finish (void);\n");
    }
  else
    {
      /* Otherwise we do no scheduling, but we need these typedefs
	 in order to avoid uglifying other code with more ifdefs.  */
      printf ("typedef void *state_t;\n\n");
    }

  /* Special-purpose atributes should be tested with if, not #ifdef.  */
  const char * const special_attrs[] = { "length", "enabled", 0 };
  for (const char * const *p = special_attrs; *p; p++)
    {
      printf ("#ifndef HAVE_ATTR_%s\n"
	      "#define HAVE_ATTR_%s 0\n"
	      "#endif\n", *p, *p);
    }
  /* We make an exception here to provide stub definitions for
     insn_*_length* / get_attr_enabled functions.  */
  puts ("#if !HAVE_ATTR_length\n"
	"extern int hook_int_rtx_unreachable (rtx);\n"
	"#define insn_default_length hook_int_rtx_unreachable\n"
	"#define insn_min_length hook_int_rtx_unreachable\n"
	"#define insn_variable_length_p hook_int_rtx_unreachable\n"
	"#define insn_current_length hook_int_rtx_unreachable\n"
	"#include \"insn-addr.h\"\n"
	"#endif\n"
	"#if !HAVE_ATTR_enabled\n"
	"extern int hook_int_rtx_1 (rtx);\n"
	"#define get_attr_enabled hook_int_rtx_1\n"
	"#endif\n");

  /* Output flag masks for use by reorg.

     Flags are used to hold branch direction for use by eligible_for_...  */
  printf("\n#define ATTR_FLAG_forward\t0x1\n");
  printf("#define ATTR_FLAG_backward\t0x2\n");

  puts("\n#endif /* GCC_INSN_ATTR_H */");

  if (ferror (stdout) || fflush (stdout) || fclose (stdout))
    return FATAL_EXIT_CODE;

  return SUCCESS_EXIT_CODE;
}
