/* Generate attribute information (insn-attr.h) from machine description.
   Copyright (C) 1991-2015 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_insn *"));
  else
    {
      p = XSTR (attr, 1);
      if (*p == '\0')
	printf ("extern int get_attr_%s (%s);\n", XSTR (attr, 0),
		(is_const ? "void" : "rtx_insn *"));
      else
	printf ("extern enum attr_%s get_attr_%s (%s);\n\n",
		XSTR (attr, 0), XSTR (attr, 0),
		(is_const ? "void" : "rtx_insn *"));
    }

  /* 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_insn *);\n\
extern int insn_default_length (rtx_insn *);\n\
extern int insn_min_length (rtx_insn *);\n\
extern int insn_variable_length_p (rtx_insn *);\n\
extern int insn_current_length (rtx_insn *);\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_insn *);\n");
	      printf ("extern int eligible_for_delay (rtx_insn *, int, rtx_insn *, int);\n\n");
	      printf ("extern int const_num_delay_slots (rtx_insn *);\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_insn *, int, rtx_insn *, 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_insn *, int, rtx_insn *, 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_insn *);\n\n");
	  printf ("/* Insn latency time defined in define_insn_reservation. */\n");
	  printf ("extern int (*insn_default_latency) (rtx_insn *);\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_insn *);\n\n");
	  printf ("/* Insn latency time defined in define_insn_reservation. */\n");
	  printf ("extern int insn_default_latency (rtx_insn *);\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_insn *);\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_insn *);\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_insn *);\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_insn *);\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_insn *);\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 attributes should be tested with if, not #ifdef.  */
  const char * const special_attrs[] = { "length", "enabled",
					 "preferred_for_size",
					 "preferred_for_speed", 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_insn_unreachable (rtx_insn *);\n"
	"#define insn_default_length hook_int_rtx_insn_unreachable\n"
	"#define insn_min_length hook_int_rtx_insn_unreachable\n"
	"#define insn_variable_length_p hook_int_rtx_insn_unreachable\n"
	"#define insn_current_length hook_int_rtx_insn_unreachable\n"
	"#include \"insn-addr.h\"\n"
	"#endif\n"
	"extern int hook_int_rtx_1 (rtx);\n"
	"#if !HAVE_ATTR_enabled\n"
	"#define get_attr_enabled hook_int_rtx_1\n"
	"#endif\n"
	"#if !HAVE_ATTR_preferred_for_size\n"
	"#define get_attr_preferred_for_size hook_int_rtx_1\n"
	"#endif\n"
	"#if !HAVE_ATTR_preferred_for_speed\n"
	"#define get_attr_preferred_for_speed 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;
}
