1/* Internal functions. 2 Copyright (C) 2011-2018 Free Software Foundation, Inc. 3 4This file is part of GCC. 5 6GCC is free software; you can redistribute it and/or modify it under 7the terms of the GNU General Public License as published by the Free 8Software Foundation; either version 3, or (at your option) any later 9version. 10 11GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12WARRANTY; without even the implied warranty of MERCHANTABILITY or 13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14for more details. 15 16You should have received a copy of the GNU General Public License 17along 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 - mask_load_lanes: currently just vec_mask_load_lanes 51 - gather_load: used for {mask_,}gather_load 52 53 - mask_store: currently just maskstore 54 - store_lanes: currently just vec_store_lanes 55 - mask_store_lanes: currently just vec_mask_store_lanes 56 - scatter_store: used for {mask_,}scatter_store 57 58 - unary: a normal unary optab, such as vec_reverse_<mode> 59 - binary: a normal binary optab, such as vec_interleave_lo_<mode> 60 61 - cond_binary: a conditional binary optab, such as add<mode>cc 62 63 - fold_left: for scalar = FN (scalar, vector), keyed off the vector mode 64 65 DEF_INTERNAL_SIGNED_OPTAB_FN defines an internal function that 66 maps to one of two optabs, depending on the signedness of an input. 67 SIGNED_OPTAB and UNSIGNED_OPTAB are the optabs for signed and 68 unsigned inputs respectively, both without the trailing "_optab". 69 SELECTOR says which type in the tree_pair determines the signedness. 70 71 DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition, 72 the function implements the computational part of a built-in math 73 function BUILT_IN_<NAME>{F,,L}. Unlike some built-in functions, 74 these internal functions never set errno. 75 76 DEF_INTERNAL_INT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition 77 says that the function extends the C-level BUILT_IN_<NAME>{,L,LL,IMAX} 78 group of functions to any integral mode (including vector modes). 79 80 Each entry must have a corresponding expander of the form: 81 82 void expand_NAME (gimple_call stmt) 83 84 where STMT is the statement that performs the call. These are generated 85 automatically for optab functions and call out to a function or macro 86 called expand_<TYPE>_optab_fn. */ 87 88#ifndef DEF_INTERNAL_FN 89#define DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) 90#endif 91 92#ifndef DEF_INTERNAL_OPTAB_FN 93#define DEF_INTERNAL_OPTAB_FN(NAME, FLAGS, OPTAB, TYPE) \ 94 DEF_INTERNAL_FN (NAME, FLAGS | ECF_LEAF, NULL) 95#endif 96 97#ifndef DEF_INTERNAL_SIGNED_OPTAB_FN 98#define DEF_INTERNAL_SIGNED_OPTAB_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, \ 99 UNSIGNED_OPTAB, TYPE) \ 100 DEF_INTERNAL_FN (NAME, FLAGS | ECF_LEAF, NULL) 101#endif 102 103#ifndef DEF_INTERNAL_FLT_FN 104#define DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) \ 105 DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE) 106#endif 107 108#ifndef DEF_INTERNAL_FLT_FLOATN_FN 109#define DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) \ 110 DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE) 111#endif 112 113#ifndef DEF_INTERNAL_INT_FN 114#define DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) \ 115 DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE) 116#endif 117 118DEF_INTERNAL_OPTAB_FN (MASK_LOAD, ECF_PURE, maskload, mask_load) 119DEF_INTERNAL_OPTAB_FN (LOAD_LANES, ECF_CONST, vec_load_lanes, load_lanes) 120DEF_INTERNAL_OPTAB_FN (MASK_LOAD_LANES, ECF_PURE, 121 vec_mask_load_lanes, mask_load_lanes) 122 123DEF_INTERNAL_OPTAB_FN (GATHER_LOAD, ECF_PURE, gather_load, gather_load) 124DEF_INTERNAL_OPTAB_FN (MASK_GATHER_LOAD, ECF_PURE, 125 mask_gather_load, gather_load) 126 127DEF_INTERNAL_OPTAB_FN (SCATTER_STORE, 0, scatter_store, scatter_store) 128DEF_INTERNAL_OPTAB_FN (MASK_SCATTER_STORE, 0, 129 mask_scatter_store, scatter_store) 130 131DEF_INTERNAL_OPTAB_FN (MASK_STORE, 0, maskstore, mask_store) 132DEF_INTERNAL_OPTAB_FN (STORE_LANES, ECF_CONST, vec_store_lanes, store_lanes) 133DEF_INTERNAL_OPTAB_FN (MASK_STORE_LANES, 0, 134 vec_mask_store_lanes, mask_store_lanes) 135 136DEF_INTERNAL_OPTAB_FN (WHILE_ULT, ECF_CONST | ECF_NOTHROW, while_ult, while) 137 138DEF_INTERNAL_OPTAB_FN (VEC_SHL_INSERT, ECF_CONST | ECF_NOTHROW, 139 vec_shl_insert, binary) 140 141DEF_INTERNAL_OPTAB_FN (COND_ADD, ECF_CONST, cond_add, cond_binary) 142DEF_INTERNAL_OPTAB_FN (COND_SUB, ECF_CONST, cond_sub, cond_binary) 143DEF_INTERNAL_SIGNED_OPTAB_FN (COND_MIN, ECF_CONST, first, 144 cond_smin, cond_umin, cond_binary) 145DEF_INTERNAL_SIGNED_OPTAB_FN (COND_MAX, ECF_CONST, first, 146 cond_smax, cond_umax, cond_binary) 147DEF_INTERNAL_OPTAB_FN (COND_AND, ECF_CONST | ECF_NOTHROW, 148 cond_and, cond_binary) 149DEF_INTERNAL_OPTAB_FN (COND_IOR, ECF_CONST | ECF_NOTHROW, 150 cond_ior, cond_binary) 151DEF_INTERNAL_OPTAB_FN (COND_XOR, ECF_CONST | ECF_NOTHROW, 152 cond_xor, cond_binary) 153 154DEF_INTERNAL_OPTAB_FN (RSQRT, ECF_CONST, rsqrt, unary) 155 156DEF_INTERNAL_OPTAB_FN (REDUC_PLUS, ECF_CONST | ECF_NOTHROW, 157 reduc_plus_scal, unary) 158DEF_INTERNAL_SIGNED_OPTAB_FN (REDUC_MAX, ECF_CONST | ECF_NOTHROW, first, 159 reduc_smax_scal, reduc_umax_scal, unary) 160DEF_INTERNAL_SIGNED_OPTAB_FN (REDUC_MIN, ECF_CONST | ECF_NOTHROW, first, 161 reduc_smin_scal, reduc_umin_scal, unary) 162DEF_INTERNAL_OPTAB_FN (REDUC_AND, ECF_CONST | ECF_NOTHROW, 163 reduc_and_scal, unary) 164DEF_INTERNAL_OPTAB_FN (REDUC_IOR, ECF_CONST | ECF_NOTHROW, 165 reduc_ior_scal, unary) 166DEF_INTERNAL_OPTAB_FN (REDUC_XOR, ECF_CONST | ECF_NOTHROW, 167 reduc_xor_scal, unary) 168 169/* Extract the last active element from a vector. */ 170DEF_INTERNAL_OPTAB_FN (EXTRACT_LAST, ECF_CONST | ECF_NOTHROW, 171 extract_last, cond_unary) 172 173/* Same, but return the first argument if no elements are active. */ 174DEF_INTERNAL_OPTAB_FN (FOLD_EXTRACT_LAST, ECF_CONST | ECF_NOTHROW, 175 fold_extract_last, fold_extract) 176 177DEF_INTERNAL_OPTAB_FN (FOLD_LEFT_PLUS, ECF_CONST | ECF_NOTHROW, 178 fold_left_plus, fold_left) 179 180/* Unary math functions. */ 181DEF_INTERNAL_FLT_FN (ACOS, ECF_CONST, acos, unary) 182DEF_INTERNAL_FLT_FN (ASIN, ECF_CONST, asin, unary) 183DEF_INTERNAL_FLT_FN (ATAN, ECF_CONST, atan, unary) 184DEF_INTERNAL_FLT_FN (COS, ECF_CONST, cos, unary) 185DEF_INTERNAL_FLT_FN (EXP, ECF_CONST, exp, unary) 186DEF_INTERNAL_FLT_FN (EXP10, ECF_CONST, exp10, unary) 187DEF_INTERNAL_FLT_FN (EXP2, ECF_CONST, exp2, unary) 188DEF_INTERNAL_FLT_FN (EXPM1, ECF_CONST, expm1, unary) 189DEF_INTERNAL_FLT_FN (LOG, ECF_CONST, log, unary) 190DEF_INTERNAL_FLT_FN (LOG10, ECF_CONST, log10, unary) 191DEF_INTERNAL_FLT_FN (LOG1P, ECF_CONST, log1p, unary) 192DEF_INTERNAL_FLT_FN (LOG2, ECF_CONST, log2, unary) 193DEF_INTERNAL_FLT_FN (LOGB, ECF_CONST, logb, unary) 194DEF_INTERNAL_FLT_FN (SIGNIFICAND, ECF_CONST, significand, unary) 195DEF_INTERNAL_FLT_FN (SIN, ECF_CONST, sin, unary) 196DEF_INTERNAL_FLT_FLOATN_FN (SQRT, ECF_CONST, sqrt, unary) 197DEF_INTERNAL_FLT_FN (TAN, ECF_CONST, tan, unary) 198 199/* FP rounding. */ 200DEF_INTERNAL_FLT_FLOATN_FN (CEIL, ECF_CONST, ceil, unary) 201DEF_INTERNAL_FLT_FLOATN_FN (FLOOR, ECF_CONST, floor, unary) 202DEF_INTERNAL_FLT_FLOATN_FN (NEARBYINT, ECF_CONST, nearbyint, unary) 203DEF_INTERNAL_FLT_FLOATN_FN (RINT, ECF_CONST, rint, unary) 204DEF_INTERNAL_FLT_FLOATN_FN (ROUND, ECF_CONST, round, unary) 205DEF_INTERNAL_FLT_FLOATN_FN (TRUNC, ECF_CONST, btrunc, unary) 206 207/* Binary math functions. */ 208DEF_INTERNAL_FLT_FN (ATAN2, ECF_CONST, atan2, binary) 209DEF_INTERNAL_FLT_FLOATN_FN (COPYSIGN, ECF_CONST, copysign, binary) 210DEF_INTERNAL_FLT_FN (FMOD, ECF_CONST, fmod, binary) 211DEF_INTERNAL_FLT_FN (POW, ECF_CONST, pow, binary) 212DEF_INTERNAL_FLT_FN (REMAINDER, ECF_CONST, remainder, binary) 213DEF_INTERNAL_FLT_FN (SCALB, ECF_CONST, scalb, binary) 214DEF_INTERNAL_FLT_FLOATN_FN (FMIN, ECF_CONST, fmin, binary) 215DEF_INTERNAL_FLT_FLOATN_FN (FMAX, ECF_CONST, fmax, binary) 216DEF_INTERNAL_OPTAB_FN (XORSIGN, ECF_CONST, xorsign, binary) 217 218/* FP scales. */ 219DEF_INTERNAL_FLT_FN (LDEXP, ECF_CONST, ldexp, binary) 220 221/* Unary integer ops. */ 222DEF_INTERNAL_INT_FN (CLRSB, ECF_CONST | ECF_NOTHROW, clrsb, unary) 223DEF_INTERNAL_INT_FN (CLZ, ECF_CONST | ECF_NOTHROW, clz, unary) 224DEF_INTERNAL_INT_FN (CTZ, ECF_CONST | ECF_NOTHROW, ctz, unary) 225DEF_INTERNAL_INT_FN (FFS, ECF_CONST | ECF_NOTHROW, ffs, unary) 226DEF_INTERNAL_INT_FN (PARITY, ECF_CONST | ECF_NOTHROW, parity, unary) 227DEF_INTERNAL_INT_FN (POPCOUNT, ECF_CONST | ECF_NOTHROW, popcount, unary) 228 229DEF_INTERNAL_FN (GOMP_USE_SIMT, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) 230DEF_INTERNAL_FN (GOMP_SIMT_ENTER, ECF_LEAF | ECF_NOTHROW, NULL) 231DEF_INTERNAL_FN (GOMP_SIMT_ENTER_ALLOC, ECF_LEAF | ECF_NOTHROW, NULL) 232DEF_INTERNAL_FN (GOMP_SIMT_EXIT, ECF_LEAF | ECF_NOTHROW, NULL) 233DEF_INTERNAL_FN (GOMP_SIMT_LANE, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) 234DEF_INTERNAL_FN (GOMP_SIMT_VF, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) 235DEF_INTERNAL_FN (GOMP_SIMT_LAST_LANE, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) 236DEF_INTERNAL_FN (GOMP_SIMT_ORDERED_PRED, ECF_LEAF | ECF_NOTHROW, NULL) 237DEF_INTERNAL_FN (GOMP_SIMT_VOTE_ANY, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) 238DEF_INTERNAL_FN (GOMP_SIMT_XCHG_BFLY, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) 239DEF_INTERNAL_FN (GOMP_SIMT_XCHG_IDX, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) 240DEF_INTERNAL_FN (GOMP_SIMD_LANE, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) 241DEF_INTERNAL_FN (GOMP_SIMD_VF, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) 242DEF_INTERNAL_FN (GOMP_SIMD_LAST_LANE, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) 243DEF_INTERNAL_FN (GOMP_SIMD_ORDERED_START, ECF_LEAF | ECF_NOTHROW, NULL) 244DEF_INTERNAL_FN (GOMP_SIMD_ORDERED_END, ECF_LEAF | ECF_NOTHROW, NULL) 245DEF_INTERNAL_FN (LOOP_VECTORIZED, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) 246DEF_INTERNAL_FN (LOOP_DIST_ALIAS, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) 247DEF_INTERNAL_FN (ANNOTATE, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) 248DEF_INTERNAL_FN (UBSAN_NULL, ECF_LEAF | ECF_NOTHROW, ".R.") 249DEF_INTERNAL_FN (UBSAN_BOUNDS, ECF_LEAF | ECF_NOTHROW, NULL) 250DEF_INTERNAL_FN (UBSAN_VPTR, ECF_LEAF | ECF_NOTHROW, ".RR..") 251DEF_INTERNAL_FN (UBSAN_CHECK_ADD, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) 252DEF_INTERNAL_FN (UBSAN_CHECK_SUB, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) 253DEF_INTERNAL_FN (UBSAN_CHECK_MUL, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) 254DEF_INTERNAL_FN (UBSAN_PTR, ECF_LEAF | ECF_NOTHROW, ".R.") 255DEF_INTERNAL_FN (UBSAN_OBJECT_SIZE, ECF_LEAF | ECF_NOTHROW, NULL) 256DEF_INTERNAL_FN (ABNORMAL_DISPATCHER, ECF_NORETURN, NULL) 257DEF_INTERNAL_FN (BUILTIN_EXPECT, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) 258DEF_INTERNAL_FN (ASAN_CHECK, ECF_TM_PURE | ECF_LEAF | ECF_NOTHROW, "..R..") 259DEF_INTERNAL_FN (ASAN_MARK, ECF_LEAF | ECF_NOTHROW, NULL) 260DEF_INTERNAL_FN (ASAN_POISON, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL) 261DEF_INTERNAL_FN (ASAN_POISON_USE, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL) 262DEF_INTERNAL_FN (ADD_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) 263DEF_INTERNAL_FN (SUB_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) 264DEF_INTERNAL_FN (MUL_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) 265DEF_INTERNAL_FN (TSAN_FUNC_EXIT, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) 266DEF_INTERNAL_FN (VA_ARG, ECF_NOTHROW | ECF_LEAF, NULL) 267 268/* An unduplicable, uncombinable function. Generally used to preserve 269 a CFG property in the face of jump threading, tail merging or 270 other such optimizations. The first argument distinguishes 271 between uses. See internal-fn.h for usage. */ 272DEF_INTERNAL_FN (UNIQUE, ECF_NOTHROW, NULL) 273DEF_INTERNAL_FN (PHI, 0, NULL) 274 275/* DIM_SIZE and DIM_POS return the size of a particular compute 276 dimension and the executing thread's position within that 277 dimension. DIM_POS is pure (and not const) so that it isn't 278 thought to clobber memory and can be gcse'd within a single 279 parallel region, but not across FORK/JOIN boundaries. They take a 280 single INTEGER_CST argument. This might be overly conservative. */ 281DEF_INTERNAL_FN (GOACC_DIM_SIZE, ECF_CONST | ECF_NOTHROW | ECF_LEAF, ".") 282DEF_INTERNAL_FN (GOACC_DIM_POS, ECF_PURE | ECF_NOTHROW | ECF_LEAF, ".") 283 284/* OpenACC looping abstraction. See internal-fn.h for usage. */ 285DEF_INTERNAL_FN (GOACC_LOOP, ECF_PURE | ECF_NOTHROW, NULL) 286 287/* OpenACC reduction abstraction. See internal-fn.h for usage. */ 288DEF_INTERNAL_FN (GOACC_REDUCTION, ECF_NOTHROW | ECF_LEAF, NULL) 289 290/* Openacc tile abstraction. Describes the spans of the element loop. 291 GOACC_TILE (num-loops, loop-no, tile-arg, tile-mask, element-mask). */ 292DEF_INTERNAL_FN (GOACC_TILE, ECF_NOTHROW | ECF_LEAF, NULL) 293 294/* Set errno to EDOM, if GCC knows how to do that directly for the 295 current target. */ 296DEF_INTERNAL_FN (SET_EDOM, ECF_LEAF | ECF_NOTHROW, NULL) 297 298/* Atomic functions. These don't have ECF_NOTHROW because for 299 -fnon-call-exceptions they can throw, otherwise we set 300 gimple_call_nothrow_p on it. */ 301DEF_INTERNAL_FN (ATOMIC_BIT_TEST_AND_SET, ECF_LEAF, NULL) 302DEF_INTERNAL_FN (ATOMIC_BIT_TEST_AND_COMPLEMENT, ECF_LEAF, NULL) 303DEF_INTERNAL_FN (ATOMIC_BIT_TEST_AND_RESET, ECF_LEAF, NULL) 304DEF_INTERNAL_FN (ATOMIC_COMPARE_EXCHANGE, ECF_LEAF, NULL) 305 306/* To implement [[fallthrough]]. */ 307DEF_INTERNAL_FN (FALLTHROUGH, ECF_LEAF | ECF_NOTHROW, NULL) 308 309/* To implement __builtin_launder. */ 310DEF_INTERNAL_FN (LAUNDER, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL) 311 312/* Divmod function. */ 313DEF_INTERNAL_FN (DIVMOD, ECF_CONST | ECF_LEAF, NULL) 314 315/* A NOP function with arbitrary arguments and return value. */ 316DEF_INTERNAL_FN (NOP, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) 317 318#undef DEF_INTERNAL_INT_FN 319#undef DEF_INTERNAL_FLT_FN 320#undef DEF_INTERNAL_FLT_FLOATN_FN 321#undef DEF_INTERNAL_SIGNED_OPTAB_FN 322#undef DEF_INTERNAL_OPTAB_FN 323#undef DEF_INTERNAL_FN 324