1 /* Copyright (C) 1988-2021 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 #define IN_TARGET_CODE 1
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "backend.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "memmodel.h"
28 #include "gimple.h"
29 #include "cfghooks.h"
30 #include "cfgloop.h"
31 #include "df.h"
32 #include "tm_p.h"
33 #include "stringpool.h"
34 #include "expmed.h"
35 #include "optabs.h"
36 #include "regs.h"
37 #include "emit-rtl.h"
38 #include "recog.h"
39 #include "cgraph.h"
40 #include "diagnostic.h"
41 #include "cfgbuild.h"
42 #include "alias.h"
43 #include "fold-const.h"
44 #include "attribs.h"
45 #include "calls.h"
46 #include "stor-layout.h"
47 #include "varasm.h"
48 #include "output.h"
49 #include "insn-attr.h"
50 #include "flags.h"
51 #include "except.h"
52 #include "explow.h"
53 #include "expr.h"
54 #include "cfgrtl.h"
55 #include "common/common-target.h"
56 #include "langhooks.h"
57 #include "reload.h"
58 #include "gimplify.h"
59 #include "dwarf2.h"
60 #include "tm-constrs.h"
61 #include "cselib.h"
62 #include "sched-int.h"
63 #include "opts.h"
64 #include "tree-pass.h"
65 #include "context.h"
66 #include "pass_manager.h"
67 #include "target-globals.h"
68 #include "gimple-iterator.h"
69 #include "tree-vectorizer.h"
70 #include "shrink-wrap.h"
71 #include "builtins.h"
72 #include "rtl-iter.h"
73 #include "tree-iterator.h"
74 #include "dbgcnt.h"
75 #include "case-cfn-macros.h"
76 #include "dojump.h"
77 #include "fold-const-call.h"
78 #include "tree-vrp.h"
79 #include "tree-ssanames.h"
80 #include "selftest.h"
81 #include "selftest-rtl.h"
82 #include "print-rtl.h"
83 #include "intl.h"
84 #include "ifcvt.h"
85 #include "symbol-summary.h"
86 #include "ipa-prop.h"
87 #include "ipa-fnsummary.h"
88 #include "wide-int-bitmask.h"
89 #include "tree-vector-builder.h"
90 #include "debug.h"
91 #include "dwarf2out.h"
92 #include "i386-builtins.h"
93 #include "common/config/i386/i386-isas.h"
94
95 #undef BDESC
96 #undef BDESC_FIRST
97 #undef BDESC_END
98
99 /* Macros for verification of enum ix86_builtins order. */
100 #define BDESC_VERIFY(x, y, z) \
101 gcc_checking_assert ((x) == (enum ix86_builtins) ((y) + (z)))
102 #define BDESC_VERIFYS(x, y, z) \
103 STATIC_ASSERT ((x) == (enum ix86_builtins) ((y) + (z)))
104
105 BDESC_VERIFYS (IX86_BUILTIN__BDESC_PCMPESTR_FIRST,
106 IX86_BUILTIN__BDESC_COMI_LAST, 1);
107 BDESC_VERIFYS (IX86_BUILTIN__BDESC_PCMPISTR_FIRST,
108 IX86_BUILTIN__BDESC_PCMPESTR_LAST, 1);
109 BDESC_VERIFYS (IX86_BUILTIN__BDESC_SPECIAL_ARGS_FIRST,
110 IX86_BUILTIN__BDESC_PCMPISTR_LAST, 1);
111 BDESC_VERIFYS (IX86_BUILTIN__BDESC_ARGS_FIRST,
112 IX86_BUILTIN__BDESC_SPECIAL_ARGS_LAST, 1);
113 BDESC_VERIFYS (IX86_BUILTIN__BDESC_ROUND_ARGS_FIRST,
114 IX86_BUILTIN__BDESC_ARGS_LAST, 1);
115 BDESC_VERIFYS (IX86_BUILTIN__BDESC_MULTI_ARG_FIRST,
116 IX86_BUILTIN__BDESC_ROUND_ARGS_LAST, 1);
117 BDESC_VERIFYS (IX86_BUILTIN__BDESC_CET_FIRST,
118 IX86_BUILTIN__BDESC_MULTI_ARG_LAST, 1);
119 BDESC_VERIFYS (IX86_BUILTIN_MAX,
120 IX86_BUILTIN__BDESC_CET_LAST, 1);
121
122
123 /* Table for the ix86 builtin non-function types. */
124 static GTY(()) tree ix86_builtin_type_tab[(int) IX86_BT_LAST_CPTR + 1];
125
126 /* Retrieve an element from the above table, building some of
127 the types lazily. */
128
129 static tree
ix86_get_builtin_type(enum ix86_builtin_type tcode)130 ix86_get_builtin_type (enum ix86_builtin_type tcode)
131 {
132 unsigned int index;
133 tree type, itype;
134
135 gcc_assert ((unsigned)tcode < ARRAY_SIZE(ix86_builtin_type_tab));
136
137 type = ix86_builtin_type_tab[(int) tcode];
138 if (type != NULL)
139 return type;
140
141 gcc_assert (tcode > IX86_BT_LAST_PRIM);
142 if (tcode <= IX86_BT_LAST_VECT)
143 {
144 machine_mode mode;
145
146 index = tcode - IX86_BT_LAST_PRIM - 1;
147 itype = ix86_get_builtin_type (ix86_builtin_type_vect_base[index]);
148 mode = ix86_builtin_type_vect_mode[index];
149
150 type = build_vector_type_for_mode (itype, mode);
151 }
152 else
153 {
154 int quals;
155
156 index = tcode - IX86_BT_LAST_VECT - 1;
157 if (tcode <= IX86_BT_LAST_PTR)
158 quals = TYPE_UNQUALIFIED;
159 else
160 quals = TYPE_QUAL_CONST;
161
162 itype = ix86_get_builtin_type (ix86_builtin_type_ptr_base[index]);
163 if (quals != TYPE_UNQUALIFIED)
164 itype = build_qualified_type (itype, quals);
165
166 type = build_pointer_type (itype);
167 }
168
169 ix86_builtin_type_tab[(int) tcode] = type;
170 return type;
171 }
172
173 /* Table for the ix86 builtin function types. */
174 static GTY(()) tree ix86_builtin_func_type_tab[(int) IX86_BT_LAST_ALIAS + 1];
175
176 /* Retrieve an element from the above table, building some of
177 the types lazily. */
178
179 static tree
ix86_get_builtin_func_type(enum ix86_builtin_func_type tcode)180 ix86_get_builtin_func_type (enum ix86_builtin_func_type tcode)
181 {
182 tree type;
183
184 gcc_assert ((unsigned)tcode < ARRAY_SIZE (ix86_builtin_func_type_tab));
185
186 type = ix86_builtin_func_type_tab[(int) tcode];
187 if (type != NULL)
188 return type;
189
190 if (tcode <= IX86_BT_LAST_FUNC)
191 {
192 unsigned start = ix86_builtin_func_start[(int) tcode];
193 unsigned after = ix86_builtin_func_start[(int) tcode + 1];
194 tree rtype, atype, args = void_list_node;
195 unsigned i;
196
197 rtype = ix86_get_builtin_type (ix86_builtin_func_args[start]);
198 for (i = after - 1; i > start; --i)
199 {
200 atype = ix86_get_builtin_type (ix86_builtin_func_args[i]);
201 args = tree_cons (NULL, atype, args);
202 }
203
204 type = build_function_type (rtype, args);
205 }
206 else
207 {
208 unsigned index = tcode - IX86_BT_LAST_FUNC - 1;
209 enum ix86_builtin_func_type icode;
210
211 icode = ix86_builtin_func_alias_base[index];
212 type = ix86_get_builtin_func_type (icode);
213 }
214
215 ix86_builtin_func_type_tab[(int) tcode] = type;
216 return type;
217 }
218
219 /* Table for the ix86 builtin decls. */
220 static GTY(()) tree ix86_builtins[(int) IX86_BUILTIN_MAX];
221
222 struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
223
get_ix86_builtin(enum ix86_builtins c)224 tree get_ix86_builtin (enum ix86_builtins c)
225 {
226 return ix86_builtins[c];
227 }
228
229 /* Bits that can still enable any inclusion of a builtin. */
230 HOST_WIDE_INT deferred_isa_values = 0;
231 HOST_WIDE_INT deferred_isa_values2 = 0;
232
233 /* Add an ix86 target builtin function with CODE, NAME and TYPE. Save the
234 MASK and MASK2 of which isa_flags and ix86_isa_flags2 to use in the
235 ix86_builtins_isa array. Stores the function decl in the ix86_builtins
236 array. Returns the function decl or NULL_TREE, if the builtin was not
237 added.
238
239 If the front end has a special hook for builtin functions, delay adding
240 builtin functions that aren't in the current ISA until the ISA is changed
241 with function specific optimization. Doing so, can save about 300K for the
242 default compiler. When the builtin is expanded, check at that time whether
243 it is valid.
244
245 If the front end doesn't have a special hook, record all builtins, even if
246 it isn't an instruction set in the current ISA in case the user uses
247 function specific options for a different ISA, so that we don't get scope
248 errors if a builtin is added in the middle of a function scope. */
249
250 static inline tree
def_builtin(HOST_WIDE_INT mask,HOST_WIDE_INT mask2,const char * name,enum ix86_builtin_func_type tcode,enum ix86_builtins code)251 def_builtin (HOST_WIDE_INT mask, HOST_WIDE_INT mask2,
252 const char *name,
253 enum ix86_builtin_func_type tcode,
254 enum ix86_builtins code)
255 {
256 tree decl = NULL_TREE;
257
258 /* An instruction may be 64bit only regardless of ISAs. */
259 if (!(mask & OPTION_MASK_ISA_64BIT) || TARGET_64BIT)
260 {
261 ix86_builtins_isa[(int) code].isa = mask;
262 ix86_builtins_isa[(int) code].isa2 = mask2;
263
264 mask &= ~OPTION_MASK_ISA_64BIT;
265
266 /* Filter out the masks most often ored together with others. */
267 if ((mask & ix86_isa_flags & OPTION_MASK_ISA_AVX512VL)
268 && mask != OPTION_MASK_ISA_AVX512VL)
269 mask &= ~OPTION_MASK_ISA_AVX512VL;
270 if ((mask & ix86_isa_flags & OPTION_MASK_ISA_AVX512BW)
271 && mask != OPTION_MASK_ISA_AVX512BW)
272 mask &= ~OPTION_MASK_ISA_AVX512BW;
273
274 if (((mask2 == 0 || (mask2 & ix86_isa_flags2) != 0)
275 && (mask == 0 || (mask & ix86_isa_flags) != 0))
276 || ((mask & OPTION_MASK_ISA_MMX) != 0 && TARGET_MMX_WITH_SSE)
277 /* "Unified" builtin used by either AVXVNNI intrinsics or AVX512VNNIVL
278 non-mask intrinsics should be defined whenever avxvnni
279 or avx512vnni && avx512vl exist. */
280 || (mask2 == OPTION_MASK_ISA2_AVXVNNI)
281 || (lang_hooks.builtin_function
282 == lang_hooks.builtin_function_ext_scope))
283 {
284 tree type = ix86_get_builtin_func_type (tcode);
285 decl = add_builtin_function (name, type, code, BUILT_IN_MD,
286 NULL, NULL_TREE);
287 ix86_builtins[(int) code] = decl;
288 ix86_builtins_isa[(int) code].set_and_not_built_p = false;
289 }
290 else
291 {
292 /* Just MASK and MASK2 where set_and_not_built_p == true can potentially
293 include a builtin. */
294 deferred_isa_values |= mask;
295 deferred_isa_values2 |= mask2;
296 ix86_builtins[(int) code] = NULL_TREE;
297 ix86_builtins_isa[(int) code].tcode = tcode;
298 ix86_builtins_isa[(int) code].name = name;
299 ix86_builtins_isa[(int) code].const_p = false;
300 ix86_builtins_isa[(int) code].pure_p = false;
301 ix86_builtins_isa[(int) code].set_and_not_built_p = true;
302 }
303 }
304
305 return decl;
306 }
307
308 /* Like def_builtin, but also marks the function decl "const". */
309
310 static inline tree
def_builtin_const(HOST_WIDE_INT mask,HOST_WIDE_INT mask2,const char * name,enum ix86_builtin_func_type tcode,enum ix86_builtins code)311 def_builtin_const (HOST_WIDE_INT mask, HOST_WIDE_INT mask2, const char *name,
312 enum ix86_builtin_func_type tcode, enum ix86_builtins code)
313 {
314 tree decl = def_builtin (mask, mask2, name, tcode, code);
315 if (decl)
316 TREE_READONLY (decl) = 1;
317 else
318 ix86_builtins_isa[(int) code].const_p = true;
319
320 return decl;
321 }
322
323 /* Like def_builtin, but also marks the function decl "pure". */
324
325 static inline tree
def_builtin_pure(HOST_WIDE_INT mask,HOST_WIDE_INT mask2,const char * name,enum ix86_builtin_func_type tcode,enum ix86_builtins code)326 def_builtin_pure (HOST_WIDE_INT mask, HOST_WIDE_INT mask2, const char *name,
327 enum ix86_builtin_func_type tcode, enum ix86_builtins code)
328 {
329 tree decl = def_builtin (mask, mask2, name, tcode, code);
330 if (decl)
331 DECL_PURE_P (decl) = 1;
332 else
333 ix86_builtins_isa[(int) code].pure_p = true;
334
335 return decl;
336 }
337
338 /* Add any new builtin functions for a given ISA that may not have been
339 declared. This saves a bit of space compared to adding all of the
340 declarations to the tree, even if we didn't use them. */
341
342 void
ix86_add_new_builtins(HOST_WIDE_INT isa,HOST_WIDE_INT isa2)343 ix86_add_new_builtins (HOST_WIDE_INT isa, HOST_WIDE_INT isa2)
344 {
345 isa &= ~OPTION_MASK_ISA_64BIT;
346
347 if ((isa & deferred_isa_values) == 0
348 && (isa2 & deferred_isa_values2) == 0
349 && ((deferred_isa_values & OPTION_MASK_ISA_MMX) == 0
350 || !(TARGET_64BIT && (isa & OPTION_MASK_ISA_SSE2) != 0)))
351 return;
352
353 /* Bits in ISA value can be removed from potential isa values. */
354 deferred_isa_values &= ~isa;
355 deferred_isa_values2 &= ~isa2;
356 if (TARGET_64BIT && (isa & OPTION_MASK_ISA_SSE2) != 0)
357 deferred_isa_values &= ~OPTION_MASK_ISA_MMX;
358
359 int i;
360 tree saved_current_target_pragma = current_target_pragma;
361 current_target_pragma = NULL_TREE;
362
363 for (i = 0; i < (int)IX86_BUILTIN_MAX; i++)
364 {
365 if (((ix86_builtins_isa[i].isa & isa) != 0
366 || (ix86_builtins_isa[i].isa2 & isa2) != 0
367 || ((ix86_builtins_isa[i].isa & OPTION_MASK_ISA_MMX) != 0
368 && TARGET_64BIT
369 && (isa & OPTION_MASK_ISA_SSE2) != 0))
370 && ix86_builtins_isa[i].set_and_not_built_p)
371 {
372 tree decl, type;
373
374 /* Don't define the builtin again. */
375 ix86_builtins_isa[i].set_and_not_built_p = false;
376
377 type = ix86_get_builtin_func_type (ix86_builtins_isa[i].tcode);
378 decl = add_builtin_function_ext_scope (ix86_builtins_isa[i].name,
379 type, i, BUILT_IN_MD, NULL,
380 NULL_TREE);
381
382 ix86_builtins[i] = decl;
383 if (ix86_builtins_isa[i].const_p)
384 TREE_READONLY (decl) = 1;
385 }
386 }
387
388 current_target_pragma = saved_current_target_pragma;
389 }
390
391 /* TM vector builtins. */
392
393 /* Reuse the existing x86-specific `struct builtin_description' cause
394 we're lazy. Add casts to make them fit. */
395 static const struct builtin_description bdesc_tm[] =
396 {
397 { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_WM64", (enum ix86_builtins) BUILT_IN_TM_STORE_M64, UNKNOWN, VOID_FTYPE_PV2SI_V2SI },
398 { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_WaRM64", (enum ix86_builtins) BUILT_IN_TM_STORE_WAR_M64, UNKNOWN, VOID_FTYPE_PV2SI_V2SI },
399 { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_WaWM64", (enum ix86_builtins) BUILT_IN_TM_STORE_WAW_M64, UNKNOWN, VOID_FTYPE_PV2SI_V2SI },
400 { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_RM64", (enum ix86_builtins) BUILT_IN_TM_LOAD_M64, UNKNOWN, V2SI_FTYPE_PCV2SI },
401 { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_RaRM64", (enum ix86_builtins) BUILT_IN_TM_LOAD_RAR_M64, UNKNOWN, V2SI_FTYPE_PCV2SI },
402 { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_RaWM64", (enum ix86_builtins) BUILT_IN_TM_LOAD_RAW_M64, UNKNOWN, V2SI_FTYPE_PCV2SI },
403 { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_RfWM64", (enum ix86_builtins) BUILT_IN_TM_LOAD_RFW_M64, UNKNOWN, V2SI_FTYPE_PCV2SI },
404
405 { OPTION_MASK_ISA_SSE, 0, CODE_FOR_nothing, "__builtin__ITM_WM128", (enum ix86_builtins) BUILT_IN_TM_STORE_M128, UNKNOWN, VOID_FTYPE_PV4SF_V4SF },
406 { OPTION_MASK_ISA_SSE, 0, CODE_FOR_nothing, "__builtin__ITM_WaRM128", (enum ix86_builtins) BUILT_IN_TM_STORE_WAR_M128, UNKNOWN, VOID_FTYPE_PV4SF_V4SF },
407 { OPTION_MASK_ISA_SSE, 0, CODE_FOR_nothing, "__builtin__ITM_WaWM128", (enum ix86_builtins) BUILT_IN_TM_STORE_WAW_M128, UNKNOWN, VOID_FTYPE_PV4SF_V4SF },
408 { OPTION_MASK_ISA_SSE, 0, CODE_FOR_nothing, "__builtin__ITM_RM128", (enum ix86_builtins) BUILT_IN_TM_LOAD_M128, UNKNOWN, V4SF_FTYPE_PCV4SF },
409 { OPTION_MASK_ISA_SSE, 0, CODE_FOR_nothing, "__builtin__ITM_RaRM128", (enum ix86_builtins) BUILT_IN_TM_LOAD_RAR_M128, UNKNOWN, V4SF_FTYPE_PCV4SF },
410 { OPTION_MASK_ISA_SSE, 0, CODE_FOR_nothing, "__builtin__ITM_RaWM128", (enum ix86_builtins) BUILT_IN_TM_LOAD_RAW_M128, UNKNOWN, V4SF_FTYPE_PCV4SF },
411 { OPTION_MASK_ISA_SSE, 0, CODE_FOR_nothing, "__builtin__ITM_RfWM128", (enum ix86_builtins) BUILT_IN_TM_LOAD_RFW_M128, UNKNOWN, V4SF_FTYPE_PCV4SF },
412
413 { OPTION_MASK_ISA_AVX, 0, CODE_FOR_nothing, "__builtin__ITM_WM256", (enum ix86_builtins) BUILT_IN_TM_STORE_M256, UNKNOWN, VOID_FTYPE_PV8SF_V8SF },
414 { OPTION_MASK_ISA_AVX, 0, CODE_FOR_nothing, "__builtin__ITM_WaRM256", (enum ix86_builtins) BUILT_IN_TM_STORE_WAR_M256, UNKNOWN, VOID_FTYPE_PV8SF_V8SF },
415 { OPTION_MASK_ISA_AVX, 0, CODE_FOR_nothing, "__builtin__ITM_WaWM256", (enum ix86_builtins) BUILT_IN_TM_STORE_WAW_M256, UNKNOWN, VOID_FTYPE_PV8SF_V8SF },
416 { OPTION_MASK_ISA_AVX, 0, CODE_FOR_nothing, "__builtin__ITM_RM256", (enum ix86_builtins) BUILT_IN_TM_LOAD_M256, UNKNOWN, V8SF_FTYPE_PCV8SF },
417 { OPTION_MASK_ISA_AVX, 0, CODE_FOR_nothing, "__builtin__ITM_RaRM256", (enum ix86_builtins) BUILT_IN_TM_LOAD_RAR_M256, UNKNOWN, V8SF_FTYPE_PCV8SF },
418 { OPTION_MASK_ISA_AVX, 0, CODE_FOR_nothing, "__builtin__ITM_RaWM256", (enum ix86_builtins) BUILT_IN_TM_LOAD_RAW_M256, UNKNOWN, V8SF_FTYPE_PCV8SF },
419 { OPTION_MASK_ISA_AVX, 0, CODE_FOR_nothing, "__builtin__ITM_RfWM256", (enum ix86_builtins) BUILT_IN_TM_LOAD_RFW_M256, UNKNOWN, V8SF_FTYPE_PCV8SF },
420
421 { OPTION_MASK_ISA_MMX, 0, CODE_FOR_nothing, "__builtin__ITM_LM64", (enum ix86_builtins) BUILT_IN_TM_LOG_M64, UNKNOWN, VOID_FTYPE_PCVOID },
422 { OPTION_MASK_ISA_SSE, 0, CODE_FOR_nothing, "__builtin__ITM_LM128", (enum ix86_builtins) BUILT_IN_TM_LOG_M128, UNKNOWN, VOID_FTYPE_PCVOID },
423 { OPTION_MASK_ISA_AVX, 0, CODE_FOR_nothing, "__builtin__ITM_LM256", (enum ix86_builtins) BUILT_IN_TM_LOG_M256, UNKNOWN, VOID_FTYPE_PCVOID },
424 };
425
426 /* Initialize the transactional memory vector load/store builtins. */
427
428 static void
ix86_init_tm_builtins(void)429 ix86_init_tm_builtins (void)
430 {
431 enum ix86_builtin_func_type ftype;
432 const struct builtin_description *d;
433 size_t i;
434 tree decl;
435 tree attrs_load, attrs_type_load, attrs_store, attrs_type_store;
436 tree attrs_log, attrs_type_log;
437
438 if (!flag_tm)
439 return;
440
441 /* If there are no builtins defined, we must be compiling in a
442 language without trans-mem support. */
443 if (!builtin_decl_explicit_p (BUILT_IN_TM_LOAD_1))
444 return;
445
446 /* Use whatever attributes a normal TM load has. */
447 decl = builtin_decl_explicit (BUILT_IN_TM_LOAD_1);
448 attrs_load = DECL_ATTRIBUTES (decl);
449 attrs_type_load = TYPE_ATTRIBUTES (TREE_TYPE (decl));
450 /* Use whatever attributes a normal TM store has. */
451 decl = builtin_decl_explicit (BUILT_IN_TM_STORE_1);
452 attrs_store = DECL_ATTRIBUTES (decl);
453 attrs_type_store = TYPE_ATTRIBUTES (TREE_TYPE (decl));
454 /* Use whatever attributes a normal TM log has. */
455 decl = builtin_decl_explicit (BUILT_IN_TM_LOG);
456 attrs_log = DECL_ATTRIBUTES (decl);
457 attrs_type_log = TYPE_ATTRIBUTES (TREE_TYPE (decl));
458
459 for (i = 0, d = bdesc_tm;
460 i < ARRAY_SIZE (bdesc_tm);
461 i++, d++)
462 {
463 if ((d->mask & ix86_isa_flags) != 0
464 || ((d->mask & OPTION_MASK_ISA_MMX) != 0 && TARGET_MMX_WITH_SSE)
465 || (lang_hooks.builtin_function
466 == lang_hooks.builtin_function_ext_scope))
467 {
468 tree type, attrs, attrs_type;
469 enum built_in_function code = (enum built_in_function) d->code;
470
471 ftype = (enum ix86_builtin_func_type) d->flag;
472 type = ix86_get_builtin_func_type (ftype);
473
474 if (BUILTIN_TM_LOAD_P (code))
475 {
476 attrs = attrs_load;
477 attrs_type = attrs_type_load;
478 }
479 else if (BUILTIN_TM_STORE_P (code))
480 {
481 attrs = attrs_store;
482 attrs_type = attrs_type_store;
483 }
484 else
485 {
486 attrs = attrs_log;
487 attrs_type = attrs_type_log;
488 }
489 decl = add_builtin_function (d->name, type, code, BUILT_IN_NORMAL,
490 /* The builtin without the prefix for
491 calling it directly. */
492 d->name + strlen ("__builtin_"),
493 attrs);
494 /* add_builtin_function() will set the DECL_ATTRIBUTES, now
495 set the TYPE_ATTRIBUTES. */
496 decl_attributes (&TREE_TYPE (decl), attrs_type, ATTR_FLAG_BUILT_IN);
497
498 set_builtin_decl (code, decl, false);
499 }
500 }
501 }
502
503 /* Set up all the MMX/SSE builtins, even builtins for instructions that are not
504 in the current target ISA to allow the user to compile particular modules
505 with different target specific options that differ from the command line
506 options. */
507 static void
ix86_init_mmx_sse_builtins(void)508 ix86_init_mmx_sse_builtins (void)
509 {
510 const struct builtin_description * d;
511 enum ix86_builtin_func_type ftype;
512 size_t i;
513
514 /* Add all special builtins with variable number of operands. */
515 for (i = 0, d = bdesc_special_args;
516 i < ARRAY_SIZE (bdesc_special_args);
517 i++, d++)
518 {
519 BDESC_VERIFY (d->code, IX86_BUILTIN__BDESC_SPECIAL_ARGS_FIRST, i);
520 if (d->name == 0)
521 continue;
522
523 ftype = (enum ix86_builtin_func_type) d->flag;
524 def_builtin (d->mask, d->mask2, d->name, ftype, d->code);
525 }
526 BDESC_VERIFYS (IX86_BUILTIN__BDESC_SPECIAL_ARGS_LAST,
527 IX86_BUILTIN__BDESC_SPECIAL_ARGS_FIRST,
528 ARRAY_SIZE (bdesc_special_args) - 1);
529
530 /* Add all builtins with variable number of operands. */
531 for (i = 0, d = bdesc_args;
532 i < ARRAY_SIZE (bdesc_args);
533 i++, d++)
534 {
535 BDESC_VERIFY (d->code, IX86_BUILTIN__BDESC_ARGS_FIRST, i);
536 if (d->name == 0)
537 continue;
538
539 ftype = (enum ix86_builtin_func_type) d->flag;
540 def_builtin_const (d->mask, d->mask2, d->name, ftype, d->code);
541 }
542 BDESC_VERIFYS (IX86_BUILTIN__BDESC_ARGS_LAST,
543 IX86_BUILTIN__BDESC_ARGS_FIRST,
544 ARRAY_SIZE (bdesc_args) - 1);
545
546 /* Add all builtins with rounding. */
547 for (i = 0, d = bdesc_round_args;
548 i < ARRAY_SIZE (bdesc_round_args);
549 i++, d++)
550 {
551 BDESC_VERIFY (d->code, IX86_BUILTIN__BDESC_ROUND_ARGS_FIRST, i);
552 if (d->name == 0)
553 continue;
554
555 ftype = (enum ix86_builtin_func_type) d->flag;
556 def_builtin_const (d->mask, d->mask2, d->name, ftype, d->code);
557 }
558 BDESC_VERIFYS (IX86_BUILTIN__BDESC_ROUND_ARGS_LAST,
559 IX86_BUILTIN__BDESC_ROUND_ARGS_FIRST,
560 ARRAY_SIZE (bdesc_round_args) - 1);
561
562 /* pcmpestr[im] insns. */
563 for (i = 0, d = bdesc_pcmpestr;
564 i < ARRAY_SIZE (bdesc_pcmpestr);
565 i++, d++)
566 {
567 BDESC_VERIFY (d->code, IX86_BUILTIN__BDESC_PCMPESTR_FIRST, i);
568 if (d->code == IX86_BUILTIN_PCMPESTRM128)
569 ftype = V16QI_FTYPE_V16QI_INT_V16QI_INT_INT;
570 else
571 ftype = INT_FTYPE_V16QI_INT_V16QI_INT_INT;
572 def_builtin_const (d->mask, d->mask2, d->name, ftype, d->code);
573 }
574 BDESC_VERIFYS (IX86_BUILTIN__BDESC_PCMPESTR_LAST,
575 IX86_BUILTIN__BDESC_PCMPESTR_FIRST,
576 ARRAY_SIZE (bdesc_pcmpestr) - 1);
577
578 /* pcmpistr[im] insns. */
579 for (i = 0, d = bdesc_pcmpistr;
580 i < ARRAY_SIZE (bdesc_pcmpistr);
581 i++, d++)
582 {
583 BDESC_VERIFY (d->code, IX86_BUILTIN__BDESC_PCMPISTR_FIRST, i);
584 if (d->code == IX86_BUILTIN_PCMPISTRM128)
585 ftype = V16QI_FTYPE_V16QI_V16QI_INT;
586 else
587 ftype = INT_FTYPE_V16QI_V16QI_INT;
588 def_builtin_const (d->mask, d->mask2, d->name, ftype, d->code);
589 }
590 BDESC_VERIFYS (IX86_BUILTIN__BDESC_PCMPISTR_LAST,
591 IX86_BUILTIN__BDESC_PCMPISTR_FIRST,
592 ARRAY_SIZE (bdesc_pcmpistr) - 1);
593
594 /* comi/ucomi insns. */
595 for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
596 {
597 BDESC_VERIFY (d->code, IX86_BUILTIN__BDESC_COMI_FIRST, i);
598 if (d->mask == OPTION_MASK_ISA_SSE2)
599 ftype = INT_FTYPE_V2DF_V2DF;
600 else
601 ftype = INT_FTYPE_V4SF_V4SF;
602 def_builtin_const (d->mask, d->mask2, d->name, ftype, d->code);
603 }
604 BDESC_VERIFYS (IX86_BUILTIN__BDESC_COMI_LAST,
605 IX86_BUILTIN__BDESC_COMI_FIRST,
606 ARRAY_SIZE (bdesc_comi) - 1);
607
608 /* SSE */
609 def_builtin (OPTION_MASK_ISA_SSE, 0, "__builtin_ia32_ldmxcsr",
610 VOID_FTYPE_UNSIGNED, IX86_BUILTIN_LDMXCSR);
611 def_builtin_pure (OPTION_MASK_ISA_SSE, 0, "__builtin_ia32_stmxcsr",
612 UNSIGNED_FTYPE_VOID, IX86_BUILTIN_STMXCSR);
613
614 /* SSE or 3DNow!A */
615 def_builtin (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A
616 /* As it uses V4HImode, we have to require -mmmx too. */
617 | OPTION_MASK_ISA_MMX, 0,
618 "__builtin_ia32_maskmovq", VOID_FTYPE_V8QI_V8QI_PCHAR,
619 IX86_BUILTIN_MASKMOVQ);
620
621 /* SSE2 */
622 def_builtin (OPTION_MASK_ISA_SSE2, 0, "__builtin_ia32_maskmovdqu",
623 VOID_FTYPE_V16QI_V16QI_PCHAR, IX86_BUILTIN_MASKMOVDQU);
624
625 def_builtin (OPTION_MASK_ISA_SSE2, 0, "__builtin_ia32_clflush",
626 VOID_FTYPE_PCVOID, IX86_BUILTIN_CLFLUSH);
627 x86_mfence = def_builtin (OPTION_MASK_ISA_SSE2, 0, "__builtin_ia32_mfence",
628 VOID_FTYPE_VOID, IX86_BUILTIN_MFENCE);
629
630 /* SSE3. */
631 def_builtin (OPTION_MASK_ISA_SSE3, 0, "__builtin_ia32_monitor",
632 VOID_FTYPE_PCVOID_UNSIGNED_UNSIGNED, IX86_BUILTIN_MONITOR);
633 def_builtin (OPTION_MASK_ISA_SSE3, 0, "__builtin_ia32_mwait",
634 VOID_FTYPE_UNSIGNED_UNSIGNED, IX86_BUILTIN_MWAIT);
635
636 /* AES */
637 def_builtin_const (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2, 0,
638 "__builtin_ia32_aesenc128",
639 V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESENC128);
640 def_builtin_const (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2, 0,
641 "__builtin_ia32_aesenclast128",
642 V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESENCLAST128);
643 def_builtin_const (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2, 0,
644 "__builtin_ia32_aesdec128",
645 V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESDEC128);
646 def_builtin_const (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2, 0,
647 "__builtin_ia32_aesdeclast128",
648 V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESDECLAST128);
649 def_builtin_const (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2, 0,
650 "__builtin_ia32_aesimc128",
651 V2DI_FTYPE_V2DI, IX86_BUILTIN_AESIMC128);
652 def_builtin_const (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2, 0,
653 "__builtin_ia32_aeskeygenassist128",
654 V2DI_FTYPE_V2DI_INT, IX86_BUILTIN_AESKEYGENASSIST128);
655
656 /* PCLMUL */
657 def_builtin_const (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2, 0,
658 "__builtin_ia32_pclmulqdq128",
659 V2DI_FTYPE_V2DI_V2DI_INT, IX86_BUILTIN_PCLMULQDQ128);
660
661 /* RDRND */
662 def_builtin (OPTION_MASK_ISA_RDRND, 0, "__builtin_ia32_rdrand16_step",
663 INT_FTYPE_PUSHORT, IX86_BUILTIN_RDRAND16_STEP);
664 def_builtin (OPTION_MASK_ISA_RDRND, 0, "__builtin_ia32_rdrand32_step",
665 INT_FTYPE_PUNSIGNED, IX86_BUILTIN_RDRAND32_STEP);
666 def_builtin (OPTION_MASK_ISA_RDRND | OPTION_MASK_ISA_64BIT, 0,
667 "__builtin_ia32_rdrand64_step", INT_FTYPE_PULONGLONG,
668 IX86_BUILTIN_RDRAND64_STEP);
669
670 /* AVX2 */
671 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gathersiv2df",
672 V2DF_FTYPE_V2DF_PCDOUBLE_V4SI_V2DF_INT,
673 IX86_BUILTIN_GATHERSIV2DF);
674
675 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gathersiv4df",
676 V4DF_FTYPE_V4DF_PCDOUBLE_V4SI_V4DF_INT,
677 IX86_BUILTIN_GATHERSIV4DF);
678
679 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gatherdiv2df",
680 V2DF_FTYPE_V2DF_PCDOUBLE_V2DI_V2DF_INT,
681 IX86_BUILTIN_GATHERDIV2DF);
682
683 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gatherdiv4df",
684 V4DF_FTYPE_V4DF_PCDOUBLE_V4DI_V4DF_INT,
685 IX86_BUILTIN_GATHERDIV4DF);
686
687 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gathersiv4sf",
688 V4SF_FTYPE_V4SF_PCFLOAT_V4SI_V4SF_INT,
689 IX86_BUILTIN_GATHERSIV4SF);
690
691 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gathersiv8sf",
692 V8SF_FTYPE_V8SF_PCFLOAT_V8SI_V8SF_INT,
693 IX86_BUILTIN_GATHERSIV8SF);
694
695 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gatherdiv4sf",
696 V4SF_FTYPE_V4SF_PCFLOAT_V2DI_V4SF_INT,
697 IX86_BUILTIN_GATHERDIV4SF);
698
699 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gatherdiv4sf256",
700 V4SF_FTYPE_V4SF_PCFLOAT_V4DI_V4SF_INT,
701 IX86_BUILTIN_GATHERDIV8SF);
702
703 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gathersiv2di",
704 V2DI_FTYPE_V2DI_PCINT64_V4SI_V2DI_INT,
705 IX86_BUILTIN_GATHERSIV2DI);
706
707 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gathersiv4di",
708 V4DI_FTYPE_V4DI_PCINT64_V4SI_V4DI_INT,
709 IX86_BUILTIN_GATHERSIV4DI);
710
711 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gatherdiv2di",
712 V2DI_FTYPE_V2DI_PCINT64_V2DI_V2DI_INT,
713 IX86_BUILTIN_GATHERDIV2DI);
714
715 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gatherdiv4di",
716 V4DI_FTYPE_V4DI_PCINT64_V4DI_V4DI_INT,
717 IX86_BUILTIN_GATHERDIV4DI);
718
719 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gathersiv4si",
720 V4SI_FTYPE_V4SI_PCINT_V4SI_V4SI_INT,
721 IX86_BUILTIN_GATHERSIV4SI);
722
723 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gathersiv8si",
724 V8SI_FTYPE_V8SI_PCINT_V8SI_V8SI_INT,
725 IX86_BUILTIN_GATHERSIV8SI);
726
727 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gatherdiv4si",
728 V4SI_FTYPE_V4SI_PCINT_V2DI_V4SI_INT,
729 IX86_BUILTIN_GATHERDIV4SI);
730
731 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gatherdiv4si256",
732 V4SI_FTYPE_V4SI_PCINT_V4DI_V4SI_INT,
733 IX86_BUILTIN_GATHERDIV8SI);
734
735 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gatheraltsiv4df ",
736 V4DF_FTYPE_V4DF_PCDOUBLE_V8SI_V4DF_INT,
737 IX86_BUILTIN_GATHERALTSIV4DF);
738
739 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gatheraltdiv8sf ",
740 V8SF_FTYPE_V8SF_PCFLOAT_V4DI_V8SF_INT,
741 IX86_BUILTIN_GATHERALTDIV8SF);
742
743 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gatheraltsiv4di ",
744 V4DI_FTYPE_V4DI_PCINT64_V8SI_V4DI_INT,
745 IX86_BUILTIN_GATHERALTSIV4DI);
746
747 def_builtin_pure (OPTION_MASK_ISA_AVX2, 0, "__builtin_ia32_gatheraltdiv8si ",
748 V8SI_FTYPE_V8SI_PCINT_V4DI_V8SI_INT,
749 IX86_BUILTIN_GATHERALTDIV8SI);
750
751 /* AVX512F */
752 def_builtin_pure (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_gathersiv16sf",
753 V16SF_FTYPE_V16SF_PCVOID_V16SI_HI_INT,
754 IX86_BUILTIN_GATHER3SIV16SF);
755
756 def_builtin_pure (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_gathersiv8df",
757 V8DF_FTYPE_V8DF_PCVOID_V8SI_QI_INT,
758 IX86_BUILTIN_GATHER3SIV8DF);
759
760 def_builtin_pure (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_gatherdiv16sf",
761 V8SF_FTYPE_V8SF_PCVOID_V8DI_QI_INT,
762 IX86_BUILTIN_GATHER3DIV16SF);
763
764 def_builtin_pure (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_gatherdiv8df",
765 V8DF_FTYPE_V8DF_PCVOID_V8DI_QI_INT,
766 IX86_BUILTIN_GATHER3DIV8DF);
767
768 def_builtin_pure (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_gathersiv16si",
769 V16SI_FTYPE_V16SI_PCVOID_V16SI_HI_INT,
770 IX86_BUILTIN_GATHER3SIV16SI);
771
772 def_builtin_pure (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_gathersiv8di",
773 V8DI_FTYPE_V8DI_PCVOID_V8SI_QI_INT,
774 IX86_BUILTIN_GATHER3SIV8DI);
775
776 def_builtin_pure (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_gatherdiv16si",
777 V8SI_FTYPE_V8SI_PCVOID_V8DI_QI_INT,
778 IX86_BUILTIN_GATHER3DIV16SI);
779
780 def_builtin_pure (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_gatherdiv8di",
781 V8DI_FTYPE_V8DI_PCVOID_V8DI_QI_INT,
782 IX86_BUILTIN_GATHER3DIV8DI);
783
784 def_builtin_pure (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_gather3altsiv8df ",
785 V8DF_FTYPE_V8DF_PCDOUBLE_V16SI_QI_INT,
786 IX86_BUILTIN_GATHER3ALTSIV8DF);
787
788 def_builtin_pure (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_gather3altdiv16sf ",
789 V16SF_FTYPE_V16SF_PCFLOAT_V8DI_HI_INT,
790 IX86_BUILTIN_GATHER3ALTDIV16SF);
791
792 def_builtin_pure (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_gather3altsiv8di ",
793 V8DI_FTYPE_V8DI_PCINT64_V16SI_QI_INT,
794 IX86_BUILTIN_GATHER3ALTSIV8DI);
795
796 def_builtin_pure (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_gather3altdiv16si ",
797 V16SI_FTYPE_V16SI_PCINT_V8DI_HI_INT,
798 IX86_BUILTIN_GATHER3ALTDIV16SI);
799
800 def_builtin (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_scattersiv16sf",
801 VOID_FTYPE_PVOID_HI_V16SI_V16SF_INT,
802 IX86_BUILTIN_SCATTERSIV16SF);
803
804 def_builtin (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_scattersiv8df",
805 VOID_FTYPE_PVOID_QI_V8SI_V8DF_INT,
806 IX86_BUILTIN_SCATTERSIV8DF);
807
808 def_builtin (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_scatterdiv16sf",
809 VOID_FTYPE_PVOID_QI_V8DI_V8SF_INT,
810 IX86_BUILTIN_SCATTERDIV16SF);
811
812 def_builtin (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_scatterdiv8df",
813 VOID_FTYPE_PVOID_QI_V8DI_V8DF_INT,
814 IX86_BUILTIN_SCATTERDIV8DF);
815
816 def_builtin (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_scattersiv16si",
817 VOID_FTYPE_PVOID_HI_V16SI_V16SI_INT,
818 IX86_BUILTIN_SCATTERSIV16SI);
819
820 def_builtin (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_scattersiv8di",
821 VOID_FTYPE_PVOID_QI_V8SI_V8DI_INT,
822 IX86_BUILTIN_SCATTERSIV8DI);
823
824 def_builtin (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_scatterdiv16si",
825 VOID_FTYPE_PVOID_QI_V8DI_V8SI_INT,
826 IX86_BUILTIN_SCATTERDIV16SI);
827
828 def_builtin (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_scatterdiv8di",
829 VOID_FTYPE_PVOID_QI_V8DI_V8DI_INT,
830 IX86_BUILTIN_SCATTERDIV8DI);
831
832 /* AVX512VL */
833 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3siv2df",
834 V2DF_FTYPE_V2DF_PCVOID_V4SI_QI_INT,
835 IX86_BUILTIN_GATHER3SIV2DF);
836
837 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3siv4df",
838 V4DF_FTYPE_V4DF_PCVOID_V4SI_QI_INT,
839 IX86_BUILTIN_GATHER3SIV4DF);
840
841 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3div2df",
842 V2DF_FTYPE_V2DF_PCVOID_V2DI_QI_INT,
843 IX86_BUILTIN_GATHER3DIV2DF);
844
845 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3div4df",
846 V4DF_FTYPE_V4DF_PCVOID_V4DI_QI_INT,
847 IX86_BUILTIN_GATHER3DIV4DF);
848
849 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3siv4sf",
850 V4SF_FTYPE_V4SF_PCVOID_V4SI_QI_INT,
851 IX86_BUILTIN_GATHER3SIV4SF);
852
853 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3siv8sf",
854 V8SF_FTYPE_V8SF_PCVOID_V8SI_QI_INT,
855 IX86_BUILTIN_GATHER3SIV8SF);
856
857 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3div4sf",
858 V4SF_FTYPE_V4SF_PCVOID_V2DI_QI_INT,
859 IX86_BUILTIN_GATHER3DIV4SF);
860
861 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3div8sf",
862 V4SF_FTYPE_V4SF_PCVOID_V4DI_QI_INT,
863 IX86_BUILTIN_GATHER3DIV8SF);
864
865 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3siv2di",
866 V2DI_FTYPE_V2DI_PCVOID_V4SI_QI_INT,
867 IX86_BUILTIN_GATHER3SIV2DI);
868
869 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3siv4di",
870 V4DI_FTYPE_V4DI_PCVOID_V4SI_QI_INT,
871 IX86_BUILTIN_GATHER3SIV4DI);
872
873 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3div2di",
874 V2DI_FTYPE_V2DI_PCVOID_V2DI_QI_INT,
875 IX86_BUILTIN_GATHER3DIV2DI);
876
877 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3div4di",
878 V4DI_FTYPE_V4DI_PCVOID_V4DI_QI_INT,
879 IX86_BUILTIN_GATHER3DIV4DI);
880
881 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3siv4si",
882 V4SI_FTYPE_V4SI_PCVOID_V4SI_QI_INT,
883 IX86_BUILTIN_GATHER3SIV4SI);
884
885 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3siv8si",
886 V8SI_FTYPE_V8SI_PCVOID_V8SI_QI_INT,
887 IX86_BUILTIN_GATHER3SIV8SI);
888
889 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3div4si",
890 V4SI_FTYPE_V4SI_PCVOID_V2DI_QI_INT,
891 IX86_BUILTIN_GATHER3DIV4SI);
892
893 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3div8si",
894 V4SI_FTYPE_V4SI_PCVOID_V4DI_QI_INT,
895 IX86_BUILTIN_GATHER3DIV8SI);
896
897 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3altsiv4df ",
898 V4DF_FTYPE_V4DF_PCDOUBLE_V8SI_QI_INT,
899 IX86_BUILTIN_GATHER3ALTSIV4DF);
900
901 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3altdiv8sf ",
902 V8SF_FTYPE_V8SF_PCFLOAT_V4DI_QI_INT,
903 IX86_BUILTIN_GATHER3ALTDIV8SF);
904
905 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3altsiv4di ",
906 V4DI_FTYPE_V4DI_PCINT64_V8SI_QI_INT,
907 IX86_BUILTIN_GATHER3ALTSIV4DI);
908
909 def_builtin_pure (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_gather3altdiv8si ",
910 V8SI_FTYPE_V8SI_PCINT_V4DI_QI_INT,
911 IX86_BUILTIN_GATHER3ALTDIV8SI);
912
913 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scattersiv8sf",
914 VOID_FTYPE_PVOID_QI_V8SI_V8SF_INT,
915 IX86_BUILTIN_SCATTERSIV8SF);
916
917 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scattersiv4sf",
918 VOID_FTYPE_PVOID_QI_V4SI_V4SF_INT,
919 IX86_BUILTIN_SCATTERSIV4SF);
920
921 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scattersiv4df",
922 VOID_FTYPE_PVOID_QI_V4SI_V4DF_INT,
923 IX86_BUILTIN_SCATTERSIV4DF);
924
925 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scattersiv2df",
926 VOID_FTYPE_PVOID_QI_V4SI_V2DF_INT,
927 IX86_BUILTIN_SCATTERSIV2DF);
928
929 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatterdiv8sf",
930 VOID_FTYPE_PVOID_QI_V4DI_V4SF_INT,
931 IX86_BUILTIN_SCATTERDIV8SF);
932
933 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatterdiv4sf",
934 VOID_FTYPE_PVOID_QI_V2DI_V4SF_INT,
935 IX86_BUILTIN_SCATTERDIV4SF);
936
937 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatterdiv4df",
938 VOID_FTYPE_PVOID_QI_V4DI_V4DF_INT,
939 IX86_BUILTIN_SCATTERDIV4DF);
940
941 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatterdiv2df",
942 VOID_FTYPE_PVOID_QI_V2DI_V2DF_INT,
943 IX86_BUILTIN_SCATTERDIV2DF);
944
945 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scattersiv8si",
946 VOID_FTYPE_PVOID_QI_V8SI_V8SI_INT,
947 IX86_BUILTIN_SCATTERSIV8SI);
948
949 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scattersiv4si",
950 VOID_FTYPE_PVOID_QI_V4SI_V4SI_INT,
951 IX86_BUILTIN_SCATTERSIV4SI);
952
953 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scattersiv4di",
954 VOID_FTYPE_PVOID_QI_V4SI_V4DI_INT,
955 IX86_BUILTIN_SCATTERSIV4DI);
956
957 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scattersiv2di",
958 VOID_FTYPE_PVOID_QI_V4SI_V2DI_INT,
959 IX86_BUILTIN_SCATTERSIV2DI);
960
961 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatterdiv8si",
962 VOID_FTYPE_PVOID_QI_V4DI_V4SI_INT,
963 IX86_BUILTIN_SCATTERDIV8SI);
964
965 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatterdiv4si",
966 VOID_FTYPE_PVOID_QI_V2DI_V4SI_INT,
967 IX86_BUILTIN_SCATTERDIV4SI);
968
969 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatterdiv4di",
970 VOID_FTYPE_PVOID_QI_V4DI_V4DI_INT,
971 IX86_BUILTIN_SCATTERDIV4DI);
972
973 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatterdiv2di",
974 VOID_FTYPE_PVOID_QI_V2DI_V2DI_INT,
975 IX86_BUILTIN_SCATTERDIV2DI);
976
977 def_builtin (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_scatteraltsiv8df ",
978 VOID_FTYPE_PDOUBLE_QI_V16SI_V8DF_INT,
979 IX86_BUILTIN_SCATTERALTSIV8DF);
980
981 def_builtin (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_scatteraltdiv16sf ",
982 VOID_FTYPE_PFLOAT_HI_V8DI_V16SF_INT,
983 IX86_BUILTIN_SCATTERALTDIV16SF);
984
985 def_builtin (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_scatteraltsiv8di ",
986 VOID_FTYPE_PLONGLONG_QI_V16SI_V8DI_INT,
987 IX86_BUILTIN_SCATTERALTSIV8DI);
988
989 def_builtin (OPTION_MASK_ISA_AVX512F, 0, "__builtin_ia32_scatteraltdiv16si ",
990 VOID_FTYPE_PINT_HI_V8DI_V16SI_INT,
991 IX86_BUILTIN_SCATTERALTDIV16SI);
992
993 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatteraltsiv4df ",
994 VOID_FTYPE_PDOUBLE_QI_V8SI_V4DF_INT,
995 IX86_BUILTIN_SCATTERALTSIV4DF);
996
997 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatteraltdiv8sf ",
998 VOID_FTYPE_PFLOAT_QI_V4DI_V8SF_INT,
999 IX86_BUILTIN_SCATTERALTDIV8SF);
1000
1001 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatteraltsiv4di ",
1002 VOID_FTYPE_PLONGLONG_QI_V8SI_V4DI_INT,
1003 IX86_BUILTIN_SCATTERALTSIV4DI);
1004
1005 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatteraltdiv8si ",
1006 VOID_FTYPE_PINT_QI_V4DI_V8SI_INT,
1007 IX86_BUILTIN_SCATTERALTDIV8SI);
1008
1009 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatteraltsiv2df ",
1010 VOID_FTYPE_PDOUBLE_QI_V4SI_V2DF_INT,
1011 IX86_BUILTIN_SCATTERALTSIV2DF);
1012
1013 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatteraltdiv4sf ",
1014 VOID_FTYPE_PFLOAT_QI_V2DI_V4SF_INT,
1015 IX86_BUILTIN_SCATTERALTDIV4SF);
1016
1017 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatteraltsiv2di ",
1018 VOID_FTYPE_PLONGLONG_QI_V4SI_V2DI_INT,
1019 IX86_BUILTIN_SCATTERALTSIV2DI);
1020
1021 def_builtin (OPTION_MASK_ISA_AVX512VL, 0, "__builtin_ia32_scatteraltdiv4si ",
1022 VOID_FTYPE_PINT_QI_V2DI_V4SI_INT,
1023 IX86_BUILTIN_SCATTERALTDIV4SI);
1024
1025 /* AVX512PF */
1026 def_builtin (OPTION_MASK_ISA_AVX512PF, 0, "__builtin_ia32_gatherpfdpd",
1027 VOID_FTYPE_QI_V8SI_PCVOID_INT_INT,
1028 IX86_BUILTIN_GATHERPFDPD);
1029 def_builtin (OPTION_MASK_ISA_AVX512PF, 0, "__builtin_ia32_gatherpfdps",
1030 VOID_FTYPE_HI_V16SI_PCVOID_INT_INT,
1031 IX86_BUILTIN_GATHERPFDPS);
1032 def_builtin (OPTION_MASK_ISA_AVX512PF, 0, "__builtin_ia32_gatherpfqpd",
1033 VOID_FTYPE_QI_V8DI_PCVOID_INT_INT,
1034 IX86_BUILTIN_GATHERPFQPD);
1035 def_builtin (OPTION_MASK_ISA_AVX512PF, 0, "__builtin_ia32_gatherpfqps",
1036 VOID_FTYPE_QI_V8DI_PCVOID_INT_INT,
1037 IX86_BUILTIN_GATHERPFQPS);
1038 def_builtin (OPTION_MASK_ISA_AVX512PF, 0, "__builtin_ia32_scatterpfdpd",
1039 VOID_FTYPE_QI_V8SI_PCVOID_INT_INT,
1040 IX86_BUILTIN_SCATTERPFDPD);
1041 def_builtin (OPTION_MASK_ISA_AVX512PF, 0, "__builtin_ia32_scatterpfdps",
1042 VOID_FTYPE_HI_V16SI_PCVOID_INT_INT,
1043 IX86_BUILTIN_SCATTERPFDPS);
1044 def_builtin (OPTION_MASK_ISA_AVX512PF, 0, "__builtin_ia32_scatterpfqpd",
1045 VOID_FTYPE_QI_V8DI_PCVOID_INT_INT,
1046 IX86_BUILTIN_SCATTERPFQPD);
1047 def_builtin (OPTION_MASK_ISA_AVX512PF, 0, "__builtin_ia32_scatterpfqps",
1048 VOID_FTYPE_QI_V8DI_PCVOID_INT_INT,
1049 IX86_BUILTIN_SCATTERPFQPS);
1050
1051 /* SHA */
1052 def_builtin_const (OPTION_MASK_ISA_SHA, 0, "__builtin_ia32_sha1msg1",
1053 V4SI_FTYPE_V4SI_V4SI, IX86_BUILTIN_SHA1MSG1);
1054 def_builtin_const (OPTION_MASK_ISA_SHA, 0, "__builtin_ia32_sha1msg2",
1055 V4SI_FTYPE_V4SI_V4SI, IX86_BUILTIN_SHA1MSG2);
1056 def_builtin_const (OPTION_MASK_ISA_SHA, 0, "__builtin_ia32_sha1nexte",
1057 V4SI_FTYPE_V4SI_V4SI, IX86_BUILTIN_SHA1NEXTE);
1058 def_builtin_const (OPTION_MASK_ISA_SHA, 0, "__builtin_ia32_sha1rnds4",
1059 V4SI_FTYPE_V4SI_V4SI_INT, IX86_BUILTIN_SHA1RNDS4);
1060 def_builtin_const (OPTION_MASK_ISA_SHA, 0, "__builtin_ia32_sha256msg1",
1061 V4SI_FTYPE_V4SI_V4SI, IX86_BUILTIN_SHA256MSG1);
1062 def_builtin_const (OPTION_MASK_ISA_SHA, 0, "__builtin_ia32_sha256msg2",
1063 V4SI_FTYPE_V4SI_V4SI, IX86_BUILTIN_SHA256MSG2);
1064 def_builtin_const (OPTION_MASK_ISA_SHA, 0, "__builtin_ia32_sha256rnds2",
1065 V4SI_FTYPE_V4SI_V4SI_V4SI, IX86_BUILTIN_SHA256RNDS2);
1066
1067 /* RTM. */
1068 def_builtin (OPTION_MASK_ISA_RTM, 0, "__builtin_ia32_xabort",
1069 VOID_FTYPE_UNSIGNED, IX86_BUILTIN_XABORT);
1070
1071 /* MMX access to the vec_init patterns. */
1072 def_builtin_const (OPTION_MASK_ISA_MMX, 0,
1073 "__builtin_ia32_vec_init_v2si",
1074 V2SI_FTYPE_INT_INT, IX86_BUILTIN_VEC_INIT_V2SI);
1075
1076 def_builtin_const (OPTION_MASK_ISA_MMX, 0,
1077 "__builtin_ia32_vec_init_v4hi",
1078 V4HI_FTYPE_HI_HI_HI_HI,
1079 IX86_BUILTIN_VEC_INIT_V4HI);
1080
1081 def_builtin_const (OPTION_MASK_ISA_MMX, 0,
1082 "__builtin_ia32_vec_init_v8qi",
1083 V8QI_FTYPE_QI_QI_QI_QI_QI_QI_QI_QI,
1084 IX86_BUILTIN_VEC_INIT_V8QI);
1085
1086 /* Access to the vec_extract patterns. */
1087 def_builtin_const (OPTION_MASK_ISA_SSE2, 0, "__builtin_ia32_vec_ext_v2df",
1088 DOUBLE_FTYPE_V2DF_INT, IX86_BUILTIN_VEC_EXT_V2DF);
1089 def_builtin_const (OPTION_MASK_ISA_SSE2, 0, "__builtin_ia32_vec_ext_v2di",
1090 DI_FTYPE_V2DI_INT, IX86_BUILTIN_VEC_EXT_V2DI);
1091 def_builtin_const (OPTION_MASK_ISA_SSE, 0, "__builtin_ia32_vec_ext_v4sf",
1092 FLOAT_FTYPE_V4SF_INT, IX86_BUILTIN_VEC_EXT_V4SF);
1093 def_builtin_const (OPTION_MASK_ISA_SSE2, 0, "__builtin_ia32_vec_ext_v4si",
1094 SI_FTYPE_V4SI_INT, IX86_BUILTIN_VEC_EXT_V4SI);
1095 def_builtin_const (OPTION_MASK_ISA_SSE2, 0, "__builtin_ia32_vec_ext_v8hi",
1096 HI_FTYPE_V8HI_INT, IX86_BUILTIN_VEC_EXT_V8HI);
1097
1098 def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A
1099 /* As it uses V4HImode, we have to require -mmmx too. */
1100 | OPTION_MASK_ISA_MMX, 0,
1101 "__builtin_ia32_vec_ext_v4hi",
1102 HI_FTYPE_V4HI_INT, IX86_BUILTIN_VEC_EXT_V4HI);
1103
1104 def_builtin_const (OPTION_MASK_ISA_MMX, 0,
1105 "__builtin_ia32_vec_ext_v2si",
1106 SI_FTYPE_V2SI_INT, IX86_BUILTIN_VEC_EXT_V2SI);
1107
1108 def_builtin_const (OPTION_MASK_ISA_SSE2, 0, "__builtin_ia32_vec_ext_v16qi",
1109 QI_FTYPE_V16QI_INT, IX86_BUILTIN_VEC_EXT_V16QI);
1110
1111 /* Access to the vec_set patterns. */
1112 def_builtin_const (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_64BIT, 0,
1113 "__builtin_ia32_vec_set_v2di",
1114 V2DI_FTYPE_V2DI_DI_INT, IX86_BUILTIN_VEC_SET_V2DI);
1115
1116 def_builtin_const (OPTION_MASK_ISA_SSE4_1, 0, "__builtin_ia32_vec_set_v4sf",
1117 V4SF_FTYPE_V4SF_FLOAT_INT, IX86_BUILTIN_VEC_SET_V4SF);
1118
1119 def_builtin_const (OPTION_MASK_ISA_SSE4_1, 0, "__builtin_ia32_vec_set_v4si",
1120 V4SI_FTYPE_V4SI_SI_INT, IX86_BUILTIN_VEC_SET_V4SI);
1121
1122 def_builtin_const (OPTION_MASK_ISA_SSE2, 0, "__builtin_ia32_vec_set_v8hi",
1123 V8HI_FTYPE_V8HI_HI_INT, IX86_BUILTIN_VEC_SET_V8HI);
1124
1125 def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A
1126 /* As it uses V4HImode, we have to require -mmmx too. */
1127 | OPTION_MASK_ISA_MMX, 0,
1128 "__builtin_ia32_vec_set_v4hi",
1129 V4HI_FTYPE_V4HI_HI_INT, IX86_BUILTIN_VEC_SET_V4HI);
1130
1131 def_builtin_const (OPTION_MASK_ISA_SSE4_1, 0, "__builtin_ia32_vec_set_v16qi",
1132 V16QI_FTYPE_V16QI_QI_INT, IX86_BUILTIN_VEC_SET_V16QI);
1133
1134 /* RDSEED */
1135 def_builtin (OPTION_MASK_ISA_RDSEED, 0, "__builtin_ia32_rdseed_hi_step",
1136 INT_FTYPE_PUSHORT, IX86_BUILTIN_RDSEED16_STEP);
1137 def_builtin (OPTION_MASK_ISA_RDSEED, 0, "__builtin_ia32_rdseed_si_step",
1138 INT_FTYPE_PUNSIGNED, IX86_BUILTIN_RDSEED32_STEP);
1139 def_builtin (OPTION_MASK_ISA_RDSEED | OPTION_MASK_ISA_64BIT, 0,
1140 "__builtin_ia32_rdseed_di_step",
1141 INT_FTYPE_PULONGLONG, IX86_BUILTIN_RDSEED64_STEP);
1142
1143 /* ADCX */
1144 def_builtin (0, 0, "__builtin_ia32_addcarryx_u32",
1145 UCHAR_FTYPE_UCHAR_UINT_UINT_PUNSIGNED, IX86_BUILTIN_ADDCARRYX32);
1146 def_builtin (OPTION_MASK_ISA_64BIT, 0,
1147 "__builtin_ia32_addcarryx_u64",
1148 UCHAR_FTYPE_UCHAR_ULONGLONG_ULONGLONG_PULONGLONG,
1149 IX86_BUILTIN_ADDCARRYX64);
1150
1151 /* SBB */
1152 def_builtin (0, 0, "__builtin_ia32_sbb_u32",
1153 UCHAR_FTYPE_UCHAR_UINT_UINT_PUNSIGNED, IX86_BUILTIN_SBB32);
1154 def_builtin (OPTION_MASK_ISA_64BIT, 0,
1155 "__builtin_ia32_sbb_u64",
1156 UCHAR_FTYPE_UCHAR_ULONGLONG_ULONGLONG_PULONGLONG,
1157 IX86_BUILTIN_SBB64);
1158
1159 /* Read/write FLAGS. */
1160 if (TARGET_64BIT)
1161 {
1162 def_builtin (OPTION_MASK_ISA_64BIT, 0, "__builtin_ia32_readeflags_u64",
1163 UINT64_FTYPE_VOID, IX86_BUILTIN_READ_FLAGS);
1164 def_builtin (OPTION_MASK_ISA_64BIT, 0, "__builtin_ia32_writeeflags_u64",
1165 VOID_FTYPE_UINT64, IX86_BUILTIN_WRITE_FLAGS);
1166 }
1167 else
1168 {
1169 def_builtin (0, 0, "__builtin_ia32_readeflags_u32",
1170 UNSIGNED_FTYPE_VOID, IX86_BUILTIN_READ_FLAGS);
1171 def_builtin (0, 0, "__builtin_ia32_writeeflags_u32",
1172 VOID_FTYPE_UNSIGNED, IX86_BUILTIN_WRITE_FLAGS);
1173 }
1174
1175 /* CLFLUSHOPT. */
1176 def_builtin (OPTION_MASK_ISA_CLFLUSHOPT, 0, "__builtin_ia32_clflushopt",
1177 VOID_FTYPE_PCVOID, IX86_BUILTIN_CLFLUSHOPT);
1178
1179 /* CLWB. */
1180 def_builtin (OPTION_MASK_ISA_CLWB, 0, "__builtin_ia32_clwb",
1181 VOID_FTYPE_PCVOID, IX86_BUILTIN_CLWB);
1182
1183 /* MONITORX and MWAITX. */
1184 def_builtin (0, OPTION_MASK_ISA2_MWAITX, "__builtin_ia32_monitorx",
1185 VOID_FTYPE_PCVOID_UNSIGNED_UNSIGNED, IX86_BUILTIN_MONITORX);
1186 def_builtin (0, OPTION_MASK_ISA2_MWAITX, "__builtin_ia32_mwaitx",
1187 VOID_FTYPE_UNSIGNED_UNSIGNED_UNSIGNED, IX86_BUILTIN_MWAITX);
1188
1189 /* CLZERO. */
1190 def_builtin (0, OPTION_MASK_ISA2_CLZERO, "__builtin_ia32_clzero",
1191 VOID_FTYPE_PCVOID, IX86_BUILTIN_CLZERO);
1192
1193 /* WAITPKG. */
1194 def_builtin (0, OPTION_MASK_ISA2_WAITPKG, "__builtin_ia32_umonitor",
1195 VOID_FTYPE_PVOID, IX86_BUILTIN_UMONITOR);
1196 def_builtin (0, OPTION_MASK_ISA2_WAITPKG, "__builtin_ia32_umwait",
1197 UINT8_FTYPE_UNSIGNED_UINT64, IX86_BUILTIN_UMWAIT);
1198 def_builtin (0, OPTION_MASK_ISA2_WAITPKG, "__builtin_ia32_tpause",
1199 UINT8_FTYPE_UNSIGNED_UINT64, IX86_BUILTIN_TPAUSE);
1200
1201 /* UINTR. */
1202 def_builtin (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_UINTR,
1203 "__builtin_ia32_testui",
1204 UINT8_FTYPE_VOID, IX86_BUILTIN_TESTUI);
1205
1206 /* CLDEMOTE. */
1207 def_builtin (0, OPTION_MASK_ISA2_CLDEMOTE, "__builtin_ia32_cldemote",
1208 VOID_FTYPE_PCVOID, IX86_BUILTIN_CLDEMOTE);
1209
1210 /* Add FMA4 multi-arg argument instructions */
1211 for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
1212 {
1213 BDESC_VERIFY (d->code, IX86_BUILTIN__BDESC_MULTI_ARG_FIRST, i);
1214 if (d->name == 0)
1215 continue;
1216
1217 ftype = (enum ix86_builtin_func_type) d->flag;
1218 def_builtin_const (d->mask, d->mask2, d->name, ftype, d->code);
1219 }
1220 BDESC_VERIFYS (IX86_BUILTIN__BDESC_MULTI_ARG_LAST,
1221 IX86_BUILTIN__BDESC_MULTI_ARG_FIRST,
1222 ARRAY_SIZE (bdesc_multi_arg) - 1);
1223
1224 /* Add CET inrinsics. */
1225 for (i = 0, d = bdesc_cet; i < ARRAY_SIZE (bdesc_cet); i++, d++)
1226 {
1227 BDESC_VERIFY (d->code, IX86_BUILTIN__BDESC_CET_FIRST, i);
1228 if (d->name == 0)
1229 continue;
1230
1231 ftype = (enum ix86_builtin_func_type) d->flag;
1232 def_builtin (d->mask, d->mask2, d->name, ftype, d->code);
1233 }
1234 BDESC_VERIFYS (IX86_BUILTIN__BDESC_CET_LAST,
1235 IX86_BUILTIN__BDESC_CET_FIRST,
1236 ARRAY_SIZE (bdesc_cet) - 1);
1237 }
1238
1239 #undef BDESC_VERIFY
1240 #undef BDESC_VERIFYS
1241
1242 /* Make builtins to detect cpu type and features supported. NAME is
1243 the builtin name, CODE is the builtin code, and FTYPE is the function
1244 type of the builtin. */
1245
1246 static void
make_cpu_type_builtin(const char * name,int code,enum ix86_builtin_func_type ftype,bool is_const)1247 make_cpu_type_builtin (const char* name, int code,
1248 enum ix86_builtin_func_type ftype, bool is_const)
1249 {
1250 tree decl;
1251 tree type;
1252
1253 type = ix86_get_builtin_func_type (ftype);
1254 decl = add_builtin_function (name, type, code, BUILT_IN_MD,
1255 NULL, NULL_TREE);
1256 gcc_assert (decl != NULL_TREE);
1257 ix86_builtins[(int) code] = decl;
1258 TREE_READONLY (decl) = is_const;
1259 }
1260
1261 /* Make builtins to get CPU type and features supported. The created
1262 builtins are :
1263
1264 __builtin_cpu_init (), to detect cpu type and features,
1265 __builtin_cpu_is ("<CPUNAME>"), to check if cpu is of type <CPUNAME>,
1266 __builtin_cpu_supports ("<FEATURE>"), to check if cpu supports <FEATURE>
1267 */
1268
1269 static void
ix86_init_platform_type_builtins(void)1270 ix86_init_platform_type_builtins (void)
1271 {
1272 make_cpu_type_builtin ("__builtin_cpu_init", IX86_BUILTIN_CPU_INIT,
1273 INT_FTYPE_VOID, false);
1274 make_cpu_type_builtin ("__builtin_cpu_is", IX86_BUILTIN_CPU_IS,
1275 INT_FTYPE_PCCHAR, true);
1276 make_cpu_type_builtin ("__builtin_cpu_supports", IX86_BUILTIN_CPU_SUPPORTS,
1277 INT_FTYPE_PCCHAR, true);
1278 }
1279
1280 /* Internal method for ix86_init_builtins. */
1281
1282 static void
ix86_init_builtins_va_builtins_abi(void)1283 ix86_init_builtins_va_builtins_abi (void)
1284 {
1285 tree ms_va_ref, sysv_va_ref;
1286 tree fnvoid_va_end_ms, fnvoid_va_end_sysv;
1287 tree fnvoid_va_start_ms, fnvoid_va_start_sysv;
1288 tree fnvoid_va_copy_ms, fnvoid_va_copy_sysv;
1289 tree fnattr_ms = NULL_TREE, fnattr_sysv = NULL_TREE;
1290
1291 if (!TARGET_64BIT)
1292 return;
1293 fnattr_ms = build_tree_list (get_identifier ("ms_abi"), NULL_TREE);
1294 fnattr_sysv = build_tree_list (get_identifier ("sysv_abi"), NULL_TREE);
1295 ms_va_ref = build_reference_type (ms_va_list_type_node);
1296 sysv_va_ref = build_pointer_type (TREE_TYPE (sysv_va_list_type_node));
1297
1298 fnvoid_va_end_ms = build_function_type_list (void_type_node, ms_va_ref,
1299 NULL_TREE);
1300 fnvoid_va_start_ms
1301 = build_varargs_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
1302 fnvoid_va_end_sysv
1303 = build_function_type_list (void_type_node, sysv_va_ref, NULL_TREE);
1304 fnvoid_va_start_sysv
1305 = build_varargs_function_type_list (void_type_node, sysv_va_ref,
1306 NULL_TREE);
1307 fnvoid_va_copy_ms
1308 = build_function_type_list (void_type_node, ms_va_ref,
1309 ms_va_list_type_node, NULL_TREE);
1310 fnvoid_va_copy_sysv
1311 = build_function_type_list (void_type_node, sysv_va_ref,
1312 sysv_va_ref, NULL_TREE);
1313
1314 add_builtin_function ("__builtin_ms_va_start", fnvoid_va_start_ms,
1315 BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_ms);
1316 add_builtin_function ("__builtin_ms_va_end", fnvoid_va_end_ms,
1317 BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_ms);
1318 add_builtin_function ("__builtin_ms_va_copy", fnvoid_va_copy_ms,
1319 BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_ms);
1320 add_builtin_function ("__builtin_sysv_va_start", fnvoid_va_start_sysv,
1321 BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_sysv);
1322 add_builtin_function ("__builtin_sysv_va_end", fnvoid_va_end_sysv,
1323 BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_sysv);
1324 add_builtin_function ("__builtin_sysv_va_copy", fnvoid_va_copy_sysv,
1325 BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_sysv);
1326 }
1327
1328 static void
ix86_init_builtin_types(void)1329 ix86_init_builtin_types (void)
1330 {
1331 tree float80_type_node, const_string_type_node;
1332
1333 /* The __float80 type. */
1334 float80_type_node = long_double_type_node;
1335 if (TYPE_MODE (float80_type_node) != XFmode)
1336 {
1337 if (float64x_type_node != NULL_TREE
1338 && TYPE_MODE (float64x_type_node) == XFmode)
1339 float80_type_node = float64x_type_node;
1340 else
1341 {
1342 /* The __float80 type. */
1343 float80_type_node = make_node (REAL_TYPE);
1344
1345 TYPE_PRECISION (float80_type_node) = 80;
1346 layout_type (float80_type_node);
1347 }
1348 }
1349 lang_hooks.types.register_builtin_type (float80_type_node, "__float80");
1350
1351 /* The __float128 type. The node has already been created as
1352 _Float128, so we only need to register the __float128 name for
1353 it. */
1354 lang_hooks.types.register_builtin_type (float128_type_node, "__float128");
1355
1356 const_string_type_node
1357 = build_pointer_type (build_qualified_type
1358 (char_type_node, TYPE_QUAL_CONST));
1359
1360 /* This macro is built by i386-builtin-types.awk. */
1361 DEFINE_BUILTIN_PRIMITIVE_TYPES;
1362 }
1363
1364 void
ix86_init_builtins(void)1365 ix86_init_builtins (void)
1366 {
1367 tree ftype, decl;
1368
1369 ix86_init_builtin_types ();
1370
1371 /* Builtins to get CPU type and features. */
1372 ix86_init_platform_type_builtins ();
1373
1374 /* TFmode support builtins. */
1375 def_builtin_const (0, 0, "__builtin_infq",
1376 FLOAT128_FTYPE_VOID, IX86_BUILTIN_INFQ);
1377 def_builtin_const (0, 0, "__builtin_huge_valq",
1378 FLOAT128_FTYPE_VOID, IX86_BUILTIN_HUGE_VALQ);
1379
1380 ftype = ix86_get_builtin_func_type (FLOAT128_FTYPE_CONST_STRING);
1381 decl = add_builtin_function ("__builtin_nanq", ftype, IX86_BUILTIN_NANQ,
1382 BUILT_IN_MD, "nanq", NULL_TREE);
1383 TREE_READONLY (decl) = 1;
1384 ix86_builtins[(int) IX86_BUILTIN_NANQ] = decl;
1385
1386 decl = add_builtin_function ("__builtin_nansq", ftype, IX86_BUILTIN_NANSQ,
1387 BUILT_IN_MD, "nansq", NULL_TREE);
1388 TREE_READONLY (decl) = 1;
1389 ix86_builtins[(int) IX86_BUILTIN_NANSQ] = decl;
1390
1391 /* We will expand them to normal call if SSE isn't available since
1392 they are used by libgcc. */
1393 ftype = ix86_get_builtin_func_type (FLOAT128_FTYPE_FLOAT128);
1394 decl = add_builtin_function ("__builtin_fabsq", ftype, IX86_BUILTIN_FABSQ,
1395 BUILT_IN_MD, "__fabstf2", NULL_TREE);
1396 TREE_READONLY (decl) = 1;
1397 ix86_builtins[(int) IX86_BUILTIN_FABSQ] = decl;
1398
1399 ftype = ix86_get_builtin_func_type (FLOAT128_FTYPE_FLOAT128_FLOAT128);
1400 decl = add_builtin_function ("__builtin_copysignq", ftype,
1401 IX86_BUILTIN_COPYSIGNQ, BUILT_IN_MD,
1402 "__copysigntf3", NULL_TREE);
1403 TREE_READONLY (decl) = 1;
1404 ix86_builtins[(int) IX86_BUILTIN_COPYSIGNQ] = decl;
1405
1406 ix86_init_tm_builtins ();
1407 ix86_init_mmx_sse_builtins ();
1408
1409 if (TARGET_LP64)
1410 ix86_init_builtins_va_builtins_abi ();
1411
1412 #ifdef SUBTARGET_INIT_BUILTINS
1413 SUBTARGET_INIT_BUILTINS;
1414 #endif
1415 }
1416
1417 /* Return the ix86 builtin for CODE. */
1418
1419 tree
ix86_builtin_decl(unsigned code,bool)1420 ix86_builtin_decl (unsigned code, bool)
1421 {
1422 if (code >= IX86_BUILTIN_MAX)
1423 return error_mark_node;
1424
1425 return ix86_builtins[code];
1426 }
1427
1428 /* This returns the target-specific builtin with code CODE if
1429 current_function_decl has visibility on this builtin, which is checked
1430 using isa flags. Returns NULL_TREE otherwise. */
1431
ix86_get_builtin(enum ix86_builtins code)1432 static tree ix86_get_builtin (enum ix86_builtins code)
1433 {
1434 struct cl_target_option *opts;
1435 tree target_tree = NULL_TREE;
1436
1437 /* Determine the isa flags of current_function_decl. */
1438
1439 if (current_function_decl)
1440 target_tree = DECL_FUNCTION_SPECIFIC_TARGET (current_function_decl);
1441
1442 if (target_tree == NULL)
1443 target_tree = target_option_default_node;
1444
1445 opts = TREE_TARGET_OPTION (target_tree);
1446
1447 if ((ix86_builtins_isa[(int) code].isa & opts->x_ix86_isa_flags)
1448 || (ix86_builtins_isa[(int) code].isa2 & opts->x_ix86_isa_flags2))
1449 return ix86_builtin_decl (code, true);
1450 else
1451 return NULL_TREE;
1452 }
1453
1454 /* Vectorization library interface and handlers. */
1455 tree (*ix86_veclib_handler) (combined_fn, tree, tree);
1456
1457 /* Returns a function decl for a vectorized version of the combined function
1458 with combined_fn code FN and the result vector type TYPE, or NULL_TREE
1459 if it is not available. */
1460
1461 tree
ix86_builtin_vectorized_function(unsigned int fn,tree type_out,tree type_in)1462 ix86_builtin_vectorized_function (unsigned int fn, tree type_out,
1463 tree type_in)
1464 {
1465 machine_mode in_mode, out_mode;
1466 int in_n, out_n;
1467
1468 if (TREE_CODE (type_out) != VECTOR_TYPE
1469 || TREE_CODE (type_in) != VECTOR_TYPE)
1470 return NULL_TREE;
1471
1472 out_mode = TYPE_MODE (TREE_TYPE (type_out));
1473 out_n = TYPE_VECTOR_SUBPARTS (type_out);
1474 in_mode = TYPE_MODE (TREE_TYPE (type_in));
1475 in_n = TYPE_VECTOR_SUBPARTS (type_in);
1476
1477 switch (fn)
1478 {
1479 CASE_CFN_EXP2:
1480 if (out_mode == SFmode && in_mode == SFmode)
1481 {
1482 if (out_n == 16 && in_n == 16)
1483 return ix86_get_builtin (IX86_BUILTIN_EXP2PS);
1484 }
1485 break;
1486
1487 CASE_CFN_IFLOOR:
1488 CASE_CFN_LFLOOR:
1489 CASE_CFN_LLFLOOR:
1490 /* The round insn does not trap on denormals. */
1491 if (flag_trapping_math || !TARGET_SSE4_1)
1492 break;
1493
1494 if (out_mode == SImode && in_mode == DFmode)
1495 {
1496 if (out_n == 4 && in_n == 2)
1497 return ix86_get_builtin (IX86_BUILTIN_FLOORPD_VEC_PACK_SFIX);
1498 else if (out_n == 8 && in_n == 4)
1499 return ix86_get_builtin (IX86_BUILTIN_FLOORPD_VEC_PACK_SFIX256);
1500 else if (out_n == 16 && in_n == 8)
1501 return ix86_get_builtin (IX86_BUILTIN_FLOORPD_VEC_PACK_SFIX512);
1502 }
1503 if (out_mode == SImode && in_mode == SFmode)
1504 {
1505 if (out_n == 4 && in_n == 4)
1506 return ix86_get_builtin (IX86_BUILTIN_FLOORPS_SFIX);
1507 else if (out_n == 8 && in_n == 8)
1508 return ix86_get_builtin (IX86_BUILTIN_FLOORPS_SFIX256);
1509 else if (out_n == 16 && in_n == 16)
1510 return ix86_get_builtin (IX86_BUILTIN_FLOORPS_SFIX512);
1511 }
1512 break;
1513
1514 CASE_CFN_ICEIL:
1515 CASE_CFN_LCEIL:
1516 CASE_CFN_LLCEIL:
1517 /* The round insn does not trap on denormals. */
1518 if (flag_trapping_math || !TARGET_SSE4_1)
1519 break;
1520
1521 if (out_mode == SImode && in_mode == DFmode)
1522 {
1523 if (out_n == 4 && in_n == 2)
1524 return ix86_get_builtin (IX86_BUILTIN_CEILPD_VEC_PACK_SFIX);
1525 else if (out_n == 8 && in_n == 4)
1526 return ix86_get_builtin (IX86_BUILTIN_CEILPD_VEC_PACK_SFIX256);
1527 else if (out_n == 16 && in_n == 8)
1528 return ix86_get_builtin (IX86_BUILTIN_CEILPD_VEC_PACK_SFIX512);
1529 }
1530 if (out_mode == SImode && in_mode == SFmode)
1531 {
1532 if (out_n == 4 && in_n == 4)
1533 return ix86_get_builtin (IX86_BUILTIN_CEILPS_SFIX);
1534 else if (out_n == 8 && in_n == 8)
1535 return ix86_get_builtin (IX86_BUILTIN_CEILPS_SFIX256);
1536 else if (out_n == 16 && in_n == 16)
1537 return ix86_get_builtin (IX86_BUILTIN_CEILPS_SFIX512);
1538 }
1539 break;
1540
1541 CASE_CFN_IRINT:
1542 CASE_CFN_LRINT:
1543 CASE_CFN_LLRINT:
1544 if (out_mode == SImode && in_mode == DFmode)
1545 {
1546 if (out_n == 4 && in_n == 2)
1547 return ix86_get_builtin (IX86_BUILTIN_VEC_PACK_SFIX);
1548 else if (out_n == 8 && in_n == 4)
1549 return ix86_get_builtin (IX86_BUILTIN_VEC_PACK_SFIX256);
1550 else if (out_n == 16 && in_n == 8)
1551 return ix86_get_builtin (IX86_BUILTIN_VEC_PACK_SFIX512);
1552 }
1553 if (out_mode == SImode && in_mode == SFmode)
1554 {
1555 if (out_n == 4 && in_n == 4)
1556 return ix86_get_builtin (IX86_BUILTIN_CVTPS2DQ);
1557 else if (out_n == 8 && in_n == 8)
1558 return ix86_get_builtin (IX86_BUILTIN_CVTPS2DQ256);
1559 else if (out_n == 16 && in_n == 16)
1560 return ix86_get_builtin (IX86_BUILTIN_CVTPS2DQ512);
1561 }
1562 break;
1563
1564 CASE_CFN_IROUND:
1565 CASE_CFN_LROUND:
1566 CASE_CFN_LLROUND:
1567 /* The round insn does not trap on denormals. */
1568 if (flag_trapping_math || !TARGET_SSE4_1)
1569 break;
1570
1571 if (out_mode == SImode && in_mode == DFmode)
1572 {
1573 if (out_n == 4 && in_n == 2)
1574 return ix86_get_builtin (IX86_BUILTIN_ROUNDPD_AZ_VEC_PACK_SFIX);
1575 else if (out_n == 8 && in_n == 4)
1576 return ix86_get_builtin (IX86_BUILTIN_ROUNDPD_AZ_VEC_PACK_SFIX256);
1577 else if (out_n == 16 && in_n == 8)
1578 return ix86_get_builtin (IX86_BUILTIN_ROUNDPD_AZ_VEC_PACK_SFIX512);
1579 }
1580 if (out_mode == SImode && in_mode == SFmode)
1581 {
1582 if (out_n == 4 && in_n == 4)
1583 return ix86_get_builtin (IX86_BUILTIN_ROUNDPS_AZ_SFIX);
1584 else if (out_n == 8 && in_n == 8)
1585 return ix86_get_builtin (IX86_BUILTIN_ROUNDPS_AZ_SFIX256);
1586 else if (out_n == 16 && in_n == 16)
1587 return ix86_get_builtin (IX86_BUILTIN_ROUNDPS_AZ_SFIX512);
1588 }
1589 break;
1590
1591 CASE_CFN_FLOOR:
1592 /* The round insn does not trap on denormals. */
1593 if (flag_trapping_math || !TARGET_SSE4_1)
1594 break;
1595
1596 if (out_mode == DFmode && in_mode == DFmode)
1597 {
1598 if (out_n == 2 && in_n == 2)
1599 return ix86_get_builtin (IX86_BUILTIN_FLOORPD);
1600 else if (out_n == 4 && in_n == 4)
1601 return ix86_get_builtin (IX86_BUILTIN_FLOORPD256);
1602 else if (out_n == 8 && in_n == 8)
1603 return ix86_get_builtin (IX86_BUILTIN_FLOORPD512);
1604 }
1605 if (out_mode == SFmode && in_mode == SFmode)
1606 {
1607 if (out_n == 4 && in_n == 4)
1608 return ix86_get_builtin (IX86_BUILTIN_FLOORPS);
1609 else if (out_n == 8 && in_n == 8)
1610 return ix86_get_builtin (IX86_BUILTIN_FLOORPS256);
1611 else if (out_n == 16 && in_n == 16)
1612 return ix86_get_builtin (IX86_BUILTIN_FLOORPS512);
1613 }
1614 break;
1615
1616 CASE_CFN_CEIL:
1617 /* The round insn does not trap on denormals. */
1618 if (flag_trapping_math || !TARGET_SSE4_1)
1619 break;
1620
1621 if (out_mode == DFmode && in_mode == DFmode)
1622 {
1623 if (out_n == 2 && in_n == 2)
1624 return ix86_get_builtin (IX86_BUILTIN_CEILPD);
1625 else if (out_n == 4 && in_n == 4)
1626 return ix86_get_builtin (IX86_BUILTIN_CEILPD256);
1627 else if (out_n == 8 && in_n == 8)
1628 return ix86_get_builtin (IX86_BUILTIN_CEILPD512);
1629 }
1630 if (out_mode == SFmode && in_mode == SFmode)
1631 {
1632 if (out_n == 4 && in_n == 4)
1633 return ix86_get_builtin (IX86_BUILTIN_CEILPS);
1634 else if (out_n == 8 && in_n == 8)
1635 return ix86_get_builtin (IX86_BUILTIN_CEILPS256);
1636 else if (out_n == 16 && in_n == 16)
1637 return ix86_get_builtin (IX86_BUILTIN_CEILPS512);
1638 }
1639 break;
1640
1641 CASE_CFN_TRUNC:
1642 /* The round insn does not trap on denormals. */
1643 if (flag_trapping_math || !TARGET_SSE4_1)
1644 break;
1645
1646 if (out_mode == DFmode && in_mode == DFmode)
1647 {
1648 if (out_n == 2 && in_n == 2)
1649 return ix86_get_builtin (IX86_BUILTIN_TRUNCPD);
1650 else if (out_n == 4 && in_n == 4)
1651 return ix86_get_builtin (IX86_BUILTIN_TRUNCPD256);
1652 else if (out_n == 8 && in_n == 8)
1653 return ix86_get_builtin (IX86_BUILTIN_TRUNCPD512);
1654 }
1655 if (out_mode == SFmode && in_mode == SFmode)
1656 {
1657 if (out_n == 4 && in_n == 4)
1658 return ix86_get_builtin (IX86_BUILTIN_TRUNCPS);
1659 else if (out_n == 8 && in_n == 8)
1660 return ix86_get_builtin (IX86_BUILTIN_TRUNCPS256);
1661 else if (out_n == 16 && in_n == 16)
1662 return ix86_get_builtin (IX86_BUILTIN_TRUNCPS512);
1663 }
1664 break;
1665
1666 CASE_CFN_FMA:
1667 if (out_mode == DFmode && in_mode == DFmode)
1668 {
1669 if (out_n == 2 && in_n == 2)
1670 return ix86_get_builtin (IX86_BUILTIN_VFMADDPD);
1671 if (out_n == 4 && in_n == 4)
1672 return ix86_get_builtin (IX86_BUILTIN_VFMADDPD256);
1673 }
1674 if (out_mode == SFmode && in_mode == SFmode)
1675 {
1676 if (out_n == 4 && in_n == 4)
1677 return ix86_get_builtin (IX86_BUILTIN_VFMADDPS);
1678 if (out_n == 8 && in_n == 8)
1679 return ix86_get_builtin (IX86_BUILTIN_VFMADDPS256);
1680 }
1681 break;
1682
1683 default:
1684 break;
1685 }
1686
1687 /* Dispatch to a handler for a vectorization library. */
1688 if (ix86_veclib_handler)
1689 return ix86_veclib_handler (combined_fn (fn), type_out, type_in);
1690
1691 return NULL_TREE;
1692 }
1693
1694 /* Returns a decl of a function that implements gather load with
1695 memory type MEM_VECTYPE and index type INDEX_VECTYPE and SCALE.
1696 Return NULL_TREE if it is not available. */
1697
1698 tree
ix86_vectorize_builtin_gather(const_tree mem_vectype,const_tree index_type,int scale)1699 ix86_vectorize_builtin_gather (const_tree mem_vectype,
1700 const_tree index_type, int scale)
1701 {
1702 bool si;
1703 enum ix86_builtins code;
1704
1705 if (! TARGET_AVX2 || !TARGET_USE_GATHER)
1706 return NULL_TREE;
1707
1708 if ((TREE_CODE (index_type) != INTEGER_TYPE
1709 && !POINTER_TYPE_P (index_type))
1710 || (TYPE_MODE (index_type) != SImode
1711 && TYPE_MODE (index_type) != DImode))
1712 return NULL_TREE;
1713
1714 if (TYPE_PRECISION (index_type) > POINTER_SIZE)
1715 return NULL_TREE;
1716
1717 /* v*gather* insn sign extends index to pointer mode. */
1718 if (TYPE_PRECISION (index_type) < POINTER_SIZE
1719 && TYPE_UNSIGNED (index_type))
1720 return NULL_TREE;
1721
1722 if (scale <= 0
1723 || scale > 8
1724 || (scale & (scale - 1)) != 0)
1725 return NULL_TREE;
1726
1727 si = TYPE_MODE (index_type) == SImode;
1728 switch (TYPE_MODE (mem_vectype))
1729 {
1730 case E_V2DFmode:
1731 if (TARGET_AVX512VL)
1732 code = si ? IX86_BUILTIN_GATHER3SIV2DF : IX86_BUILTIN_GATHER3DIV2DF;
1733 else
1734 code = si ? IX86_BUILTIN_GATHERSIV2DF : IX86_BUILTIN_GATHERDIV2DF;
1735 break;
1736 case E_V4DFmode:
1737 if (TARGET_AVX512VL)
1738 code = si ? IX86_BUILTIN_GATHER3ALTSIV4DF : IX86_BUILTIN_GATHER3DIV4DF;
1739 else
1740 code = si ? IX86_BUILTIN_GATHERALTSIV4DF : IX86_BUILTIN_GATHERDIV4DF;
1741 break;
1742 case E_V2DImode:
1743 if (TARGET_AVX512VL)
1744 code = si ? IX86_BUILTIN_GATHER3SIV2DI : IX86_BUILTIN_GATHER3DIV2DI;
1745 else
1746 code = si ? IX86_BUILTIN_GATHERSIV2DI : IX86_BUILTIN_GATHERDIV2DI;
1747 break;
1748 case E_V4DImode:
1749 if (TARGET_AVX512VL)
1750 code = si ? IX86_BUILTIN_GATHER3ALTSIV4DI : IX86_BUILTIN_GATHER3DIV4DI;
1751 else
1752 code = si ? IX86_BUILTIN_GATHERALTSIV4DI : IX86_BUILTIN_GATHERDIV4DI;
1753 break;
1754 case E_V4SFmode:
1755 if (TARGET_AVX512VL)
1756 code = si ? IX86_BUILTIN_GATHER3SIV4SF : IX86_BUILTIN_GATHER3DIV4SF;
1757 else
1758 code = si ? IX86_BUILTIN_GATHERSIV4SF : IX86_BUILTIN_GATHERDIV4SF;
1759 break;
1760 case E_V8SFmode:
1761 if (TARGET_AVX512VL)
1762 code = si ? IX86_BUILTIN_GATHER3SIV8SF : IX86_BUILTIN_GATHER3ALTDIV8SF;
1763 else
1764 code = si ? IX86_BUILTIN_GATHERSIV8SF : IX86_BUILTIN_GATHERALTDIV8SF;
1765 break;
1766 case E_V4SImode:
1767 if (TARGET_AVX512VL)
1768 code = si ? IX86_BUILTIN_GATHER3SIV4SI : IX86_BUILTIN_GATHER3DIV4SI;
1769 else
1770 code = si ? IX86_BUILTIN_GATHERSIV4SI : IX86_BUILTIN_GATHERDIV4SI;
1771 break;
1772 case E_V8SImode:
1773 if (TARGET_AVX512VL)
1774 code = si ? IX86_BUILTIN_GATHER3SIV8SI : IX86_BUILTIN_GATHER3ALTDIV8SI;
1775 else
1776 code = si ? IX86_BUILTIN_GATHERSIV8SI : IX86_BUILTIN_GATHERALTDIV8SI;
1777 break;
1778 case E_V8DFmode:
1779 if (TARGET_AVX512F)
1780 code = si ? IX86_BUILTIN_GATHER3ALTSIV8DF : IX86_BUILTIN_GATHER3DIV8DF;
1781 else
1782 return NULL_TREE;
1783 break;
1784 case E_V8DImode:
1785 if (TARGET_AVX512F)
1786 code = si ? IX86_BUILTIN_GATHER3ALTSIV8DI : IX86_BUILTIN_GATHER3DIV8DI;
1787 else
1788 return NULL_TREE;
1789 break;
1790 case E_V16SFmode:
1791 if (TARGET_AVX512F)
1792 code = si ? IX86_BUILTIN_GATHER3SIV16SF : IX86_BUILTIN_GATHER3ALTDIV16SF;
1793 else
1794 return NULL_TREE;
1795 break;
1796 case E_V16SImode:
1797 if (TARGET_AVX512F)
1798 code = si ? IX86_BUILTIN_GATHER3SIV16SI : IX86_BUILTIN_GATHER3ALTDIV16SI;
1799 else
1800 return NULL_TREE;
1801 break;
1802 default:
1803 return NULL_TREE;
1804 }
1805
1806 return ix86_get_builtin (code);
1807 }
1808
1809 /* Returns a code for a target-specific builtin that implements
1810 reciprocal of the function, or NULL_TREE if not available. */
1811
1812 tree
ix86_builtin_reciprocal(tree fndecl)1813 ix86_builtin_reciprocal (tree fndecl)
1814 {
1815 enum ix86_builtins fn_code
1816 = (enum ix86_builtins) DECL_MD_FUNCTION_CODE (fndecl);
1817 switch (fn_code)
1818 {
1819 /* Vectorized version of sqrt to rsqrt conversion. */
1820 case IX86_BUILTIN_SQRTPS_NR:
1821 return ix86_get_builtin (IX86_BUILTIN_RSQRTPS_NR);
1822
1823 case IX86_BUILTIN_SQRTPS_NR256:
1824 return ix86_get_builtin (IX86_BUILTIN_RSQRTPS_NR256);
1825
1826 default:
1827 return NULL_TREE;
1828 }
1829 }
1830
1831 /* This parses the attribute arguments to target in DECL and determines
1832 the right builtin to use to match the platform specification.
1833 It returns the priority value for this version decl. If PREDICATE_LIST
1834 is not NULL, it stores the list of cpu features that need to be checked
1835 before dispatching this function. */
1836
1837 unsigned int
get_builtin_code_for_version(tree decl,tree * predicate_list)1838 get_builtin_code_for_version (tree decl, tree *predicate_list)
1839 {
1840 tree attrs;
1841 struct cl_target_option cur_target;
1842 tree target_node;
1843 struct cl_target_option *new_target;
1844 const char *arg_str = NULL;
1845 const char *attrs_str = NULL;
1846 char *tok_str = NULL;
1847 char *token;
1848
1849 enum feature_priority priority = P_NONE;
1850
1851 static unsigned int NUM_FEATURES
1852 = sizeof (isa_names_table) / sizeof (_isa_names_table);
1853
1854 unsigned int i;
1855
1856 tree predicate_chain = NULL_TREE;
1857 tree predicate_decl, predicate_arg;
1858
1859 attrs = lookup_attribute ("target", DECL_ATTRIBUTES (decl));
1860 gcc_assert (attrs != NULL);
1861
1862 attrs = TREE_VALUE (TREE_VALUE (attrs));
1863
1864 gcc_assert (TREE_CODE (attrs) == STRING_CST);
1865 attrs_str = TREE_STRING_POINTER (attrs);
1866
1867 /* Return priority zero for default function. */
1868 if (strcmp (attrs_str, "default") == 0)
1869 return 0;
1870
1871 /* Handle arch= if specified. For priority, set it to be 1 more than
1872 the best instruction set the processor can handle. For instance, if
1873 there is a version for atom and a version for ssse3 (the highest ISA
1874 priority for atom), the atom version must be checked for dispatch
1875 before the ssse3 version. */
1876 if (strstr (attrs_str, "arch=") != NULL)
1877 {
1878 cl_target_option_save (&cur_target, &global_options,
1879 &global_options_set);
1880 target_node
1881 = ix86_valid_target_attribute_tree (decl, attrs, &global_options,
1882 &global_options_set, 0);
1883
1884 gcc_assert (target_node);
1885 if (target_node == error_mark_node)
1886 return 0;
1887 new_target = TREE_TARGET_OPTION (target_node);
1888 gcc_assert (new_target);
1889
1890 if (new_target->arch_specified && new_target->arch > 0)
1891 for (i = 0; i < pta_size; i++)
1892 if (processor_alias_table[i].processor == new_target->arch)
1893 {
1894 const pta *arch_info = &processor_alias_table[i];
1895 switch (arch_info->priority)
1896 {
1897 default:
1898 arg_str = arch_info->name;
1899 priority = arch_info->priority;
1900 break;
1901 case P_PROC_DYNAMIC:
1902 switch (new_target->arch)
1903 {
1904 case PROCESSOR_NEHALEM:
1905 if (TARGET_PCLMUL_P (new_target->x_ix86_isa_flags))
1906 {
1907 arg_str = "westmere";
1908 priority = P_PCLMUL;
1909 }
1910 else
1911 {
1912 /* We translate "arch=corei7" and "arch=nehalem"
1913 to "corei7" so that it will be mapped to
1914 M_INTEL_COREI7 as cpu type to cover all
1915 M_INTEL_COREI7_XXXs. */
1916 arg_str = "corei7";
1917 priority = P_PROC_SSE4_2;
1918 }
1919 break;
1920 case PROCESSOR_SANDYBRIDGE:
1921 if (TARGET_F16C_P (new_target->x_ix86_isa_flags))
1922 arg_str = "ivybridge";
1923 else
1924 arg_str = "sandybridge";
1925 priority = P_PROC_AVX;
1926 break;
1927 case PROCESSOR_HASWELL:
1928 if (TARGET_ADX_P (new_target->x_ix86_isa_flags))
1929 arg_str = "broadwell";
1930 else
1931 arg_str = "haswell";
1932 priority = P_PROC_AVX2;
1933 break;
1934 case PROCESSOR_AMDFAM10:
1935 arg_str = "amdfam10h";
1936 priority = P_PROC_SSE4_A;
1937 break;
1938 default:
1939 gcc_unreachable ();
1940 }
1941 break;
1942 case P_NONE:
1943 break;
1944 }
1945 break;
1946 }
1947
1948 cl_target_option_restore (&global_options, &global_options_set,
1949 &cur_target);
1950
1951 if (predicate_list && arg_str == NULL)
1952 {
1953 error_at (DECL_SOURCE_LOCATION (decl),
1954 "no dispatcher found for the versioning attributes");
1955 return 0;
1956 }
1957
1958 if (predicate_list)
1959 {
1960 predicate_decl = ix86_builtins [(int) IX86_BUILTIN_CPU_IS];
1961 /* For a C string literal the length includes the trailing NULL. */
1962 predicate_arg = build_string_literal (strlen (arg_str) + 1, arg_str);
1963 predicate_chain = tree_cons (predicate_decl, predicate_arg,
1964 predicate_chain);
1965 }
1966 }
1967
1968 /* Process feature name. */
1969 tok_str = (char *) xmalloc (strlen (attrs_str) + 1);
1970 strcpy (tok_str, attrs_str);
1971 token = strtok (tok_str, ",");
1972 predicate_decl = ix86_builtins [(int) IX86_BUILTIN_CPU_SUPPORTS];
1973
1974 while (token != NULL)
1975 {
1976 /* Do not process "arch=" */
1977 if (strncmp (token, "arch=", 5) == 0)
1978 {
1979 token = strtok (NULL, ",");
1980 continue;
1981 }
1982 for (i = 0; i < NUM_FEATURES; ++i)
1983 {
1984 if (strcmp (token, isa_names_table[i].name) == 0)
1985 {
1986 if (predicate_list)
1987 {
1988 predicate_arg = build_string_literal (
1989 strlen (isa_names_table[i].name) + 1,
1990 isa_names_table[i].name);
1991 predicate_chain = tree_cons (predicate_decl, predicate_arg,
1992 predicate_chain);
1993 }
1994 /* Find the maximum priority feature. */
1995 if (isa_names_table[i].priority > priority)
1996 priority = isa_names_table[i].priority;
1997
1998 break;
1999 }
2000 }
2001 if (predicate_list && priority == P_NONE)
2002 {
2003 error_at (DECL_SOURCE_LOCATION (decl),
2004 "ISA %qs is not supported in %<target%> attribute, "
2005 "use %<arch=%> syntax", token);
2006 return 0;
2007 }
2008 token = strtok (NULL, ",");
2009 }
2010 free (tok_str);
2011
2012 if (predicate_list && predicate_chain == NULL_TREE)
2013 {
2014 error_at (DECL_SOURCE_LOCATION (decl),
2015 "no dispatcher found for the versioning attributes: %s",
2016 attrs_str);
2017 return 0;
2018 }
2019 else if (predicate_list)
2020 {
2021 predicate_chain = nreverse (predicate_chain);
2022 *predicate_list = predicate_chain;
2023 }
2024
2025 return priority;
2026 }
2027
2028 /* This builds the processor_model struct type defined in
2029 libgcc/config/i386/cpuinfo.c */
2030
2031 static tree
build_processor_model_struct(void)2032 build_processor_model_struct (void)
2033 {
2034 const char *field_name[] = {"__cpu_vendor", "__cpu_type", "__cpu_subtype",
2035 "__cpu_features"};
2036 tree field = NULL_TREE, field_chain = NULL_TREE;
2037 int i;
2038 tree type = make_node (RECORD_TYPE);
2039
2040 /* The first 3 fields are unsigned int. */
2041 for (i = 0; i < 3; ++i)
2042 {
2043 field = build_decl (UNKNOWN_LOCATION, FIELD_DECL,
2044 get_identifier (field_name[i]), unsigned_type_node);
2045 if (field_chain != NULL_TREE)
2046 DECL_CHAIN (field) = field_chain;
2047 field_chain = field;
2048 }
2049
2050 /* The last field is an array of unsigned integers of size one. */
2051 field = build_decl (UNKNOWN_LOCATION, FIELD_DECL,
2052 get_identifier (field_name[3]),
2053 build_array_type (unsigned_type_node,
2054 build_index_type (size_one_node)));
2055 if (field_chain != NULL_TREE)
2056 DECL_CHAIN (field) = field_chain;
2057 field_chain = field;
2058
2059 finish_builtin_struct (type, "__processor_model", field_chain, NULL_TREE);
2060 return type;
2061 }
2062
2063 /* Returns a extern, comdat VAR_DECL of type TYPE and name NAME. */
2064
2065 static tree
make_var_decl(tree type,const char * name)2066 make_var_decl (tree type, const char *name)
2067 {
2068 tree new_decl;
2069
2070 new_decl = build_decl (UNKNOWN_LOCATION,
2071 VAR_DECL,
2072 get_identifier(name),
2073 type);
2074
2075 DECL_EXTERNAL (new_decl) = 1;
2076 TREE_STATIC (new_decl) = 1;
2077 TREE_PUBLIC (new_decl) = 1;
2078 DECL_INITIAL (new_decl) = 0;
2079 DECL_ARTIFICIAL (new_decl) = 0;
2080 DECL_PRESERVE_P (new_decl) = 1;
2081
2082 make_decl_one_only (new_decl, DECL_ASSEMBLER_NAME (new_decl));
2083 assemble_variable (new_decl, 0, 0, 0);
2084
2085 return new_decl;
2086 }
2087
2088 /* FNDECL is a __builtin_cpu_is or a __builtin_cpu_supports call that is folded
2089 into an integer defined in libgcc/config/i386/cpuinfo.c */
2090
2091 tree
fold_builtin_cpu(tree fndecl,tree * args)2092 fold_builtin_cpu (tree fndecl, tree *args)
2093 {
2094 unsigned int i;
2095 enum ix86_builtins fn_code
2096 = (enum ix86_builtins) DECL_MD_FUNCTION_CODE (fndecl);
2097 tree param_string_cst = NULL;
2098
2099 tree __processor_model_type = build_processor_model_struct ();
2100 tree __cpu_model_var = make_var_decl (__processor_model_type,
2101 "__cpu_model");
2102
2103
2104 varpool_node::add (__cpu_model_var);
2105
2106 gcc_assert ((args != NULL) && (*args != NULL));
2107
2108 param_string_cst = *args;
2109 while (param_string_cst
2110 && TREE_CODE (param_string_cst) != STRING_CST)
2111 {
2112 /* *args must be a expr that can contain other EXPRS leading to a
2113 STRING_CST. */
2114 if (!EXPR_P (param_string_cst))
2115 {
2116 error ("parameter to builtin must be a string constant or literal");
2117 return integer_zero_node;
2118 }
2119 param_string_cst = TREE_OPERAND (EXPR_CHECK (param_string_cst), 0);
2120 }
2121
2122 gcc_assert (param_string_cst);
2123
2124 if (fn_code == IX86_BUILTIN_CPU_IS)
2125 {
2126 tree ref;
2127 tree field;
2128 tree final;
2129
2130 unsigned int field_val = 0;
2131
2132 for (i = 0; i < num_arch_names; i++)
2133 if (processor_alias_table[i].model != 0
2134 && strcmp (processor_alias_table[i].name,
2135 TREE_STRING_POINTER (param_string_cst)) == 0)
2136 break;
2137
2138 if (i == num_arch_names)
2139 {
2140 error ("parameter to builtin not valid: %s",
2141 TREE_STRING_POINTER (param_string_cst));
2142 return integer_zero_node;
2143 }
2144
2145 field = TYPE_FIELDS (__processor_model_type);
2146 field_val = processor_alias_table[i].model;
2147
2148 /* CPU types are stored in the next field. */
2149 if (field_val > M_CPU_TYPE_START
2150 && field_val < M_CPU_SUBTYPE_START)
2151 {
2152 field = DECL_CHAIN (field);
2153 field_val -= M_CPU_TYPE_START;
2154 }
2155
2156 /* CPU subtypes are stored in the next field. */
2157 if (field_val > M_CPU_SUBTYPE_START)
2158 {
2159 field = DECL_CHAIN ( DECL_CHAIN (field));
2160 field_val -= M_CPU_SUBTYPE_START;
2161 }
2162
2163 /* Get the appropriate field in __cpu_model. */
2164 ref = build3 (COMPONENT_REF, TREE_TYPE (field), __cpu_model_var,
2165 field, NULL_TREE);
2166
2167 /* Check the value. */
2168 final = build2 (EQ_EXPR, unsigned_type_node, ref,
2169 build_int_cstu (unsigned_type_node, field_val));
2170 return build1 (CONVERT_EXPR, integer_type_node, final);
2171 }
2172 else if (fn_code == IX86_BUILTIN_CPU_SUPPORTS)
2173 {
2174 tree ref;
2175 tree array_elt;
2176 tree field;
2177 tree final;
2178
2179 unsigned int field_val = 0;
2180 unsigned int NUM_ISA_NAMES
2181 = sizeof (isa_names_table) / sizeof (struct _isa_names_table);
2182
2183 for (i = 0; i < NUM_ISA_NAMES; i++)
2184 if (strcmp (isa_names_table[i].name,
2185 TREE_STRING_POINTER (param_string_cst)) == 0)
2186 break;
2187
2188 if (i == NUM_ISA_NAMES)
2189 {
2190 error ("parameter to builtin not valid: %s",
2191 TREE_STRING_POINTER (param_string_cst));
2192 return integer_zero_node;
2193 }
2194
2195 if (isa_names_table[i].feature >= 32)
2196 {
2197 tree index_type
2198 = build_index_type (size_int (SIZE_OF_CPU_FEATURES));
2199 tree type = build_array_type (unsigned_type_node, index_type);
2200 tree __cpu_features2_var = make_var_decl (type,
2201 "__cpu_features2");
2202
2203 varpool_node::add (__cpu_features2_var);
2204 for (unsigned int j = 0; j < SIZE_OF_CPU_FEATURES; j++)
2205 if (isa_names_table[i].feature < (32 + 32 + j * 32))
2206 {
2207 field_val = (1U << (isa_names_table[i].feature
2208 - (32 + j * 32)));
2209 tree index = size_int (j);
2210 array_elt = build4 (ARRAY_REF, unsigned_type_node,
2211 __cpu_features2_var,
2212 index, NULL_TREE, NULL_TREE);
2213 /* Return __cpu_features2[index] & field_val */
2214 final = build2 (BIT_AND_EXPR, unsigned_type_node,
2215 array_elt,
2216 build_int_cstu (unsigned_type_node,
2217 field_val));
2218 return build1 (CONVERT_EXPR, integer_type_node, final);
2219 }
2220 }
2221
2222 field = TYPE_FIELDS (__processor_model_type);
2223 /* Get the last field, which is __cpu_features. */
2224 while (DECL_CHAIN (field))
2225 field = DECL_CHAIN (field);
2226
2227 /* Get the appropriate field: __cpu_model.__cpu_features */
2228 ref = build3 (COMPONENT_REF, TREE_TYPE (field), __cpu_model_var,
2229 field, NULL_TREE);
2230
2231 /* Access the 0th element of __cpu_features array. */
2232 array_elt = build4 (ARRAY_REF, unsigned_type_node, ref,
2233 integer_zero_node, NULL_TREE, NULL_TREE);
2234
2235 field_val = (1U << isa_names_table[i].feature);
2236 /* Return __cpu_model.__cpu_features[0] & field_val */
2237 final = build2 (BIT_AND_EXPR, unsigned_type_node, array_elt,
2238 build_int_cstu (unsigned_type_node, field_val));
2239 return build1 (CONVERT_EXPR, integer_type_node, final);
2240 }
2241 gcc_unreachable ();
2242 }
2243
2244 #include "gt-i386-builtins.h"
2245