annotate gcc/genmodes.c @ 158:494b0b89df80 default tip

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