|
|
1.1 root 1: /* Generate from machine description:
2:
3: - some flags HAVE_... saying which simple standard instructions are
4: available for this machine.
5: Copyright (C) 1987 Free Software Foundation, Inc.
6:
7: This file is part of GNU CC.
8:
9: GNU CC is distributed in the hope that it will be useful,
10: but WITHOUT ANY WARRANTY. No author or distributor
11: accepts responsibility to anyone for the consequences of using it
12: or for whether it serves any particular purpose or works at all,
13: unless he says so in writing. Refer to the GNU CC General Public
14: License for full details.
15:
16: Everyone is granted permission to copy, modify and redistribute
17: GNU CC, but only under the conditions described in the
18: GNU CC General Public License. A copy of this license is
19: supposed to have been given to you along with GNU CC so you
20: can know your rights and responsibilities. It should be in a
21: file named COPYING. Among other things, the copyright notice
22: and this notice must be preserved on all copies. */
23:
24:
25: #include <stdio.h>
26: #include "rtl.h"
27: #include <obstack.h>
28:
29: struct obstack obstack;
30: struct obstack *current_obstack = &obstack;
31:
32: #define obstack_chunk_alloc xmalloc
33: #define obstack_chunk_free free
34: extern int xmalloc ();
35: extern void free ();
36:
37: /* flags to determine output of machine description dependent #define's. */
38: int max_recog_operands_flag;
39: int max_dup_operands_flag;
40: int max_sets_per_insn_flag;
41: int register_constraint_flag;
42:
43: int sets_seen_this_insn;
44: int dup_operands_seen_this_insn;
45:
46: void fatal ();
47:
48: void
49: walk_insn_part (part)
50: rtx part;
51: {
52: register int i, j;
53: register RTX_CODE code = GET_CODE (part);
54: register char *format_ptr;
55:
56: switch (code)
57: {
58: case SET:
59: sets_seen_this_insn++;
60: break;
61:
62: case MATCH_OPERAND:
63: if (XINT (part, 0) > max_recog_operands_flag)
64: max_recog_operands_flag = XINT (part, 0);
65: if (XSTR (part, 2) && *XSTR (part, 2))
66: register_constraint_flag = 1;
67: return;
68:
69: case MATCH_DUP:
70: ++dup_operands_seen_this_insn;
71:
72: case REG: case CONST_INT: case SYMBOL_REF:
73: case LABEL_REF: case PC: case CC0:
74: return;
75: }
76:
77: format_ptr = GET_RTX_FORMAT (GET_CODE (part));
78:
79: for (i = 0; i < GET_RTX_LENGTH (GET_CODE (part)); i++)
80: switch (*format_ptr++)
81: {
82: case 'e':
83: walk_insn_part (XEXP (part, i));
84: break;
85: case 'E':
86: if (XVEC (part, i) != NULL)
87: for (j = 0; j < XVECLEN (part, i); j++)
88: walk_insn_part (XVECEXP (part, i, j));
89: break;
90: }
91: }
92:
93: void
94: gen_insn (insn)
95: rtx insn;
96: {
97: int i;
98:
99: /* Walk the insn pattern to gather the #define's status. */
100: sets_seen_this_insn = 0;
101: dup_operands_seen_this_insn = 0;
102: for (i = 0; i < XVECLEN (insn, 1); i++) {
103: walk_insn_part (XVECEXP (insn, 1, i));
104: }
105: if (sets_seen_this_insn > max_sets_per_insn_flag)
106: max_sets_per_insn_flag = sets_seen_this_insn;
107: if (dup_operands_seen_this_insn > max_dup_operands_flag)
108: max_dup_operands_flag = dup_operands_seen_this_insn;
109:
110: /* Don't mention instructions whose names are the null string.
111: They are in the machine description just to be recognized. */
112: if (strlen (XSTR (insn, 0)) == 0)
113: return;
114:
115: printf ("#define HAVE_%s %s\n", XSTR (insn, 0),
116: strlen (XSTR (insn, 2)) ? XSTR (insn, 2) : "1");
117: printf ("extern rtx gen_%s ();\n", XSTR (insn, 0));
118: }
119:
120: xmalloc (size)
121: {
122: register int val = malloc (size);
123:
124: if (val == 0)
125: abort ();
126:
127: return val;
128: }
129:
130: int
131: xrealloc (ptr, size)
132: char *ptr;
133: int size;
134: {
135: int result = realloc (ptr, size);
136: if (!result)
137: abort ();
138: return result;
139: }
140:
141: void
142: fatal (s, a1, a2)
143: {
144: fprintf (stderr, "genflags: ");
145: fprintf (stderr, s, a1, a2);
146: fprintf (stderr, "\n");
147: exit (1);
148: }
149:
150: main (argc, argv)
151: int argc;
152: char **argv;
153: {
154: rtx desc;
155: FILE *infile;
156: extern rtx read_rtx ();
157: register int c;
158:
159: obstack_begin (current_obstack, 4060);
160:
161: if (argc <= 1)
162: fatal ("No input file name.");
163:
164: infile = fopen (argv[1], "r");
165: if (infile == 0)
166: {
167: perror (argv[1]);
168: exit (1);
169: }
170:
171: init_rtl ();
172:
173: printf ("/* Generated automatically by the program `genflags'\n\
174: from the machine description file `md'. */\n\n");
175:
176: /* Read the machine description. */
177:
178: while (1)
179: {
180: c = read_skip_spaces (infile);
181: if (c == EOF)
182: break;
183: ungetc (c, infile);
184:
185: desc = read_rtx (infile);
186: gen_insn (desc);
187: }
188:
189: return 0;
190: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.