Mercurial > hg > CbC > CbC_gcc
annotate gcc/genattr.c @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 1830386684a0 |
children |
rev | line source |
---|---|
0 | 1 /* Generate attribute information (insn-attr.h) from machine description. |
145 | 2 Copyright (C) 1991-2020 Free Software Foundation, Inc. |
0 | 3 Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu) |
4 | |
5 This file is part of GCC. | |
6 | |
7 GCC is free software; you can redistribute it and/or modify it under | |
8 the terms of the GNU General Public License as published by the Free | |
9 Software Foundation; either version 3, or (at your option) any later | |
10 version. | |
11 | |
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GCC; see the file COPYING3. If not see | |
19 <http://www.gnu.org/licenses/>. */ | |
20 | |
21 | |
22 #include "bconfig.h" | |
23 #include "system.h" | |
24 #include "coretypes.h" | |
25 #include "tm.h" | |
26 #include "rtl.h" | |
27 #include "errors.h" | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
28 #include "read-md.h" |
0 | 29 #include "gensupport.h" |
30 | |
31 | |
111 | 32 static vec<rtx> const_attrs, reservations; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
33 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
34 |
0 | 35 static void |
111 | 36 gen_attr (md_rtx_info *info) |
0 | 37 { |
111 | 38 const char *p; |
39 rtx attr = info->def; | |
0 | 40 int is_const = GET_CODE (XEXP (attr, 2)) == CONST; |
41 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
42 if (is_const) |
111 | 43 const_attrs.safe_push (attr); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
44 |
111 | 45 printf ("#define HAVE_ATTR_%s 1\n", XSTR (attr, 0)); |
0 | 46 |
47 /* If numeric attribute, don't need to write an enum. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
48 if (GET_CODE (attr) == DEFINE_ENUM_ATTR) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
49 printf ("extern enum %s get_attr_%s (%s);\n\n", |
111 | 50 XSTR (attr, 1), XSTR (attr, 0), |
51 (is_const ? "void" : "rtx_insn *")); | |
0 | 52 else |
53 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
54 p = XSTR (attr, 1); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
55 if (*p == '\0') |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
56 printf ("extern int get_attr_%s (%s);\n", XSTR (attr, 0), |
111 | 57 (is_const ? "void" : "rtx_insn *")); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
58 else |
111 | 59 printf ("extern enum attr_%s get_attr_%s (%s);\n\n", |
60 XSTR (attr, 0), XSTR (attr, 0), | |
61 (is_const ? "void" : "rtx_insn *")); | |
0 | 62 } |
63 | |
64 /* If `length' attribute, write additional function definitions and define | |
65 variables used by `insn_current_length'. */ | |
66 if (! strcmp (XSTR (attr, 0), "length")) | |
67 { | |
68 puts ("\ | |
111 | 69 extern void shorten_branches (rtx_insn *);\n\ |
70 extern int insn_default_length (rtx_insn *);\n\ | |
71 extern int insn_min_length (rtx_insn *);\n\ | |
72 extern int insn_variable_length_p (rtx_insn *);\n\ | |
73 extern int insn_current_length (rtx_insn *);\n\n\ | |
0 | 74 #include \"insn-addr.h\"\n"); |
75 } | |
76 } | |
77 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
78 /* Check that attribute NAME is used in define_insn_reservation condition |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
79 EXP. Return true if it is. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
80 static bool |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
81 check_tune_attr (const char *name, rtx exp) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
82 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
83 switch (GET_CODE (exp)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
84 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
85 case AND: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
86 if (check_tune_attr (name, XEXP (exp, 0))) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
87 return true; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
88 return check_tune_attr (name, XEXP (exp, 1)); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
89 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
90 case IOR: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
91 return (check_tune_attr (name, XEXP (exp, 0)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
92 && check_tune_attr (name, XEXP (exp, 1))); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
93 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
94 case EQ_ATTR: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
95 return strcmp (XSTR (exp, 0), name) == 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
96 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
97 default: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
98 return false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
99 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
100 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
101 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
102 /* Try to find a const attribute (usually cpu or tune) that is used |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
103 in all define_insn_reservation conditions. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
104 static bool |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
105 find_tune_attr (rtx exp) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
106 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
107 unsigned int i; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
108 rtx attr; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
109 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
110 switch (GET_CODE (exp)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
111 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
112 case AND: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
113 case IOR: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
114 if (find_tune_attr (XEXP (exp, 0))) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
115 return true; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
116 return find_tune_attr (XEXP (exp, 1)); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
117 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
118 case EQ_ATTR: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
119 if (strcmp (XSTR (exp, 0), "alternative") == 0) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
120 return false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
121 |
111 | 122 FOR_EACH_VEC_ELT (const_attrs, i, attr) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
123 if (strcmp (XSTR (attr, 0), XSTR (exp, 0)) == 0) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
124 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
125 unsigned int j; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
126 rtx resv; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
127 |
111 | 128 FOR_EACH_VEC_ELT (reservations, j, resv) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
129 if (! check_tune_attr (XSTR (attr, 0), XEXP (resv, 2))) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
130 return false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
131 return true; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
132 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
133 return false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
134 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
135 default: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
136 return false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
137 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
138 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
139 |
0 | 140 int |
111 | 141 main (int argc, const char **argv) |
0 | 142 { |
111 | 143 bool have_annul_true = false; |
144 bool have_annul_false = false; | |
0 | 145 int num_insn_reservations = 0; |
146 int i; | |
147 | |
148 progname = "genattr"; | |
149 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
150 if (!init_rtx_reader_args (argc, argv)) |
0 | 151 return (FATAL_EXIT_CODE); |
152 | |
153 puts ("/* Generated automatically by the program `genattr'"); | |
154 puts (" from the machine description file `md'. */\n"); | |
155 puts ("#ifndef GCC_INSN_ATTR_H"); | |
156 puts ("#define GCC_INSN_ATTR_H\n"); | |
157 | |
111 | 158 puts ("#include \"insn-attr-common.h\"\n"); |
0 | 159 |
160 /* Read the machine description. */ | |
161 | |
111 | 162 md_rtx_info info; |
163 while (read_md_rtx (&info)) | |
0 | 164 { |
111 | 165 rtx def = info.def; |
166 switch (GET_CODE (def)) | |
167 { | |
168 case DEFINE_ATTR: | |
169 case DEFINE_ENUM_ATTR: | |
170 gen_attr (&info); | |
171 break; | |
0 | 172 |
111 | 173 case DEFINE_DELAY: |
174 for (i = 0; i < XVECLEN (def, 1); i += 3) | |
0 | 175 { |
111 | 176 if (XVECEXP (def, 1, i + 1)) |
177 have_annul_true = true; | |
0 | 178 |
111 | 179 if (XVECEXP (def, 1, i + 2)) |
180 have_annul_false = true; | |
0 | 181 } |
111 | 182 break; |
0 | 183 |
111 | 184 case DEFINE_INSN_RESERVATION: |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
185 num_insn_reservations++; |
111 | 186 reservations.safe_push (def); |
187 break; | |
188 | |
189 default: | |
190 break; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
191 } |
0 | 192 } |
193 | |
111 | 194 printf ("extern int num_delay_slots (rtx_insn *);\n"); |
195 printf ("extern int eligible_for_delay (rtx_insn *, int, rtx_insn *, int);\n\n"); | |
196 printf ("extern int const_num_delay_slots (rtx_insn *);\n\n"); | |
197 printf ("#define ANNUL_IFTRUE_SLOTS %d\n", have_annul_true); | |
198 printf ("extern int eligible_for_annul_true (rtx_insn *, int, rtx_insn *, int);\n"); | |
199 printf ("#define ANNUL_IFFALSE_SLOTS %d\n", have_annul_false); | |
200 printf ("extern int eligible_for_annul_false (rtx_insn *, int, rtx_insn *, int);\n"); | |
201 | |
0 | 202 if (num_insn_reservations > 0) |
203 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
204 bool has_tune_attr |
111 | 205 = find_tune_attr (XEXP (reservations[0], 2)); |
0 | 206 /* Output interface for pipeline hazards recognition based on |
207 DFA (deterministic finite state automata. */ | |
208 printf ("\n/* DFA based pipeline interface. */"); | |
209 printf ("\n#ifndef AUTOMATON_ALTS\n"); | |
210 printf ("#define AUTOMATON_ALTS 0\n"); | |
211 printf ("#endif\n\n"); | |
212 printf ("\n#ifndef AUTOMATON_STATE_ALTS\n"); | |
213 printf ("#define AUTOMATON_STATE_ALTS 0\n"); | |
214 printf ("#endif\n\n"); | |
215 printf ("#ifndef CPU_UNITS_QUERY\n"); | |
216 printf ("#define CPU_UNITS_QUERY 0\n"); | |
217 printf ("#endif\n\n"); | |
218 /* Interface itself: */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
219 if (has_tune_attr) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
220 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
221 printf ("/* Initialize fn pointers for internal_dfa_insn_code\n"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
222 printf (" and insn_default_latency. */\n"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
223 printf ("extern void init_sched_attrs (void);\n\n"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
224 printf ("/* Internal insn code number used by automata. */\n"); |
111 | 225 printf ("extern int (*internal_dfa_insn_code) (rtx_insn *);\n\n"); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
226 printf ("/* Insn latency time defined in define_insn_reservation. */\n"); |
111 | 227 printf ("extern int (*insn_default_latency) (rtx_insn *);\n\n"); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
228 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
229 else |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
230 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
231 printf ("#define init_sched_attrs() do { } while (0)\n\n"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
232 printf ("/* Internal insn code number used by automata. */\n"); |
111 | 233 printf ("extern int internal_dfa_insn_code (rtx_insn *);\n\n"); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
234 printf ("/* Insn latency time defined in define_insn_reservation. */\n"); |
111 | 235 printf ("extern int insn_default_latency (rtx_insn *);\n\n"); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
236 } |
0 | 237 printf ("/* Return nonzero if there is a bypass for given insn\n"); |
238 printf (" which is a data producer. */\n"); | |
111 | 239 printf ("extern int bypass_p (rtx_insn *);\n\n"); |
0 | 240 printf ("/* Insn latency time on data consumed by the 2nd insn.\n"); |
241 printf (" Use the function if bypass_p returns nonzero for\n"); | |
242 printf (" the 1st insn. */\n"); | |
111 | 243 printf ("extern int insn_latency (rtx_insn *, rtx_insn *);\n\n"); |
0 | 244 printf ("/* Maximal insn latency time possible of all bypasses for this insn.\n"); |
245 printf (" Use the function if bypass_p returns nonzero for\n"); | |
246 printf (" the 1st insn. */\n"); | |
111 | 247 printf ("extern int maximal_insn_latency (rtx_insn *);\n\n"); |
0 | 248 printf ("\n#if AUTOMATON_ALTS\n"); |
249 printf ("/* The following function returns number of alternative\n"); | |
250 printf (" reservations of given insn. It may be used for better\n"); | |
251 printf (" insns scheduling heuristics. */\n"); | |
252 printf ("extern int insn_alts (rtx);\n\n"); | |
253 printf ("#endif\n\n"); | |
254 printf ("/* Maximal possible number of insns waiting results being\n"); | |
255 printf (" produced by insns whose execution is not finished. */\n"); | |
256 printf ("extern const int max_insn_queue_index;\n\n"); | |
257 printf ("/* Pointer to data describing current state of DFA. */\n"); | |
258 printf ("typedef void *state_t;\n\n"); | |
259 printf ("/* Size of the data in bytes. */\n"); | |
260 printf ("extern int state_size (void);\n\n"); | |
261 printf ("/* Initiate given DFA state, i.e. Set up the state\n"); | |
262 printf (" as all functional units were not reserved. */\n"); | |
263 printf ("extern void state_reset (state_t);\n"); | |
264 printf ("/* The following function returns negative value if given\n"); | |
265 printf (" insn can be issued in processor state described by given\n"); | |
266 printf (" DFA state. In this case, the DFA state is changed to\n"); | |
267 printf (" reflect the current and future reservations by given\n"); | |
268 printf (" insn. Otherwise the function returns minimal time\n"); | |
269 printf (" delay to issue the insn. This delay may be zero\n"); | |
270 printf (" for superscalar or VLIW processors. If the second\n"); | |
271 printf (" parameter is NULL the function changes given DFA state\n"); | |
272 printf (" as new processor cycle started. */\n"); | |
273 printf ("extern int state_transition (state_t, rtx);\n"); | |
274 printf ("\n#if AUTOMATON_STATE_ALTS\n"); | |
275 printf ("/* The following function returns number of possible\n"); | |
276 printf (" alternative reservations of given insn in given\n"); | |
277 printf (" DFA state. It may be used for better insns scheduling\n"); | |
278 printf (" heuristics. By default the function is defined if\n"); | |
279 printf (" macro AUTOMATON_STATE_ALTS is defined because its\n"); | |
280 printf (" implementation may require much memory. */\n"); | |
281 printf ("extern int state_alts (state_t, rtx);\n"); | |
282 printf ("#endif\n\n"); | |
111 | 283 printf ("extern int min_issue_delay (state_t, rtx_insn *);\n"); |
0 | 284 printf ("/* The following function returns nonzero if no one insn\n"); |
285 printf (" can be issued in current DFA state. */\n"); | |
286 printf ("extern int state_dead_lock_p (state_t);\n"); | |
287 printf ("/* The function returns minimal delay of issue of the 2nd\n"); | |
288 printf (" insn after issuing the 1st insn in given DFA state.\n"); | |
289 printf (" The 1st insn should be issued in given state (i.e.\n"); | |
290 printf (" state_transition should return negative value for\n"); | |
291 printf (" the insn and the state). Data dependencies between\n"); | |
292 printf (" the insns are ignored by the function. */\n"); | |
111 | 293 printf ("extern int " |
294 "min_insn_conflict_delay (state_t, rtx_insn *, rtx_insn *);\n"); | |
0 | 295 printf ("/* The following function outputs reservations for given\n"); |
296 printf (" insn as they are described in the corresponding\n"); | |
297 printf (" define_insn_reservation. */\n"); | |
111 | 298 printf ("extern void print_reservation (FILE *, rtx_insn *);\n"); |
0 | 299 printf ("\n#if CPU_UNITS_QUERY\n"); |
300 printf ("/* The following function returns code of functional unit\n"); | |
301 printf (" with given name (see define_cpu_unit). */\n"); | |
302 printf ("extern int get_cpu_unit_code (const char *);\n"); | |
303 printf ("/* The following function returns nonzero if functional\n"); | |
304 printf (" unit with given code is currently reserved in given\n"); | |
305 printf (" DFA state. */\n"); | |
306 printf ("extern int cpu_unit_reservation_p (state_t, int);\n"); | |
307 printf ("#endif\n\n"); | |
308 printf ("/* The following function returns true if insn\n"); | |
309 printf (" has a dfa reservation. */\n"); | |
111 | 310 printf ("extern bool insn_has_dfa_reservation_p (rtx_insn *);\n\n"); |
0 | 311 printf ("/* Clean insn code cache. It should be called if there\n"); |
312 printf (" is a chance that condition value in a\n"); | |
313 printf (" define_insn_reservation will be changed after\n"); | |
314 printf (" last call of dfa_start. */\n"); | |
315 printf ("extern void dfa_clean_insn_cache (void);\n\n"); | |
111 | 316 printf ("extern void dfa_clear_single_insn_cache (rtx_insn *);\n\n"); |
0 | 317 printf ("/* Initiate and finish work with DFA. They should be\n"); |
318 printf (" called as the first and the last interface\n"); | |
319 printf (" functions. */\n"); | |
320 printf ("extern void dfa_start (void);\n"); | |
321 printf ("extern void dfa_finish (void);\n"); | |
322 } | |
323 else | |
324 { | |
325 /* Otherwise we do no scheduling, but we need these typedefs | |
326 in order to avoid uglifying other code with more ifdefs. */ | |
327 printf ("typedef void *state_t;\n\n"); | |
328 } | |
329 | |
111 | 330 /* Special-purpose attributes should be tested with if, not #ifdef. */ |
331 const char * const special_attrs[] = { "length", "enabled", | |
332 "preferred_for_size", | |
333 "preferred_for_speed", 0 }; | |
334 for (const char * const *p = special_attrs; *p; p++) | |
335 { | |
336 printf ("#ifndef HAVE_ATTR_%s\n" | |
337 "#define HAVE_ATTR_%s 0\n" | |
338 "#endif\n", *p, *p); | |
339 } | |
340 /* We make an exception here to provide stub definitions for | |
341 insn_*_length* / get_attr_enabled functions. */ | |
342 puts ("#if !HAVE_ATTR_length\n" | |
343 "extern int hook_int_rtx_insn_unreachable (rtx_insn *);\n" | |
344 "#define insn_default_length hook_int_rtx_insn_unreachable\n" | |
345 "#define insn_min_length hook_int_rtx_insn_unreachable\n" | |
346 "#define insn_variable_length_p hook_int_rtx_insn_unreachable\n" | |
347 "#define insn_current_length hook_int_rtx_insn_unreachable\n" | |
348 "#include \"insn-addr.h\"\n" | |
349 "#endif\n" | |
350 "extern int hook_int_rtx_1 (rtx);\n" | |
351 "#if !HAVE_ATTR_enabled\n" | |
352 "#define get_attr_enabled hook_int_rtx_1\n" | |
353 "#endif\n" | |
354 "#if !HAVE_ATTR_preferred_for_size\n" | |
355 "#define get_attr_preferred_for_size hook_int_rtx_1\n" | |
356 "#endif\n" | |
357 "#if !HAVE_ATTR_preferred_for_speed\n" | |
358 "#define get_attr_preferred_for_speed hook_int_rtx_1\n" | |
359 "#endif\n"); | |
360 | |
0 | 361 /* Output flag masks for use by reorg. |
362 | |
111 | 363 Flags are used to hold branch direction for use by eligible_for_... */ |
364 printf ("\n#define ATTR_FLAG_forward\t0x1\n"); | |
365 printf ("#define ATTR_FLAG_backward\t0x2\n"); | |
0 | 366 |
111 | 367 puts ("\n#endif /* GCC_INSN_ATTR_H */"); |
0 | 368 |
369 if (ferror (stdout) || fflush (stdout) || fclose (stdout)) | |
370 return FATAL_EXIT_CODE; | |
371 | |
372 return SUCCESS_EXIT_CODE; | |
373 } |