]>
Commit | Line | Data |
---|---|---|
5e6908ea | 1 | /* Machine mode definitions for GCC; included by rtl.h and tree.h. |
975d393a | 2 | Copyright (C) 1991, 1993, 1994, 1996, 1998, 1999, 2000, 2001 |
72c602fc | 3 | Free Software Foundation, Inc. |
fc152a4b | 4 | |
1322177d | 5 | This file is part of GCC. |
fc152a4b | 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 | |
9 | Software Foundation; either version 2, or (at your option) any later | |
10 | version. | |
fc152a4b | 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. | |
fc152a4b RK |
16 | |
17 | You should have received a copy of the GNU General Public License | |
1322177d LB |
18 | along with GCC; see the file COPYING. If not, write to the Free |
19 | Software Foundation, 59 Temple Place - Suite 330, Boston, MA | |
20 | 02111-1307, USA. */ | |
fc152a4b | 21 | |
fc152a4b | 22 | #ifndef HAVE_MACHINE_MODES |
70c75d9f DE |
23 | #define HAVE_MACHINE_MODES |
24 | ||
fc152a4b RK |
25 | /* Make an enum class that gives all the machine modes. */ |
26 | ||
69ef87e2 | 27 | #define DEF_MACHMODE(SYM, NAME, TYPE, BITSIZE, SIZE, UNIT, WIDER, INNER) SYM, |
fc152a4b RK |
28 | |
29 | enum machine_mode { | |
30 | #include "machmode.def" | |
fc152a4b RK |
31 | MAX_MACHINE_MODE }; |
32 | ||
33 | #undef DEF_MACHMODE | |
34 | ||
fc152a4b RK |
35 | #ifndef NUM_MACHINE_MODES |
36 | #define NUM_MACHINE_MODES (int) MAX_MACHINE_MODE | |
37 | #endif | |
38 | ||
39 | /* Get the name of mode MODE as a string. */ | |
40 | ||
86460bab | 41 | extern const char * const mode_name[NUM_MACHINE_MODES]; |
0f41302f | 42 | #define GET_MODE_NAME(MODE) (mode_name[(int) (MODE)]) |
fc152a4b RK |
43 | |
44 | enum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT, MODE_PARTIAL_INT, MODE_CC, | |
f9f27ee5 BS |
45 | MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT, |
46 | MODE_VECTOR_INT, MODE_VECTOR_FLOAT, | |
47 | MAX_MODE_CLASS}; | |
fc152a4b RK |
48 | |
49 | /* Get the general kind of object that mode MODE represents | |
50 | (integer, floating, complex, etc.) */ | |
51 | ||
86460bab | 52 | extern const enum mode_class mode_class[NUM_MACHINE_MODES]; |
0f41302f | 53 | #define GET_MODE_CLASS(MODE) (mode_class[(int) (MODE)]) |
fc152a4b | 54 | |
ae1ae48c RK |
55 | /* Nonzero if MODE is an integral mode. */ |
56 | #define INTEGRAL_MODE_P(MODE) \ | |
57 | (GET_MODE_CLASS (MODE) == MODE_INT \ | |
58 | || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT \ | |
f9f27ee5 BS |
59 | || GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT \ |
60 | || GET_MODE_CLASS (MODE) == MODE_VECTOR_INT) | |
ae1ae48c RK |
61 | |
62 | /* Nonzero if MODE is a floating-point mode. */ | |
63 | #define FLOAT_MODE_P(MODE) \ | |
64 | (GET_MODE_CLASS (MODE) == MODE_FLOAT \ | |
f9f27ee5 BS |
65 | || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT \ |
66 | || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT) | |
ae1ae48c | 67 | |
76080169 RH |
68 | /* Nonzero if MODE is a complex mode. */ |
69 | #define COMPLEX_MODE_P(MODE) \ | |
70 | (GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT \ | |
71 | || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT) | |
72 | ||
f9f27ee5 BS |
73 | /* Nonzero if MODE is a vector mode. */ |
74 | #define VECTOR_MODE_P(MODE) \ | |
75 | (GET_MODE_CLASS (MODE) == MODE_VECTOR_INT \ | |
76 | || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT) | |
77 | ||
71012d97 GK |
78 | /* Nonzero if MODE is a scalar integral mode. */ |
79 | #define SCALAR_INT_MODE_P(MODE) \ | |
80 | (GET_MODE_CLASS (MODE) == MODE_INT \ | |
81 | || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT) | |
82 | ||
075fc17a JH |
83 | /* Nonzero if MODE is a scalar floating point mode. */ |
84 | #define SCALAR_FLOAT_MODE_P(MODE) \ | |
85 | (GET_MODE_CLASS (MODE) == MODE_FLOAT) | |
86 | ||
fc152a4b RK |
87 | /* Get the size in bytes of an object of mode MODE. */ |
88 | ||
86460bab | 89 | extern const unsigned char mode_size[NUM_MACHINE_MODES]; |
0f41302f | 90 | #define GET_MODE_SIZE(MODE) (mode_size[(int) (MODE)]) |
fc152a4b RK |
91 | |
92 | /* Get the size in bytes of the basic parts of an object of mode MODE. */ | |
93 | ||
86460bab | 94 | extern const unsigned char mode_unit_size[NUM_MACHINE_MODES]; |
0f41302f | 95 | #define GET_MODE_UNIT_SIZE(MODE) (mode_unit_size[(int) (MODE)]) |
fc152a4b RK |
96 | |
97 | /* Get the number of units in the object. */ | |
98 | ||
99 | #define GET_MODE_NUNITS(MODE) \ | |
fa45b1eb RS |
100 | ((GET_MODE_UNIT_SIZE ((MODE)) == 0) ? 0 \ |
101 | : (GET_MODE_SIZE ((MODE)) / GET_MODE_UNIT_SIZE ((MODE)))) | |
fc152a4b RK |
102 | |
103 | /* Get the size in bits of an object of mode MODE. */ | |
104 | ||
86460bab | 105 | extern const unsigned short mode_bitsize[NUM_MACHINE_MODES]; |
a191f0ee | 106 | #define GET_MODE_BITSIZE(MODE) (mode_bitsize[(int) (MODE)]) |
fc152a4b | 107 | |
975d393a AO |
108 | #endif /* not HAVE_MACHINE_MODES */ |
109 | ||
110 | #if defined HOST_WIDE_INT && ! defined GET_MODE_MASK | |
64ccbc99 | 111 | |
fc152a4b RK |
112 | /* Get a bitmask containing 1 for all bits in a word |
113 | that fit within mode MODE. */ | |
114 | ||
86460bab | 115 | extern const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES]; |
913f68c1 JC |
116 | |
117 | #define GET_MODE_MASK(MODE) mode_mask_array[(int) (MODE)] | |
fc152a4b | 118 | |
69ef87e2 AH |
119 | extern const enum machine_mode inner_mode_array[NUM_MACHINE_MODES]; |
120 | ||
121 | /* Return the mode of the inner elements in a vector. */ | |
122 | ||
123 | #define GET_MODE_INNER(MODE) inner_mode_array[(int) (MODE)] | |
124 | ||
975d393a AO |
125 | #endif /* defined (HOST_WIDE_INT) && ! defined GET_MODE_MASK */ |
126 | ||
127 | #if ! defined GET_MODE_WIDER_MODE || ! defined GET_MODE_ALIGNMENT \ | |
128 | || ! defined GET_CLASS_NARROWEST_MODE | |
64ccbc99 | 129 | |
fc152a4b RK |
130 | /* Get the next wider natural mode (eg, QI -> HI -> SI -> DI -> TI). */ |
131 | ||
86460bab | 132 | extern const unsigned char mode_wider_mode[NUM_MACHINE_MODES]; |
913f68c1 | 133 | #define GET_MODE_WIDER_MODE(MODE) ((enum machine_mode)mode_wider_mode[(int) (MODE)]) |
fc152a4b | 134 | |
c92c981a RK |
135 | /* Return the mode for data of a given size SIZE and mode class CLASS. |
136 | If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE. | |
137 | The value is BLKmode if no other mode is found. */ | |
138 | ||
770ae6cc RK |
139 | extern enum machine_mode mode_for_size PARAMS ((unsigned int, |
140 | enum mode_class, int)); | |
c92c981a | 141 | |
27922c13 RH |
142 | /* Similar, but find the smallest mode for a given width. */ |
143 | ||
72c602fc | 144 | extern enum machine_mode smallest_mode_for_size |
770ae6cc | 145 | PARAMS ((unsigned int, enum mode_class)); |
27922c13 RH |
146 | |
147 | ||
d006aa54 RH |
148 | /* Return an integer mode of the exact same size as the input mode, |
149 | or BLKmode on failure. */ | |
150 | ||
13536812 | 151 | extern enum machine_mode int_mode_for_mode PARAMS ((enum machine_mode)); |
d006aa54 | 152 | |
fc152a4b RK |
153 | /* Find the best mode to use to access a bit field. */ |
154 | ||
729a2125 RK |
155 | extern enum machine_mode get_best_mode PARAMS ((int, int, unsigned int, |
156 | enum machine_mode, int)); | |
fc152a4b RK |
157 | |
158 | /* Determine alignment, 1<=result<=BIGGEST_ALIGNMENT. */ | |
159 | ||
36c265b1 NS |
160 | extern unsigned get_mode_alignment PARAMS ((enum machine_mode)); |
161 | ||
162 | #define GET_MODE_ALIGNMENT(MODE) get_mode_alignment (MODE) | |
fc152a4b | 163 | |
4a39a918 RK |
164 | /* For each class, get the narrowest mode in that class. */ |
165 | ||
f540a7d3 | 166 | extern const enum machine_mode class_narrowest_mode[(int) MAX_MODE_CLASS]; |
0f41302f | 167 | #define GET_CLASS_NARROWEST_MODE(CLASS) class_narrowest_mode[(int) (CLASS)] |
4a39a918 | 168 | |
6c164c81 RK |
169 | /* Define the integer modes whose sizes are BITS_PER_UNIT and BITS_PER_WORD |
170 | and the mode whose class is Pmode and whose size is POINTER_SIZE. */ | |
4a39a918 RK |
171 | |
172 | extern enum machine_mode byte_mode; | |
173 | extern enum machine_mode word_mode; | |
6c164c81 | 174 | extern enum machine_mode ptr_mode; |
4a39a918 | 175 | |
975d393a AO |
176 | #endif /* ! defined GET_MODE_WIDER_MODE || ! defined GET_MODE_ALIGNMENT |
177 | || ! defined GET_CLASS_NARROWEST_MODE */ |