118334Speter/* Generate from machine description:
218334Speter   - some macros CODE_FOR_... giving the insn_code_number value
318334Speter   for each of the defined standard insn names.
490075Sobrien   Copyright (C) 1987, 1991, 1995, 1998,
5169689Skan   1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
618334Speter
790075SobrienThis file is part of GCC.
818334Speter
990075SobrienGCC is free software; you can redistribute it and/or modify it under
1090075Sobrienthe terms of the GNU General Public License as published by the Free
1190075SobrienSoftware Foundation; either version 2, or (at your option) any later
1290075Sobrienversion.
1318334Speter
1490075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1590075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or
1690075SobrienFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1790075Sobrienfor more details.
1818334Speter
1918334SpeterYou should have received a copy of the GNU General Public License
2090075Sobrienalong with GCC; see the file COPYING.  If not, write to the Free
21169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
22169689Skan02110-1301, USA.  */
2318334Speter
2418334Speter
25132718Skan#include "bconfig.h"
2650397Sobrien#include "system.h"
27132718Skan#include "coretypes.h"
28132718Skan#include "tm.h"
2918334Speter#include "rtl.h"
3090075Sobrien#include "errors.h"
3190075Sobrien#include "gensupport.h"
3218334Speter
3318334Speterstatic void
34132718Skangen_insn (rtx insn, int code)
3518334Speter{
36117395Skan  const char *name = XSTR (insn, 0);
37117395Skan  int truth = maybe_eval_c_test (XSTR (insn, 2));
38117395Skan
3918334Speter  /* Don't mention instructions whose names are the null string
4018334Speter     or begin with '*'.  They are in the machine description just
4118334Speter     to be recognized.  */
4290075Sobrien  if (name[0] != 0 && name[0] != '*')
43117395Skan    {
44117395Skan      if (truth == 0)
45117395Skan	printf ("#define CODE_FOR_%s CODE_FOR_nothing\n", name);
46117395Skan      else
47117395Skan	printf ("  CODE_FOR_%s = %d,\n", name, code);
48117395Skan    }
4918334Speter}
5018334Speter
5118334Speterint
52132718Skanmain (int argc, char **argv)
5318334Speter{
5418334Speter  rtx desc;
5518334Speter
5690075Sobrien  progname = "gencodes";
5718334Speter
58117395Skan  /* We need to see all the possibilities.  Elided insns may have
59117395Skan     direct references to CODE_FOR_xxx in C code.  */
60117395Skan  insn_elision = 0;
61117395Skan
6290075Sobrien  if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
6390075Sobrien    return (FATAL_EXIT_CODE);
6418334Speter
6590075Sobrien  puts ("\
6690075Sobrien/* Generated automatically by the program `gencodes'\n\
6790075Sobrien   from the machine description file `md'.  */\n\
6890075Sobrien\n\
6990075Sobrien#ifndef GCC_INSN_CODES_H\n\
7090075Sobrien#define GCC_INSN_CODES_H\n\
7190075Sobrien\n\
7290075Sobrienenum insn_code {");
7318334Speter
7418334Speter  /* Read the machine description.  */
7518334Speter
7618334Speter  while (1)
7718334Speter    {
7890075Sobrien      int line_no;
7990075Sobrien      int insn_code_number;
8090075Sobrien
8190075Sobrien      desc = read_md_rtx (&line_no, &insn_code_number);
8290075Sobrien      if (desc == NULL)
8318334Speter	break;
8418334Speter
8518334Speter      if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
86117395Skan	gen_insn (desc, insn_code_number);
8718334Speter    }
8818334Speter
89117395Skan  puts ("  CODE_FOR_nothing\n\
9090075Sobrien};\n\
9190075Sobrien\n\
9290075Sobrien#endif /* GCC_INSN_CODES_H */");
9318334Speter
9490075Sobrien  if (ferror (stdout) || fflush (stdout) || fclose (stdout))
9590075Sobrien    return FATAL_EXIT_CODE;
9618334Speter
9790075Sobrien  return SUCCESS_EXIT_CODE;
9890075Sobrien}
99