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 Free Software Foundation, Inc.
4
5This file is part of GCC.
6
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.
11
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.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING.  If not, write to the Free
19Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2002110-1301, USA.  */
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 consecutive
50   widths in the same mode class (e.g, QImode and HImode).  $I means that
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.
56
57   For some optabs, we store the operation by RTL codes.  These are only
58   used for comparisons.  In that case, $c and $C are the lower-case and
59   upper-case forms of the comparison, respectively.  */
60
61static const char * const optabs[] =
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$)",
71  "add_optab->handlers[$A].insn_code = CODE_FOR_$(add$P$a3$)",
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$)",
75  "sub_optab->handlers[$A].insn_code = CODE_FOR_$(sub$P$a3$)",
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$)",
79  "smul_optab->handlers[$A].insn_code = CODE_FOR_$(mul$P$a3$)",
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$)",
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",
87  "usmul_widen_optab->handlers[$B].insn_code = CODE_FOR_$(usmul$a$b3$)$N",
88  "sdiv_optab->handlers[$A].insn_code = CODE_FOR_$(div$a3$)",
89  "sdivv_optab->handlers[$A].insn_code = CODE_FOR_$(div$V$I$a3$)",
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$)",
95  "fmod_optab->handlers[$A].insn_code = CODE_FOR_$(fmod$a3$)",
96  "drem_optab->handlers[$A].insn_code = CODE_FOR_$(drem$a3$)",
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$)",
106  "smin_optab->handlers[$A].insn_code = CODE_FOR_$(smin$a3$)",
107  "smax_optab->handlers[$A].insn_code = CODE_FOR_$(smax$a3$)",
108  "umin_optab->handlers[$A].insn_code = CODE_FOR_$(umin$I$a3$)",
109  "umax_optab->handlers[$A].insn_code = CODE_FOR_$(umax$I$a3$)",
110  "pow_optab->handlers[$A].insn_code = CODE_FOR_$(pow$a3$)",
111  "atan2_optab->handlers[$A].insn_code = CODE_FOR_$(atan2$a3$)",
112  "neg_optab->handlers[$A].insn_code = CODE_FOR_$(neg$P$a2$)",
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$)",
116  "abs_optab->handlers[$A].insn_code = CODE_FOR_$(abs$P$a2$)",
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$)",
120  "copysign_optab->handlers[$A].insn_code = CODE_FOR_$(copysign$F$a3$)",
121  "sqrt_optab->handlers[$A].insn_code = CODE_FOR_$(sqrt$a2$)",
122  "floor_optab->handlers[$A].insn_code = CODE_FOR_$(floor$a2$)",
123  "lfloor_optab->handlers[$A].insn_code = CODE_FOR_$(lfloor$a2$)",
124  "ceil_optab->handlers[$A].insn_code = CODE_FOR_$(ceil$a2$)",
125  "lceil_optab->handlers[$A].insn_code = CODE_FOR_$(lceil$a2$)",
126  "round_optab->handlers[$A].insn_code = CODE_FOR_$(round$a2$)",
127  "btrunc_optab->handlers[$A].insn_code = CODE_FOR_$(btrunc$a2$)",
128  "nearbyint_optab->handlers[$A].insn_code = CODE_FOR_$(nearbyint$a2$)",
129  "rint_optab->handlers[$A].insn_code = CODE_FOR_$(rint$a2$)",
130  "lrint_optab->handlers[$A].insn_code = CODE_FOR_$(lrint$a2$)",
131  "sincos_optab->handlers[$A].insn_code = CODE_FOR_$(sincos$a3$)",
132  "sin_optab->handlers[$A].insn_code = CODE_FOR_$(sin$a2$)",
133  "asin_optab->handlers[$A].insn_code = CODE_FOR_$(asin$a2$)",
134  "cos_optab->handlers[$A].insn_code = CODE_FOR_$(cos$a2$)",
135  "acos_optab->handlers[$A].insn_code = CODE_FOR_$(acos$a2$)",
136  "exp_optab->handlers[$A].insn_code = CODE_FOR_$(exp$a2$)",
137  "exp10_optab->handlers[$A].insn_code = CODE_FOR_$(exp10$a2$)",
138  "exp2_optab->handlers[$A].insn_code = CODE_FOR_$(exp2$a2$)",
139  "expm1_optab->handlers[$A].insn_code = CODE_FOR_$(expm1$a2$)",
140  "ldexp_optab->handlers[$A].insn_code = CODE_FOR_$(ldexp$a3$)",
141  "logb_optab->handlers[$A].insn_code = CODE_FOR_$(logb$a2$)",
142  "ilogb_optab->handlers[$A].insn_code = CODE_FOR_$(ilogb$a2$)",
143  "log_optab->handlers[$A].insn_code = CODE_FOR_$(log$a2$)",
144  "log10_optab->handlers[$A].insn_code = CODE_FOR_$(log10$a2$)",
145  "log2_optab->handlers[$A].insn_code = CODE_FOR_$(log2$a2$)",
146  "log1p_optab->handlers[$A].insn_code = CODE_FOR_$(log1p$a2$)",
147  "tan_optab->handlers[$A].insn_code = CODE_FOR_$(tan$a2$)",
148  "atan_optab->handlers[$A].insn_code = CODE_FOR_$(atan$a2$)",
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  "bswap_optab->handlers[$A].insn_code = CODE_FOR_$(bswap$a2$)",
152  "ffs_optab->handlers[$A].insn_code = CODE_FOR_$(ffs$a2$)",
153  "clz_optab->handlers[$A].insn_code = CODE_FOR_$(clz$a2$)",
154  "ctz_optab->handlers[$A].insn_code = CODE_FOR_$(ctz$a2$)",
155  "popcount_optab->handlers[$A].insn_code = CODE_FOR_$(popcount$a2$)",
156  "parity_optab->handlers[$A].insn_code = CODE_FOR_$(parity$a2$)",
157  "mov_optab->handlers[$A].insn_code = CODE_FOR_$(mov$a$)",
158  "movstrict_optab->handlers[$A].insn_code = CODE_FOR_$(movstrict$a$)",
159  "movmisalign_optab->handlers[$A].insn_code = CODE_FOR_$(movmisalign$a$)",
160  "cmp_optab->handlers[$A].insn_code = CODE_FOR_$(cmp$a$)",
161  "tst_optab->handlers[$A].insn_code = CODE_FOR_$(tst$a$)",
162  "addcc_optab->handlers[$A].insn_code = CODE_FOR_$(add$acc$)",
163  "bcc_gen_fctn[$C] = gen_$(b$c$)",
164  "setcc_gen_code[$C] = CODE_FOR_$(s$c$)",
165  "movcc_gen_code[$A] = CODE_FOR_$(mov$acc$)",
166  "cbranch_optab->handlers[$A].insn_code = CODE_FOR_$(cbranch$a4$)",
167  "cmov_optab->handlers[$A].insn_code = CODE_FOR_$(cmov$a6$)",
168  "cstore_optab->handlers[$A].insn_code = CODE_FOR_$(cstore$a4$)",
169  "push_optab->handlers[$A].insn_code = CODE_FOR_$(push$a1$)",
170  "reload_in_optab[$A] = CODE_FOR_$(reload_in$a$)",
171  "reload_out_optab[$A] = CODE_FOR_$(reload_out$a$)",
172  "movmem_optab[$A] = CODE_FOR_$(movmem$a$)",
173  "cmpstr_optab[$A] = CODE_FOR_$(cmpstr$a$)",
174  "cmpstrn_optab[$A] = CODE_FOR_$(cmpstrn$a$)",
175  "cmpmem_optab[$A] = CODE_FOR_$(cmpmem$a$)",
176  "setmem_optab[$A] = CODE_FOR_$(setmem$a$)",
177  "sync_add_optab[$A] = CODE_FOR_$(sync_add$I$a$)",
178  "sync_sub_optab[$A] = CODE_FOR_$(sync_sub$I$a$)",
179  "sync_ior_optab[$A] = CODE_FOR_$(sync_ior$I$a$)",
180  "sync_and_optab[$A] = CODE_FOR_$(sync_and$I$a$)",
181  "sync_xor_optab[$A] = CODE_FOR_$(sync_xor$I$a$)",
182  "sync_nand_optab[$A] = CODE_FOR_$(sync_nand$I$a$)",
183  "sync_old_add_optab[$A] = CODE_FOR_$(sync_old_add$I$a$)",
184  "sync_old_sub_optab[$A] = CODE_FOR_$(sync_old_sub$I$a$)",
185  "sync_old_ior_optab[$A] = CODE_FOR_$(sync_old_ior$I$a$)",
186  "sync_old_and_optab[$A] = CODE_FOR_$(sync_old_and$I$a$)",
187  "sync_old_xor_optab[$A] = CODE_FOR_$(sync_old_xor$I$a$)",
188  "sync_old_nand_optab[$A] = CODE_FOR_$(sync_old_nand$I$a$)",
189  "sync_new_add_optab[$A] = CODE_FOR_$(sync_new_add$I$a$)",
190  "sync_new_sub_optab[$A] = CODE_FOR_$(sync_new_sub$I$a$)",
191  "sync_new_ior_optab[$A] = CODE_FOR_$(sync_new_ior$I$a$)",
192  "sync_new_and_optab[$A] = CODE_FOR_$(sync_new_and$I$a$)",
193  "sync_new_xor_optab[$A] = CODE_FOR_$(sync_new_xor$I$a$)",
194  "sync_new_nand_optab[$A] = CODE_FOR_$(sync_new_nand$I$a$)",
195  "sync_compare_and_swap[$A] = CODE_FOR_$(sync_compare_and_swap$I$a$)",
196  "sync_compare_and_swap_cc[$A] = CODE_FOR_$(sync_compare_and_swap_cc$I$a$)",
197  "sync_lock_test_and_set[$A] = CODE_FOR_$(sync_lock_test_and_set$I$a$)",
198  "sync_lock_release[$A] = CODE_FOR_$(sync_lock_release$I$a$)",
199  "vec_set_optab->handlers[$A].insn_code = CODE_FOR_$(vec_set$a$)",
200  "vec_extract_optab->handlers[$A].insn_code = CODE_FOR_$(vec_extract$a$)",
201  "vec_init_optab->handlers[$A].insn_code = CODE_FOR_$(vec_init$a$)",
202  "vec_shl_optab->handlers[$A].insn_code = CODE_FOR_$(vec_shl_$a$)",
203  "vec_shr_optab->handlers[$A].insn_code = CODE_FOR_$(vec_shr_$a$)",
204  "vec_realign_load_optab->handlers[$A].insn_code = CODE_FOR_$(vec_realign_load_$a$)",
205  "vcond_gen_code[$A] = CODE_FOR_$(vcond$a$)",
206  "vcondu_gen_code[$A] = CODE_FOR_$(vcondu$a$)",
207  "ssum_widen_optab->handlers[$A].insn_code = CODE_FOR_$(widen_ssum$I$a3$)",
208  "usum_widen_optab->handlers[$A].insn_code = CODE_FOR_$(widen_usum$I$a3$)",
209  "udot_prod_optab->handlers[$A].insn_code = CODE_FOR_$(udot_prod$I$a$)",
210  "sdot_prod_optab->handlers[$A].insn_code = CODE_FOR_$(sdot_prod$I$a$)",
211  "reduc_smax_optab->handlers[$A].insn_code = CODE_FOR_$(reduc_smax_$a$)",
212  "reduc_umax_optab->handlers[$A].insn_code = CODE_FOR_$(reduc_umax_$a$)",
213  "reduc_smin_optab->handlers[$A].insn_code = CODE_FOR_$(reduc_smin_$a$)",
214  "reduc_umin_optab->handlers[$A].insn_code = CODE_FOR_$(reduc_umin_$a$)",
215  "reduc_splus_optab->handlers[$A].insn_code = CODE_FOR_$(reduc_splus_$a$)" ,
216  "reduc_uplus_optab->handlers[$A].insn_code = CODE_FOR_$(reduc_uplus_$a$)"
217};
218
219static void gen_insn (rtx);
220
221static void
222gen_insn (rtx insn)
223{
224  const char *name = XSTR (insn, 0);
225  int m1 = 0, m2 = 0, op = 0;
226  size_t pindex;
227  int i;
228  const char *np, *pp, *p, *q;
229
230  /* Don't mention instructions whose names are the null string.
231     They are in the machine description just to be recognized.  */
232  if (*name == 0)
233    return;
234
235  /* See if NAME matches one of the patterns we have for the optabs we know
236     about.  */
237
238  for (pindex = 0; pindex < ARRAY_SIZE (optabs); pindex++)
239    {
240      int force_float = 0, force_int = 0, force_partial_int = 0;
241      int force_consec = 0;
242      int matches = 1;
243
244      for (pp = optabs[pindex]; pp[0] != '$' || pp[1] != '('; pp++)
245	;
246
247      for (pp += 2, np = name; matches && ! (pp[0] == '$' && pp[1] == ')');
248	   pp++)
249	{
250	  if (*pp != '$')
251	    {
252	      if (*pp != *np++)
253		break;
254	    }
255	  else
256	    switch (*++pp)
257	      {
258	      case 'N':
259		force_consec = 1;
260		break;
261	      case 'I':
262		force_int = 1;
263		break;
264	      case 'P':
265                force_partial_int = 1;
266                break;
267	      case 'F':
268		force_float = 1;
269		break;
270	      case 'V':
271                break;
272	      case 'c':
273		for (op = 0; op < NUM_RTX_CODE; op++)
274		  {
275		    for (p = GET_RTX_NAME(op), q = np; *p; p++, q++)
276		      if (*p != *q)
277			break;
278
279		    /* We have to be concerned about matching "gt" and
280		       missing "gtu", e.g., so verify we have reached the
281		       end of thing we are to match.  */
282		    if (*p == 0 && *q == 0
283			&& (GET_RTX_CLASS (op) == RTX_COMPARE
284			    || GET_RTX_CLASS (op) == RTX_COMM_COMPARE))
285		      break;
286		  }
287
288		if (op == NUM_RTX_CODE)
289		  matches = 0;
290		else
291		  np += strlen (GET_RTX_NAME(op));
292		break;
293	      case 'a':
294	      case 'b':
295		/* This loop will stop at the first prefix match, so
296                   look through the modes in reverse order, in case
297                   there are extra CC modes and CC is a prefix of the
298                   CC modes (as it should be).  */
299		for (i = (MAX_MACHINE_MODE) - 1; i >= 0; i--)
300		  {
301		    for (p = GET_MODE_NAME(i), q = np; *p; p++, q++)
302		      if (TOLOWER (*p) != *q)
303			break;
304
305		    if (*p == 0
306			&& (! force_int || mode_class[i] == MODE_INT
307			    || mode_class[i] == MODE_VECTOR_INT)
308		        && (! force_partial_int
309                            || mode_class[i] == MODE_INT
310                            || mode_class[i] == MODE_PARTIAL_INT
311			    || mode_class[i] == MODE_VECTOR_INT)
312			&& (! force_float
313			    || mode_class[i] == MODE_FLOAT
314			    || mode_class[i] == MODE_DECIMAL_FLOAT
315			    || mode_class[i] == MODE_COMPLEX_FLOAT
316			    || mode_class[i] == MODE_VECTOR_FLOAT))
317		      break;
318		  }
319
320		if (i < 0)
321		  matches = 0;
322		else if (*pp == 'a')
323		  m1 = i, np += strlen (GET_MODE_NAME(i));
324		else
325		  m2 = i, np += strlen (GET_MODE_NAME(i));
326
327		force_int = force_partial_int = force_float = 0;
328		break;
329
330	      default:
331		gcc_unreachable ();
332	      }
333	}
334
335      if (matches && pp[0] == '$' && pp[1] == ')'
336	  && *np == 0
337	  && (! force_consec || (int) GET_MODE_WIDER_MODE(m1) == m2))
338	break;
339    }
340
341  if (pindex == ARRAY_SIZE (optabs))
342    return;
343
344  /* We found a match.  If this pattern is only conditionally present,
345     write out the "if" and two extra blanks.  */
346
347  if (*XSTR (insn, 2) != 0)
348    printf ("  if (HAVE_%s)\n  ", name);
349
350  printf ("  ");
351
352  /* Now write out the initialization, making all required substitutions.  */
353  for (pp = optabs[pindex]; *pp; pp++)
354    {
355      if (*pp != '$')
356	putchar (*pp);
357      else
358	switch (*++pp)
359	  {
360	  case '(':  case ')':
361	  case 'I':  case 'F':  case 'N':
362	    break;
363	  case 'V':
364	    if (SCALAR_FLOAT_MODE_P (m1))
365              printf ("v");
366            break;
367	  case 'a':
368	    for (np = GET_MODE_NAME(m1); *np; np++)
369	      putchar (TOLOWER (*np));
370	    break;
371	  case 'b':
372	    for (np = GET_MODE_NAME(m2); *np; np++)
373	      putchar (TOLOWER (*np));
374	    break;
375	  case 'A':
376	    printf ("%smode", GET_MODE_NAME(m1));
377	    break;
378	  case 'B':
379	    printf ("%smode", GET_MODE_NAME(m2));
380	    break;
381	  case 'c':
382	    printf ("%s", GET_RTX_NAME(op));
383	    break;
384	  case 'C':
385	    for (np = GET_RTX_NAME(op); *np; np++)
386	      putchar (TOUPPER (*np));
387	    break;
388	  }
389    }
390
391  printf (";\n");
392}
393
394extern int main (int, char **);
395
396int
397main (int argc, char **argv)
398{
399  rtx desc;
400
401  progname = "genopinit";
402
403  if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
404    return (FATAL_EXIT_CODE);
405
406  printf ("/* Generated automatically by the program `genopinit'\n\
407from the machine description file `md'.  */\n\n");
408
409  printf ("#include \"config.h\"\n");
410  printf ("#include \"system.h\"\n");
411  printf ("#include \"coretypes.h\"\n");
412  printf ("#include \"tm.h\"\n");
413  printf ("#include \"rtl.h\"\n");
414  printf ("#include \"flags.h\"\n");
415  printf ("#include \"insn-config.h\"\n");
416  printf ("#include \"recog.h\"\n");
417  printf ("#include \"expr.h\"\n");
418  printf ("#include \"optabs.h\"\n");
419  printf ("#include \"reload.h\"\n\n");
420
421  printf ("void\ninit_all_optabs (void)\n{\n");
422
423  puts ("\
424#ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC\n\
425  int i, j;\n\
426#endif\n");
427
428  /* Read the machine description.  */
429
430  while (1)
431    {
432      int line_no, insn_code_number = 0;
433
434      desc = read_md_rtx (&line_no, &insn_code_number);
435      if (desc == NULL)
436	break;
437
438      if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
439	gen_insn (desc);
440    }
441
442  puts ("\
443\n\
444#ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC\n\
445  /* This flag says the same insns that convert to a signed fixnum\n\
446     also convert validly to an unsigned one.  */\n\
447  for (i = 0; i < NUM_MACHINE_MODES; i++)\n\
448    for (j = 0; j < NUM_MACHINE_MODES; j++)\n\
449      ufixtrunc_optab->handlers[i][j].insn_code\n\
450      = sfixtrunc_optab->handlers[i][j].insn_code;\n\
451#endif\n\
452}");
453
454  fflush (stdout);
455  return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
456}
457