annotate gcc/genmodes.c @ 138:fc828634a951

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