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