gencodes.c 2.67 KB
Newer Older
Tom Wood committed
1 2 3
/* Generate from machine description:
   - some macros CODE_FOR_... giving the insn_code_number value
   for each of the defined standard insn names.
Jeff Law committed
4
   Copyright (C) 1987, 1991, 1995, 1998,
5
   1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
Tom Wood committed
6

7
This file is part of GCC.
Tom Wood committed
8

9 10 11 12
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.
Tom Wood committed
13

14 15 16 17
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.
Tom Wood committed
18 19

You should have received a copy of the GNU General Public License
20 21 22
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.  */
Tom Wood committed
23 24


25
#include "bconfig.h"
26
#include "system.h"
27 28
#include "coretypes.h"
#include "tm.h"
Tom Wood committed
29
#include "rtl.h"
Zack Weinberg committed
30
#include "errors.h"
Clinton Popetz committed
31
#include "gensupport.h"
Tom Wood committed
32 33

static void
34
gen_insn (rtx insn, int code)
Tom Wood committed
35
{
36 37 38
  const char *name = XSTR (insn, 0);
  int truth = maybe_eval_c_test (XSTR (insn, 2));

39 40 41
  /* Don't mention instructions whose names are the null string
     or begin with '*'.  They are in the machine description just
     to be recognized.  */
42
  if (name[0] != 0 && name[0] != '*')
43 44 45 46 47 48
    {
      if (truth == 0)
	printf ("#define CODE_FOR_%s CODE_FOR_nothing\n", name);
      else
	printf ("  CODE_FOR_%s = %d,\n", name, code);
    }
Tom Wood committed
49 50 51
}

int
52
main (int argc, char **argv)
Tom Wood committed
53 54 55
{
  rtx desc;

Zack Weinberg committed
56
  progname = "gencodes";
Tom Wood committed
57

58 59 60 61
  /* We need to see all the possibilities.  Elided insns may have
     direct references to CODE_FOR_xxx in C code.  */
  insn_elision = 0;

62
  if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
Clinton Popetz committed
63
    return (FATAL_EXIT_CODE);
Tom Wood committed
64

65 66 67 68 69 70 71 72
  puts ("\
/* Generated automatically by the program `gencodes'\n\
   from the machine description file `md'.  */\n\
\n\
#ifndef GCC_INSN_CODES_H\n\
#define GCC_INSN_CODES_H\n\
\n\
enum insn_code {");
Tom Wood committed
73 74 75 76 77

  /* Read the machine description.  */

  while (1)
    {
Clinton Popetz committed
78
      int line_no;
79
      int insn_code_number;
Clinton Popetz committed
80 81 82

      desc = read_md_rtx (&line_no, &insn_code_number);
      if (desc == NULL)
Tom Wood committed
83 84 85
	break;

      if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
86
	gen_insn (desc, insn_code_number);
Tom Wood committed
87 88
    }

89
  puts ("  CODE_FOR_nothing\n\
90 91 92
};\n\
\n\
#endif /* GCC_INSN_CODES_H */");
93 94 95

  if (ferror (stdout) || fflush (stdout) || fclose (stdout))
    return FATAL_EXIT_CODE;
Tom Wood committed
96

97
  return SUCCESS_EXIT_CODE;
Tom Wood committed
98
}
99 100

/* Define this so we can link with print-rtl.o to get debug_rtx function.  */
101

102
const char *
103
get_insn_name (int code ATTRIBUTE_UNUSED)
104 105 106
{
  return NULL;
}