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