* gcc.dg/vect/pr24225.c: Add cleanup-coverage-files.
[official-gcc.git] / gcc / genmodes.c
blob142dde4e7378a016906607896958e17f0ebcf9e0
1 /* Generate the machine mode enumeration and associated tables.
2 Copyright (C) 2003, 2004
3 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA. */
22 #include "bconfig.h"
23 #include "system.h"
24 #include "errors.h"
25 #include "hashtab.h"
27 /* enum mode_class is normally defined by machmode.h but we can't
28 include that header here. */
29 #include "mode-classes.def"
31 #define DEF_MODE_CLASS(M) M
32 enum mode_class { MODE_CLASSES, MAX_MODE_CLASS };
33 #undef DEF_MODE_CLASS
35 /* Text names of mode classes, for output. */
36 #define DEF_MODE_CLASS(M) #M
37 static const char *const mode_class_names[MAX_MODE_CLASS] =
39 MODE_CLASSES
41 #undef DEF_MODE_CLASS
42 #undef MODE_CLASSES
44 #ifdef EXTRA_MODES_FILE
45 # define HAVE_EXTRA_MODES 1
46 #else
47 # define HAVE_EXTRA_MODES 0
48 # define EXTRA_MODES_FILE ""
49 #endif
51 /* Data structure for building up what we know about a mode.
52 They're clustered by mode class. */
53 struct mode_data
55 struct mode_data *next; /* next this class - arbitrary order */
57 const char *name; /* printable mode name -- SI, not SImode */
58 enum mode_class cl; /* this mode class */
59 unsigned int precision; /* size in bits, equiv to TYPE_PRECISION */
60 unsigned int bytesize; /* storage size in addressable units */
61 unsigned int ncomponents; /* number of subunits */
62 unsigned int alignment; /* mode alignment */
63 const char *format; /* floating point format - MODE_FLOAT only */
65 struct mode_data *component; /* mode of components */
66 struct mode_data *wider; /* next wider mode */
67 struct mode_data *wider_2x; /* 2x wider mode */
69 struct mode_data *contained; /* Pointer to list of modes that have
70 this mode as a component. */
71 struct mode_data *next_cont; /* Next mode in that list. */
73 const char *file; /* file and line of definition, */
74 unsigned int line; /* for error reporting */
77 static struct mode_data *modes[MAX_MODE_CLASS];
78 static unsigned int n_modes[MAX_MODE_CLASS];
79 static struct mode_data *void_mode;
81 static const struct mode_data blank_mode = {
82 0, "<unknown>", MAX_MODE_CLASS,
83 -1U, -1U, -1U, -1U,
84 0, 0, 0, 0, 0, 0,
85 "<unknown>", 0
88 static htab_t modes_by_name;
90 /* Data structure for recording target-specified runtime adjustments
91 to a particular mode. We support varying the byte size, the
92 alignment, and the floating point format. */
93 struct mode_adjust
95 struct mode_adjust *next;
96 struct mode_data *mode;
97 const char *adjustment;
99 const char *file;
100 unsigned int line;
103 static struct mode_adjust *adj_bytesize;
104 static struct mode_adjust *adj_alignment;
105 static struct mode_adjust *adj_format;
107 /* Mode class operations. */
108 static enum mode_class
109 complex_class (enum mode_class c)
111 switch (c)
113 case MODE_INT: return MODE_COMPLEX_INT;
114 case MODE_FLOAT: return MODE_COMPLEX_FLOAT;
115 default:
116 error ("no complex class for class %s", mode_class_names[c]);
117 return MODE_RANDOM;
121 static enum mode_class
122 vector_class (enum mode_class cl)
124 switch (cl)
126 case MODE_INT: return MODE_VECTOR_INT;
127 case MODE_FLOAT: return MODE_VECTOR_FLOAT;
128 default:
129 error ("no vector class for class %s", mode_class_names[cl]);
130 return MODE_RANDOM;
134 /* Utility routines. */
135 static inline struct mode_data *
136 find_mode (const char *name)
138 struct mode_data key;
140 key.name = name;
141 return (struct mode_data *) htab_find (modes_by_name, &key);
144 static struct mode_data *
145 new_mode (enum mode_class cl, const char *name,
146 const char *file, unsigned int line)
148 struct mode_data *m;
150 m = find_mode (name);
151 if (m)
153 error ("%s:%d: duplicate definition of mode \"%s\"",
154 trim_filename (file), line, name);
155 error ("%s:%d: previous definition here", m->file, m->line);
156 return m;
159 m = XNEW (struct mode_data);
160 memcpy (m, &blank_mode, sizeof (struct mode_data));
161 m->cl = cl;
162 m->name = name;
163 if (file)
164 m->file = trim_filename (file);
165 m->line = line;
167 m->next = modes[cl];
168 modes[cl] = m;
169 n_modes[cl]++;
171 *htab_find_slot (modes_by_name, m, INSERT) = m;
173 return m;
176 static hashval_t
177 hash_mode (const void *p)
179 const struct mode_data *m = (const struct mode_data *)p;
180 return htab_hash_string (m->name);
183 static int
184 eq_mode (const void *p, const void *q)
186 const struct mode_data *a = (const struct mode_data *)p;
187 const struct mode_data *b = (const struct mode_data *)q;
189 return !strcmp (a->name, b->name);
192 #define for_all_modes(C, M) \
193 for (C = 0; C < MAX_MODE_CLASS; C++) \
194 for (M = modes[C]; M; M = M->next)
196 static void ATTRIBUTE_UNUSED
197 new_adjust (const char *name,
198 struct mode_adjust **category, const char *catname,
199 const char *adjustment,
200 enum mode_class required_class,
201 const char *file, unsigned int line)
203 struct mode_data *mode = find_mode (name);
204 struct mode_adjust *a;
206 file = trim_filename (file);
208 if (!mode)
210 error ("%s:%d: no mode \"%s\"", file, line, name);
211 return;
214 if (required_class != MODE_RANDOM && mode->cl != required_class)
216 error ("%s:%d: mode \"%s\" is not class %s",
217 file, line, name, mode_class_names[required_class] + 5);
218 return;
221 for (a = *category; a; a = a->next)
222 if (a->mode == mode)
224 error ("%s:%d: mode \"%s\" already has a %s adjustment",
225 file, line, name, catname);
226 error ("%s:%d: previous adjustment here", a->file, a->line);
227 return;
230 a = XNEW (struct mode_adjust);
231 a->mode = mode;
232 a->adjustment = adjustment;
233 a->file = file;
234 a->line = line;
236 a->next = *category;
237 *category = a;
240 /* Diagnose failure to meet expectations in a partially filled out
241 mode structure. */
242 enum requirement { SET, UNSET, OPTIONAL };
244 #define validate_field_(mname, fname, req, val, unset, file, line) do { \
245 switch (req) \
247 case SET: \
248 if (val == unset) \
249 error ("%s:%d: (%s) field %s must be set", \
250 file, line, mname, fname); \
251 break; \
252 case UNSET: \
253 if (val != unset) \
254 error ("%s:%d: (%s) field %s must not be set", \
255 file, line, mname, fname); \
256 case OPTIONAL: \
257 break; \
259 } while (0)
261 #define validate_field(M, F) \
262 validate_field_(M->name, #F, r_##F, M->F, blank_mode.F, M->file, M->line)
264 static void
265 validate_mode (struct mode_data *m,
266 enum requirement r_precision,
267 enum requirement r_bytesize,
268 enum requirement r_component,
269 enum requirement r_ncomponents,
270 enum requirement r_format)
272 validate_field (m, precision);
273 validate_field (m, bytesize);
274 validate_field (m, component);
275 validate_field (m, ncomponents);
276 validate_field (m, format);
278 #undef validate_field
279 #undef validate_field_
281 /* Given a partially-filled-out mode structure, figure out what we can
282 and fill the rest of it in; die if it isn't enough. */
283 static void
284 complete_mode (struct mode_data *m)
286 unsigned int alignment;
288 if (!m->name)
290 error ("%s:%d: mode with no name", m->file, m->line);
291 return;
293 if (m->cl == MAX_MODE_CLASS)
295 error ("%s:%d: %smode has no mode class", m->file, m->line, m->name);
296 return;
299 switch (m->cl)
301 case MODE_RANDOM:
302 /* Nothing more need be said. */
303 if (!strcmp (m->name, "VOID"))
304 void_mode = m;
306 validate_mode (m, UNSET, UNSET, UNSET, UNSET, UNSET);
308 m->precision = 0;
309 m->bytesize = 0;
310 m->ncomponents = 0;
311 m->component = 0;
312 break;
314 case MODE_CC:
315 /* Again, nothing more need be said. For historical reasons,
316 the size of a CC mode is four units. */
317 validate_mode (m, UNSET, UNSET, UNSET, UNSET, UNSET);
319 m->bytesize = 4;
320 m->ncomponents = 1;
321 m->component = 0;
322 break;
324 case MODE_INT:
325 case MODE_FLOAT:
326 /* A scalar mode must have a byte size, may have a bit size,
327 and must not have components. A float mode must have a
328 format. */
329 validate_mode (m, OPTIONAL, SET, UNSET, UNSET,
330 m->cl == MODE_FLOAT ? SET : UNSET);
332 m->ncomponents = 1;
333 m->component = 0;
334 break;
336 case MODE_PARTIAL_INT:
337 /* A partial integer mode uses ->component to say what the
338 corresponding full-size integer mode is, and may also
339 specify a bit size. */
340 validate_mode (m, OPTIONAL, UNSET, SET, UNSET, UNSET);
342 m->bytesize = m->component->bytesize;
344 m->ncomponents = 1;
345 m->component = 0; /* ??? preserve this */
346 break;
348 case MODE_COMPLEX_INT:
349 case MODE_COMPLEX_FLOAT:
350 /* Complex modes should have a component indicated, but no more. */
351 validate_mode (m, UNSET, UNSET, SET, UNSET, UNSET);
352 m->ncomponents = 2;
353 if (m->component->precision != (unsigned int)-1)
354 m->precision = 2 * m->component->precision;
355 m->bytesize = 2 * m->component->bytesize;
356 break;
358 case MODE_VECTOR_INT:
359 case MODE_VECTOR_FLOAT:
360 /* Vector modes should have a component and a number of components. */
361 validate_mode (m, UNSET, UNSET, SET, SET, UNSET);
362 if (m->component->precision != (unsigned int)-1)
363 m->precision = m->ncomponents * m->component->precision;
364 m->bytesize = m->ncomponents * m->component->bytesize;
365 break;
367 default:
368 gcc_unreachable ();
371 /* If not already specified, the mode alignment defaults to the largest
372 power of two that divides the size of the object. Complex types are
373 not more aligned than their contents. */
374 if (m->cl == MODE_COMPLEX_INT || m->cl == MODE_COMPLEX_FLOAT)
375 alignment = m->component->bytesize;
376 else
377 alignment = m->bytesize;
379 m->alignment = alignment & (~alignment + 1);
381 /* If this mode has components, make the component mode point back
382 to this mode, for the sake of adjustments. */
383 if (m->component)
385 m->next_cont = m->component->contained;
386 m->component->contained = m;
390 static void
391 complete_all_modes (void)
393 struct mode_data *m;
394 int cl;
396 for_all_modes (cl, m)
397 complete_mode (m);
400 /* For each mode in class CLASS, construct a corresponding complex mode. */
401 #define COMPLEX_MODES(C) make_complex_modes(MODE_##C, __FILE__, __LINE__)
402 static void
403 make_complex_modes (enum mode_class cl,
404 const char *file, unsigned int line)
406 struct mode_data *m;
407 struct mode_data *c;
408 char buf[8];
409 enum mode_class cclass = complex_class (cl);
411 if (cclass == MODE_RANDOM)
412 return;
414 for (m = modes[cl]; m; m = m->next)
416 /* Skip BImode. FIXME: BImode probably shouldn't be MODE_INT. */
417 if (m->precision == 1)
418 continue;
420 if (strlen (m->name) >= sizeof buf)
422 error ("%s:%d:mode name \"%s\" is too long",
423 m->file, m->line, m->name);
424 continue;
427 /* Float complex modes are named SCmode, etc.
428 Int complex modes are named CSImode, etc.
429 This inconsistency should be eliminated. */
430 if (cl == MODE_FLOAT)
432 char *p;
433 strncpy (buf, m->name, sizeof buf);
434 p = strchr (buf, 'F');
435 if (p == 0)
437 error ("%s:%d: float mode \"%s\" has no 'F'",
438 m->file, m->line, m->name);
439 continue;
442 *p = 'C';
444 else
445 snprintf (buf, sizeof buf, "C%s", m->name);
447 c = new_mode (cclass, xstrdup (buf), file, line);
448 c->component = m;
452 /* For all modes in class CL, construct vector modes of width
453 WIDTH, having as many components as necessary. */
454 #define VECTOR_MODES(C, W) make_vector_modes(MODE_##C, W, __FILE__, __LINE__)
455 static void ATTRIBUTE_UNUSED
456 make_vector_modes (enum mode_class cl, unsigned int width,
457 const char *file, unsigned int line)
459 struct mode_data *m;
460 struct mode_data *v;
461 char buf[8];
462 unsigned int ncomponents;
463 enum mode_class vclass = vector_class (cl);
465 if (vclass == MODE_RANDOM)
466 return;
468 for (m = modes[cl]; m; m = m->next)
470 /* Do not construct vector modes with only one element, or
471 vector modes where the element size doesn't divide the full
472 size evenly. */
473 ncomponents = width / m->bytesize;
474 if (ncomponents < 2)
475 continue;
476 if (width % m->bytesize)
477 continue;
479 /* Skip QFmode and BImode. FIXME: this special case should
480 not be necessary. */
481 if (cl == MODE_FLOAT && m->bytesize == 1)
482 continue;
483 if (cl == MODE_INT && m->precision == 1)
484 continue;
486 if ((size_t)snprintf (buf, sizeof buf, "V%u%s", ncomponents, m->name)
487 >= sizeof buf)
489 error ("%s:%d: mode name \"%s\" is too long",
490 m->file, m->line, m->name);
491 continue;
494 v = new_mode (vclass, xstrdup (buf), file, line);
495 v->component = m;
496 v->ncomponents = ncomponents;
500 /* Input. */
502 #define _SPECIAL_MODE(C, N) make_special_mode(MODE_##C, #N, __FILE__, __LINE__)
503 #define RANDOM_MODE(N) _SPECIAL_MODE (RANDOM, N)
504 #define CC_MODE(N) _SPECIAL_MODE (CC, N)
506 static void
507 make_special_mode (enum mode_class cl, const char *name,
508 const char *file, unsigned int line)
510 new_mode (cl, name, file, line);
513 #define INT_MODE(N, Y) FRACTIONAL_INT_MODE (N, -1U, Y)
514 #define FRACTIONAL_INT_MODE(N, B, Y) \
515 make_int_mode (#N, B, Y, __FILE__, __LINE__)
517 static void
518 make_int_mode (const char *name,
519 unsigned int precision, unsigned int bytesize,
520 const char *file, unsigned int line)
522 struct mode_data *m = new_mode (MODE_INT, name, file, line);
523 m->bytesize = bytesize;
524 m->precision = precision;
527 #define FLOAT_MODE(N, Y, F) FRACTIONAL_FLOAT_MODE (N, -1U, Y, F)
528 #define FRACTIONAL_FLOAT_MODE(N, B, Y, F) \
529 make_float_mode (#N, B, Y, #F, __FILE__, __LINE__)
531 static void
532 make_float_mode (const char *name,
533 unsigned int precision, unsigned int bytesize,
534 const char *format,
535 const char *file, unsigned int line)
537 struct mode_data *m = new_mode (MODE_FLOAT, name, file, line);
538 m->bytesize = bytesize;
539 m->precision = precision;
540 m->format = format;
543 #define RESET_FLOAT_FORMAT(N, F) \
544 reset_float_format (#N, #F, __FILE__, __LINE__)
545 static void ATTRIBUTE_UNUSED
546 reset_float_format (const char *name, const char *format,
547 const char *file, unsigned int line)
549 struct mode_data *m = find_mode (name);
550 if (!m)
552 error ("%s:%d: no mode \"%s\"", file, line, name);
553 return;
555 if (m->cl != MODE_FLOAT)
557 error ("%s:%d: mode \"%s\" is not class FLOAT", file, line, name);
558 return;
560 m->format = format;
563 /* Partial integer modes are specified by relation to a full integer mode.
564 For now, we do not attempt to narrow down their bit sizes. */
565 #define PARTIAL_INT_MODE(M) \
566 make_partial_integer_mode (#M, "P" #M, -1U, __FILE__, __LINE__)
567 static void ATTRIBUTE_UNUSED
568 make_partial_integer_mode (const char *base, const char *name,
569 unsigned int precision,
570 const char *file, unsigned int line)
572 struct mode_data *m;
573 struct mode_data *component = find_mode (base);
574 if (!component)
576 error ("%s:%d: no mode \"%s\"", file, line, name);
577 return;
579 if (component->cl != MODE_INT)
581 error ("%s:%d: mode \"%s\" is not class INT", file, line, name);
582 return;
585 m = new_mode (MODE_PARTIAL_INT, name, file, line);
586 m->precision = precision;
587 m->component = component;
590 /* A single vector mode can be specified by naming its component
591 mode and the number of components. */
592 #define VECTOR_MODE(C, M, N) \
593 make_vector_mode (MODE_##C, #M, N, __FILE__, __LINE__);
594 static void ATTRIBUTE_UNUSED
595 make_vector_mode (enum mode_class bclass,
596 const char *base,
597 unsigned int ncomponents,
598 const char *file, unsigned int line)
600 struct mode_data *v;
601 enum mode_class vclass = vector_class (bclass);
602 struct mode_data *component = find_mode (base);
603 char namebuf[8];
605 if (vclass == MODE_RANDOM)
606 return;
607 if (component == 0)
609 error ("%s:%d: no mode \"%s\"", file, line, base);
610 return;
612 if (component->cl != bclass)
614 error ("%s:%d: mode \"%s\" is not class %s",
615 file, line, base, mode_class_names[bclass] + 5);
616 return;
619 if ((size_t)snprintf (namebuf, sizeof namebuf, "V%u%s",
620 ncomponents, base) >= sizeof namebuf)
622 error ("%s:%d: mode name \"%s\" is too long",
623 file, line, base);
624 return;
627 v = new_mode (vclass, xstrdup (namebuf), file, line);
628 v->ncomponents = ncomponents;
629 v->component = component;
632 /* Adjustability. */
633 #define _ADD_ADJUST(A, M, X, C) \
634 new_adjust (#M, &adj_##A, #A, #X, MODE_##C, __FILE__, __LINE__)
636 #define ADJUST_BYTESIZE(M, X) _ADD_ADJUST(bytesize, M, X, RANDOM)
637 #define ADJUST_ALIGNMENT(M, X) _ADD_ADJUST(alignment, M, X, RANDOM)
638 #define ADJUST_FLOAT_FORMAT(M, X) _ADD_ADJUST(format, M, X, FLOAT)
640 static void
641 create_modes (void)
643 #include "machmode.def"
646 /* Processing. */
648 /* Sort a list of modes into the order needed for the WIDER field:
649 major sort by precision, minor sort by component precision.
651 For instance:
652 QI < HI < SI < DI < TI
653 V4QI < V2HI < V8QI < V4HI < V2SI.
655 If the precision is not set, sort by the bytesize. A mode with
656 precision set gets sorted before a mode without precision set, if
657 they have the same bytesize; this is the right thing because
658 the precision must always be smaller than the bytesize * BITS_PER_UNIT.
659 We don't have to do anything special to get this done -- an unset
660 precision shows up as (unsigned int)-1, i.e. UINT_MAX. */
661 static int
662 cmp_modes (const void *a, const void *b)
664 struct mode_data *m = *(struct mode_data **)a;
665 struct mode_data *n = *(struct mode_data **)b;
667 if (m->bytesize > n->bytesize)
668 return 1;
669 else if (m->bytesize < n->bytesize)
670 return -1;
672 if (m->precision > n->precision)
673 return 1;
674 else if (m->precision < n->precision)
675 return -1;
677 if (!m->component && !n->component)
678 return 0;
680 if (m->component->bytesize > n->component->bytesize)
681 return 1;
682 else if (m->component->bytesize < n->component->bytesize)
683 return -1;
685 if (m->component->precision > n->component->precision)
686 return 1;
687 else if (m->component->precision < n->component->precision)
688 return -1;
690 return 0;
693 static void
694 calc_wider_mode (void)
696 int c;
697 struct mode_data *m;
698 struct mode_data **sortbuf;
699 unsigned int max_n_modes = 0;
700 unsigned int i, j;
702 for (c = 0; c < MAX_MODE_CLASS; c++)
703 max_n_modes = MAX (max_n_modes, n_modes[c]);
705 /* Allocate max_n_modes + 1 entries to leave room for the extra null
706 pointer assigned after the qsort call below. */
707 sortbuf = (struct mode_data **) alloca ((max_n_modes + 1) * sizeof (struct mode_data *));
709 for (c = 0; c < MAX_MODE_CLASS; c++)
711 /* "wider" is not meaningful for MODE_RANDOM and MODE_CC.
712 However, we want these in textual order, and we have
713 precisely the reverse. */
714 if (c == MODE_RANDOM || c == MODE_CC)
716 struct mode_data *prev, *next;
718 for (prev = 0, m = modes[c]; m; m = next)
720 m->wider = void_mode;
721 m->wider_2x = void_mode;
723 /* this is nreverse */
724 next = m->next;
725 m->next = prev;
726 prev = m;
728 modes[c] = prev;
730 else
732 if (!modes[c])
733 continue;
735 for (i = 0, m = modes[c]; m; i++, m = m->next)
736 sortbuf[i] = m;
738 qsort (sortbuf, i, sizeof (struct mode_data *), cmp_modes);
740 sortbuf[i] = 0;
741 for (j = 0; j < i; j++)
742 sortbuf[j]->next = sortbuf[j]->wider = sortbuf[j + 1];
745 modes[c] = sortbuf[0];
750 /* Output routines. */
752 #define tagged_printf(FMT, ARG, TAG) do { \
753 int count_; \
754 printf (" " FMT ",%n", ARG, &count_); \
755 printf ("%*s/* %s */\n", 27 - count_, "", TAG); \
756 } while (0)
758 #define print_decl(TYPE, NAME, ASIZE) \
759 puts ("\nconst " TYPE " " NAME "[" ASIZE "] =\n{");
761 #define print_maybe_const_decl(TYPE, NAME, ASIZE, CATEGORY) \
762 printf ("\n" TYPE " " NAME "[" ASIZE "] = \n{\n", \
763 adj_##CATEGORY ? "" : "const ")
765 #define print_closer() puts ("};")
767 static void
768 emit_insn_modes_h (void)
770 int c;
771 struct mode_data *m, *first, *last;
773 printf ("/* Generated automatically from machmode.def%s%s\n",
774 HAVE_EXTRA_MODES ? " and " : "",
775 EXTRA_MODES_FILE);
777 puts ("\
778 by genmodes. */\n\
780 #ifndef GCC_INSN_MODES_H\n\
781 #define GCC_INSN_MODES_H\n\
783 enum machine_mode\n{");
785 for (c = 0; c < MAX_MODE_CLASS; c++)
786 for (m = modes[c]; m; m = m->next)
788 int count_;
789 printf (" %smode,%n", m->name, &count_);
790 printf ("%*s/* %s:%d */\n", 27 - count_, "",
791 trim_filename (m->file), m->line);
794 puts (" MAX_MACHINE_MODE,\n");
796 for (c = 0; c < MAX_MODE_CLASS; c++)
798 first = modes[c];
799 last = 0;
800 for (m = first; m; last = m, m = m->next)
803 /* Don't use BImode for MIN_MODE_INT, since otherwise the middle
804 end will try to use it for bitfields in structures and the
805 like, which we do not want. Only the target md file should
806 generate BImode widgets. */
807 if (first && first->precision == 1)
808 first = first->next;
810 if (first && last)
811 printf (" MIN_%s = %smode,\n MAX_%s = %smode,\n\n",
812 mode_class_names[c], first->name,
813 mode_class_names[c], last->name);
814 else
815 printf (" MIN_%s = %smode,\n MAX_%s = %smode,\n\n",
816 mode_class_names[c], void_mode->name,
817 mode_class_names[c], void_mode->name);
820 puts ("\
821 NUM_MACHINE_MODES = MAX_MACHINE_MODE\n\
822 };\n");
824 /* I can't think of a better idea, can you? */
825 printf ("#define CONST_MODE_SIZE%s\n", adj_bytesize ? "" : " const");
826 printf ("#define CONST_MODE_BASE_ALIGN%s\n", adj_alignment ? "" : " const");
827 #if 0 /* disabled for backward compatibility, temporary */
828 printf ("#define CONST_REAL_FORMAT_FOR_MODE%s\n", adj_format ? "" :" const");
829 #endif
830 puts ("\
832 #endif /* insn-modes.h */");
835 static void
836 emit_insn_modes_c_header (void)
838 printf ("/* Generated automatically from machmode.def%s%s\n",
839 HAVE_EXTRA_MODES ? " and " : "",
840 EXTRA_MODES_FILE);
842 puts ("\
843 by genmodes. */\n\
845 #include \"config.h\"\n\
846 #include \"system.h\"\n\
847 #include \"coretypes.h\"\n\
848 #include \"tm.h\"\n\
849 #include \"machmode.h\"\n\
850 #include \"real.h\"");
853 static void
854 emit_min_insn_modes_c_header (void)
856 printf ("/* Generated automatically from machmode.def%s%s\n",
857 HAVE_EXTRA_MODES ? " and " : "",
858 EXTRA_MODES_FILE);
860 puts ("\
861 by genmodes. */\n\
863 #include \"bconfig.h\"\n\
864 #include \"system.h\"\n\
865 #include \"machmode.h\"");
868 static void
869 emit_mode_name (void)
871 int c;
872 struct mode_data *m;
874 print_decl ("char *const", "mode_name", "NUM_MACHINE_MODES");
876 for_all_modes (c, m)
877 printf (" \"%s\",\n", m->name);
879 print_closer ();
882 static void
883 emit_mode_class (void)
885 int c;
886 struct mode_data *m;
888 print_decl ("unsigned char", "mode_class", "NUM_MACHINE_MODES");
890 for_all_modes (c, m)
891 tagged_printf ("%s", mode_class_names[m->cl], m->name);
893 print_closer ();
896 static void
897 emit_mode_precision (void)
899 int c;
900 struct mode_data *m;
902 print_decl ("unsigned short", "mode_precision", "NUM_MACHINE_MODES");
904 for_all_modes (c, m)
905 if (m->precision != (unsigned int)-1)
906 tagged_printf ("%u", m->precision, m->name);
907 else
908 tagged_printf ("%u*BITS_PER_UNIT", m->bytesize, m->name);
910 print_closer ();
913 static void
914 emit_mode_size (void)
916 int c;
917 struct mode_data *m;
919 print_maybe_const_decl ("%sunsigned char", "mode_size",
920 "NUM_MACHINE_MODES", bytesize);
922 for_all_modes (c, m)
923 tagged_printf ("%u", m->bytesize, m->name);
925 print_closer ();
928 static void
929 emit_mode_nunits (void)
931 int c;
932 struct mode_data *m;
934 print_decl ("unsigned char", "mode_nunits", "NUM_MACHINE_MODES");
936 for_all_modes (c, m)
937 tagged_printf ("%u", m->ncomponents, m->name);
939 print_closer ();
942 static void
943 emit_mode_wider (void)
945 int c;
946 struct mode_data *m;
948 print_decl ("unsigned char", "mode_wider", "NUM_MACHINE_MODES");
950 for_all_modes (c, m)
951 tagged_printf ("%smode",
952 m->wider ? m->wider->name : void_mode->name,
953 m->name);
955 print_closer ();
956 print_decl ("unsigned char", "mode_2xwider", "NUM_MACHINE_MODES");
958 for_all_modes (c, m)
960 struct mode_data * m2;
962 for (m2 = m;
963 m2 && m2 != void_mode;
964 m2 = m2->wider)
966 if (m2->bytesize < 2 * m->bytesize)
967 continue;
968 if (m->precision != (unsigned int) -1)
970 if (m2->precision != 2 * m->precision)
971 continue;
973 else
975 if (m2->precision != (unsigned int) -1)
976 continue;
979 break;
981 if (m2 == void_mode)
982 m2 = 0;
983 tagged_printf ("%smode",
984 m2 ? m2->name : void_mode->name,
985 m->name);
988 print_closer ();
991 static void
992 emit_mode_mask (void)
994 int c;
995 struct mode_data *m;
997 print_decl ("unsigned HOST_WIDE_INT", "mode_mask_array",
998 "NUM_MACHINE_MODES");
999 puts ("\
1000 #define MODE_MASK(m) \\\n\
1001 ((m) >= HOST_BITS_PER_WIDE_INT) \\\n\
1002 ? ~(unsigned HOST_WIDE_INT) 0 \\\n\
1003 : ((unsigned HOST_WIDE_INT) 1 << (m)) - 1\n");
1005 for_all_modes (c, m)
1006 if (m->precision != (unsigned int)-1)
1007 tagged_printf ("MODE_MASK (%u)", m->precision, m->name);
1008 else
1009 tagged_printf ("MODE_MASK (%u*BITS_PER_UNIT)", m->bytesize, m->name);
1011 puts ("#undef MODE_MASK");
1012 print_closer ();
1015 static void
1016 emit_mode_inner (void)
1018 int c;
1019 struct mode_data *m;
1021 print_decl ("unsigned char", "mode_inner", "NUM_MACHINE_MODES");
1023 for_all_modes (c, m)
1024 tagged_printf ("%smode",
1025 m->component ? m->component->name : void_mode->name,
1026 m->name);
1028 print_closer ();
1031 static void
1032 emit_mode_base_align (void)
1034 int c;
1035 struct mode_data *m;
1037 print_maybe_const_decl ("%sunsigned char",
1038 "mode_base_align", "NUM_MACHINE_MODES",
1039 alignment);
1041 for_all_modes (c, m)
1042 tagged_printf ("%u", m->alignment, m->name);
1044 print_closer ();
1047 static void
1048 emit_class_narrowest_mode (void)
1050 int c;
1052 print_decl ("unsigned char", "class_narrowest_mode", "MAX_MODE_CLASS");
1054 for (c = 0; c < MAX_MODE_CLASS; c++)
1055 /* Bleah, all this to get the comment right for MIN_MODE_INT. */
1056 tagged_printf ("MIN_%s", mode_class_names[c],
1057 modes[c]
1058 ? (modes[c]->precision != 1
1059 ? modes[c]->name
1060 : (modes[c]->next
1061 ? modes[c]->next->name
1062 : void_mode->name))
1063 : void_mode->name);
1065 print_closer ();
1068 static void
1069 emit_real_format_for_mode (void)
1071 struct mode_data *m;
1073 /* The entities pointed to by this table are constant, whether
1074 or not the table itself is constant.
1076 For backward compatibility this table is always writable
1077 (several targets modify it in OVERRIDE_OPTIONS). FIXME:
1078 convert all said targets to use ADJUST_FORMAT instead. */
1079 #if 0
1080 print_maybe_const_decl ("const struct real_format *%s",
1081 "real_format_for_mode",
1082 "MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1",
1083 format);
1084 #else
1085 print_decl ("struct real_format *\n", "real_format_for_mode",
1086 "MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1");
1087 #endif
1089 for (m = modes[MODE_FLOAT]; m; m = m->next)
1090 if (!strcmp (m->format, "0"))
1091 tagged_printf ("%s", m->format, m->name);
1092 else
1093 tagged_printf ("&%s", m->format, m->name);
1095 print_closer ();
1098 static void
1099 emit_mode_adjustments (void)
1101 struct mode_adjust *a;
1102 struct mode_data *m;
1104 puts ("\
1105 \nvoid\
1106 \ninit_adjust_machine_modes (void)\
1107 \n{\
1108 \n size_t s ATTRIBUTE_UNUSED;");
1110 /* Size adjustments must be propagated to all containing modes.
1111 A size adjustment forces us to recalculate the alignment too. */
1112 for (a = adj_bytesize; a; a = a->next)
1114 printf ("\n /* %s:%d */\n s = %s;\n",
1115 a->file, a->line, a->adjustment);
1116 printf (" mode_size[%smode] = s;\n", a->mode->name);
1117 printf (" mode_base_align[%smode] = s & (~s + 1);\n",
1118 a->mode->name);
1120 for (m = a->mode->contained; m; m = m->next_cont)
1122 switch (m->cl)
1124 case MODE_COMPLEX_INT:
1125 case MODE_COMPLEX_FLOAT:
1126 printf (" mode_size[%smode] = 2*s;\n", m->name);
1127 printf (" mode_base_align[%smode] = s & (~s + 1);\n",
1128 m->name);
1129 break;
1131 case MODE_VECTOR_INT:
1132 case MODE_VECTOR_FLOAT:
1133 printf (" mode_size[%smode] = %d*s;\n",
1134 m->name, m->ncomponents);
1135 printf (" mode_base_align[%smode] = (%d*s) & (~(%d*s)+1);\n",
1136 m->name, m->ncomponents, m->ncomponents);
1137 break;
1139 default:
1140 internal_error (
1141 "mode %s is neither vector nor complex but contains %s",
1142 m->name, a->mode->name);
1143 /* NOTREACHED */
1148 /* Alignment adjustments propagate too.
1149 ??? This may not be the right thing for vector modes. */
1150 for (a = adj_alignment; a; a = a->next)
1152 printf ("\n /* %s:%d */\n s = %s;\n",
1153 a->file, a->line, a->adjustment);
1154 printf (" mode_base_align[%smode] = s;\n", a->mode->name);
1156 for (m = a->mode->contained; m; m = m->next_cont)
1158 switch (m->cl)
1160 case MODE_COMPLEX_INT:
1161 case MODE_COMPLEX_FLOAT:
1162 printf (" mode_base_align[%smode] = s;\n", m->name);
1163 break;
1165 case MODE_VECTOR_INT:
1166 case MODE_VECTOR_FLOAT:
1167 printf (" mode_base_align[%smode] = %d*s;\n",
1168 m->name, m->ncomponents);
1169 break;
1171 default:
1172 internal_error (
1173 "mode %s is neither vector nor complex but contains %s",
1174 m->name, a->mode->name);
1175 /* NOTREACHED */
1180 /* Real mode formats don't have to propagate anywhere. */
1181 for (a = adj_format; a; a = a->next)
1182 printf ("\n /* %s:%d */\n REAL_MODE_FORMAT (%smode) = %s;\n",
1183 a->file, a->line, a->mode->name, a->adjustment);
1185 puts ("}");
1188 static void
1189 emit_insn_modes_c (void)
1191 emit_insn_modes_c_header ();
1192 emit_mode_name ();
1193 emit_mode_class ();
1194 emit_mode_precision ();
1195 emit_mode_size ();
1196 emit_mode_nunits ();
1197 emit_mode_wider ();
1198 emit_mode_mask ();
1199 emit_mode_inner ();
1200 emit_mode_base_align ();
1201 emit_class_narrowest_mode ();
1202 emit_real_format_for_mode ();
1203 emit_mode_adjustments ();
1206 static void
1207 emit_min_insn_modes_c (void)
1209 emit_min_insn_modes_c_header ();
1210 emit_mode_name ();
1211 emit_mode_class ();
1212 emit_mode_wider ();
1213 emit_class_narrowest_mode ();
1216 /* Master control. */
1218 main(int argc, char **argv)
1220 bool gen_header = false, gen_min = false;
1221 progname = argv[0];
1223 if (argc == 1)
1225 else if (argc == 2 && !strcmp (argv[1], "-h"))
1226 gen_header = true;
1227 else if (argc == 2 && !strcmp (argv[1], "-m"))
1228 gen_min = true;
1229 else
1231 error ("usage: %s [-h|-m] > file", progname);
1232 return FATAL_EXIT_CODE;
1235 modes_by_name = htab_create_alloc (64, hash_mode, eq_mode, 0, xcalloc, free);
1237 create_modes ();
1238 complete_all_modes ();
1240 if (have_error)
1241 return FATAL_EXIT_CODE;
1243 calc_wider_mode ();
1245 if (gen_header)
1246 emit_insn_modes_h ();
1247 else if (gen_min)
1248 emit_min_insn_modes_c ();
1249 else
1250 emit_insn_modes_c ();
1252 if (fflush (stdout) || fclose (stdout))
1253 return FATAL_EXIT_CODE;
1254 return SUCCESS_EXIT_CODE;