1 | /* Internal functions. |
2 | Copyright (C) 2011-2017 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_INT_FN (NAME, FLAGS, OPTAB, TYPE) |
37 | |
38 | where NAME is the name of the function, FLAGS is a set of |
39 | ECF_* flags and FNSPEC is a string describing functions fnspec. |
40 | |
41 | DEF_INTERNAL_OPTAB_FN defines an internal function that maps to a |
42 | direct optab. The function should only be called with a given |
43 | set of types if the associated optab is available for the modes |
44 | of those types. OPTAB says what optab to use (without the trailing |
45 | "_optab") and TYPE categorizes the optab based on its inputs and |
46 | outputs. The possible types of optab are: |
47 | |
48 | - mask_load: currently just maskload |
49 | - load_lanes: currently just vec_load_lanes |
50 | |
51 | - mask_store: currently just maskstore |
52 | - store_lanes: currently just vec_store_lanes |
53 | |
54 | DEF_INTERNAL_SIGNED_OPTAB_FN defines an internal function that |
55 | maps to one of two optabs, depending on the signedness of an input. |
56 | SIGNED_OPTAB and UNSIGNED_OPTAB are the optabs for signed and |
57 | unsigned inputs respectively, both without the trailing "_optab". |
58 | SELECTOR says which type in the tree_pair determines the signedness. |
59 | |
60 | DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition, |
61 | the function implements the computational part of a built-in math |
62 | function BUILT_IN_<NAME>{F,,L}. Unlike some built-in functions, |
63 | these internal functions never set errno. |
64 | |
65 | DEF_INTERNAL_INT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition |
66 | says that the function extends the C-level BUILT_IN_<NAME>{,L,LL,IMAX} |
67 | group of functions to any integral mode (including vector modes). |
68 | |
69 | Each entry must have a corresponding expander of the form: |
70 | |
71 | void expand_NAME (gimple_call stmt) |
72 | |
73 | where STMT is the statement that performs the call. These are generated |
74 | automatically for optab functions and call out to a function or macro |
75 | called expand_<TYPE>_optab_fn. */ |
76 | |
77 | #ifndef DEF_INTERNAL_FN |
78 | #define DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) |
79 | #endif |
80 | |
81 | #ifndef DEF_INTERNAL_OPTAB_FN |
82 | #define DEF_INTERNAL_OPTAB_FN(NAME, FLAGS, OPTAB, TYPE) \ |
83 | DEF_INTERNAL_FN (NAME, FLAGS | ECF_LEAF, NULL) |
84 | #endif |
85 | |
86 | #ifndef DEF_INTERNAL_SIGNED_OPTAB_FN |
87 | #define DEF_INTERNAL_SIGNED_OPTAB_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, \ |
88 | UNSIGNED_OPTAB, TYPE) \ |
89 | DEF_INTERNAL_FN (NAME, FLAGS | ECF_LEAF, NULL) |
90 | #endif |
91 | |
92 | #ifndef DEF_INTERNAL_FLT_FN |
93 | #define DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) \ |
94 | DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE) |
95 | #endif |
96 | |
97 | #ifndef DEF_INTERNAL_FLT_FLOATN_FN |
98 | #define DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) \ |
99 | DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE) |
100 | #endif |
101 | |
102 | #ifndef DEF_INTERNAL_INT_FN |
103 | #define DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) \ |
104 | DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE) |
105 | #endif |
106 | |
107 | DEF_INTERNAL_OPTAB_FN (MASK_LOAD, ECF_PURE, maskload, mask_load) |
108 | DEF_INTERNAL_OPTAB_FN (LOAD_LANES, ECF_CONST, vec_load_lanes, load_lanes) |
109 | |
110 | DEF_INTERNAL_OPTAB_FN (MASK_STORE, 0, maskstore, mask_store) |
111 | DEF_INTERNAL_OPTAB_FN (STORE_LANES, ECF_CONST, vec_store_lanes, store_lanes) |
112 | |
113 | DEF_INTERNAL_OPTAB_FN (RSQRT, ECF_CONST, rsqrt, unary) |
114 | |
115 | DEF_INTERNAL_OPTAB_FN (REDUC_PLUS, ECF_CONST | ECF_NOTHROW, |
116 | reduc_plus_scal, unary) |
117 | DEF_INTERNAL_SIGNED_OPTAB_FN (REDUC_MAX, ECF_CONST | ECF_NOTHROW, first, |
118 | reduc_smax_scal, reduc_umax_scal, unary) |
119 | DEF_INTERNAL_SIGNED_OPTAB_FN (REDUC_MIN, ECF_CONST | ECF_NOTHROW, first, |
120 | reduc_smin_scal, reduc_umin_scal, unary) |
121 | |
122 | /* Unary math functions. */ |
123 | DEF_INTERNAL_FLT_FN (ACOS, ECF_CONST, acos, unary) |
124 | DEF_INTERNAL_FLT_FN (ASIN, ECF_CONST, asin, unary) |
125 | DEF_INTERNAL_FLT_FN (ATAN, ECF_CONST, atan, unary) |
126 | DEF_INTERNAL_FLT_FN (COS, ECF_CONST, cos, unary) |
127 | DEF_INTERNAL_FLT_FN (EXP, ECF_CONST, exp, unary) |
128 | DEF_INTERNAL_FLT_FN (EXP10, ECF_CONST, exp10, unary) |
129 | DEF_INTERNAL_FLT_FN (EXP2, ECF_CONST, exp2, unary) |
130 | DEF_INTERNAL_FLT_FN (EXPM1, ECF_CONST, expm1, unary) |
131 | DEF_INTERNAL_FLT_FN (LOG, ECF_CONST, log, unary) |
132 | DEF_INTERNAL_FLT_FN (LOG10, ECF_CONST, log10, unary) |
133 | DEF_INTERNAL_FLT_FN (LOG1P, ECF_CONST, log1p, unary) |
134 | DEF_INTERNAL_FLT_FN (LOG2, ECF_CONST, log2, unary) |
135 | DEF_INTERNAL_FLT_FN (LOGB, ECF_CONST, logb, unary) |
136 | DEF_INTERNAL_FLT_FN (SIGNIFICAND, ECF_CONST, significand, unary) |
137 | DEF_INTERNAL_FLT_FN (SIN, ECF_CONST, sin, unary) |
138 | DEF_INTERNAL_FLT_FLOATN_FN (SQRT, ECF_CONST, sqrt, unary) |
139 | DEF_INTERNAL_FLT_FN (TAN, ECF_CONST, tan, unary) |
140 | |
141 | /* FP rounding. */ |
142 | DEF_INTERNAL_FLT_FN (CEIL, ECF_CONST, ceil, unary) |
143 | DEF_INTERNAL_FLT_FN (FLOOR, ECF_CONST, floor, unary) |
144 | DEF_INTERNAL_FLT_FN (NEARBYINT, ECF_CONST, nearbyint, unary) |
145 | DEF_INTERNAL_FLT_FN (RINT, ECF_CONST, rint, unary) |
146 | DEF_INTERNAL_FLT_FN (ROUND, ECF_CONST, round, unary) |
147 | DEF_INTERNAL_FLT_FN (TRUNC, ECF_CONST, btrunc, unary) |
148 | |
149 | /* Binary math functions. */ |
150 | DEF_INTERNAL_FLT_FN (ATAN2, ECF_CONST, atan2, binary) |
151 | DEF_INTERNAL_FLT_FLOATN_FN (COPYSIGN, ECF_CONST, copysign, binary) |
152 | DEF_INTERNAL_FLT_FN (FMOD, ECF_CONST, fmod, binary) |
153 | DEF_INTERNAL_FLT_FN (POW, ECF_CONST, pow, binary) |
154 | DEF_INTERNAL_FLT_FN (REMAINDER, ECF_CONST, remainder, binary) |
155 | DEF_INTERNAL_FLT_FN (SCALB, ECF_CONST, scalb, binary) |
156 | DEF_INTERNAL_FLT_FLOATN_FN (FMIN, ECF_CONST, fmin, binary) |
157 | DEF_INTERNAL_FLT_FLOATN_FN (FMAX, ECF_CONST, fmax, binary) |
158 | DEF_INTERNAL_OPTAB_FN (XORSIGN, ECF_CONST, xorsign, binary) |
159 | |
160 | /* FP scales. */ |
161 | DEF_INTERNAL_FLT_FN (LDEXP, ECF_CONST, ldexp, binary) |
162 | |
163 | /* Unary integer ops. */ |
164 | DEF_INTERNAL_INT_FN (CLRSB, ECF_CONST | ECF_NOTHROW, clrsb, unary) |
165 | DEF_INTERNAL_INT_FN (CLZ, ECF_CONST | ECF_NOTHROW, clz, unary) |
166 | DEF_INTERNAL_INT_FN (CTZ, ECF_CONST | ECF_NOTHROW, ctz, unary) |
167 | DEF_INTERNAL_INT_FN (FFS, ECF_CONST | ECF_NOTHROW, ffs, unary) |
168 | DEF_INTERNAL_INT_FN (PARITY, ECF_CONST | ECF_NOTHROW, parity, unary) |
169 | DEF_INTERNAL_INT_FN (POPCOUNT, ECF_CONST | ECF_NOTHROW, popcount, unary) |
170 | |
171 | DEF_INTERNAL_FN (GOMP_USE_SIMT, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
172 | DEF_INTERNAL_FN (GOMP_SIMT_ENTER, ECF_LEAF | ECF_NOTHROW, NULL) |
173 | DEF_INTERNAL_FN (GOMP_SIMT_ENTER_ALLOC, ECF_LEAF | ECF_NOTHROW, NULL) |
174 | DEF_INTERNAL_FN (GOMP_SIMT_EXIT, ECF_LEAF | ECF_NOTHROW, NULL) |
175 | DEF_INTERNAL_FN (GOMP_SIMT_LANE, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
176 | DEF_INTERNAL_FN (GOMP_SIMT_VF, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
177 | DEF_INTERNAL_FN (GOMP_SIMT_LAST_LANE, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
178 | DEF_INTERNAL_FN (GOMP_SIMT_ORDERED_PRED, ECF_LEAF | ECF_NOTHROW, NULL) |
179 | DEF_INTERNAL_FN (GOMP_SIMT_VOTE_ANY, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
180 | DEF_INTERNAL_FN (GOMP_SIMT_XCHG_BFLY, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
181 | DEF_INTERNAL_FN (GOMP_SIMT_XCHG_IDX, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
182 | DEF_INTERNAL_FN (GOMP_SIMD_LANE, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
183 | DEF_INTERNAL_FN (GOMP_SIMD_VF, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
184 | DEF_INTERNAL_FN (GOMP_SIMD_LAST_LANE, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
185 | DEF_INTERNAL_FN (GOMP_SIMD_ORDERED_START, ECF_LEAF | ECF_NOTHROW, NULL) |
186 | DEF_INTERNAL_FN (GOMP_SIMD_ORDERED_END, ECF_LEAF | ECF_NOTHROW, NULL) |
187 | DEF_INTERNAL_FN (LOOP_VECTORIZED, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
188 | DEF_INTERNAL_FN (LOOP_DIST_ALIAS, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
189 | DEF_INTERNAL_FN (ANNOTATE, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
190 | DEF_INTERNAL_FN (UBSAN_NULL, ECF_LEAF | ECF_NOTHROW, ".R." ) |
191 | DEF_INTERNAL_FN (UBSAN_BOUNDS, ECF_LEAF | ECF_NOTHROW, NULL) |
192 | DEF_INTERNAL_FN (UBSAN_VPTR, ECF_LEAF | ECF_NOTHROW, ".RR.." ) |
193 | DEF_INTERNAL_FN (UBSAN_CHECK_ADD, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
194 | DEF_INTERNAL_FN (UBSAN_CHECK_SUB, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
195 | DEF_INTERNAL_FN (UBSAN_CHECK_MUL, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
196 | DEF_INTERNAL_FN (UBSAN_PTR, ECF_LEAF | ECF_NOTHROW, ".R." ) |
197 | DEF_INTERNAL_FN (UBSAN_OBJECT_SIZE, ECF_LEAF | ECF_NOTHROW, NULL) |
198 | DEF_INTERNAL_FN (ABNORMAL_DISPATCHER, ECF_NORETURN, NULL) |
199 | DEF_INTERNAL_FN (BUILTIN_EXPECT, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
200 | DEF_INTERNAL_FN (ASAN_CHECK, ECF_TM_PURE | ECF_LEAF | ECF_NOTHROW, ".R..." ) |
201 | DEF_INTERNAL_FN (ASAN_MARK, ECF_LEAF | ECF_NOTHROW, ".R.." ) |
202 | DEF_INTERNAL_FN (ASAN_POISON, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL) |
203 | DEF_INTERNAL_FN (ASAN_POISON_USE, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL) |
204 | DEF_INTERNAL_FN (ADD_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
205 | DEF_INTERNAL_FN (SUB_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
206 | DEF_INTERNAL_FN (MUL_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) |
207 | DEF_INTERNAL_FN (TSAN_FUNC_EXIT, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) |
208 | DEF_INTERNAL_FN (VA_ARG, ECF_NOTHROW | ECF_LEAF, NULL) |
209 | |
210 | /* An unduplicable, uncombinable function. Generally used to preserve |
211 | a CFG property in the face of jump threading, tail merging or |
212 | other such optimizations. The first argument distinguishes |
213 | between uses. See internal-fn.h for usage. */ |
214 | DEF_INTERNAL_FN (UNIQUE, ECF_NOTHROW, NULL) |
215 | DEF_INTERNAL_FN (PHI, 0, NULL) |
216 | |
217 | /* DIM_SIZE and DIM_POS return the size of a particular compute |
218 | dimension and the executing thread's position within that |
219 | dimension. DIM_POS is pure (and not const) so that it isn't |
220 | thought to clobber memory and can be gcse'd within a single |
221 | parallel region, but not across FORK/JOIN boundaries. They take a |
222 | single INTEGER_CST argument. This might be overly conservative. */ |
223 | DEF_INTERNAL_FN (GOACC_DIM_SIZE, ECF_CONST | ECF_NOTHROW | ECF_LEAF, "." ) |
224 | DEF_INTERNAL_FN (GOACC_DIM_POS, ECF_PURE | ECF_NOTHROW | ECF_LEAF, "." ) |
225 | |
226 | /* OpenACC looping abstraction. See internal-fn.h for usage. */ |
227 | DEF_INTERNAL_FN (GOACC_LOOP, ECF_PURE | ECF_NOTHROW, NULL) |
228 | |
229 | /* OpenACC reduction abstraction. See internal-fn.h for usage. */ |
230 | DEF_INTERNAL_FN (GOACC_REDUCTION, ECF_NOTHROW | ECF_LEAF, NULL) |
231 | |
232 | /* Openacc tile abstraction. Describes the spans of the element loop. |
233 | GOACC_TILE (num-loops, loop-no, tile-arg, tile-mask, element-mask). */ |
234 | DEF_INTERNAL_FN (GOACC_TILE, ECF_NOTHROW | ECF_LEAF, NULL) |
235 | |
236 | /* Set errno to EDOM, if GCC knows how to do that directly for the |
237 | current target. */ |
238 | DEF_INTERNAL_FN (SET_EDOM, ECF_LEAF | ECF_NOTHROW, NULL) |
239 | |
240 | /* Atomic functions. These don't have ECF_NOTHROW because for |
241 | -fnon-call-exceptions they can throw, otherwise we set |
242 | gimple_call_nothrow_p on it. */ |
243 | DEF_INTERNAL_FN (ATOMIC_BIT_TEST_AND_SET, ECF_LEAF, NULL) |
244 | DEF_INTERNAL_FN (ATOMIC_BIT_TEST_AND_COMPLEMENT, ECF_LEAF, NULL) |
245 | DEF_INTERNAL_FN (ATOMIC_BIT_TEST_AND_RESET, ECF_LEAF, NULL) |
246 | DEF_INTERNAL_FN (ATOMIC_COMPARE_EXCHANGE, ECF_LEAF, NULL) |
247 | |
248 | /* To implement [[fallthrough]]. */ |
249 | DEF_INTERNAL_FN (FALLTHROUGH, ECF_LEAF | ECF_NOTHROW, NULL) |
250 | |
251 | /* To implement __builtin_launder. */ |
252 | DEF_INTERNAL_FN (LAUNDER, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL) |
253 | |
254 | /* Divmod function. */ |
255 | DEF_INTERNAL_FN (DIVMOD, ECF_CONST | ECF_LEAF, NULL) |
256 | |
257 | #undef DEF_INTERNAL_INT_FN |
258 | #undef DEF_INTERNAL_FLT_FN |
259 | #undef DEF_INTERNAL_FLT_FLOATN_FN |
260 | #undef DEF_INTERNAL_SIGNED_OPTAB_FN |
261 | #undef DEF_INTERNAL_OPTAB_FN |
262 | #undef DEF_INTERNAL_FN |
263 | |