]>
Commit | Line | Data |
---|---|---|
95e304f7 | 1 | /* This file contains the definitions and documentation for the |
38e01259 | 2 | machine modes used in the GNU compiler. |
818ab71a | 3 | Copyright (C) 1987-2016 Free Software Foundation, Inc. |
95e304f7 | 4 | |
1322177d | 5 | This file is part of GCC. |
95e304f7 | 6 | |
1322177d LB |
7 | GCC is free software; you can redistribute it and/or modify it under |
8 | the terms of the GNU General Public License as published by the Free | |
9dcd6f09 | 9 | Software Foundation; either version 3, or (at your option) any later |
1322177d | 10 | version. |
95e304f7 | 11 | |
1322177d LB |
12 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 | for more details. | |
95e304f7 CH |
16 | |
17 | You should have received a copy of the GNU General Public License | |
9dcd6f09 NC |
18 | along with GCC; see the file COPYING3. If not see |
19 | <http://www.gnu.org/licenses/>. */ | |
95e304f7 CH |
20 | |
21 | ||
1322177d | 22 | /* This file defines all the MACHINE MODES used by GCC. |
95e304f7 CH |
23 | |
24 | A machine mode specifies a size and format of data | |
25 | at the machine level. | |
26 | ||
27 | Each RTL expression has a machine mode. | |
28 | ||
29 | At the syntax tree level, each ..._TYPE and each ..._DECL node | |
30 | has a machine mode which describes data of that type or the | |
31 | data of the variable declared. */ | |
32 | ||
0974c7d7 ZW |
33 | /* This file is included by the genmodes program. Its text is the |
34 | body of a function. Do not rely on this, it will change in the | |
35 | future. | |
36 | ||
37 | The following statements can be used in this file -- all have | |
38 | the form of a C macro call. In their arguments: | |
39 | ||
40 | A CLASS argument must be one of the constants defined in | |
41 | mode-classes.def, less the leading MODE_ prefix; some statements | |
aabcd309 | 42 | that take CLASS arguments have restrictions on which classes are |
0974c7d7 ZW |
43 | acceptable. For instance, INT. |
44 | ||
45 | A MODE argument must be the printable name of a machine mode, | |
46 | without quotation marks or trailing "mode". For instance, SI. | |
47 | ||
37783865 | 48 | A PRECISION, BYTESIZE, or COUNT argument must be a positive integer |
0974c7d7 ZW |
49 | constant. |
50 | ||
94134f42 | 51 | A FORMAT argument must be one of the real_mode_format structures |
b8eaca23 ZW |
52 | declared in real.h, or else a literal 0. Do not put a leading & |
53 | on the argument. | |
54 | ||
55 | An EXPR argument must be a syntactically valid C expression. | |
56 | If an EXPR contains commas, you may need to write an extra pair of | |
57 | parentheses around it, so it appears to be a single argument to the | |
58 | statement. | |
94134f42 ZW |
59 | |
60 | This file defines only those modes which are of use on almost all | |
61 | machines. Other modes can be defined in the target-specific | |
62 | mode definition file, config/ARCH/ARCH-modes.def. | |
63 | ||
0974c7d7 ZW |
64 | Order matters in this file in so far as statements which refer to |
65 | other modes must appear after the modes they refer to. However, | |
66 | statements which do not refer to other modes may appear in any | |
67 | order. | |
68 | ||
69 | RANDOM_MODE (MODE); | |
70 | declares MODE to be of class RANDOM. | |
71 | ||
72 | CC_MODE (MODE); | |
73 | declares MODE to be of class CC. | |
74 | ||
75 | INT_MODE (MODE, BYTESIZE); | |
76 | declares MODE to be of class INT and BYTESIZE bytes wide. | |
77 | All of the bits of its representation are significant. | |
78 | ||
37783865 | 79 | FRACTIONAL_INT_MODE (MODE, PRECISION, BYTESIZE); |
0974c7d7 | 80 | declares MODE to be of class INT, BYTESIZE bytes wide in |
37783865 | 81 | storage, but with only PRECISION significant bits. |
0974c7d7 | 82 | |
94134f42 ZW |
83 | FLOAT_MODE (MODE, BYTESIZE, FORMAT); |
84 | declares MODE to be of class FLOAT and BYTESIZE bytes wide, | |
85 | using floating point format FORMAT. | |
0974c7d7 ZW |
86 | All of the bits of its representation are significant. |
87 | ||
37783865 | 88 | FRACTIONAL_FLOAT_MODE (MODE, PRECISION, BYTESIZE, FORMAT); |
0974c7d7 | 89 | declares MODE to be of class FLOAT, BYTESIZE bytes wide in |
37783865 | 90 | storage, but with only PRECISION significant bits, using |
94134f42 ZW |
91 | floating point format FORMAT. |
92 | ||
2b6e2d13 KZ |
93 | DECIMAL_FLOAT_MODE (MODE, BYTESIZE, FORMAT); |
94 | declares MODE to be of class DECIMAL_FLOAT and BYTESIZE bytes | |
95 | wide. All of the bits of its representation are significant. | |
96 | ||
97 | FRACTIONAL_DECIMAL_FLOAT_MODE (MODE, BYTESIZE, FORMAT); | |
98 | declares MODE to be of class DECIMAL_FLOAT and BYTESIZE bytes | |
99 | wide. All of the bits of its representation are significant. | |
100 | ||
1699ec0b CF |
101 | FRACT_MODE (MODE, BYTESIZE, FBIT); |
102 | declares MODE to be of class FRACT and BYTESIZE bytes wide | |
103 | with FBIT fractional bits. There may be padding bits. | |
104 | ||
105 | UFRACT_MODE (MODE, BYTESIZE, FBIT); | |
106 | declares MODE to be of class UFRACT and BYTESIZE bytes wide | |
107 | with FBIT fractional bits. There may be padding bits. | |
108 | ||
109 | ACCUM_MODE (MODE, BYTESIZE, IBIT, FBIT); | |
110 | declares MODE to be of class ACCUM and BYTESIZE bytes wide | |
111 | with IBIT integral bits and FBIT fractional bits. | |
112 | There may be padding bits. | |
113 | ||
2b6e2d13 | 114 | UACCUM_MODE (MODE, BYTESIZE, IBIT, FBIT); |
1699ec0b CF |
115 | declares MODE to be of class UACCUM and BYTESIZE bytes wide |
116 | with IBIT integral bits and FBIT fractional bits. | |
117 | There may be padding bits. | |
118 | ||
94134f42 ZW |
119 | RESET_FLOAT_FORMAT (MODE, FORMAT); |
120 | changes the format of MODE, which must be class FLOAT, | |
121 | to FORMAT. Use in an ARCH-modes.def to reset the format | |
122 | of one of the float modes defined in this file. | |
0974c7d7 | 123 | |
d8487c94 | 124 | PARTIAL_INT_MODE (MODE, PRECISION, NAME); |
0974c7d7 | 125 | declares a mode of class PARTIAL_INT with the same size as |
d8487c94 MS |
126 | MODE (which must be an INT mode) and precision PREC. |
127 | Optionally, NAME is the new name of the mode. NAME is the | |
128 | name of the mode. | |
0974c7d7 ZW |
129 | |
130 | VECTOR_MODE (CLASS, MODE, COUNT); | |
131 | Declare a vector mode whose component mode is MODE (of class | |
132 | CLASS) with COUNT components. CLASS must be INT or FLOAT. | |
133 | The name of the vector mode takes the form VnX where n is | |
134 | COUNT in decimal and X is MODE. | |
135 | ||
136 | VECTOR_MODES (CLASS, WIDTH); | |
137 | For all modes presently declared in class CLASS, construct | |
138 | corresponding vector modes having width WIDTH. Modes whose | |
139 | byte sizes do not evenly divide WIDTH are ignored, as are | |
140 | modes that would produce vector modes with only one component, | |
141 | and modes smaller than one byte (if CLASS is INT) or smaller | |
142 | than two bytes (if CLASS is FLOAT). CLASS must be INT or | |
143 | FLOAT. The names follow the same rule as VECTOR_MODE uses. | |
144 | ||
145 | COMPLEX_MODES (CLASS); | |
146 | For all modes presently declared in class CLASS, construct | |
147 | corresponding complex modes. Modes smaller than one byte | |
148 | are ignored. For FLOAT modes, the names are derived by | |
149 | replacing the 'F' in the mode name with a 'C'. (It is an | |
150 | error if there is no 'F'. For INT modes, the names are | |
151 | derived by prefixing a C to the name. | |
152 | ||
b8eaca23 ZW |
153 | ADJUST_BYTESIZE (MODE, EXPR); |
154 | ADJUST_ALIGNMENT (MODE, EXPR); | |
155 | ADJUST_FLOAT_FORMAT (MODE, EXPR); | |
1699ec0b CF |
156 | ADJUST_IBIT (MODE, EXPR); |
157 | ADJUST_FBIT (MODE, EXPR); | |
158 | Arrange for the byte size, alignment, floating point format, ibit, | |
159 | or fbit of MODE to be adjustable at run time. EXPR will be executed | |
b8eaca23 | 160 | once after processing all command line options, and should |
1699ec0b | 161 | evaluate to the desired byte size, alignment, format, ibit or fbit. |
b8eaca23 ZW |
162 | |
163 | Unlike a FORMAT argument, if you are adjusting a float format | |
164 | you must put an & in front of the name of each format structure. | |
165 | ||
0974c7d7 ZW |
166 | Note: If a mode is ever made which is more than 255 bytes wide, |
167 | machmode.h and genmodes.c will have to be changed to allocate | |
168 | more space for the mode_size and mode_alignment arrays. */ | |
95e304f7 CH |
169 | |
170 | /* VOIDmode is used when no mode needs to be specified, | |
171 | as for example on CONST_INT RTL expressions. */ | |
0974c7d7 ZW |
172 | RANDOM_MODE (VOID); |
173 | ||
174 | /* BLKmode is used for structures, arrays, etc. | |
175 | that fit no more specific mode. */ | |
176 | RANDOM_MODE (BLK); | |
177 | ||
178 | /* Single bit mode used for booleans. */ | |
179 | FRACTIONAL_INT_MODE (BI, 1, 1); | |
a191f0ee | 180 | |
94134f42 | 181 | /* Basic integer modes. We go up to TI in generic code (128 bits). |
8697be17 KZ |
182 | TImode is needed here because the some front ends now genericly |
183 | support __int128. If the front ends decide to generically support | |
184 | larger types, then corresponding modes must be added here. The | |
185 | name OI is reserved for a 256-bit type (needed by some back ends). | |
186 | */ | |
0974c7d7 ZW |
187 | INT_MODE (QI, 1); |
188 | INT_MODE (HI, 2); | |
189 | INT_MODE (SI, 4); | |
190 | INT_MODE (DI, 8); | |
191 | INT_MODE (TI, 16); | |
94134f42 ZW |
192 | |
193 | /* No partial integer modes are defined by default. */ | |
194 | ||
78a7c317 DD |
195 | /* The target normally defines any target-specific __intN types and |
196 | their modes, but __int128 for TImode is fairly common so define it | |
197 | here. The type will not be created unless the target supports | |
198 | TImode. */ | |
199 | ||
200 | INT_N (TI, 128); | |
201 | ||
94134f42 ZW |
202 | /* Basic floating point modes. SF and DF are the only modes provided |
203 | by default. The names QF, HF, XF, and TF are reserved for targets | |
204 | that need 1-word, 2-word, 80-bit, or 128-bit float types respectively. | |
205 | ||
206 | These are the IEEE mappings. They can be overridden with | |
c5387660 | 207 | RESET_FLOAT_FORMAT or at runtime (in TARGET_OPTION_OVERRIDE). */ |
94134f42 ZW |
208 | |
209 | FLOAT_MODE (SF, 4, ieee_single_format); | |
210 | FLOAT_MODE (DF, 8, ieee_double_format); | |
211 | ||
212 | /* Basic CC modes. | |
213 | FIXME define this only for targets that need it. */ | |
0974c7d7 ZW |
214 | CC_MODE (CC); |
215 | ||
1699ec0b CF |
216 | /* Fixed-point modes. */ |
217 | FRACT_MODE (QQ, 1, 7); /* s.7 */ | |
218 | FRACT_MODE (HQ, 2, 15); /* s.15 */ | |
219 | FRACT_MODE (SQ, 4, 31); /* s.31 */ | |
220 | FRACT_MODE (DQ, 8, 63); /* s.63 */ | |
221 | FRACT_MODE (TQ, 16, 127); /* s.127 */ | |
222 | ||
223 | UFRACT_MODE (UQQ, 1, 8); /* .8 */ | |
224 | UFRACT_MODE (UHQ, 2, 16); /* .16 */ | |
225 | UFRACT_MODE (USQ, 4, 32); /* .32 */ | |
226 | UFRACT_MODE (UDQ, 8, 64); /* .64 */ | |
227 | UFRACT_MODE (UTQ, 16, 128); /* .128 */ | |
228 | ||
229 | ACCUM_MODE (HA, 2, 8, 7); /* s8.7 */ | |
230 | ACCUM_MODE (SA, 4, 16, 15); /* s16.15 */ | |
231 | ACCUM_MODE (DA, 8, 32, 31); /* s32.31 */ | |
232 | ACCUM_MODE (TA, 16, 64, 63); /* s64.63 */ | |
233 | ||
234 | UACCUM_MODE (UHA, 2, 8, 8); /* 8.8 */ | |
235 | UACCUM_MODE (USA, 4, 16, 16); /* 16.16 */ | |
236 | UACCUM_MODE (UDA, 8, 32, 32); /* 32.32 */ | |
237 | UACCUM_MODE (UTA, 16, 64, 64); /* 64.64 */ | |
238 | ||
0974c7d7 ZW |
239 | /* Allow the target to specify additional modes of various kinds. */ |
240 | #if HAVE_EXTRA_MODES | |
0974c7d7 | 241 | # include EXTRA_MODES_FILE |
0974c7d7 | 242 | #endif |
95e304f7 | 243 | |
c100b4ef | 244 | /* Complex modes. */ |
0974c7d7 ZW |
245 | COMPLEX_MODES (INT); |
246 | COMPLEX_MODES (FLOAT); | |
c100b4ef | 247 | |
909e2256 JG |
248 | /* Decimal floating point modes. */ |
249 | DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format); | |
250 | DECIMAL_FLOAT_MODE (DD, 8, decimal_double_format); | |
251 | DECIMAL_FLOAT_MODE (TD, 16, decimal_quad_format); | |
252 | ||
95e304f7 | 253 | /* The symbol Pmode stands for one of the above machine modes (usually SImode). |
0974c7d7 | 254 | The tm.h file specifies which one. It is not a distinct mode. */ |
95e304f7 CH |
255 | |
256 | /* | |
257 | Local variables: | |
258 | mode:c | |
259 | version-control: t | |
260 | End: | |
261 | */ |