xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/genmodes.c (revision 796c32c94f6e154afc9de0f63da35c91bb739b45)
1 /* Generate the machine mode enumeration and associated tables.
2    Copyright (C) 2003-2015 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #include "bconfig.h"
21 #include "system.h"
22 #include "errors.h"
23 #include "hashtab.h"
24 
25 /* enum mode_class is normally defined by machmode.h but we can't
26    include that header here.  */
27 #include "mode-classes.def"
28 
29 #define DEF_MODE_CLASS(M) M
30 enum mode_class { MODE_CLASSES, MAX_MODE_CLASS };
31 #undef DEF_MODE_CLASS
32 
33 /* Text names of mode classes, for output.  */
34 #define DEF_MODE_CLASS(M) #M
35 static const char *const mode_class_names[MAX_MODE_CLASS] =
36 {
37   MODE_CLASSES
38 };
39 #undef DEF_MODE_CLASS
40 #undef MODE_CLASSES
41 
42 #ifdef EXTRA_MODES_FILE
43 # define HAVE_EXTRA_MODES 1
44 #else
45 # define HAVE_EXTRA_MODES 0
46 # define EXTRA_MODES_FILE ""
47 #endif
48 
49 /* Data structure for building up what we know about a mode.
50    They're clustered by mode class.  */
51 struct mode_data
52 {
53   struct mode_data *next;	/* next this class - arbitrary order */
54 
55   const char *name;		/* printable mode name -- SI, not SImode */
56   enum mode_class cl;		/* this mode class */
57   unsigned int precision;	/* size in bits, equiv to TYPE_PRECISION */
58   unsigned int bytesize;	/* storage size in addressable units */
59   unsigned int ncomponents;	/* number of subunits */
60   unsigned int alignment;	/* mode alignment */
61   const char *format;		/* floating point format - float modes only */
62 
63   struct mode_data *component;	/* mode of components */
64   struct mode_data *wider;	/* next wider mode */
65 
66   struct mode_data *contained;  /* Pointer to list of modes that have
67 				   this mode as a component.  */
68   struct mode_data *next_cont;  /* Next mode in that list.  */
69 
70   const char *file;		/* file and line of definition, */
71   unsigned int line;		/* for error reporting */
72   unsigned int counter;		/* Rank ordering of modes */
73   unsigned int ibit;		/* the number of integral bits */
74   unsigned int fbit;		/* the number of fractional bits */
75   bool need_bytesize_adj;	/* true if this mode need dynamic size
76 				   adjustment */
77   unsigned int int_n;		/* If nonzero, then __int<INT_N> will be defined */
78 };
79 
80 static struct mode_data *modes[MAX_MODE_CLASS];
81 static unsigned int n_modes[MAX_MODE_CLASS];
82 static struct mode_data *void_mode;
83 
84 static const struct mode_data blank_mode = {
85   0, "<unknown>", MAX_MODE_CLASS,
86   -1U, -1U, -1U, -1U,
87   0, 0, 0, 0, 0,
88   "<unknown>", 0, 0, 0, 0, false, 0
89 };
90 
91 static htab_t modes_by_name;
92 
93 /* Data structure for recording target-specified runtime adjustments
94    to a particular mode.  We support varying the byte size, the
95    alignment, and the floating point format.  */
96 struct mode_adjust
97 {
98   struct mode_adjust *next;
99   struct mode_data *mode;
100   const char *adjustment;
101 
102   const char *file;
103   unsigned int line;
104 };
105 
106 static struct mode_adjust *adj_bytesize;
107 static struct mode_adjust *adj_alignment;
108 static struct mode_adjust *adj_format;
109 static struct mode_adjust *adj_ibit;
110 static struct mode_adjust *adj_fbit;
111 
112 /* Mode class operations.  */
113 static enum mode_class
114 complex_class (enum mode_class c)
115 {
116   switch (c)
117     {
118     case MODE_INT: return MODE_COMPLEX_INT;
119     case MODE_FLOAT: return MODE_COMPLEX_FLOAT;
120     default:
121       error ("no complex class for class %s", mode_class_names[c]);
122       return MODE_RANDOM;
123     }
124 }
125 
126 static enum mode_class
127 vector_class (enum mode_class cl)
128 {
129   switch (cl)
130     {
131     case MODE_INT: return MODE_VECTOR_INT;
132     case MODE_FLOAT: return MODE_VECTOR_FLOAT;
133     case MODE_FRACT: return MODE_VECTOR_FRACT;
134     case MODE_UFRACT: return MODE_VECTOR_UFRACT;
135     case MODE_ACCUM: return MODE_VECTOR_ACCUM;
136     case MODE_UACCUM: return MODE_VECTOR_UACCUM;
137     default:
138       error ("no vector class for class %s", mode_class_names[cl]);
139       return MODE_RANDOM;
140     }
141 }
142 
143 /* Utility routines.  */
144 static inline struct mode_data *
145 find_mode (const char *name)
146 {
147   struct mode_data key;
148 
149   key.name = name;
150   return (struct mode_data *) htab_find (modes_by_name, &key);
151 }
152 
153 static struct mode_data *
154 new_mode (enum mode_class cl, const char *name,
155 	  const char *file, unsigned int line)
156 {
157   struct mode_data *m;
158   static unsigned int count = 0;
159 
160   m = find_mode (name);
161   if (m)
162     {
163       error ("%s:%d: duplicate definition of mode \"%s\"",
164 	     trim_filename (file), line, name);
165       error ("%s:%d: previous definition here", m->file, m->line);
166       return m;
167     }
168 
169   m = XNEW (struct mode_data);
170   memcpy (m, &blank_mode, sizeof (struct mode_data));
171   m->cl = cl;
172   m->name = name;
173   if (file)
174     m->file = trim_filename (file);
175   m->line = line;
176   m->counter = count++;
177 
178   m->next = modes[cl];
179   modes[cl] = m;
180   n_modes[cl]++;
181 
182   *htab_find_slot (modes_by_name, m, INSERT) = m;
183 
184   return m;
185 }
186 
187 static hashval_t
188 hash_mode (const void *p)
189 {
190   const struct mode_data *m = (const struct mode_data *)p;
191   return htab_hash_string (m->name);
192 }
193 
194 static int
195 eq_mode (const void *p, const void *q)
196 {
197   const struct mode_data *a = (const struct mode_data *)p;
198   const struct mode_data *b = (const struct mode_data *)q;
199 
200   return !strcmp (a->name, b->name);
201 }
202 
203 #define for_all_modes(C, M)			\
204   for (C = 0; C < MAX_MODE_CLASS; C++)		\
205     for (M = modes[C]; M; M = M->next)
206 
207 static void ATTRIBUTE_UNUSED
208 new_adjust (const char *name,
209 	    struct mode_adjust **category, const char *catname,
210 	    const char *adjustment,
211 	    enum mode_class required_class_from,
212 	    enum mode_class required_class_to,
213 	    const char *file, unsigned int line)
214 {
215   struct mode_data *mode = find_mode (name);
216   struct mode_adjust *a;
217 
218   file = trim_filename (file);
219 
220   if (!mode)
221     {
222       error ("%s:%d: no mode \"%s\"", file, line, name);
223       return;
224     }
225 
226   if (required_class_from != MODE_RANDOM
227       && (mode->cl < required_class_from || mode->cl > required_class_to))
228     {
229       error ("%s:%d: mode \"%s\" is not among class {%s, %s}",
230 	     file, line, name, mode_class_names[required_class_from] + 5,
231 	     mode_class_names[required_class_to] + 5);
232       return;
233     }
234 
235   for (a = *category; a; a = a->next)
236     if (a->mode == mode)
237       {
238 	error ("%s:%d: mode \"%s\" already has a %s adjustment",
239 	       file, line, name, catname);
240 	error ("%s:%d: previous adjustment here", a->file, a->line);
241 	return;
242       }
243 
244   a = XNEW (struct mode_adjust);
245   a->mode = mode;
246   a->adjustment = adjustment;
247   a->file = file;
248   a->line = line;
249 
250   a->next = *category;
251   *category = a;
252 }
253 
254 /* Diagnose failure to meet expectations in a partially filled out
255    mode structure.  */
256 enum requirement { SET, UNSET, OPTIONAL };
257 
258 #define validate_field_(mname, fname, req, val, unset, file, line) do {	\
259   switch (req)								\
260     {									\
261     case SET:								\
262       if (val == unset)							\
263 	error ("%s:%d: (%s) field %s must be set",			\
264 	       file, line, mname, fname);				\
265       break;								\
266     case UNSET:								\
267       if (val != unset)							\
268 	error ("%s:%d: (%s) field %s must not be set",			\
269 	       file, line, mname, fname);				\
270     case OPTIONAL:							\
271       break;								\
272     }									\
273 } while (0)
274 
275 #define validate_field(M, F) \
276   validate_field_(M->name, #F, r_##F, M->F, blank_mode.F, M->file, M->line)
277 
278 static void
279 validate_mode (struct mode_data *m,
280 	       enum requirement r_precision,
281 	       enum requirement r_bytesize,
282 	       enum requirement r_component,
283 	       enum requirement r_ncomponents,
284 	       enum requirement r_format)
285 {
286   validate_field (m, precision);
287   validate_field (m, bytesize);
288   validate_field (m, component);
289   validate_field (m, ncomponents);
290   validate_field (m, format);
291 }
292 #undef validate_field
293 #undef validate_field_
294 
295 /* Given a partially-filled-out mode structure, figure out what we can
296    and fill the rest of it in; die if it isn't enough.  */
297 static void
298 complete_mode (struct mode_data *m)
299 {
300   unsigned int alignment;
301 
302   if (!m->name)
303     {
304       error ("%s:%d: mode with no name", m->file, m->line);
305       return;
306     }
307   if (m->cl == MAX_MODE_CLASS)
308     {
309       error ("%s:%d: %smode has no mode class", m->file, m->line, m->name);
310       return;
311     }
312 
313   switch (m->cl)
314     {
315     case MODE_RANDOM:
316       /* Nothing more need be said.  */
317       if (!strcmp (m->name, "VOID"))
318 	void_mode = m;
319 
320       validate_mode (m, UNSET, UNSET, UNSET, UNSET, UNSET);
321 
322       m->precision = 0;
323       m->bytesize = 0;
324       m->ncomponents = 0;
325       m->component = 0;
326       break;
327 
328     case MODE_CC:
329       /* Again, nothing more need be said.  For historical reasons,
330 	 the size of a CC mode is four units.  */
331       validate_mode (m, UNSET, UNSET, UNSET, UNSET, UNSET);
332 
333       m->bytesize = 4;
334       m->ncomponents = 1;
335       m->component = 0;
336       break;
337 
338     case MODE_INT:
339     case MODE_POINTER_BOUNDS:
340     case MODE_FLOAT:
341     case MODE_DECIMAL_FLOAT:
342     case MODE_FRACT:
343     case MODE_UFRACT:
344     case MODE_ACCUM:
345     case MODE_UACCUM:
346       /* A scalar mode must have a byte size, may have a bit size,
347 	 and must not have components.   A float mode must have a
348          format.  */
349       validate_mode (m, OPTIONAL, SET, UNSET, UNSET,
350 		     (m->cl == MODE_FLOAT || m->cl == MODE_DECIMAL_FLOAT)
351 		     ? SET : UNSET);
352 
353       m->ncomponents = 1;
354       m->component = 0;
355       break;
356 
357     case MODE_PARTIAL_INT:
358       /* A partial integer mode uses ->component to say what the
359 	 corresponding full-size integer mode is, and may also
360 	 specify a bit size.  */
361       validate_mode (m, OPTIONAL, UNSET, SET, UNSET, UNSET);
362 
363       m->bytesize = m->component->bytesize;
364 
365       m->ncomponents = 1;
366       break;
367 
368     case MODE_COMPLEX_INT:
369     case MODE_COMPLEX_FLOAT:
370       /* Complex modes should have a component indicated, but no more.  */
371       validate_mode (m, UNSET, UNSET, SET, UNSET, UNSET);
372       m->ncomponents = 2;
373       if (m->component->precision != (unsigned int)-1)
374 	m->precision = 2 * m->component->precision;
375       m->bytesize = 2 * m->component->bytesize;
376       break;
377 
378     case MODE_VECTOR_INT:
379     case MODE_VECTOR_FLOAT:
380     case MODE_VECTOR_FRACT:
381     case MODE_VECTOR_UFRACT:
382     case MODE_VECTOR_ACCUM:
383     case MODE_VECTOR_UACCUM:
384       /* Vector modes should have a component and a number of components.  */
385       validate_mode (m, UNSET, UNSET, SET, SET, UNSET);
386       if (m->component->precision != (unsigned int)-1)
387 	m->precision = m->ncomponents * m->component->precision;
388       m->bytesize = m->ncomponents * m->component->bytesize;
389       break;
390 
391     default:
392       gcc_unreachable ();
393     }
394 
395   /* If not already specified, the mode alignment defaults to the largest
396      power of two that divides the size of the object.  Complex types are
397      not more aligned than their contents.  */
398   if (m->cl == MODE_COMPLEX_INT || m->cl == MODE_COMPLEX_FLOAT)
399     alignment = m->component->bytesize;
400   else
401     alignment = m->bytesize;
402 
403   m->alignment = alignment & (~alignment + 1);
404 
405   /* If this mode has components, make the component mode point back
406      to this mode, for the sake of adjustments.  */
407   if (m->component)
408     {
409       m->next_cont = m->component->contained;
410       m->component->contained = m;
411     }
412 }
413 
414 static void
415 complete_all_modes (void)
416 {
417   struct mode_data *m;
418   int cl;
419 
420   for_all_modes (cl, m)
421     complete_mode (m);
422 }
423 
424 /* For each mode in class CLASS, construct a corresponding complex mode.  */
425 #define COMPLEX_MODES(C) make_complex_modes (MODE_##C, __FILE__, __LINE__)
426 static void
427 make_complex_modes (enum mode_class cl,
428 		    const char *file, unsigned int line)
429 {
430   struct mode_data *m;
431   struct mode_data *c;
432   enum mode_class cclass = complex_class (cl);
433 
434   if (cclass == MODE_RANDOM)
435     return;
436 
437   for (m = modes[cl]; m; m = m->next)
438     {
439       char *p, *buf;
440       size_t m_len;
441 
442       /* Skip BImode.  FIXME: BImode probably shouldn't be MODE_INT.  */
443       if (m->precision == 1)
444 	continue;
445 
446       m_len = strlen (m->name);
447       /* The leading "1 +" is in case we prepend a "C" below.  */
448       buf = (char *) xmalloc (1 + m_len + 1);
449 
450       /* Float complex modes are named SCmode, etc.
451 	 Int complex modes are named CSImode, etc.
452          This inconsistency should be eliminated.  */
453       p = 0;
454       if (cl == MODE_FLOAT)
455 	{
456 	  memcpy (buf, m->name, m_len + 1);
457 	  p = strchr (buf, 'F');
458 	  if (p == 0 && strchr (buf, 'D') == 0)
459 	    {
460 	      error ("%s:%d: float mode \"%s\" has no 'F' or 'D'",
461 		     m->file, m->line, m->name);
462 	      free (buf);
463 	      continue;
464 	    }
465 	}
466       if (p != 0)
467 	*p = 'C';
468       else
469 	{
470 	  buf[0] = 'C';
471 	  memcpy (buf + 1, m->name, m_len + 1);
472 	}
473 
474       c = new_mode (cclass, buf, file, line);
475       c->component = m;
476     }
477 }
478 
479 /* For all modes in class CL, construct vector modes of width
480    WIDTH, having as many components as necessary.  */
481 #define VECTOR_MODES(C, W) make_vector_modes (MODE_##C, W, __FILE__, __LINE__)
482 static void ATTRIBUTE_UNUSED
483 make_vector_modes (enum mode_class cl, unsigned int width,
484 		   const char *file, unsigned int line)
485 {
486   struct mode_data *m;
487   struct mode_data *v;
488   char buf[8];
489   unsigned int ncomponents;
490   enum mode_class vclass = vector_class (cl);
491 
492   if (vclass == MODE_RANDOM)
493     return;
494 
495   for (m = modes[cl]; m; m = m->next)
496     {
497       /* Do not construct vector modes with only one element, or
498 	 vector modes where the element size doesn't divide the full
499 	 size evenly.  */
500       ncomponents = width / m->bytesize;
501       if (ncomponents < 2)
502 	continue;
503       if (width % m->bytesize)
504 	continue;
505 
506       /* Skip QFmode and BImode.  FIXME: this special case should
507 	 not be necessary.  */
508       if (cl == MODE_FLOAT && m->bytesize == 1)
509 	continue;
510       if (cl == MODE_INT && m->precision == 1)
511 	continue;
512 
513       if ((size_t)snprintf (buf, sizeof buf, "V%u%s", ncomponents, m->name)
514 	  >= sizeof buf)
515 	{
516 	  error ("%s:%d: mode name \"%s\" is too long",
517 		 m->file, m->line, m->name);
518 	  continue;
519 	}
520 
521       v = new_mode (vclass, xstrdup (buf), file, line);
522       v->component = m;
523       v->ncomponents = ncomponents;
524     }
525 }
526 
527 /* Input.  */
528 
529 #define _SPECIAL_MODE(C, N) \
530   make_special_mode (MODE_##C, #N, __FILE__, __LINE__)
531 #define RANDOM_MODE(N) _SPECIAL_MODE (RANDOM, N)
532 #define CC_MODE(N) _SPECIAL_MODE (CC, N)
533 
534 static void
535 make_special_mode (enum mode_class cl, const char *name,
536 		   const char *file, unsigned int line)
537 {
538   new_mode (cl, name, file, line);
539 }
540 
541 #define POINTER_BOUNDS_MODE(N, Y) \
542   make_pointer_bounds_mode (#N, Y, __FILE__, __LINE__)
543 
544 static void ATTRIBUTE_UNUSED
545 make_pointer_bounds_mode (const char *name,
546 			  unsigned int bytesize,
547 			  const char *file, unsigned int line)
548 {
549   struct mode_data *m = new_mode (MODE_POINTER_BOUNDS, name, file, line);
550   m->bytesize = bytesize;
551 }
552 
553 
554 #define INT_MODE(N, Y) FRACTIONAL_INT_MODE (N, -1U, Y)
555 #define FRACTIONAL_INT_MODE(N, B, Y) \
556   make_int_mode (#N, B, Y, __FILE__, __LINE__)
557 
558 static void
559 make_int_mode (const char *name,
560 	       unsigned int precision, unsigned int bytesize,
561 	       const char *file, unsigned int line)
562 {
563   struct mode_data *m = new_mode (MODE_INT, name, file, line);
564   m->bytesize = bytesize;
565   m->precision = precision;
566 }
567 
568 #define FRACT_MODE(N, Y, F) \
569 	make_fixed_point_mode (MODE_FRACT, #N, Y, 0, F, __FILE__, __LINE__)
570 
571 #define UFRACT_MODE(N, Y, F) \
572 	make_fixed_point_mode (MODE_UFRACT, #N, Y, 0, F, __FILE__, __LINE__)
573 
574 #define ACCUM_MODE(N, Y, I, F) \
575 	make_fixed_point_mode (MODE_ACCUM, #N, Y, I, F, __FILE__, __LINE__)
576 
577 #define UACCUM_MODE(N, Y, I, F) \
578 	make_fixed_point_mode (MODE_UACCUM, #N, Y, I, F, __FILE__, __LINE__)
579 
580 /* Create a fixed-point mode by setting CL, NAME, BYTESIZE, IBIT, FBIT,
581    FILE, and LINE.  */
582 
583 static void
584 make_fixed_point_mode (enum mode_class cl,
585 		       const char *name,
586 		       unsigned int bytesize,
587 		       unsigned int ibit,
588 		       unsigned int fbit,
589 		       const char *file, unsigned int line)
590 {
591   struct mode_data *m = new_mode (cl, name, file, line);
592   m->bytesize = bytesize;
593   m->ibit = ibit;
594   m->fbit = fbit;
595 }
596 
597 #define FLOAT_MODE(N, Y, F)             FRACTIONAL_FLOAT_MODE (N, -1U, Y, F)
598 #define FRACTIONAL_FLOAT_MODE(N, B, Y, F) \
599   make_float_mode (#N, B, Y, #F, __FILE__, __LINE__)
600 
601 static void
602 make_float_mode (const char *name,
603 		 unsigned int precision, unsigned int bytesize,
604 		 const char *format,
605 		 const char *file, unsigned int line)
606 {
607   struct mode_data *m = new_mode (MODE_FLOAT, name, file, line);
608   m->bytesize = bytesize;
609   m->precision = precision;
610   m->format = format;
611 }
612 
613 #define DECIMAL_FLOAT_MODE(N, Y, F)	\
614 	FRACTIONAL_DECIMAL_FLOAT_MODE (N, -1U, Y, F)
615 #define FRACTIONAL_DECIMAL_FLOAT_MODE(N, B, Y, F)	\
616   make_decimal_float_mode (#N, B, Y, #F, __FILE__, __LINE__)
617 
618 static void
619 make_decimal_float_mode (const char *name,
620 			 unsigned int precision, unsigned int bytesize,
621 			 const char *format,
622 			 const char *file, unsigned int line)
623 {
624   struct mode_data *m = new_mode (MODE_DECIMAL_FLOAT, name, file, line);
625   m->bytesize = bytesize;
626   m->precision = precision;
627   m->format = format;
628 }
629 
630 #define RESET_FLOAT_FORMAT(N, F) \
631   reset_float_format (#N, #F, __FILE__, __LINE__)
632 static void ATTRIBUTE_UNUSED
633 reset_float_format (const char *name, const char *format,
634 		    const char *file, unsigned int line)
635 {
636   struct mode_data *m = find_mode (name);
637   if (!m)
638     {
639       error ("%s:%d: no mode \"%s\"", file, line, name);
640       return;
641     }
642   if (m->cl != MODE_FLOAT && m->cl != MODE_DECIMAL_FLOAT)
643     {
644       error ("%s:%d: mode \"%s\" is not a FLOAT class", file, line, name);
645       return;
646     }
647   m->format = format;
648 }
649 
650 /* __intN support.  */
651 #define INT_N(M,PREC)				\
652   make_int_n (#M, PREC, __FILE__, __LINE__)
653 static void ATTRIBUTE_UNUSED
654 make_int_n (const char *m, int bitsize,
655             const char *file, unsigned int line)
656 {
657   struct mode_data *component = find_mode (m);
658   if (!component)
659     {
660       error ("%s:%d: no mode \"%s\"", file, line, m);
661       return;
662     }
663   if (component->cl != MODE_INT
664       && component->cl != MODE_PARTIAL_INT)
665     {
666       error ("%s:%d: mode \"%s\" is not class INT or PARTIAL_INT", file, line, m);
667       return;
668     }
669   if (component->int_n != 0)
670     {
671       error ("%s:%d: mode \"%s\" already has an intN", file, line, m);
672       return;
673     }
674 
675   component->int_n = bitsize;
676 }
677 
678 /* Partial integer modes are specified by relation to a full integer
679    mode.  */
680 #define PARTIAL_INT_MODE(M,PREC,NAME)				\
681   make_partial_integer_mode (#M, #NAME, PREC, __FILE__, __LINE__)
682 static void ATTRIBUTE_UNUSED
683 make_partial_integer_mode (const char *base, const char *name,
684 			   unsigned int precision,
685 			   const char *file, unsigned int line)
686 {
687   struct mode_data *m;
688   struct mode_data *component = find_mode (base);
689   if (!component)
690     {
691       error ("%s:%d: no mode \"%s\"", file, line, name);
692       return;
693     }
694   if (component->cl != MODE_INT)
695     {
696       error ("%s:%d: mode \"%s\" is not class INT", file, line, name);
697       return;
698     }
699 
700   m = new_mode (MODE_PARTIAL_INT, name, file, line);
701   m->precision = precision;
702   m->component = component;
703 }
704 
705 /* A single vector mode can be specified by naming its component
706    mode and the number of components.  */
707 #define VECTOR_MODE(C, M, N) \
708   make_vector_mode (MODE_##C, #M, N, __FILE__, __LINE__);
709 static void ATTRIBUTE_UNUSED
710 make_vector_mode (enum mode_class bclass,
711 		  const char *base,
712 		  unsigned int ncomponents,
713 		  const char *file, unsigned int line)
714 {
715   struct mode_data *v;
716   enum mode_class vclass = vector_class (bclass);
717   struct mode_data *component = find_mode (base);
718   char namebuf[16];
719 
720   if (vclass == MODE_RANDOM)
721     return;
722   if (component == 0)
723     {
724       error ("%s:%d: no mode \"%s\"", file, line, base);
725       return;
726     }
727   if (component->cl != bclass
728       && (component->cl != MODE_PARTIAL_INT
729 	  || bclass != MODE_INT))
730     {
731       error ("%s:%d: mode \"%s\" is not class %s",
732 	     file, line, base, mode_class_names[bclass] + 5);
733       return;
734     }
735 
736   if ((size_t)snprintf (namebuf, sizeof namebuf, "V%u%s",
737 			ncomponents, base) >= sizeof namebuf)
738     {
739       error ("%s:%d: mode name \"%s\" is too long",
740 	     file, line, base);
741       return;
742     }
743 
744   v = new_mode (vclass, xstrdup (namebuf), file, line);
745   v->ncomponents = ncomponents;
746   v->component = component;
747 }
748 
749 /* Adjustability.  */
750 #define _ADD_ADJUST(A, M, X, C1, C2) \
751   new_adjust (#M, &adj_##A, #A, #X, MODE_##C1, MODE_##C2, __FILE__, __LINE__)
752 
753 #define ADJUST_BYTESIZE(M, X)  _ADD_ADJUST (bytesize, M, X, RANDOM, RANDOM)
754 #define ADJUST_ALIGNMENT(M, X) _ADD_ADJUST (alignment, M, X, RANDOM, RANDOM)
755 #define ADJUST_FLOAT_FORMAT(M, X)    _ADD_ADJUST (format, M, X, FLOAT, FLOAT)
756 #define ADJUST_IBIT(M, X)  _ADD_ADJUST (ibit, M, X, ACCUM, UACCUM)
757 #define ADJUST_FBIT(M, X)  _ADD_ADJUST (fbit, M, X, FRACT, UACCUM)
758 
759 static int bits_per_unit;
760 static int max_bitsize_mode_any_int;
761 
762 static void
763 create_modes (void)
764 {
765 #include "machmode.def"
766 
767   /* So put the default value unless the target needs a non standard
768      value. */
769 #ifdef BITS_PER_UNIT
770   bits_per_unit = BITS_PER_UNIT;
771 #else
772   bits_per_unit = 8;
773 #endif
774 
775 #ifdef MAX_BITSIZE_MODE_ANY_INT
776   max_bitsize_mode_any_int = MAX_BITSIZE_MODE_ANY_INT;
777 #else
778   max_bitsize_mode_any_int = 0;
779 #endif
780 }
781 
782 /* Processing.  */
783 
784 /* Sort a list of modes into the order needed for the WIDER field:
785    major sort by precision, minor sort by component precision.
786 
787    For instance:
788      QI < HI < SI < DI < TI
789      V4QI < V2HI < V8QI < V4HI < V2SI.
790 
791    If the precision is not set, sort by the bytesize.  A mode with
792    precision set gets sorted before a mode without precision set, if
793    they have the same bytesize; this is the right thing because
794    the precision must always be smaller than the bytesize * BITS_PER_UNIT.
795    We don't have to do anything special to get this done -- an unset
796    precision shows up as (unsigned int)-1, i.e. UINT_MAX.  */
797 static int
798 cmp_modes (const void *a, const void *b)
799 {
800   const struct mode_data *const m = *(const struct mode_data *const*)a;
801   const struct mode_data *const n = *(const struct mode_data *const*)b;
802 
803   if (m->bytesize > n->bytesize)
804     return 1;
805   else if (m->bytesize < n->bytesize)
806     return -1;
807 
808   if (m->precision > n->precision)
809     return 1;
810   else if (m->precision < n->precision)
811     return -1;
812 
813   if (!m->component && !n->component)
814     {
815       if (m->counter < n->counter)
816 	return -1;
817       else
818 	return 1;
819     }
820 
821   if (m->component->bytesize > n->component->bytesize)
822     return 1;
823   else if (m->component->bytesize < n->component->bytesize)
824     return -1;
825 
826   if (m->component->precision > n->component->precision)
827     return 1;
828   else if (m->component->precision < n->component->precision)
829     return -1;
830 
831   if (m->counter < n->counter)
832     return -1;
833   else
834     return 1;
835 }
836 
837 static void
838 calc_wider_mode (void)
839 {
840   int c;
841   struct mode_data *m;
842   struct mode_data **sortbuf;
843   unsigned int max_n_modes = 0;
844   unsigned int i, j;
845 
846   for (c = 0; c < MAX_MODE_CLASS; c++)
847     max_n_modes = MAX (max_n_modes, n_modes[c]);
848 
849   /* Allocate max_n_modes + 1 entries to leave room for the extra null
850      pointer assigned after the qsort call below.  */
851   sortbuf = XALLOCAVEC (struct mode_data *, max_n_modes + 1);
852 
853   for (c = 0; c < MAX_MODE_CLASS; c++)
854     {
855       /* "wider" is not meaningful for MODE_RANDOM and MODE_CC.
856 	 However, we want these in textual order, and we have
857 	 precisely the reverse.  */
858       if (c == MODE_RANDOM || c == MODE_CC)
859 	{
860 	  struct mode_data *prev, *next;
861 
862 	  for (prev = 0, m = modes[c]; m; m = next)
863 	    {
864 	      m->wider = void_mode;
865 
866 	      /* this is nreverse */
867 	      next = m->next;
868 	      m->next = prev;
869 	      prev = m;
870 	    }
871 	  modes[c] = prev;
872 	}
873       else
874 	{
875 	  if (!modes[c])
876 	    continue;
877 
878 	  for (i = 0, m = modes[c]; m; i++, m = m->next)
879 	    sortbuf[i] = m;
880 
881 	  qsort (sortbuf, i, sizeof (struct mode_data *), cmp_modes);
882 
883 	  sortbuf[i] = 0;
884 	  for (j = 0; j < i; j++)
885 	    {
886 	      sortbuf[j]->next = sortbuf[j + 1];
887 	      if (c == MODE_PARTIAL_INT)
888 		sortbuf[j]->wider = sortbuf[j]->component;
889 	      else
890 		sortbuf[j]->wider = sortbuf[j]->next;
891 	    }
892 
893 	  modes[c] = sortbuf[0];
894 	}
895     }
896 }
897 
898 /* Output routines.  */
899 
900 #define tagged_printf(FMT, ARG, TAG) do {		\
901   int count_ = printf ("  " FMT ",", ARG);		\
902   printf ("%*s/* %s */\n", 27 - count_, "", TAG);	\
903 } while (0)
904 
905 #define print_decl(TYPE, NAME, ASIZE) \
906   puts ("\nconst " TYPE " " NAME "[" ASIZE "] =\n{");
907 
908 #define print_maybe_const_decl(TYPE, NAME, ASIZE, CATEGORY)	\
909   printf ("\n" TYPE " " NAME "[" ASIZE "] = \n{\n",		\
910 	  adj_##CATEGORY ? "" : "const ")
911 
912 #define print_closer() puts ("};")
913 
914 /* Compute the max bitsize of some of the classes of integers.  It may
915    be that there are needs for the other integer classes, and this
916    code is easy to extend.  */
917 static void
918 emit_max_int (void)
919 {
920   unsigned int max, mmax;
921   struct mode_data *i;
922   int j;
923 
924   puts ("");
925 
926   printf ("#define BITS_PER_UNIT (%d)\n", bits_per_unit);
927 
928   if (max_bitsize_mode_any_int == 0)
929     {
930       for (max = 1, i = modes[MODE_INT]; i; i = i->next)
931 	if (max < i->bytesize)
932 	  max = i->bytesize;
933       mmax = max;
934       for (max = 1, i = modes[MODE_PARTIAL_INT]; i; i = i->next)
935 	if (max < i->bytesize)
936 	  max = i->bytesize;
937       if (max > mmax)
938 	mmax = max;
939       printf ("#define MAX_BITSIZE_MODE_ANY_INT (%d*BITS_PER_UNIT)\n", mmax);
940     }
941   else
942     printf ("#define MAX_BITSIZE_MODE_ANY_INT %d\n", max_bitsize_mode_any_int);
943 
944   mmax = 0;
945   for (j = 0; j < MAX_MODE_CLASS; j++)
946     for (i = modes[j]; i; i = i->next)
947       if (mmax < i->bytesize)
948 	mmax = i->bytesize;
949   printf ("#define MAX_BITSIZE_MODE_ANY_MODE (%d*BITS_PER_UNIT)\n", mmax);
950 }
951 
952 /* Emit mode_size_inline routine into insn-modes.h header.  */
953 static void
954 emit_mode_size_inline (void)
955 {
956   int c;
957   struct mode_adjust *a;
958   struct mode_data *m;
959 
960   /* Size adjustments must be propagated to all containing modes.  */
961   for (a = adj_bytesize; a; a = a->next)
962     {
963       a->mode->need_bytesize_adj = true;
964       for (m = a->mode->contained; m; m = m->next_cont)
965 	m->need_bytesize_adj = true;
966     }
967 
968   printf ("\
969 #ifdef __cplusplus\n\
970 inline __attribute__((__always_inline__))\n\
971 #else\n\
972 extern __inline__ __attribute__((__always_inline__, __gnu_inline__))\n\
973 #endif\n\
974 unsigned char\n\
975 mode_size_inline (machine_mode mode)\n\
976 {\n\
977   extern %sunsigned char mode_size[NUM_MACHINE_MODES];\n\
978   switch (mode)\n\
979     {\n", adj_bytesize ? "" : "const ");
980 
981   for_all_modes (c, m)
982     if (!m->need_bytesize_adj)
983       printf ("    case %smode: return %u;\n", m->name, m->bytesize);
984 
985   puts ("\
986     default: return mode_size[mode];\n\
987     }\n\
988 }\n");
989 }
990 
991 /* Emit mode_nunits_inline routine into insn-modes.h header.  */
992 static void
993 emit_mode_nunits_inline (void)
994 {
995   int c;
996   struct mode_data *m;
997 
998   puts ("\
999 #ifdef __cplusplus\n\
1000 inline __attribute__((__always_inline__))\n\
1001 #else\n\
1002 extern __inline__ __attribute__((__always_inline__, __gnu_inline__))\n\
1003 #endif\n\
1004 unsigned char\n\
1005 mode_nunits_inline (machine_mode mode)\n\
1006 {\n\
1007   extern const unsigned char mode_nunits[NUM_MACHINE_MODES];\n\
1008   switch (mode)\n\
1009     {");
1010 
1011   for_all_modes (c, m)
1012     printf ("    case %smode: return %u;\n", m->name, m->ncomponents);
1013 
1014   puts ("\
1015     default: return mode_nunits[mode];\n\
1016     }\n\
1017 }\n");
1018 }
1019 
1020 /* Emit mode_inner_inline routine into insn-modes.h header.  */
1021 static void
1022 emit_mode_inner_inline (void)
1023 {
1024   int c;
1025   struct mode_data *m;
1026 
1027   puts ("\
1028 #ifdef __cplusplus\n\
1029 inline __attribute__((__always_inline__))\n\
1030 #else\n\
1031 extern __inline__ __attribute__((__always_inline__, __gnu_inline__))\n\
1032 #endif\n\
1033 unsigned char\n\
1034 mode_inner_inline (machine_mode mode)\n\
1035 {\n\
1036   extern const unsigned char mode_inner[NUM_MACHINE_MODES];\n\
1037   switch (mode)\n\
1038     {");
1039 
1040   for_all_modes (c, m)
1041     printf ("    case %smode: return %smode;\n", m->name,
1042 	    c != MODE_PARTIAL_INT && m->component
1043 	    ? m->component->name : void_mode->name);
1044 
1045   puts ("\
1046     default: return mode_inner[mode];\n\
1047     }\n\
1048 }\n");
1049 }
1050 
1051 static void
1052 emit_insn_modes_h (void)
1053 {
1054   int c;
1055   struct mode_data *m, *first, *last;
1056   int n_int_n_ents = 0;
1057 
1058   printf ("/* Generated automatically from machmode.def%s%s\n",
1059 	   HAVE_EXTRA_MODES ? " and " : "",
1060 	   EXTRA_MODES_FILE);
1061 
1062   puts ("\
1063    by genmodes.  */\n\
1064 \n\
1065 #ifndef GCC_INSN_MODES_H\n\
1066 #define GCC_INSN_MODES_H\n\
1067 \n\
1068 enum machine_mode\n{");
1069 
1070   for (c = 0; c < MAX_MODE_CLASS; c++)
1071     for (m = modes[c]; m; m = m->next)
1072       {
1073 	int count_ = printf ("  %smode,", m->name);
1074 	printf ("%*s/* %s:%d */\n", 27 - count_, "",
1075 		 trim_filename (m->file), m->line);
1076 	printf ("#define HAVE_%smode\n", m->name);
1077       }
1078 
1079   puts ("  MAX_MACHINE_MODE,\n");
1080 
1081   for (c = 0; c < MAX_MODE_CLASS; c++)
1082     {
1083       first = modes[c];
1084       last = 0;
1085       for (m = first; m; last = m, m = m->next)
1086 	;
1087 
1088       /* Don't use BImode for MIN_MODE_INT, since otherwise the middle
1089 	 end will try to use it for bitfields in structures and the
1090 	 like, which we do not want.  Only the target md file should
1091 	 generate BImode widgets.  */
1092       if (first && first->precision == 1 && c == MODE_INT)
1093 	first = first->next;
1094 
1095       if (first && last)
1096 	printf ("  MIN_%s = %smode,\n  MAX_%s = %smode,\n\n",
1097 		 mode_class_names[c], first->name,
1098 		 mode_class_names[c], last->name);
1099       else
1100 	printf ("  MIN_%s = %smode,\n  MAX_%s = %smode,\n\n",
1101 		 mode_class_names[c], void_mode->name,
1102 		 mode_class_names[c], void_mode->name);
1103     }
1104 
1105   puts ("\
1106   NUM_MACHINE_MODES = MAX_MACHINE_MODE\n\
1107 };\n");
1108 
1109   /* I can't think of a better idea, can you?  */
1110   printf ("#define CONST_MODE_SIZE%s\n", adj_bytesize ? "" : " const");
1111   printf ("#define CONST_MODE_BASE_ALIGN%s\n", adj_alignment ? "" : " const");
1112 #if 0 /* disabled for backward compatibility, temporary */
1113   printf ("#define CONST_REAL_FORMAT_FOR_MODE%s\n", adj_format ? "" :" const");
1114 #endif
1115   printf ("#define CONST_MODE_IBIT%s\n", adj_ibit ? "" : " const");
1116   printf ("#define CONST_MODE_FBIT%s\n", adj_fbit ? "" : " const");
1117   emit_max_int ();
1118 
1119   for_all_modes (c, m)
1120     if (m->int_n)
1121       n_int_n_ents ++;
1122 
1123   printf ("#define NUM_INT_N_ENTS %d\n", n_int_n_ents);
1124 
1125   puts ("\n#if !defined (USED_FOR_TARGET) && GCC_VERSION >= 4001\n");
1126   emit_mode_size_inline ();
1127   emit_mode_nunits_inline ();
1128   emit_mode_inner_inline ();
1129   puts ("#endif /* GCC_VERSION >= 4001 */");
1130 
1131   puts ("\
1132 \n\
1133 #endif /* insn-modes.h */");
1134 }
1135 
1136 static void
1137 emit_insn_modes_c_header (void)
1138 {
1139   printf ("/* Generated automatically from machmode.def%s%s\n",
1140 	   HAVE_EXTRA_MODES ? " and " : "",
1141 	   EXTRA_MODES_FILE);
1142 
1143   puts ("\
1144    by genmodes.  */\n\
1145 \n\
1146 #include \"config.h\"\n\
1147 #include \"system.h\"\n\
1148 #include \"coretypes.h\"\n\
1149 #include \"tm.h\"\n\
1150 #include \"machmode.h\"\n\
1151 #include \"real.h\"");
1152 }
1153 
1154 static void
1155 emit_min_insn_modes_c_header (void)
1156 {
1157   printf ("/* Generated automatically from machmode.def%s%s\n",
1158 	   HAVE_EXTRA_MODES ? " and " : "",
1159 	   EXTRA_MODES_FILE);
1160 
1161   puts ("\
1162    by genmodes.  */\n\
1163 \n\
1164 #include \"bconfig.h\"\n\
1165 #include \"system.h\"\n\
1166 #include \"machmode.h\"");
1167 }
1168 
1169 static void
1170 emit_mode_name (void)
1171 {
1172   int c;
1173   struct mode_data *m;
1174 
1175   print_decl ("char *const", "mode_name", "NUM_MACHINE_MODES");
1176 
1177   for_all_modes (c, m)
1178     printf ("  \"%s\",\n", m->name);
1179 
1180   print_closer ();
1181 }
1182 
1183 static void
1184 emit_mode_class (void)
1185 {
1186   int c;
1187   struct mode_data *m;
1188 
1189   print_decl ("unsigned char", "mode_class", "NUM_MACHINE_MODES");
1190 
1191   for_all_modes (c, m)
1192     tagged_printf ("%s", mode_class_names[m->cl], m->name);
1193 
1194   print_closer ();
1195 }
1196 
1197 static void
1198 emit_mode_precision (void)
1199 {
1200   int c;
1201   struct mode_data *m;
1202 
1203   print_decl ("unsigned short", "mode_precision", "NUM_MACHINE_MODES");
1204 
1205   for_all_modes (c, m)
1206     if (m->precision != (unsigned int)-1)
1207       tagged_printf ("%u", m->precision, m->name);
1208     else
1209       tagged_printf ("%u*BITS_PER_UNIT", m->bytesize, m->name);
1210 
1211   print_closer ();
1212 }
1213 
1214 static void
1215 emit_mode_size (void)
1216 {
1217   int c;
1218   struct mode_data *m;
1219 
1220   print_maybe_const_decl ("%sunsigned char", "mode_size",
1221 			  "NUM_MACHINE_MODES", bytesize);
1222 
1223   for_all_modes (c, m)
1224     tagged_printf ("%u", m->bytesize, m->name);
1225 
1226   print_closer ();
1227 }
1228 
1229 static void
1230 emit_mode_nunits (void)
1231 {
1232   int c;
1233   struct mode_data *m;
1234 
1235   print_decl ("unsigned char", "mode_nunits", "NUM_MACHINE_MODES");
1236 
1237   for_all_modes (c, m)
1238     tagged_printf ("%u", m->ncomponents, m->name);
1239 
1240   print_closer ();
1241 }
1242 
1243 static void
1244 emit_mode_wider (void)
1245 {
1246   int c;
1247   struct mode_data *m;
1248 
1249   print_decl ("unsigned char", "mode_wider", "NUM_MACHINE_MODES");
1250 
1251   for_all_modes (c, m)
1252     tagged_printf ("%smode",
1253 		   m->wider ? m->wider->name : void_mode->name,
1254 		   m->name);
1255 
1256   print_closer ();
1257   print_decl ("unsigned char", "mode_2xwider", "NUM_MACHINE_MODES");
1258 
1259   for_all_modes (c, m)
1260     {
1261       struct mode_data * m2;
1262 
1263       for (m2 = m;
1264 	   m2 && m2 != void_mode;
1265 	   m2 = m2->wider)
1266 	{
1267 	  if (m2->bytesize < 2 * m->bytesize)
1268 	    continue;
1269 	  if (m->precision != (unsigned int) -1)
1270 	    {
1271 	      if (m2->precision != 2 * m->precision)
1272 		continue;
1273 	    }
1274 	  else
1275 	    {
1276 	      if (m2->precision != (unsigned int) -1)
1277 		continue;
1278 	    }
1279 
1280 	  /* For vectors we want twice the number of components,
1281 	     with the same element type.  */
1282 	  if (m->cl == MODE_VECTOR_INT
1283 	      || m->cl == MODE_VECTOR_FLOAT
1284 	      || m->cl == MODE_VECTOR_FRACT
1285 	      || m->cl == MODE_VECTOR_UFRACT
1286 	      || m->cl == MODE_VECTOR_ACCUM
1287 	      || m->cl == MODE_VECTOR_UACCUM)
1288 	    {
1289 	      if (m2->ncomponents != 2 * m->ncomponents)
1290 		continue;
1291 	      if (m->component != m2->component)
1292 		continue;
1293 	    }
1294 
1295 	  break;
1296 	}
1297       if (m2 == void_mode)
1298 	m2 = 0;
1299       tagged_printf ("%smode",
1300 		     m2 ? m2->name : void_mode->name,
1301 		     m->name);
1302     }
1303 
1304   print_closer ();
1305 }
1306 
1307 static void
1308 emit_mode_mask (void)
1309 {
1310   int c;
1311   struct mode_data *m;
1312 
1313   print_decl ("unsigned HOST_WIDE_INT", "mode_mask_array",
1314 	      "NUM_MACHINE_MODES");
1315   puts ("\
1316 #define MODE_MASK(m)                          \\\n\
1317   ((m) >= HOST_BITS_PER_WIDE_INT)             \\\n\
1318    ? ~(unsigned HOST_WIDE_INT) 0              \\\n\
1319    : ((unsigned HOST_WIDE_INT) 1 << (m)) - 1\n");
1320 
1321   for_all_modes (c, m)
1322     if (m->precision != (unsigned int)-1)
1323       tagged_printf ("MODE_MASK (%u)", m->precision, m->name);
1324     else
1325       tagged_printf ("MODE_MASK (%u*BITS_PER_UNIT)", m->bytesize, m->name);
1326 
1327   puts ("#undef MODE_MASK");
1328   print_closer ();
1329 }
1330 
1331 static void
1332 emit_mode_inner (void)
1333 {
1334   int c;
1335   struct mode_data *m;
1336 
1337   print_decl ("unsigned char", "mode_inner", "NUM_MACHINE_MODES");
1338 
1339   for_all_modes (c, m)
1340     tagged_printf ("%smode",
1341 		   c != MODE_PARTIAL_INT && m->component
1342 		   ? m->component->name : void_mode->name,
1343 		   m->name);
1344 
1345   print_closer ();
1346 }
1347 
1348 static void
1349 emit_mode_base_align (void)
1350 {
1351   int c;
1352   struct mode_data *m;
1353 
1354   print_maybe_const_decl ("%sunsigned char",
1355 			  "mode_base_align", "NUM_MACHINE_MODES",
1356 			  alignment);
1357 
1358   for_all_modes (c, m)
1359     tagged_printf ("%u", m->alignment, m->name);
1360 
1361   print_closer ();
1362 }
1363 
1364 static void
1365 emit_class_narrowest_mode (void)
1366 {
1367   int c;
1368 
1369   print_decl ("unsigned char", "class_narrowest_mode", "MAX_MODE_CLASS");
1370 
1371   for (c = 0; c < MAX_MODE_CLASS; c++)
1372     /* Bleah, all this to get the comment right for MIN_MODE_INT.  */
1373     tagged_printf ("MIN_%s", mode_class_names[c],
1374 		   modes[c]
1375 		   ? ((c != MODE_INT || modes[c]->precision != 1)
1376 		      ? modes[c]->name
1377 		      : (modes[c]->next
1378 			 ? modes[c]->next->name
1379 			 : void_mode->name))
1380 		   : void_mode->name);
1381 
1382   print_closer ();
1383 }
1384 
1385 static void
1386 emit_real_format_for_mode (void)
1387 {
1388   struct mode_data *m;
1389 
1390   /* The entities pointed to by this table are constant, whether
1391      or not the table itself is constant.
1392 
1393      For backward compatibility this table is always writable
1394      (several targets modify it in TARGET_OPTION_OVERRIDE).   FIXME:
1395      convert all said targets to use ADJUST_FORMAT instead.  */
1396 #if 0
1397   print_maybe_const_decl ("const struct real_format *%s",
1398 			  "real_format_for_mode",
1399 			  "MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1",
1400 			  format);
1401 #else
1402   print_decl ("struct real_format *\n", "real_format_for_mode",
1403 	      "MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1 "
1404 	      "+ MAX_MODE_DECIMAL_FLOAT - MIN_MODE_DECIMAL_FLOAT + 1");
1405 #endif
1406 
1407   /* The beginning of the table is entries for float modes.  */
1408   for (m = modes[MODE_FLOAT]; m; m = m->next)
1409     if (!strcmp (m->format, "0"))
1410       tagged_printf ("%s", m->format, m->name);
1411     else
1412       tagged_printf ("&%s", m->format, m->name);
1413 
1414   /* The end of the table is entries for decimal float modes.  */
1415   for (m = modes[MODE_DECIMAL_FLOAT]; m; m = m->next)
1416     if (!strcmp (m->format, "0"))
1417       tagged_printf ("%s", m->format, m->name);
1418     else
1419       tagged_printf ("&%s", m->format, m->name);
1420 
1421   print_closer ();
1422 }
1423 
1424 static void
1425 emit_mode_adjustments (void)
1426 {
1427   struct mode_adjust *a;
1428   struct mode_data *m;
1429 
1430   puts ("\
1431 \nvoid\
1432 \ninit_adjust_machine_modes (void)\
1433 \n{\
1434 \n  size_t s ATTRIBUTE_UNUSED;");
1435 
1436   /* Size adjustments must be propagated to all containing modes.
1437      A size adjustment forces us to recalculate the alignment too.  */
1438   for (a = adj_bytesize; a; a = a->next)
1439     {
1440       printf ("\n  /* %s:%d */\n  s = %s;\n",
1441 	      a->file, a->line, a->adjustment);
1442       printf ("  mode_size[%smode] = s;\n", a->mode->name);
1443       printf ("  mode_base_align[%smode] = s & (~s + 1);\n",
1444 	      a->mode->name);
1445 
1446       for (m = a->mode->contained; m; m = m->next_cont)
1447 	{
1448 	  switch (m->cl)
1449 	    {
1450 	    case MODE_COMPLEX_INT:
1451 	    case MODE_COMPLEX_FLOAT:
1452 	      printf ("  mode_size[%smode] = 2*s;\n", m->name);
1453 	      printf ("  mode_base_align[%smode] = s & (~s + 1);\n",
1454 		      m->name);
1455 	      break;
1456 
1457 	    case MODE_VECTOR_INT:
1458 	    case MODE_VECTOR_FLOAT:
1459 	    case MODE_VECTOR_FRACT:
1460 	    case MODE_VECTOR_UFRACT:
1461 	    case MODE_VECTOR_ACCUM:
1462 	    case MODE_VECTOR_UACCUM:
1463 	      printf ("  mode_size[%smode] = %d*s;\n",
1464 		      m->name, m->ncomponents);
1465 	      printf ("  mode_base_align[%smode] = (%d*s) & (~(%d*s)+1);\n",
1466 		      m->name, m->ncomponents, m->ncomponents);
1467 	      break;
1468 
1469 	    default:
1470 	      internal_error (
1471 	      "mode %s is neither vector nor complex but contains %s",
1472 	      m->name, a->mode->name);
1473 	      /* NOTREACHED */
1474 	    }
1475 	}
1476     }
1477 
1478   /* Alignment adjustments propagate too.
1479      ??? This may not be the right thing for vector modes.  */
1480   for (a = adj_alignment; a; a = a->next)
1481     {
1482       printf ("\n  /* %s:%d */\n  s = %s;\n",
1483 	      a->file, a->line, a->adjustment);
1484       printf ("  mode_base_align[%smode] = s;\n", a->mode->name);
1485 
1486       for (m = a->mode->contained; m; m = m->next_cont)
1487 	{
1488 	  switch (m->cl)
1489 	    {
1490 	    case MODE_COMPLEX_INT:
1491 	    case MODE_COMPLEX_FLOAT:
1492 	      printf ("  mode_base_align[%smode] = s;\n", m->name);
1493 	      break;
1494 
1495 	    case MODE_VECTOR_INT:
1496 	    case MODE_VECTOR_FLOAT:
1497 	    case MODE_VECTOR_FRACT:
1498 	    case MODE_VECTOR_UFRACT:
1499 	    case MODE_VECTOR_ACCUM:
1500 	    case MODE_VECTOR_UACCUM:
1501 	      printf ("  mode_base_align[%smode] = %d*s;\n",
1502 		      m->name, m->ncomponents);
1503 	      break;
1504 
1505 	    default:
1506 	      internal_error (
1507 	      "mode %s is neither vector nor complex but contains %s",
1508 	      m->name, a->mode->name);
1509 	      /* NOTREACHED */
1510 	    }
1511 	}
1512     }
1513 
1514   /* Ibit adjustments don't have to propagate.  */
1515   for (a = adj_ibit; a; a = a->next)
1516     {
1517       printf ("\n  /* %s:%d */\n  s = %s;\n",
1518 	      a->file, a->line, a->adjustment);
1519       printf ("  mode_ibit[%smode] = s;\n", a->mode->name);
1520     }
1521 
1522   /* Fbit adjustments don't have to propagate.  */
1523   for (a = adj_fbit; a; a = a->next)
1524     {
1525       printf ("\n  /* %s:%d */\n  s = %s;\n",
1526 	      a->file, a->line, a->adjustment);
1527       printf ("  mode_fbit[%smode] = s;\n", a->mode->name);
1528     }
1529 
1530   /* Real mode formats don't have to propagate anywhere.  */
1531   for (a = adj_format; a; a = a->next)
1532     printf ("\n  /* %s:%d */\n  REAL_MODE_FORMAT (%smode) = %s;\n",
1533 	    a->file, a->line, a->mode->name, a->adjustment);
1534 
1535   puts ("}");
1536 }
1537 
1538 /* Emit ibit for all modes.  */
1539 
1540 static void
1541 emit_mode_ibit (void)
1542 {
1543   int c;
1544   struct mode_data *m;
1545 
1546   print_maybe_const_decl ("%sunsigned char",
1547 			  "mode_ibit", "NUM_MACHINE_MODES",
1548 			  ibit);
1549 
1550   for_all_modes (c, m)
1551     tagged_printf ("%u", m->ibit, m->name);
1552 
1553   print_closer ();
1554 }
1555 
1556 /* Emit fbit for all modes.  */
1557 
1558 static void
1559 emit_mode_fbit (void)
1560 {
1561   int c;
1562   struct mode_data *m;
1563 
1564   print_maybe_const_decl ("%sunsigned char",
1565 			  "mode_fbit", "NUM_MACHINE_MODES",
1566 			  fbit);
1567 
1568   for_all_modes (c, m)
1569     tagged_printf ("%u", m->fbit, m->name);
1570 
1571   print_closer ();
1572 }
1573 
1574 /* Emit __intN for all modes.  */
1575 
1576 static void
1577 emit_mode_int_n (void)
1578 {
1579   int c;
1580   struct mode_data *m;
1581   struct mode_data **mode_sort;
1582   int n_modes = 0;
1583   int i, j;
1584 
1585   print_decl ("int_n_data_t", "int_n_data", "");
1586 
1587   n_modes = 0;
1588   for_all_modes (c, m)
1589     if (m->int_n)
1590       n_modes ++;
1591   mode_sort = XALLOCAVEC (struct mode_data *, n_modes);
1592 
1593   n_modes = 0;
1594   for_all_modes (c, m)
1595     if (m->int_n)
1596       mode_sort[n_modes++] = m;
1597 
1598   /* Yes, this is a bubblesort, but there are at most four (and
1599      usually only 1-2) entries to sort.  */
1600   for (i = 0; i<n_modes - 1; i++)
1601     for (j = i + 1; j < n_modes; j++)
1602       if (mode_sort[i]->int_n > mode_sort[j]->int_n)
1603 	{
1604 	  m = mode_sort[i];
1605 	  mode_sort[i] = mode_sort[j];
1606 	  mode_sort[j] = m;
1607 	}
1608 
1609   for (i = 0; i < n_modes; i ++)
1610     {
1611       m = mode_sort[i];
1612       printf(" {\n");
1613       tagged_printf ("%u", m->int_n, m->name);
1614       printf ("%smode,", m->name);
1615       printf(" },\n");
1616     }
1617 
1618   print_closer ();
1619 }
1620 
1621 
1622 static void
1623 emit_insn_modes_c (void)
1624 {
1625   emit_insn_modes_c_header ();
1626   emit_mode_name ();
1627   emit_mode_class ();
1628   emit_mode_precision ();
1629   emit_mode_size ();
1630   emit_mode_nunits ();
1631   emit_mode_wider ();
1632   emit_mode_mask ();
1633   emit_mode_inner ();
1634   emit_mode_base_align ();
1635   emit_class_narrowest_mode ();
1636   emit_real_format_for_mode ();
1637   emit_mode_adjustments ();
1638   emit_mode_ibit ();
1639   emit_mode_fbit ();
1640   emit_mode_int_n ();
1641 }
1642 
1643 static void
1644 emit_min_insn_modes_c (void)
1645 {
1646   emit_min_insn_modes_c_header ();
1647   emit_mode_name ();
1648   emit_mode_class ();
1649   emit_mode_wider ();
1650   emit_class_narrowest_mode ();
1651 }
1652 
1653 /* Master control.  */
1654 int
1655 main (int argc, char **argv)
1656 {
1657   bool gen_header = false, gen_min = false;
1658   progname = argv[0];
1659 
1660   if (argc == 1)
1661     ;
1662   else if (argc == 2 && !strcmp (argv[1], "-h"))
1663     gen_header = true;
1664   else if (argc == 2 && !strcmp (argv[1], "-m"))
1665     gen_min = true;
1666   else
1667     {
1668       error ("usage: %s [-h|-m] > file", progname);
1669       return FATAL_EXIT_CODE;
1670     }
1671 
1672   modes_by_name = htab_create_alloc (64, hash_mode, eq_mode, 0, xcalloc, free);
1673 
1674   create_modes ();
1675   complete_all_modes ();
1676 
1677   if (have_error)
1678     return FATAL_EXIT_CODE;
1679 
1680   calc_wider_mode ();
1681 
1682   if (gen_header)
1683     emit_insn_modes_h ();
1684   else if (gen_min)
1685     emit_min_insn_modes_c ();
1686   else
1687     emit_insn_modes_c ();
1688 
1689   if (fflush (stdout) || fclose (stdout))
1690     return FATAL_EXIT_CODE;
1691   return SUCCESS_EXIT_CODE;
1692 }
1693