1 /* This file contains the definitions and documentation for the
2 machine modes used in the GNU compiler.
3 Copyright (C
) 1987, 1992, 1994, 1997, 1998, 2000, 2003
4 Free Software Foundation
, Inc.
6 This file is part of GCC.
8 GCC is free software
; you can redistribute it and
/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation
; either version
2, or (at your option
) any later
13 GCC is distributed in the hope that it will be useful
, but WITHOUT ANY
14 WARRANTY
; without even the implied warranty of MERCHANTABILITY or
15 FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC
; see the file COPYING. If not
, write to the Free
20 Software Foundation
, 59 Temple Place
- Suite
330, Boston
, MA
24 /* This file defines all the MACHINE MODES used by GCC.
26 A machine mode specifies a size and format of data
29 Each RTL expression has a machine mode.
31 At the syntax tree level
, each ..._TYPE and each ..._DECL node
32 has a machine mode which describes data of that type or the
33 data of the variable declared.
*/
35 /* This file is included by the genmodes program. Its text is the
36 body of a function. Do not rely on this
, it will change in the
39 The following statements can be used in this file
-- all have
40 the form of a C macro call. In their arguments
:
42 A CLASS argument must be one of the constants defined in
43 mode
-classes.def
, less the leading MODE_ prefix
; some statements
44 that take CLASS arguments have restructions on which classes are
45 acceptable. For instance
, INT.
47 A MODE argument must be the printable name of a machine mode
,
48 without quotation marks or trailing
"mode". For instance
, SI.
50 A PRECISION
, BYTESIZE
, or COUNT argument must be a positive integer
53 A FORMAT argument must be one of the real_mode_format structures
54 declared in real.h
, or else a literal
0. Do not put a leading
&
57 An EXPR argument must be a syntactically valid C expression.
58 If an EXPR contains commas
, you may need to write an extra pair of
59 parentheses around it
, so it appears to be a single argument to the
62 This file defines only those modes which are of use on almost all
63 machines. Other modes can be defined in the target
-specific
64 mode definition file
, config
/ARCH
/ARCH
-modes.def.
66 Order matters in this file in so far as statements which refer to
67 other modes must appear after the modes they refer to. However
,
68 statements which do not refer to other modes may appear in any
72 declares MODE to be of class RANDOM.
75 declares MODE to be of class CC.
77 INT_MODE (MODE
, BYTESIZE
);
78 declares MODE to be of class INT and BYTESIZE bytes wide.
79 All of the bits of its representation are significant.
81 FRACTIONAL_INT_MODE (MODE
, PRECISION
, BYTESIZE
);
82 declares MODE to be of class INT
, BYTESIZE bytes wide in
83 storage
, but with only PRECISION significant bits.
85 FLOAT_MODE (MODE
, BYTESIZE
, FORMAT
);
86 declares MODE to be of class
FLOAT and BYTESIZE bytes wide
,
87 using floating point format FORMAT.
88 All of the bits of its representation are significant.
90 FRACTIONAL_FLOAT_MODE (MODE
, PRECISION
, BYTESIZE
, FORMAT
);
91 declares MODE to be of class
FLOAT, BYTESIZE bytes wide in
92 storage
, but with only PRECISION significant bits
, using
93 floating point format FORMAT.
95 RESET_FLOAT_FORMAT (MODE
, FORMAT
);
96 changes the format of MODE
, which must be class
FLOAT,
97 to FORMAT. Use in an ARCH
-modes.def to reset the format
98 of one of the float modes defined in this file.
100 PARTIAL_INT_MODE (MODE
);
101 declares a mode of class PARTIAL_INT with the same size as
102 MODE (which must be an INT mode
). The name of the new mode
103 is made by prefixing a P to the name MODE. This statement
104 may grow a PRECISION argument in the future.
106 VECTOR_MODE (CLASS
, MODE
, COUNT
);
107 Declare a vector mode whose component mode is
MODE (of class
108 CLASS
) with COUNT components. CLASS must be INT or
FLOAT.
109 The name of the vector mode takes the form VnX where n is
110 COUNT in decimal and X is MODE.
112 VECTOR_MODES (CLASS
, WIDTH
);
113 For all modes presently declared in class CLASS
, construct
114 corresponding vector modes having width WIDTH. Modes whose
115 byte sizes do not evenly divide WIDTH are ignored
, as are
116 modes that would produce vector modes with only one component
,
117 and modes smaller than one
byte (if CLASS is INT
) or smaller
118 than two
bytes (if CLASS is
FLOAT). CLASS must be INT or
119 FLOAT. The names follow the same rule as VECTOR_MODE uses.
121 COMPLEX_MODES (CLASS
);
122 For all modes presently declared in class CLASS
, construct
123 corresponding complex modes. Modes smaller than one byte
124 are ignored. For
FLOAT modes
, the names are derived by
125 replacing the
'F' in the mode name with a
'C'.
(It is an
126 error if there is no
'F'. For INT modes
, the names are
127 derived by prefixing a C to the name.
129 ADJUST_BYTESIZE (MODE
, EXPR
);
130 ADJUST_ALIGNMENT (MODE
, EXPR
);
131 ADJUST_FLOAT_FORMAT (MODE
, EXPR
);
132 Arrange for the byte size
, alignment
, or floating point format
133 of MODE to be adjustable at run time. EXPR will be executed
134 once after processing all command line options
, and should
135 evaluate to the desired byte size
, alignment
, or format.
137 Unlike a FORMAT argument
, if you are adjusting a float format
138 you must put an
& in front of the name of each format structure.
140 Note
: If a mode is ever made which is more than
255 bytes wide
,
141 machmode.h and genmodes.c will have to be changed to allocate
142 more space for the mode_size and mode_alignment arrays.
*/
144 /* VOIDmode is used when no mode needs to be specified
,
145 as for example on CONST_INT RTL expressions.
*/
148 /* BLKmode is used for structures
, arrays
, etc.
149 that fit no more specific mode.
*/
152 /* Single bit mode used for booleans.
*/
153 FRACTIONAL_INT_MODE (BI
, 1, 1);
155 /* Basic integer modes. We go up to TI in generic
code (128 bits
).
156 The name OI is reserved for a
256-bit
type (needed by some back ends
).
157 FIXME TI shouldn
't be generically available either. */
164 /* No partial integer modes are defined by default. */
166 /* Basic floating point modes. SF and DF are the only modes provided
167 by default. The names QF, HF, XF, and TF are reserved for targets
168 that need 1-word, 2-word, 80-bit, or 128-bit float types respectively.
170 These are the IEEE mappings. They can be overridden with
171 RESET_FLOAT_FORMAT or at runtime (in OVERRIDE_OPTIONS). */
173 FLOAT_MODE (SF, 4, ieee_single_format);
174 FLOAT_MODE (DF, 8, ieee_double_format);
177 FIXME define this only for targets that need it. */
180 /* Allow the target to specify additional modes of various kinds. */
182 # include EXTRA_MODES_FILE
187 COMPLEX_MODES (FLOAT);
190 VECTOR_MODES (INT, 2); /* V2QI */
191 VECTOR_MODES (INT, 4); /* V4QI V2HI */
192 VECTOR_MODES (INT, 8); /* V8QI V4HI V2SI */
193 VECTOR_MODES (INT, 16); /* V16QI V8HI V4SI V2DI */
194 /* VECTOR_MODES (INT, 32); V8SI V4DI */
195 /* VECTOR_MODES (INT, 64); V8DI */
197 VECTOR_MODE (INT, SI, 8)
198 VECTOR_MODE (INT, DI, 4);
199 VECTOR_MODE (INT, DI, 8);
201 /* PPC uses this to distinguish between DImode passed in
202 float registers and DImode passed in vector registers.
203 It would be in rs6000-modes.def but it's referenced in
204 c
-common.c. FIXME.
*/
206 VECTOR_MODE (INT
, DI
, 1);
208 VECTOR_MODES (FLOAT, 4); /* V2HF
*/
209 VECTOR_MODES (FLOAT, 8); /* V4HF V2SF
*/
210 VECTOR_MODES (FLOAT, 16); /* V8HF V4SF V2DF
*/
211 /* VECTOR_MODES (FLOAT, 32); V8SF V4DF
*/
212 /* VECTOR_MODES (FLOAT, 64); V16SF V8DF
*/
214 VECTOR_MODE (FLOAT, SF
, 8);
215 VECTOR_MODE (FLOAT, SF
, 16);
216 VECTOR_MODE (FLOAT, DF
, 4);
217 VECTOR_MODE (FLOAT, DF
, 8);
219 /* The symbol Pmode stands for one of the above machine
modes (usually SImode
).
220 The tm.h file specifies which one. It is not a distinct mode.
*/