xref: /netbsd-src/external/gpl3/gcc/dist/gcc/config/i386/i386-builtins.h (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* Copyright (C) 1988-2022 Free Software Foundation, Inc.
2 
3 This file is part of GCC.
4 
5 GCC is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3, or (at your option)
8 any later version.
9 
10 GCC is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along 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.  */
30 enum 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,
43   IX86_BUILTIN_TESTUI,
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.  */
227 struct 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 
239 struct 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) \
306 static 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 
314 extern builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
315 
316 tree ix86_builtin_vectorized_function (unsigned int fn, tree type_out,
317 					      tree type_in);
318 void ix86_init_builtins (void);
319 tree ix86_vectorize_builtin_gather (const_tree mem_vectype,
320 					   const_tree index_type, int scale);
321 tree ix86_builtin_decl (unsigned code, bool);
322 tree ix86_builtin_reciprocal (tree fndecl);
323 unsigned int get_builtin_code_for_version (tree decl, tree *predicate_list);
324 tree fold_builtin_cpu (tree fndecl, tree *args);
325 tree get_ix86_builtin (enum ix86_builtins c);
326 
327 #endif  /* GCC_I386_BUILTINS_H */
328