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