comparison gcc/config/i386/i386-builtin-types.awk @ 55:77e2b8dfacca gcc-4.4.5

update it from 4.4.3 to 4.5.0
author ryoma <e075725@ie.u-ryukyu.ac.jp>
date Fri, 12 Feb 2010 23:39:51 +0900
parents
children 04ced10e8804
comparison
equal deleted inserted replaced
52:c156f1bd5cd9 55:77e2b8dfacca
1 # Copyright (C) 2009 Free Software Foundation, Inc.
2 #
3 # This program is free software; you can redistribute it and/or modify it
4 # under the terms of the GNU General Public License as published by the
5 # Free Software Foundation; either version 3, or (at your option) any
6 # later version.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program; see the file COPYING3. If not see
15 # <http://www.gnu.org/licenses/>.
16
17 # Generates compressed tables for types for i386 builtin functions.
18
19 function do_error(string) {
20 print FILENAME ":" FNR ": " string > "/dev/stderr"
21 errors = 1
22 }
23
24 function check_type(string) {
25 if (!(string in type_hash))
26 do_error("undefined type code " string)
27 }
28
29 # We can significantly reduce the size of the read-only tables
30 # by forcing the compiler to use a smaller implementation type
31 # for the enumerations.
32 function attribute_mode(count) {
33 # ??? Except that we get strange "comparison always false" warnings
34 # for comparisons between different elements of the enumeration.
35 # print "#ifdef __GNUC__"
36 # if (count < 256)
37 # print " __attribute__((__mode__(__QI__)))"
38 # else
39 # print " __attribute__((__mode__(__HI__)))"
40 # print "#endif"
41 }
42
43 BEGIN {
44 FS = "[() \t,]+"
45
46 prim_defs = 0
47 vect_defs = 0
48 ptr_defs = 0
49 cptr_defs = 0
50 func_defs = 0
51 func_args = 0
52 alias_defs = 0
53 }
54
55 # Skip blank lines or comments.
56 /^[ \t]*(#|$)/ {
57 next
58 }
59
60 $1 == "DEF_PRIMITIVE_TYPE" {
61 if (NF == 4) {
62 type_hash[$2] = 1
63 prim_name[prim_defs] = $2
64 prim_base[prim_defs] = $3
65 prim_defs++
66 } else
67 do_error("DEF_PRIMITIVE_TYPE expected 2 arguments")
68 next
69 }
70
71 $1 == "DEF_VECTOR_TYPE" {
72 if (NF == 4 || NF == 5) {
73 check_type($3)
74 type_hash[$2] = 1
75 vect_name[vect_defs] = $2
76 vect_base[vect_defs] = $3
77 vect_mode[vect_defs] = (NF == 5 ? $4 : $2)
78 vect_defs++
79 } else
80 do_error("DEF_VECTOR_TYPE expected 2 arguments")
81 next
82 }
83
84 $1 == "DEF_POINTER_TYPE" {
85 if (NF == 4) {
86 check_type($3)
87 type_hash[$2] = 1
88 ptr_name[ptr_defs] = $2
89 ptr_base[ptr_defs] = $3
90 ptr_defs++
91 } else if (NF == 5) {
92 check_type($3)
93 if ($4 == "CONST") {
94 type_hash[$2] = 1
95 cptr_name[cptr_defs] = $2
96 cptr_base[cptr_defs] = $3
97 cptr_defs++
98 } else
99 do_error("invalid qualifier \"" $4 "\"")
100 }
101 else
102 do_error("DEF_POINTER_TYPE expected 2 or 3 arguments")
103 next
104 }
105
106 $1 == "DEF_FUNCTION_TYPE" {
107 func_start[func_defs] = func_args
108 for (i = 2; i < NF; ++i) {
109 check_type($i)
110 func_types[func_args++] = $i
111 }
112
113 if (NF < 3)
114 do_error("DEF_FUNCTION_TYPE expected at least 1 argument")
115 else if (NF == 3)
116 name = $2 "_FTYPE_VOID"
117 else {
118 name = $2 "_FTYPE"
119 for (i = 3; i < NF; ++i)
120 name = name "_" $i
121 }
122 func_hash[name] = 1
123 func_name[func_defs++] = name
124 next
125 }
126
127 $1 == "DEF_FUNCTION_TYPE_ALIAS" {
128 if (NF == 4) {
129 if ($2 in func_hash) {
130 alias_base[alias_defs] = $2
131 alias_name[alias_defs] = $2 "_" $3
132 alias_defs++
133 } else
134 do_error("undefined function code " $2)
135 } else
136 do_error("DEF_FUNCTION_TYPE_ALIAS expected 2 arguments")
137 next
138 }
139
140 {
141 do_error("unknown directive \"" $1 "\"");
142 }
143
144 END {
145 if (errors)
146 exit 1
147
148 print "/* This file is auto-generated by i386-builtin-types.awk. */\n"
149
150 # This first enumeration contains all of the non-function types.
151 print "enum ix86_builtin_type {"
152 for (i = 0; i < prim_defs; ++i)
153 print " IX86_BT_" prim_name[i] ","
154 print " IX86_BT_LAST_PRIM = IX86_BT_" prim_name[i-1] ","
155 for (i = 0; i < vect_defs; ++i)
156 print " IX86_BT_" vect_name[i] ","
157 print " IX86_BT_LAST_VECT = IX86_BT_" vect_name[i-1] ","
158 for (i = 0; i < ptr_defs; ++i)
159 print " IX86_BT_" ptr_name[i] ","
160 print " IX86_BT_LAST_PTR = IX86_BT_" ptr_name[i-1] ","
161 for (i = 0; i < cptr_defs; ++i)
162 print " IX86_BT_" cptr_name[i] ","
163 print " IX86_BT_LAST_CPTR = IX86_BT_" cptr_name[i-1] "\n}"
164 attribute_mode(prim_defs + vect_defs + ptr_defs + cptr_defs)
165 print ";\n\n"
166
167 # We can't tabularize the initialization of the primitives, since
168 # at least one of them is created via a local variable. That's ok,
169 # just create a nice big macro to do all the work.
170 print "#define DEFINE_BUILTIN_PRIMITIVE_TYPES \\"
171 for (i = 0; i < prim_defs; ++i) {
172 printf " ix86_builtin_type_tab[(int)IX86_BT_" prim_name[i] \
173 "] = " prim_base[i]
174 if (i < prim_defs - 1)
175 print ", \\"
176 }
177 print "\n\n"
178
179 # The vector types are defined via two tables defining the real
180 # machine mode and the builtin primitive type. We use two tables
181 # rather than a structure to avoid structure padding and save space.
182 print "static const enum machine_mode ix86_builtin_type_vect_mode[] = {"
183 for (i = 0; i < vect_defs; ++i) {
184 if (i == 0)
185 printf " "
186 else if (i % 6 == 0)
187 printf ",\n "
188 else
189 printf ", "
190 printf vect_mode[i] "mode"
191 }
192 print "\n};\n\n"
193
194 print "static const enum ix86_builtin_type " \
195 "ix86_builtin_type_vect_base[] = {"
196 for (i = 0; i < vect_defs; ++i) {
197 if (i == 0)
198 printf " "
199 else if (i % 4 == 0)
200 printf ",\n "
201 else
202 printf ", "
203 printf "IX86_BT_" vect_base[i]
204 }
205 print "\n};\n\n"
206
207 # The pointer types are defined via a single table defining the
208 # builtin primitive type. The const-ness of the pointer is taken
209 # from the enumeration value > IX86_BT_LAST_PTR.
210 print "static const enum ix86_builtin_type " \
211 "ix86_builtin_type_ptr_base[] = {"
212 for (i = 0; i < ptr_defs; ++i) {
213 if (i == 0)
214 printf " "
215 else if (i % 4 == 0)
216 printf "\n "
217 printf " IX86_BT_" ptr_base[i] ","
218 }
219 print "\n /* pointer-to-constant defs start here */"
220 for (i = 0; i < cptr_defs; ++i) {
221 if (i == 0)
222 printf " "
223 else if (i % 4 == 0)
224 printf ",\n "
225 else
226 printf ", "
227 printf "IX86_BT_" cptr_base[i]
228 }
229 print "\n};\n\n"
230
231 # This second enumeration contains all of the function types.
232 print "enum ix86_builtin_func_type {"
233 for (i = 0; i < func_defs; ++i)
234 print " " func_name[i] ","
235 print " IX86_BT_LAST_FUNC = " func_name[i-1] ","
236 for (i = 0; i < alias_defs; ++i)
237 print " " alias_name[i] ","
238 print " IX86_BT_LAST_ALIAS = " alias_name[i-1] "\n}"
239 attribute_mode(func_defs + alias_defs)
240 print ";\n\n"
241
242 # The function types are defined via two tables. The first contains
243 # ranges consiting of the function's return type, followed by all of
244 # the function argument types. The ranges for all of the builtin
245 # functions are smooshed together in the same array. The second array
246 # contains, for each builtin, the index of the function's return type
247 # within the first array.
248 print "static const enum ix86_builtin_type ix86_builtin_func_args[] = {"
249 for (i = 0; i < func_args; ++i) {
250 if (i == 0)
251 printf " "
252 else if (i % 4 == 0)
253 printf ",\n "
254 else
255 printf ", "
256 printf "IX86_BT_" func_types[i]
257 }
258 print "\n};\n\n"
259
260 print "static const unsigned short ix86_builtin_func_start[] = {"
261 for (i = 0; i < func_defs; ++i) {
262 if (i == 0)
263 printf " "
264 else if (i % 10 == 0)
265 printf "\n "
266 printf " " func_start[i] ","
267 }
268 print " " func_args "\n};\n\n"
269
270 print "static const enum ix86_builtin_func_type " \
271 "ix86_builtin_func_alias_base[] = {"
272 for (i = 0; i < alias_defs; ++i) {
273 if (i == 0)
274 printf " "
275 else
276 printf ",\n "
277 printf alias_base[i]
278 }
279 print "\n};"
280 }