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