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  "ffs_optab->handlers[$A].insn_code = CODE_FOR_$(ffs$a2$)",
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$)",
156  "mov_optab->handlers[$A].insn_code = CODE_FOR_$(mov$a$)",
157  "movstrict_optab->handlers[$A].insn_code = CODE_FOR_$(movstrict$a$)",
158  "movmisalign_optab->handlers[$A].insn_code = CODE_FOR_$(movmisalign$a$)",
159  "cmp_optab->handlers[$A].insn_code = CODE_FOR_$(cmp$a$)",
160  "tst_optab->handlers[$A].insn_code = CODE_FOR_$(tst$a$)",
161  "addcc_optab->handlers[$A].insn_code = CODE_FOR_$(add$acc$)",
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$)",
168  "push_optab->handlers[$A].insn_code = CODE_FOR_$(push$a1$)",
169  "reload_in_optab[$A] = CODE_FOR_$(reload_in$a$)",
170  "reload_out_optab[$A] = CODE_FOR_$(reload_out$a$)",
171  "movmem_optab[$A] = CODE_FOR_$(movmem$a$)",
172  "cmpstr_optab[$A] = CODE_FOR_$(cmpstr$a$)",
173  "cmpstrn_optab[$A] = CODE_FOR_$(cmpstrn$a$)",
174  "cmpmem_optab[$A] = CODE_FOR_$(cmpmem$a$)",
175  "setmem_optab[$A] = CODE_FOR_$(setmem$a$)",
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$)",
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$)",
200  "vec_init_optab->handlers[$A].insn_code = CODE_FOR_$(vec_init$a$)",
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$)",
203  "vec_realign_load_optab->handlers[$A].insn_code = CODE_FOR_$(vec_realign_load_$a$)",
204  "vcond_gen_code[$A] = CODE_FOR_$(vcond$a$)",
205  "vcondu_gen_code[$A] = CODE_FOR_$(vcondu$a$)",
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$)",
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$)",
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$)"
216};
217
218static void gen_insn (rtx);
219
220static void
221gen_insn (rtx insn)
222{
223  const char *name = XSTR (insn, 0);
224  int m1 = 0, m2 = 0, op = 0;
225  size_t pindex;
226  int i;
227  const char *np, *pp, *p, *q;
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
237  for (pindex = 0; pindex < ARRAY_SIZE (optabs); pindex++)
238    {
239      int force_float = 0, force_int = 0, force_partial_int = 0;
240      int force_consec = 0;
241      int matches = 1;
242
243      for (pp = optabs[pindex]; pp[0] != '$' || pp[1] != '('; pp++)
244	;
245
246      for (pp += 2, np = name; matches && ! (pp[0] == '$' && pp[1] == ')');
247	   pp++)
248	{
249	  if (*pp != '$')
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;
263	      case 'P':
264                force_partial_int = 1;
265                break;
266	      case 'F':
267		force_float = 1;
268		break;
269	      case 'V':
270                break;
271	      case 'c':
272		for (op = 0; op < NUM_RTX_CODE; op++)
273		  {
274		    for (p = GET_RTX_NAME(op), q = np; *p; p++, q++)
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
280		       end of thing we are to match.  */
281		    if (*p == 0 && *q == 0
282			&& (GET_RTX_CLASS (op) == RTX_COMPARE
283			    || GET_RTX_CLASS (op) == RTX_COMM_COMPARE))
284		      break;
285		  }
286
287		if (op == NUM_RTX_CODE)
288		  matches = 0;
289		else
290		  np += strlen (GET_RTX_NAME(op));
291		break;
292	      case 'a':
293	      case 'b':
294		/* This loop will stop at the first prefix match, so
295                   look through the modes in reverse order, in case
296                   there are extra CC modes and CC is a prefix of the
297                   CC modes (as it should be).  */
298		for (i = (MAX_MACHINE_MODE) - 1; i >= 0; i--)
299		  {
300		    for (p = GET_MODE_NAME(i), q = np; *p; p++, q++)
301		      if (TOLOWER (*p) != *q)
302			break;
303
304		    if (*p == 0
305			&& (! force_int || mode_class[i] == MODE_INT
306			    || mode_class[i] == MODE_VECTOR_INT)
307		        && (! force_partial_int
308                            || mode_class[i] == MODE_INT
309                            || mode_class[i] == MODE_PARTIAL_INT
310			    || mode_class[i] == MODE_VECTOR_INT)
311			&& (! force_float
312			    || mode_class[i] == MODE_FLOAT
313			    || mode_class[i] == MODE_DECIMAL_FLOAT
314			    || mode_class[i] == MODE_COMPLEX_FLOAT
315			    || mode_class[i] == MODE_VECTOR_FLOAT))
316		      break;
317		  }
318
319		if (i < 0)
320		  matches = 0;
321		else if (*pp == 'a')
322		  m1 = i, np += strlen (GET_MODE_NAME(i));
323		else
324		  m2 = i, np += strlen (GET_MODE_NAME(i));
325
326		force_int = force_partial_int = force_float = 0;
327		break;
328
329	      default:
330		gcc_unreachable ();
331	      }
332	}
333
334      if (matches && pp[0] == '$' && pp[1] == ')'
335	  && *np == 0
336	  && (! force_consec || (int) GET_MODE_WIDER_MODE(m1) == m2))
337	break;
338    }
339
340  if (pindex == ARRAY_SIZE (optabs))
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    {
354      if (*pp != '$')
355	putchar (*pp);
356      else
357	switch (*++pp)
358	  {
359	  case '(':  case ')':
360	  case 'I':  case 'F':  case 'N':
361	    break;
362	  case 'V':
363	    if (SCALAR_FLOAT_MODE_P (m1))
364              printf ("v");
365            break;
366	  case 'a':
367	    for (np = GET_MODE_NAME(m1); *np; np++)
368	      putchar (TOLOWER (*np));
369	    break;
370	  case 'b':
371	    for (np = GET_MODE_NAME(m2); *np; np++)
372	      putchar (TOLOWER (*np));
373	    break;
374	  case 'A':
375	    printf ("%smode", GET_MODE_NAME(m1));
376	    break;
377	  case 'B':
378	    printf ("%smode", GET_MODE_NAME(m2));
379	    break;
380	  case 'c':
381	    printf ("%s", GET_RTX_NAME(op));
382	    break;
383	  case 'C':
384	    for (np = GET_RTX_NAME(op); *np; np++)
385	      putchar (TOUPPER (*np));
386	    break;
387	  }
388    }
389
390  printf (";\n");
391}
392
393extern int main (int, char **);
394
395int
396main (int argc, char **argv)
397{
398  rtx desc;
399
400  progname = "genopinit";
401
402  if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
403    return (FATAL_EXIT_CODE);
404
405  printf ("/* Generated automatically by the program `genopinit'\n\
406from the machine description file `md'.  */\n\n");
407
408  printf ("#include \"config.h\"\n");
409  printf ("#include \"system.h\"\n");
410  printf ("#include \"coretypes.h\"\n");
411  printf ("#include \"tm.h\"\n");
412  printf ("#include \"rtl.h\"\n");
413  printf ("#include \"flags.h\"\n");
414  printf ("#include \"insn-config.h\"\n");
415  printf ("#include \"recog.h\"\n");
416  printf ("#include \"expr.h\"\n");
417  printf ("#include \"optabs.h\"\n");
418  printf ("#include \"reload.h\"\n\n");
419
420  printf ("void\ninit_all_optabs (void)\n{\n");
421
422  puts ("\
423#ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC\n\
424  int i, j;\n\
425#endif\n");
426
427  /* Read the machine description.  */
428
429  while (1)
430    {
431      int line_no, insn_code_number = 0;
432
433      desc = read_md_rtx (&line_no, &insn_code_number);
434      if (desc == NULL)
435	break;
436
437      if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
438	gen_insn (desc);
439    }
440
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}");
452
453  fflush (stdout);
454  return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
455}
456