1 | /* Internal functions. |
2 | Copyright (C) 2011-2024 Free Software Foundation, Inc. |
3 | |
4 | This file is part of GCC. |
5 | |
6 | GCC is free software; you can redistribute it and/or modify it under |
7 | the terms of the GNU General Public License as published by the Free |
8 | Software Foundation; either version 3, or (at your option) any later |
9 | version. |
10 | |
11 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
12 | WARRANTY; without even the implied warranty of MERCHANTABILITY or |
13 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
14 | for more details. |
15 | |
16 | You should have received a copy of the GNU General Public License |
17 | along with GCC; see the file COPYING3. If not see |
18 | <http://www.gnu.org/licenses/>. */ |
19 | |
20 | /* This file specifies a list of internal "functions". These functions |
21 | differ from built-in functions in that they have no linkage and cannot |
22 | be called directly by the user. They represent operations that are only |
23 | synthesised by GCC itself. |
24 | |
25 | Internal functions are used instead of tree codes if the operation |
26 | and its operands are more naturally represented as a GIMPLE_CALL |
27 | than a GIMPLE_ASSIGN. |
28 | |
29 | Each entry in this file has one of the forms: |
30 | |
31 | DEF_INTERNAL_FN (NAME, FLAGS, FNSPEC) |
32 | DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE) |
33 | DEF_INTERNAL_SIGNED_OPTAB_FN (NAME, FLAGS, SELECTOR, SIGNED_OPTAB, |
34 | UNSIGNED_OPTAB, TYPE) |
35 | DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE) |
36 | DEF_INTERNAL_FLT_FLOATN_FN (NAME, FLAGS, OPTAB, TYPE) |
37 | DEF_INTERNAL_INT_FN (NAME, FLAGS, OPTAB, TYPE) |
38 | DEF_INTERNAL_INT_EXT_FN (NAME, FLAGS, OPTAB, TYPE) |
39 | DEF_INTERNAL_COND_FN (NAME, FLAGS, OPTAB, TYPE) |
40 | DEF_INTERNAL_SIGNED_COND_FN (NAME, FLAGS, OPTAB, TYPE) |
41 | DEF_INTERNAL_WIDENING_OPTAB_FN (NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB, |
42 | TYPE) |
43 | |
44 | where NAME is the name of the function, FLAGS is a set of |
45 | ECF_* flags and FNSPEC is a string describing functions fnspec. |
46 | |
47 | DEF_INTERNAL_OPTAB_FN defines an internal function that maps to a |
48 | direct optab. The function should only be called with a given |
49 | set of types if the associated optab is available for the modes |
50 | of those types. OPTAB says what optab to use (without the trailing |
51 | "_optab") and TYPE categorizes the optab based on its inputs and |
52 | outputs. The possible types of optab are: |
53 | |
54 | - mask_load: currently just maskload |
55 | - load_lanes: currently just vec_load_lanes |
56 | - mask_load_lanes: currently just vec_mask_load_lanes |
57 | - mask_len_load_lanes: currently just vec_mask_len_load_lanes |
58 | - gather_load: used for {mask_,mask_len_,}gather_load |
59 | - len_load: currently just len_load |
60 | - mask_len_load: currently just mask_len_load |
61 | |
62 | - mask_store: currently just maskstore |
63 | - store_lanes: currently just vec_store_lanes |
64 | - mask_store_lanes: currently just vec_mask_store_lanes |
65 | - mask_len_store_lanes: currently just vec_mask_len_store_lanes |
66 | - scatter_store: used for {mask_,mask_len_,}scatter_store |
67 | - len_store: currently just len_store |
68 | - mask_len_store: currently just mask_len_store |
69 | |
70 | - unary: a normal unary optab, such as vec_reverse_<mode> |
71 | - binary: a normal binary optab, such as vec_interleave_lo_<mode> |
72 | - ternary: a normal ternary optab, such as fma<mode>4 |
73 | |
74 | - unary_convert: a single-input conversion optab, such as |
75 | lround<srcmode><dstmode>2. |
76 | |
77 | - cond_binary: a conditional binary optab, such as cond_add<mode> |
78 | - cond_unary: a conditional unary optab, such as cond_neg<mode> |
79 | - cond_ternary: a conditional ternary optab, such as cond_fma_rev<mode> |
80 | |
81 | - fold_left: for scalar = FN (scalar, vector), keyed off the vector mode |
82 | - check_ptrs: used for check_{raw,war}_ptrs |
83 | |
84 | - cond_len_unary: a conditional unary optab, such as cond_len_neg<mode> |
85 | - cond_len_binary: a conditional binary optab, such as cond_len_add<mode> |
86 | - cond_len_ternary: a conditional ternary optab, such as |
87 | cond_len_fma_rev<mode> |
88 | |
89 | DEF_INTERNAL_SIGNED_OPTAB_FN defines an internal function that |
90 | maps to one of two optabs, depending on the signedness of an input. |
91 | SIGNED_OPTAB and UNSIGNED_OPTAB are the optabs for signed and |
92 | unsigned inputs respectively, both without the trailing "_optab". |
93 | SELECTOR says which type in the tree_pair determines the signedness. |
94 | |
95 | DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition, |
96 | the function implements the computational part of a built-in math |
97 | function BUILT_IN_<NAME>{F,,L}. Unlike some built-in functions, |
98 | these internal functions never set errno. |
99 | |
100 | DEF_INTERNAL_INT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition |
101 | says that the function extends the C-level BUILT_IN_<NAME>{,L,LL,IMAX} |
102 | group of functions to any integral mode (including vector modes). |
103 | |
104 | DEF_INTERNAL_INT_EXT_FN is like DEF_INTERNAL_INT_FN, except that it |
105 | has expand_##NAME defined in internal-fn.cc to override the |
106 | DEF_INTERNAL_INT_FN expansion behavior. |
107 | |
108 | DEF_INTERNAL_WIDENING_OPTAB_FN is a wrapper that defines five internal |
109 | functions with DEF_INTERNAL_SIGNED_OPTAB_FN: |
110 | - one that describes a widening operation with the same number of elements |
111 | in the output and input vectors, |
112 | - two that describe a pair of high-low widening operations where the output |
113 | vectors each have half the number of elements of the input vectors, |
114 | corresponding to the result of the widening operation on the top half and |
115 | bottom half, these have the suffixes _HI and _LO, |
116 | - and two that describe a pair of even-odd widening operations where the |
117 | output vectors each have half the number of elements of the input vectors, |
118 | corresponding to the result of the widening operation on the even and odd |
119 | elements, these have the suffixes _EVEN and _ODD. |
120 | These five internal functions will require two optabs each, a SIGNED_OPTAB |
121 | and an UNSIGNED_OTPAB. |
122 | |
123 | DEF_INTERNAL_COND_FN is a wrapper that defines 2 internal functions with |
124 | DEF_INTERNAL_OPTAB_FN: |
125 | - One is COND_* operations that are predicated by mask only. Such operations |
126 | make sense for both vectors and scalars. |
127 | - The other is COND_LEN_* operations that are predicated by mask and len |
128 | both. Such operations only make sense for vectors. |
129 | |
130 | DEF_INTERNAL_SIGNED_COND_FN is like DEF_INTERNAL_COND_FN but defines intenal |
131 | functions with DEF_INTERNAL_SIGNED_OPTAB_FN. |
132 | |
133 | Each entry must have a corresponding expander of the form: |
134 | |
135 | void expand_NAME (gimple_call stmt) |
136 | |
137 | where STMT is the statement that performs the call. These are generated |
138 | automatically for optab functions and call out to a function or macro |
139 | called expand_<TYPE>_optab_fn. */ |
140 | |
141 | #ifndef DEF_INTERNAL_FN |
142 | #define DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) |
143 | #endif |
144 | |
145 | #ifndef DEF_INTERNAL_OPTAB_FN |
146 | #define DEF_INTERNAL_OPTAB_FN(NAME, FLAGS, OPTAB, TYPE) \ |
147 | DEF_INTERNAL_FN (NAME, FLAGS | ECF_LEAF, NULL) |
148 | #endif |
149 | |
150 | #ifndef DEF_INTERNAL_SIGNED_OPTAB_FN |
151 | #define DEF_INTERNAL_SIGNED_OPTAB_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, \ |
152 | UNSIGNED_OPTAB, TYPE) \ |
153 | DEF_INTERNAL_FN (NAME, FLAGS | ECF_LEAF, NULL) |
154 | #endif |
155 | |
156 | #ifndef DEF_INTERNAL_FLT_FN |
157 | #define DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) \ |
158 | DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE) |
159 | #endif |
160 | |
161 | #ifndef DEF_INTERNAL_FLT_FLOATN_FN |
162 | #define DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) \ |
163 | DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE) |
164 | #endif |
165 | |
166 | #ifndef DEF_INTERNAL_INT_FN |
167 | #define DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) \ |
168 | DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE) |
169 | #endif |
170 | |
171 | #ifndef DEF_INTERNAL_INT_EXT_FN |
172 | #define DEF_INTERNAL_INT_EXT_FN(NAME, FLAGS, OPTAB, TYPE) \ |
173 | DEF_INTERNAL_INT_FN (NAME, FLAGS, OPTAB, TYPE) |
174 | #endif |
175 | |
176 | #ifndef DEF_INTERNAL_WIDENING_OPTAB_FN |
177 | #define DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB, TYPE) \ |
178 | DEF_INTERNAL_SIGNED_OPTAB_FN (NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB, TYPE) \ |
179 | DEF_INTERNAL_SIGNED_OPTAB_FN (NAME ## _LO, FLAGS, SELECTOR, SOPTAB##_lo, UOPTAB##_lo, TYPE) \ |
180 | DEF_INTERNAL_SIGNED_OPTAB_FN (NAME ## _HI, FLAGS, SELECTOR, SOPTAB##_hi, UOPTAB##_hi, TYPE) \ |
181 | DEF_INTERNAL_SIGNED_OPTAB_FN (NAME ## _EVEN, FLAGS, SELECTOR, SOPTAB##_even, UOPTAB##_even, TYPE) \ |
182 | DEF_INTERNAL_SIGNED_OPTAB_FN (NAME ## _ODD, FLAGS, SELECTOR, SOPTAB##_odd, UOPTAB##_odd, TYPE) |
183 | #endif |
184 | |
185 | #ifndef DEF_INTERNAL_COND_FN |
186 | #define DEF_INTERNAL_COND_FN(NAME, FLAGS, OPTAB, TYPE) \ |
187 | DEF_INTERNAL_OPTAB_FN (COND_##NAME, FLAGS, cond_##OPTAB, cond_##TYPE) \ |
188 | DEF_INTERNAL_OPTAB_FN (COND_LEN_##NAME, FLAGS, cond_len_##OPTAB, \ |
189 | cond_len_##TYPE) |
190 | #endif |
191 | |
192 | #ifndef DEF_INTERNAL_SIGNED_COND_FN |
193 | #define DEF_INTERNAL_SIGNED_COND_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, \ |
194 | UNSIGNED_OPTAB, TYPE) \ |
195 | DEF_INTERNAL_SIGNED_OPTAB_FN (COND_##NAME, FLAGS, SELECTOR, \ |
196 | cond_##SIGNED_OPTAB, cond_##UNSIGNED_OPTAB, \ |
197 | cond_##TYPE) \ |
198 | DEF_INTERNAL_SIGNED_OPTAB_FN (COND_LEN_##NAME, FLAGS, SELECTOR, \ |
199 | cond_len_##SIGNED_OPTAB, \ |
200 | cond_len_##UNSIGNED_OPTAB, cond_len_##TYPE) |
201 | #endif |
202 | |
203 | DEF_INTERNAL_OPTAB_FN (MASK_LOAD, ECF_PURE, maskload, mask_load) |
204 | DEF_INTERNAL_OPTAB_FN (LOAD_LANES, ECF_CONST, vec_load_lanes, load_lanes) |
205 | DEF_INTERNAL_OPTAB_FN (MASK_LOAD_LANES, ECF_PURE, |
206 | vec_mask_load_lanes, mask_load_lanes) |
207 | DEF_INTERNAL_OPTAB_FN (MASK_LEN_LOAD_LANES, ECF_PURE, |
208 | vec_mask_len_load_lanes, mask_load_lanes) |
209 | |
210 | DEF_INTERNAL_OPTAB_FN (GATHER_LOAD, ECF_PURE, gather_load, gather_load) |
211 | DEF_INTERNAL_OPTAB_FN (MASK_GATHER_LOAD, ECF_PURE, |
212 | mask_gather_load, gather_load) |
213 | DEF_INTERNAL_OPTAB_FN (MASK_LEN_GATHER_LOAD, ECF_PURE, |
214 | mask_len_gather_load, gather_load) |
215 | |
216 | DEF_INTERNAL_OPTAB_FN (LEN_LOAD, ECF_PURE, len_load, len_load) |
217 | DEF_INTERNAL_OPTAB_FN (MASK_LEN_LOAD, ECF_PURE, mask_len_load, mask_len_load) |
218 | |
219 | DEF_INTERNAL_OPTAB_FN (SCATTER_STORE, 0, scatter_store, scatter_store) |
220 | DEF_INTERNAL_OPTAB_FN (MASK_SCATTER_STORE, 0, |
221 | mask_scatter_store, scatter_store) |
222 | DEF_INTERNAL_OPTAB_FN (MASK_LEN_SCATTER_STORE, 0, |
223 | mask_len_scatter_store, scatter_store) |
224 | |
225 | DEF_INTERNAL_OPTAB_FN (MASK_STORE, 0, maskstore, mask_store) |
226 | DEF_INTERNAL_OPTAB_FN (STORE_LANES, ECF_CONST, vec_store_lanes, store_lanes) |
227 | DEF_INTERNAL_OPTAB_FN (MASK_STORE_LANES, 0, |
228 | vec_mask_store_lanes, mask_store_lanes) |
229 | DEF_INTERNAL_OPTAB_FN (MASK_LEN_STORE_LANES, 0, |
230 | vec_mask_len_store_lanes, mask_store_lanes) |
231 | |
232 | DEF_INTERNAL_OPTAB_FN (VCOND, ECF_CONST | ECF_NOTHROW, vcond, vec_cond) |
233 | DEF_INTERNAL_OPTAB_FN (VCONDU, ECF_CONST | ECF_NOTHROW, vcondu, vec_cond) |
234 | DEF_INTERNAL_OPTAB_FN (VCONDEQ, ECF_CONST | ECF_NOTHROW, vcondeq, vec_cond) |
235 | DEF_INTERNAL_OPTAB_FN (VCOND_MASK, ECF_CONST | ECF_NOTHROW, |
236 | vcond_mask, vec_cond_mask) |
237 | DEF_INTERNAL_OPTAB_FN (VCOND_MASK_LEN, ECF_CONST | ECF_NOTHROW, |
238 | vcond_mask_len, cond_len_unary) |
239 | |
240 | DEF_INTERNAL_OPTAB_FN (VEC_SET, ECF_CONST | ECF_NOTHROW, vec_set, vec_set) |
241 | DEF_INTERNAL_OPTAB_FN (VEC_EXTRACT, ECF_CONST | ECF_NOTHROW, |
242 | vec_extract, vec_extract) |
243 | |
244 | DEF_INTERNAL_OPTAB_FN (LEN_STORE, 0, len_store, len_store) |
245 | DEF_INTERNAL_OPTAB_FN (MASK_LEN_STORE, 0, mask_len_store, mask_len_store) |
246 | |
247 | DEF_INTERNAL_OPTAB_FN (WHILE_ULT, ECF_CONST | ECF_NOTHROW, while_ult, while) |
248 | DEF_INTERNAL_OPTAB_FN (SELECT_VL, ECF_CONST | ECF_NOTHROW, select_vl, binary) |
249 | DEF_INTERNAL_OPTAB_FN (CHECK_RAW_PTRS, ECF_CONST | ECF_NOTHROW, |
250 | check_raw_ptrs, check_ptrs) |
251 | DEF_INTERNAL_OPTAB_FN (CHECK_WAR_PTRS, ECF_CONST | ECF_NOTHROW, |
252 | check_war_ptrs, check_ptrs) |
253 | |
254 | DEF_INTERNAL_OPTAB_FN (VEC_SHL_INSERT, ECF_CONST | ECF_NOTHROW, |
255 | vec_shl_insert, binary) |
256 | |
257 | DEF_INTERNAL_OPTAB_FN (DIV_POW2, ECF_CONST | ECF_NOTHROW, sdiv_pow2, binary) |
258 | |
259 | DEF_INTERNAL_OPTAB_FN (FMS, ECF_CONST, fms, ternary) |
260 | DEF_INTERNAL_OPTAB_FN (FNMA, ECF_CONST, fnma, ternary) |
261 | DEF_INTERNAL_OPTAB_FN (FNMS, ECF_CONST, fnms, ternary) |
262 | |
263 | DEF_INTERNAL_SIGNED_OPTAB_FN (ABD, ECF_CONST | ECF_NOTHROW, first, |
264 | sabd, uabd, binary) |
265 | |
266 | DEF_INTERNAL_SIGNED_OPTAB_FN (AVG_FLOOR, ECF_CONST | ECF_NOTHROW, first, |
267 | savg_floor, uavg_floor, binary) |
268 | DEF_INTERNAL_SIGNED_OPTAB_FN (AVG_CEIL, ECF_CONST | ECF_NOTHROW, first, |
269 | savg_ceil, uavg_ceil, binary) |
270 | |
271 | DEF_INTERNAL_SIGNED_OPTAB_FN (MULH, ECF_CONST | ECF_NOTHROW, first, |
272 | smul_highpart, umul_highpart, binary) |
273 | DEF_INTERNAL_SIGNED_OPTAB_FN (MULHS, ECF_CONST | ECF_NOTHROW, first, |
274 | smulhs, umulhs, binary) |
275 | DEF_INTERNAL_SIGNED_OPTAB_FN (MULHRS, ECF_CONST | ECF_NOTHROW, first, |
276 | smulhrs, umulhrs, binary) |
277 | |
278 | DEF_INTERNAL_COND_FN (ADD, ECF_CONST, add, binary) |
279 | DEF_INTERNAL_COND_FN (SUB, ECF_CONST, sub, binary) |
280 | DEF_INTERNAL_COND_FN (MUL, ECF_CONST, smul, binary) |
281 | DEF_INTERNAL_SIGNED_COND_FN (DIV, ECF_CONST, first, sdiv, udiv, binary) |
282 | DEF_INTERNAL_SIGNED_COND_FN (MOD, ECF_CONST, first, smod, umod, binary) |
283 | DEF_INTERNAL_COND_FN (RDIV, ECF_CONST, sdiv, binary) |
284 | DEF_INTERNAL_SIGNED_COND_FN (MIN, ECF_CONST, first, smin, umin, binary) |
285 | DEF_INTERNAL_SIGNED_COND_FN (MAX, ECF_CONST, first, smax, umax, binary) |
286 | DEF_INTERNAL_COND_FN (COPYSIGN, ECF_CONST, copysign, binary) |
287 | DEF_INTERNAL_COND_FN (FMIN, ECF_CONST, fmin, binary) |
288 | DEF_INTERNAL_COND_FN (FMAX, ECF_CONST, fmax, binary) |
289 | DEF_INTERNAL_COND_FN (AND, ECF_CONST | ECF_NOTHROW, and, binary) |
290 | DEF_INTERNAL_COND_FN (IOR, ECF_CONST | ECF_NOTHROW, ior, binary) |
291 | DEF_INTERNAL_COND_FN (XOR, ECF_CONST | ECF_NOTHROW, xor, binary) |
292 | DEF_INTERNAL_COND_FN (SHL, ECF_CONST | ECF_NOTHROW, ashl, binary) |
293 | DEF_INTERNAL_SIGNED_COND_FN (SHR, ECF_CONST | ECF_NOTHROW, first, ashr, lshr, |
294 | binary) |
295 | |
296 | DEF_INTERNAL_COND_FN (FMA, ECF_CONST, fma, ternary) |
297 | DEF_INTERNAL_COND_FN (FMS, ECF_CONST, fms, ternary) |
298 | DEF_INTERNAL_COND_FN (FNMA, ECF_CONST, fnma, ternary) |
299 | DEF_INTERNAL_COND_FN (FNMS, ECF_CONST, fnms, ternary) |
300 | |
301 | DEF_INTERNAL_COND_FN (NEG, ECF_CONST, neg, unary) |
302 | DEF_INTERNAL_COND_FN (NOT, ECF_CONST, one_cmpl, unary) |
303 | |
304 | DEF_INTERNAL_OPTAB_FN (RSQRT, ECF_CONST, rsqrt, unary) |
305 | |
306 | DEF_INTERNAL_OPTAB_FN (REDUC_PLUS, ECF_CONST | ECF_NOTHROW, |
307 | reduc_plus_scal, unary) |
308 | DEF_INTERNAL_SIGNED_OPTAB_FN (REDUC_MAX, ECF_CONST | ECF_NOTHROW, first, |
309 | reduc_smax_scal, reduc_umax_scal, unary) |
310 | DEF_INTERNAL_SIGNED_OPTAB_FN (REDUC_MIN, ECF_CONST | ECF_NOTHROW, first, |
311 | reduc_smin_scal, reduc_umin_scal, unary) |
312 | DEF_INTERNAL_OPTAB_FN (REDUC_FMAX, ECF_CONST | ECF_NOTHROW, |
313 | reduc_fmax_scal, unary) |
314 | DEF_INTERNAL_OPTAB_FN (REDUC_FMIN, ECF_CONST | ECF_NOTHROW, |
315 | reduc_fmin_scal, unary) |
316 | DEF_INTERNAL_OPTAB_FN (REDUC_AND, ECF_CONST | ECF_NOTHROW, |
317 | reduc_and_scal, unary) |
318 | DEF_INTERNAL_OPTAB_FN (REDUC_IOR, ECF_CONST | ECF_NOTHROW, |
319 | reduc_ior_scal, unary) |
320 | DEF_INTERNAL_OPTAB_FN (REDUC_XOR, ECF_CONST | ECF_NOTHROW, |
321 | reduc_xor_scal, unary) |
322 | |
323 | /* Extract the last active element from a vector. */ |
324 | DEF_INTERNAL_OPTAB_FN (EXTRACT_LAST, ECF_CONST | ECF_NOTHROW, |
325 | extract_last, fold_left) |
326 | |
327 | /* Same, but return the first argument if no elements are active. */ |
328 | DEF_INTERNAL_OPTAB_FN (FOLD_EXTRACT_LAST, ECF_CONST | ECF_NOTHROW, |
329 | fold_extract_last, fold_extract) |
330 | |
331 | DEF_INTERNAL_OPTAB_FN (LEN_FOLD_EXTRACT_LAST, ECF_CONST | ECF_NOTHROW, |
332 | len_fold_extract_last, fold_len_extract) |
333 | |
334 | DEF_INTERNAL_OPTAB_FN (FOLD_LEFT_PLUS, ECF_CONST | ECF_NOTHROW, |
335 | fold_left_plus, fold_left) |
336 | |
337 | DEF_INTERNAL_OPTAB_FN (MASK_FOLD_LEFT_PLUS, ECF_CONST | ECF_NOTHROW, |
338 | mask_fold_left_plus, mask_fold_left) |
339 | |
340 | DEF_INTERNAL_OPTAB_FN (MASK_LEN_FOLD_LEFT_PLUS, ECF_CONST | ECF_NOTHROW, |
341 | mask_len_fold_left_plus, mask_len_fold_left) |
342 | |
343 | /* Unary math functions. */ |
344 | DEF_INTERNAL_FLT_FN (ACOS, ECF_CONST, acos, unary) |
345 | DEF_INTERNAL_FLT_FN (ACOSH, ECF_CONST, acosh, unary) |
346 | DEF_INTERNAL_FLT_FN (ASIN, ECF_CONST, asin, unary) |
347 | DEF_INTERNAL_FLT_FN (ASINH, ECF_CONST, asinh, unary) |
348 | DEF_INTERNAL_FLT_FN (ATAN, ECF_CONST, atan, unary) |
349 | DEF_INTERNAL_FLT_FN (ATANH, ECF_CONST, atanh, unary) |
350 | DEF_INTERNAL_FLT_FN (COS, ECF_CONST, cos, unary) |
351 | DEF_INTERNAL_FLT_FN (COSH, ECF_CONST, cosh, unary) |
352 | DEF_INTERNAL_FLT_FN (EXP, ECF_CONST, exp, unary) |
353 | DEF_INTERNAL_FLT_FN (EXP10, ECF_CONST, exp10, unary) |
354 | DEF_INTERNAL_FLT_FN (EXP2, ECF_CONST, exp2, unary) |
355 | DEF_INTERNAL_FLT_FN (EXPM1, ECF_CONST, expm1, unary) |
356 | DEF_INTERNAL_FLT_FN (LOG, ECF_CONST, log, unary) |
357 | DEF_INTERNAL_FLT_FN (LOG10, ECF_CONST, log10, unary) |
358 | DEF_INTERNAL_FLT_FN (LOG1P, ECF_CONST, log1p, unary) |
359 | DEF_INTERNAL_FLT_FN (LOG2, ECF_CONST, log2, unary) |
360 | DEF_INTERNAL_FLT_FN (LOGB, ECF_CONST, logb, unary) |
361 | DEF_INTERNAL_FLT_FN (SIGNBIT, ECF_CONST, signbit, unary) |
362 | DEF_INTERNAL_FLT_FN (SIGNIFICAND, ECF_CONST, significand, unary) |
363 | DEF_INTERNAL_FLT_FN (SIN, ECF_CONST, sin, unary) |
364 | DEF_INTERNAL_FLT_FN (SINH, ECF_CONST, sinh, unary) |
365 | DEF_INTERNAL_FLT_FLOATN_FN (SQRT, ECF_CONST, sqrt, unary) |
366 | DEF_INTERNAL_FLT_FN (TAN, ECF_CONST, tan, unary) |
367 | DEF_INTERNAL_FLT_FN (TANH, ECF_CONST, tanh, unary) |
368 | |
369 | /* Floating-point to integer conversions. |
370 | |
371 | ??? Here we preserve the I/L/LL prefix convention from the |
372 | corresponding built-in functions, rather than make the internal |
373 | functions polymorphic in both the argument and the return types. |
374 | Perhaps an alternative would be to pass a zero of the required |
375 | return type as a second parameter. */ |
376 | DEF_INTERNAL_FLT_FN (ICEIL, ECF_CONST, lceil, unary_convert) |
377 | DEF_INTERNAL_FLT_FN (IFLOOR, ECF_CONST, lfloor, unary_convert) |
378 | DEF_INTERNAL_FLT_FN (IRINT, ECF_CONST, lrint, unary_convert) |
379 | DEF_INTERNAL_FLT_FN (IROUND, ECF_CONST, lround, unary_convert) |
380 | DEF_INTERNAL_FLT_FN (LCEIL, ECF_CONST, lceil, unary_convert) |
381 | DEF_INTERNAL_FLT_FN (LFLOOR, ECF_CONST, lfloor, unary_convert) |
382 | DEF_INTERNAL_FLT_FLOATN_FN (LRINT, ECF_CONST, lrint, unary_convert) |
383 | DEF_INTERNAL_FLT_FLOATN_FN (LROUND, ECF_CONST, lround, unary_convert) |
384 | DEF_INTERNAL_FLT_FN (LLCEIL, ECF_CONST, lceil, unary_convert) |
385 | DEF_INTERNAL_FLT_FN (LLFLOOR, ECF_CONST, lfloor, unary_convert) |
386 | DEF_INTERNAL_FLT_FLOATN_FN (LLRINT, ECF_CONST, lrint, unary_convert) |
387 | DEF_INTERNAL_FLT_FLOATN_FN (LLROUND, ECF_CONST, lround, unary_convert) |
388 | |
389 | /* FP rounding. */ |
390 | DEF_INTERNAL_FLT_FLOATN_FN (CEIL, ECF_CONST, ceil, unary) |
391 | DEF_INTERNAL_FLT_FLOATN_FN (FLOOR, ECF_CONST, floor, unary) |
392 | DEF_INTERNAL_FLT_FLOATN_FN (NEARBYINT, ECF_CONST, nearbyint, unary) |
393 | DEF_INTERNAL_FLT_FLOATN_FN (RINT, ECF_CONST, rint, unary) |
394 | DEF_INTERNAL_FLT_FLOATN_FN (ROUND, ECF_CONST, round, unary) |
395 | DEF_INTERNAL_FLT_FLOATN_FN (ROUNDEVEN, ECF_CONST, roundeven, unary) |
396 | DEF_INTERNAL_FLT_FLOATN_FN (TRUNC, ECF_CONST, btrunc, unary) |
397 | |
398 | /* Binary math functions. */ |
399 | DEF_INTERNAL_FLT_FN (ATAN2, ECF_CONST, atan2, binary) |
400 | DEF_INTERNAL_FLT_FLOATN_FN (COPYSIGN, ECF_CONST, copysign, binary) |
401 | DEF_INTERNAL_FLT_FN (FMOD, ECF_CONST, fmod, binary) |
402 | DEF_INTERNAL_FLT_FN (HYPOT, ECF_CONST, hypot, binary) |
403 | DEF_INTERNAL_FLT_FN (POW, ECF_CONST, pow, binary) |
404 | DEF_INTERNAL_FLT_FN (REMAINDER, ECF_CONST, remainder, binary) |
405 | DEF_INTERNAL_FLT_FN (SCALB, ECF_CONST, scalb, binary) |
406 | DEF_INTERNAL_FLT_FLOATN_FN (FMIN, ECF_CONST, fmin, binary) |
407 | DEF_INTERNAL_FLT_FLOATN_FN (FMAX, ECF_CONST, fmax, binary) |
408 | DEF_INTERNAL_OPTAB_FN (XORSIGN, ECF_CONST, xorsign, binary) |
409 | DEF_INTERNAL_OPTAB_FN (COMPLEX_ADD_ROT90, ECF_CONST, cadd90, binary) |
410 | DEF_INTERNAL_OPTAB_FN (COMPLEX_ADD_ROT270, ECF_CONST, cadd270, binary) |
411 | DEF_INTERNAL_OPTAB_FN (COMPLEX_MUL, ECF_CONST, cmul, binary) |
412 | DEF_INTERNAL_OPTAB_FN (COMPLEX_MUL_CONJ, ECF_CONST, cmul_conj, binary) |
413 | DEF_INTERNAL_OPTAB_FN (VEC_ADDSUB, ECF_CONST, vec_addsub, binary) |
414 | DEF_INTERNAL_WIDENING_OPTAB_FN (VEC_WIDEN_PLUS, |
415 | ECF_CONST | ECF_NOTHROW, |
416 | first, |
417 | vec_widen_sadd, vec_widen_uadd, |
418 | binary) |
419 | DEF_INTERNAL_WIDENING_OPTAB_FN (VEC_WIDEN_MINUS, |
420 | ECF_CONST | ECF_NOTHROW, |
421 | first, |
422 | vec_widen_ssub, vec_widen_usub, |
423 | binary) |
424 | DEF_INTERNAL_WIDENING_OPTAB_FN (VEC_WIDEN_ABD, |
425 | ECF_CONST | ECF_NOTHROW, |
426 | first, |
427 | vec_widen_sabd, vec_widen_uabd, |
428 | binary) |
429 | DEF_INTERNAL_OPTAB_FN (VEC_FMADDSUB, ECF_CONST, vec_fmaddsub, ternary) |
430 | DEF_INTERNAL_OPTAB_FN (VEC_FMSUBADD, ECF_CONST, vec_fmsubadd, ternary) |
431 | |
432 | /* FP scales. */ |
433 | DEF_INTERNAL_FLT_FN (LDEXP, ECF_CONST, ldexp, binary) |
434 | |
435 | /* Ternary math functions. */ |
436 | DEF_INTERNAL_FLT_FLOATN_FN (FMA, ECF_CONST, fma, ternary) |
437 | DEF_INTERNAL_OPTAB_FN (COMPLEX_FMA, ECF_CONST, cmla, ternary) |
438 | DEF_INTERNAL_OPTAB_FN (COMPLEX_FMA_CONJ, ECF_CONST, cmla_conj, ternary) |
439 | DEF_INTERNAL_OPTAB_FN (COMPLEX_FMS, ECF_CONST, cmls, ternary) |
440 | DEF_INTERNAL_OPTAB_FN (COMPLEX_FMS_CONJ, ECF_CONST, cmls_conj, ternary) |
441 | |
442 | /* Unary integer ops. */ |
443 | DEF_INTERNAL_INT_EXT_FN (CLRSB, ECF_CONST | ECF_NOTHROW, clrsb, unary) |
444 | DEF_INTERNAL_INT_EXT_FN (CLZ, ECF_CONST | ECF_NOTHROW, clz, unary) |
445 | DEF_INTERNAL_INT_EXT_FN (CTZ, ECF_CONST | ECF_NOTHROW, ctz, unary) |
446 | DEF_INTERNAL_INT_EXT_FN (FFS, ECF_CONST | ECF_NOTHROW, ffs, unary) |
447 | DEF_INTERNAL_INT_EXT_FN (PARITY, ECF_CONST | ECF_NOTHROW, parity, unary) |
448 | DEF_INTERNAL_INT_EXT_FN (POPCOUNT, ECF_CONST | ECF_NOTHROW, popcount, unary) |
449 | |
450 | DEF_INTERNAL_FN (GOMP_TARGET_REV, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
451 | DEF_INTERNAL_FN (GOMP_USE_SIMT, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
452 | DEF_INTERNAL_FN (GOMP_SIMT_ENTER, ECF_LEAF | ECF_NOTHROW, NULL) |
453 | DEF_INTERNAL_FN (GOMP_SIMT_ENTER_ALLOC, ECF_LEAF | ECF_NOTHROW, NULL) |
454 | DEF_INTERNAL_FN (GOMP_SIMT_EXIT, ECF_LEAF | ECF_NOTHROW, NULL) |
455 | DEF_INTERNAL_FN (GOMP_SIMT_LANE, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
456 | DEF_INTERNAL_FN (GOMP_SIMT_VF, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
457 | DEF_INTERNAL_FN (GOMP_SIMT_LAST_LANE, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
458 | DEF_INTERNAL_FN (GOMP_SIMT_ORDERED_PRED, ECF_LEAF | ECF_NOTHROW, NULL) |
459 | DEF_INTERNAL_FN (GOMP_SIMT_VOTE_ANY, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
460 | DEF_INTERNAL_FN (GOMP_SIMT_XCHG_BFLY, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
461 | DEF_INTERNAL_FN (GOMP_SIMT_XCHG_IDX, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
462 | DEF_INTERNAL_FN (GOMP_SIMD_LANE, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
463 | DEF_INTERNAL_FN (GOMP_SIMD_VF, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
464 | DEF_INTERNAL_FN (GOMP_SIMD_LAST_LANE, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
465 | DEF_INTERNAL_FN (GOMP_SIMD_ORDERED_START, ECF_LEAF | ECF_NOTHROW, NULL) |
466 | DEF_INTERNAL_FN (GOMP_SIMD_ORDERED_END, ECF_LEAF | ECF_NOTHROW, NULL) |
467 | DEF_INTERNAL_FN (LOOP_VECTORIZED, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
468 | DEF_INTERNAL_FN (LOOP_DIST_ALIAS, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
469 | DEF_INTERNAL_FN (ANNOTATE, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
470 | DEF_INTERNAL_FN (UBSAN_NULL, ECF_LEAF | ECF_NOTHROW, ". R . " ) |
471 | DEF_INTERNAL_FN (UBSAN_BOUNDS, ECF_LEAF | ECF_NOTHROW, NULL) |
472 | DEF_INTERNAL_FN (UBSAN_VPTR, ECF_LEAF | ECF_NOTHROW, ". R R . . " ) |
473 | DEF_INTERNAL_FN (UBSAN_CHECK_ADD, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
474 | DEF_INTERNAL_FN (UBSAN_CHECK_SUB, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
475 | DEF_INTERNAL_FN (UBSAN_CHECK_MUL, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
476 | DEF_INTERNAL_FN (UBSAN_PTR, ECF_LEAF | ECF_NOTHROW, ". R . " ) |
477 | DEF_INTERNAL_FN (UBSAN_OBJECT_SIZE, ECF_LEAF | ECF_NOTHROW, NULL) |
478 | DEF_INTERNAL_FN (ABNORMAL_DISPATCHER, ECF_NORETURN, NULL) |
479 | DEF_INTERNAL_FN (BUILTIN_EXPECT, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
480 | DEF_INTERNAL_FN (HWASAN_ALLOCA_UNPOISON, ECF_LEAF | ECF_NOTHROW, ". R " ) |
481 | DEF_INTERNAL_FN (HWASAN_CHOOSE_TAG, ECF_LEAF | ECF_NOTHROW, ". " ) |
482 | DEF_INTERNAL_FN (HWASAN_CHECK, ECF_TM_PURE | ECF_LEAF | ECF_NOTHROW, |
483 | ". . R . . " ) |
484 | DEF_INTERNAL_FN (HWASAN_MARK, ECF_LEAF | ECF_NOTHROW, NULL) |
485 | DEF_INTERNAL_FN (HWASAN_SET_TAG, |
486 | ECF_TM_PURE | ECF_PURE | ECF_LEAF | ECF_NOTHROW, ". R R " ) |
487 | DEF_INTERNAL_FN (ASAN_CHECK, ECF_TM_PURE | ECF_LEAF | ECF_NOTHROW, |
488 | ". . R . . " ) |
489 | DEF_INTERNAL_FN (ASAN_MARK, ECF_LEAF | ECF_NOTHROW, NULL) |
490 | DEF_INTERNAL_FN (ASAN_POISON, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL) |
491 | DEF_INTERNAL_FN (ASAN_POISON_USE, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL) |
492 | DEF_INTERNAL_FN (ADD_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
493 | DEF_INTERNAL_FN (SUB_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
494 | DEF_INTERNAL_FN (MUL_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
495 | DEF_INTERNAL_FN (UADDC, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
496 | DEF_INTERNAL_FN (USUBC, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
497 | DEF_INTERNAL_FN (TSAN_FUNC_EXIT, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
498 | DEF_INTERNAL_FN (VA_ARG, ECF_NOTHROW | ECF_LEAF, NULL) |
499 | DEF_INTERNAL_FN (VEC_CONVERT, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
500 | DEF_INTERNAL_FN (RAWMEMCHR, ECF_PURE | ECF_LEAF | ECF_NOTHROW, NULL) |
501 | |
502 | /* An unduplicable, uncombinable function. Generally used to preserve |
503 | a CFG property in the face of jump threading, tail merging or |
504 | other such optimizations. The first argument distinguishes |
505 | between uses. See internal-fn.h for usage. */ |
506 | DEF_INTERNAL_FN (UNIQUE, ECF_NOTHROW, NULL) |
507 | DEF_INTERNAL_FN (PHI, 0, NULL) |
508 | |
509 | /* A function to represent an artifical initialization to an uninitialized |
510 | automatic variable. */ |
511 | DEF_INTERNAL_FN (DEFERRED_INIT, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
512 | |
513 | /* DIM_SIZE and DIM_POS return the size of a particular compute |
514 | dimension and the executing thread's position within that |
515 | dimension. DIM_POS is pure (and not const) so that it isn't |
516 | thought to clobber memory and can be gcse'd within a single |
517 | parallel region, but not across FORK/JOIN boundaries. They take a |
518 | single INTEGER_CST argument. This might be overly conservative. */ |
519 | DEF_INTERNAL_FN (GOACC_DIM_SIZE, ECF_CONST | ECF_NOTHROW | ECF_LEAF, NULL) |
520 | DEF_INTERNAL_FN (GOACC_DIM_POS, ECF_PURE | ECF_NOTHROW | ECF_LEAF, NULL) |
521 | |
522 | /* OpenACC looping abstraction. See internal-fn.h for usage. */ |
523 | DEF_INTERNAL_FN (GOACC_LOOP, ECF_PURE | ECF_NOTHROW, NULL) |
524 | |
525 | /* OpenACC reduction abstraction. See internal-fn.h for usage. */ |
526 | DEF_INTERNAL_FN (GOACC_REDUCTION, ECF_NOTHROW | ECF_LEAF, NULL) |
527 | |
528 | /* Openacc tile abstraction. Describes the spans of the element loop. |
529 | GOACC_TILE (num-loops, loop-no, tile-arg, tile-mask, element-mask). */ |
530 | DEF_INTERNAL_FN (GOACC_TILE, ECF_NOTHROW | ECF_LEAF, NULL) |
531 | |
532 | /* Set errno to EDOM, if GCC knows how to do that directly for the |
533 | current target. */ |
534 | DEF_INTERNAL_FN (SET_EDOM, ECF_LEAF | ECF_NOTHROW, NULL) |
535 | |
536 | /* Atomic functions. These don't have ECF_NOTHROW because for |
537 | -fnon-call-exceptions they can throw, otherwise we set |
538 | gimple_call_nothrow_p on it. */ |
539 | DEF_INTERNAL_FN (ATOMIC_BIT_TEST_AND_SET, ECF_LEAF, NULL) |
540 | DEF_INTERNAL_FN (ATOMIC_BIT_TEST_AND_COMPLEMENT, ECF_LEAF, NULL) |
541 | DEF_INTERNAL_FN (ATOMIC_BIT_TEST_AND_RESET, ECF_LEAF, NULL) |
542 | DEF_INTERNAL_FN (ATOMIC_COMPARE_EXCHANGE, ECF_LEAF, NULL) |
543 | DEF_INTERNAL_FN (ATOMIC_ADD_FETCH_CMP_0, ECF_LEAF, NULL) |
544 | DEF_INTERNAL_FN (ATOMIC_SUB_FETCH_CMP_0, ECF_LEAF, NULL) |
545 | DEF_INTERNAL_FN (ATOMIC_AND_FETCH_CMP_0, ECF_LEAF, NULL) |
546 | DEF_INTERNAL_FN (ATOMIC_OR_FETCH_CMP_0, ECF_LEAF, NULL) |
547 | DEF_INTERNAL_FN (ATOMIC_XOR_FETCH_CMP_0, ECF_LEAF, NULL) |
548 | |
549 | /* To implement [[fallthrough]]. If the TREE_NOTHROW or GF_CALL_NOTHROW flag |
550 | is set on the call (normally redundant with ECF_NOTHROW), it marks |
551 | [[fallthrough]] at the end of C++ loop body. */ |
552 | DEF_INTERNAL_FN (FALLTHROUGH, ECF_LEAF | ECF_NOTHROW, NULL) |
553 | |
554 | /* To implement __builtin_launder. */ |
555 | DEF_INTERNAL_FN (LAUNDER, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL) |
556 | |
557 | /* Divmod function. */ |
558 | DEF_INTERNAL_FN (DIVMOD, ECF_CONST | ECF_LEAF, NULL) |
559 | |
560 | /* For coroutines. */ |
561 | DEF_INTERNAL_FN (CO_ACTOR, ECF_NOTHROW | ECF_LEAF, NULL) |
562 | DEF_INTERNAL_FN (CO_YIELD, ECF_NOTHROW, NULL) |
563 | DEF_INTERNAL_FN (CO_SUSPN, ECF_NOTHROW, NULL) |
564 | DEF_INTERNAL_FN (CO_FRAME, ECF_PURE | ECF_NOTHROW | ECF_LEAF, NULL) |
565 | |
566 | /* A NOP function with arbitrary arguments and return value. */ |
567 | DEF_INTERNAL_FN (NOP, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
568 | |
569 | /* Temporary vehicle for __builtin_shufflevector. */ |
570 | DEF_INTERNAL_FN (SHUFFLEVECTOR, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
571 | |
572 | /* <=> optimization. */ |
573 | DEF_INTERNAL_FN (SPACESHIP, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
574 | |
575 | /* [[assume (cond)]]. */ |
576 | DEF_INTERNAL_FN (ASSUME, ECF_CONST | ECF_LEAF | ECF_NOTHROW |
577 | | ECF_LOOPING_CONST_OR_PURE, NULL) |
578 | |
579 | /* For if-conversion of inbranch SIMD clones. */ |
580 | DEF_INTERNAL_FN (MASK_CALL, ECF_NOVOPS, NULL) |
581 | |
582 | /* _BitInt support. */ |
583 | DEF_INTERNAL_FN (MULBITINT, ECF_LEAF | ECF_NOTHROW, ". O . R . R . " ) |
584 | DEF_INTERNAL_FN (DIVMODBITINT, ECF_LEAF, ". O . O . R . R . " ) |
585 | DEF_INTERNAL_FN (FLOATTOBITINT, ECF_LEAF | ECF_NOTHROW, ". O . . " ) |
586 | DEF_INTERNAL_FN (BITINTTOFLOAT, ECF_PURE | ECF_LEAF, ". R . " ) |
587 | |
588 | #undef DEF_INTERNAL_WIDENING_OPTAB_FN |
589 | #undef DEF_INTERNAL_SIGNED_COND_FN |
590 | #undef DEF_INTERNAL_COND_FN |
591 | #undef DEF_INTERNAL_INT_EXT_FN |
592 | #undef DEF_INTERNAL_INT_FN |
593 | #undef DEF_INTERNAL_FLT_FN |
594 | #undef DEF_INTERNAL_FLT_FLOATN_FN |
595 | #undef DEF_INTERNAL_SIGNED_OPTAB_FN |
596 | #undef DEF_INTERNAL_OPTAB_FN |
597 | #undef DEF_INTERNAL_FN |
598 | |