]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/i386/i386-builtins.h
Update copyright years.
[thirdparty/gcc.git] / gcc / config / i386 / i386-builtins.h
CommitLineData
83ffe9cd 1/* Copyright (C) 1988-2023 Free Software Foundation, Inc.
2bf6d935
ML
2
3This file is part of GCC.
4
5GCC is free software; you can redistribute it and/or modify
6it under the terms of the GNU General Public License as published by
7the Free Software Foundation; either version 3, or (at your option)
8any later version.
9
10GCC is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with GCC; see the file COPYING3. If not see
17<http://www.gnu.org/licenses/>. */
18
19#ifndef GCC_I386_BUILTINS_H
20#define GCC_I386_BUILTINS_H
21
22/* The following file contains several enumerations and data structures
23 built from the definitions in i386-builtin-types.def. */
24
25#include "i386-builtin-types.inc"
26
27/* Codes for all the SSE/MMX builtins. Builtins not mentioned in any
28 bdesc_* arrays below should come first, then builtins for each bdesc_*
29 array in ascending order, so that we can use direct array accesses. */
30enum ix86_builtins
31{
32 IX86_BUILTIN_MASKMOVQ,
33 IX86_BUILTIN_LDMXCSR,
34 IX86_BUILTIN_STMXCSR,
35 IX86_BUILTIN_MASKMOVDQU,
36 IX86_BUILTIN_PSLLDQ128,
37 IX86_BUILTIN_CLFLUSH,
38 IX86_BUILTIN_MONITOR,
39 IX86_BUILTIN_MWAIT,
40 IX86_BUILTIN_UMONITOR,
41 IX86_BUILTIN_UMWAIT,
42 IX86_BUILTIN_TPAUSE,
299a53d7 43 IX86_BUILTIN_TESTUI,
2bf6d935
ML
44 IX86_BUILTIN_CLZERO,
45 IX86_BUILTIN_CLDEMOTE,
46 IX86_BUILTIN_VEC_INIT_V2SI,
47 IX86_BUILTIN_VEC_INIT_V4HI,
48 IX86_BUILTIN_VEC_INIT_V8QI,
49 IX86_BUILTIN_VEC_EXT_V2DF,
50 IX86_BUILTIN_VEC_EXT_V2DI,
51 IX86_BUILTIN_VEC_EXT_V4SF,
52 IX86_BUILTIN_VEC_EXT_V4SI,
53 IX86_BUILTIN_VEC_EXT_V8HI,
54 IX86_BUILTIN_VEC_EXT_V2SI,
55 IX86_BUILTIN_VEC_EXT_V4HI,
56 IX86_BUILTIN_VEC_EXT_V16QI,
57 IX86_BUILTIN_VEC_SET_V2DI,
58 IX86_BUILTIN_VEC_SET_V4SF,
59 IX86_BUILTIN_VEC_SET_V4SI,
60 IX86_BUILTIN_VEC_SET_V8HI,
61 IX86_BUILTIN_VEC_SET_V4HI,
62 IX86_BUILTIN_VEC_SET_V16QI,
63 IX86_BUILTIN_GATHERSIV2DF,
64 IX86_BUILTIN_GATHERSIV4DF,
65 IX86_BUILTIN_GATHERDIV2DF,
66 IX86_BUILTIN_GATHERDIV4DF,
67 IX86_BUILTIN_GATHERSIV4SF,
68 IX86_BUILTIN_GATHERSIV8SF,
69 IX86_BUILTIN_GATHERDIV4SF,
70 IX86_BUILTIN_GATHERDIV8SF,
71 IX86_BUILTIN_GATHERSIV2DI,
72 IX86_BUILTIN_GATHERSIV4DI,
73 IX86_BUILTIN_GATHERDIV2DI,
74 IX86_BUILTIN_GATHERDIV4DI,
75 IX86_BUILTIN_GATHERSIV4SI,
76 IX86_BUILTIN_GATHERSIV8SI,
77 IX86_BUILTIN_GATHERDIV4SI,
78 IX86_BUILTIN_GATHERDIV8SI,
79 IX86_BUILTIN_GATHER3SIV8SF,
80 IX86_BUILTIN_GATHER3SIV4SF,
81 IX86_BUILTIN_GATHER3SIV4DF,
82 IX86_BUILTIN_GATHER3SIV2DF,
83 IX86_BUILTIN_GATHER3DIV8SF,
84 IX86_BUILTIN_GATHER3DIV4SF,
85 IX86_BUILTIN_GATHER3DIV4DF,
86 IX86_BUILTIN_GATHER3DIV2DF,
87 IX86_BUILTIN_GATHER3SIV8SI,
88 IX86_BUILTIN_GATHER3SIV4SI,
89 IX86_BUILTIN_GATHER3SIV4DI,
90 IX86_BUILTIN_GATHER3SIV2DI,
91 IX86_BUILTIN_GATHER3DIV8SI,
92 IX86_BUILTIN_GATHER3DIV4SI,
93 IX86_BUILTIN_GATHER3DIV4DI,
94 IX86_BUILTIN_GATHER3DIV2DI,
95 IX86_BUILTIN_SCATTERSIV8SF,
96 IX86_BUILTIN_SCATTERSIV4SF,
97 IX86_BUILTIN_SCATTERSIV4DF,
98 IX86_BUILTIN_SCATTERSIV2DF,
99 IX86_BUILTIN_SCATTERDIV8SF,
100 IX86_BUILTIN_SCATTERDIV4SF,
101 IX86_BUILTIN_SCATTERDIV4DF,
102 IX86_BUILTIN_SCATTERDIV2DF,
103 IX86_BUILTIN_SCATTERSIV8SI,
104 IX86_BUILTIN_SCATTERSIV4SI,
105 IX86_BUILTIN_SCATTERSIV4DI,
106 IX86_BUILTIN_SCATTERSIV2DI,
107 IX86_BUILTIN_SCATTERDIV8SI,
108 IX86_BUILTIN_SCATTERDIV4SI,
109 IX86_BUILTIN_SCATTERDIV4DI,
110 IX86_BUILTIN_SCATTERDIV2DI,
111 /* Alternate 4 and 8 element gather/scatter for the vectorizer
112 where all operands are 32-byte or 64-byte wide respectively. */
113 IX86_BUILTIN_GATHERALTSIV4DF,
114 IX86_BUILTIN_GATHERALTDIV8SF,
115 IX86_BUILTIN_GATHERALTSIV4DI,
116 IX86_BUILTIN_GATHERALTDIV8SI,
117 IX86_BUILTIN_GATHER3ALTDIV16SF,
118 IX86_BUILTIN_GATHER3ALTDIV16SI,
119 IX86_BUILTIN_GATHER3ALTSIV4DF,
120 IX86_BUILTIN_GATHER3ALTDIV8SF,
121 IX86_BUILTIN_GATHER3ALTSIV4DI,
122 IX86_BUILTIN_GATHER3ALTDIV8SI,
123 IX86_BUILTIN_GATHER3ALTSIV8DF,
124 IX86_BUILTIN_GATHER3ALTSIV8DI,
125 IX86_BUILTIN_GATHER3DIV16SF,
126 IX86_BUILTIN_GATHER3DIV16SI,
127 IX86_BUILTIN_GATHER3DIV8DF,
128 IX86_BUILTIN_GATHER3DIV8DI,
129 IX86_BUILTIN_GATHER3SIV16SF,
130 IX86_BUILTIN_GATHER3SIV16SI,
131 IX86_BUILTIN_GATHER3SIV8DF,
132 IX86_BUILTIN_GATHER3SIV8DI,
133 IX86_BUILTIN_SCATTERALTSIV8DF,
134 IX86_BUILTIN_SCATTERALTDIV16SF,
135 IX86_BUILTIN_SCATTERALTSIV8DI,
136 IX86_BUILTIN_SCATTERALTDIV16SI,
137 IX86_BUILTIN_SCATTERALTSIV4DF,
138 IX86_BUILTIN_SCATTERALTDIV8SF,
139 IX86_BUILTIN_SCATTERALTSIV4DI,
140 IX86_BUILTIN_SCATTERALTDIV8SI,
141 IX86_BUILTIN_SCATTERALTSIV2DF,
142 IX86_BUILTIN_SCATTERALTDIV4SF,
143 IX86_BUILTIN_SCATTERALTSIV2DI,
144 IX86_BUILTIN_SCATTERALTDIV4SI,
145 IX86_BUILTIN_SCATTERDIV16SF,
146 IX86_BUILTIN_SCATTERDIV16SI,
147 IX86_BUILTIN_SCATTERDIV8DF,
148 IX86_BUILTIN_SCATTERDIV8DI,
149 IX86_BUILTIN_SCATTERSIV16SF,
150 IX86_BUILTIN_SCATTERSIV16SI,
151 IX86_BUILTIN_SCATTERSIV8DF,
152 IX86_BUILTIN_SCATTERSIV8DI,
153 IX86_BUILTIN_GATHERPFQPD,
154 IX86_BUILTIN_GATHERPFDPS,
155 IX86_BUILTIN_GATHERPFDPD,
156 IX86_BUILTIN_GATHERPFQPS,
157 IX86_BUILTIN_SCATTERPFDPD,
158 IX86_BUILTIN_SCATTERPFDPS,
159 IX86_BUILTIN_SCATTERPFQPD,
160 IX86_BUILTIN_SCATTERPFQPS,
161 IX86_BUILTIN_CLWB,
162 IX86_BUILTIN_CLFLUSHOPT,
163 IX86_BUILTIN_INFQ,
164 IX86_BUILTIN_HUGE_VALQ,
165 IX86_BUILTIN_NANQ,
166 IX86_BUILTIN_NANSQ,
167 IX86_BUILTIN_XABORT,
168 IX86_BUILTIN_ADDCARRYX32,
169 IX86_BUILTIN_ADDCARRYX64,
170 IX86_BUILTIN_SBB32,
171 IX86_BUILTIN_SBB64,
172 IX86_BUILTIN_RDRAND16_STEP,
173 IX86_BUILTIN_RDRAND32_STEP,
174 IX86_BUILTIN_RDRAND64_STEP,
175 IX86_BUILTIN_RDSEED16_STEP,
176 IX86_BUILTIN_RDSEED32_STEP,
177 IX86_BUILTIN_RDSEED64_STEP,
178 IX86_BUILTIN_MONITORX,
179 IX86_BUILTIN_MWAITX,
180 IX86_BUILTIN_CFSTRING,
181 IX86_BUILTIN_CPU_INIT,
182 IX86_BUILTIN_CPU_IS,
183 IX86_BUILTIN_CPU_SUPPORTS,
184 IX86_BUILTIN_READ_FLAGS,
185 IX86_BUILTIN_WRITE_FLAGS,
186
187 /* All the remaining builtins are tracked in bdesc_* arrays in
188 i386-builtin.def. Don't add any IX86_BUILTIN_* enumerators after
189 this point. */
190#define BDESC(mask, mask2, icode, name, code, comparison, flag) \
191 code,
192#define BDESC_FIRST(kind, kindu, mask, mask2, icode, name, code, comparison, flag) \
193 code, \
194 IX86_BUILTIN__BDESC_##kindu##_FIRST = code,
195#define BDESC_END(kind, next_kind)
196
197#include "i386-builtin.def"
198
199#undef BDESC
200#undef BDESC_FIRST
201#undef BDESC_END
202
203 IX86_BUILTIN_MAX,
204
205 IX86_BUILTIN__BDESC_MAX_FIRST = IX86_BUILTIN_MAX,
206
207 /* Now just the aliases for bdesc_* start/end. */
208#define BDESC(mask, mask2, icode, name, code, comparison, flag)
209#define BDESC_FIRST(kind, kindu, mask, mask2, icode, name, code, comparison, flag)
210#define BDESC_END(kind, next_kind) \
211 IX86_BUILTIN__BDESC_##kind##_LAST \
212 = IX86_BUILTIN__BDESC_##next_kind##_FIRST - 1,
213
214#include "i386-builtin.def"
215
216#undef BDESC
217#undef BDESC_FIRST
218#undef BDESC_END
219
220 /* Just to make sure there is no comma after the last enumerator. */
221 IX86_BUILTIN__BDESC_MAX_LAST = IX86_BUILTIN__BDESC_MAX_FIRST
222};
223
224/* Table of all of the builtin functions that are possible with different ISA's
225 but are waiting to be built until a function is declared to use that
226 ISA. */
227struct builtin_isa {
228 HOST_WIDE_INT isa; /* isa_flags this builtin is defined for */
229 HOST_WIDE_INT isa2; /* additional isa_flags this builtin is defined for */
230 const char *name; /* function name */
231 enum ix86_builtin_func_type tcode; /* type to use in the declaration */
232 unsigned char const_p:1; /* true if the declaration is constant */
233 unsigned char pure_p:1; /* true if the declaration has pure attribute */
234 bool set_and_not_built_p;
235};
236
237/* Bits for builtin_description.flag. */
238
2bf6d935
ML
239struct builtin_description
240{
241 const HOST_WIDE_INT mask;
242 const HOST_WIDE_INT mask2;
243 const enum insn_code icode;
244 const char *const name;
245 const enum ix86_builtins code;
246 const enum rtx_code comparison;
247 const int flag;
248};
249
250#define MULTI_ARG_4_DF2_DI_I V2DF_FTYPE_V2DF_V2DF_V2DI_INT
251#define MULTI_ARG_4_DF2_DI_I1 V4DF_FTYPE_V4DF_V4DF_V4DI_INT
252#define MULTI_ARG_4_SF2_SI_I V4SF_FTYPE_V4SF_V4SF_V4SI_INT
253#define MULTI_ARG_4_SF2_SI_I1 V8SF_FTYPE_V8SF_V8SF_V8SI_INT
254#define MULTI_ARG_3_SF V4SF_FTYPE_V4SF_V4SF_V4SF
255#define MULTI_ARG_3_DF V2DF_FTYPE_V2DF_V2DF_V2DF
256#define MULTI_ARG_3_SF2 V8SF_FTYPE_V8SF_V8SF_V8SF
257#define MULTI_ARG_3_DF2 V4DF_FTYPE_V4DF_V4DF_V4DF
258#define MULTI_ARG_3_DI V2DI_FTYPE_V2DI_V2DI_V2DI
259#define MULTI_ARG_3_SI V4SI_FTYPE_V4SI_V4SI_V4SI
260#define MULTI_ARG_3_SI_DI V4SI_FTYPE_V4SI_V4SI_V2DI
261#define MULTI_ARG_3_HI V8HI_FTYPE_V8HI_V8HI_V8HI
262#define MULTI_ARG_3_HI_SI V8HI_FTYPE_V8HI_V8HI_V4SI
263#define MULTI_ARG_3_QI V16QI_FTYPE_V16QI_V16QI_V16QI
264#define MULTI_ARG_3_DI2 V4DI_FTYPE_V4DI_V4DI_V4DI
265#define MULTI_ARG_3_SI2 V8SI_FTYPE_V8SI_V8SI_V8SI
266#define MULTI_ARG_3_HI2 V16HI_FTYPE_V16HI_V16HI_V16HI
267#define MULTI_ARG_3_QI2 V32QI_FTYPE_V32QI_V32QI_V32QI
268#define MULTI_ARG_2_SF V4SF_FTYPE_V4SF_V4SF
269#define MULTI_ARG_2_DF V2DF_FTYPE_V2DF_V2DF
270#define MULTI_ARG_2_DI V2DI_FTYPE_V2DI_V2DI
271#define MULTI_ARG_2_SI V4SI_FTYPE_V4SI_V4SI
272#define MULTI_ARG_2_HI V8HI_FTYPE_V8HI_V8HI
273#define MULTI_ARG_2_QI V16QI_FTYPE_V16QI_V16QI
274#define MULTI_ARG_2_DI_IMM V2DI_FTYPE_V2DI_SI
275#define MULTI_ARG_2_SI_IMM V4SI_FTYPE_V4SI_SI
276#define MULTI_ARG_2_HI_IMM V8HI_FTYPE_V8HI_SI
277#define MULTI_ARG_2_QI_IMM V16QI_FTYPE_V16QI_SI
278#define MULTI_ARG_2_DI_CMP V2DI_FTYPE_V2DI_V2DI_CMP
279#define MULTI_ARG_2_SI_CMP V4SI_FTYPE_V4SI_V4SI_CMP
280#define MULTI_ARG_2_HI_CMP V8HI_FTYPE_V8HI_V8HI_CMP
281#define MULTI_ARG_2_QI_CMP V16QI_FTYPE_V16QI_V16QI_CMP
282#define MULTI_ARG_2_SF_TF V4SF_FTYPE_V4SF_V4SF_TF
283#define MULTI_ARG_2_DF_TF V2DF_FTYPE_V2DF_V2DF_TF
284#define MULTI_ARG_2_DI_TF V2DI_FTYPE_V2DI_V2DI_TF
285#define MULTI_ARG_2_SI_TF V4SI_FTYPE_V4SI_V4SI_TF
286#define MULTI_ARG_2_HI_TF V8HI_FTYPE_V8HI_V8HI_TF
287#define MULTI_ARG_2_QI_TF V16QI_FTYPE_V16QI_V16QI_TF
288#define MULTI_ARG_1_SF V4SF_FTYPE_V4SF
289#define MULTI_ARG_1_DF V2DF_FTYPE_V2DF
290#define MULTI_ARG_1_SF2 V8SF_FTYPE_V8SF
291#define MULTI_ARG_1_DF2 V4DF_FTYPE_V4DF
292#define MULTI_ARG_1_DI V2DI_FTYPE_V2DI
293#define MULTI_ARG_1_SI V4SI_FTYPE_V4SI
294#define MULTI_ARG_1_HI V8HI_FTYPE_V8HI
295#define MULTI_ARG_1_QI V16QI_FTYPE_V16QI
296#define MULTI_ARG_1_SI_DI V2DI_FTYPE_V4SI
297#define MULTI_ARG_1_HI_DI V2DI_FTYPE_V8HI
298#define MULTI_ARG_1_HI_SI V4SI_FTYPE_V8HI
299#define MULTI_ARG_1_QI_DI V2DI_FTYPE_V16QI
300#define MULTI_ARG_1_QI_SI V4SI_FTYPE_V16QI
301#define MULTI_ARG_1_QI_HI V8HI_FTYPE_V16QI
302
303#define BDESC(mask, mask2, icode, name, code, comparison, flag) \
304 { mask, mask2, icode, name, code, comparison, flag },
305#define BDESC_FIRST(kind, kindu, mask, mask2, icode, name, code, comparison, flag) \
306static const struct builtin_description bdesc_##kind[] = \
307{ \
308 BDESC (mask, mask2, icode, name, code, comparison, flag)
309#define BDESC_END(kind, next_kind) \
310};
311
312#include "i386-builtin.def"
313
314extern builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
315
316tree ix86_builtin_vectorized_function (unsigned int fn, tree type_out,
317 tree type_in);
318void ix86_init_builtins (void);
319tree ix86_vectorize_builtin_gather (const_tree mem_vectype,
320 const_tree index_type, int scale);
321tree ix86_builtin_decl (unsigned code, bool);
322tree ix86_builtin_reciprocal (tree fndecl);
323unsigned int get_builtin_code_for_version (tree decl, tree *predicate_list);
324tree fold_builtin_cpu (tree fndecl, tree *args);
325tree get_ix86_builtin (enum ix86_builtins c);
326
327#endif /* GCC_I386_BUILTINS_H */