annotate gcc/config/aarch64/aarch64-sve-builtins.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* ACLE support for AArch64 SVE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 Copyright (C) 2018-2020 Free Software Foundation, Inc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 This file is part of GCC.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 under the terms of the GNU General Public License as published by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 the Free Software Foundation; either version 3, or (at your option)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 any later version.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 WITHOUT ANY WARRANTY; without even the implied warranty of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 General Public License for more details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 #ifndef GCC_AARCH64_SVE_BUILTINS_H
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 #define GCC_AARCH64_SVE_BUILTINS_H
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 /* The full name of an SVE ACLE function is the concatenation of:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 - the base name ("svadd", etc.)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 - the "mode" suffix ("_n", "_index", etc.)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 - the type suffixes ("_s32", "_b8", etc.)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 - the predication suffix ("_x", "_z", etc.)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 Each piece of information is individually useful, so we retain this
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 classification throughout:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 - function_base represents the base name
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 - mode_suffix_index represents the mode suffix
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 - type_suffix_index represents individual type suffixes, while
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 type_suffix_pair represents a pair of them
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 - prediction_index extends the predication suffix with an additional
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 alternative: PRED_implicit for implicitly-predicated operations
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 In addition to its unique full name, a function may have a shorter
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 overloaded alias. This alias removes pieces of the suffixes that
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 can be inferred from the arguments, such as by shortening the mode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 suffix or dropping some of the type suffixes. The base name and the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 predication suffix stay the same.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 The function_shape class describes what arguments a given function
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 takes and what its overloaded alias is called. In broad terms,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 function_base describes how the underlying instruction behaves while
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 function_shape describes how that instruction has been presented at
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 the language level.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 The static list of functions uses function_group to describe a group
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 of related functions. The function_builder class is responsible for
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 expanding this static description into a list of individual functions
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 and registering the associated built-in functions. function_instance
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 describes one of these individual functions in terms of the properties
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 described above.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 The classes involved in compiling a function call are:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 - function_resolver, which resolves an overloaded function call to a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 specific function_instance and its associated function decl
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 - function_checker, which checks whether the values of the arguments
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 conform to the ACLE specification
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 - gimple_folder, which tries to fold a function call at the gimple level
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 - function_expander, which expands a function call into rtl instructions
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 function_resolver and function_checker operate at the language level
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 and so are associated with the function_shape. gimple_folder and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 function_expander are concerned with the behavior of the function
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 and so are associated with the function_base.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 Note that we've specifically chosen not to fold calls in the frontend,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 since SVE intrinsics will hardly ever fold a useful language-level
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 constant. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 namespace aarch64_sve
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 /* The maximum number of vectors in an ACLE tuple type. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 const unsigned int MAX_TUPLE_SIZE = 4;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 /* Used to represent the default merge argument index for _m functions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 The actual index depends on how many arguments the function takes. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 const unsigned int DEFAULT_MERGE_ARGNO = ~0U;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 /* Flags that describe what a function might do, in addition to reading
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 its arguments and returning a result. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 const unsigned int CP_READ_FPCR = 1U << 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 const unsigned int CP_RAISE_FP_EXCEPTIONS = 1U << 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 const unsigned int CP_READ_MEMORY = 1U << 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 const unsigned int CP_PREFETCH_MEMORY = 1U << 3;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 const unsigned int CP_WRITE_MEMORY = 1U << 4;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 const unsigned int CP_READ_FFR = 1U << 5;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 const unsigned int CP_WRITE_FFR = 1U << 6;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 /* Enumerates the SVE predicate and (data) vector types, together called
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 "vector types" for brevity. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 enum vector_type_index
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 #define DEF_SVE_TYPE(ACLE_NAME, NCHARS, ABI_NAME, SCALAR_TYPE) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 VECTOR_TYPE_ ## ACLE_NAME,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 #include "aarch64-sve-builtins.def"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 NUM_VECTOR_TYPES
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 /* Classifies the available measurement units for an address displacement. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 enum units_index
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 UNITS_none,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 UNITS_bytes,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 UNITS_elements,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 UNITS_vectors
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 /* Describes the various uses of a governing predicate. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 enum predication_index
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 /* No governing predicate is present. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 PRED_none,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 /* A governing predicate is present but there is no predication suffix
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 associated with it. This is used when the result is neither a vector
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 nor a predicate, since the distinction between "zeroing" and "merging"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 doesn't apply in that case. It is also used when a suffix would be
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 redundant (such as for loads and comparisons, which are inherently
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 zeroing operations). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 PRED_implicit,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 /* Merging predication: copy inactive lanes from the first data argument
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 to the vector result. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 PRED_m,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 /* "Don't care" predication: set inactive lanes of the vector result
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 to arbitrary values. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 PRED_x,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 /* Zero predication: set inactive lanes of the vector result to zero. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 PRED_z,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 NUM_PREDS
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 /* Classifies element types, based on type suffixes with the bit count
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 removed. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 enum type_class_index
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 TYPE_bool,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 TYPE_bfloat,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 TYPE_float,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 TYPE_signed,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 TYPE_unsigned,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 NUM_TYPE_CLASSES
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 /* Classifies an operation into "modes"; for example, to distinguish
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 vector-scalar operations from vector-vector operations, or to
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 distinguish between different addressing modes. This classification
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 accounts for the function suffixes that occur between the base name
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 and the first type suffix. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 enum mode_suffix_index
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 #define DEF_SVE_MODE(NAME, BASE, DISPLACEMENT, UNITS) MODE_##NAME,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 #include "aarch64-sve-builtins.def"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 MODE_none
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 /* Enumerates the possible type suffixes. Each suffix is associated with
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 a vector type, but for predicates provides extra information about the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 element size. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 enum type_suffix_index
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 #define DEF_SVE_TYPE_SUFFIX(NAME, ACLE_TYPE, CLASS, BITS, MODE) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 TYPE_SUFFIX_ ## NAME,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 #include "aarch64-sve-builtins.def"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 NUM_TYPE_SUFFIXES
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 /* Combines two type suffixes. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 typedef enum type_suffix_index type_suffix_pair[2];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 class function_base;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 class function_shape;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 /* Static information about a mode suffix. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 struct mode_suffix_info
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 /* The suffix string itself. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 const char *string;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 /* The type of the vector base address, or NUM_VECTOR_TYPES if the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 mode does not include a vector base address. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 vector_type_index base_vector_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 /* The type of the vector displacement, or NUM_VECTOR_TYPES if the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 mode does not include a vector displacement. (Note that scalar
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 displacements are always int64_t.) */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 vector_type_index displacement_vector_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 /* The units in which the vector or scalar displacement is measured,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 or UNITS_none if the mode doesn't take a displacement. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 units_index displacement_units;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 /* Static information about a type suffix. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 struct type_suffix_info
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 /* The suffix string itself. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 const char *string;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 /* The associated ACLE vector or predicate type. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 vector_type_index vector_type : 8;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 /* What kind of type the suffix represents. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 type_class_index tclass : 8;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 /* The number of bits and bytes in an element. For predicates this
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 measures the associated data elements. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 unsigned int element_bits : 8;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 unsigned int element_bytes : 8;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 /* True if the suffix is for an integer type. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 unsigned int integer_p : 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 /* True if the suffix is for an unsigned type. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 unsigned int unsigned_p : 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 /* True if the suffix is for a floating-point type. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 unsigned int float_p : 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 /* True if the suffix is for a boolean type. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 unsigned int bool_p : 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 unsigned int spare : 12;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 /* The associated vector or predicate mode. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 machine_mode vector_mode : 16;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 /* Static information about a set of functions. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 struct function_group_info
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 /* The base name, as a string. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 const char *base_name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 /* Describes the behavior associated with the function base name. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 const function_base *const *base;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 /* The shape of the functions, as described above the class definition.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 It's possible to have entries with the same base name but different
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 shapes. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 const function_shape *const *shape;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 /* A list of the available type suffixes, and of the available predication
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 types. The function supports every combination of the two.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 The list of type suffixes is terminated by two NUM_TYPE_SUFFIXES
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 while the list of predication types is terminated by NUM_PREDS.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 The list of type suffixes is lexicographically ordered based
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 on the index value. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 const type_suffix_pair *types;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 const predication_index *preds;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 /* The architecture extensions that the functions require, as a set of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 AARCH64_FL_* flags. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 uint64_t required_extensions;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 /* Describes a single fully-resolved function (i.e. one that has a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 unique full name). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 class GTY((user)) function_instance
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 function_instance (const char *, const function_base *,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 const function_shape *, mode_suffix_index,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 const type_suffix_pair &, predication_index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 bool operator== (const function_instance &) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 bool operator!= (const function_instance &) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 hashval_t hash () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 unsigned int call_properties () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 bool reads_global_state_p () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 bool modifies_global_state_p () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 bool could_trap_p () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 unsigned int vectors_per_tuple () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 tree memory_scalar_type () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 machine_mode memory_vector_mode () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 const mode_suffix_info &mode_suffix () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 tree base_vector_type () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 tree displacement_vector_type () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 units_index displacement_units () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 const type_suffix_info &type_suffix (unsigned int) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 tree scalar_type (unsigned int) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 tree vector_type (unsigned int) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 tree tuple_type (unsigned int) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 unsigned int elements_per_vq (unsigned int i) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 machine_mode vector_mode (unsigned int) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 machine_mode gp_mode (unsigned int) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 /* The properties of the function. (The explicit "enum"s are required
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 for gengtype.) */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 const char *base_name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307 const function_base *base;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 const function_shape *shape;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 enum mode_suffix_index mode_suffix_id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 type_suffix_pair type_suffix_ids;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 enum predication_index pred;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 class registered_function;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 /* A class for building and registering function decls. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 class function_builder
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 function_builder ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 ~function_builder ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 void add_unique_function (const function_instance &, tree,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 vec<tree> &, uint64_t, bool);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 void add_overloaded_function (const function_instance &, uint64_t);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 void add_overloaded_functions (const function_group_info &,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 mode_suffix_index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 void register_function_group (const function_group_info &);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 void append_name (const char *);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 char *finish_name ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 char *get_name (const function_instance &, bool);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 tree get_attributes (const function_instance &);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 registered_function &add_function (const function_instance &,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 const char *, tree, tree, uint64_t, bool);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 /* The function type to use for functions that are resolved by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 function_resolver. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 tree m_overload_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 /* True if we should create a separate decl for each instance of an
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 overloaded function, instead of using function_resolver. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 bool m_direct_overloads;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 /* Used for building up function names. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 obstack m_string_obstack;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 /* Maps all overloaded function names that we've registered so far
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 to their associated function_instances. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 hash_map<nofree_string_hash, registered_function *> m_overload_names;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 /* A base class for handling calls to built-in functions. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 class function_call_info : public function_instance
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 function_call_info (location_t, const function_instance &, tree);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 bool function_returns_void_p ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 /* The location of the call. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 location_t location;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 /* The FUNCTION_DECL that is being called. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 tree fndecl;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 /* A class for resolving an overloaded function call. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 class function_resolver : public function_call_info
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 enum { SAME_SIZE = 256, HALF_SIZE, QUARTER_SIZE };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 static const type_class_index SAME_TYPE_CLASS = NUM_TYPE_CLASSES;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380 function_resolver (location_t, const function_instance &, tree,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 vec<tree, va_gc> &);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 tree get_vector_type (type_suffix_index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 const char *get_scalar_type_name (type_suffix_index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 tree get_argument_type (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386 bool scalar_argument_p (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 tree report_no_such_form (type_suffix_index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 tree lookup_form (mode_suffix_index,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 type_suffix_index = NUM_TYPE_SUFFIXES,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 type_suffix_index = NUM_TYPE_SUFFIXES);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 tree resolve_to (mode_suffix_index,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 type_suffix_index = NUM_TYPE_SUFFIXES,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 type_suffix_index = NUM_TYPE_SUFFIXES);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 type_suffix_index infer_integer_scalar_type (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 type_suffix_index infer_pointer_type (unsigned int, bool = false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398 type_suffix_index infer_vector_or_tuple_type (unsigned int, unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 type_suffix_index infer_vector_type (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 type_suffix_index infer_integer_vector_type (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401 type_suffix_index infer_unsigned_vector_type (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402 type_suffix_index infer_sd_vector_type (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 type_suffix_index infer_tuple_type (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 bool require_vector_or_scalar_type (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 bool require_vector_type (unsigned int, vector_type_index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408 bool require_matching_vector_type (unsigned int, type_suffix_index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 bool require_derived_vector_type (unsigned int, unsigned int,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 type_suffix_index,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 type_class_index = SAME_TYPE_CLASS,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 unsigned int = SAME_SIZE);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 bool require_scalar_type (unsigned int, const char *);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 bool require_pointer_type (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 bool require_matching_integer_scalar_type (unsigned int, unsigned int,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 type_suffix_index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 bool require_derived_scalar_type (unsigned int, type_class_index,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 unsigned int = SAME_SIZE);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 bool require_matching_pointer_type (unsigned int, unsigned int,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421 type_suffix_index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 bool require_integer_immediate (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 vector_type_index infer_vector_base_type (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425 vector_type_index infer_vector_displacement_type (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 mode_suffix_index resolve_sv_displacement (unsigned int,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 type_suffix_index, bool);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 mode_suffix_index resolve_gather_address (unsigned int,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430 type_suffix_index, bool);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 mode_suffix_index resolve_adr_address (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 bool check_num_arguments (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434 bool check_gp_argument (unsigned int, unsigned int &, unsigned int &);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435 tree resolve_unary (type_class_index = SAME_TYPE_CLASS,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 unsigned int = SAME_SIZE, bool = false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 tree resolve_uniform (unsigned int, unsigned int = 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 tree resolve_uniform_opt_n (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 tree finish_opt_n_resolution (unsigned int, unsigned int, type_suffix_index,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 type_class_index = SAME_TYPE_CLASS,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 unsigned int = SAME_SIZE,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 type_suffix_index = NUM_TYPE_SUFFIXES);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 tree resolve ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 /* The arguments to the overloaded function. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448 vec<tree, va_gc> &m_arglist;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 /* A class for checking that the semantic constraints on a function call are
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452 satisfied, such as arguments being integer constant expressions with
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 a particular range. The parent class's FNDECL is the decl that was
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 called in the original source, before overload resolution. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 class function_checker : public function_call_info
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 function_checker (location_t, const function_instance &, tree,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 tree, unsigned int, tree *);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 bool require_immediate_either_or (unsigned int, HOST_WIDE_INT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462 HOST_WIDE_INT);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 bool require_immediate_enum (unsigned int, tree);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464 bool require_immediate_lane_index (unsigned int, unsigned int = 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 bool require_immediate_one_of (unsigned int, HOST_WIDE_INT, HOST_WIDE_INT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 HOST_WIDE_INT, HOST_WIDE_INT);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 bool require_immediate_range (unsigned int, HOST_WIDE_INT, HOST_WIDE_INT);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 bool check ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472 bool argument_exists_p (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 bool require_immediate (unsigned int, HOST_WIDE_INT &);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476 /* The type of the resolved function. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 tree m_fntype;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 /* The arguments to the function. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 unsigned int m_nargs;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 tree *m_args;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483 /* The first argument not associated with the function's predication
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 type. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485 unsigned int m_base_arg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488 /* A class for folding a gimple function call. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489 class gimple_folder : public function_call_info
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492 gimple_folder (const function_instance &, tree,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 gimple_stmt_iterator *, gcall *);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495 tree force_vector (gimple_seq &, tree, tree);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496 tree convert_pred (gimple_seq &, tree, unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497 tree fold_contiguous_base (gimple_seq &, tree);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498 tree load_store_cookie (tree);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500 gimple *redirect_call (const function_instance &);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501 gimple *fold_to_pfalse ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502 gimple *fold_to_ptrue ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503 gimple *fold_to_vl_pred (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 gimple *fold ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507 /* Where to insert extra statements that feed the final replacement. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508 gimple_stmt_iterator *gsi;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510 /* The call we're folding. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 gcall *call;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 /* The result of the call, or null if none. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514 tree lhs;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517 /* A class for expanding a function call into RTL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518 class function_expander : public function_call_info
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
519 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
520 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
521 function_expander (const function_instance &, tree, tree, rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
522 rtx expand ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
523
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
524 insn_code direct_optab_handler (optab, unsigned int = 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
525 insn_code direct_optab_handler_for_sign (optab, optab, unsigned int = 0,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
526 machine_mode = E_VOIDmode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
527
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
528 bool overlaps_input_p (rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
529
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
530 rtx convert_to_pmode (rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
531 rtx get_contiguous_base (machine_mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
532 rtx get_fallback_value (machine_mode, unsigned int,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
533 unsigned int, unsigned int &);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
534 rtx get_reg_target ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
535 rtx get_nonoverlapping_reg_target ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
536
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
537 void add_output_operand (insn_code);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
538 void add_input_operand (insn_code, rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
539 void add_integer_operand (HOST_WIDE_INT);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
540 void add_mem_operand (machine_mode, rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
541 void add_address_operand (rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
542 void add_fixed_operand (rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
543 rtx generate_insn (insn_code);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
544
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
545 void prepare_gather_address_operands (unsigned int, bool = true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
546 void prepare_prefetch_operands ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
547 void add_ptrue_hint (unsigned int, machine_mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
548 void rotate_inputs_left (unsigned int, unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
549 bool try_negating_argument (unsigned int, machine_mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
550
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
551 rtx use_exact_insn (insn_code);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
552 rtx use_unpred_insn (insn_code);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
553 rtx use_pred_x_insn (insn_code);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
554 rtx use_cond_insn (insn_code, unsigned int = DEFAULT_MERGE_ARGNO);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
555 rtx use_vcond_mask_insn (insn_code, unsigned int = DEFAULT_MERGE_ARGNO);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
556 rtx use_contiguous_load_insn (insn_code);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
557 rtx use_contiguous_prefetch_insn (insn_code);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
558 rtx use_contiguous_store_insn (insn_code);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
559
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
560 rtx map_to_rtx_codes (rtx_code, rtx_code, int,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
561 unsigned int = DEFAULT_MERGE_ARGNO);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
562 rtx map_to_unspecs (int, int, int, unsigned int = DEFAULT_MERGE_ARGNO);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
563
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
564 /* The function call expression. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
565 tree call_expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
566
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
567 /* For functions that return a value, this is the preferred location
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
568 of that value. It could be null or could have a different mode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
569 from the function return type. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
570 rtx possible_target;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
571
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
572 /* The expanded arguments. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
573 auto_vec<rtx, 16> args;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
574
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
575 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
576 /* Used to build up the operands to an instruction. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
577 auto_vec<expand_operand, 8> m_ops;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
578 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
579
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
580 /* Provides information about a particular function base name, and handles
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
581 tasks related to the base name. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
582 class function_base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
583 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
584 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
585 /* Return a set of CP_* flags that describe what the function might do,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
586 in addition to reading its arguments and returning a result. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
587 virtual unsigned int call_properties (const function_instance &) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
588
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
589 /* If the function operates on tuples of vectors, return the number
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
590 of vectors in the tuples, otherwise return 1. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
591 virtual unsigned int vectors_per_tuple () const { return 1; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
592
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
593 /* If the function addresses memory, return the type of a single
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
594 scalar memory element. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
595 virtual tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
596 memory_scalar_type (const function_instance &) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
597 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
598 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
599 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
600
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
601 /* If the function addresses memory, return a vector mode whose
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
602 GET_MODE_NUNITS is the number of elements addressed and whose
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
603 GET_MODE_INNER is the mode of a single scalar memory element. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
604 virtual machine_mode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
605 memory_vector_mode (const function_instance &) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
606 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
607 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
608 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
609
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
610 /* Try to fold the given gimple call. Return the new gimple statement
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
611 on success, otherwise return null. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
612 virtual gimple *fold (gimple_folder &) const { return NULL; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
613
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
614 /* Expand the given call into rtl. Return the result of the function,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
615 or an arbitrary value if the function doesn't return a result. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
616 virtual rtx expand (function_expander &) const = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
617 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
618
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
619 /* Classifies functions into "shapes". The idea is to take all the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
620 type signatures for a set of functions, remove the governing predicate
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
621 (if any), and classify what's left based on:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
622
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
623 - the number of arguments
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
624
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
625 - the process of determining the types in the signature from the mode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
626 and type suffixes in the function name (including types that are not
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
627 affected by the suffixes)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
628
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
629 - which arguments must be integer constant expressions, and what range
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
630 those arguments have
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
631
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
632 - the process for mapping overloaded names to "full" names. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
633 class function_shape
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
634 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
635 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
636 virtual bool explicit_type_suffix_p (unsigned int) const = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
637
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
638 /* Define all functions associated with the given group. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
639 virtual void build (function_builder &,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
640 const function_group_info &) const = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
641
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
642 /* Try to resolve the overloaded call. Return the non-overloaded
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
643 function decl on success and error_mark_node on failure. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
644 virtual tree resolve (function_resolver &) const = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
645
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
646 /* Check whether the given call is semantically valid. Return true
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
647 if it is, otherwise report an error and return false. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
648 virtual bool check (function_checker &) const { return true; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
649 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
650
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
651 /* RAII class for enabling enough SVE features to define the built-in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
652 types and implement the arm_sve.h pragma. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
653 class sve_switcher
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
654 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
655 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
656 sve_switcher ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
657 ~sve_switcher ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
658
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
659 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
660 unsigned long m_old_isa_flags;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
661 bool m_old_have_regs_of_mode[MAX_MACHINE_MODE];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
662 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
663
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
664 extern const type_suffix_info type_suffixes[NUM_TYPE_SUFFIXES + 1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
665 extern const mode_suffix_info mode_suffixes[MODE_none + 1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
666
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
667 extern tree scalar_types[NUM_VECTOR_TYPES];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
668 extern tree acle_vector_types[MAX_TUPLE_SIZE][NUM_VECTOR_TYPES + 1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
669 extern tree acle_svpattern;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
670 extern tree acle_svprfop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
671
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
672 /* Return the ACLE type svbool_t. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
673 inline tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
674 get_svbool_t (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
675 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
676 return acle_vector_types[0][VECTOR_TYPE_svbool_t];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
677 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
678
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
679 /* Try to find a mode with the given mode_suffix_info fields. Return the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
680 mode on success or MODE_none on failure. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
681 inline mode_suffix_index
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
682 find_mode_suffix (vector_type_index base_vector_type,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
683 vector_type_index displacement_vector_type,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
684 units_index displacement_units)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
685 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
686 for (unsigned int mode_i = 0; mode_i < ARRAY_SIZE (mode_suffixes); ++mode_i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
687 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
688 const mode_suffix_info &mode = mode_suffixes[mode_i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
689 if (mode.base_vector_type == base_vector_type
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
690 && mode.displacement_vector_type == displacement_vector_type
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
691 && mode.displacement_units == displacement_units)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
692 return mode_suffix_index (mode_i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
693 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
694 return MODE_none;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
695 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
696
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
697 /* Return the type suffix associated with ELEMENT_BITS-bit elements of type
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
698 class TCLASS. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
699 inline type_suffix_index
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
700 find_type_suffix (type_class_index tclass, unsigned int element_bits)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
701 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
702 for (unsigned int i = 0; i < NUM_TYPE_SUFFIXES; ++i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
703 if (type_suffixes[i].tclass == tclass
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
704 && type_suffixes[i].element_bits == element_bits)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
705 return type_suffix_index (i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
706 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
707 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
708
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
709 /* Return the single field in tuple type TYPE. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
710 inline tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
711 tuple_type_field (tree type)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
712 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
713 for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
714 if (TREE_CODE (field) == FIELD_DECL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
715 return field;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
716 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
717 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
718
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
719 inline function_instance::
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
720 function_instance (const char *base_name_in,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
721 const function_base *base_in,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
722 const function_shape *shape_in,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
723 mode_suffix_index mode_suffix_id_in,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
724 const type_suffix_pair &type_suffix_ids_in,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
725 predication_index pred_in)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
726 : base_name (base_name_in), base (base_in), shape (shape_in),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
727 mode_suffix_id (mode_suffix_id_in), pred (pred_in)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
728 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
729 memcpy (type_suffix_ids, type_suffix_ids_in, sizeof (type_suffix_ids));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
730 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
731
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
732 inline bool
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
733 function_instance::operator== (const function_instance &other) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
734 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
735 return (base == other.base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
736 && shape == other.shape
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
737 && mode_suffix_id == other.mode_suffix_id
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
738 && pred == other.pred
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
739 && type_suffix_ids[0] == other.type_suffix_ids[0]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
740 && type_suffix_ids[1] == other.type_suffix_ids[1]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
741 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
742
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
743 inline bool
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
744 function_instance::operator!= (const function_instance &other) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
745 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
746 return !operator== (other);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
747 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
748
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
749 /* If the function operates on tuples of vectors, return the number
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
750 of vectors in the tuples, otherwise return 1. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
751 inline unsigned int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
752 function_instance::vectors_per_tuple () const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
753 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
754 return base->vectors_per_tuple ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
755 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
756
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
757 /* If the function addresses memory, return the type of a single
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
758 scalar memory element. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
759 inline tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
760 function_instance::memory_scalar_type () const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
761 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
762 return base->memory_scalar_type (*this);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
763 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
764
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
765 /* If the function addresses memory, return a vector mode whose
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
766 GET_MODE_NUNITS is the number of elements addressed and whose
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
767 GET_MODE_INNER is the mode of a single scalar memory element. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
768 inline machine_mode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
769 function_instance::memory_vector_mode () const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
770 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
771 return base->memory_vector_mode (*this);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
772 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
773
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
774 /* Return information about the function's mode suffix. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
775 inline const mode_suffix_info &
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
776 function_instance::mode_suffix () const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
777 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
778 return mode_suffixes[mode_suffix_id];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
779 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
780
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
781 /* Return the type of the function's vector base address argument,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
782 or null it doesn't have a vector base address. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
783 inline tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
784 function_instance::base_vector_type () const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
785 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
786 return acle_vector_types[0][mode_suffix ().base_vector_type];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
787 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
788
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
789 /* Return the type of the function's vector index or offset argument,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
790 or null if doesn't have a vector index or offset argument. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
791 inline tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
792 function_instance::displacement_vector_type () const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
793 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
794 return acle_vector_types[0][mode_suffix ().displacement_vector_type];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
795 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
796
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
797 /* If the function takes a vector or scalar displacement, return the units
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
798 in which the displacement is measured, otherwise return UNITS_none. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
799 inline units_index
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
800 function_instance::displacement_units () const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
801 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
802 return mode_suffix ().displacement_units;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
803 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
804
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
805 /* Return information about type suffix I. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
806 inline const type_suffix_info &
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
807 function_instance::type_suffix (unsigned int i) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
808 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
809 return type_suffixes[type_suffix_ids[i]];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
810 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
811
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
812 /* Return the scalar type associated with type suffix I. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
813 inline tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
814 function_instance::scalar_type (unsigned int i) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
815 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
816 return scalar_types[type_suffix (i).vector_type];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
817 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
818
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
819 /* Return the vector type associated with type suffix I. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
820 inline tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
821 function_instance::vector_type (unsigned int i) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
822 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
823 return acle_vector_types[0][type_suffix (i).vector_type];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
824 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
825
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
826 /* If the function operates on tuples of vectors, return the tuple type
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
827 associated with type suffix I, otherwise return the vector type associated
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
828 with type suffix I. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
829 inline tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
830 function_instance::tuple_type (unsigned int i) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
831 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
832 unsigned int num_vectors = vectors_per_tuple ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
833 return acle_vector_types[num_vectors - 1][type_suffix (i).vector_type];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
834 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
835
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
836 /* Return the number of elements of type suffix I that fit within a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
837 128-bit block. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
838 inline unsigned int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
839 function_instance::elements_per_vq (unsigned int i) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
840 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
841 return 128 / type_suffix (i).element_bits;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
842 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
843
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
844 /* Return the vector or predicate mode associated with type suffix I. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
845 inline machine_mode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
846 function_instance::vector_mode (unsigned int i) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
847 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
848 return type_suffix (i).vector_mode;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
849 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
850
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
851 /* Return the mode of the governing predicate to use when operating on
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
852 type suffix I. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
853 inline machine_mode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
854 function_instance::gp_mode (unsigned int i) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
855 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
856 return aarch64_sve_pred_mode (type_suffix (i).element_bytes).require ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
857 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
858
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
859 /* Return true if the function has no return value. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
860 inline bool
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
861 function_call_info::function_returns_void_p ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
862 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
863 return TREE_TYPE (TREE_TYPE (fndecl)) == void_type_node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
864 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
865
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
866 /* Default implementation of function::call_properties, with conservatively
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
867 correct behavior for floating-point instructions. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
868 inline unsigned int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
869 function_base::call_properties (const function_instance &instance) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
870 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
871 unsigned int flags = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
872 if (instance.type_suffix (0).float_p || instance.type_suffix (1).float_p)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
873 flags |= CP_READ_FPCR | CP_RAISE_FP_EXCEPTIONS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
874 return flags;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
875 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
876
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
877 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
878
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
879 #endif