]> gcc.gnu.org Git - gcc.git/blame - gcc/genopinit.c
re PR c++/27359 (ICE with missing initialization of iteration variable in parallel...
[gcc.git] / gcc / genopinit.c
CommitLineData
af9e4a0c 1/* Generate code to initialize optabs from machine description.
b5e01d4b 2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
20f06221 3 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
af9e4a0c 4
1322177d 5This file is part of GCC.
af9e4a0c 6
1322177d
LB
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
af9e4a0c 11
1322177d
LB
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
af9e4a0c
RK
16
17You should have received a copy of the GNU General Public License
1322177d 18along with GCC; see the file COPYING. If not, write to the Free
366ccddb
KC
19Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2002110-1301, USA. */
af9e4a0c
RK
21
22
4977bab6 23#include "bconfig.h"
0b93b64e 24#include "system.h"
4977bab6
ZW
25#include "coretypes.h"
26#include "tm.h"
af9e4a0c 27#include "rtl.h"
f8b6598e 28#include "errors.h"
c88c0d42 29#include "gensupport.h"
ccd043a9 30
af9e4a0c 31
af9e4a0c
RK
32/* Many parts of GCC use arrays that are indexed by machine mode and
33 contain the insn codes for pattern in the MD file that perform a given
34 operation on operands of that mode.
35
36 These patterns are present in the MD file with names that contain
37 the mode(s) used and the name of the operation. This program
38 writes a function `init_all_optabs' that initializes the optabs with
39 all the insn codes of the relevant patterns present in the MD file.
40
41 This array contains a list of optabs that need to be initialized. Within
42 each string, the name of the pattern to be matched against is delimited
1b3459d2 43 with $( and $). In the string, $a and $b are used to match a short mode
af9e4a0c
RK
44 name (the part of the mode name not including `mode' and converted to
45 lower-case). When writing out the initializer, the entire string is
1b3459d2 46 used. $A and $B are replaced with the full name of the mode; $a and $b
af9e4a0c
RK
47 are replaced with the short form of the name, as above.
48
1b3459d2
ZW
49 If $N is present in the pattern, it means the two modes must be consecutive
50 widths in the same mode class (e.g, QImode and HImode). $I means that
91ce572a
CC
51 only full integer modes should be considered for the next mode, and $F
52 means that only float modes should be considered.
53 $P means that both full and partial integer modes should be considered.
54
55 $V means to emit 'v' if the first mode is a MODE_FLOAT mode.
af9e4a0c
RK
56
57 For some optabs, we store the operation by RTL codes. These are only
1b3459d2 58 used for comparisons. In that case, $c and $C are the lower-case and
af9e4a0c
RK
59 upper-case forms of the comparison, respectively. */
60
83182544 61static const char * const optabs[] =
85363ca0
ZW
62{ "sext_optab->handlers[$B][$A].insn_code = CODE_FOR_$(extend$a$b2$)",
63 "zext_optab->handlers[$B][$A].insn_code = CODE_FOR_$(zero_extend$a$b2$)",
64 "sfix_optab->handlers[$B][$A].insn_code = CODE_FOR_$(fix$F$a$I$b2$)",
65 "ufix_optab->handlers[$B][$A].insn_code = CODE_FOR_$(fixuns$F$a$b2$)",
66 "sfixtrunc_optab->handlers[$B][$A].insn_code = CODE_FOR_$(fix_trunc$F$a$I$b2$)",
67 "ufixtrunc_optab->handlers[$B][$A].insn_code = CODE_FOR_$(fixuns_trunc$F$a$I$b2$)",
68 "sfloat_optab->handlers[$B][$A].insn_code = CODE_FOR_$(float$I$a$F$b2$)",
69 "ufloat_optab->handlers[$B][$A].insn_code = CODE_FOR_$(floatuns$I$a$F$b2$)",
70 "trunc_optab->handlers[$B][$A].insn_code = CODE_FOR_$(trunc$a$b2$)",
91ce572a 71 "add_optab->handlers[$A].insn_code = CODE_FOR_$(add$P$a3$)",
85363ca0
ZW
72 "addv_optab->handlers[$A].insn_code =\n\
73 add_optab->handlers[$A].insn_code = CODE_FOR_$(add$F$a3$)",
74 "addv_optab->handlers[$A].insn_code = CODE_FOR_$(addv$I$a3$)",
91ce572a 75 "sub_optab->handlers[$A].insn_code = CODE_FOR_$(sub$P$a3$)",
85363ca0
ZW
76 "subv_optab->handlers[$A].insn_code =\n\
77 sub_optab->handlers[$A].insn_code = CODE_FOR_$(sub$F$a3$)",
78 "subv_optab->handlers[$A].insn_code = CODE_FOR_$(subv$I$a3$)",
91ce572a 79 "smul_optab->handlers[$A].insn_code = CODE_FOR_$(mul$P$a3$)",
85363ca0
ZW
80 "smulv_optab->handlers[$A].insn_code =\n\
81 smul_optab->handlers[$A].insn_code = CODE_FOR_$(mul$F$a3$)",
82 "smulv_optab->handlers[$A].insn_code = CODE_FOR_$(mulv$I$a3$)",
1b3459d2
ZW
83 "umul_highpart_optab->handlers[$A].insn_code = CODE_FOR_$(umul$a3_highpart$)",
84 "smul_highpart_optab->handlers[$A].insn_code = CODE_FOR_$(smul$a3_highpart$)",
85 "smul_widen_optab->handlers[$B].insn_code = CODE_FOR_$(mul$a$b3$)$N",
86 "umul_widen_optab->handlers[$B].insn_code = CODE_FOR_$(umul$a$b3$)$N",
8b44057d 87 "usmul_widen_optab->handlers[$B].insn_code = CODE_FOR_$(usmul$a$b3$)$N",
ef89d648 88 "sdiv_optab->handlers[$A].insn_code = CODE_FOR_$(div$a3$)",
85363ca0 89 "sdivv_optab->handlers[$A].insn_code = CODE_FOR_$(div$V$I$a3$)",
1b3459d2
ZW
90 "udiv_optab->handlers[$A].insn_code = CODE_FOR_$(udiv$I$a3$)",
91 "sdivmod_optab->handlers[$A].insn_code = CODE_FOR_$(divmod$a4$)",
92 "udivmod_optab->handlers[$A].insn_code = CODE_FOR_$(udivmod$a4$)",
93 "smod_optab->handlers[$A].insn_code = CODE_FOR_$(mod$a3$)",
94 "umod_optab->handlers[$A].insn_code = CODE_FOR_$(umod$a3$)",
5ae27cfa
UB
95 "fmod_optab->handlers[$A].insn_code = CODE_FOR_$(fmod$a3$)",
96 "drem_optab->handlers[$A].insn_code = CODE_FOR_$(drem$a3$)",
1b3459d2
ZW
97 "ftrunc_optab->handlers[$A].insn_code = CODE_FOR_$(ftrunc$F$a2$)",
98 "and_optab->handlers[$A].insn_code = CODE_FOR_$(and$a3$)",
99 "ior_optab->handlers[$A].insn_code = CODE_FOR_$(ior$a3$)",
100 "xor_optab->handlers[$A].insn_code = CODE_FOR_$(xor$a3$)",
101 "ashl_optab->handlers[$A].insn_code = CODE_FOR_$(ashl$a3$)",
102 "ashr_optab->handlers[$A].insn_code = CODE_FOR_$(ashr$a3$)",
103 "lshr_optab->handlers[$A].insn_code = CODE_FOR_$(lshr$a3$)",
104 "rotl_optab->handlers[$A].insn_code = CODE_FOR_$(rotl$a3$)",
105 "rotr_optab->handlers[$A].insn_code = CODE_FOR_$(rotr$a3$)",
7ae4d8d4
RH
106 "smin_optab->handlers[$A].insn_code = CODE_FOR_$(smin$a3$)",
107 "smax_optab->handlers[$A].insn_code = CODE_FOR_$(smax$a3$)",
1b3459d2
ZW
108 "umin_optab->handlers[$A].insn_code = CODE_FOR_$(umin$I$a3$)",
109 "umax_optab->handlers[$A].insn_code = CODE_FOR_$(umax$I$a3$)",
b5e01d4b
RS
110 "pow_optab->handlers[$A].insn_code = CODE_FOR_$(pow$a3$)",
111 "atan2_optab->handlers[$A].insn_code = CODE_FOR_$(atan2$a3$)",
91ce572a 112 "neg_optab->handlers[$A].insn_code = CODE_FOR_$(neg$P$a2$)",
85363ca0
ZW
113 "negv_optab->handlers[$A].insn_code =\n\
114 neg_optab->handlers[$A].insn_code = CODE_FOR_$(neg$F$a2$)",
115 "negv_optab->handlers[$A].insn_code = CODE_FOR_$(negv$I$a2$)",
91ce572a 116 "abs_optab->handlers[$A].insn_code = CODE_FOR_$(abs$P$a2$)",
85363ca0
ZW
117 "absv_optab->handlers[$A].insn_code =\n\
118 abs_optab->handlers[$A].insn_code = CODE_FOR_$(abs$F$a2$)",
119 "absv_optab->handlers[$A].insn_code = CODE_FOR_$(absv$I$a2$)",
046625fa 120 "copysign_optab->handlers[$A].insn_code = CODE_FOR_$(copysign$F$a3$)",
1b3459d2 121 "sqrt_optab->handlers[$A].insn_code = CODE_FOR_$(sqrt$a2$)",
4977bab6 122 "floor_optab->handlers[$A].insn_code = CODE_FOR_$(floor$a2$)",
d8b42d06 123 "lfloor_optab->handlers[$A].insn_code = CODE_FOR_$(lfloor$a2$)",
4977bab6 124 "ceil_optab->handlers[$A].insn_code = CODE_FOR_$(ceil$a2$)",
f94b1661 125 "lceil_optab->handlers[$A].insn_code = CODE_FOR_$(lceil$a2$)",
4977bab6 126 "round_optab->handlers[$A].insn_code = CODE_FOR_$(round$a2$)",
edeacc14 127 "btrunc_optab->handlers[$A].insn_code = CODE_FOR_$(btrunc$a2$)",
4977bab6 128 "nearbyint_optab->handlers[$A].insn_code = CODE_FOR_$(nearbyint$a2$)",
edeacc14 129 "rint_optab->handlers[$A].insn_code = CODE_FOR_$(rint$a2$)",
21e01bf1 130 "lrint_optab->handlers[$A].insn_code = CODE_FOR_$(lrint$a2$)",
6c7cf1f0 131 "sincos_optab->handlers[$A].insn_code = CODE_FOR_$(sincos$a3$)",
1b3459d2 132 "sin_optab->handlers[$A].insn_code = CODE_FOR_$(sin$a2$)",
c56122d8 133 "asin_optab->handlers[$A].insn_code = CODE_FOR_$(asin$a2$)",
1b3459d2 134 "cos_optab->handlers[$A].insn_code = CODE_FOR_$(cos$a2$)",
c56122d8 135 "acos_optab->handlers[$A].insn_code = CODE_FOR_$(acos$a2$)",
e7b489c8 136 "exp_optab->handlers[$A].insn_code = CODE_FOR_$(exp$a2$)",
a251102e
UB
137 "exp10_optab->handlers[$A].insn_code = CODE_FOR_$(exp10$a2$)",
138 "exp2_optab->handlers[$A].insn_code = CODE_FOR_$(exp2$a2$)",
7a8e07c7 139 "expm1_optab->handlers[$A].insn_code = CODE_FOR_$(expm1$a2$)",
c94a75af 140 "ldexp_optab->handlers[$A].insn_code = CODE_FOR_$(ldexp$a3$)",
88b28a31
UB
141 "logb_optab->handlers[$A].insn_code = CODE_FOR_$(logb$a2$)",
142 "ilogb_optab->handlers[$A].insn_code = CODE_FOR_$(ilogb$a2$)",
e7b489c8 143 "log_optab->handlers[$A].insn_code = CODE_FOR_$(log$a2$)",
3b8e0c91
UB
144 "log10_optab->handlers[$A].insn_code = CODE_FOR_$(log10$a2$)",
145 "log2_optab->handlers[$A].insn_code = CODE_FOR_$(log2$a2$)",
c2fcfa4f 146 "log1p_optab->handlers[$A].insn_code = CODE_FOR_$(log1p$a2$)",
82d397c7
RS
147 "tan_optab->handlers[$A].insn_code = CODE_FOR_$(tan$a2$)",
148 "atan_optab->handlers[$A].insn_code = CODE_FOR_$(atan$a2$)",
1b3459d2
ZW
149 "strlen_optab->handlers[$A].insn_code = CODE_FOR_$(strlen$a$)",
150 "one_cmpl_optab->handlers[$A].insn_code = CODE_FOR_$(one_cmpl$a2$)",
151 "ffs_optab->handlers[$A].insn_code = CODE_FOR_$(ffs$a2$)",
2928cd7a
RH
152 "clz_optab->handlers[$A].insn_code = CODE_FOR_$(clz$a2$)",
153 "ctz_optab->handlers[$A].insn_code = CODE_FOR_$(ctz$a2$)",
154 "popcount_optab->handlers[$A].insn_code = CODE_FOR_$(popcount$a2$)",
155 "parity_optab->handlers[$A].insn_code = CODE_FOR_$(parity$a2$)",
1b3459d2
ZW
156 "mov_optab->handlers[$A].insn_code = CODE_FOR_$(mov$a$)",
157 "movstrict_optab->handlers[$A].insn_code = CODE_FOR_$(movstrict$a$)",
1e0598e2 158 "movmisalign_optab->handlers[$A].insn_code = CODE_FOR_$(movmisalign$a$)",
1b3459d2
ZW
159 "cmp_optab->handlers[$A].insn_code = CODE_FOR_$(cmp$a$)",
160 "tst_optab->handlers[$A].insn_code = CODE_FOR_$(tst$a$)",
068f5dea 161 "addcc_optab->handlers[$A].insn_code = CODE_FOR_$(add$acc$)",
1b3459d2
ZW
162 "bcc_gen_fctn[$C] = gen_$(b$c$)",
163 "setcc_gen_code[$C] = CODE_FOR_$(s$c$)",
164 "movcc_gen_code[$A] = CODE_FOR_$(mov$acc$)",
165 "cbranch_optab->handlers[$A].insn_code = CODE_FOR_$(cbranch$a4$)",
166 "cmov_optab->handlers[$A].insn_code = CODE_FOR_$(cmov$a6$)",
167 "cstore_optab->handlers[$A].insn_code = CODE_FOR_$(cstore$a4$)",
371b8fc0 168 "push_optab->handlers[$A].insn_code = CODE_FOR_$(push$a1$)",
1b3459d2
ZW
169 "reload_in_optab[$A] = CODE_FOR_$(reload_in$a$)",
170 "reload_out_optab[$A] = CODE_FOR_$(reload_out$a$)",
70128ad9 171 "movmem_optab[$A] = CODE_FOR_$(movmem$a$)",
118355a0 172 "cmpstr_optab[$A] = CODE_FOR_$(cmpstr$a$)",
40c1d5f8 173 "cmpstrn_optab[$A] = CODE_FOR_$(cmpstrn$a$)",
997404de 174 "cmpmem_optab[$A] = CODE_FOR_$(cmpmem$a$)",
57e84f18 175 "setmem_optab[$A] = CODE_FOR_$(setmem$a$)",
48ae6c13
RH
176 "sync_add_optab[$A] = CODE_FOR_$(sync_add$I$a$)",
177 "sync_sub_optab[$A] = CODE_FOR_$(sync_sub$I$a$)",
178 "sync_ior_optab[$A] = CODE_FOR_$(sync_ior$I$a$)",
179 "sync_and_optab[$A] = CODE_FOR_$(sync_and$I$a$)",
180 "sync_xor_optab[$A] = CODE_FOR_$(sync_xor$I$a$)",
181 "sync_nand_optab[$A] = CODE_FOR_$(sync_nand$I$a$)",
182 "sync_old_add_optab[$A] = CODE_FOR_$(sync_old_add$I$a$)",
183 "sync_old_sub_optab[$A] = CODE_FOR_$(sync_old_sub$I$a$)",
184 "sync_old_ior_optab[$A] = CODE_FOR_$(sync_old_ior$I$a$)",
185 "sync_old_and_optab[$A] = CODE_FOR_$(sync_old_and$I$a$)",
186 "sync_old_xor_optab[$A] = CODE_FOR_$(sync_old_xor$I$a$)",
187 "sync_old_nand_optab[$A] = CODE_FOR_$(sync_old_nand$I$a$)",
188 "sync_new_add_optab[$A] = CODE_FOR_$(sync_new_add$I$a$)",
189 "sync_new_sub_optab[$A] = CODE_FOR_$(sync_new_sub$I$a$)",
190 "sync_new_ior_optab[$A] = CODE_FOR_$(sync_new_ior$I$a$)",
191 "sync_new_and_optab[$A] = CODE_FOR_$(sync_new_and$I$a$)",
192 "sync_new_xor_optab[$A] = CODE_FOR_$(sync_new_xor$I$a$)",
193 "sync_new_nand_optab[$A] = CODE_FOR_$(sync_new_nand$I$a$)",
194 "sync_compare_and_swap[$A] = CODE_FOR_$(sync_compare_and_swap$I$a$)",
195 "sync_compare_and_swap_cc[$A] = CODE_FOR_$(sync_compare_and_swap_cc$I$a$)",
196 "sync_lock_test_and_set[$A] = CODE_FOR_$(sync_lock_test_and_set$I$a$)",
197 "sync_lock_release[$A] = CODE_FOR_$(sync_lock_release$I$a$)",
997404de
JH
198 "vec_set_optab->handlers[$A].insn_code = CODE_FOR_$(vec_set$a$)",
199 "vec_extract_optab->handlers[$A].insn_code = CODE_FOR_$(vec_extract$a$)",
7ccf35ed 200 "vec_init_optab->handlers[$A].insn_code = CODE_FOR_$(vec_init$a$)",
a6b46ba2
DN
201 "vec_shl_optab->handlers[$A].insn_code = CODE_FOR_$(vec_shl_$a$)",
202 "vec_shr_optab->handlers[$A].insn_code = CODE_FOR_$(vec_shr_$a$)",
7ce67fbe
DP
203 "vec_realign_load_optab->handlers[$A].insn_code = CODE_FOR_$(vec_realign_load_$a$)",
204 "vcond_gen_code[$A] = CODE_FOR_$(vcond$a$)",
61d3cdbb 205 "vcondu_gen_code[$A] = CODE_FOR_$(vcondu$a$)",
20f06221
DN
206 "ssum_widen_optab->handlers[$A].insn_code = CODE_FOR_$(widen_ssum$I$a3$)",
207 "usum_widen_optab->handlers[$A].insn_code = CODE_FOR_$(widen_usum$I$a3$)",
208 "udot_prod_optab->handlers[$A].insn_code = CODE_FOR_$(udot_prod$I$a$)",
209 "sdot_prod_optab->handlers[$A].insn_code = CODE_FOR_$(sdot_prod$I$a$)",
61d3cdbb
DN
210 "reduc_smax_optab->handlers[$A].insn_code = CODE_FOR_$(reduc_smax_$a$)",
211 "reduc_umax_optab->handlers[$A].insn_code = CODE_FOR_$(reduc_umax_$a$)",
212 "reduc_smin_optab->handlers[$A].insn_code = CODE_FOR_$(reduc_smin_$a$)",
213 "reduc_umin_optab->handlers[$A].insn_code = CODE_FOR_$(reduc_umin_$a$)",
a6b46ba2
DN
214 "reduc_splus_optab->handlers[$A].insn_code = CODE_FOR_$(reduc_splus_$a$)" ,
215 "reduc_uplus_optab->handlers[$A].insn_code = CODE_FOR_$(reduc_uplus_$a$)"
48ae6c13 216};
af9e4a0c 217
3d7aafde 218static void gen_insn (rtx);
56c0e996 219
af9e4a0c 220static void
3d7aafde 221gen_insn (rtx insn)
af9e4a0c 222{
3cce094d 223 const char *name = XSTR (insn, 0);
a544cfd2 224 int m1 = 0, m2 = 0, op = 0;
5ae9a7e9 225 size_t pindex;
af9e4a0c 226 int i;
85fda1eb 227 const char *np, *pp, *p, *q;
af9e4a0c
RK
228
229 /* Don't mention instructions whose names are the null string.
230 They are in the machine description just to be recognized. */
231 if (*name == 0)
232 return;
233
234 /* See if NAME matches one of the patterns we have for the optabs we know
235 about. */
236
b6a1cbae 237 for (pindex = 0; pindex < ARRAY_SIZE (optabs); pindex++)
af9e4a0c 238 {
91ce572a 239 int force_float = 0, force_int = 0, force_partial_int = 0;
af9e4a0c
RK
240 int force_consec = 0;
241 int matches = 1;
242
1b3459d2 243 for (pp = optabs[pindex]; pp[0] != '$' || pp[1] != '('; pp++)
af9e4a0c
RK
244 ;
245
1b3459d2 246 for (pp += 2, np = name; matches && ! (pp[0] == '$' && pp[1] == ')');
af9e4a0c
RK
247 pp++)
248 {
1b3459d2 249 if (*pp != '$')
af9e4a0c
RK
250 {
251 if (*pp != *np++)
252 break;
253 }
254 else
255 switch (*++pp)
256 {
257 case 'N':
258 force_consec = 1;
259 break;
260 case 'I':
261 force_int = 1;
262 break;
91ce572a
CC
263 case 'P':
264 force_partial_int = 1;
265 break;
af9e4a0c
RK
266 case 'F':
267 force_float = 1;
268 break;
91ce572a
CC
269 case 'V':
270 break;
af9e4a0c
RK
271 case 'c':
272 for (op = 0; op < NUM_RTX_CODE; op++)
273 {
5f06c983 274 for (p = GET_RTX_NAME(op), q = np; *p; p++, q++)
af9e4a0c
RK
275 if (*p != *q)
276 break;
277
278 /* We have to be concerned about matching "gt" and
279 missing "gtu", e.g., so verify we have reached the
4639555c 280 end of thing we are to match. */
ec8e098d
PB
281 if (*p == 0 && *q == 0
282 && (GET_RTX_CLASS (op) == RTX_COMPARE
283 || GET_RTX_CLASS (op) == RTX_COMM_COMPARE))
af9e4a0c
RK
284 break;
285 }
286
287 if (op == NUM_RTX_CODE)
288 matches = 0;
289 else
5f06c983 290 np += strlen (GET_RTX_NAME(op));
af9e4a0c
RK
291 break;
292 case 'a':
293 case 'b':
4639555c
ILT
294 /* This loop will stop at the first prefix match, so
295 look through the modes in reverse order, in case
94134f42 296 there are extra CC modes and CC is a prefix of the
4639555c 297 CC modes (as it should be). */
85363ca0 298 for (i = (MAX_MACHINE_MODE) - 1; i >= 0; i--)
af9e4a0c 299 {
a4ec8d12 300 for (p = GET_MODE_NAME(i), q = np; *p; p++, q++)
92a438d1 301 if (TOLOWER (*p) != *q)
af9e4a0c
RK
302 break;
303
304 if (*p == 0
7d9e680f
DB
305 && (! force_int || mode_class[i] == MODE_INT
306 || mode_class[i] == MODE_VECTOR_INT)
91ce572a
CC
307 && (! force_partial_int
308 || mode_class[i] == MODE_INT
7d9e680f
DB
309 || mode_class[i] == MODE_PARTIAL_INT
310 || mode_class[i] == MODE_VECTOR_INT)
15ed7b52
JG
311 && (! force_float
312 || mode_class[i] == MODE_FLOAT
313 || mode_class[i] == MODE_DECIMAL_FLOAT
6041dc3c 314 || mode_class[i] == MODE_COMPLEX_FLOAT
7d9e680f 315 || mode_class[i] == MODE_VECTOR_FLOAT))
af9e4a0c
RK
316 break;
317 }
318
4639555c 319 if (i < 0)
af9e4a0c
RK
320 matches = 0;
321 else if (*pp == 'a')
a4ec8d12 322 m1 = i, np += strlen (GET_MODE_NAME(i));
af9e4a0c 323 else
a4ec8d12 324 m2 = i, np += strlen (GET_MODE_NAME(i));
af9e4a0c 325
91ce572a 326 force_int = force_partial_int = force_float = 0;
af9e4a0c
RK
327 break;
328
329 default:
b2d59f6f 330 gcc_unreachable ();
af9e4a0c
RK
331 }
332 }
333
1b3459d2 334 if (matches && pp[0] == '$' && pp[1] == ')'
af9e4a0c 335 && *np == 0
88a5e9da 336 && (! force_consec || (int) GET_MODE_WIDER_MODE(m1) == m2))
af9e4a0c
RK
337 break;
338 }
339
b6a1cbae 340 if (pindex == ARRAY_SIZE (optabs))
af9e4a0c
RK
341 return;
342
343 /* We found a match. If this pattern is only conditionally present,
344 write out the "if" and two extra blanks. */
345
346 if (*XSTR (insn, 2) != 0)
347 printf (" if (HAVE_%s)\n ", name);
348
349 printf (" ");
350
351 /* Now write out the initialization, making all required substitutions. */
352 for (pp = optabs[pindex]; *pp; pp++)
353 {
1b3459d2
ZW
354 if (*pp != '$')
355 putchar (*pp);
af9e4a0c
RK
356 else
357 switch (*++pp)
358 {
359 case '(': case ')':
360 case 'I': case 'F': case 'N':
361 break;
91ce572a 362 case 'V':
3d8bf70f 363 if (SCALAR_FLOAT_MODE_P (m1))
91ce572a
CC
364 printf ("v");
365 break;
af9e4a0c 366 case 'a':
a4ec8d12 367 for (np = GET_MODE_NAME(m1); *np; np++)
92a438d1 368 putchar (TOLOWER (*np));
af9e4a0c
RK
369 break;
370 case 'b':
a4ec8d12 371 for (np = GET_MODE_NAME(m2); *np; np++)
92a438d1 372 putchar (TOLOWER (*np));
af9e4a0c
RK
373 break;
374 case 'A':
85363ca0 375 printf ("%smode", GET_MODE_NAME(m1));
af9e4a0c
RK
376 break;
377 case 'B':
85363ca0 378 printf ("%smode", GET_MODE_NAME(m2));
af9e4a0c
RK
379 break;
380 case 'c':
5f06c983 381 printf ("%s", GET_RTX_NAME(op));
af9e4a0c
RK
382 break;
383 case 'C':
5f06c983 384 for (np = GET_RTX_NAME(op); *np; np++)
92a438d1 385 putchar (TOUPPER (*np));
af9e4a0c
RK
386 break;
387 }
388 }
389
390 printf (";\n");
391}
af9e4a0c 392
3d7aafde 393extern int main (int, char **);
c1b59dce 394
af9e4a0c 395int
3d7aafde 396main (int argc, char **argv)
af9e4a0c
RK
397{
398 rtx desc;
af9e4a0c 399
f8b6598e 400 progname = "genopinit";
af9e4a0c 401
04d8aa70 402 if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
c88c0d42 403 return (FATAL_EXIT_CODE);
af9e4a0c 404
af9e4a0c
RK
405 printf ("/* Generated automatically by the program `genopinit'\n\
406from the machine description file `md'. */\n\n");
407
408 printf ("#include \"config.h\"\n");
729da3f5 409 printf ("#include \"system.h\"\n");
4977bab6
ZW
410 printf ("#include \"coretypes.h\"\n");
411 printf ("#include \"tm.h\"\n");
af9e4a0c
RK
412 printf ("#include \"rtl.h\"\n");
413 printf ("#include \"flags.h\"\n");
af9e4a0c
RK
414 printf ("#include \"insn-config.h\"\n");
415 printf ("#include \"recog.h\"\n");
416 printf ("#include \"expr.h\"\n");
e78d8e51 417 printf ("#include \"optabs.h\"\n");
af9e4a0c
RK
418 printf ("#include \"reload.h\"\n\n");
419
6906ba40 420 printf ("void\ninit_all_optabs (void)\n{\n");
af9e4a0c 421
dcc3fcf2
KH
422 puts ("\
423#ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC\n\
424 int i, j;\n\
425#endif\n");
426
af9e4a0c
RK
427 /* Read the machine description. */
428
429 while (1)
430 {
c88c0d42
CP
431 int line_no, insn_code_number = 0;
432
433 desc = read_md_rtx (&line_no, &insn_code_number);
434 if (desc == NULL)
af9e4a0c 435 break;
af9e4a0c 436
af9e4a0c
RK
437 if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
438 gen_insn (desc);
439 }
440
85363ca0
ZW
441 puts ("\
442\n\
443#ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC\n\
444 /* This flag says the same insns that convert to a signed fixnum\n\
445 also convert validly to an unsigned one. */\n\
446 for (i = 0; i < NUM_MACHINE_MODES; i++)\n\
447 for (j = 0; j < NUM_MACHINE_MODES; j++)\n\
448 ufixtrunc_optab->handlers[i][j].insn_code\n\
449 = sfixtrunc_optab->handlers[i][j].insn_code;\n\
450#endif\n\
451}");
af9e4a0c
RK
452
453 fflush (stdout);
c1b59dce 454 return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
af9e4a0c 455}
This page took 2.458337 seconds and 5 git commands to generate.