GCC Middle and Back End API Reference
internal-fn.h
Go to the documentation of this file.
1/* Internal functions.
2 Copyright (C) 2011-2025 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#ifndef GCC_INTERNAL_FN_H
21#define GCC_INTERNAL_FN_H
22
23#include "insn-codes.h"
24#include "insn-opinit.h"
25
26
27/* INTEGER_CST values for IFN_UNIQUE function arg-0.
28
29 UNSPEC: Undifferentiated UNIQUE.
30
31 FORK and JOIN mark the points at which OpenACC partitioned
32 execution is entered or exited.
33 DEP_VAR = UNIQUE ({FORK,JOIN}, DEP_VAR, AXIS)
34
35 HEAD_MARK and TAIL_MARK are used to demark the sequence entering
36 or leaving partitioned execution.
37 DEP_VAR = UNIQUE ({HEAD,TAIL}_MARK, REMAINING_MARKS, ...PRIMARY_FLAGS)
38
39 The PRIMARY_FLAGS only occur on the first HEAD_MARK of a sequence.
40
41 PRIVATE captures variables to be made private at the surrounding parallelism
42 level. */
43#define IFN_UNIQUE_CODES \
44 DEF(UNSPEC), \
45 DEF(OACC_FORK), DEF(OACC_JOIN), \
46 DEF(OACC_HEAD_MARK), DEF(OACC_TAIL_MARK), \
47 DEF(OACC_PRIVATE)
48
50#define DEF(X) IFN_UNIQUE_##X
52#undef DEF
53};
54
55/* INTEGER_CST values for IFN_GOACC_LOOP arg-0. Allows the precise
56 stepping of the compute geometry over the loop iterations to be
57 deferred until it is known which compiler is generating the code.
58 The action is encoded in a constant first argument.
59
60 CHUNK_MAX = LOOP (CODE_CHUNKS, DIR, RANGE, STEP, CHUNK_SIZE, MASK)
61 STEP = LOOP (CODE_STEP, DIR, RANGE, STEP, CHUNK_SIZE, MASK)
62 OFFSET = LOOP (CODE_OFFSET, DIR, RANGE, STEP, CHUNK_SIZE, MASK, CHUNK_NO)
63 BOUND = LOOP (CODE_BOUND, DIR, RANGE, STEP, CHUNK_SIZE, MASK, OFFSET)
64
65 DIR - +1 for up loop, -1 for down loop
66 RANGE - Range of loop (END - BASE)
67 STEP - iteration step size
68 CHUNKING - size of chunking, (constant zero for no chunking)
69 CHUNK_NO - chunk number
70 MASK - partitioning mask. */
71
72#define IFN_GOACC_LOOP_CODES \
73 DEF(CHUNKS), DEF(STEP), DEF(OFFSET), DEF(BOUND)
75#define DEF(X) IFN_GOACC_LOOP_##X
77#undef DEF
78};
79
80/* The GOACC_REDUCTION function defines a generic interface to support
81 gang, worker and vector reductions. All calls are of the following
82 form:
83
84 V = REDUCTION (CODE, REF_TO_RES, LOCAL_VAR, LEVEL, OP, OFFSET)
85
86 REF_TO_RES - is a reference to the original reduction varl, may be NULL
87 LOCAL_VAR is the intermediate reduction variable
88 LEVEL corresponds to the GOMP_DIM of the reduction
89 OP is the tree code of the reduction operation
90 OFFSET may be used as an offset into a reduction array for the
91 reductions occuring at this level.
92 In general the return value is LOCAL_VAR, which creates a data
93 dependency between calls operating on the same reduction. */
94
95#define IFN_GOACC_REDUCTION_CODES \
96 DEF(SETUP), DEF(INIT), DEF(FINI), DEF(TEARDOWN)
98#define DEF(X) IFN_GOACC_REDUCTION_##X
100#undef DEF
101};
102
103/* Initialize internal function tables. */
104
105extern void init_internal_fns ();
106
107/* Return the name of internal function FN. The name is only meaningful
108 for dumps; it has no linkage. */
109
110extern const char *const internal_fn_name_array[];
111
112inline const char *
114{
115 return internal_fn_name_array[(int) fn];
116}
117
118extern internal_fn lookup_internal_fn (const char *);
121 internal_fn *);
123
124/* Return the ECF_* flags for function FN. */
125
126extern const int internal_fn_flags_array[];
127
128inline int
130{
131 return internal_fn_flags_array[(int) fn];
132}
133
134/* Return fnspec for function FN. */
135
136extern GTY(()) const_tree internal_fn_fnspec_array[IFN_LAST + 1];
137
138inline const_tree
140{
141 return internal_fn_fnspec_array[(int) fn];
142}
143
144/* Describes an internal function that maps directly to an optab. */
146{
147 /* optabs can be parameterized by one or two modes. These fields describe
148 how to select those modes from the types of the return value and
149 arguments. A value of -1 says that the mode is determined by the
150 return type while a value N >= 0 says that the mode is determined by
151 the type of argument N. A value of -2 says that this internal
152 function isn't directly mapped to an optab. */
153 signed int type0 : 8;
154 signed int type1 : 8;
155 /* True if the function is pointwise, so that it can be vectorized by
156 converting the return type and all argument types to vectors of the
157 same number of elements. E.g. we can vectorize an IFN_SQRT on
158 floats as an IFN_SQRT on vectors of N floats.
159
160 This only needs 1 bit, but occupies the full 16 to ensure a nice
161 layout. */
162 unsigned int vectorizable : 16;
163};
164
165extern const direct_internal_fn_info direct_internal_fn_array[IFN_LAST + 1];
166
167/* Return true if FN is mapped directly to an optab. */
168
169inline bool
171{
172 return direct_internal_fn_array[fn].type0 >= -1;
173}
174
175/* Return true if FN is a direct internal function that can be vectorized by
176 converting the return type and all argument types to vectors of the same
177 number of elements. E.g. we can vectorize an IFN_SQRT on floats as an
178 IFN_SQRT on vectors of N floats. */
179
180inline bool
182{
183 return direct_internal_fn_array[fn].vectorizable;
184}
185
186/* Return optab information about internal function FN. Only meaningful
187 if direct_internal_fn_p (FN). */
188
189inline const direct_internal_fn_info &
195
203
204/* Return true if FN is supported for types TYPE0 and TYPE1 when the
205 optimization type is OPT_TYPE. The types are those associated with
206 the "type0" and "type1" fields of FN's direct_internal_fn_info
207 structure. */
208
209inline bool
211 optimization_type opt_type)
212{
213 return direct_internal_fn_supported_p (fn, tree_pair (type0, type1),
214 opt_type);
215}
216
221extern bool widening_fn_p (code_helper);
222
223extern bool set_edom_supported_p (void);
224
232 tree_code *, tree (&)[3],
233 tree *, tree *, tree *);
234
235extern bool internal_load_fn_p (internal_fn);
236extern bool internal_store_fn_p (internal_fn);
243 tree, tree, int,
244 vec<int> * = nullptr);
246 poly_uint64, unsigned int);
247
248/* Integer constants representing which else value is supported for masked load
249 functions. */
250#define MASK_LOAD_ELSE_ZERO -1
251#define MASK_LOAD_ELSE_M1 -2
252#define MASK_LOAD_ELSE_UNDEFINED -3
253
254extern void get_supported_else_vals (enum insn_code, unsigned, vec<int> &);
255extern bool supported_else_val_p (enum insn_code, unsigned, int);
256
257#define VECT_PARTIAL_BIAS_UNSUPPORTED 127
258
259extern signed char internal_len_load_store_bias (internal_fn ifn,
260 machine_mode);
261
262extern void expand_addsub_overflow (location_t, tree_code, tree, tree, tree,
263 bool, bool, bool, bool, tree *);
264extern void expand_internal_call (gcall *);
265extern void expand_internal_call (internal_fn, gcall *);
266extern void expand_PHI (internal_fn, gcall *);
267extern void expand_SHUFFLEVECTOR (internal_fn, gcall *);
268extern void expand_SPACESHIP (internal_fn, gcall *);
270extern void expand_ASSUME (internal_fn, gcall *);
271extern void expand_MASK_CALL (internal_fn, gcall *);
272extern void expand_MULBITINT (internal_fn, gcall *);
273extern void expand_DIVMODBITINT (internal_fn, gcall *);
274extern void expand_FLOATTOBITINT (internal_fn, gcall *);
275extern void expand_BITINTTOFLOAT (internal_fn, gcall *);
276extern void expand_CLRSB (internal_fn, gcall *);
277extern void expand_CLZ (internal_fn, gcall *);
278extern void expand_CTZ (internal_fn, gcall *);
279extern void expand_FFS (internal_fn, gcall *);
280extern void expand_PARITY (internal_fn, gcall *);
281extern void expand_POPCOUNT (internal_fn, gcall *);
282
284
285enum {
292};
293
294#endif
Definition tree.h:81
std::pair< tree, tree > tree_pair
Definition coretypes.h:384
const union tree_node * const_tree
Definition coretypes.h:98
#define GTY(x)
Definition coretypes.h:41
union tree_node * tree
Definition coretypes.h:97
optimization_type
Definition coretypes.h:282
internal_fn
Definition genmatch.cc:1005
tree_code
Definition genmatch.cc:992
enum optab_tag optab
const direct_internal_fn_info direct_internal_fn_array[IFN_LAST+1]
Definition internal-fn.cc:198
const_tree internal_fn_fnspec_array[IFN_LAST+1]
Definition internal-fn.cc:145
const char *const internal_fn_name_array[]
Definition internal-fn.cc:65
const int internal_fn_flags_array[]
Definition internal-fn.cc:72
bool set_edom_supported_p(void)
Definition internal-fn.cc:4543
bool vectorizable_internal_fn_p(internal_fn fn)
Definition internal-fn.h:181
signed char internal_len_load_store_bias(internal_fn ifn, machine_mode)
Definition internal-fn.cc:5231
const direct_internal_fn_info & direct_internal_fn(internal_fn fn)
Definition internal-fn.h:190
bool direct_internal_fn_p(internal_fn fn)
Definition internal-fn.h:170
bool internal_gather_scatter_fn_p(internal_fn)
Definition internal-fn.cc:4902
int internal_fn_mask_index(internal_fn)
Definition internal-fn.cc:5053
#define IFN_GOACC_REDUCTION_CODES
Definition internal-fn.h:95
int first_commutative_argument(internal_fn)
Definition internal-fn.cc:4471
@ ATOMIC_OP_FETCH_CMP_0_EQ
Definition internal-fn.h:286
@ ATOMIC_OP_FETCH_CMP_0_GT
Definition internal-fn.h:290
@ ATOMIC_OP_FETCH_CMP_0_LE
Definition internal-fn.h:289
@ ATOMIC_OP_FETCH_CMP_0_LT
Definition internal-fn.h:288
@ ATOMIC_OP_FETCH_CMP_0_GE
Definition internal-fn.h:291
@ ATOMIC_OP_FETCH_CMP_0_NE
Definition internal-fn.h:287
void expand_CLZ(internal_fn, gcall *)
Definition internal-fn.cc:5497
tree_pair direct_internal_fn_types(internal_fn, tree, tree *)
Definition internal-fn.cc:4153
tree_code conditional_internal_fn_code(internal_fn)
Definition internal-fn.cc:4633
bool commutative_binary_fn_p(internal_fn)
Definition internal-fn.cc:4402
const_tree internal_fn_fnspec(enum internal_fn fn)
Definition internal-fn.h:139
internal_fn get_len_internal_fn(internal_fn)
Definition internal-fn.cc:4723
int internal_fn_flags(enum internal_fn fn)
Definition internal-fn.h:129
internal_fn get_unconditional_internal_fn(internal_fn)
Definition internal-fn.cc:4755
const char * internal_fn_name(enum internal_fn fn)
Definition internal-fn.h:113
void expand_addsub_overflow(location_t, tree_code, tree, tree, tree, bool, bool, bool, bool, tree *)
Definition internal-fn.cc:1109
void expand_MULBITINT(internal_fn, gcall *)
Definition internal-fn.cc:5372
bool internal_load_fn_p(internal_fn)
Definition internal-fn.cc:4856
void init_internal_fns()
Definition internal-fn.cc:148
internal_fn get_conditional_len_internal_fn(tree_code)
Definition internal-fn.cc:4670
void expand_DIVMODBITINT(internal_fn, gcall *)
Definition internal-fn.cc:5383
#define IFN_GOACC_LOOP_CODES
Definition internal-fn.h:72
bool internal_check_ptrs_fn_supported_p(internal_fn, tree, poly_uint64, unsigned int)
Definition internal-fn.cc:5211
void expand_POPCOUNT(internal_fn, gcall *)
Definition internal-fn.cc:5525
int internal_fn_stored_value_index(internal_fn)
Definition internal-fn.cc:5091
ifn_unique_kind
Definition internal-fn.h:49
void expand_FLOATTOBITINT(internal_fn, gcall *)
Definition internal-fn.cc:5394
void expand_CTZ(internal_fn, gcall *)
Definition internal-fn.cc:5504
bool internal_gather_scatter_fn_supported_p(internal_fn, tree, tree, tree, int, vec< int > *=nullptr)
Definition internal-fn.cc:5175
bool widening_fn_p(code_helper)
Definition internal-fn.cc:4515
int internal_fn_len_index(internal_fn)
Definition internal-fn.cc:4923
void expand_FFS(internal_fn, gcall *)
Definition internal-fn.cc:5511
void expand_SHUFFLEVECTOR(internal_fn, gcall *)
Definition internal-fn.cc:5322
ifn_goacc_loop_kind
Definition internal-fn.h:74
void expand_SPACESHIP(internal_fn, gcall *)
Definition internal-fn.cc:5334
void expand_TRAP(internal_fn, gcall *)
#define IFN_UNIQUE_CODES
Definition internal-fn.h:43
void lookup_hilo_internal_fn(internal_fn, internal_fn *, internal_fn *)
Definition internal-fn.cc:102
bool commutative_ternary_fn_p(internal_fn)
Definition internal-fn.cc:4435
ifn_goacc_reduction_kind
Definition internal-fn.h:97
void expand_PHI(internal_fn, gcall *)
Definition internal-fn.cc:5328
bool can_interpret_as_conditional_op_p(gimple *, tree *, tree_code *, tree(&)[3], tree *, tree *, tree *)
Definition internal-fn.cc:4802
void expand_internal_call(gcall *)
Definition internal-fn.cc:5279
void expand_MASK_CALL(internal_fn, gcall *)
Definition internal-fn.cc:5365
bool associative_binary_fn_p(internal_fn)
Definition internal-fn.cc:4454
int internal_fn_else_index(internal_fn)
Definition internal-fn.cc:4981
internal_fn get_conditional_internal_fn(tree_code)
Definition internal-fn.cc:4617
optab direct_internal_fn_optab(internal_fn, tree_pair)
Definition internal-fn.cc:4258
void lookup_evenodd_internal_fn(internal_fn, internal_fn *, internal_fn *)
Definition internal-fn.cc:124
void expand_CLRSB(internal_fn, gcall *)
Definition internal-fn.cc:5490
void get_supported_else_vals(enum insn_code, unsigned, vec< int > &)
Definition internal-fn.cc:5123
bool direct_internal_fn_supported_p(internal_fn, tree_pair, optimization_type)
Definition internal-fn.cc:4343
void expand_BITINTTOFLOAT(internal_fn, gcall *)
Definition internal-fn.cc:5431
bool supported_else_val_p(enum insn_code, unsigned, int)
Definition internal-fn.cc:5152
void expand_PARITY(internal_fn, gcall *)
Definition internal-fn.cc:5518
bool internal_store_fn_p(internal_fn)
Definition internal-fn.cc:4879
void expand_ASSUME(internal_fn, gcall *)
Definition internal-fn.cc:5360
internal_fn lookup_internal_fn(const char *)
Definition internal-fn.cc:82
bool vectorized_internal_fn_supported_p(internal_fn, tree)
Definition internal-fn.cc:5290
poly_int< NUM_POLY_INT_COEFFS, unsigned HOST_WIDE_INT > poly_uint64
Definition poly-int-types.h:25
Definition internal-fn.h:146
signed int type1
Definition internal-fn.h:154
signed int type0
Definition internal-fn.h:153
unsigned int vectorizable
Definition internal-fn.h:162
Definition gimple.h:352
Definition gimple.h:221
Definition vec.h:450
#define gcc_checking_assert(EXPR)
Definition system.h:821