internal-fn.def revision 1.4 1 1.1 mrg /* Internal functions.
2 1.4 mrg Copyright (C) 2011-2016 Free Software Foundation, Inc.
3 1.1 mrg
4 1.1 mrg This file is part of GCC.
5 1.1 mrg
6 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
7 1.1 mrg the terms of the GNU General Public License as published by the Free
8 1.1 mrg Software Foundation; either version 3, or (at your option) any later
9 1.1 mrg version.
10 1.1 mrg
11 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 1.1 mrg for more details.
15 1.1 mrg
16 1.1 mrg You should have received a copy of the GNU General Public License
17 1.1 mrg along with GCC; see the file COPYING3. If not see
18 1.1 mrg <http://www.gnu.org/licenses/>. */
19 1.1 mrg
20 1.1 mrg /* This file specifies a list of internal "functions". These functions
21 1.1 mrg differ from built-in functions in that they have no linkage and cannot
22 1.1 mrg be called directly by the user. They represent operations that are only
23 1.1 mrg synthesised by GCC itself.
24 1.1 mrg
25 1.1 mrg Internal functions are used instead of tree codes if the operation
26 1.1 mrg and its operands are more naturally represented as a GIMPLE_CALL
27 1.1 mrg than a GIMPLE_ASSIGN.
28 1.1 mrg
29 1.4 mrg Each entry in this file has one of the forms:
30 1.1 mrg
31 1.3 mrg DEF_INTERNAL_FN (NAME, FLAGS, FNSPEC)
32 1.4 mrg DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE)
33 1.4 mrg DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE)
34 1.4 mrg DEF_INTERNAL_INT_FN (NAME, FLAGS, OPTAB, TYPE)
35 1.1 mrg
36 1.3 mrg where NAME is the name of the function, FLAGS is a set of
37 1.3 mrg ECF_* flags and FNSPEC is a string describing functions fnspec.
38 1.3 mrg
39 1.4 mrg DEF_INTERNAL_OPTAB_FN defines an internal function that maps to a
40 1.4 mrg direct optab. The function should only be called with a given
41 1.4 mrg set of types if the associated optab is available for the modes
42 1.4 mrg of those types. OPTAB says what optab to use (without the trailing
43 1.4 mrg "_optab") and TYPE categorizes the optab based on its inputs and
44 1.4 mrg outputs. The possible types of optab are:
45 1.4 mrg
46 1.4 mrg - mask_load: currently just maskload
47 1.4 mrg - load_lanes: currently just vec_load_lanes
48 1.4 mrg
49 1.4 mrg - mask_store: currently just maskstore
50 1.4 mrg - store_lanes: currently just vec_store_lanes
51 1.4 mrg
52 1.4 mrg DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition,
53 1.4 mrg the function implements the computational part of a built-in math
54 1.4 mrg function BUILT_IN_<NAME>{F,,L}. Unlike some built-in functions,
55 1.4 mrg these internal functions never set errno.
56 1.4 mrg
57 1.4 mrg DEF_INTERNAL_INT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition
58 1.4 mrg says that the function extends the C-level BUILT_IN_<NAME>{,L,LL,IMAX}
59 1.4 mrg group of functions to any integral mode (including vector modes).
60 1.4 mrg
61 1.3 mrg Each entry must have a corresponding expander of the form:
62 1.1 mrg
63 1.3 mrg void expand_NAME (gimple_call stmt)
64 1.1 mrg
65 1.4 mrg where STMT is the statement that performs the call. These are generated
66 1.4 mrg automatically for optab functions and call out to a function or macro
67 1.4 mrg called expand_<TYPE>_optab_fn. */
68 1.4 mrg
69 1.4 mrg #ifndef DEF_INTERNAL_FN
70 1.4 mrg #define DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC)
71 1.4 mrg #endif
72 1.4 mrg
73 1.4 mrg #ifndef DEF_INTERNAL_OPTAB_FN
74 1.4 mrg #define DEF_INTERNAL_OPTAB_FN(NAME, FLAGS, OPTAB, TYPE) \
75 1.4 mrg DEF_INTERNAL_FN (NAME, FLAGS | ECF_LEAF, NULL)
76 1.4 mrg #endif
77 1.4 mrg
78 1.4 mrg #ifndef DEF_INTERNAL_FLT_FN
79 1.4 mrg #define DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) \
80 1.4 mrg DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE)
81 1.4 mrg #endif
82 1.4 mrg
83 1.4 mrg #ifndef DEF_INTERNAL_INT_FN
84 1.4 mrg #define DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) \
85 1.4 mrg DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE)
86 1.4 mrg #endif
87 1.4 mrg
88 1.4 mrg DEF_INTERNAL_OPTAB_FN (MASK_LOAD, ECF_PURE, maskload, mask_load)
89 1.4 mrg DEF_INTERNAL_OPTAB_FN (LOAD_LANES, ECF_CONST, vec_load_lanes, load_lanes)
90 1.4 mrg
91 1.4 mrg DEF_INTERNAL_OPTAB_FN (MASK_STORE, 0, maskstore, mask_store)
92 1.4 mrg DEF_INTERNAL_OPTAB_FN (STORE_LANES, ECF_CONST, vec_store_lanes, store_lanes)
93 1.4 mrg
94 1.4 mrg DEF_INTERNAL_OPTAB_FN (RSQRT, ECF_CONST, rsqrt, unary)
95 1.4 mrg
96 1.4 mrg /* Unary math functions. */
97 1.4 mrg DEF_INTERNAL_FLT_FN (ACOS, ECF_CONST, acos, unary)
98 1.4 mrg DEF_INTERNAL_FLT_FN (ASIN, ECF_CONST, asin, unary)
99 1.4 mrg DEF_INTERNAL_FLT_FN (ATAN, ECF_CONST, atan, unary)
100 1.4 mrg DEF_INTERNAL_FLT_FN (COS, ECF_CONST, cos, unary)
101 1.4 mrg DEF_INTERNAL_FLT_FN (EXP, ECF_CONST, exp, unary)
102 1.4 mrg DEF_INTERNAL_FLT_FN (EXP10, ECF_CONST, exp10, unary)
103 1.4 mrg DEF_INTERNAL_FLT_FN (EXP2, ECF_CONST, exp2, unary)
104 1.4 mrg DEF_INTERNAL_FLT_FN (EXPM1, ECF_CONST, expm1, unary)
105 1.4 mrg DEF_INTERNAL_FLT_FN (LOG, ECF_CONST, log, unary)
106 1.4 mrg DEF_INTERNAL_FLT_FN (LOG10, ECF_CONST, log10, unary)
107 1.4 mrg DEF_INTERNAL_FLT_FN (LOG1P, ECF_CONST, log1p, unary)
108 1.4 mrg DEF_INTERNAL_FLT_FN (LOG2, ECF_CONST, log2, unary)
109 1.4 mrg DEF_INTERNAL_FLT_FN (LOGB, ECF_CONST, logb, unary)
110 1.4 mrg DEF_INTERNAL_FLT_FN (SIGNIFICAND, ECF_CONST, significand, unary)
111 1.4 mrg DEF_INTERNAL_FLT_FN (SIN, ECF_CONST, sin, unary)
112 1.4 mrg DEF_INTERNAL_FLT_FN (SQRT, ECF_CONST, sqrt, unary)
113 1.4 mrg DEF_INTERNAL_FLT_FN (TAN, ECF_CONST, tan, unary)
114 1.4 mrg
115 1.4 mrg /* FP rounding. */
116 1.4 mrg DEF_INTERNAL_FLT_FN (CEIL, ECF_CONST, ceil, unary)
117 1.4 mrg DEF_INTERNAL_FLT_FN (FLOOR, ECF_CONST, floor, unary)
118 1.4 mrg DEF_INTERNAL_FLT_FN (NEARBYINT, ECF_CONST, nearbyint, unary)
119 1.4 mrg DEF_INTERNAL_FLT_FN (RINT, ECF_CONST, rint, unary)
120 1.4 mrg DEF_INTERNAL_FLT_FN (ROUND, ECF_CONST, round, unary)
121 1.4 mrg DEF_INTERNAL_FLT_FN (TRUNC, ECF_CONST, btrunc, unary)
122 1.4 mrg
123 1.4 mrg /* Binary math functions. */
124 1.4 mrg DEF_INTERNAL_FLT_FN (ATAN2, ECF_CONST, atan2, binary)
125 1.4 mrg DEF_INTERNAL_FLT_FN (COPYSIGN, ECF_CONST, copysign, binary)
126 1.4 mrg DEF_INTERNAL_FLT_FN (FMOD, ECF_CONST, fmod, binary)
127 1.4 mrg DEF_INTERNAL_FLT_FN (POW, ECF_CONST, pow, binary)
128 1.4 mrg DEF_INTERNAL_FLT_FN (REMAINDER, ECF_CONST, remainder, binary)
129 1.4 mrg DEF_INTERNAL_FLT_FN (SCALB, ECF_CONST, scalb, binary)
130 1.4 mrg DEF_INTERNAL_FLT_FN (FMIN, ECF_CONST, fmin, binary)
131 1.4 mrg DEF_INTERNAL_FLT_FN (FMAX, ECF_CONST, fmax, binary)
132 1.4 mrg
133 1.4 mrg /* FP scales. */
134 1.4 mrg DEF_INTERNAL_FLT_FN (LDEXP, ECF_CONST, ldexp, binary)
135 1.4 mrg
136 1.4 mrg /* Unary integer ops. */
137 1.4 mrg DEF_INTERNAL_INT_FN (CLRSB, ECF_CONST, clrsb, unary)
138 1.4 mrg DEF_INTERNAL_INT_FN (CLZ, ECF_CONST, clz, unary)
139 1.4 mrg DEF_INTERNAL_INT_FN (CTZ, ECF_CONST, ctz, unary)
140 1.4 mrg DEF_INTERNAL_INT_FN (FFS, ECF_CONST, ffs, unary)
141 1.4 mrg DEF_INTERNAL_INT_FN (PARITY, ECF_CONST, parity, unary)
142 1.4 mrg DEF_INTERNAL_INT_FN (POPCOUNT, ECF_CONST, popcount, unary)
143 1.1 mrg
144 1.3 mrg DEF_INTERNAL_FN (GOMP_SIMD_LANE, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL)
145 1.3 mrg DEF_INTERNAL_FN (GOMP_SIMD_VF, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
146 1.3 mrg DEF_INTERNAL_FN (GOMP_SIMD_LAST_LANE, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
147 1.4 mrg DEF_INTERNAL_FN (GOMP_SIMD_ORDERED_START, ECF_LEAF | ECF_NOTHROW, NULL)
148 1.4 mrg DEF_INTERNAL_FN (GOMP_SIMD_ORDERED_END, ECF_LEAF | ECF_NOTHROW, NULL)
149 1.3 mrg DEF_INTERNAL_FN (LOOP_VECTORIZED, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL)
150 1.3 mrg DEF_INTERNAL_FN (ANNOTATE, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
151 1.3 mrg DEF_INTERNAL_FN (UBSAN_NULL, ECF_LEAF | ECF_NOTHROW, ".R.")
152 1.3 mrg DEF_INTERNAL_FN (UBSAN_BOUNDS, ECF_LEAF | ECF_NOTHROW, NULL)
153 1.3 mrg DEF_INTERNAL_FN (UBSAN_VPTR, ECF_LEAF | ECF_NOTHROW, ".RR..")
154 1.3 mrg DEF_INTERNAL_FN (UBSAN_CHECK_ADD, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
155 1.3 mrg DEF_INTERNAL_FN (UBSAN_CHECK_SUB, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
156 1.3 mrg DEF_INTERNAL_FN (UBSAN_CHECK_MUL, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
157 1.3 mrg DEF_INTERNAL_FN (UBSAN_OBJECT_SIZE, ECF_LEAF | ECF_NOTHROW, NULL)
158 1.3 mrg DEF_INTERNAL_FN (ABNORMAL_DISPATCHER, ECF_NORETURN, NULL)
159 1.3 mrg DEF_INTERNAL_FN (BUILTIN_EXPECT, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
160 1.3 mrg DEF_INTERNAL_FN (ASAN_CHECK, ECF_TM_PURE | ECF_LEAF | ECF_NOTHROW, ".R...")
161 1.3 mrg DEF_INTERNAL_FN (ADD_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
162 1.3 mrg DEF_INTERNAL_FN (SUB_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
163 1.3 mrg DEF_INTERNAL_FN (MUL_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
164 1.3 mrg DEF_INTERNAL_FN (TSAN_FUNC_EXIT, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL)
165 1.4 mrg DEF_INTERNAL_FN (VA_ARG, ECF_NOTHROW | ECF_LEAF, NULL)
166 1.4 mrg
167 1.4 mrg /* An unduplicable, uncombinable function. Generally used to preserve
168 1.4 mrg a CFG property in the face of jump threading, tail merging or
169 1.4 mrg other such optimizations. The first argument distinguishes
170 1.4 mrg between uses. See internal-fn.h for usage. */
171 1.4 mrg DEF_INTERNAL_FN (UNIQUE, ECF_NOTHROW, NULL)
172 1.4 mrg
173 1.4 mrg /* DIM_SIZE and DIM_POS return the size of a particular compute
174 1.4 mrg dimension and the executing thread's position within that
175 1.4 mrg dimension. DIM_POS is pure (and not const) so that it isn't
176 1.4 mrg thought to clobber memory and can be gcse'd within a single
177 1.4 mrg parallel region, but not across FORK/JOIN boundaries. They take a
178 1.4 mrg single INTEGER_CST argument. */
179 1.4 mrg DEF_INTERNAL_FN (GOACC_DIM_SIZE, ECF_CONST | ECF_NOTHROW | ECF_LEAF, ".")
180 1.4 mrg DEF_INTERNAL_FN (GOACC_DIM_POS, ECF_PURE | ECF_NOTHROW | ECF_LEAF, ".")
181 1.4 mrg
182 1.4 mrg /* OpenACC looping abstraction. See internal-fn.h for usage. */
183 1.4 mrg DEF_INTERNAL_FN (GOACC_LOOP, ECF_PURE | ECF_NOTHROW, NULL)
184 1.4 mrg
185 1.4 mrg /* OpenACC reduction abstraction. See internal-fn.h for usage. */
186 1.4 mrg DEF_INTERNAL_FN (GOACC_REDUCTION, ECF_NOTHROW | ECF_LEAF, NULL)
187 1.4 mrg
188 1.4 mrg /* Set errno to EDOM, if GCC knows how to do that directly for the
189 1.4 mrg current target. */
190 1.4 mrg DEF_INTERNAL_FN (SET_EDOM, ECF_LEAF | ECF_NOTHROW, NULL)
191 1.4 mrg
192 1.4 mrg #undef DEF_INTERNAL_INT_FN
193 1.4 mrg #undef DEF_INTERNAL_FLT_FN
194 1.4 mrg #undef DEF_INTERNAL_OPTAB_FN
195 1.4 mrg #undef DEF_INTERNAL_FN
196