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