OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / genopinit.c
1 /* Generate code to initialize optabs from machine description.
2    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22
23 #include "bconfig.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "rtl.h"
28 #include "errors.h"
29 #include "gensupport.h"
30
31
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
43    with $( and $).  In the string, $a and $b are used to match a short mode
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
46    used.  $A and $B are replaced with the full name of the mode; $a and $b
47    are replaced with the short form of the name, as above.
48
49    If $N is present in the pattern, it means the two modes must be in
50    the same mode class, and $b must be greater than $a (e.g, QImode
51    and HImode).
52
53    $I means that only full integer modes should be considered for the
54    next mode, and $F means that only float modes should be considered.
55    $P means that both full and partial integer modes should be considered.
56    $Q means that only fixed-point modes should be considered.
57
58    $V means to emit 'v' if the first mode is a MODE_FLOAT mode.
59
60    For some optabs, we store the operation by RTL codes.  These are only
61    used for comparisons.  In that case, $c and $C are the lower-case and
62    upper-case forms of the comparison, respectively.  */
63
64 static const char * const optabs[] =
65 { "set_convert_optab_handler (sext_optab, $B, $A, CODE_FOR_$(extend$a$b2$))",
66   "set_convert_optab_handler (zext_optab, $B, $A, CODE_FOR_$(zero_extend$a$b2$))",
67   "set_convert_optab_handler (sfix_optab, $B, $A, CODE_FOR_$(fix$F$a$I$b2$))",
68   "set_convert_optab_handler (ufix_optab, $B, $A, CODE_FOR_$(fixuns$F$a$b2$))",
69   "set_convert_optab_handler (sfixtrunc_optab, $B, $A, CODE_FOR_$(fix_trunc$F$a$I$b2$))",
70   "set_convert_optab_handler (ufixtrunc_optab, $B, $A, CODE_FOR_$(fixuns_trunc$F$a$I$b2$))",
71   "set_convert_optab_handler (sfloat_optab, $B, $A, CODE_FOR_$(float$I$a$F$b2$))",
72   "set_convert_optab_handler (ufloat_optab, $B, $A, CODE_FOR_$(floatuns$I$a$F$b2$))",
73   "set_convert_optab_handler (trunc_optab, $B, $A, CODE_FOR_$(trunc$a$b2$))",
74   "set_convert_optab_handler (fract_optab, $B, $A, CODE_FOR_$(fract$a$b2$))",
75   "set_convert_optab_handler (fractuns_optab, $B, $A, CODE_FOR_$(fractuns$I$a$Q$b2$))",
76   "set_convert_optab_handler (fractuns_optab, $B, $A, CODE_FOR_$(fractuns$Q$a$I$b2$))",
77   "set_convert_optab_handler (satfract_optab, $B, $A, CODE_FOR_$(satfract$a$Q$b2$))",
78   "set_convert_optab_handler (satfractuns_optab, $B, $A, CODE_FOR_$(satfractuns$I$a$Q$b2$))",
79   "set_convert_optab_handler (vec_load_lanes_optab, $A, $B, CODE_FOR_$(vec_load_lanes$a$b$))",
80   "set_convert_optab_handler (vec_store_lanes_optab, $A, $B, CODE_FOR_$(vec_store_lanes$a$b$))",
81   "set_optab_handler (add_optab, $A, CODE_FOR_$(add$P$a3$))",
82   "set_optab_handler (addv_optab, $A, CODE_FOR_$(add$F$a3$)),\n\
83     set_optab_handler (add_optab, $A, CODE_FOR_$(add$F$a3$))",
84   "set_optab_handler (addv_optab, $A, CODE_FOR_$(addv$I$a3$))",
85   "set_optab_handler (add_optab, $A, CODE_FOR_$(add$Q$a3$))",
86   "set_optab_handler (ssadd_optab, $A, CODE_FOR_$(ssadd$Q$a3$))",
87   "set_optab_handler (usadd_optab, $A, CODE_FOR_$(usadd$Q$a3$))",
88   "set_optab_handler (sub_optab, $A, CODE_FOR_$(sub$P$a3$))",
89   "set_optab_handler (subv_optab, $A, CODE_FOR_$(sub$F$a3$)),\n\
90     set_optab_handler (sub_optab, $A, CODE_FOR_$(sub$F$a3$))",
91   "set_optab_handler (subv_optab, $A, CODE_FOR_$(subv$I$a3$))",
92   "set_optab_handler (sub_optab, $A, CODE_FOR_$(sub$Q$a3$))",
93   "set_optab_handler (sssub_optab, $A, CODE_FOR_$(sssub$Q$a3$))",
94   "set_optab_handler (ussub_optab, $A, CODE_FOR_$(ussub$Q$a3$))",
95   "set_optab_handler (smul_optab, $A, CODE_FOR_$(mul$Q$a3$))",
96   "set_optab_handler (ssmul_optab, $A, CODE_FOR_$(ssmul$Q$a3$))",
97   "set_optab_handler (usmul_optab, $A, CODE_FOR_$(usmul$Q$a3$))",
98   "set_optab_handler (smul_optab, $A, CODE_FOR_$(mul$P$a3$))",
99   "set_optab_handler (smulv_optab, $A, CODE_FOR_$(mul$F$a3$)),\n\
100     set_optab_handler (smul_optab, $A, CODE_FOR_$(mul$F$a3$))",
101   "set_optab_handler (smulv_optab, $A, CODE_FOR_$(mulv$I$a3$))",
102   "set_optab_handler (umul_highpart_optab, $A, CODE_FOR_$(umul$a3_highpart$))",
103   "set_optab_handler (smul_highpart_optab, $A, CODE_FOR_$(smul$a3_highpart$))",
104   "set_widening_optab_handler (smul_widen_optab, $B, $A, CODE_FOR_$(mul$a$b3$)$N)",
105   "set_widening_optab_handler (umul_widen_optab, $B, $A, CODE_FOR_$(umul$a$b3$)$N)",
106   "set_widening_optab_handler (usmul_widen_optab, $B, $A, CODE_FOR_$(usmul$a$b3$)$N)",
107   "set_widening_optab_handler (smadd_widen_optab, $B, $A, CODE_FOR_$(madd$a$b4$)$N)",
108   "set_widening_optab_handler (umadd_widen_optab, $B, $A, CODE_FOR_$(umadd$a$b4$)$N)",
109   "set_widening_optab_handler (ssmadd_widen_optab, $B, $A, CODE_FOR_$(ssmadd$a$b4$)$N)",
110   "set_widening_optab_handler (usmadd_widen_optab, $B, $A, CODE_FOR_$(usmadd$a$b4$)$N)",
111   "set_widening_optab_handler (smsub_widen_optab, $B, $A, CODE_FOR_$(msub$a$b4$)$N)",
112   "set_widening_optab_handler (umsub_widen_optab, $B, $A, CODE_FOR_$(umsub$a$b4$)$N)",
113   "set_widening_optab_handler (ssmsub_widen_optab, $B, $A, CODE_FOR_$(ssmsub$a$b4$)$N)",
114   "set_widening_optab_handler (usmsub_widen_optab, $B, $A, CODE_FOR_$(usmsub$a$b4$)$N)",
115   "set_optab_handler (sdiv_optab, $A, CODE_FOR_$(div$a3$))",
116   "set_optab_handler (ssdiv_optab, $A, CODE_FOR_$(ssdiv$Q$a3$))",
117   "set_optab_handler (sdivv_optab, $A, CODE_FOR_$(div$V$I$a3$))",
118   "set_optab_handler (udiv_optab, $A, CODE_FOR_$(udiv$I$a3$))",
119   "set_optab_handler (udiv_optab, $A, CODE_FOR_$(udiv$Q$a3$))",
120   "set_optab_handler (usdiv_optab, $A, CODE_FOR_$(usdiv$Q$a3$))",
121   "set_optab_handler (sdivmod_optab, $A, CODE_FOR_$(divmod$a4$))",
122   "set_optab_handler (udivmod_optab, $A, CODE_FOR_$(udivmod$a4$))",
123   "set_optab_handler (smod_optab, $A, CODE_FOR_$(mod$a3$))",
124   "set_optab_handler (umod_optab, $A, CODE_FOR_$(umod$a3$))",
125   "set_optab_handler (fmod_optab, $A, CODE_FOR_$(fmod$a3$))",
126   "set_optab_handler (remainder_optab, $A, CODE_FOR_$(remainder$a3$))",
127   "set_optab_handler (ftrunc_optab, $A, CODE_FOR_$(ftrunc$F$a2$))",
128   "set_optab_handler (and_optab, $A, CODE_FOR_$(and$a3$))",
129   "set_optab_handler (ior_optab, $A, CODE_FOR_$(ior$a3$))",
130   "set_optab_handler (xor_optab, $A, CODE_FOR_$(xor$a3$))",
131   "set_optab_handler (ashl_optab, $A, CODE_FOR_$(ashl$a3$))",
132   "set_optab_handler (ssashl_optab, $A, CODE_FOR_$(ssashl$Q$a3$))",
133   "set_optab_handler (usashl_optab, $A, CODE_FOR_$(usashl$Q$a3$))",
134   "set_optab_handler (ashr_optab, $A, CODE_FOR_$(ashr$a3$))",
135   "set_optab_handler (lshr_optab, $A, CODE_FOR_$(lshr$a3$))",
136   "set_optab_handler (rotl_optab, $A, CODE_FOR_$(rotl$a3$))",
137   "set_optab_handler (rotr_optab, $A, CODE_FOR_$(rotr$a3$))",
138   "set_optab_handler (vashr_optab, $A, CODE_FOR_$(vashr$a3$))",
139   "set_optab_handler (vlshr_optab, $A, CODE_FOR_$(vlshr$a3$))",
140   "set_optab_handler (vashl_optab, $A, CODE_FOR_$(vashl$a3$))",
141   "set_optab_handler (vrotl_optab, $A, CODE_FOR_$(vrotl$a3$))",
142   "set_optab_handler (vrotr_optab, $A, CODE_FOR_$(vrotr$a3$))",
143   "set_optab_handler (smin_optab, $A, CODE_FOR_$(smin$a3$))",
144   "set_optab_handler (smax_optab, $A, CODE_FOR_$(smax$a3$))",
145   "set_optab_handler (umin_optab, $A, CODE_FOR_$(umin$I$a3$))",
146   "set_optab_handler (umax_optab, $A, CODE_FOR_$(umax$I$a3$))",
147   "set_optab_handler (pow_optab, $A, CODE_FOR_$(pow$a3$))",
148   "set_optab_handler (atan2_optab, $A, CODE_FOR_$(atan2$a3$))",
149   "set_optab_handler (neg_optab, $A, CODE_FOR_$(neg$P$a2$))",
150   "set_optab_handler (negv_optab, $A, CODE_FOR_$(neg$F$a2$)),\n\
151     set_optab_handler (neg_optab, $A, CODE_FOR_$(neg$F$a2$))",
152   "set_optab_handler (negv_optab, $A, CODE_FOR_$(negv$I$a2$))",
153   "set_optab_handler (neg_optab, $A, CODE_FOR_$(neg$Q$a2$))",
154   "set_optab_handler (ssneg_optab, $A, CODE_FOR_$(ssneg$Q$a2$))",
155   "set_optab_handler (usneg_optab, $A, CODE_FOR_$(usneg$Q$a2$))",
156   "set_optab_handler (abs_optab, $A, CODE_FOR_$(abs$P$a2$))",
157   "set_optab_handler (absv_optab, $A, CODE_FOR_$(abs$F$a2$)),\n\
158     set_optab_handler (abs_optab, $A, CODE_FOR_$(abs$F$a2$))",
159   "set_optab_handler (absv_optab, $A, CODE_FOR_$(absv$I$a2$))",
160   "set_optab_handler (copysign_optab, $A, CODE_FOR_$(copysign$F$a3$))",
161   "set_optab_handler (signbit_optab, $A, CODE_FOR_$(signbit$F$a2$))",
162   "set_optab_handler (isinf_optab, $A, CODE_FOR_$(isinf$a2$))",
163   "set_optab_handler (sqrt_optab, $A, CODE_FOR_$(sqrt$a2$))",
164   "set_optab_handler (floor_optab, $A, CODE_FOR_$(floor$a2$))",
165   "set_convert_optab_handler (lfloor_optab, $B, $A, CODE_FOR_$(lfloor$F$a$I$b2$))",
166   "set_optab_handler (fma_optab, $A, CODE_FOR_$(fma$a4$))",
167   "set_optab_handler (fms_optab, $A, CODE_FOR_$(fms$a4$))",
168   "set_optab_handler (fnma_optab, $A, CODE_FOR_$(fnma$a4$))",
169   "set_optab_handler (fnms_optab, $A, CODE_FOR_$(fnms$a4$))",
170   "set_optab_handler (ceil_optab, $A, CODE_FOR_$(ceil$a2$))",
171   "set_convert_optab_handler (lceil_optab, $B, $A, CODE_FOR_$(lceil$F$a$I$b2$))",
172   "set_optab_handler (round_optab, $A, CODE_FOR_$(round$a2$))",
173   "set_optab_handler (btrunc_optab, $A, CODE_FOR_$(btrunc$a2$))",
174   "set_optab_handler (nearbyint_optab, $A, CODE_FOR_$(nearbyint$a2$))",
175   "set_optab_handler (rint_optab, $A, CODE_FOR_$(rint$a2$))",
176   "set_convert_optab_handler (lrint_optab, $B, $A, CODE_FOR_$(lrint$F$a$I$b2$))",
177   "set_convert_optab_handler (lround_optab, $B, $A, CODE_FOR_$(lround$F$a$I$b2$))",
178   "set_optab_handler (sincos_optab, $A, CODE_FOR_$(sincos$a3$))",
179   "set_optab_handler (sin_optab, $A, CODE_FOR_$(sin$a2$))",
180   "set_optab_handler (asin_optab, $A, CODE_FOR_$(asin$a2$))",
181   "set_optab_handler (cos_optab, $A, CODE_FOR_$(cos$a2$))",
182   "set_optab_handler (acos_optab, $A, CODE_FOR_$(acos$a2$))",
183   "set_optab_handler (exp_optab, $A, CODE_FOR_$(exp$a2$))",
184   "set_optab_handler (exp10_optab, $A, CODE_FOR_$(exp10$a2$))",
185   "set_optab_handler (exp2_optab, $A, CODE_FOR_$(exp2$a2$))",
186   "set_optab_handler (expm1_optab, $A, CODE_FOR_$(expm1$a2$))",
187   "set_optab_handler (ldexp_optab, $A, CODE_FOR_$(ldexp$a3$))",
188   "set_optab_handler (scalb_optab, $A, CODE_FOR_$(scalb$a3$))",
189   "set_optab_handler (significand_optab, $A, CODE_FOR_$(significand$a2$))",
190   "set_optab_handler (logb_optab, $A, CODE_FOR_$(logb$a2$))",
191   "set_optab_handler (ilogb_optab, $A, CODE_FOR_$(ilogb$a2$))",
192   "set_optab_handler (log_optab, $A, CODE_FOR_$(log$a2$))",
193   "set_optab_handler (log10_optab, $A, CODE_FOR_$(log10$a2$))",
194   "set_optab_handler (log2_optab, $A, CODE_FOR_$(log2$a2$))",
195   "set_optab_handler (log1p_optab, $A, CODE_FOR_$(log1p$a2$))",
196   "set_optab_handler (tan_optab, $A, CODE_FOR_$(tan$a2$))",
197   "set_optab_handler (atan_optab, $A, CODE_FOR_$(atan$a2$))",
198   "set_optab_handler (strlen_optab, $A, CODE_FOR_$(strlen$a$))",
199   "set_optab_handler (one_cmpl_optab, $A, CODE_FOR_$(one_cmpl$a2$))",
200   "set_optab_handler (bswap_optab, $A, CODE_FOR_$(bswap$a2$))",
201   "set_optab_handler (ffs_optab, $A, CODE_FOR_$(ffs$a2$))",
202   "set_optab_handler (clz_optab, $A, CODE_FOR_$(clz$a2$))",
203   "set_optab_handler (ctz_optab, $A, CODE_FOR_$(ctz$a2$))",
204   "set_optab_handler (clrsb_optab, $A, CODE_FOR_$(clrsb$a2$))",
205   "set_optab_handler (popcount_optab, $A, CODE_FOR_$(popcount$a2$))",
206   "set_optab_handler (parity_optab, $A, CODE_FOR_$(parity$a2$))",
207   "set_optab_handler (mov_optab, $A, CODE_FOR_$(mov$a$))",
208   "set_optab_handler (movstrict_optab, $A, CODE_FOR_$(movstrict$a$))",
209   "set_optab_handler (movmisalign_optab, $A, CODE_FOR_$(movmisalign$a$))",
210   "set_optab_handler (storent_optab, $A, CODE_FOR_$(storent$a$))",
211   "set_optab_handler (addcc_optab, $A, CODE_FOR_$(add$acc$))",
212   "set_direct_optab_handler (movcc_optab, $A, CODE_FOR_$(mov$acc$))",
213   "set_optab_handler (cbranch_optab, $A, CODE_FOR_$(cbranch$a4$))",
214   "set_optab_handler (cmov_optab, $A, CODE_FOR_$(cmov$a6$))",
215   "set_optab_handler (cstore_optab, $A, CODE_FOR_$(cstore$a4$))",
216   "set_optab_handler (ctrap_optab, $A, CODE_FOR_$(ctrap$a4$))",
217   "set_optab_handler (push_optab, $A, CODE_FOR_$(push$a1$))",
218   "set_direct_optab_handler (reload_in_optab, $A, CODE_FOR_$(reload_in$a$))",
219   "set_direct_optab_handler (reload_out_optab, $A, CODE_FOR_$(reload_out$a$))",
220   "set_direct_optab_handler (movmem_optab, $A, CODE_FOR_$(movmem$a$))",
221   "set_direct_optab_handler (cmpstr_optab, $A, CODE_FOR_$(cmpstr$a$))",
222   "set_direct_optab_handler (cmpstrn_optab, $A, CODE_FOR_$(cmpstrn$a$))",
223   "set_direct_optab_handler (cmpmem_optab, $A, CODE_FOR_$(cmpmem$a$))",
224   "set_direct_optab_handler (setmem_optab, $A, CODE_FOR_$(setmem$a$))",
225   "set_direct_optab_handler (sync_add_optab, $A, CODE_FOR_$(sync_add$I$a$))",
226   "set_direct_optab_handler (sync_sub_optab, $A, CODE_FOR_$(sync_sub$I$a$))",
227   "set_direct_optab_handler (sync_ior_optab, $A, CODE_FOR_$(sync_ior$I$a$))",
228   "set_direct_optab_handler (sync_and_optab, $A, CODE_FOR_$(sync_and$I$a$))",
229   "set_direct_optab_handler (sync_xor_optab, $A, CODE_FOR_$(sync_xor$I$a$))",
230   "set_direct_optab_handler (sync_nand_optab, $A, CODE_FOR_$(sync_nand$I$a$))",
231   "set_optab_handler (sync_old_add_optab, $A, CODE_FOR_$(sync_old_add$I$a$))",
232   "set_optab_handler (sync_old_sub_optab, $A, CODE_FOR_$(sync_old_sub$I$a$))",
233   "set_optab_handler (sync_old_ior_optab, $A, CODE_FOR_$(sync_old_ior$I$a$))",
234   "set_optab_handler (sync_old_and_optab, $A, CODE_FOR_$(sync_old_and$I$a$))",
235   "set_optab_handler (sync_old_xor_optab, $A, CODE_FOR_$(sync_old_xor$I$a$))",
236   "set_optab_handler (sync_old_nand_optab, $A, CODE_FOR_$(sync_old_nand$I$a$))",
237   "set_optab_handler (sync_new_add_optab, $A, CODE_FOR_$(sync_new_add$I$a$))",
238   "set_optab_handler (sync_new_sub_optab, $A, CODE_FOR_$(sync_new_sub$I$a$))",
239   "set_optab_handler (sync_new_ior_optab, $A, CODE_FOR_$(sync_new_ior$I$a$))",
240   "set_optab_handler (sync_new_and_optab, $A, CODE_FOR_$(sync_new_and$I$a$))",
241   "set_optab_handler (sync_new_xor_optab, $A, CODE_FOR_$(sync_new_xor$I$a$))",
242   "set_optab_handler (sync_new_nand_optab, $A, CODE_FOR_$(sync_new_nand$I$a$))",
243   "set_optab_handler (sync_compare_and_swap_optab, $A, CODE_FOR_$(sync_compare_and_swap$I$a$))",
244   "set_optab_handler (sync_lock_test_and_set_optab, $A, CODE_FOR_$(sync_lock_test_and_set$I$a$))",
245   "set_direct_optab_handler (sync_lock_release_optab, $A, CODE_FOR_$(sync_lock_release$I$a$))",
246   "set_direct_optab_handler (atomic_exchange_optab, $A, CODE_FOR_$(atomic_exchange$I$a$))",
247   "set_direct_optab_handler (atomic_compare_and_swap_optab, $A, CODE_FOR_$(atomic_compare_and_swap$I$a$))",
248   "set_direct_optab_handler (atomic_load_optab, $A, CODE_FOR_$(atomic_load$I$a$))",
249   "set_direct_optab_handler (atomic_store_optab, $A, CODE_FOR_$(atomic_store$I$a$))",
250   "set_direct_optab_handler (atomic_add_fetch_optab, $A, CODE_FOR_$(atomic_add_fetch$I$a$))",
251   "set_direct_optab_handler (atomic_sub_fetch_optab, $A, CODE_FOR_$(atomic_sub_fetch$I$a$))",
252   "set_direct_optab_handler (atomic_and_fetch_optab, $A, CODE_FOR_$(atomic_and_fetch$I$a$))",
253   "set_direct_optab_handler (atomic_nand_fetch_optab, $A, CODE_FOR_$(atomic_nand_fetch$I$a$))",
254   "set_direct_optab_handler (atomic_xor_fetch_optab, $A, CODE_FOR_$(atomic_xor_fetch$I$a$))",
255   "set_direct_optab_handler (atomic_or_fetch_optab, $A, CODE_FOR_$(atomic_or_fetch$I$a$))",
256   "set_direct_optab_handler (atomic_fetch_add_optab, $A, CODE_FOR_$(atomic_fetch_add$I$a$))",
257   "set_direct_optab_handler (atomic_fetch_sub_optab, $A, CODE_FOR_$(atomic_fetch_sub$I$a$))",
258   "set_direct_optab_handler (atomic_fetch_and_optab, $A, CODE_FOR_$(atomic_fetch_and$I$a$))",
259   "set_direct_optab_handler (atomic_fetch_nand_optab, $A, CODE_FOR_$(atomic_fetch_nand$I$a$))",
260   "set_direct_optab_handler (atomic_fetch_xor_optab, $A, CODE_FOR_$(atomic_fetch_xor$I$a$))",
261   "set_direct_optab_handler (atomic_fetch_or_optab, $A, CODE_FOR_$(atomic_fetch_or$I$a$))",
262   "set_direct_optab_handler (atomic_add_optab, $A, CODE_FOR_$(atomic_add$I$a$))",
263   "set_direct_optab_handler (atomic_sub_optab, $A, CODE_FOR_$(atomic_sub$I$a$))",
264   "set_direct_optab_handler (atomic_and_optab, $A, CODE_FOR_$(atomic_and$I$a$))",
265   "set_direct_optab_handler (atomic_nand_optab, $A, CODE_FOR_$(atomic_nand$I$a$))",
266   "set_direct_optab_handler (atomic_xor_optab, $A, CODE_FOR_$(atomic_xor$I$a$))",
267   "set_direct_optab_handler (atomic_or_optab, $A, CODE_FOR_$(atomic_or$I$a$))",
268   "set_optab_handler (vec_set_optab, $A, CODE_FOR_$(vec_set$a$))",
269   "set_optab_handler (vec_extract_optab, $A, CODE_FOR_$(vec_extract$a$))",
270   "set_optab_handler (vec_init_optab, $A, CODE_FOR_$(vec_init$a$))",
271   "set_optab_handler (vec_shl_optab, $A, CODE_FOR_$(vec_shl_$a$))",
272   "set_optab_handler (vec_shr_optab, $A, CODE_FOR_$(vec_shr_$a$))",
273   "set_optab_handler (vec_realign_load_optab, $A, CODE_FOR_$(vec_realign_load_$a$))",
274   "set_direct_optab_handler (vec_perm_optab, $A, CODE_FOR_$(vec_perm$a$))",
275   "set_direct_optab_handler (vec_perm_const_optab, $A, CODE_FOR_$(vec_perm_const$a$))",
276   "set_convert_optab_handler (vcond_optab, $A, $B, CODE_FOR_$(vcond$a$b$))",
277   "set_convert_optab_handler (vcondu_optab, $A, $B, CODE_FOR_$(vcondu$a$b$))",
278   "set_optab_handler (ssum_widen_optab, $A, CODE_FOR_$(widen_ssum$I$a3$))",
279   "set_optab_handler (usum_widen_optab, $A, CODE_FOR_$(widen_usum$I$a3$))",
280   "set_optab_handler (udot_prod_optab, $A, CODE_FOR_$(udot_prod$I$a$))",
281   "set_optab_handler (sdot_prod_optab, $A, CODE_FOR_$(sdot_prod$I$a$))",
282   "set_optab_handler (reduc_smax_optab, $A, CODE_FOR_$(reduc_smax_$a$))",
283   "set_optab_handler (reduc_umax_optab, $A, CODE_FOR_$(reduc_umax_$a$))",
284   "set_optab_handler (reduc_smin_optab, $A, CODE_FOR_$(reduc_smin_$a$))",
285   "set_optab_handler (reduc_umin_optab, $A, CODE_FOR_$(reduc_umin_$a$))",
286   "set_optab_handler (reduc_splus_optab, $A, CODE_FOR_$(reduc_splus_$a$))" ,
287   "set_optab_handler (reduc_uplus_optab, $A, CODE_FOR_$(reduc_uplus_$a$))",
288   "set_optab_handler (vec_widen_umult_hi_optab, $A, CODE_FOR_$(vec_widen_umult_hi_$a$))",
289   "set_optab_handler (vec_widen_umult_lo_optab, $A, CODE_FOR_$(vec_widen_umult_lo_$a$))",
290   "set_optab_handler (vec_widen_smult_hi_optab, $A, CODE_FOR_$(vec_widen_smult_hi_$a$))",
291   "set_optab_handler (vec_widen_smult_lo_optab, $A, CODE_FOR_$(vec_widen_smult_lo_$a$))",
292   "set_optab_handler (vec_widen_ushiftl_hi_optab, $A, CODE_FOR_$(vec_widen_ushiftl_hi_$a$))",
293   "set_optab_handler (vec_widen_ushiftl_lo_optab, $A, CODE_FOR_$(vec_widen_ushiftl_lo_$a$))",
294   "set_optab_handler (vec_widen_sshiftl_hi_optab, $A, CODE_FOR_$(vec_widen_sshiftl_hi_$a$))",
295   "set_optab_handler (vec_widen_sshiftl_lo_optab, $A, CODE_FOR_$(vec_widen_sshiftl_lo_$a$))",
296   "set_optab_handler (vec_unpacks_hi_optab, $A, CODE_FOR_$(vec_unpacks_hi_$a$))",
297   "set_optab_handler (vec_unpacks_lo_optab, $A, CODE_FOR_$(vec_unpacks_lo_$a$))",
298   "set_optab_handler (vec_unpacku_hi_optab, $A, CODE_FOR_$(vec_unpacku_hi_$a$))",
299   "set_optab_handler (vec_unpacku_lo_optab, $A, CODE_FOR_$(vec_unpacku_lo_$a$))",
300   "set_optab_handler (vec_unpacks_float_hi_optab, $A, CODE_FOR_$(vec_unpacks_float_hi_$a$))",
301   "set_optab_handler (vec_unpacks_float_lo_optab, $A, CODE_FOR_$(vec_unpacks_float_lo_$a$))",
302   "set_optab_handler (vec_unpacku_float_hi_optab, $A, CODE_FOR_$(vec_unpacku_float_hi_$a$))",
303   "set_optab_handler (vec_unpacku_float_lo_optab, $A, CODE_FOR_$(vec_unpacku_float_lo_$a$))",
304   "set_optab_handler (vec_pack_trunc_optab, $A, CODE_FOR_$(vec_pack_trunc_$a$))",
305   "set_optab_handler (vec_pack_ssat_optab, $A, CODE_FOR_$(vec_pack_ssat_$a$))",
306   "set_optab_handler (vec_pack_usat_optab, $A, CODE_FOR_$(vec_pack_usat_$a$))",
307   "set_optab_handler (vec_pack_sfix_trunc_optab, $A, CODE_FOR_$(vec_pack_sfix_trunc_$a$))",
308   "set_optab_handler (vec_pack_ufix_trunc_optab, $A, CODE_FOR_$(vec_pack_ufix_trunc_$a$))"
309 };
310
311 static void gen_insn (rtx);
312
313 static void
314 gen_insn (rtx insn)
315 {
316   const char *name = XSTR (insn, 0);
317   int m1 = 0, m2 = 0, op = 0;
318   size_t pindex;
319   int i;
320   const char *np, *pp, *p, *q;
321
322   /* Don't mention instructions whose names are the null string.
323      They are in the machine description just to be recognized.  */
324   if (*name == 0)
325     return;
326
327   /* See if NAME matches one of the patterns we have for the optabs we know
328      about.  */
329
330   for (pindex = 0; pindex < ARRAY_SIZE (optabs); pindex++)
331     {
332       int force_float = 0, force_int = 0, force_partial_int = 0;
333       int force_fixed = 0;
334       int force_wider = 0;
335       int matches = 1;
336
337       for (pp = optabs[pindex]; pp[0] != '$' || pp[1] != '('; pp++)
338         ;
339
340       for (pp += 2, np = name; matches && ! (pp[0] == '$' && pp[1] == ')');
341            pp++)
342         {
343           if (*pp != '$')
344             {
345               if (*pp != *np++)
346                 break;
347             }
348           else
349             switch (*++pp)
350               {
351               case 'N':
352                 force_wider = 1;
353                 break;
354               case 'I':
355                 force_int = 1;
356                 break;
357               case 'P':
358                 force_partial_int = 1;
359                 break;
360               case 'F':
361                 force_float = 1;
362                 break;
363               case 'Q':
364                 force_fixed = 1;
365                 break;
366               case 'V':
367                 break;
368               case 'c':
369                 for (op = 0; op < NUM_RTX_CODE; op++)
370                   {
371                     for (p = GET_RTX_NAME(op), q = np; *p; p++, q++)
372                       if (*p != *q)
373                         break;
374
375                     /* We have to be concerned about matching "gt" and
376                        missing "gtu", e.g., so verify we have reached the
377                        end of thing we are to match.  */
378                     if (*p == 0 && *q == 0
379                         && (GET_RTX_CLASS (op) == RTX_COMPARE
380                             || GET_RTX_CLASS (op) == RTX_COMM_COMPARE))
381                       break;
382                   }
383
384                 if (op == NUM_RTX_CODE)
385                   matches = 0;
386                 else
387                   np += strlen (GET_RTX_NAME(op));
388                 break;
389               case 'a':
390               case 'b':
391                 /* This loop will stop at the first prefix match, so
392                    look through the modes in reverse order, in case
393                    there are extra CC modes and CC is a prefix of the
394                    CC modes (as it should be).  */
395                 for (i = (MAX_MACHINE_MODE) - 1; i >= 0; i--)
396                   {
397                     for (p = GET_MODE_NAME(i), q = np; *p; p++, q++)
398                       if (TOLOWER (*p) != *q)
399                         break;
400
401                     if (*p == 0
402                         && (! force_int || mode_class[i] == MODE_INT
403                             || mode_class[i] == MODE_VECTOR_INT)
404                         && (! force_partial_int
405                             || mode_class[i] == MODE_INT
406                             || mode_class[i] == MODE_PARTIAL_INT
407                             || mode_class[i] == MODE_VECTOR_INT)
408                         && (! force_float
409                             || mode_class[i] == MODE_FLOAT
410                             || mode_class[i] == MODE_DECIMAL_FLOAT
411                             || mode_class[i] == MODE_COMPLEX_FLOAT
412                             || mode_class[i] == MODE_VECTOR_FLOAT)
413                         && (! force_fixed
414                             || mode_class[i] == MODE_FRACT
415                             || mode_class[i] == MODE_UFRACT
416                             || mode_class[i] == MODE_ACCUM
417                             || mode_class[i] == MODE_UACCUM
418                             || mode_class[i] == MODE_VECTOR_FRACT
419                             || mode_class[i] == MODE_VECTOR_UFRACT
420                             || mode_class[i] == MODE_VECTOR_ACCUM
421                             || mode_class[i] == MODE_VECTOR_UACCUM)
422                         && (! force_wider
423                             || *pp == 'a'
424                             || m1 < i))
425                       break;
426                   }
427
428                 if (i < 0)
429                   matches = 0;
430                 else if (*pp == 'a')
431                   m1 = i, np += strlen (GET_MODE_NAME(i));
432                 else
433                   m2 = i, np += strlen (GET_MODE_NAME(i));
434
435                 force_int = force_partial_int = force_float = force_fixed = 0;
436                 break;
437
438               default:
439                 gcc_unreachable ();
440               }
441         }
442
443       if (matches && pp[0] == '$' && pp[1] == ')'
444           && *np == 0)
445         break;
446     }
447
448   if (pindex == ARRAY_SIZE (optabs))
449     return;
450
451   /* We found a match.  If this pattern is only conditionally present,
452      write out the "if" and two extra blanks.  */
453
454   if (*XSTR (insn, 2) != 0)
455     printf ("  if (HAVE_%s)\n  ", name);
456
457   printf ("  ");
458
459   /* Now write out the initialization, making all required substitutions.  */
460   for (pp = optabs[pindex]; *pp; pp++)
461     {
462       if (*pp != '$')
463         putchar (*pp);
464       else
465         switch (*++pp)
466           {
467           case '(':  case ')':
468           case 'I':  case 'F':  case 'N':
469             break;
470           case 'V':
471             if (SCALAR_FLOAT_MODE_P (m1))
472               printf ("v");
473             break;
474           case 'a':
475             for (np = GET_MODE_NAME(m1); *np; np++)
476               putchar (TOLOWER (*np));
477             break;
478           case 'b':
479             for (np = GET_MODE_NAME(m2); *np; np++)
480               putchar (TOLOWER (*np));
481             break;
482           case 'A':
483             printf ("%smode", GET_MODE_NAME(m1));
484             break;
485           case 'B':
486             printf ("%smode", GET_MODE_NAME(m2));
487             break;
488           case 'c':
489             printf ("%s", GET_RTX_NAME(op));
490             break;
491           case 'C':
492             for (np = GET_RTX_NAME(op); *np; np++)
493               putchar (TOUPPER (*np));
494             break;
495           }
496     }
497
498   printf (";\n");
499 }
500
501 extern int main (int, char **);
502
503 int
504 main (int argc, char **argv)
505 {
506   rtx desc;
507
508   progname = "genopinit";
509
510   if (!init_rtx_reader_args (argc, argv))
511     return (FATAL_EXIT_CODE);
512
513   printf ("/* Generated automatically by the program `genopinit'\n\
514 from the machine description file `md'.  */\n\n");
515
516   printf ("#include \"config.h\"\n");
517   printf ("#include \"system.h\"\n");
518   printf ("#include \"coretypes.h\"\n");
519   printf ("#include \"tm.h\"\n");
520   printf ("#include \"rtl.h\"\n");
521   printf ("#include \"tm_p.h\"\n");
522   printf ("#include \"flags.h\"\n");
523   printf ("#include \"insn-config.h\"\n");
524   printf ("#include \"recog.h\"\n");
525   printf ("#include \"expr.h\"\n");
526   printf ("#include \"optabs.h\"\n");
527   printf ("#include \"reload.h\"\n\n");
528
529   printf ("void\ninit_all_optabs (void)\n{\n");
530
531   puts ("\
532 #ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC\n\
533   int i, j;\n\
534 #endif\n");
535
536   /* Read the machine description.  */
537
538   while (1)
539     {
540       int line_no, insn_code_number = 0;
541
542       desc = read_md_rtx (&line_no, &insn_code_number);
543       if (desc == NULL)
544         break;
545
546       if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
547         gen_insn (desc);
548     }
549
550   puts ("\
551 \n\
552 #ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC\n\
553   /* This flag says the same insns that convert to a signed fixnum\n\
554      also convert validly to an unsigned one.  */\n\
555   for (i = 0; i < NUM_MACHINE_MODES; i++)\n\
556     for (j = 0; j < NUM_MACHINE_MODES; j++)\n\
557       set_convert_optab_handler\n\
558         (ufixtrunc_optab, (enum machine_mode) i, (enum machine_mode) j,\n\
559          convert_optab_handler (sfixtrunc_optab, (enum machine_mode) i,\n\
560                                                  (enum machine_mode) j));\n\
561 #endif\n\
562 }");
563
564   fflush (stdout);
565   return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
566 }