1 /* This file contains the definitions and documentation for the
2 machine modes used in the GNU compiler.
3 Copyright (C
) 1987-2013 Free Software Foundation
, Inc.
5 This file is part of GCC.
7 GCC is free software
; you can redistribute it and
/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation
; either version
3, or (at your option
) any later
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
17 You should have received a copy of the GNU General Public License
18 along with GCC
; see the file COPYING3. If not see
19 <http
://www.gnu.org
/licenses
/>.
*/
22 /* This file defines all the MACHINE MODES used by GCC.
24 A machine mode specifies a size and format of data
27 Each RTL expression has a machine mode.
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.
*/
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
37 The following statements can be used in this file
-- all have
38 the form of a C macro call. In their arguments
:
40 A CLASS argument must be one of the constants defined in
41 mode
-classes.def
, less the leading MODE_ prefix
; some statements
42 that take CLASS arguments have restrictions on which classes are
43 acceptable. For instance
, INT.
45 A MODE argument must be the printable name of a machine mode
,
46 without quotation marks or trailing
"mode". For instance
, SI.
48 A PRECISION
, BYTESIZE
, or COUNT argument must be a positive integer
51 A FORMAT argument must be one of the real_mode_format structures
52 declared in real.h
, or else a literal
0. Do not put a leading
&
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
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.
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
70 declares MODE to be of class RANDOM.
73 declares MODE to be of class CC.
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.
79 FRACTIONAL_INT_MODE (MODE
, PRECISION
, BYTESIZE
);
80 declares MODE to be of class INT
, BYTESIZE bytes wide in
81 storage
, but with only PRECISION significant bits.
83 FLOAT_MODE (MODE
, BYTESIZE
, FORMAT
);
84 declares MODE to be of class
FLOAT and BYTESIZE bytes wide
,
85 using floating point format FORMAT.
86 All of the bits of its representation are significant.
88 FRACTIONAL_FLOAT_MODE (MODE
, PRECISION
, BYTESIZE
, FORMAT
);
89 declares MODE to be of class
FLOAT, BYTESIZE bytes wide in
90 storage
, but with only PRECISION significant bits
, using
91 floating point format FORMAT.
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.
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.
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.
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.
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.
114 UACCUM_MODE (MODE
, BYTESIZE
, IBIT
, FBIT
);
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.
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.
124 PARTIAL_INT_MODE (MODE
);
125 declares a mode of class PARTIAL_INT with the same size as
126 MODE (which must be an INT mode
). The name of the new mode
127 is made by prefixing a P to the name MODE. This statement
128 may grow a PRECISION argument in the future.
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.
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.
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.
153 ADJUST_BYTESIZE (MODE
, EXPR
);
154 ADJUST_ALIGNMENT (MODE
, EXPR
);
155 ADJUST_FLOAT_FORMAT (MODE
, EXPR
);
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
160 once after processing all command line options
, and should
161 evaluate to the desired byte size
, alignment
, format
, ibit or fbit.
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.
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.
*/
170 /* VOIDmode is used when no mode needs to be specified
,
171 as for example on CONST_INT RTL expressions.
*/
174 /* BLKmode is used for structures
, arrays
, etc.
175 that fit no more specific mode.
*/
178 /* Single bit mode used for booleans.
*/
179 FRACTIONAL_INT_MODE (BI
, 1, 1);
181 /* Basic integer modes. We go up to TI in generic
code (128 bits
).
182 The name OI is reserved for a
256-bit
type (needed by some back ends
).
183 FIXME TI shouldn
't be generically available either. */
190 /* No partial integer modes are defined by default. */
192 /* Basic floating point modes. SF and DF are the only modes provided
193 by default. The names QF, HF, XF, and TF are reserved for targets
194 that need 1-word, 2-word, 80-bit, or 128-bit float types respectively.
196 These are the IEEE mappings. They can be overridden with
197 RESET_FLOAT_FORMAT or at runtime (in TARGET_OPTION_OVERRIDE). */
199 FLOAT_MODE (SF, 4, ieee_single_format);
200 FLOAT_MODE (DF, 8, ieee_double_format);
203 FIXME define this only for targets that need it. */
206 /* Fixed-point modes. */
207 FRACT_MODE (QQ, 1, 7); /* s.7 */
208 FRACT_MODE (HQ, 2, 15); /* s.15 */
209 FRACT_MODE (SQ, 4, 31); /* s.31 */
210 FRACT_MODE (DQ, 8, 63); /* s.63 */
211 FRACT_MODE (TQ, 16, 127); /* s.127 */
213 UFRACT_MODE (UQQ, 1, 8); /* .8 */
214 UFRACT_MODE (UHQ, 2, 16); /* .16 */
215 UFRACT_MODE (USQ, 4, 32); /* .32 */
216 UFRACT_MODE (UDQ, 8, 64); /* .64 */
217 UFRACT_MODE (UTQ, 16, 128); /* .128 */
219 ACCUM_MODE (HA, 2, 8, 7); /* s8.7 */
220 ACCUM_MODE (SA, 4, 16, 15); /* s16.15 */
221 ACCUM_MODE (DA, 8, 32, 31); /* s32.31 */
222 ACCUM_MODE (TA, 16, 64, 63); /* s64.63 */
224 UACCUM_MODE (UHA, 2, 8, 8); /* 8.8 */
225 UACCUM_MODE (USA, 4, 16, 16); /* 16.16 */
226 UACCUM_MODE (UDA, 8, 32, 32); /* 32.32 */
227 UACCUM_MODE (UTA, 16, 64, 64); /* 64.64 */
229 /* Allow the target to specify additional modes of various kinds. */
231 # include EXTRA_MODES_FILE
236 COMPLEX_MODES (FLOAT);
238 /* Decimal floating point modes. */
239 DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format);
240 DECIMAL_FLOAT_MODE (DD, 8, decimal_double_format);
241 DECIMAL_FLOAT_MODE (TD, 16, decimal_quad_format);
243 /* The symbol Pmode stands for one of the above machine modes (usually SImode).
244 The tm.h file specifies which one. It is not a distinct mode. */