annotate gcc/machmode.h @ 143:76e1cf5455ef

add cbc_gc test
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 19:24:05 +0900
parents 84e7813d76e9
children 1830386684a0
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 /* Machine mode definitions for GCC; included by rtl.h and tree.h.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 1991-2018 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 #ifndef HAVE_MACHINE_MODES
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 #define HAVE_MACHINE_MODES
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
111
kono
parents: 67
diff changeset
23 typedef opt_mode<machine_mode> opt_machine_mode;
kono
parents: 67
diff changeset
24
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
25 extern CONST_MODE_SIZE poly_uint16_pod mode_size[NUM_MACHINE_MODES];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
26 extern CONST_MODE_PRECISION poly_uint16_pod mode_precision[NUM_MACHINE_MODES];
111
kono
parents: 67
diff changeset
27 extern const unsigned char mode_inner[NUM_MACHINE_MODES];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
28 extern CONST_MODE_NUNITS poly_uint16_pod mode_nunits[NUM_MACHINE_MODES];
111
kono
parents: 67
diff changeset
29 extern CONST_MODE_UNIT_SIZE unsigned char mode_unit_size[NUM_MACHINE_MODES];
kono
parents: 67
diff changeset
30 extern const unsigned short mode_unit_precision[NUM_MACHINE_MODES];
kono
parents: 67
diff changeset
31 extern const unsigned char mode_wider[NUM_MACHINE_MODES];
kono
parents: 67
diff changeset
32 extern const unsigned char mode_2xwider[NUM_MACHINE_MODES];
kono
parents: 67
diff changeset
33
kono
parents: 67
diff changeset
34 template<typename T>
kono
parents: 67
diff changeset
35 struct mode_traits
kono
parents: 67
diff changeset
36 {
kono
parents: 67
diff changeset
37 /* For use by the machmode support code only.
kono
parents: 67
diff changeset
38
kono
parents: 67
diff changeset
39 There are cases in which the machmode support code needs to forcibly
kono
parents: 67
diff changeset
40 convert a machine_mode to a specific mode class T, and in which the
kono
parents: 67
diff changeset
41 context guarantees that this is valid without the need for an assert.
kono
parents: 67
diff changeset
42 This can be done using:
kono
parents: 67
diff changeset
43
kono
parents: 67
diff changeset
44 return typename mode_traits<T>::from_int (mode);
kono
parents: 67
diff changeset
45
kono
parents: 67
diff changeset
46 when returning a T and:
kono
parents: 67
diff changeset
47
kono
parents: 67
diff changeset
48 res = T (typename mode_traits<T>::from_int (mode));
kono
parents: 67
diff changeset
49
kono
parents: 67
diff changeset
50 when assigning to a value RES that must be assignment-compatible
kono
parents: 67
diff changeset
51 with (but possibly not the same as) T. */
kono
parents: 67
diff changeset
52 #ifdef USE_ENUM_MODES
kono
parents: 67
diff changeset
53 /* Allow direct conversion of enums to specific mode classes only
kono
parents: 67
diff changeset
54 when USE_ENUM_MODES is defined. This is only intended for use
kono
parents: 67
diff changeset
55 by gencondmd, so that it can tell more easily when .md conditions
kono
parents: 67
diff changeset
56 are always false. */
kono
parents: 67
diff changeset
57 typedef machine_mode from_int;
kono
parents: 67
diff changeset
58 #else
kono
parents: 67
diff changeset
59 /* Here we use an enum type distinct from machine_mode but with the
kono
parents: 67
diff changeset
60 same range as machine_mode. T should have a constructor that
kono
parents: 67
diff changeset
61 accepts this enum type; it should not have a constructor that
kono
parents: 67
diff changeset
62 accepts machine_mode.
kono
parents: 67
diff changeset
63
kono
parents: 67
diff changeset
64 We use this somewhat indirect approach to avoid too many constructor
kono
parents: 67
diff changeset
65 calls when the compiler is built with -O0. For example, even in
kono
parents: 67
diff changeset
66 unoptimized code, the return statement above would construct the
kono
parents: 67
diff changeset
67 returned T directly from the numerical value of MODE. */
kono
parents: 67
diff changeset
68 enum from_int { dummy = MAX_MACHINE_MODE };
kono
parents: 67
diff changeset
69 #endif
kono
parents: 67
diff changeset
70 };
kono
parents: 67
diff changeset
71
kono
parents: 67
diff changeset
72 template<>
kono
parents: 67
diff changeset
73 struct mode_traits<machine_mode>
kono
parents: 67
diff changeset
74 {
kono
parents: 67
diff changeset
75 /* machine_mode itself needs no conversion. */
kono
parents: 67
diff changeset
76 typedef machine_mode from_int;
kono
parents: 67
diff changeset
77 };
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
79 /* Always treat machine modes as fixed-size while compiling code specific
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
80 to targets that have no variable-size modes. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
81 #if defined (IN_TARGET_CODE) && NUM_POLY_INT_COEFFS == 1
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
82 #define ONLY_FIXED_SIZE_MODES 1
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
83 #else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
84 #define ONLY_FIXED_SIZE_MODES 0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 #endif
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
86
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 /* Get the name of mode MODE as a string. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 extern const char * const mode_name[NUM_MACHINE_MODES];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 #define GET_MODE_NAME(MODE) mode_name[MODE]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 /* Mode classes. */
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 #include "mode-classes.def"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 #define DEF_MODE_CLASS(M) M
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 enum mode_class { MODE_CLASSES, MAX_MODE_CLASS };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 #undef DEF_MODE_CLASS
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 #undef MODE_CLASSES
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 /* Get the general kind of object that mode MODE represents
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 (integer, floating, complex, etc.) */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 extern const unsigned char mode_class[NUM_MACHINE_MODES];
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
104 #define GET_MODE_CLASS(MODE) ((enum mode_class) mode_class[MODE])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 /* Nonzero if MODE is an integral mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 #define INTEGRAL_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 (GET_MODE_CLASS (MODE) == MODE_INT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 || GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT \
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
111 || GET_MODE_CLASS (MODE) == MODE_VECTOR_BOOL \
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 || GET_MODE_CLASS (MODE) == MODE_VECTOR_INT)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 /* Nonzero if MODE is a floating-point mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 #define FLOAT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 (GET_MODE_CLASS (MODE) == MODE_FLOAT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 || GET_MODE_CLASS (MODE) == MODE_DECIMAL_FLOAT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 /* Nonzero if MODE is a complex mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 #define COMPLEX_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 (GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 /* Nonzero if MODE is a vector mode. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
127 #define VECTOR_MODE_P(MODE) \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
128 (GET_MODE_CLASS (MODE) == MODE_VECTOR_BOOL \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
129 || GET_MODE_CLASS (MODE) == MODE_VECTOR_INT \
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 || GET_MODE_CLASS (MODE) == MODE_VECTOR_FRACT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 || GET_MODE_CLASS (MODE) == MODE_VECTOR_UFRACT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 || GET_MODE_CLASS (MODE) == MODE_VECTOR_ACCUM \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 || GET_MODE_CLASS (MODE) == MODE_VECTOR_UACCUM)
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 /* Nonzero if MODE is a scalar integral mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 #define SCALAR_INT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 (GET_MODE_CLASS (MODE) == MODE_INT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 /* Nonzero if MODE is a scalar floating point mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 #define SCALAR_FLOAT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 (GET_MODE_CLASS (MODE) == MODE_FLOAT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 || GET_MODE_CLASS (MODE) == MODE_DECIMAL_FLOAT)
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 /* Nonzero if MODE is a decimal floating point mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 #define DECIMAL_FLOAT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 (GET_MODE_CLASS (MODE) == MODE_DECIMAL_FLOAT)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 /* Nonzero if MODE is a scalar fract mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 #define SCALAR_FRACT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 (GET_MODE_CLASS (MODE) == MODE_FRACT)
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 /* Nonzero if MODE is a scalar ufract mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 #define SCALAR_UFRACT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 (GET_MODE_CLASS (MODE) == MODE_UFRACT)
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 /* Nonzero if MODE is a scalar fract or ufract mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 #define ALL_SCALAR_FRACT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 (SCALAR_FRACT_MODE_P (MODE) || SCALAR_UFRACT_MODE_P (MODE))
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 /* Nonzero if MODE is a scalar accum mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 #define SCALAR_ACCUM_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 (GET_MODE_CLASS (MODE) == MODE_ACCUM)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 /* Nonzero if MODE is a scalar uaccum mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 #define SCALAR_UACCUM_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 (GET_MODE_CLASS (MODE) == MODE_UACCUM)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 /* Nonzero if MODE is a scalar accum or uaccum mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 #define ALL_SCALAR_ACCUM_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 (SCALAR_ACCUM_MODE_P (MODE) || SCALAR_UACCUM_MODE_P (MODE))
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 /* Nonzero if MODE is a scalar fract or accum mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 #define SIGNED_SCALAR_FIXED_POINT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 (SCALAR_FRACT_MODE_P (MODE) || SCALAR_ACCUM_MODE_P (MODE))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 /* Nonzero if MODE is a scalar ufract or uaccum mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 #define UNSIGNED_SCALAR_FIXED_POINT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 (SCALAR_UFRACT_MODE_P (MODE) || SCALAR_UACCUM_MODE_P (MODE))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 /* Nonzero if MODE is a scalar fract, ufract, accum or uaccum mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 #define ALL_SCALAR_FIXED_POINT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 (SIGNED_SCALAR_FIXED_POINT_MODE_P (MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 || UNSIGNED_SCALAR_FIXED_POINT_MODE_P (MODE))
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 /* Nonzero if MODE is a scalar/vector fract mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 #define FRACT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 (GET_MODE_CLASS (MODE) == MODE_FRACT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 || GET_MODE_CLASS (MODE) == MODE_VECTOR_FRACT)
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 /* Nonzero if MODE is a scalar/vector ufract mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 #define UFRACT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 (GET_MODE_CLASS (MODE) == MODE_UFRACT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 || GET_MODE_CLASS (MODE) == MODE_VECTOR_UFRACT)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 /* Nonzero if MODE is a scalar/vector fract or ufract mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 #define ALL_FRACT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 (FRACT_MODE_P (MODE) || UFRACT_MODE_P (MODE))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 /* Nonzero if MODE is a scalar/vector accum mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 #define ACCUM_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 (GET_MODE_CLASS (MODE) == MODE_ACCUM \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 || GET_MODE_CLASS (MODE) == MODE_VECTOR_ACCUM)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 /* Nonzero if MODE is a scalar/vector uaccum mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 #define UACCUM_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 (GET_MODE_CLASS (MODE) == MODE_UACCUM \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 || GET_MODE_CLASS (MODE) == MODE_VECTOR_UACCUM)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 /* Nonzero if MODE is a scalar/vector accum or uaccum mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 #define ALL_ACCUM_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 (ACCUM_MODE_P (MODE) || UACCUM_MODE_P (MODE))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 /* Nonzero if MODE is a scalar/vector fract or accum mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 #define SIGNED_FIXED_POINT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 (FRACT_MODE_P (MODE) || ACCUM_MODE_P (MODE))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 /* Nonzero if MODE is a scalar/vector ufract or uaccum mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 #define UNSIGNED_FIXED_POINT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 (UFRACT_MODE_P (MODE) || UACCUM_MODE_P (MODE))
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 /* Nonzero if MODE is a scalar/vector fract, ufract, accum or uaccum mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 #define ALL_FIXED_POINT_MODE_P(MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 (SIGNED_FIXED_POINT_MODE_P (MODE) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 || UNSIGNED_FIXED_POINT_MODE_P (MODE))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 /* Nonzero if CLASS modes can be widened. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 #define CLASS_HAS_WIDER_MODES_P(CLASS) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 (CLASS == MODE_INT \
111
kono
parents: 67
diff changeset
231 || CLASS == MODE_PARTIAL_INT \
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 || CLASS == MODE_FLOAT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 || CLASS == MODE_DECIMAL_FLOAT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 || CLASS == MODE_COMPLEX_FLOAT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 || CLASS == MODE_FRACT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 || CLASS == MODE_UFRACT \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 || CLASS == MODE_ACCUM \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 || CLASS == MODE_UACCUM)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239
111
kono
parents: 67
diff changeset
240 /* An optional T (i.e. a T or nothing), where T is some form of mode class. */
kono
parents: 67
diff changeset
241 template<typename T>
kono
parents: 67
diff changeset
242 class opt_mode
kono
parents: 67
diff changeset
243 {
kono
parents: 67
diff changeset
244 public:
kono
parents: 67
diff changeset
245 enum from_int { dummy = MAX_MACHINE_MODE };
kono
parents: 67
diff changeset
246
kono
parents: 67
diff changeset
247 ALWAYS_INLINE opt_mode () : m_mode (E_VOIDmode) {}
kono
parents: 67
diff changeset
248 ALWAYS_INLINE opt_mode (const T &m) : m_mode (m) {}
kono
parents: 67
diff changeset
249 template<typename U>
kono
parents: 67
diff changeset
250 ALWAYS_INLINE opt_mode (const U &m) : m_mode (T (m)) {}
kono
parents: 67
diff changeset
251 ALWAYS_INLINE opt_mode (from_int m) : m_mode (machine_mode (m)) {}
kono
parents: 67
diff changeset
252
kono
parents: 67
diff changeset
253 machine_mode else_void () const;
kono
parents: 67
diff changeset
254 machine_mode else_blk () const;
kono
parents: 67
diff changeset
255 T require () const;
kono
parents: 67
diff changeset
256
kono
parents: 67
diff changeset
257 bool exists () const;
kono
parents: 67
diff changeset
258 template<typename U> bool exists (U *) const;
kono
parents: 67
diff changeset
259
kono
parents: 67
diff changeset
260 private:
kono
parents: 67
diff changeset
261 machine_mode m_mode;
kono
parents: 67
diff changeset
262 };
kono
parents: 67
diff changeset
263
kono
parents: 67
diff changeset
264 /* If the object contains a T, return its enum value, otherwise return
kono
parents: 67
diff changeset
265 E_VOIDmode. */
kono
parents: 67
diff changeset
266
kono
parents: 67
diff changeset
267 template<typename T>
kono
parents: 67
diff changeset
268 ALWAYS_INLINE machine_mode
kono
parents: 67
diff changeset
269 opt_mode<T>::else_void () const
kono
parents: 67
diff changeset
270 {
kono
parents: 67
diff changeset
271 return m_mode;
kono
parents: 67
diff changeset
272 }
kono
parents: 67
diff changeset
273
kono
parents: 67
diff changeset
274 /* If the T exists, return its enum value, otherwise return E_BLKmode. */
kono
parents: 67
diff changeset
275
kono
parents: 67
diff changeset
276 template<typename T>
kono
parents: 67
diff changeset
277 inline machine_mode
kono
parents: 67
diff changeset
278 opt_mode<T>::else_blk () const
kono
parents: 67
diff changeset
279 {
kono
parents: 67
diff changeset
280 return m_mode == E_VOIDmode ? E_BLKmode : m_mode;
kono
parents: 67
diff changeset
281 }
kono
parents: 67
diff changeset
282
kono
parents: 67
diff changeset
283 /* Assert that the object contains a T and return it. */
kono
parents: 67
diff changeset
284
kono
parents: 67
diff changeset
285 template<typename T>
kono
parents: 67
diff changeset
286 inline T
kono
parents: 67
diff changeset
287 opt_mode<T>::require () const
kono
parents: 67
diff changeset
288 {
kono
parents: 67
diff changeset
289 gcc_checking_assert (m_mode != E_VOIDmode);
kono
parents: 67
diff changeset
290 return typename mode_traits<T>::from_int (m_mode);
kono
parents: 67
diff changeset
291 }
kono
parents: 67
diff changeset
292
kono
parents: 67
diff changeset
293 /* Return true if the object contains a T rather than nothing. */
kono
parents: 67
diff changeset
294
kono
parents: 67
diff changeset
295 template<typename T>
kono
parents: 67
diff changeset
296 ALWAYS_INLINE bool
kono
parents: 67
diff changeset
297 opt_mode<T>::exists () const
kono
parents: 67
diff changeset
298 {
kono
parents: 67
diff changeset
299 return m_mode != E_VOIDmode;
kono
parents: 67
diff changeset
300 }
kono
parents: 67
diff changeset
301
kono
parents: 67
diff changeset
302 /* Return true if the object contains a T, storing it in *MODE if so. */
kono
parents: 67
diff changeset
303
kono
parents: 67
diff changeset
304 template<typename T>
kono
parents: 67
diff changeset
305 template<typename U>
kono
parents: 67
diff changeset
306 inline bool
kono
parents: 67
diff changeset
307 opt_mode<T>::exists (U *mode) const
kono
parents: 67
diff changeset
308 {
kono
parents: 67
diff changeset
309 if (m_mode != E_VOIDmode)
kono
parents: 67
diff changeset
310 {
kono
parents: 67
diff changeset
311 *mode = T (typename mode_traits<T>::from_int (m_mode));
kono
parents: 67
diff changeset
312 return true;
kono
parents: 67
diff changeset
313 }
kono
parents: 67
diff changeset
314 return false;
kono
parents: 67
diff changeset
315 }
kono
parents: 67
diff changeset
316
kono
parents: 67
diff changeset
317 /* A POD version of mode class T. */
kono
parents: 67
diff changeset
318
kono
parents: 67
diff changeset
319 template<typename T>
kono
parents: 67
diff changeset
320 struct pod_mode
kono
parents: 67
diff changeset
321 {
kono
parents: 67
diff changeset
322 typedef typename mode_traits<T>::from_int from_int;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
323 typedef typename T::measurement_type measurement_type;
111
kono
parents: 67
diff changeset
324
kono
parents: 67
diff changeset
325 machine_mode m_mode;
kono
parents: 67
diff changeset
326 ALWAYS_INLINE operator machine_mode () const { return m_mode; }
kono
parents: 67
diff changeset
327 ALWAYS_INLINE operator T () const { return from_int (m_mode); }
kono
parents: 67
diff changeset
328 ALWAYS_INLINE pod_mode &operator = (const T &m) { m_mode = m; return *this; }
kono
parents: 67
diff changeset
329 };
kono
parents: 67
diff changeset
330
kono
parents: 67
diff changeset
331 /* Return true if mode M has type T. */
kono
parents: 67
diff changeset
332
kono
parents: 67
diff changeset
333 template<typename T>
kono
parents: 67
diff changeset
334 inline bool
kono
parents: 67
diff changeset
335 is_a (machine_mode m)
kono
parents: 67
diff changeset
336 {
kono
parents: 67
diff changeset
337 return T::includes_p (m);
kono
parents: 67
diff changeset
338 }
kono
parents: 67
diff changeset
339
kono
parents: 67
diff changeset
340 template<typename T, typename U>
kono
parents: 67
diff changeset
341 inline bool
kono
parents: 67
diff changeset
342 is_a (const opt_mode<U> &m)
kono
parents: 67
diff changeset
343 {
kono
parents: 67
diff changeset
344 return T::includes_p (m.else_void ());
kono
parents: 67
diff changeset
345 }
kono
parents: 67
diff changeset
346
kono
parents: 67
diff changeset
347 /* Assert that mode M has type T, and return it in that form. */
kono
parents: 67
diff changeset
348
kono
parents: 67
diff changeset
349 template<typename T>
kono
parents: 67
diff changeset
350 inline T
kono
parents: 67
diff changeset
351 as_a (machine_mode m)
kono
parents: 67
diff changeset
352 {
kono
parents: 67
diff changeset
353 gcc_checking_assert (T::includes_p (m));
kono
parents: 67
diff changeset
354 return typename mode_traits<T>::from_int (m);
kono
parents: 67
diff changeset
355 }
kono
parents: 67
diff changeset
356
kono
parents: 67
diff changeset
357 template<typename T, typename U>
kono
parents: 67
diff changeset
358 inline T
kono
parents: 67
diff changeset
359 as_a (const opt_mode<U> &m)
kono
parents: 67
diff changeset
360 {
kono
parents: 67
diff changeset
361 return as_a <T> (m.else_void ());
kono
parents: 67
diff changeset
362 }
kono
parents: 67
diff changeset
363
kono
parents: 67
diff changeset
364 /* Convert M to an opt_mode<T>. */
kono
parents: 67
diff changeset
365
kono
parents: 67
diff changeset
366 template<typename T>
kono
parents: 67
diff changeset
367 inline opt_mode<T>
kono
parents: 67
diff changeset
368 dyn_cast (machine_mode m)
kono
parents: 67
diff changeset
369 {
kono
parents: 67
diff changeset
370 if (T::includes_p (m))
kono
parents: 67
diff changeset
371 return T (typename mode_traits<T>::from_int (m));
kono
parents: 67
diff changeset
372 return opt_mode<T> ();
kono
parents: 67
diff changeset
373 }
kono
parents: 67
diff changeset
374
kono
parents: 67
diff changeset
375 template<typename T, typename U>
kono
parents: 67
diff changeset
376 inline opt_mode<T>
kono
parents: 67
diff changeset
377 dyn_cast (const opt_mode<U> &m)
kono
parents: 67
diff changeset
378 {
kono
parents: 67
diff changeset
379 return dyn_cast <T> (m.else_void ());
kono
parents: 67
diff changeset
380 }
kono
parents: 67
diff changeset
381
kono
parents: 67
diff changeset
382 /* Return true if mode M has type T, storing it as a T in *RESULT
kono
parents: 67
diff changeset
383 if so. */
kono
parents: 67
diff changeset
384
kono
parents: 67
diff changeset
385 template<typename T, typename U>
kono
parents: 67
diff changeset
386 inline bool
kono
parents: 67
diff changeset
387 is_a (machine_mode m, U *result)
kono
parents: 67
diff changeset
388 {
kono
parents: 67
diff changeset
389 if (T::includes_p (m))
kono
parents: 67
diff changeset
390 {
kono
parents: 67
diff changeset
391 *result = T (typename mode_traits<T>::from_int (m));
kono
parents: 67
diff changeset
392 return true;
kono
parents: 67
diff changeset
393 }
kono
parents: 67
diff changeset
394 return false;
kono
parents: 67
diff changeset
395 }
kono
parents: 67
diff changeset
396
kono
parents: 67
diff changeset
397 /* Represents a machine mode that is known to be a SCALAR_INT_MODE_P. */
kono
parents: 67
diff changeset
398 class scalar_int_mode
kono
parents: 67
diff changeset
399 {
kono
parents: 67
diff changeset
400 public:
kono
parents: 67
diff changeset
401 typedef mode_traits<scalar_int_mode>::from_int from_int;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
402 typedef unsigned short measurement_type;
111
kono
parents: 67
diff changeset
403
kono
parents: 67
diff changeset
404 ALWAYS_INLINE scalar_int_mode () {}
kono
parents: 67
diff changeset
405 ALWAYS_INLINE scalar_int_mode (from_int m) : m_mode (machine_mode (m)) {}
kono
parents: 67
diff changeset
406 ALWAYS_INLINE operator machine_mode () const { return m_mode; }
kono
parents: 67
diff changeset
407
kono
parents: 67
diff changeset
408 static bool includes_p (machine_mode);
kono
parents: 67
diff changeset
409
kono
parents: 67
diff changeset
410 protected:
kono
parents: 67
diff changeset
411 machine_mode m_mode;
kono
parents: 67
diff changeset
412 };
kono
parents: 67
diff changeset
413
kono
parents: 67
diff changeset
414 /* Return true if M is a scalar_int_mode. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
415
111
kono
parents: 67
diff changeset
416 inline bool
kono
parents: 67
diff changeset
417 scalar_int_mode::includes_p (machine_mode m)
kono
parents: 67
diff changeset
418 {
kono
parents: 67
diff changeset
419 return SCALAR_INT_MODE_P (m);
kono
parents: 67
diff changeset
420 }
kono
parents: 67
diff changeset
421
kono
parents: 67
diff changeset
422 /* Represents a machine mode that is known to be a SCALAR_FLOAT_MODE_P. */
kono
parents: 67
diff changeset
423 class scalar_float_mode
kono
parents: 67
diff changeset
424 {
kono
parents: 67
diff changeset
425 public:
kono
parents: 67
diff changeset
426 typedef mode_traits<scalar_float_mode>::from_int from_int;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
427 typedef unsigned short measurement_type;
111
kono
parents: 67
diff changeset
428
kono
parents: 67
diff changeset
429 ALWAYS_INLINE scalar_float_mode () {}
kono
parents: 67
diff changeset
430 ALWAYS_INLINE scalar_float_mode (from_int m) : m_mode (machine_mode (m)) {}
kono
parents: 67
diff changeset
431 ALWAYS_INLINE operator machine_mode () const { return m_mode; }
kono
parents: 67
diff changeset
432
kono
parents: 67
diff changeset
433 static bool includes_p (machine_mode);
kono
parents: 67
diff changeset
434
kono
parents: 67
diff changeset
435 protected:
kono
parents: 67
diff changeset
436 machine_mode m_mode;
kono
parents: 67
diff changeset
437 };
kono
parents: 67
diff changeset
438
kono
parents: 67
diff changeset
439 /* Return true if M is a scalar_float_mode. */
kono
parents: 67
diff changeset
440
kono
parents: 67
diff changeset
441 inline bool
kono
parents: 67
diff changeset
442 scalar_float_mode::includes_p (machine_mode m)
kono
parents: 67
diff changeset
443 {
kono
parents: 67
diff changeset
444 return SCALAR_FLOAT_MODE_P (m);
kono
parents: 67
diff changeset
445 }
kono
parents: 67
diff changeset
446
kono
parents: 67
diff changeset
447 /* Represents a machine mode that is known to be scalar. */
kono
parents: 67
diff changeset
448 class scalar_mode
kono
parents: 67
diff changeset
449 {
kono
parents: 67
diff changeset
450 public:
kono
parents: 67
diff changeset
451 typedef mode_traits<scalar_mode>::from_int from_int;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
452 typedef unsigned short measurement_type;
111
kono
parents: 67
diff changeset
453
kono
parents: 67
diff changeset
454 ALWAYS_INLINE scalar_mode () {}
kono
parents: 67
diff changeset
455 ALWAYS_INLINE scalar_mode (from_int m) : m_mode (machine_mode (m)) {}
kono
parents: 67
diff changeset
456 ALWAYS_INLINE scalar_mode (const scalar_int_mode &m) : m_mode (m) {}
kono
parents: 67
diff changeset
457 ALWAYS_INLINE scalar_mode (const scalar_float_mode &m) : m_mode (m) {}
kono
parents: 67
diff changeset
458 ALWAYS_INLINE scalar_mode (const scalar_int_mode_pod &m) : m_mode (m) {}
kono
parents: 67
diff changeset
459 ALWAYS_INLINE operator machine_mode () const { return m_mode; }
kono
parents: 67
diff changeset
460
kono
parents: 67
diff changeset
461 static bool includes_p (machine_mode);
kono
parents: 67
diff changeset
462
kono
parents: 67
diff changeset
463 protected:
kono
parents: 67
diff changeset
464 machine_mode m_mode;
kono
parents: 67
diff changeset
465 };
kono
parents: 67
diff changeset
466
kono
parents: 67
diff changeset
467 /* Return true if M represents some kind of scalar value. */
kono
parents: 67
diff changeset
468
kono
parents: 67
diff changeset
469 inline bool
kono
parents: 67
diff changeset
470 scalar_mode::includes_p (machine_mode m)
kono
parents: 67
diff changeset
471 {
kono
parents: 67
diff changeset
472 switch (GET_MODE_CLASS (m))
kono
parents: 67
diff changeset
473 {
kono
parents: 67
diff changeset
474 case MODE_INT:
kono
parents: 67
diff changeset
475 case MODE_PARTIAL_INT:
kono
parents: 67
diff changeset
476 case MODE_FRACT:
kono
parents: 67
diff changeset
477 case MODE_UFRACT:
kono
parents: 67
diff changeset
478 case MODE_ACCUM:
kono
parents: 67
diff changeset
479 case MODE_UACCUM:
kono
parents: 67
diff changeset
480 case MODE_FLOAT:
kono
parents: 67
diff changeset
481 case MODE_DECIMAL_FLOAT:
kono
parents: 67
diff changeset
482 return true;
kono
parents: 67
diff changeset
483 default:
kono
parents: 67
diff changeset
484 return false;
kono
parents: 67
diff changeset
485 }
kono
parents: 67
diff changeset
486 }
kono
parents: 67
diff changeset
487
kono
parents: 67
diff changeset
488 /* Represents a machine mode that is known to be a COMPLEX_MODE_P. */
kono
parents: 67
diff changeset
489 class complex_mode
kono
parents: 67
diff changeset
490 {
kono
parents: 67
diff changeset
491 public:
kono
parents: 67
diff changeset
492 typedef mode_traits<complex_mode>::from_int from_int;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
493 typedef unsigned short measurement_type;
111
kono
parents: 67
diff changeset
494
kono
parents: 67
diff changeset
495 ALWAYS_INLINE complex_mode () {}
kono
parents: 67
diff changeset
496 ALWAYS_INLINE complex_mode (from_int m) : m_mode (machine_mode (m)) {}
kono
parents: 67
diff changeset
497 ALWAYS_INLINE operator machine_mode () const { return m_mode; }
kono
parents: 67
diff changeset
498
kono
parents: 67
diff changeset
499 static bool includes_p (machine_mode);
kono
parents: 67
diff changeset
500
kono
parents: 67
diff changeset
501 protected:
kono
parents: 67
diff changeset
502 machine_mode m_mode;
kono
parents: 67
diff changeset
503 };
kono
parents: 67
diff changeset
504
kono
parents: 67
diff changeset
505 /* Return true if M is a complex_mode. */
kono
parents: 67
diff changeset
506
kono
parents: 67
diff changeset
507 inline bool
kono
parents: 67
diff changeset
508 complex_mode::includes_p (machine_mode m)
kono
parents: 67
diff changeset
509 {
kono
parents: 67
diff changeset
510 return COMPLEX_MODE_P (m);
kono
parents: 67
diff changeset
511 }
kono
parents: 67
diff changeset
512
kono
parents: 67
diff changeset
513 /* Return the base GET_MODE_SIZE value for MODE. */
kono
parents: 67
diff changeset
514
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
515 ALWAYS_INLINE poly_uint16
111
kono
parents: 67
diff changeset
516 mode_to_bytes (machine_mode mode)
kono
parents: 67
diff changeset
517 {
kono
parents: 67
diff changeset
518 #if GCC_VERSION >= 4001
kono
parents: 67
diff changeset
519 return (__builtin_constant_p (mode)
kono
parents: 67
diff changeset
520 ? mode_size_inline (mode) : mode_size[mode]);
kono
parents: 67
diff changeset
521 #else
kono
parents: 67
diff changeset
522 return mode_size[mode];
kono
parents: 67
diff changeset
523 #endif
kono
parents: 67
diff changeset
524 }
kono
parents: 67
diff changeset
525
kono
parents: 67
diff changeset
526 /* Return the base GET_MODE_BITSIZE value for MODE. */
kono
parents: 67
diff changeset
527
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
528 ALWAYS_INLINE poly_uint16
111
kono
parents: 67
diff changeset
529 mode_to_bits (machine_mode mode)
kono
parents: 67
diff changeset
530 {
kono
parents: 67
diff changeset
531 return mode_to_bytes (mode) * BITS_PER_UNIT;
kono
parents: 67
diff changeset
532 }
kono
parents: 67
diff changeset
533
kono
parents: 67
diff changeset
534 /* Return the base GET_MODE_PRECISION value for MODE. */
kono
parents: 67
diff changeset
535
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
536 ALWAYS_INLINE poly_uint16
111
kono
parents: 67
diff changeset
537 mode_to_precision (machine_mode mode)
kono
parents: 67
diff changeset
538 {
kono
parents: 67
diff changeset
539 return mode_precision[mode];
kono
parents: 67
diff changeset
540 }
kono
parents: 67
diff changeset
541
kono
parents: 67
diff changeset
542 /* Return the base GET_MODE_INNER value for MODE. */
kono
parents: 67
diff changeset
543
kono
parents: 67
diff changeset
544 ALWAYS_INLINE scalar_mode
kono
parents: 67
diff changeset
545 mode_to_inner (machine_mode mode)
kono
parents: 67
diff changeset
546 {
kono
parents: 67
diff changeset
547 #if GCC_VERSION >= 4001
kono
parents: 67
diff changeset
548 return scalar_mode::from_int (__builtin_constant_p (mode)
kono
parents: 67
diff changeset
549 ? mode_inner_inline (mode)
kono
parents: 67
diff changeset
550 : mode_inner[mode]);
kono
parents: 67
diff changeset
551 #else
kono
parents: 67
diff changeset
552 return scalar_mode::from_int (mode_inner[mode]);
kono
parents: 67
diff changeset
553 #endif
kono
parents: 67
diff changeset
554 }
kono
parents: 67
diff changeset
555
kono
parents: 67
diff changeset
556 /* Return the base GET_MODE_UNIT_SIZE value for MODE. */
kono
parents: 67
diff changeset
557
kono
parents: 67
diff changeset
558 ALWAYS_INLINE unsigned char
kono
parents: 67
diff changeset
559 mode_to_unit_size (machine_mode mode)
kono
parents: 67
diff changeset
560 {
kono
parents: 67
diff changeset
561 #if GCC_VERSION >= 4001
kono
parents: 67
diff changeset
562 return (__builtin_constant_p (mode)
kono
parents: 67
diff changeset
563 ? mode_unit_size_inline (mode) : mode_unit_size[mode]);
kono
parents: 67
diff changeset
564 #else
kono
parents: 67
diff changeset
565 return mode_unit_size[mode];
kono
parents: 67
diff changeset
566 #endif
kono
parents: 67
diff changeset
567 }
kono
parents: 67
diff changeset
568
kono
parents: 67
diff changeset
569 /* Return the base GET_MODE_UNIT_PRECISION value for MODE. */
kono
parents: 67
diff changeset
570
kono
parents: 67
diff changeset
571 ALWAYS_INLINE unsigned short
kono
parents: 67
diff changeset
572 mode_to_unit_precision (machine_mode mode)
kono
parents: 67
diff changeset
573 {
kono
parents: 67
diff changeset
574 #if GCC_VERSION >= 4001
kono
parents: 67
diff changeset
575 return (__builtin_constant_p (mode)
kono
parents: 67
diff changeset
576 ? mode_unit_precision_inline (mode) : mode_unit_precision[mode]);
kono
parents: 67
diff changeset
577 #else
kono
parents: 67
diff changeset
578 return mode_unit_precision[mode];
kono
parents: 67
diff changeset
579 #endif
kono
parents: 67
diff changeset
580 }
kono
parents: 67
diff changeset
581
kono
parents: 67
diff changeset
582 /* Return the base GET_MODE_NUNITS value for MODE. */
kono
parents: 67
diff changeset
583
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
584 ALWAYS_INLINE poly_uint16
111
kono
parents: 67
diff changeset
585 mode_to_nunits (machine_mode mode)
kono
parents: 67
diff changeset
586 {
kono
parents: 67
diff changeset
587 #if GCC_VERSION >= 4001
kono
parents: 67
diff changeset
588 return (__builtin_constant_p (mode)
kono
parents: 67
diff changeset
589 ? mode_nunits_inline (mode) : mode_nunits[mode]);
kono
parents: 67
diff changeset
590 #else
kono
parents: 67
diff changeset
591 return mode_nunits[mode];
kono
parents: 67
diff changeset
592 #endif
kono
parents: 67
diff changeset
593 }
kono
parents: 67
diff changeset
594
kono
parents: 67
diff changeset
595 /* Get the size in bytes of an object of mode MODE. */
kono
parents: 67
diff changeset
596
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
597 #if ONLY_FIXED_SIZE_MODES
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
598 #define GET_MODE_SIZE(MODE) ((unsigned short) mode_to_bytes (MODE).coeffs[0])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
599 #else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
600 ALWAYS_INLINE poly_uint16
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
601 GET_MODE_SIZE (machine_mode mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
602 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
603 return mode_to_bytes (mode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
604 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
605
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
606 template<typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
607 ALWAYS_INLINE typename if_poly<typename T::measurement_type>::type
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
608 GET_MODE_SIZE (const T &mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
609 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
610 return mode_to_bytes (mode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
611 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
612
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
613 template<typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
614 ALWAYS_INLINE typename if_nonpoly<typename T::measurement_type>::type
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
615 GET_MODE_SIZE (const T &mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
616 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
617 return mode_to_bytes (mode).coeffs[0];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
618 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
619 #endif
111
kono
parents: 67
diff changeset
620
kono
parents: 67
diff changeset
621 /* Get the size in bits of an object of mode MODE. */
kono
parents: 67
diff changeset
622
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
623 #if ONLY_FIXED_SIZE_MODES
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
624 #define GET_MODE_BITSIZE(MODE) ((unsigned short) mode_to_bits (MODE).coeffs[0])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
625 #else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
626 ALWAYS_INLINE poly_uint16
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
627 GET_MODE_BITSIZE (machine_mode mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
628 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
629 return mode_to_bits (mode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
630 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
631
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
632 template<typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
633 ALWAYS_INLINE typename if_poly<typename T::measurement_type>::type
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
634 GET_MODE_BITSIZE (const T &mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
635 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
636 return mode_to_bits (mode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
637 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
638
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
639 template<typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
640 ALWAYS_INLINE typename if_nonpoly<typename T::measurement_type>::type
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
641 GET_MODE_BITSIZE (const T &mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
642 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
643 return mode_to_bits (mode).coeffs[0];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
644 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
645 #endif
0
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 /* Get the number of value bits of an object of mode MODE. */
111
kono
parents: 67
diff changeset
648
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
649 #if ONLY_FIXED_SIZE_MODES
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
650 #define GET_MODE_PRECISION(MODE) \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
651 ((unsigned short) mode_to_precision (MODE).coeffs[0])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
652 #else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
653 ALWAYS_INLINE poly_uint16
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
654 GET_MODE_PRECISION (machine_mode mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
655 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
656 return mode_to_precision (mode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
657 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
658
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
659 template<typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
660 ALWAYS_INLINE typename if_poly<typename T::measurement_type>::type
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
661 GET_MODE_PRECISION (const T &mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
662 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
663 return mode_to_precision (mode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
664 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
665
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
666 template<typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
667 ALWAYS_INLINE typename if_nonpoly<typename T::measurement_type>::type
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
668 GET_MODE_PRECISION (const T &mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
669 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
670 return mode_to_precision (mode).coeffs[0];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
671 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
672 #endif
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
673
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
674 /* Get the number of integral bits of an object of mode MODE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
675 extern CONST_MODE_IBIT unsigned char mode_ibit[NUM_MACHINE_MODES];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
676 #define GET_MODE_IBIT(MODE) mode_ibit[MODE]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
677
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
678 /* Get the number of fractional bits of an object of mode MODE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
679 extern CONST_MODE_FBIT unsigned char mode_fbit[NUM_MACHINE_MODES];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
680 #define GET_MODE_FBIT(MODE) mode_fbit[MODE]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
681
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
682 /* Get a bitmask containing 1 for all bits in a word
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
683 that fit within mode MODE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
684
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
685 extern const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
686
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
687 #define GET_MODE_MASK(MODE) mode_mask_array[MODE]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
688
111
kono
parents: 67
diff changeset
689 /* Return the mode of the basic parts of MODE. For vector modes this is the
kono
parents: 67
diff changeset
690 mode of the vector elements. For complex modes it is the mode of the real
kono
parents: 67
diff changeset
691 and imaginary parts. For other modes it is MODE itself. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
692
111
kono
parents: 67
diff changeset
693 #define GET_MODE_INNER(MODE) (mode_to_inner (MODE))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
694
111
kono
parents: 67
diff changeset
695 /* Get the size in bytes or bits of the basic parts of an
kono
parents: 67
diff changeset
696 object of mode MODE. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
697
111
kono
parents: 67
diff changeset
698 #define GET_MODE_UNIT_SIZE(MODE) mode_to_unit_size (MODE)
kono
parents: 67
diff changeset
699
kono
parents: 67
diff changeset
700 #define GET_MODE_UNIT_BITSIZE(MODE) \
kono
parents: 67
diff changeset
701 ((unsigned short) (GET_MODE_UNIT_SIZE (MODE) * BITS_PER_UNIT))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
702
111
kono
parents: 67
diff changeset
703 #define GET_MODE_UNIT_PRECISION(MODE) (mode_to_unit_precision (MODE))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
704
111
kono
parents: 67
diff changeset
705 /* Get the number of units in an object of mode MODE. This is 2 for
kono
parents: 67
diff changeset
706 complex modes and the number of elements for vector modes. */
kono
parents: 67
diff changeset
707
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
708 #if ONLY_FIXED_SIZE_MODES
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
709 #define GET_MODE_NUNITS(MODE) (mode_to_nunits (MODE).coeffs[0])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
710 #else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
711 ALWAYS_INLINE poly_uint16
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
712 GET_MODE_NUNITS (machine_mode mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
713 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
714 return mode_to_nunits (mode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
715 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
716
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
717 template<typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
718 ALWAYS_INLINE typename if_poly<typename T::measurement_type>::type
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
719 GET_MODE_NUNITS (const T &mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
720 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
721 return mode_to_nunits (mode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
722 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
723
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
724 template<typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
725 ALWAYS_INLINE typename if_nonpoly<typename T::measurement_type>::type
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
726 GET_MODE_NUNITS (const T &mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
727 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
728 return mode_to_nunits (mode).coeffs[0];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
729 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
730 #endif
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
731
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
732 /* Get the next wider natural mode (eg, QI -> HI -> SI -> DI -> TI). */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
733
111
kono
parents: 67
diff changeset
734 template<typename T>
kono
parents: 67
diff changeset
735 ALWAYS_INLINE opt_mode<T>
kono
parents: 67
diff changeset
736 GET_MODE_WIDER_MODE (const T &m)
kono
parents: 67
diff changeset
737 {
kono
parents: 67
diff changeset
738 return typename opt_mode<T>::from_int (mode_wider[m]);
kono
parents: 67
diff changeset
739 }
kono
parents: 67
diff changeset
740
kono
parents: 67
diff changeset
741 /* For scalars, this is a mode with twice the precision. For vectors,
kono
parents: 67
diff changeset
742 this is a mode with the same inner mode but with twice the elements. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
743
111
kono
parents: 67
diff changeset
744 template<typename T>
kono
parents: 67
diff changeset
745 ALWAYS_INLINE opt_mode<T>
kono
parents: 67
diff changeset
746 GET_MODE_2XWIDER_MODE (const T &m)
kono
parents: 67
diff changeset
747 {
kono
parents: 67
diff changeset
748 return typename opt_mode<T>::from_int (mode_2xwider[m]);
kono
parents: 67
diff changeset
749 }
kono
parents: 67
diff changeset
750
kono
parents: 67
diff changeset
751 /* Get the complex mode from the component mode. */
kono
parents: 67
diff changeset
752 extern const unsigned char mode_complex[NUM_MACHINE_MODES];
kono
parents: 67
diff changeset
753 #define GET_MODE_COMPLEX_MODE(MODE) ((machine_mode) mode_complex[MODE])
kono
parents: 67
diff changeset
754
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
755 /* Represents a machine mode that must have a fixed size. The main
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
756 use of this class is to represent the modes of objects that always
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
757 have static storage duration, such as constant pool entries.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
758 (No current target supports the concept of variable-size static data.) */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
759 class fixed_size_mode
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
760 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
761 public:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
762 typedef mode_traits<fixed_size_mode>::from_int from_int;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
763 typedef unsigned short measurement_type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
764
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
765 ALWAYS_INLINE fixed_size_mode () {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
766 ALWAYS_INLINE fixed_size_mode (from_int m) : m_mode (machine_mode (m)) {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
767 ALWAYS_INLINE fixed_size_mode (const scalar_mode &m) : m_mode (m) {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
768 ALWAYS_INLINE fixed_size_mode (const scalar_int_mode &m) : m_mode (m) {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
769 ALWAYS_INLINE fixed_size_mode (const scalar_float_mode &m) : m_mode (m) {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
770 ALWAYS_INLINE fixed_size_mode (const scalar_mode_pod &m) : m_mode (m) {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
771 ALWAYS_INLINE fixed_size_mode (const scalar_int_mode_pod &m) : m_mode (m) {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
772 ALWAYS_INLINE fixed_size_mode (const complex_mode &m) : m_mode (m) {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
773 ALWAYS_INLINE operator machine_mode () const { return m_mode; }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
774
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
775 static bool includes_p (machine_mode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
776
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
777 protected:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
778 machine_mode m_mode;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
779 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
780
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
781 /* Return true if MODE has a fixed size. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
782
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
783 inline bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
784 fixed_size_mode::includes_p (machine_mode mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
785 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
786 return mode_to_bytes (mode).is_constant ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
787 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
788
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
789 /* Wrapper for mode arguments to target macros, so that if a target
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
790 doesn't need polynomial-sized modes, its header file can continue
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
791 to treat everything as fixed_size_mode. This should go away once
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
792 macros are moved to target hooks. It shouldn't be used in other
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
793 contexts. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
794 #if NUM_POLY_INT_COEFFS == 1
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
795 #define MACRO_MODE(MODE) (as_a <fixed_size_mode> (MODE))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
796 #else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
797 #define MACRO_MODE(MODE) (MODE)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
798 #endif
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
799
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
800 extern opt_machine_mode mode_for_size (poly_uint64, enum mode_class, int);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
801
111
kono
parents: 67
diff changeset
802 /* Return the machine mode to use for a MODE_INT of SIZE bits, if one
kono
parents: 67
diff changeset
803 exists. If LIMIT is nonzero, modes wider than MAX_FIXED_MODE_SIZE
kono
parents: 67
diff changeset
804 will not be used. */
kono
parents: 67
diff changeset
805
kono
parents: 67
diff changeset
806 inline opt_scalar_int_mode
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
807 int_mode_for_size (poly_uint64 size, int limit)
111
kono
parents: 67
diff changeset
808 {
kono
parents: 67
diff changeset
809 return dyn_cast <scalar_int_mode> (mode_for_size (size, MODE_INT, limit));
kono
parents: 67
diff changeset
810 }
kono
parents: 67
diff changeset
811
kono
parents: 67
diff changeset
812 /* Return the machine mode to use for a MODE_FLOAT of SIZE bits, if one
kono
parents: 67
diff changeset
813 exists. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
814
111
kono
parents: 67
diff changeset
815 inline opt_scalar_float_mode
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
816 float_mode_for_size (poly_uint64 size)
111
kono
parents: 67
diff changeset
817 {
kono
parents: 67
diff changeset
818 return dyn_cast <scalar_float_mode> (mode_for_size (size, MODE_FLOAT, 0));
kono
parents: 67
diff changeset
819 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
820
111
kono
parents: 67
diff changeset
821 /* Likewise for MODE_DECIMAL_FLOAT. */
kono
parents: 67
diff changeset
822
kono
parents: 67
diff changeset
823 inline opt_scalar_float_mode
kono
parents: 67
diff changeset
824 decimal_float_mode_for_size (unsigned int size)
kono
parents: 67
diff changeset
825 {
kono
parents: 67
diff changeset
826 return dyn_cast <scalar_float_mode>
kono
parents: 67
diff changeset
827 (mode_for_size (size, MODE_DECIMAL_FLOAT, 0));
kono
parents: 67
diff changeset
828 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
829
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
830 extern machine_mode smallest_mode_for_size (poly_uint64, enum mode_class);
111
kono
parents: 67
diff changeset
831
kono
parents: 67
diff changeset
832 /* Find the narrowest integer mode that contains at least SIZE bits.
kono
parents: 67
diff changeset
833 Such a mode must exist. */
kono
parents: 67
diff changeset
834
kono
parents: 67
diff changeset
835 inline scalar_int_mode
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
836 smallest_int_mode_for_size (poly_uint64 size)
111
kono
parents: 67
diff changeset
837 {
kono
parents: 67
diff changeset
838 return as_a <scalar_int_mode> (smallest_mode_for_size (size, MODE_INT));
kono
parents: 67
diff changeset
839 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
840
111
kono
parents: 67
diff changeset
841 extern opt_scalar_int_mode int_mode_for_mode (machine_mode);
kono
parents: 67
diff changeset
842 extern opt_machine_mode bitwise_mode_for_mode (machine_mode);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
843 extern opt_machine_mode mode_for_vector (scalar_mode, poly_uint64);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
844 extern opt_machine_mode mode_for_int_vector (unsigned int, poly_uint64);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
845
111
kono
parents: 67
diff changeset
846 /* Return the integer vector equivalent of MODE, if one exists. In other
kono
parents: 67
diff changeset
847 words, return the mode for an integer vector that has the same number
kono
parents: 67
diff changeset
848 of bits as MODE and the same number of elements as MODE, with the
kono
parents: 67
diff changeset
849 latter being 1 if MODE is scalar. The returned mode can be either
kono
parents: 67
diff changeset
850 an integer mode or a vector mode. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
851
111
kono
parents: 67
diff changeset
852 inline opt_machine_mode
kono
parents: 67
diff changeset
853 mode_for_int_vector (machine_mode mode)
kono
parents: 67
diff changeset
854 {
kono
parents: 67
diff changeset
855 return mode_for_int_vector (GET_MODE_UNIT_BITSIZE (mode),
kono
parents: 67
diff changeset
856 GET_MODE_NUNITS (mode));
kono
parents: 67
diff changeset
857 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
858
111
kono
parents: 67
diff changeset
859 /* A class for iterating through possible bitfield modes. */
kono
parents: 67
diff changeset
860 class bit_field_mode_iterator
kono
parents: 67
diff changeset
861 {
kono
parents: 67
diff changeset
862 public:
kono
parents: 67
diff changeset
863 bit_field_mode_iterator (HOST_WIDE_INT, HOST_WIDE_INT,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
864 poly_int64, poly_int64,
111
kono
parents: 67
diff changeset
865 unsigned int, bool);
kono
parents: 67
diff changeset
866 bool next_mode (scalar_int_mode *);
kono
parents: 67
diff changeset
867 bool prefer_smaller_modes ();
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
868
111
kono
parents: 67
diff changeset
869 private:
kono
parents: 67
diff changeset
870 opt_scalar_int_mode m_mode;
kono
parents: 67
diff changeset
871 /* We use signed values here because the bit position can be negative
kono
parents: 67
diff changeset
872 for invalid input such as gcc.dg/pr48335-8.c. */
kono
parents: 67
diff changeset
873 HOST_WIDE_INT m_bitsize;
kono
parents: 67
diff changeset
874 HOST_WIDE_INT m_bitpos;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
875 poly_int64 m_bitregion_start;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
876 poly_int64 m_bitregion_end;
111
kono
parents: 67
diff changeset
877 unsigned int m_align;
kono
parents: 67
diff changeset
878 bool m_volatilep;
kono
parents: 67
diff changeset
879 int m_count;
kono
parents: 67
diff changeset
880 };
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
881
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
882 /* Find the best mode to use to access a bit field. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
883
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
884 extern bool get_best_mode (int, int, poly_uint64, poly_uint64, unsigned int,
111
kono
parents: 67
diff changeset
885 unsigned HOST_WIDE_INT, bool, scalar_int_mode *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
886
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
887 /* Determine alignment, 1<=result<=BIGGEST_ALIGNMENT. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
888
111
kono
parents: 67
diff changeset
889 extern CONST_MODE_BASE_ALIGN unsigned short mode_base_align[NUM_MACHINE_MODES];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
890
111
kono
parents: 67
diff changeset
891 extern unsigned get_mode_alignment (machine_mode);
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 #define GET_MODE_ALIGNMENT(MODE) get_mode_alignment (MODE)
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 /* For each class, get the narrowest mode in that class. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
896
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
897 extern const unsigned char class_narrowest_mode[MAX_MODE_CLASS];
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
898 #define GET_CLASS_NARROWEST_MODE(CLASS) \
111
kono
parents: 67
diff changeset
899 ((machine_mode) class_narrowest_mode[CLASS])
kono
parents: 67
diff changeset
900
kono
parents: 67
diff changeset
901 /* The narrowest full integer mode available on the target. */
kono
parents: 67
diff changeset
902
kono
parents: 67
diff changeset
903 #define NARROWEST_INT_MODE \
kono
parents: 67
diff changeset
904 (scalar_int_mode \
kono
parents: 67
diff changeset
905 (scalar_int_mode::from_int (class_narrowest_mode[MODE_INT])))
kono
parents: 67
diff changeset
906
kono
parents: 67
diff changeset
907 /* Return the narrowest mode in T's class. */
kono
parents: 67
diff changeset
908
kono
parents: 67
diff changeset
909 template<typename T>
kono
parents: 67
diff changeset
910 inline T
kono
parents: 67
diff changeset
911 get_narrowest_mode (T mode)
kono
parents: 67
diff changeset
912 {
kono
parents: 67
diff changeset
913 return typename mode_traits<T>::from_int
kono
parents: 67
diff changeset
914 (class_narrowest_mode[GET_MODE_CLASS (mode)]);
kono
parents: 67
diff changeset
915 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
916
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
917 /* Define the integer modes whose sizes are BITS_PER_UNIT and BITS_PER_WORD
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
918 and the mode whose class is Pmode and whose size is POINTER_SIZE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
919
111
kono
parents: 67
diff changeset
920 extern scalar_int_mode byte_mode;
kono
parents: 67
diff changeset
921 extern scalar_int_mode word_mode;
kono
parents: 67
diff changeset
922 extern scalar_int_mode ptr_mode;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
923
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
924 /* Target-dependent machine mode initialization - in insn-modes.c. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
925 extern void init_adjust_machine_modes (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
926
111
kono
parents: 67
diff changeset
927 #define TRULY_NOOP_TRUNCATION_MODES_P(MODE1, MODE2) \
kono
parents: 67
diff changeset
928 (targetm.truly_noop_truncation (GET_MODE_PRECISION (MODE1), \
kono
parents: 67
diff changeset
929 GET_MODE_PRECISION (MODE2)))
kono
parents: 67
diff changeset
930
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
931 /* Return true if MODE is a scalar integer mode that fits in a
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
932 HOST_WIDE_INT. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
933
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
934 inline bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
935 HWI_COMPUTABLE_MODE_P (machine_mode mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
936 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
937 machine_mode mme = mode;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
938 return (SCALAR_INT_MODE_P (mme)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
939 && mode_to_precision (mme).coeffs[0] <= HOST_BITS_PER_WIDE_INT);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
940 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
941
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
942 inline bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
943 HWI_COMPUTABLE_MODE_P (scalar_int_mode mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
944 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
945 return GET_MODE_PRECISION (mode) <= HOST_BITS_PER_WIDE_INT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
946 }
111
kono
parents: 67
diff changeset
947
kono
parents: 67
diff changeset
948 struct int_n_data_t {
kono
parents: 67
diff changeset
949 /* These parts are initailized by genmodes output */
kono
parents: 67
diff changeset
950 unsigned int bitsize;
kono
parents: 67
diff changeset
951 scalar_int_mode_pod m;
kono
parents: 67
diff changeset
952 /* RID_* is RID_INTN_BASE + index into this array */
kono
parents: 67
diff changeset
953 };
kono
parents: 67
diff changeset
954
kono
parents: 67
diff changeset
955 /* This is also in tree.h. genmodes.c guarantees the're sorted from
kono
parents: 67
diff changeset
956 smallest bitsize to largest bitsize. */
kono
parents: 67
diff changeset
957 extern bool int_n_enabled_p[NUM_INT_N_ENTS];
kono
parents: 67
diff changeset
958 extern const int_n_data_t int_n_data[NUM_INT_N_ENTS];
kono
parents: 67
diff changeset
959
kono
parents: 67
diff changeset
960 /* Return true if MODE has class MODE_INT, storing it as a scalar_int_mode
kono
parents: 67
diff changeset
961 in *INT_MODE if so. */
kono
parents: 67
diff changeset
962
kono
parents: 67
diff changeset
963 template<typename T>
kono
parents: 67
diff changeset
964 inline bool
kono
parents: 67
diff changeset
965 is_int_mode (machine_mode mode, T *int_mode)
kono
parents: 67
diff changeset
966 {
kono
parents: 67
diff changeset
967 if (GET_MODE_CLASS (mode) == MODE_INT)
kono
parents: 67
diff changeset
968 {
kono
parents: 67
diff changeset
969 *int_mode = scalar_int_mode (scalar_int_mode::from_int (mode));
kono
parents: 67
diff changeset
970 return true;
kono
parents: 67
diff changeset
971 }
kono
parents: 67
diff changeset
972 return false;
kono
parents: 67
diff changeset
973 }
kono
parents: 67
diff changeset
974
kono
parents: 67
diff changeset
975 /* Return true if MODE has class MODE_FLOAT, storing it as a
kono
parents: 67
diff changeset
976 scalar_float_mode in *FLOAT_MODE if so. */
kono
parents: 67
diff changeset
977
kono
parents: 67
diff changeset
978 template<typename T>
kono
parents: 67
diff changeset
979 inline bool
kono
parents: 67
diff changeset
980 is_float_mode (machine_mode mode, T *float_mode)
kono
parents: 67
diff changeset
981 {
kono
parents: 67
diff changeset
982 if (GET_MODE_CLASS (mode) == MODE_FLOAT)
kono
parents: 67
diff changeset
983 {
kono
parents: 67
diff changeset
984 *float_mode = scalar_float_mode (scalar_float_mode::from_int (mode));
kono
parents: 67
diff changeset
985 return true;
kono
parents: 67
diff changeset
986 }
kono
parents: 67
diff changeset
987 return false;
kono
parents: 67
diff changeset
988 }
kono
parents: 67
diff changeset
989
kono
parents: 67
diff changeset
990 /* Return true if MODE has class MODE_COMPLEX_INT, storing it as
kono
parents: 67
diff changeset
991 a complex_mode in *CMODE if so. */
kono
parents: 67
diff changeset
992
kono
parents: 67
diff changeset
993 template<typename T>
kono
parents: 67
diff changeset
994 inline bool
kono
parents: 67
diff changeset
995 is_complex_int_mode (machine_mode mode, T *cmode)
kono
parents: 67
diff changeset
996 {
kono
parents: 67
diff changeset
997 if (GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
kono
parents: 67
diff changeset
998 {
kono
parents: 67
diff changeset
999 *cmode = complex_mode (complex_mode::from_int (mode));
kono
parents: 67
diff changeset
1000 return true;
kono
parents: 67
diff changeset
1001 }
kono
parents: 67
diff changeset
1002 return false;
kono
parents: 67
diff changeset
1003 }
kono
parents: 67
diff changeset
1004
kono
parents: 67
diff changeset
1005 /* Return true if MODE has class MODE_COMPLEX_FLOAT, storing it as
kono
parents: 67
diff changeset
1006 a complex_mode in *CMODE if so. */
kono
parents: 67
diff changeset
1007
kono
parents: 67
diff changeset
1008 template<typename T>
kono
parents: 67
diff changeset
1009 inline bool
kono
parents: 67
diff changeset
1010 is_complex_float_mode (machine_mode mode, T *cmode)
kono
parents: 67
diff changeset
1011 {
kono
parents: 67
diff changeset
1012 if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
kono
parents: 67
diff changeset
1013 {
kono
parents: 67
diff changeset
1014 *cmode = complex_mode (complex_mode::from_int (mode));
kono
parents: 67
diff changeset
1015 return true;
kono
parents: 67
diff changeset
1016 }
kono
parents: 67
diff changeset
1017 return false;
kono
parents: 67
diff changeset
1018 }
kono
parents: 67
diff changeset
1019
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1020 /* Return true if MODE is a scalar integer mode with a precision
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1021 smaller than LIMIT's precision. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1022
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1023 inline bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1024 is_narrower_int_mode (machine_mode mode, scalar_int_mode limit)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1025 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1026 scalar_int_mode int_mode;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1027 return (is_a <scalar_int_mode> (mode, &int_mode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1028 && GET_MODE_PRECISION (int_mode) < GET_MODE_PRECISION (limit));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1029 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1030
111
kono
parents: 67
diff changeset
1031 namespace mode_iterator
kono
parents: 67
diff changeset
1032 {
kono
parents: 67
diff changeset
1033 /* Start mode iterator *ITER at the first mode in class MCLASS, if any. */
kono
parents: 67
diff changeset
1034
kono
parents: 67
diff changeset
1035 template<typename T>
kono
parents: 67
diff changeset
1036 inline void
kono
parents: 67
diff changeset
1037 start (opt_mode<T> *iter, enum mode_class mclass)
kono
parents: 67
diff changeset
1038 {
kono
parents: 67
diff changeset
1039 if (GET_CLASS_NARROWEST_MODE (mclass) == E_VOIDmode)
kono
parents: 67
diff changeset
1040 *iter = opt_mode<T> ();
kono
parents: 67
diff changeset
1041 else
kono
parents: 67
diff changeset
1042 *iter = as_a<T> (GET_CLASS_NARROWEST_MODE (mclass));
kono
parents: 67
diff changeset
1043 }
kono
parents: 67
diff changeset
1044
kono
parents: 67
diff changeset
1045 inline void
kono
parents: 67
diff changeset
1046 start (machine_mode *iter, enum mode_class mclass)
kono
parents: 67
diff changeset
1047 {
kono
parents: 67
diff changeset
1048 *iter = GET_CLASS_NARROWEST_MODE (mclass);
kono
parents: 67
diff changeset
1049 }
kono
parents: 67
diff changeset
1050
kono
parents: 67
diff changeset
1051 /* Return true if mode iterator *ITER has not reached the end. */
kono
parents: 67
diff changeset
1052
kono
parents: 67
diff changeset
1053 template<typename T>
kono
parents: 67
diff changeset
1054 inline bool
kono
parents: 67
diff changeset
1055 iterate_p (opt_mode<T> *iter)
kono
parents: 67
diff changeset
1056 {
kono
parents: 67
diff changeset
1057 return iter->exists ();
kono
parents: 67
diff changeset
1058 }
kono
parents: 67
diff changeset
1059
kono
parents: 67
diff changeset
1060 inline bool
kono
parents: 67
diff changeset
1061 iterate_p (machine_mode *iter)
kono
parents: 67
diff changeset
1062 {
kono
parents: 67
diff changeset
1063 return *iter != E_VOIDmode;
kono
parents: 67
diff changeset
1064 }
kono
parents: 67
diff changeset
1065
kono
parents: 67
diff changeset
1066 /* Set mode iterator *ITER to the next widest mode in the same class,
kono
parents: 67
diff changeset
1067 if any. */
kono
parents: 67
diff changeset
1068
kono
parents: 67
diff changeset
1069 template<typename T>
kono
parents: 67
diff changeset
1070 inline void
kono
parents: 67
diff changeset
1071 get_wider (opt_mode<T> *iter)
kono
parents: 67
diff changeset
1072 {
kono
parents: 67
diff changeset
1073 *iter = GET_MODE_WIDER_MODE (iter->require ());
kono
parents: 67
diff changeset
1074 }
kono
parents: 67
diff changeset
1075
kono
parents: 67
diff changeset
1076 inline void
kono
parents: 67
diff changeset
1077 get_wider (machine_mode *iter)
kono
parents: 67
diff changeset
1078 {
kono
parents: 67
diff changeset
1079 *iter = GET_MODE_WIDER_MODE (*iter).else_void ();
kono
parents: 67
diff changeset
1080 }
kono
parents: 67
diff changeset
1081
kono
parents: 67
diff changeset
1082 /* Set mode iterator *ITER to the next widest mode in the same class.
kono
parents: 67
diff changeset
1083 Such a mode is known to exist. */
kono
parents: 67
diff changeset
1084
kono
parents: 67
diff changeset
1085 template<typename T>
kono
parents: 67
diff changeset
1086 inline void
kono
parents: 67
diff changeset
1087 get_known_wider (T *iter)
kono
parents: 67
diff changeset
1088 {
kono
parents: 67
diff changeset
1089 *iter = GET_MODE_WIDER_MODE (*iter).require ();
kono
parents: 67
diff changeset
1090 }
kono
parents: 67
diff changeset
1091
kono
parents: 67
diff changeset
1092 /* Set mode iterator *ITER to the mode that is two times wider than the
kono
parents: 67
diff changeset
1093 current one, if such a mode exists. */
kono
parents: 67
diff changeset
1094
kono
parents: 67
diff changeset
1095 template<typename T>
kono
parents: 67
diff changeset
1096 inline void
kono
parents: 67
diff changeset
1097 get_2xwider (opt_mode<T> *iter)
kono
parents: 67
diff changeset
1098 {
kono
parents: 67
diff changeset
1099 *iter = GET_MODE_2XWIDER_MODE (iter->require ());
kono
parents: 67
diff changeset
1100 }
kono
parents: 67
diff changeset
1101
kono
parents: 67
diff changeset
1102 inline void
kono
parents: 67
diff changeset
1103 get_2xwider (machine_mode *iter)
kono
parents: 67
diff changeset
1104 {
kono
parents: 67
diff changeset
1105 *iter = GET_MODE_2XWIDER_MODE (*iter).else_void ();
kono
parents: 67
diff changeset
1106 }
kono
parents: 67
diff changeset
1107 }
kono
parents: 67
diff changeset
1108
kono
parents: 67
diff changeset
1109 /* Make ITERATOR iterate over all the modes in mode class CLASS,
kono
parents: 67
diff changeset
1110 from narrowest to widest. */
kono
parents: 67
diff changeset
1111 #define FOR_EACH_MODE_IN_CLASS(ITERATOR, CLASS) \
kono
parents: 67
diff changeset
1112 for (mode_iterator::start (&(ITERATOR), CLASS); \
kono
parents: 67
diff changeset
1113 mode_iterator::iterate_p (&(ITERATOR)); \
kono
parents: 67
diff changeset
1114 mode_iterator::get_wider (&(ITERATOR)))
kono
parents: 67
diff changeset
1115
kono
parents: 67
diff changeset
1116 /* Make ITERATOR iterate over all the modes in the range [START, END),
kono
parents: 67
diff changeset
1117 in order of increasing width. */
kono
parents: 67
diff changeset
1118 #define FOR_EACH_MODE(ITERATOR, START, END) \
kono
parents: 67
diff changeset
1119 for ((ITERATOR) = (START); \
kono
parents: 67
diff changeset
1120 (ITERATOR) != (END); \
kono
parents: 67
diff changeset
1121 mode_iterator::get_known_wider (&(ITERATOR)))
kono
parents: 67
diff changeset
1122
kono
parents: 67
diff changeset
1123 /* Make ITERATOR iterate over START and all wider modes in the same
kono
parents: 67
diff changeset
1124 class, in order of increasing width. */
kono
parents: 67
diff changeset
1125 #define FOR_EACH_MODE_FROM(ITERATOR, START) \
kono
parents: 67
diff changeset
1126 for ((ITERATOR) = (START); \
kono
parents: 67
diff changeset
1127 mode_iterator::iterate_p (&(ITERATOR)); \
kono
parents: 67
diff changeset
1128 mode_iterator::get_wider (&(ITERATOR)))
kono
parents: 67
diff changeset
1129
kono
parents: 67
diff changeset
1130 /* Make ITERATOR iterate over modes in the range [NARROWEST, END)
kono
parents: 67
diff changeset
1131 in order of increasing width, where NARROWEST is the narrowest mode
kono
parents: 67
diff changeset
1132 in END's class. */
kono
parents: 67
diff changeset
1133 #define FOR_EACH_MODE_UNTIL(ITERATOR, END) \
kono
parents: 67
diff changeset
1134 FOR_EACH_MODE (ITERATOR, get_narrowest_mode (END), END)
kono
parents: 67
diff changeset
1135
kono
parents: 67
diff changeset
1136 /* Make ITERATOR iterate over modes in the same class as MODE, in order
kono
parents: 67
diff changeset
1137 of increasing width. Start at the first mode wider than START,
kono
parents: 67
diff changeset
1138 or don't iterate at all if there is no wider mode. */
kono
parents: 67
diff changeset
1139 #define FOR_EACH_WIDER_MODE(ITERATOR, START) \
kono
parents: 67
diff changeset
1140 for ((ITERATOR) = (START), mode_iterator::get_wider (&(ITERATOR)); \
kono
parents: 67
diff changeset
1141 mode_iterator::iterate_p (&(ITERATOR)); \
kono
parents: 67
diff changeset
1142 mode_iterator::get_wider (&(ITERATOR)))
kono
parents: 67
diff changeset
1143
kono
parents: 67
diff changeset
1144 /* Make ITERATOR iterate over modes in the same class as MODE, in order
kono
parents: 67
diff changeset
1145 of increasing width, and with each mode being twice the width of the
kono
parents: 67
diff changeset
1146 previous mode. Start at the mode that is two times wider than START,
kono
parents: 67
diff changeset
1147 or don't iterate at all if there is no such mode. */
kono
parents: 67
diff changeset
1148 #define FOR_EACH_2XWIDER_MODE(ITERATOR, START) \
kono
parents: 67
diff changeset
1149 for ((ITERATOR) = (START), mode_iterator::get_2xwider (&(ITERATOR)); \
kono
parents: 67
diff changeset
1150 mode_iterator::iterate_p (&(ITERATOR)); \
kono
parents: 67
diff changeset
1151 mode_iterator::get_2xwider (&(ITERATOR)))
kono
parents: 67
diff changeset
1152
kono
parents: 67
diff changeset
1153 template<typename T>
kono
parents: 67
diff changeset
1154 void
kono
parents: 67
diff changeset
1155 gt_ggc_mx (pod_mode<T> *)
kono
parents: 67
diff changeset
1156 {
kono
parents: 67
diff changeset
1157 }
kono
parents: 67
diff changeset
1158
kono
parents: 67
diff changeset
1159 template<typename T>
kono
parents: 67
diff changeset
1160 void
kono
parents: 67
diff changeset
1161 gt_pch_nx (pod_mode<T> *)
kono
parents: 67
diff changeset
1162 {
kono
parents: 67
diff changeset
1163 }
kono
parents: 67
diff changeset
1164
kono
parents: 67
diff changeset
1165 template<typename T>
kono
parents: 67
diff changeset
1166 void
kono
parents: 67
diff changeset
1167 gt_pch_nx (pod_mode<T> *, void (*) (void *, void *), void *)
kono
parents: 67
diff changeset
1168 {
kono
parents: 67
diff changeset
1169 }
kono
parents: 67
diff changeset
1170
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1171 #endif /* not HAVE_MACHINE_MODES */