1//===- IntrinsicsX86.td - Defines X86 intrinsics -----------*- tablegen -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines all of the X86-specific intrinsics.
11//
12//===----------------------------------------------------------------------===//
13
14//===----------------------------------------------------------------------===//
15// Interrupt traps
16let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
17  def int_x86_int : Intrinsic<[], [llvm_i8_ty]>;
18}
19
20//===----------------------------------------------------------------------===//
21// SEH intrinsics for Windows
22let TargetPrefix = "x86" in {
23  def int_x86_seh_lsda : Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty], [IntrNoMem]>;
24
25  // Marks the EH registration node created in LLVM IR prior to code generation.
26  def int_x86_seh_ehregnode : Intrinsic<[], [llvm_ptr_ty], []>;
27
28  // Marks the EH guard slot node created in LLVM IR prior to code generation.
29  def int_x86_seh_ehguard : Intrinsic<[], [llvm_ptr_ty], []>;
30
31  // Given a pointer to the end of an EH registration object, returns the true
32  // parent frame address that can be used with llvm.localrecover.
33  def int_x86_seh_recoverfp : Intrinsic<[llvm_ptr_ty],
34                                        [llvm_ptr_ty, llvm_ptr_ty],
35                                        [IntrNoMem]>;
36}
37
38//===----------------------------------------------------------------------===//
39// FLAGS.
40let TargetPrefix = "x86" in {
41  def int_x86_flags_read_u32 : GCCBuiltin<"__builtin_ia32_readeflags_u32">,
42        Intrinsic<[llvm_i32_ty], [], []>;
43  def int_x86_flags_read_u64 : GCCBuiltin<"__builtin_ia32_readeflags_u64">,
44        Intrinsic<[llvm_i64_ty], [], []>;
45  def int_x86_flags_write_u32 : GCCBuiltin<"__builtin_ia32_writeeflags_u32">,
46        Intrinsic<[], [llvm_i32_ty], []>;
47  def int_x86_flags_write_u64 : GCCBuiltin<"__builtin_ia32_writeeflags_u64">,
48        Intrinsic<[], [llvm_i64_ty], []>;
49}
50
51//===----------------------------------------------------------------------===//
52// Read Time Stamp Counter.
53let TargetPrefix = "x86" in {
54  def int_x86_rdtsc : GCCBuiltin<"__builtin_ia32_rdtsc">,
55              Intrinsic<[llvm_i64_ty], [], []>;
56  def int_x86_rdtscp : GCCBuiltin<"__builtin_ia32_rdtscp">,
57              Intrinsic<[llvm_i64_ty], [llvm_ptr_ty], [IntrArgMemOnly]>;
58}
59
60// Read Performance-Monitoring Counter.
61let TargetPrefix = "x86" in {
62  def int_x86_rdpmc : GCCBuiltin<"__builtin_ia32_rdpmc">,
63              Intrinsic<[llvm_i64_ty], [llvm_i32_ty], []>;
64}
65
66// Read processor ID.
67let TargetPrefix = "x86" in {
68  def int_x86_rdpid : GCCBuiltin<"__builtin_ia32_rdpid">,
69              Intrinsic<[llvm_i32_ty], [], []>;
70}
71
72//===----------------------------------------------------------------------===//
73// CET SS
74let TargetPrefix = "x86" in {
75  def int_x86_incsspd : GCCBuiltin<"__builtin_ia32_incsspd">,
76              Intrinsic<[], [llvm_i32_ty], []>;
77  def int_x86_incsspq : GCCBuiltin<"__builtin_ia32_incsspq">,
78              Intrinsic<[], [llvm_i64_ty], []>;
79  def int_x86_rdsspd : GCCBuiltin<"__builtin_ia32_rdsspd">,
80              Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
81  def int_x86_rdsspq : GCCBuiltin<"__builtin_ia32_rdsspq">,
82              Intrinsic<[llvm_i64_ty], [llvm_i64_ty], []>;
83  def int_x86_saveprevssp : GCCBuiltin<"__builtin_ia32_saveprevssp">,
84              Intrinsic<[], [], []>;
85  def int_x86_rstorssp : GCCBuiltin<"__builtin_ia32_rstorssp">,
86              Intrinsic<[], [llvm_ptr_ty], []>;
87  def int_x86_wrssd : GCCBuiltin<"__builtin_ia32_wrssd">,
88              Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty], []>;
89  def int_x86_wrssq : GCCBuiltin<"__builtin_ia32_wrssq">,
90              Intrinsic<[], [llvm_i64_ty, llvm_ptr_ty], []>;
91  def int_x86_wrussd : GCCBuiltin<"__builtin_ia32_wrussd">,
92              Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty], []>;
93  def int_x86_wrussq : GCCBuiltin<"__builtin_ia32_wrussq">,
94              Intrinsic<[], [llvm_i64_ty, llvm_ptr_ty], []>;
95  def int_x86_setssbsy : GCCBuiltin<"__builtin_ia32_setssbsy">,
96              Intrinsic<[], [], []>;
97  def int_x86_clrssbsy : GCCBuiltin<"__builtin_ia32_clrssbsy">,
98              Intrinsic<[], [llvm_ptr_ty], []>;
99}
100
101//===----------------------------------------------------------------------===//
102// 3DNow!
103
104let TargetPrefix = "x86" in {
105  def int_x86_3dnow_pavgusb : GCCBuiltin<"__builtin_ia32_pavgusb">,
106              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
107                        [IntrNoMem]>;
108  def int_x86_3dnow_pf2id : GCCBuiltin<"__builtin_ia32_pf2id">,
109              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
110  def int_x86_3dnow_pfacc : GCCBuiltin<"__builtin_ia32_pfacc">,
111              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
112                        [IntrNoMem]>;
113  def int_x86_3dnow_pfadd : GCCBuiltin<"__builtin_ia32_pfadd">,
114              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
115                        [IntrNoMem]>;
116  def int_x86_3dnow_pfcmpeq : GCCBuiltin<"__builtin_ia32_pfcmpeq">,
117              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
118                        [IntrNoMem]>;
119  def int_x86_3dnow_pfcmpge : GCCBuiltin<"__builtin_ia32_pfcmpge">,
120              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
121                        [IntrNoMem]>;
122  def int_x86_3dnow_pfcmpgt : GCCBuiltin<"__builtin_ia32_pfcmpgt">,
123              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
124                        [IntrNoMem]>;
125  def int_x86_3dnow_pfmax : GCCBuiltin<"__builtin_ia32_pfmax">,
126              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
127                        [IntrNoMem]>;
128  def int_x86_3dnow_pfmin : GCCBuiltin<"__builtin_ia32_pfmin">,
129              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
130                        [IntrNoMem]>;
131  def int_x86_3dnow_pfmul : GCCBuiltin<"__builtin_ia32_pfmul">,
132              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
133                        [IntrNoMem]>;
134  def int_x86_3dnow_pfrcp : GCCBuiltin<"__builtin_ia32_pfrcp">,
135              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
136  def int_x86_3dnow_pfrcpit1 : GCCBuiltin<"__builtin_ia32_pfrcpit1">,
137              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
138                        [IntrNoMem]>;
139  def int_x86_3dnow_pfrcpit2 : GCCBuiltin<"__builtin_ia32_pfrcpit2">,
140              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
141                        [IntrNoMem]>;
142  def int_x86_3dnow_pfrsqrt : GCCBuiltin<"__builtin_ia32_pfrsqrt">,
143              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
144  def int_x86_3dnow_pfrsqit1 : GCCBuiltin<"__builtin_ia32_pfrsqit1">,
145              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
146                        [IntrNoMem]>;
147  def int_x86_3dnow_pfsub : GCCBuiltin<"__builtin_ia32_pfsub">,
148              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
149                        [IntrNoMem]>;
150  def int_x86_3dnow_pfsubr : GCCBuiltin<"__builtin_ia32_pfsubr">,
151              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
152                        [IntrNoMem]>;
153  def int_x86_3dnow_pi2fd : GCCBuiltin<"__builtin_ia32_pi2fd">,
154              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
155  def int_x86_3dnow_pmulhrw : GCCBuiltin<"__builtin_ia32_pmulhrw">,
156              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
157                        [IntrNoMem]>;
158}
159
160//===----------------------------------------------------------------------===//
161// 3DNow! extensions
162
163let TargetPrefix = "x86" in {
164  def int_x86_3dnowa_pf2iw : GCCBuiltin<"__builtin_ia32_pf2iw">,
165              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
166  def int_x86_3dnowa_pfnacc : GCCBuiltin<"__builtin_ia32_pfnacc">,
167              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
168                        [IntrNoMem]>;
169  def int_x86_3dnowa_pfpnacc : GCCBuiltin<"__builtin_ia32_pfpnacc">,
170              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
171                        [IntrNoMem]>;
172  def int_x86_3dnowa_pi2fw : GCCBuiltin<"__builtin_ia32_pi2fw">,
173              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
174  def int_x86_3dnowa_pswapd :
175              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
176}
177
178//===----------------------------------------------------------------------===//
179// SSE1
180
181// Arithmetic ops
182let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
183  def int_x86_sse_rcp_ss : GCCBuiltin<"__builtin_ia32_rcpss">,
184              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
185                        [IntrNoMem]>;
186  def int_x86_sse_rcp_ps : GCCBuiltin<"__builtin_ia32_rcpps">,
187              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
188                        [IntrNoMem]>;
189  def int_x86_sse_rsqrt_ss : GCCBuiltin<"__builtin_ia32_rsqrtss">,
190              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
191                        [IntrNoMem]>;
192  def int_x86_sse_rsqrt_ps : GCCBuiltin<"__builtin_ia32_rsqrtps">,
193              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
194                        [IntrNoMem]>;
195  def int_x86_sse_min_ss : GCCBuiltin<"__builtin_ia32_minss">,
196              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
197                         llvm_v4f32_ty], [IntrNoMem]>;
198  def int_x86_sse_min_ps : GCCBuiltin<"__builtin_ia32_minps">,
199              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
200                         llvm_v4f32_ty], [IntrNoMem]>;
201  def int_x86_sse_max_ss : GCCBuiltin<"__builtin_ia32_maxss">,
202              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
203                         llvm_v4f32_ty], [IntrNoMem]>;
204  def int_x86_sse_max_ps : GCCBuiltin<"__builtin_ia32_maxps">,
205              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
206                         llvm_v4f32_ty], [IntrNoMem]>;
207}
208
209// Comparison ops
210let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
211  def int_x86_sse_cmp_ss : GCCBuiltin<"__builtin_ia32_cmpss">,
212              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
213                         llvm_v4f32_ty, llvm_i8_ty], [IntrNoMem]>;
214  // NOTE: This comparison intrinsic is not used by clang as long as the
215  //       distinction in signaling behaviour is not implemented.
216  def int_x86_sse_cmp_ps :
217              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
218                         llvm_v4f32_ty, llvm_i8_ty], [IntrNoMem]>;
219  def int_x86_sse_comieq_ss : GCCBuiltin<"__builtin_ia32_comieq">,
220              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
221                         llvm_v4f32_ty], [IntrNoMem]>;
222  def int_x86_sse_comilt_ss : GCCBuiltin<"__builtin_ia32_comilt">,
223              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
224                         llvm_v4f32_ty], [IntrNoMem]>;
225  def int_x86_sse_comile_ss : GCCBuiltin<"__builtin_ia32_comile">,
226              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
227                         llvm_v4f32_ty], [IntrNoMem]>;
228  def int_x86_sse_comigt_ss : GCCBuiltin<"__builtin_ia32_comigt">,
229              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
230                         llvm_v4f32_ty], [IntrNoMem]>;
231  def int_x86_sse_comige_ss : GCCBuiltin<"__builtin_ia32_comige">,
232              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
233                         llvm_v4f32_ty], [IntrNoMem]>;
234  def int_x86_sse_comineq_ss : GCCBuiltin<"__builtin_ia32_comineq">,
235              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
236                         llvm_v4f32_ty], [IntrNoMem]>;
237  def int_x86_sse_ucomieq_ss : GCCBuiltin<"__builtin_ia32_ucomieq">,
238              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
239                         llvm_v4f32_ty], [IntrNoMem]>;
240  def int_x86_sse_ucomilt_ss : GCCBuiltin<"__builtin_ia32_ucomilt">,
241              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
242                         llvm_v4f32_ty], [IntrNoMem]>;
243  def int_x86_sse_ucomile_ss : GCCBuiltin<"__builtin_ia32_ucomile">,
244              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
245                         llvm_v4f32_ty], [IntrNoMem]>;
246  def int_x86_sse_ucomigt_ss : GCCBuiltin<"__builtin_ia32_ucomigt">,
247              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
248                         llvm_v4f32_ty], [IntrNoMem]>;
249  def int_x86_sse_ucomige_ss : GCCBuiltin<"__builtin_ia32_ucomige">,
250              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
251                         llvm_v4f32_ty], [IntrNoMem]>;
252  def int_x86_sse_ucomineq_ss : GCCBuiltin<"__builtin_ia32_ucomineq">,
253              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
254                         llvm_v4f32_ty], [IntrNoMem]>;
255}
256
257
258// Conversion ops
259let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
260  def int_x86_sse_cvtss2si : GCCBuiltin<"__builtin_ia32_cvtss2si">,
261              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
262  def int_x86_sse_cvtss2si64 : GCCBuiltin<"__builtin_ia32_cvtss2si64">,
263              Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty], [IntrNoMem]>;
264  def int_x86_sse_cvttss2si : GCCBuiltin<"__builtin_ia32_cvttss2si">,
265              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
266  def int_x86_sse_cvttss2si64 : GCCBuiltin<"__builtin_ia32_cvttss2si64">,
267              Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty], [IntrNoMem]>;
268
269  def int_x86_sse_cvtps2pi : GCCBuiltin<"__builtin_ia32_cvtps2pi">,
270              Intrinsic<[llvm_x86mmx_ty], [llvm_v4f32_ty], [IntrNoMem]>;
271  def int_x86_sse_cvttps2pi: GCCBuiltin<"__builtin_ia32_cvttps2pi">,
272              Intrinsic<[llvm_x86mmx_ty], [llvm_v4f32_ty], [IntrNoMem]>;
273  def int_x86_sse_cvtpi2ps : GCCBuiltin<"__builtin_ia32_cvtpi2ps">,
274              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
275                         llvm_x86mmx_ty], [IntrNoMem]>;
276}
277
278// Cacheability support ops
279let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
280  def int_x86_sse_sfence : GCCBuiltin<"__builtin_ia32_sfence">,
281              Intrinsic<[], [], []>;
282}
283
284// Control register.
285let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
286  def int_x86_sse_stmxcsr :
287              Intrinsic<[], [llvm_ptr_ty], []>;
288  def int_x86_sse_ldmxcsr :
289              Intrinsic<[], [llvm_ptr_ty], []>;
290}
291
292// Misc.
293let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
294  def int_x86_sse_movmsk_ps : GCCBuiltin<"__builtin_ia32_movmskps">,
295              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
296}
297
298//===----------------------------------------------------------------------===//
299// SSE2
300
301// FP arithmetic ops
302let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
303  def int_x86_sse2_min_sd : GCCBuiltin<"__builtin_ia32_minsd">,
304              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
305                         llvm_v2f64_ty], [IntrNoMem]>;
306  def int_x86_sse2_min_pd : GCCBuiltin<"__builtin_ia32_minpd">,
307              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
308                         llvm_v2f64_ty], [IntrNoMem]>;
309  def int_x86_sse2_max_sd : GCCBuiltin<"__builtin_ia32_maxsd">,
310              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
311                         llvm_v2f64_ty], [IntrNoMem]>;
312  def int_x86_sse2_max_pd : GCCBuiltin<"__builtin_ia32_maxpd">,
313              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
314                         llvm_v2f64_ty], [IntrNoMem]>;
315}
316
317// FP comparison ops
318let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
319  def int_x86_sse2_cmp_sd : GCCBuiltin<"__builtin_ia32_cmpsd">,
320              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
321                         llvm_v2f64_ty, llvm_i8_ty], [IntrNoMem]>;
322  // NOTE: This comparison intrinsic is not used by clang as long as the
323  //       distinction in signaling behaviour is not implemented.
324  def int_x86_sse2_cmp_pd :
325              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
326                         llvm_v2f64_ty, llvm_i8_ty], [IntrNoMem]>;
327  def int_x86_sse2_comieq_sd : GCCBuiltin<"__builtin_ia32_comisdeq">,
328              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
329                         llvm_v2f64_ty], [IntrNoMem]>;
330  def int_x86_sse2_comilt_sd : GCCBuiltin<"__builtin_ia32_comisdlt">,
331              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
332                         llvm_v2f64_ty], [IntrNoMem]>;
333  def int_x86_sse2_comile_sd : GCCBuiltin<"__builtin_ia32_comisdle">,
334              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
335                         llvm_v2f64_ty], [IntrNoMem]>;
336  def int_x86_sse2_comigt_sd : GCCBuiltin<"__builtin_ia32_comisdgt">,
337              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
338                         llvm_v2f64_ty], [IntrNoMem]>;
339  def int_x86_sse2_comige_sd : GCCBuiltin<"__builtin_ia32_comisdge">,
340              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
341                         llvm_v2f64_ty], [IntrNoMem]>;
342  def int_x86_sse2_comineq_sd : GCCBuiltin<"__builtin_ia32_comisdneq">,
343              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
344                         llvm_v2f64_ty], [IntrNoMem]>;
345  def int_x86_sse2_ucomieq_sd : GCCBuiltin<"__builtin_ia32_ucomisdeq">,
346              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
347                         llvm_v2f64_ty], [IntrNoMem]>;
348  def int_x86_sse2_ucomilt_sd : GCCBuiltin<"__builtin_ia32_ucomisdlt">,
349              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
350                         llvm_v2f64_ty], [IntrNoMem]>;
351  def int_x86_sse2_ucomile_sd : GCCBuiltin<"__builtin_ia32_ucomisdle">,
352              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
353                         llvm_v2f64_ty], [IntrNoMem]>;
354  def int_x86_sse2_ucomigt_sd : GCCBuiltin<"__builtin_ia32_ucomisdgt">,
355              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
356                         llvm_v2f64_ty], [IntrNoMem]>;
357  def int_x86_sse2_ucomige_sd : GCCBuiltin<"__builtin_ia32_ucomisdge">,
358              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
359                         llvm_v2f64_ty], [IntrNoMem]>;
360  def int_x86_sse2_ucomineq_sd : GCCBuiltin<"__builtin_ia32_ucomisdneq">,
361              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
362                         llvm_v2f64_ty], [IntrNoMem]>;
363}
364
365// Integer arithmetic ops.
366let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
367  def int_x86_sse2_padds_b : GCCBuiltin<"__builtin_ia32_paddsb128">,
368              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
369                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
370  def int_x86_sse2_padds_w : GCCBuiltin<"__builtin_ia32_paddsw128">,
371              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
372                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
373  def int_x86_sse2_paddus_b : GCCBuiltin<"__builtin_ia32_paddusb128">,
374              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
375                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
376  def int_x86_sse2_paddus_w : GCCBuiltin<"__builtin_ia32_paddusw128">,
377              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
378                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
379  def int_x86_sse2_psubs_b : GCCBuiltin<"__builtin_ia32_psubsb128">,
380              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
381                         llvm_v16i8_ty], [IntrNoMem]>;
382  def int_x86_sse2_psubs_w : GCCBuiltin<"__builtin_ia32_psubsw128">,
383              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
384                         llvm_v8i16_ty], [IntrNoMem]>;
385  def int_x86_sse2_psubus_b : GCCBuiltin<"__builtin_ia32_psubusb128">,
386              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
387                         llvm_v16i8_ty], [IntrNoMem]>;
388  def int_x86_sse2_psubus_w : GCCBuiltin<"__builtin_ia32_psubusw128">,
389              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
390                         llvm_v8i16_ty], [IntrNoMem]>;
391  def int_x86_sse2_pmulhu_w : GCCBuiltin<"__builtin_ia32_pmulhuw128">,
392              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
393                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
394  def int_x86_sse2_pmulh_w : GCCBuiltin<"__builtin_ia32_pmulhw128">,
395              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
396                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
397  def int_x86_sse2_pmadd_wd : GCCBuiltin<"__builtin_ia32_pmaddwd128">,
398              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty,
399                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
400  def int_x86_sse2_psad_bw : GCCBuiltin<"__builtin_ia32_psadbw128">,
401              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty,
402                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
403}
404
405// Integer shift ops.
406let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
407  def int_x86_sse2_psll_w : GCCBuiltin<"__builtin_ia32_psllw128">,
408              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
409                         llvm_v8i16_ty], [IntrNoMem]>;
410  def int_x86_sse2_psll_d : GCCBuiltin<"__builtin_ia32_pslld128">,
411              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
412                         llvm_v4i32_ty], [IntrNoMem]>;
413  def int_x86_sse2_psll_q : GCCBuiltin<"__builtin_ia32_psllq128">,
414              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
415                         llvm_v2i64_ty], [IntrNoMem]>;
416  def int_x86_sse2_psrl_w : GCCBuiltin<"__builtin_ia32_psrlw128">,
417              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
418                         llvm_v8i16_ty], [IntrNoMem]>;
419  def int_x86_sse2_psrl_d : GCCBuiltin<"__builtin_ia32_psrld128">,
420              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
421                         llvm_v4i32_ty], [IntrNoMem]>;
422  def int_x86_sse2_psrl_q : GCCBuiltin<"__builtin_ia32_psrlq128">,
423              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
424                         llvm_v2i64_ty], [IntrNoMem]>;
425  def int_x86_sse2_psra_w : GCCBuiltin<"__builtin_ia32_psraw128">,
426              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
427                         llvm_v8i16_ty], [IntrNoMem]>;
428  def int_x86_sse2_psra_d : GCCBuiltin<"__builtin_ia32_psrad128">,
429              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
430                         llvm_v4i32_ty], [IntrNoMem]>;
431
432  def int_x86_sse2_pslli_w : GCCBuiltin<"__builtin_ia32_psllwi128">,
433              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
434                         llvm_i32_ty], [IntrNoMem]>;
435  def int_x86_sse2_pslli_d : GCCBuiltin<"__builtin_ia32_pslldi128">,
436              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
437                         llvm_i32_ty], [IntrNoMem]>;
438  def int_x86_sse2_pslli_q : GCCBuiltin<"__builtin_ia32_psllqi128">,
439              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
440                         llvm_i32_ty], [IntrNoMem]>;
441  def int_x86_sse2_psrli_w : GCCBuiltin<"__builtin_ia32_psrlwi128">,
442              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
443                         llvm_i32_ty], [IntrNoMem]>;
444  def int_x86_sse2_psrli_d : GCCBuiltin<"__builtin_ia32_psrldi128">,
445              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
446                         llvm_i32_ty], [IntrNoMem]>;
447  def int_x86_sse2_psrli_q : GCCBuiltin<"__builtin_ia32_psrlqi128">,
448              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
449                         llvm_i32_ty], [IntrNoMem]>;
450  def int_x86_sse2_psrai_w : GCCBuiltin<"__builtin_ia32_psrawi128">,
451              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
452                         llvm_i32_ty], [IntrNoMem]>;
453  def int_x86_sse2_psrai_d : GCCBuiltin<"__builtin_ia32_psradi128">,
454              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
455                         llvm_i32_ty], [IntrNoMem]>;
456}
457
458// Conversion ops
459let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
460  def int_x86_sse2_cvtpd2dq : GCCBuiltin<"__builtin_ia32_cvtpd2dq">,
461              Intrinsic<[llvm_v4i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
462  def int_x86_sse2_cvttpd2dq : GCCBuiltin<"__builtin_ia32_cvttpd2dq">,
463              Intrinsic<[llvm_v4i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
464  def int_x86_sse2_cvtpd2ps : GCCBuiltin<"__builtin_ia32_cvtpd2ps">,
465              Intrinsic<[llvm_v4f32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
466  def int_x86_sse2_cvtps2dq : GCCBuiltin<"__builtin_ia32_cvtps2dq">,
467              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
468  def int_x86_sse2_cvttps2dq : GCCBuiltin<"__builtin_ia32_cvttps2dq">,
469              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
470  def int_x86_sse2_cvtsd2si : GCCBuiltin<"__builtin_ia32_cvtsd2si">,
471              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
472  def int_x86_sse2_cvtsd2si64 : GCCBuiltin<"__builtin_ia32_cvtsd2si64">,
473              Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
474  def int_x86_sse2_cvttsd2si : GCCBuiltin<"__builtin_ia32_cvttsd2si">,
475              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
476  def int_x86_sse2_cvttsd2si64 : GCCBuiltin<"__builtin_ia32_cvttsd2si64">,
477              Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
478  def int_x86_sse2_cvtsd2ss : GCCBuiltin<"__builtin_ia32_cvtsd2ss">,
479              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
480                         llvm_v2f64_ty], [IntrNoMem]>;
481  def int_x86_sse_cvtpd2pi : GCCBuiltin<"__builtin_ia32_cvtpd2pi">,
482              Intrinsic<[llvm_x86mmx_ty], [llvm_v2f64_ty], [IntrNoMem]>;
483  def int_x86_sse_cvttpd2pi: GCCBuiltin<"__builtin_ia32_cvttpd2pi">,
484              Intrinsic<[llvm_x86mmx_ty], [llvm_v2f64_ty], [IntrNoMem]>;
485  def int_x86_sse_cvtpi2pd : GCCBuiltin<"__builtin_ia32_cvtpi2pd">,
486              Intrinsic<[llvm_v2f64_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
487}
488
489// Misc.
490let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
491  def int_x86_sse2_packsswb_128 : GCCBuiltin<"__builtin_ia32_packsswb128">,
492              Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty,
493                         llvm_v8i16_ty], [IntrNoMem]>;
494  def int_x86_sse2_packssdw_128 : GCCBuiltin<"__builtin_ia32_packssdw128">,
495              Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty,
496                         llvm_v4i32_ty], [IntrNoMem]>;
497  def int_x86_sse2_packuswb_128 : GCCBuiltin<"__builtin_ia32_packuswb128">,
498              Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty,
499                         llvm_v8i16_ty], [IntrNoMem]>;
500  def int_x86_sse2_movmsk_pd : GCCBuiltin<"__builtin_ia32_movmskpd">,
501              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
502  def int_x86_sse2_pmovmskb_128 : GCCBuiltin<"__builtin_ia32_pmovmskb128">,
503              Intrinsic<[llvm_i32_ty], [llvm_v16i8_ty], [IntrNoMem]>;
504  def int_x86_sse2_maskmov_dqu : GCCBuiltin<"__builtin_ia32_maskmovdqu">,
505              Intrinsic<[], [llvm_v16i8_ty,
506                         llvm_v16i8_ty, llvm_ptr_ty], []>;
507  def int_x86_sse2_clflush : GCCBuiltin<"__builtin_ia32_clflush">,
508              Intrinsic<[], [llvm_ptr_ty], []>;
509  def int_x86_sse2_lfence : GCCBuiltin<"__builtin_ia32_lfence">,
510              Intrinsic<[], [], []>;
511  def int_x86_sse2_mfence : GCCBuiltin<"__builtin_ia32_mfence">,
512              Intrinsic<[], [], []>;
513  def int_x86_sse2_pause : GCCBuiltin<"__builtin_ia32_pause">,
514              Intrinsic<[], [], []>;
515}
516
517//===----------------------------------------------------------------------===//
518// SSE3
519
520// Addition / subtraction ops.
521let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
522  def int_x86_sse3_addsub_ps : GCCBuiltin<"__builtin_ia32_addsubps">,
523              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
524                         llvm_v4f32_ty], [IntrNoMem]>;
525  def int_x86_sse3_addsub_pd : GCCBuiltin<"__builtin_ia32_addsubpd">,
526              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
527                         llvm_v2f64_ty], [IntrNoMem]>;
528}
529
530// Horizontal ops.
531let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
532  def int_x86_sse3_hadd_ps : GCCBuiltin<"__builtin_ia32_haddps">,
533              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
534                         llvm_v4f32_ty], [IntrNoMem]>;
535  def int_x86_sse3_hadd_pd : GCCBuiltin<"__builtin_ia32_haddpd">,
536              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
537                         llvm_v2f64_ty], [IntrNoMem]>;
538  def int_x86_sse3_hsub_ps : GCCBuiltin<"__builtin_ia32_hsubps">,
539              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
540                         llvm_v4f32_ty], [IntrNoMem]>;
541  def int_x86_sse3_hsub_pd : GCCBuiltin<"__builtin_ia32_hsubpd">,
542              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
543                         llvm_v2f64_ty], [IntrNoMem]>;
544}
545
546// Specialized unaligned load.
547let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
548  def int_x86_sse3_ldu_dq : GCCBuiltin<"__builtin_ia32_lddqu">,
549              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrReadMem]>;
550}
551
552// Thread synchronization ops.
553let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
554  def int_x86_sse3_monitor : GCCBuiltin<"__builtin_ia32_monitor">,
555              Intrinsic<[], [llvm_ptr_ty,
556                         llvm_i32_ty, llvm_i32_ty], []>;
557  def int_x86_sse3_mwait : GCCBuiltin<"__builtin_ia32_mwait">,
558              Intrinsic<[], [llvm_i32_ty,
559                         llvm_i32_ty], []>;
560}
561
562//===----------------------------------------------------------------------===//
563// SSSE3
564
565// Horizontal arithmetic ops
566let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
567  def int_x86_ssse3_phadd_w         : GCCBuiltin<"__builtin_ia32_phaddw">,
568              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
569                         llvm_x86mmx_ty], [IntrNoMem]>;
570  def int_x86_ssse3_phadd_w_128     : GCCBuiltin<"__builtin_ia32_phaddw128">,
571              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
572                         llvm_v8i16_ty], [IntrNoMem]>;
573
574  def int_x86_ssse3_phadd_d         : GCCBuiltin<"__builtin_ia32_phaddd">,
575              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
576                         llvm_x86mmx_ty], [IntrNoMem]>;
577  def int_x86_ssse3_phadd_d_128     : GCCBuiltin<"__builtin_ia32_phaddd128">,
578              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
579                         llvm_v4i32_ty], [IntrNoMem]>;
580
581  def int_x86_ssse3_phadd_sw        : GCCBuiltin<"__builtin_ia32_phaddsw">,
582              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
583                         llvm_x86mmx_ty], [IntrNoMem]>;
584  def int_x86_ssse3_phadd_sw_128    : GCCBuiltin<"__builtin_ia32_phaddsw128">,
585              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
586                         llvm_v8i16_ty], [IntrNoMem]>;
587
588  def int_x86_ssse3_phsub_w         : GCCBuiltin<"__builtin_ia32_phsubw">,
589              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
590                         llvm_x86mmx_ty], [IntrNoMem]>;
591  def int_x86_ssse3_phsub_w_128     : GCCBuiltin<"__builtin_ia32_phsubw128">,
592              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
593                         llvm_v8i16_ty], [IntrNoMem]>;
594
595  def int_x86_ssse3_phsub_d         : GCCBuiltin<"__builtin_ia32_phsubd">,
596              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
597                         llvm_x86mmx_ty], [IntrNoMem]>;
598  def int_x86_ssse3_phsub_d_128     : GCCBuiltin<"__builtin_ia32_phsubd128">,
599              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
600                         llvm_v4i32_ty], [IntrNoMem]>;
601
602  def int_x86_ssse3_phsub_sw        : GCCBuiltin<"__builtin_ia32_phsubsw">,
603              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
604                         llvm_x86mmx_ty], [IntrNoMem]>;
605  def int_x86_ssse3_phsub_sw_128    : GCCBuiltin<"__builtin_ia32_phsubsw128">,
606              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
607                         llvm_v8i16_ty], [IntrNoMem]>;
608
609  def int_x86_ssse3_pmadd_ub_sw     : GCCBuiltin<"__builtin_ia32_pmaddubsw">,
610              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
611                         llvm_x86mmx_ty], [IntrNoMem]>;
612  def int_x86_ssse3_pmadd_ub_sw_128 : GCCBuiltin<"__builtin_ia32_pmaddubsw128">,
613              Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty,
614                         llvm_v16i8_ty], [IntrNoMem]>;
615}
616
617// Packed multiply high with round and scale
618let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
619  def int_x86_ssse3_pmul_hr_sw      : GCCBuiltin<"__builtin_ia32_pmulhrsw">,
620              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
621                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
622  def int_x86_ssse3_pmul_hr_sw_128  : GCCBuiltin<"__builtin_ia32_pmulhrsw128">,
623              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
624                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
625}
626
627// Shuffle ops
628let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
629  def int_x86_ssse3_pshuf_b         : GCCBuiltin<"__builtin_ia32_pshufb">,
630              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
631                         llvm_x86mmx_ty], [IntrNoMem]>;
632  def int_x86_ssse3_pshuf_b_128     : GCCBuiltin<"__builtin_ia32_pshufb128">,
633              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
634                         llvm_v16i8_ty], [IntrNoMem]>;
635  def int_x86_sse_pshuf_w           : GCCBuiltin<"__builtin_ia32_pshufw">,
636              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_i8_ty],
637                         [IntrNoMem]>;
638}
639
640// Sign ops
641let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
642  def int_x86_ssse3_psign_b         : GCCBuiltin<"__builtin_ia32_psignb">,
643              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
644                         llvm_x86mmx_ty], [IntrNoMem]>;
645  def int_x86_ssse3_psign_b_128     : GCCBuiltin<"__builtin_ia32_psignb128">,
646              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
647                         llvm_v16i8_ty], [IntrNoMem]>;
648
649  def int_x86_ssse3_psign_w         : GCCBuiltin<"__builtin_ia32_psignw">,
650              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
651                         llvm_x86mmx_ty], [IntrNoMem]>;
652  def int_x86_ssse3_psign_w_128     : GCCBuiltin<"__builtin_ia32_psignw128">,
653              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
654                         llvm_v8i16_ty], [IntrNoMem]>;
655
656  def int_x86_ssse3_psign_d         : GCCBuiltin<"__builtin_ia32_psignd">,
657              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
658                         llvm_x86mmx_ty], [IntrNoMem]>;
659  def int_x86_ssse3_psign_d_128     : GCCBuiltin<"__builtin_ia32_psignd128">,
660              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
661                         llvm_v4i32_ty], [IntrNoMem]>;
662}
663
664// Absolute value ops
665let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
666  def int_x86_ssse3_pabs_b     : GCCBuiltin<"__builtin_ia32_pabsb">,
667              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
668
669  def int_x86_ssse3_pabs_w     : GCCBuiltin<"__builtin_ia32_pabsw">,
670              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
671
672  def int_x86_ssse3_pabs_d     : GCCBuiltin<"__builtin_ia32_pabsd">,
673              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
674}
675
676//===----------------------------------------------------------------------===//
677// SSE4.1
678
679// FP rounding ops
680let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
681  def int_x86_sse41_round_ss        : GCCBuiltin<"__builtin_ia32_roundss">,
682              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
683                         llvm_i32_ty], [IntrNoMem]>;
684  def int_x86_sse41_round_ps        : GCCBuiltin<"__builtin_ia32_roundps">,
685              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
686                         llvm_i32_ty], [IntrNoMem]>;
687  def int_x86_sse41_round_sd        : GCCBuiltin<"__builtin_ia32_roundsd">,
688              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
689                         llvm_i32_ty], [IntrNoMem]>;
690  def int_x86_sse41_round_pd        : GCCBuiltin<"__builtin_ia32_roundpd">,
691              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
692                         llvm_i32_ty], [IntrNoMem]>;
693}
694
695// Vector min element
696let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
697  def int_x86_sse41_phminposuw     : GCCBuiltin<"__builtin_ia32_phminposuw128">,
698              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty],
699                        [IntrNoMem]>;
700}
701
702// Advanced Encryption Standard (AES) Instructions
703let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
704  def int_x86_aesni_aesimc          : GCCBuiltin<"__builtin_ia32_aesimc128">,
705              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty],
706                        [IntrNoMem]>;
707
708  def int_x86_aesni_aesenc          : GCCBuiltin<"__builtin_ia32_aesenc128">,
709              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
710                        [IntrNoMem]>;
711  def int_x86_aesni_aesenc_256      : GCCBuiltin<"__builtin_ia32_aesenc256">,
712              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty],
713                        [IntrNoMem]>;
714  def int_x86_aesni_aesenc_512      : GCCBuiltin<"__builtin_ia32_aesenc512">,
715              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty],
716                        [IntrNoMem]>;
717
718  def int_x86_aesni_aesenclast : GCCBuiltin<"__builtin_ia32_aesenclast128">,
719              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
720                        [IntrNoMem]>;
721  def int_x86_aesni_aesenclast_256 :
722    GCCBuiltin<"__builtin_ia32_aesenclast256">,
723    Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty],
724              [IntrNoMem]>;
725  def int_x86_aesni_aesenclast_512 :
726    GCCBuiltin<"__builtin_ia32_aesenclast512">,
727    Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty],
728              [IntrNoMem]>;
729
730  def int_x86_aesni_aesdec          : GCCBuiltin<"__builtin_ia32_aesdec128">,
731              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
732                        [IntrNoMem]>;
733  def int_x86_aesni_aesdec_256      : GCCBuiltin<"__builtin_ia32_aesdec256">,
734              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty],
735                        [IntrNoMem]>;
736  def int_x86_aesni_aesdec_512      : GCCBuiltin<"__builtin_ia32_aesdec512">,
737              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty],
738                        [IntrNoMem]>;
739
740  def int_x86_aesni_aesdeclast : GCCBuiltin<"__builtin_ia32_aesdeclast128">,
741              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
742                        [IntrNoMem]>;
743  def int_x86_aesni_aesdeclast_256 :
744    GCCBuiltin<"__builtin_ia32_aesdeclast256">,
745    Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty],
746              [IntrNoMem]>;
747  def int_x86_aesni_aesdeclast_512 :
748    GCCBuiltin<"__builtin_ia32_aesdeclast512">,
749    Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty],
750              [IntrNoMem]>;
751
752  def int_x86_aesni_aeskeygenassist :
753              GCCBuiltin<"__builtin_ia32_aeskeygenassist128">,
754              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_i8_ty],
755                        [IntrNoMem]>;
756}
757
758// PCLMUL instructions
759let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
760  def int_x86_pclmulqdq : GCCBuiltin<"__builtin_ia32_pclmulqdq128">,
761          Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty, llvm_i8_ty],
762                    [IntrNoMem]>;
763  def int_x86_pclmulqdq_256 : GCCBuiltin<"__builtin_ia32_pclmulqdq256">,
764          Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty, llvm_i8_ty],
765                    [IntrNoMem]>;
766  def int_x86_pclmulqdq_512 : GCCBuiltin<"__builtin_ia32_pclmulqdq512">,
767          Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty, llvm_i8_ty],
768                    [IntrNoMem]>;
769}
770
771// Vector pack
772let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
773  def int_x86_sse41_packusdw        : GCCBuiltin<"__builtin_ia32_packusdw128">,
774              Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
775                        [IntrNoMem]>;
776}
777
778// Vector insert
779let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
780  def int_x86_sse41_insertps       : GCCBuiltin<"__builtin_ia32_insertps128">,
781          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_i8_ty],
782                    [IntrNoMem]>;
783}
784
785// Vector blend
786let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
787  def int_x86_sse41_pblendvb         : GCCBuiltin<"__builtin_ia32_pblendvb128">,
788        Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,llvm_v16i8_ty],
789                  [IntrNoMem]>;
790  def int_x86_sse41_blendvpd         : GCCBuiltin<"__builtin_ia32_blendvpd">,
791        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,llvm_v2f64_ty],
792                  [IntrNoMem]>;
793  def int_x86_sse41_blendvps         : GCCBuiltin<"__builtin_ia32_blendvps">,
794        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,llvm_v4f32_ty],
795                  [IntrNoMem]>;
796}
797
798// Vector dot product
799let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
800  def int_x86_sse41_dppd            : GCCBuiltin<"__builtin_ia32_dppd">,
801          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty, llvm_i8_ty],
802                    [IntrNoMem, Commutative]>;
803  def int_x86_sse41_dpps            : GCCBuiltin<"__builtin_ia32_dpps">,
804          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_i8_ty],
805                    [IntrNoMem, Commutative]>;
806}
807
808// Vector sum of absolute differences
809let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
810  def int_x86_sse41_mpsadbw         : GCCBuiltin<"__builtin_ia32_mpsadbw128">,
811          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty,llvm_i8_ty],
812                    [IntrNoMem, Commutative]>;
813}
814
815// Test instruction with bitwise comparison.
816let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
817  def int_x86_sse41_ptestz          : GCCBuiltin<"__builtin_ia32_ptestz128">,
818          Intrinsic<[llvm_i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
819                    [IntrNoMem]>;
820  def int_x86_sse41_ptestc          : GCCBuiltin<"__builtin_ia32_ptestc128">,
821          Intrinsic<[llvm_i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
822                    [IntrNoMem]>;
823  def int_x86_sse41_ptestnzc        : GCCBuiltin<"__builtin_ia32_ptestnzc128">,
824          Intrinsic<[llvm_i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
825                    [IntrNoMem]>;
826}
827
828//===----------------------------------------------------------------------===//
829// SSE4.2
830
831// Miscellaneous
832// CRC Instruction
833let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
834  def int_x86_sse42_crc32_32_8       : GCCBuiltin<"__builtin_ia32_crc32qi">,
835          Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i8_ty],
836                    [IntrNoMem]>;
837  def int_x86_sse42_crc32_32_16      : GCCBuiltin<"__builtin_ia32_crc32hi">,
838          Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i16_ty],
839                    [IntrNoMem]>;
840  def int_x86_sse42_crc32_32_32      : GCCBuiltin<"__builtin_ia32_crc32si">,
841          Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
842                    [IntrNoMem]>;
843  def int_x86_sse42_crc32_64_64      : GCCBuiltin<"__builtin_ia32_crc32di">,
844          Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
845                    [IntrNoMem]>;
846}
847
848// String/text processing ops.
849let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
850  def int_x86_sse42_pcmpistrm128  : GCCBuiltin<"__builtin_ia32_pcmpistrm128">,
851    Intrinsic<[llvm_v16i8_ty],
852        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
853        [IntrNoMem]>;
854  def int_x86_sse42_pcmpistri128  : GCCBuiltin<"__builtin_ia32_pcmpistri128">,
855    Intrinsic<[llvm_i32_ty],
856        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
857        [IntrNoMem]>;
858  def int_x86_sse42_pcmpistria128 : GCCBuiltin<"__builtin_ia32_pcmpistria128">,
859    Intrinsic<[llvm_i32_ty],
860        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
861        [IntrNoMem]>;
862  def int_x86_sse42_pcmpistric128 : GCCBuiltin<"__builtin_ia32_pcmpistric128">,
863    Intrinsic<[llvm_i32_ty],
864        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
865        [IntrNoMem]>;
866  def int_x86_sse42_pcmpistrio128 : GCCBuiltin<"__builtin_ia32_pcmpistrio128">,
867    Intrinsic<[llvm_i32_ty],
868        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
869        [IntrNoMem]>;
870  def int_x86_sse42_pcmpistris128 : GCCBuiltin<"__builtin_ia32_pcmpistris128">,
871    Intrinsic<[llvm_i32_ty],
872        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
873        [IntrNoMem]>;
874  def int_x86_sse42_pcmpistriz128 : GCCBuiltin<"__builtin_ia32_pcmpistriz128">,
875    Intrinsic<[llvm_i32_ty],
876        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
877        [IntrNoMem]>;
878  def int_x86_sse42_pcmpestrm128  : GCCBuiltin<"__builtin_ia32_pcmpestrm128">,
879    Intrinsic<[llvm_v16i8_ty],
880        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
881         llvm_i8_ty],
882        [IntrNoMem]>;
883  def int_x86_sse42_pcmpestri128  : GCCBuiltin<"__builtin_ia32_pcmpestri128">,
884    Intrinsic<[llvm_i32_ty],
885        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
886         llvm_i8_ty],
887        [IntrNoMem]>;
888  def int_x86_sse42_pcmpestria128 : GCCBuiltin<"__builtin_ia32_pcmpestria128">,
889    Intrinsic<[llvm_i32_ty],
890        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
891         llvm_i8_ty],
892        [IntrNoMem]>;
893  def int_x86_sse42_pcmpestric128 : GCCBuiltin<"__builtin_ia32_pcmpestric128">,
894    Intrinsic<[llvm_i32_ty],
895        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
896         llvm_i8_ty],
897        [IntrNoMem]>;
898  def int_x86_sse42_pcmpestrio128 : GCCBuiltin<"__builtin_ia32_pcmpestrio128">,
899    Intrinsic<[llvm_i32_ty],
900        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
901         llvm_i8_ty],
902        [IntrNoMem]>;
903  def int_x86_sse42_pcmpestris128 : GCCBuiltin<"__builtin_ia32_pcmpestris128">,
904    Intrinsic<[llvm_i32_ty],
905        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
906         llvm_i8_ty],
907        [IntrNoMem]>;
908  def int_x86_sse42_pcmpestriz128 : GCCBuiltin<"__builtin_ia32_pcmpestriz128">,
909    Intrinsic<[llvm_i32_ty],
910        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
911         llvm_i8_ty],
912        [IntrNoMem]>;
913}
914
915//===----------------------------------------------------------------------===//
916// SSE4A
917
918let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
919  def int_x86_sse4a_extrqi : GCCBuiltin<"__builtin_ia32_extrqi">,
920    Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_i8_ty, llvm_i8_ty],
921              [IntrNoMem]>;
922  def int_x86_sse4a_extrq  : GCCBuiltin<"__builtin_ia32_extrq">,
923    Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v16i8_ty], [IntrNoMem]>;
924
925  def int_x86_sse4a_insertqi : GCCBuiltin<"__builtin_ia32_insertqi">,
926    Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
927                                llvm_i8_ty, llvm_i8_ty], [IntrNoMem]>;
928  def int_x86_sse4a_insertq  : GCCBuiltin<"__builtin_ia32_insertq">,
929    Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty], [IntrNoMem]>;
930}
931
932//===----------------------------------------------------------------------===//
933// AVX
934
935// Arithmetic ops
936let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
937  def int_x86_avx_addsub_pd_256 : GCCBuiltin<"__builtin_ia32_addsubpd256">,
938        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
939                  llvm_v4f64_ty], [IntrNoMem]>;
940  def int_x86_avx_addsub_ps_256 : GCCBuiltin<"__builtin_ia32_addsubps256">,
941        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
942                  llvm_v8f32_ty], [IntrNoMem]>;
943  def int_x86_avx_max_pd_256 : GCCBuiltin<"__builtin_ia32_maxpd256">,
944        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
945                  llvm_v4f64_ty], [IntrNoMem]>;
946  def int_x86_avx_max_ps_256 : GCCBuiltin<"__builtin_ia32_maxps256">,
947        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
948                  llvm_v8f32_ty], [IntrNoMem]>;
949  def int_x86_avx_min_pd_256 : GCCBuiltin<"__builtin_ia32_minpd256">,
950        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
951                  llvm_v4f64_ty], [IntrNoMem]>;
952  def int_x86_avx_min_ps_256 : GCCBuiltin<"__builtin_ia32_minps256">,
953        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
954                  llvm_v8f32_ty], [IntrNoMem]>;
955
956  def int_x86_avx_rsqrt_ps_256 : GCCBuiltin<"__builtin_ia32_rsqrtps256">,
957        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
958
959  def int_x86_avx_rcp_ps_256 : GCCBuiltin<"__builtin_ia32_rcpps256">,
960        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
961
962  def int_x86_avx_round_pd_256 : GCCBuiltin<"__builtin_ia32_roundpd256">,
963        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
964                  llvm_i32_ty], [IntrNoMem]>;
965  def int_x86_avx_round_ps_256 : GCCBuiltin<"__builtin_ia32_roundps256">,
966        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
967                  llvm_i32_ty], [IntrNoMem]>;
968}
969
970// Horizontal ops
971let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
972  def int_x86_avx_hadd_pd_256 : GCCBuiltin<"__builtin_ia32_haddpd256">,
973        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
974                  llvm_v4f64_ty], [IntrNoMem]>;
975  def int_x86_avx_hsub_ps_256 : GCCBuiltin<"__builtin_ia32_hsubps256">,
976        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
977                  llvm_v8f32_ty], [IntrNoMem]>;
978  def int_x86_avx_hsub_pd_256 : GCCBuiltin<"__builtin_ia32_hsubpd256">,
979        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
980                  llvm_v4f64_ty], [IntrNoMem]>;
981  def int_x86_avx_hadd_ps_256 : GCCBuiltin<"__builtin_ia32_haddps256">,
982        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
983                  llvm_v8f32_ty], [IntrNoMem]>;
984}
985
986// Vector permutation
987let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
988  def int_x86_avx_vpermilvar_pd : GCCBuiltin<"__builtin_ia32_vpermilvarpd">,
989        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
990                  llvm_v2i64_ty], [IntrNoMem]>;
991  def int_x86_avx_vpermilvar_ps : GCCBuiltin<"__builtin_ia32_vpermilvarps">,
992        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
993                  llvm_v4i32_ty], [IntrNoMem]>;
994
995  def int_x86_avx_vpermilvar_pd_256 :
996        GCCBuiltin<"__builtin_ia32_vpermilvarpd256">,
997        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4i64_ty], [IntrNoMem]>;
998  def int_x86_avx_vpermilvar_ps_256 :
999        GCCBuiltin<"__builtin_ia32_vpermilvarps256">,
1000        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8i32_ty], [IntrNoMem]>;
1001
1002  def int_x86_avx512_vpermi2var_d_128 :
1003       GCCBuiltin<"__builtin_ia32_vpermi2vard128">,
1004       Intrinsic<[llvm_v4i32_ty],
1005                 [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
1006
1007  def int_x86_avx512_vpermi2var_d_256 :
1008        GCCBuiltin<"__builtin_ia32_vpermi2vard256">,
1009        Intrinsic<[llvm_v8i32_ty],
1010                  [llvm_v8i32_ty, llvm_v8i32_ty, llvm_v8i32_ty], [IntrNoMem]>;
1011
1012  def int_x86_avx512_vpermi2var_d_512 :
1013        GCCBuiltin<"__builtin_ia32_vpermi2vard512">,
1014        Intrinsic<[llvm_v16i32_ty],
1015                  [llvm_v16i32_ty, llvm_v16i32_ty, llvm_v16i32_ty],
1016                  [IntrNoMem]>;
1017
1018  def int_x86_avx512_vpermi2var_hi_128 :
1019        GCCBuiltin<"__builtin_ia32_vpermi2varhi128">,
1020        Intrinsic<[llvm_v8i16_ty],
1021                  [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty], [IntrNoMem]>;
1022
1023  def int_x86_avx512_vpermi2var_hi_256 :
1024        GCCBuiltin<"__builtin_ia32_vpermi2varhi256">,
1025        Intrinsic<[llvm_v16i16_ty],
1026                  [llvm_v16i16_ty, llvm_v16i16_ty, llvm_v16i16_ty],
1027                  [IntrNoMem]>;
1028
1029  def int_x86_avx512_vpermi2var_hi_512 :
1030        GCCBuiltin<"__builtin_ia32_vpermi2varhi512">,
1031        Intrinsic<[llvm_v32i16_ty],
1032                  [llvm_v32i16_ty, llvm_v32i16_ty, llvm_v32i16_ty],
1033                  [IntrNoMem]>;
1034
1035  def int_x86_avx512_vpermi2var_pd_128 :
1036        GCCBuiltin<"__builtin_ia32_vpermi2varpd128">,
1037        Intrinsic<[llvm_v2f64_ty],
1038                  [llvm_v2f64_ty, llvm_v2i64_ty, llvm_v2f64_ty], [IntrNoMem]>;
1039
1040  def int_x86_avx512_vpermi2var_pd_256 :
1041        GCCBuiltin<"__builtin_ia32_vpermi2varpd256">,
1042        Intrinsic<[llvm_v4f64_ty],
1043                  [llvm_v4f64_ty, llvm_v4i64_ty, llvm_v4f64_ty], [IntrNoMem]>;
1044
1045  def int_x86_avx512_vpermi2var_pd_512 :
1046        GCCBuiltin<"__builtin_ia32_vpermi2varpd512">,
1047        Intrinsic<[llvm_v8f64_ty],
1048                  [llvm_v8f64_ty, llvm_v8i64_ty, llvm_v8f64_ty], [IntrNoMem]>;
1049
1050  def int_x86_avx512_vpermi2var_ps_128 :
1051        GCCBuiltin<"__builtin_ia32_vpermi2varps128">,
1052        Intrinsic<[llvm_v4f32_ty],
1053                  [llvm_v4f32_ty, llvm_v4i32_ty, llvm_v4f32_ty], [IntrNoMem]>;
1054
1055  def int_x86_avx512_vpermi2var_ps_256 :
1056        GCCBuiltin<"__builtin_ia32_vpermi2varps256">,
1057        Intrinsic<[llvm_v8f32_ty],
1058                  [llvm_v8f32_ty, llvm_v8i32_ty, llvm_v8f32_ty], [IntrNoMem]>;
1059
1060  def int_x86_avx512_vpermi2var_ps_512 :
1061        GCCBuiltin<"__builtin_ia32_vpermi2varps512">,
1062        Intrinsic<[llvm_v16f32_ty],
1063                  [llvm_v16f32_ty, llvm_v16i32_ty, llvm_v16f32_ty],
1064                  [IntrNoMem]>;
1065
1066  def int_x86_avx512_vpermi2var_q_128 :
1067        GCCBuiltin<"__builtin_ia32_vpermi2varq128">,
1068        Intrinsic<[llvm_v2i64_ty],
1069                  [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty], [IntrNoMem]>;
1070
1071  def int_x86_avx512_vpermi2var_q_256 :
1072        GCCBuiltin<"__builtin_ia32_vpermi2varq256">,
1073        Intrinsic<[llvm_v4i64_ty],
1074                  [llvm_v4i64_ty, llvm_v4i64_ty, llvm_v4i64_ty], [IntrNoMem]>;
1075
1076  def int_x86_avx512_vpermi2var_q_512 :
1077        GCCBuiltin<"__builtin_ia32_vpermi2varq512">,
1078        Intrinsic<[llvm_v8i64_ty],
1079                  [llvm_v8i64_ty, llvm_v8i64_ty, llvm_v8i64_ty], [IntrNoMem]>;
1080
1081  def int_x86_avx512_vpermi2var_qi_128 :
1082        GCCBuiltin<"__builtin_ia32_vpermi2varqi128">,
1083        Intrinsic<[llvm_v16i8_ty],
1084                  [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty], [IntrNoMem]>;
1085
1086  def int_x86_avx512_vpermi2var_qi_256 :
1087        GCCBuiltin<"__builtin_ia32_vpermi2varqi256">,
1088        Intrinsic<[llvm_v32i8_ty],
1089                  [llvm_v32i8_ty, llvm_v32i8_ty, llvm_v32i8_ty], [IntrNoMem]>;
1090
1091  def int_x86_avx512_vpermi2var_qi_512 :
1092        GCCBuiltin<"__builtin_ia32_vpermi2varqi512">,
1093        Intrinsic<[llvm_v64i8_ty],
1094                  [llvm_v64i8_ty, llvm_v64i8_ty, llvm_v64i8_ty], [IntrNoMem]>;
1095
1096  def int_x86_avx512_vpermilvar_pd_512 :
1097        GCCBuiltin<"__builtin_ia32_vpermilvarpd512">,
1098          Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8i64_ty],
1099          [IntrNoMem]>;
1100
1101  def int_x86_avx512_vpermilvar_ps_512 :
1102        GCCBuiltin<"__builtin_ia32_vpermilvarps512">,
1103          Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16i32_ty],
1104          [IntrNoMem]>;
1105
1106  def int_x86_avx512_pshuf_b_512 :
1107        GCCBuiltin<"__builtin_ia32_pshufb512">,
1108          Intrinsic<[llvm_v64i8_ty], [llvm_v64i8_ty, llvm_v64i8_ty],
1109          [IntrNoMem]>;
1110
1111}
1112
1113// GFNI Instructions
1114let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1115  def int_x86_vgf2p8affineinvqb_128 :
1116         GCCBuiltin<"__builtin_ia32_vgf2p8affineinvqb_v16qi">,
1117          Intrinsic<[llvm_v16i8_ty],
1118          [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
1119          [IntrNoMem]>;
1120  def int_x86_vgf2p8affineinvqb_256 :
1121         GCCBuiltin<"__builtin_ia32_vgf2p8affineinvqb_v32qi">,
1122          Intrinsic<[llvm_v32i8_ty],
1123          [llvm_v32i8_ty, llvm_v32i8_ty, llvm_i8_ty],
1124          [IntrNoMem]>;
1125  def int_x86_vgf2p8affineinvqb_512 :
1126         GCCBuiltin<"__builtin_ia32_vgf2p8affineinvqb_v64qi">,
1127          Intrinsic<[llvm_v64i8_ty],
1128          [llvm_v64i8_ty, llvm_v64i8_ty, llvm_i8_ty],
1129          [IntrNoMem]>;
1130
1131  def int_x86_vgf2p8affineqb_128 :
1132         GCCBuiltin<"__builtin_ia32_vgf2p8affineqb_v16qi">,
1133          Intrinsic<[llvm_v16i8_ty],
1134          [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
1135          [IntrNoMem]>;
1136  def int_x86_vgf2p8affineqb_256 :
1137         GCCBuiltin<"__builtin_ia32_vgf2p8affineqb_v32qi">,
1138          Intrinsic<[llvm_v32i8_ty],
1139          [llvm_v32i8_ty, llvm_v32i8_ty, llvm_i8_ty],
1140          [IntrNoMem]>;
1141  def int_x86_vgf2p8affineqb_512 :
1142         GCCBuiltin<"__builtin_ia32_vgf2p8affineqb_v64qi">,
1143          Intrinsic<[llvm_v64i8_ty],
1144          [llvm_v64i8_ty, llvm_v64i8_ty, llvm_i8_ty],
1145          [IntrNoMem]>;
1146
1147  def int_x86_vgf2p8mulb_128     :
1148         GCCBuiltin<"__builtin_ia32_vgf2p8mulb_v16qi">,
1149          Intrinsic<[llvm_v16i8_ty],
1150          [llvm_v16i8_ty, llvm_v16i8_ty],
1151          [IntrNoMem]>;
1152  def int_x86_vgf2p8mulb_256     :
1153         GCCBuiltin<"__builtin_ia32_vgf2p8mulb_v32qi">,
1154          Intrinsic<[llvm_v32i8_ty],
1155          [llvm_v32i8_ty, llvm_v32i8_ty],
1156          [IntrNoMem]>;
1157  def int_x86_vgf2p8mulb_512     :
1158         GCCBuiltin<"__builtin_ia32_vgf2p8mulb_v64qi">,
1159          Intrinsic<[llvm_v64i8_ty],
1160          [llvm_v64i8_ty, llvm_v64i8_ty],
1161          [IntrNoMem]>;
1162}
1163
1164// Vector blend
1165let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1166  def int_x86_avx_blendv_pd_256 : GCCBuiltin<"__builtin_ia32_blendvpd256">,
1167        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1168                  llvm_v4f64_ty, llvm_v4f64_ty], [IntrNoMem]>;
1169  def int_x86_avx_blendv_ps_256 : GCCBuiltin<"__builtin_ia32_blendvps256">,
1170        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1171                  llvm_v8f32_ty, llvm_v8f32_ty], [IntrNoMem]>;
1172}
1173
1174// Vector dot product
1175let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1176  def int_x86_avx_dp_ps_256 : GCCBuiltin<"__builtin_ia32_dpps256">,
1177        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1178                  llvm_v8f32_ty, llvm_i8_ty], [IntrNoMem, Commutative]>;
1179}
1180
1181// Vector compare
1182let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1183  def int_x86_avx_cmp_pd_256 :
1184        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1185                  llvm_v4f64_ty, llvm_i8_ty], [IntrNoMem]>;
1186  def int_x86_avx_cmp_ps_256 :
1187        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1188                  llvm_v8f32_ty, llvm_i8_ty], [IntrNoMem]>;
1189}
1190
1191// Vector convert
1192let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1193  def int_x86_avx_cvt_pd2_ps_256 : GCCBuiltin<"__builtin_ia32_cvtpd2ps256">,
1194        Intrinsic<[llvm_v4f32_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1195  def int_x86_avx_cvt_ps2dq_256 : GCCBuiltin<"__builtin_ia32_cvtps2dq256">,
1196        Intrinsic<[llvm_v8i32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1197  def int_x86_avx_cvtt_pd2dq_256 : GCCBuiltin<"__builtin_ia32_cvttpd2dq256">,
1198        Intrinsic<[llvm_v4i32_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1199  def int_x86_avx_cvt_pd2dq_256 : GCCBuiltin<"__builtin_ia32_cvtpd2dq256">,
1200        Intrinsic<[llvm_v4i32_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1201  def int_x86_avx_cvtt_ps2dq_256 : GCCBuiltin<"__builtin_ia32_cvttps2dq256">,
1202        Intrinsic<[llvm_v8i32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1203}
1204
1205// Vector bit test
1206let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1207  def int_x86_avx_vtestz_pd : GCCBuiltin<"__builtin_ia32_vtestzpd">,
1208        Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
1209                  llvm_v2f64_ty], [IntrNoMem]>;
1210  def int_x86_avx_vtestc_pd : GCCBuiltin<"__builtin_ia32_vtestcpd">,
1211        Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
1212                  llvm_v2f64_ty], [IntrNoMem]>;
1213  def int_x86_avx_vtestnzc_pd : GCCBuiltin<"__builtin_ia32_vtestnzcpd">,
1214        Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
1215                  llvm_v2f64_ty], [IntrNoMem]>;
1216  def int_x86_avx_vtestz_ps : GCCBuiltin<"__builtin_ia32_vtestzps">,
1217        Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
1218                  llvm_v4f32_ty], [IntrNoMem]>;
1219  def int_x86_avx_vtestc_ps : GCCBuiltin<"__builtin_ia32_vtestcps">,
1220        Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
1221                  llvm_v4f32_ty], [IntrNoMem]>;
1222  def int_x86_avx_vtestnzc_ps : GCCBuiltin<"__builtin_ia32_vtestnzcps">,
1223        Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
1224                  llvm_v4f32_ty], [IntrNoMem]>;
1225  def int_x86_avx_vtestz_pd_256 : GCCBuiltin<"__builtin_ia32_vtestzpd256">,
1226        Intrinsic<[llvm_i32_ty], [llvm_v4f64_ty,
1227                  llvm_v4f64_ty], [IntrNoMem]>;
1228  def int_x86_avx_vtestc_pd_256 : GCCBuiltin<"__builtin_ia32_vtestcpd256">,
1229        Intrinsic<[llvm_i32_ty], [llvm_v4f64_ty,
1230                  llvm_v4f64_ty], [IntrNoMem]>;
1231  def int_x86_avx_vtestnzc_pd_256 : GCCBuiltin<"__builtin_ia32_vtestnzcpd256">,
1232        Intrinsic<[llvm_i32_ty], [llvm_v4f64_ty,
1233                  llvm_v4f64_ty], [IntrNoMem]>;
1234  def int_x86_avx_vtestz_ps_256 : GCCBuiltin<"__builtin_ia32_vtestzps256">,
1235        Intrinsic<[llvm_i32_ty], [llvm_v8f32_ty,
1236                  llvm_v8f32_ty], [IntrNoMem]>;
1237  def int_x86_avx_vtestc_ps_256 : GCCBuiltin<"__builtin_ia32_vtestcps256">,
1238        Intrinsic<[llvm_i32_ty], [llvm_v8f32_ty,
1239                  llvm_v8f32_ty], [IntrNoMem]>;
1240  def int_x86_avx_vtestnzc_ps_256 : GCCBuiltin<"__builtin_ia32_vtestnzcps256">,
1241        Intrinsic<[llvm_i32_ty], [llvm_v8f32_ty,
1242                  llvm_v8f32_ty], [IntrNoMem]>;
1243  def int_x86_avx_ptestz_256 : GCCBuiltin<"__builtin_ia32_ptestz256">,
1244        Intrinsic<[llvm_i32_ty], [llvm_v4i64_ty,
1245                  llvm_v4i64_ty], [IntrNoMem]>;
1246  def int_x86_avx_ptestc_256 : GCCBuiltin<"__builtin_ia32_ptestc256">,
1247        Intrinsic<[llvm_i32_ty], [llvm_v4i64_ty,
1248                  llvm_v4i64_ty], [IntrNoMem]>;
1249  def int_x86_avx_ptestnzc_256 : GCCBuiltin<"__builtin_ia32_ptestnzc256">,
1250        Intrinsic<[llvm_i32_ty], [llvm_v4i64_ty,
1251                  llvm_v4i64_ty], [IntrNoMem]>;
1252
1253  def int_x86_avx512_fpclass_pd_128 :
1254          Intrinsic<[llvm_v2i1_ty], [llvm_v2f64_ty, llvm_i32_ty],
1255          [IntrNoMem]>;
1256  def int_x86_avx512_fpclass_pd_256 :
1257          Intrinsic<[llvm_v4i1_ty], [llvm_v4f64_ty, llvm_i32_ty],
1258          [IntrNoMem]>;
1259  def int_x86_avx512_fpclass_pd_512 :
1260          Intrinsic<[llvm_v8i1_ty], [llvm_v8f64_ty, llvm_i32_ty],
1261          [IntrNoMem]>;
1262  def int_x86_avx512_fpclass_ps_128 :
1263          Intrinsic<[llvm_v4i1_ty], [llvm_v4f32_ty, llvm_i32_ty],
1264          [IntrNoMem]>;
1265  def int_x86_avx512_fpclass_ps_256 :
1266          Intrinsic<[llvm_v8i1_ty], [llvm_v8f32_ty, llvm_i32_ty],
1267          [IntrNoMem]>;
1268  def int_x86_avx512_fpclass_ps_512 :
1269          Intrinsic<[llvm_v16i1_ty], [llvm_v16f32_ty, llvm_i32_ty],
1270          [IntrNoMem]>;
1271  def int_x86_avx512_mask_fpclass_sd :
1272         GCCBuiltin<"__builtin_ia32_fpclasssd_mask">,
1273          Intrinsic<[llvm_i8_ty], [llvm_v2f64_ty, llvm_i32_ty, llvm_i8_ty],
1274          [IntrNoMem]>;
1275  def int_x86_avx512_mask_fpclass_ss :
1276         GCCBuiltin<"__builtin_ia32_fpclassss_mask">,
1277          Intrinsic<[llvm_i8_ty], [llvm_v4f32_ty, llvm_i32_ty, llvm_i8_ty],
1278          [IntrNoMem]>;
1279}
1280
1281// Vector extract sign mask
1282let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1283  def int_x86_avx_movmsk_pd_256 : GCCBuiltin<"__builtin_ia32_movmskpd256">,
1284        Intrinsic<[llvm_i32_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1285  def int_x86_avx_movmsk_ps_256 : GCCBuiltin<"__builtin_ia32_movmskps256">,
1286        Intrinsic<[llvm_i32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1287}
1288
1289// Vector zero
1290let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1291  def int_x86_avx_vzeroall : GCCBuiltin<"__builtin_ia32_vzeroall">,
1292        Intrinsic<[], [], []>;
1293  def int_x86_avx_vzeroupper : GCCBuiltin<"__builtin_ia32_vzeroupper">,
1294        Intrinsic<[], [], []>;
1295}
1296
1297// SIMD load ops
1298let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1299  def int_x86_avx_ldu_dq_256 : GCCBuiltin<"__builtin_ia32_lddqu256">,
1300        Intrinsic<[llvm_v32i8_ty], [llvm_ptr_ty], [IntrReadMem]>;
1301}
1302
1303// Conditional load ops
1304let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1305  def int_x86_avx_maskload_pd : GCCBuiltin<"__builtin_ia32_maskloadpd">,
1306        Intrinsic<[llvm_v2f64_ty], [llvm_ptr_ty, llvm_v2i64_ty],
1307                  [IntrReadMem, IntrArgMemOnly]>;
1308  def int_x86_avx_maskload_ps : GCCBuiltin<"__builtin_ia32_maskloadps">,
1309        Intrinsic<[llvm_v4f32_ty], [llvm_ptr_ty, llvm_v4i32_ty],
1310                  [IntrReadMem, IntrArgMemOnly]>;
1311  def int_x86_avx_maskload_pd_256 : GCCBuiltin<"__builtin_ia32_maskloadpd256">,
1312        Intrinsic<[llvm_v4f64_ty], [llvm_ptr_ty, llvm_v4i64_ty],
1313                  [IntrReadMem, IntrArgMemOnly]>;
1314  def int_x86_avx_maskload_ps_256 : GCCBuiltin<"__builtin_ia32_maskloadps256">,
1315        Intrinsic<[llvm_v8f32_ty], [llvm_ptr_ty, llvm_v8i32_ty],
1316                  [IntrReadMem, IntrArgMemOnly]>;
1317}
1318
1319// Conditional store ops
1320let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1321  def int_x86_avx_maskstore_pd : GCCBuiltin<"__builtin_ia32_maskstorepd">,
1322        Intrinsic<[], [llvm_ptr_ty,
1323                  llvm_v2i64_ty, llvm_v2f64_ty], [IntrArgMemOnly]>;
1324  def int_x86_avx_maskstore_ps : GCCBuiltin<"__builtin_ia32_maskstoreps">,
1325        Intrinsic<[], [llvm_ptr_ty,
1326                  llvm_v4i32_ty, llvm_v4f32_ty], [IntrArgMemOnly]>;
1327  def int_x86_avx_maskstore_pd_256 :
1328        GCCBuiltin<"__builtin_ia32_maskstorepd256">,
1329        Intrinsic<[], [llvm_ptr_ty,
1330                  llvm_v4i64_ty, llvm_v4f64_ty], [IntrArgMemOnly]>;
1331  def int_x86_avx_maskstore_ps_256 :
1332        GCCBuiltin<"__builtin_ia32_maskstoreps256">,
1333        Intrinsic<[], [llvm_ptr_ty,
1334                  llvm_v8i32_ty, llvm_v8f32_ty], [IntrArgMemOnly]>;
1335}
1336
1337// BITALG bits shuffle
1338let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1339  def int_x86_avx512_mask_vpshufbitqmb_128 :
1340    GCCBuiltin<"__builtin_ia32_vpshufbitqmb128_mask">,
1341    Intrinsic<[llvm_i16_ty],
1342              [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i16_ty],
1343              [IntrNoMem]>;
1344  def int_x86_avx512_mask_vpshufbitqmb_256 :
1345    GCCBuiltin<"__builtin_ia32_vpshufbitqmb256_mask">,
1346    Intrinsic<[llvm_i32_ty],
1347              [llvm_v32i8_ty, llvm_v32i8_ty, llvm_i32_ty],
1348              [IntrNoMem]>;
1349  def int_x86_avx512_mask_vpshufbitqmb_512 :
1350    GCCBuiltin<"__builtin_ia32_vpshufbitqmb512_mask">,
1351    Intrinsic<[llvm_i64_ty],
1352              [llvm_v64i8_ty, llvm_v64i8_ty, llvm_i64_ty],
1353              [IntrNoMem]>;
1354}
1355
1356//===----------------------------------------------------------------------===//
1357// AVX2
1358
1359// Integer arithmetic ops.
1360let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1361  def int_x86_avx2_padds_b : GCCBuiltin<"__builtin_ia32_paddsb256">,
1362              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1363                         llvm_v32i8_ty], [IntrNoMem, Commutative]>;
1364  def int_x86_avx2_padds_w : GCCBuiltin<"__builtin_ia32_paddsw256">,
1365              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1366                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1367  def int_x86_avx2_paddus_b : GCCBuiltin<"__builtin_ia32_paddusb256">,
1368              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1369                         llvm_v32i8_ty], [IntrNoMem, Commutative]>;
1370  def int_x86_avx2_paddus_w : GCCBuiltin<"__builtin_ia32_paddusw256">,
1371              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1372                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1373  def int_x86_avx2_psubs_b : GCCBuiltin<"__builtin_ia32_psubsb256">,
1374              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1375                         llvm_v32i8_ty], [IntrNoMem]>;
1376  def int_x86_avx2_psubs_w : GCCBuiltin<"__builtin_ia32_psubsw256">,
1377              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1378                         llvm_v16i16_ty], [IntrNoMem]>;
1379  def int_x86_avx2_psubus_b : GCCBuiltin<"__builtin_ia32_psubusb256">,
1380              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1381                         llvm_v32i8_ty], [IntrNoMem]>;
1382  def int_x86_avx2_psubus_w : GCCBuiltin<"__builtin_ia32_psubusw256">,
1383              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1384                         llvm_v16i16_ty], [IntrNoMem]>;
1385  def int_x86_avx2_pmulhu_w : GCCBuiltin<"__builtin_ia32_pmulhuw256">,
1386              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1387                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1388  def int_x86_avx2_pmulh_w : GCCBuiltin<"__builtin_ia32_pmulhw256">,
1389              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1390                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1391  def int_x86_avx2_pmadd_wd : GCCBuiltin<"__builtin_ia32_pmaddwd256">,
1392              Intrinsic<[llvm_v8i32_ty], [llvm_v16i16_ty,
1393                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1394  def int_x86_avx2_psad_bw : GCCBuiltin<"__builtin_ia32_psadbw256">,
1395              Intrinsic<[llvm_v4i64_ty], [llvm_v32i8_ty,
1396                         llvm_v32i8_ty], [IntrNoMem, Commutative]>;
1397}
1398
1399// Integer shift ops.
1400let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1401  def int_x86_avx2_psll_w : GCCBuiltin<"__builtin_ia32_psllw256">,
1402              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1403                         llvm_v8i16_ty], [IntrNoMem]>;
1404  def int_x86_avx2_psll_d : GCCBuiltin<"__builtin_ia32_pslld256">,
1405              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1406                         llvm_v4i32_ty], [IntrNoMem]>;
1407  def int_x86_avx2_psll_q : GCCBuiltin<"__builtin_ia32_psllq256">,
1408              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1409                         llvm_v2i64_ty], [IntrNoMem]>;
1410  def int_x86_avx2_psrl_w : GCCBuiltin<"__builtin_ia32_psrlw256">,
1411              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1412                         llvm_v8i16_ty], [IntrNoMem]>;
1413  def int_x86_avx2_psrl_d : GCCBuiltin<"__builtin_ia32_psrld256">,
1414              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1415                         llvm_v4i32_ty], [IntrNoMem]>;
1416  def int_x86_avx2_psrl_q : GCCBuiltin<"__builtin_ia32_psrlq256">,
1417              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1418                         llvm_v2i64_ty], [IntrNoMem]>;
1419  def int_x86_avx2_psra_w : GCCBuiltin<"__builtin_ia32_psraw256">,
1420              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1421                         llvm_v8i16_ty], [IntrNoMem]>;
1422  def int_x86_avx2_psra_d : GCCBuiltin<"__builtin_ia32_psrad256">,
1423              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1424                         llvm_v4i32_ty], [IntrNoMem]>;
1425
1426  def int_x86_avx2_pslli_w : GCCBuiltin<"__builtin_ia32_psllwi256">,
1427              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1428                         llvm_i32_ty], [IntrNoMem]>;
1429  def int_x86_avx2_pslli_d : GCCBuiltin<"__builtin_ia32_pslldi256">,
1430              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1431                         llvm_i32_ty], [IntrNoMem]>;
1432  def int_x86_avx2_pslli_q : GCCBuiltin<"__builtin_ia32_psllqi256">,
1433              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1434                         llvm_i32_ty], [IntrNoMem]>;
1435  def int_x86_avx2_psrli_w : GCCBuiltin<"__builtin_ia32_psrlwi256">,
1436              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1437                         llvm_i32_ty], [IntrNoMem]>;
1438  def int_x86_avx2_psrli_d : GCCBuiltin<"__builtin_ia32_psrldi256">,
1439              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1440                         llvm_i32_ty], [IntrNoMem]>;
1441  def int_x86_avx2_psrli_q : GCCBuiltin<"__builtin_ia32_psrlqi256">,
1442              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1443                         llvm_i32_ty], [IntrNoMem]>;
1444  def int_x86_avx2_psrai_w : GCCBuiltin<"__builtin_ia32_psrawi256">,
1445              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1446                         llvm_i32_ty], [IntrNoMem]>;
1447  def int_x86_avx2_psrai_d : GCCBuiltin<"__builtin_ia32_psradi256">,
1448              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1449                         llvm_i32_ty], [IntrNoMem]>;
1450
1451  def int_x86_avx512_psra_q_128 : GCCBuiltin<"__builtin_ia32_psraq128">,
1452              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
1453                         llvm_v2i64_ty], [IntrNoMem]>;
1454  def int_x86_avx512_psra_q_256 : GCCBuiltin<"__builtin_ia32_psraq256">,
1455              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1456                         llvm_v2i64_ty], [IntrNoMem]>;
1457
1458  def int_x86_avx512_psrai_q_128 : GCCBuiltin<"__builtin_ia32_psraqi128">,
1459              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
1460                         llvm_i32_ty], [IntrNoMem]>;
1461  def int_x86_avx512_psrai_q_256 : GCCBuiltin<"__builtin_ia32_psraqi256">,
1462              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1463                         llvm_i32_ty], [IntrNoMem]>;
1464
1465  def int_x86_avx512_psll_w_512 : GCCBuiltin<"__builtin_ia32_psllw512">,
1466              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty,
1467                         llvm_v8i16_ty], [IntrNoMem]>;
1468  def int_x86_avx512_psll_d_512 : GCCBuiltin<"__builtin_ia32_pslld512">,
1469              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
1470                         llvm_v4i32_ty], [IntrNoMem]>;
1471  def int_x86_avx512_psll_q_512 : GCCBuiltin<"__builtin_ia32_psllq512">,
1472              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
1473                         llvm_v2i64_ty], [IntrNoMem]>;
1474  def int_x86_avx512_psrl_w_512 : GCCBuiltin<"__builtin_ia32_psrlw512">,
1475              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty,
1476                         llvm_v8i16_ty], [IntrNoMem]>;
1477  def int_x86_avx512_psrl_d_512 : GCCBuiltin<"__builtin_ia32_psrld512">,
1478              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
1479                         llvm_v4i32_ty], [IntrNoMem]>;
1480  def int_x86_avx512_psrl_q_512 : GCCBuiltin<"__builtin_ia32_psrlq512">,
1481              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
1482                         llvm_v2i64_ty], [IntrNoMem]>;
1483  def int_x86_avx512_psra_w_512 : GCCBuiltin<"__builtin_ia32_psraw512">,
1484              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty,
1485                         llvm_v8i16_ty], [IntrNoMem]>;
1486  def int_x86_avx512_psra_d_512 : GCCBuiltin<"__builtin_ia32_psrad512">,
1487              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
1488                         llvm_v4i32_ty], [IntrNoMem]>;
1489  def int_x86_avx512_psra_q_512 : GCCBuiltin<"__builtin_ia32_psraq512">,
1490              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
1491                         llvm_v2i64_ty], [IntrNoMem]>;
1492
1493  def int_x86_avx512_pslli_w_512 : GCCBuiltin<"__builtin_ia32_psllwi512">,
1494              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty,
1495                         llvm_i32_ty], [IntrNoMem]>;
1496  def int_x86_avx512_pslli_d_512 : GCCBuiltin<"__builtin_ia32_pslldi512">,
1497              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
1498                         llvm_i32_ty], [IntrNoMem]>;
1499  def int_x86_avx512_pslli_q_512 : GCCBuiltin<"__builtin_ia32_psllqi512">,
1500              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
1501                         llvm_i32_ty], [IntrNoMem]>;
1502  def int_x86_avx512_psrli_w_512 : GCCBuiltin<"__builtin_ia32_psrlwi512">,
1503              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty,
1504                         llvm_i32_ty], [IntrNoMem]>;
1505  def int_x86_avx512_psrli_d_512 : GCCBuiltin<"__builtin_ia32_psrldi512">,
1506              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
1507                         llvm_i32_ty], [IntrNoMem]>;
1508  def int_x86_avx512_psrli_q_512 : GCCBuiltin<"__builtin_ia32_psrlqi512">,
1509              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
1510                         llvm_i32_ty], [IntrNoMem]>;
1511  def int_x86_avx512_psrai_w_512 : GCCBuiltin<"__builtin_ia32_psrawi512">,
1512              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty,
1513                         llvm_i32_ty], [IntrNoMem]>;
1514  def int_x86_avx512_psrai_d_512 : GCCBuiltin<"__builtin_ia32_psradi512">,
1515              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
1516                         llvm_i32_ty], [IntrNoMem]>;
1517  def int_x86_avx512_psrai_q_512 : GCCBuiltin<"__builtin_ia32_psraqi512">,
1518              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
1519                         llvm_i32_ty], [IntrNoMem]>;
1520
1521  def int_x86_avx512_mask_pmultishift_qb_128:
1522        GCCBuiltin<"__builtin_ia32_vpmultishiftqb128_mask">,
1523        Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
1524                   llvm_v16i8_ty, llvm_v16i8_ty, llvm_i16_ty], [IntrNoMem]>;
1525  def int_x86_avx512_mask_pmultishift_qb_256:
1526        GCCBuiltin<"__builtin_ia32_vpmultishiftqb256_mask">,
1527        Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1528                   llvm_v32i8_ty, llvm_v32i8_ty, llvm_i32_ty], [IntrNoMem]>;
1529  def int_x86_avx512_mask_pmultishift_qb_512:
1530        GCCBuiltin<"__builtin_ia32_vpmultishiftqb512_mask">,
1531        Intrinsic<[llvm_v64i8_ty], [llvm_v64i8_ty,
1532                   llvm_v64i8_ty, llvm_v64i8_ty, llvm_i64_ty], [IntrNoMem]>;
1533}
1534
1535// Pack ops.
1536let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1537  def int_x86_avx2_packsswb : GCCBuiltin<"__builtin_ia32_packsswb256">,
1538              Intrinsic<[llvm_v32i8_ty], [llvm_v16i16_ty,
1539                         llvm_v16i16_ty], [IntrNoMem]>;
1540  def int_x86_avx2_packssdw : GCCBuiltin<"__builtin_ia32_packssdw256">,
1541              Intrinsic<[llvm_v16i16_ty], [llvm_v8i32_ty,
1542                         llvm_v8i32_ty], [IntrNoMem]>;
1543  def int_x86_avx2_packuswb : GCCBuiltin<"__builtin_ia32_packuswb256">,
1544              Intrinsic<[llvm_v32i8_ty], [llvm_v16i16_ty,
1545                         llvm_v16i16_ty], [IntrNoMem]>;
1546  def int_x86_avx2_packusdw : GCCBuiltin<"__builtin_ia32_packusdw256">,
1547              Intrinsic<[llvm_v16i16_ty], [llvm_v8i32_ty,
1548                         llvm_v8i32_ty], [IntrNoMem]>;
1549}
1550
1551// Horizontal arithmetic ops
1552let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1553  def int_x86_avx2_phadd_w : GCCBuiltin<"__builtin_ia32_phaddw256">,
1554              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1555                         llvm_v16i16_ty], [IntrNoMem]>;
1556  def int_x86_avx2_phadd_d : GCCBuiltin<"__builtin_ia32_phaddd256">,
1557              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1558                         llvm_v8i32_ty], [IntrNoMem]>;
1559  def int_x86_avx2_phadd_sw : GCCBuiltin<"__builtin_ia32_phaddsw256">,
1560              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1561                         llvm_v16i16_ty], [IntrNoMem]>;
1562  def int_x86_avx2_phsub_w : GCCBuiltin<"__builtin_ia32_phsubw256">,
1563              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1564                         llvm_v16i16_ty], [IntrNoMem]>;
1565  def int_x86_avx2_phsub_d : GCCBuiltin<"__builtin_ia32_phsubd256">,
1566              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1567                         llvm_v8i32_ty], [IntrNoMem]>;
1568  def int_x86_avx2_phsub_sw : GCCBuiltin<"__builtin_ia32_phsubsw256">,
1569              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1570                         llvm_v16i16_ty], [IntrNoMem]>;
1571  def int_x86_avx2_pmadd_ub_sw : GCCBuiltin<"__builtin_ia32_pmaddubsw256">,
1572              Intrinsic<[llvm_v16i16_ty], [llvm_v32i8_ty,
1573                         llvm_v32i8_ty], [IntrNoMem]>;
1574}
1575
1576// Sign ops
1577let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1578  def int_x86_avx2_psign_b : GCCBuiltin<"__builtin_ia32_psignb256">,
1579              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1580                         llvm_v32i8_ty], [IntrNoMem]>;
1581  def int_x86_avx2_psign_w : GCCBuiltin<"__builtin_ia32_psignw256">,
1582              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1583                         llvm_v16i16_ty], [IntrNoMem]>;
1584  def int_x86_avx2_psign_d : GCCBuiltin<"__builtin_ia32_psignd256">,
1585              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1586                         llvm_v8i32_ty], [IntrNoMem]>;
1587}
1588
1589// Packed multiply high with round and scale
1590let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1591  def int_x86_avx2_pmul_hr_sw : GCCBuiltin<"__builtin_ia32_pmulhrsw256">,
1592              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1593                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1594  def int_x86_avx512_pmul_hr_sw_512 : GCCBuiltin<"__builtin_ia32_pmulhrsw512">,
1595              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty,
1596                         llvm_v32i16_ty], [IntrNoMem, Commutative]>;
1597}
1598
1599// Vector blend
1600let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1601  def int_x86_avx2_pblendvb : GCCBuiltin<"__builtin_ia32_pblendvb256">,
1602              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty, llvm_v32i8_ty,
1603                         llvm_v32i8_ty], [IntrNoMem]>;
1604}
1605
1606
1607// Vector permutation
1608let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1609  def int_x86_avx2_permd : GCCBuiltin<"__builtin_ia32_permvarsi256">,
1610              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty],
1611                        [IntrNoMem]>;
1612  def int_x86_avx2_permps : GCCBuiltin<"__builtin_ia32_permvarsf256">,
1613              Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8i32_ty],
1614                        [IntrNoMem]>;
1615}
1616
1617// Conditional load ops
1618let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1619  def int_x86_avx2_maskload_d : GCCBuiltin<"__builtin_ia32_maskloadd">,
1620        Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty, llvm_v4i32_ty],
1621                  [IntrReadMem, IntrArgMemOnly]>;
1622  def int_x86_avx2_maskload_q : GCCBuiltin<"__builtin_ia32_maskloadq">,
1623        Intrinsic<[llvm_v2i64_ty], [llvm_ptr_ty, llvm_v2i64_ty],
1624                  [IntrReadMem, IntrArgMemOnly]>;
1625  def int_x86_avx2_maskload_d_256 : GCCBuiltin<"__builtin_ia32_maskloadd256">,
1626        Intrinsic<[llvm_v8i32_ty], [llvm_ptr_ty, llvm_v8i32_ty],
1627                  [IntrReadMem, IntrArgMemOnly]>;
1628  def int_x86_avx2_maskload_q_256 : GCCBuiltin<"__builtin_ia32_maskloadq256">,
1629        Intrinsic<[llvm_v4i64_ty], [llvm_ptr_ty, llvm_v4i64_ty],
1630                  [IntrReadMem, IntrArgMemOnly]>;
1631}
1632
1633// Conditional store ops
1634let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1635  def int_x86_avx2_maskstore_d : GCCBuiltin<"__builtin_ia32_maskstored">,
1636        Intrinsic<[], [llvm_ptr_ty, llvm_v4i32_ty, llvm_v4i32_ty],
1637                  [IntrArgMemOnly]>;
1638  def int_x86_avx2_maskstore_q : GCCBuiltin<"__builtin_ia32_maskstoreq">,
1639        Intrinsic<[], [llvm_ptr_ty, llvm_v2i64_ty, llvm_v2i64_ty],
1640                  [IntrArgMemOnly]>;
1641  def int_x86_avx2_maskstore_d_256 :
1642        GCCBuiltin<"__builtin_ia32_maskstored256">,
1643        Intrinsic<[], [llvm_ptr_ty, llvm_v8i32_ty, llvm_v8i32_ty],
1644                  [IntrArgMemOnly]>;
1645  def int_x86_avx2_maskstore_q_256 :
1646        GCCBuiltin<"__builtin_ia32_maskstoreq256">,
1647        Intrinsic<[], [llvm_ptr_ty, llvm_v4i64_ty, llvm_v4i64_ty],
1648                  [IntrArgMemOnly]>;
1649}
1650
1651// Variable bit shift ops
1652let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1653  def int_x86_avx2_psllv_d : GCCBuiltin<"__builtin_ia32_psllv4si">,
1654              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1655                        [IntrNoMem]>;
1656  def int_x86_avx2_psllv_d_256 : GCCBuiltin<"__builtin_ia32_psllv8si">,
1657              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty],
1658                        [IntrNoMem]>;
1659  def int_x86_avx2_psllv_q : GCCBuiltin<"__builtin_ia32_psllv2di">,
1660              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
1661                        [IntrNoMem]>;
1662  def int_x86_avx2_psllv_q_256 : GCCBuiltin<"__builtin_ia32_psllv4di">,
1663              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty],
1664                        [IntrNoMem]>;
1665
1666  def int_x86_avx512_psllv_d_512 : GCCBuiltin<"__builtin_ia32_psllv16si">,
1667              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty],
1668                        [IntrNoMem]>;
1669  def int_x86_avx512_psllv_q_512 : GCCBuiltin<"__builtin_ia32_psllv8di">,
1670              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty],
1671                        [IntrNoMem]>;
1672
1673  def int_x86_avx2_psrlv_d : GCCBuiltin<"__builtin_ia32_psrlv4si">,
1674              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1675                        [IntrNoMem]>;
1676  def int_x86_avx2_psrlv_d_256 : GCCBuiltin<"__builtin_ia32_psrlv8si">,
1677              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty],
1678                        [IntrNoMem]>;
1679  def int_x86_avx2_psrlv_q : GCCBuiltin<"__builtin_ia32_psrlv2di">,
1680              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
1681                        [IntrNoMem]>;
1682  def int_x86_avx2_psrlv_q_256 : GCCBuiltin<"__builtin_ia32_psrlv4di">,
1683              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty],
1684                        [IntrNoMem]>;
1685
1686  def int_x86_avx512_psrlv_d_512 : GCCBuiltin<"__builtin_ia32_psrlv16si">,
1687              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty],
1688                        [IntrNoMem]>;
1689  def int_x86_avx512_psrlv_q_512 : GCCBuiltin<"__builtin_ia32_psrlv8di">,
1690              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty],
1691                        [IntrNoMem]>;
1692
1693  def int_x86_avx2_psrav_d : GCCBuiltin<"__builtin_ia32_psrav4si">,
1694              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1695                        [IntrNoMem]>;
1696  def int_x86_avx2_psrav_d_256 : GCCBuiltin<"__builtin_ia32_psrav8si">,
1697              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty],
1698                        [IntrNoMem]>;
1699
1700  def int_x86_avx512_psrav_d_512 : GCCBuiltin<"__builtin_ia32_psrav16si">,
1701              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty],
1702                        [IntrNoMem]>;
1703  def int_x86_avx512_psrav_q_128 : GCCBuiltin<"__builtin_ia32_psravq128">,
1704              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
1705                        [IntrNoMem]>;
1706  def int_x86_avx512_psrav_q_256 : GCCBuiltin<"__builtin_ia32_psravq256">,
1707              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty],
1708                        [IntrNoMem]>;
1709  def int_x86_avx512_psrav_q_512 : GCCBuiltin<"__builtin_ia32_psrav8di">,
1710              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty],
1711                        [IntrNoMem]>;
1712
1713  def int_x86_avx512_psllv_w_128 : GCCBuiltin<"__builtin_ia32_psllv8hi">,
1714              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
1715                        [IntrNoMem]>;
1716  def int_x86_avx512_psllv_w_256 : GCCBuiltin<"__builtin_ia32_psllv16hi">,
1717              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty],
1718                        [IntrNoMem]>;
1719  def int_x86_avx512_psllv_w_512 : GCCBuiltin<"__builtin_ia32_psllv32hi">,
1720              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty],
1721                        [IntrNoMem]>;
1722
1723  def int_x86_avx512_psrlv_w_128 : GCCBuiltin<"__builtin_ia32_psrlv8hi">,
1724              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
1725                        [IntrNoMem]>;
1726  def int_x86_avx512_psrlv_w_256 : GCCBuiltin<"__builtin_ia32_psrlv16hi">,
1727              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty],
1728                        [IntrNoMem]>;
1729  def int_x86_avx512_psrlv_w_512 : GCCBuiltin<"__builtin_ia32_psrlv32hi">,
1730              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty],
1731                        [IntrNoMem]>;
1732
1733  def int_x86_avx512_psrav_w_128 : GCCBuiltin<"__builtin_ia32_psrav8hi">,
1734              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
1735                        [IntrNoMem]>;
1736  def int_x86_avx512_psrav_w_256 : GCCBuiltin<"__builtin_ia32_psrav16hi">,
1737              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty],
1738                        [IntrNoMem]>;
1739  def int_x86_avx512_psrav_w_512 : GCCBuiltin<"__builtin_ia32_psrav32hi">,
1740              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty],
1741                        [IntrNoMem]>;
1742
1743  def int_x86_avx512_prorv_d_128 : GCCBuiltin<"__builtin_ia32_prorvd128">,
1744              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
1745                         llvm_v4i32_ty], [IntrNoMem]>;
1746  def int_x86_avx512_prorv_d_256 : GCCBuiltin<"__builtin_ia32_prorvd256">,
1747              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1748                         llvm_v8i32_ty], [IntrNoMem]>;
1749  def int_x86_avx512_prorv_d_512 : GCCBuiltin<"__builtin_ia32_prorvd512">,
1750              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
1751                         llvm_v16i32_ty], [IntrNoMem]>;
1752  def int_x86_avx512_prorv_q_128 : GCCBuiltin<"__builtin_ia32_prorvq128">,
1753              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
1754                         llvm_v2i64_ty], [IntrNoMem]>;
1755  def int_x86_avx512_prorv_q_256 : GCCBuiltin<"__builtin_ia32_prorvq256">,
1756              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1757                         llvm_v4i64_ty], [IntrNoMem]>;
1758  def int_x86_avx512_prorv_q_512 : GCCBuiltin<"__builtin_ia32_prorvq512">,
1759              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
1760                         llvm_v8i64_ty], [IntrNoMem]>;
1761
1762   def int_x86_avx512_prol_d_128 : GCCBuiltin<"__builtin_ia32_prold128">,
1763              Intrinsic<[llvm_v4i32_ty] , [llvm_v4i32_ty,
1764                         llvm_i32_ty], [IntrNoMem]>;
1765  def int_x86_avx512_prol_d_256 : GCCBuiltin<"__builtin_ia32_prold256">,
1766              Intrinsic<[llvm_v8i32_ty] , [llvm_v8i32_ty,
1767                         llvm_i32_ty], [IntrNoMem]>;
1768  def int_x86_avx512_prol_d_512 : GCCBuiltin<"__builtin_ia32_prold512">,
1769              Intrinsic<[llvm_v16i32_ty] , [llvm_v16i32_ty,
1770                         llvm_i32_ty], [IntrNoMem]>;
1771  def int_x86_avx512_prol_q_128 : GCCBuiltin<"__builtin_ia32_prolq128">,
1772              Intrinsic<[llvm_v2i64_ty] , [llvm_v2i64_ty,
1773                         llvm_i32_ty], [IntrNoMem]>;
1774  def int_x86_avx512_prol_q_256 : GCCBuiltin<"__builtin_ia32_prolq256">,
1775              Intrinsic<[llvm_v4i64_ty] , [llvm_v4i64_ty,
1776                         llvm_i32_ty], [IntrNoMem]>;
1777  def int_x86_avx512_prol_q_512 : GCCBuiltin<"__builtin_ia32_prolq512">,
1778              Intrinsic<[llvm_v8i64_ty] , [llvm_v8i64_ty,
1779                         llvm_i32_ty], [IntrNoMem]>;
1780
1781
1782  def int_x86_avx512_prolv_d_128 : GCCBuiltin<"__builtin_ia32_prolvd128">,
1783              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
1784                         llvm_v4i32_ty], [IntrNoMem]>;
1785  def int_x86_avx512_prolv_d_256 : GCCBuiltin<"__builtin_ia32_prolvd256">,
1786              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1787                         llvm_v8i32_ty], [IntrNoMem]>;
1788  def int_x86_avx512_prolv_d_512 : GCCBuiltin<"__builtin_ia32_prolvd512">,
1789              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
1790                         llvm_v16i32_ty], [IntrNoMem]>;
1791  def int_x86_avx512_prolv_q_128 : GCCBuiltin<"__builtin_ia32_prolvq128">,
1792              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
1793                         llvm_v2i64_ty], [IntrNoMem]>;
1794  def int_x86_avx512_prolv_q_256 : GCCBuiltin<"__builtin_ia32_prolvq256">,
1795              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1796                         llvm_v4i64_ty], [IntrNoMem]>;
1797  def int_x86_avx512_prolv_q_512 : GCCBuiltin<"__builtin_ia32_prolvq512">,
1798              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
1799                         llvm_v8i64_ty], [IntrNoMem]>;
1800  def int_x86_avx512_pror_d_128 : GCCBuiltin<"__builtin_ia32_prord128">,
1801              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
1802                         llvm_i32_ty], [IntrNoMem]>;
1803  def int_x86_avx512_pror_d_256 : GCCBuiltin<"__builtin_ia32_prord256">,
1804              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1805                         llvm_i32_ty], [IntrNoMem]>;
1806  def int_x86_avx512_pror_d_512 : GCCBuiltin<"__builtin_ia32_prord512">,
1807              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
1808                         llvm_i32_ty], [IntrNoMem]>;
1809  def int_x86_avx512_pror_q_128 : GCCBuiltin<"__builtin_ia32_prorq128">,
1810              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
1811                         llvm_i32_ty], [IntrNoMem]>;
1812  def int_x86_avx512_pror_q_256 : GCCBuiltin<"__builtin_ia32_prorq256">,
1813              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1814                         llvm_i32_ty], [IntrNoMem]>;
1815  def int_x86_avx512_pror_q_512 : GCCBuiltin<"__builtin_ia32_prorq512">,
1816              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
1817                         llvm_i32_ty], [IntrNoMem]>;
1818
1819}
1820
1821// Gather ops
1822let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1823  def int_x86_avx2_gather_d_pd : GCCBuiltin<"__builtin_ia32_gatherd_pd">,
1824      Intrinsic<[llvm_v2f64_ty],
1825        [llvm_v2f64_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_v2f64_ty, llvm_i8_ty],
1826        [IntrReadMem, IntrArgMemOnly]>;
1827  def int_x86_avx2_gather_d_pd_256 : GCCBuiltin<"__builtin_ia32_gatherd_pd256">,
1828      Intrinsic<[llvm_v4f64_ty],
1829        [llvm_v4f64_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_v4f64_ty, llvm_i8_ty],
1830        [IntrReadMem, IntrArgMemOnly]>;
1831  def int_x86_avx2_gather_q_pd : GCCBuiltin<"__builtin_ia32_gatherq_pd">,
1832      Intrinsic<[llvm_v2f64_ty],
1833        [llvm_v2f64_ty, llvm_ptr_ty, llvm_v2i64_ty, llvm_v2f64_ty, llvm_i8_ty],
1834        [IntrReadMem, IntrArgMemOnly]>;
1835  def int_x86_avx2_gather_q_pd_256 : GCCBuiltin<"__builtin_ia32_gatherq_pd256">,
1836      Intrinsic<[llvm_v4f64_ty],
1837        [llvm_v4f64_ty, llvm_ptr_ty, llvm_v4i64_ty, llvm_v4f64_ty, llvm_i8_ty],
1838        [IntrReadMem, IntrArgMemOnly]>;
1839  def int_x86_avx2_gather_d_ps : GCCBuiltin<"__builtin_ia32_gatherd_ps">,
1840      Intrinsic<[llvm_v4f32_ty],
1841        [llvm_v4f32_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_v4f32_ty, llvm_i8_ty],
1842        [IntrReadMem, IntrArgMemOnly]>;
1843  def int_x86_avx2_gather_d_ps_256 : GCCBuiltin<"__builtin_ia32_gatherd_ps256">,
1844      Intrinsic<[llvm_v8f32_ty],
1845        [llvm_v8f32_ty, llvm_ptr_ty, llvm_v8i32_ty, llvm_v8f32_ty, llvm_i8_ty],
1846        [IntrReadMem, IntrArgMemOnly]>;
1847  def int_x86_avx2_gather_q_ps : GCCBuiltin<"__builtin_ia32_gatherq_ps">,
1848      Intrinsic<[llvm_v4f32_ty],
1849        [llvm_v4f32_ty, llvm_ptr_ty, llvm_v2i64_ty, llvm_v4f32_ty, llvm_i8_ty],
1850        [IntrReadMem, IntrArgMemOnly]>;
1851  def int_x86_avx2_gather_q_ps_256 : GCCBuiltin<"__builtin_ia32_gatherq_ps256">,
1852      Intrinsic<[llvm_v4f32_ty],
1853        [llvm_v4f32_ty, llvm_ptr_ty, llvm_v4i64_ty, llvm_v4f32_ty, llvm_i8_ty],
1854        [IntrReadMem, IntrArgMemOnly]>;
1855
1856  def int_x86_avx2_gather_d_q : GCCBuiltin<"__builtin_ia32_gatherd_q">,
1857      Intrinsic<[llvm_v2i64_ty],
1858        [llvm_v2i64_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_v2i64_ty, llvm_i8_ty],
1859        [IntrReadMem, IntrArgMemOnly]>;
1860  def int_x86_avx2_gather_d_q_256 : GCCBuiltin<"__builtin_ia32_gatherd_q256">,
1861      Intrinsic<[llvm_v4i64_ty],
1862        [llvm_v4i64_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_v4i64_ty, llvm_i8_ty],
1863        [IntrReadMem, IntrArgMemOnly]>;
1864  def int_x86_avx2_gather_q_q : GCCBuiltin<"__builtin_ia32_gatherq_q">,
1865      Intrinsic<[llvm_v2i64_ty],
1866        [llvm_v2i64_ty, llvm_ptr_ty, llvm_v2i64_ty, llvm_v2i64_ty, llvm_i8_ty],
1867        [IntrReadMem, IntrArgMemOnly]>;
1868  def int_x86_avx2_gather_q_q_256 : GCCBuiltin<"__builtin_ia32_gatherq_q256">,
1869      Intrinsic<[llvm_v4i64_ty],
1870        [llvm_v4i64_ty, llvm_ptr_ty, llvm_v4i64_ty, llvm_v4i64_ty, llvm_i8_ty],
1871        [IntrReadMem, IntrArgMemOnly]>;
1872  def int_x86_avx2_gather_d_d : GCCBuiltin<"__builtin_ia32_gatherd_d">,
1873      Intrinsic<[llvm_v4i32_ty],
1874        [llvm_v4i32_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_v4i32_ty, llvm_i8_ty],
1875        [IntrReadMem, IntrArgMemOnly]>;
1876  def int_x86_avx2_gather_d_d_256 : GCCBuiltin<"__builtin_ia32_gatherd_d256">,
1877      Intrinsic<[llvm_v8i32_ty],
1878        [llvm_v8i32_ty, llvm_ptr_ty, llvm_v8i32_ty, llvm_v8i32_ty, llvm_i8_ty],
1879        [IntrReadMem, IntrArgMemOnly]>;
1880  def int_x86_avx2_gather_q_d : GCCBuiltin<"__builtin_ia32_gatherq_d">,
1881      Intrinsic<[llvm_v4i32_ty],
1882        [llvm_v4i32_ty, llvm_ptr_ty, llvm_v2i64_ty, llvm_v4i32_ty, llvm_i8_ty],
1883        [IntrReadMem, IntrArgMemOnly]>;
1884  def int_x86_avx2_gather_q_d_256 : GCCBuiltin<"__builtin_ia32_gatherq_d256">,
1885      Intrinsic<[llvm_v4i32_ty],
1886        [llvm_v4i32_ty, llvm_ptr_ty, llvm_v4i64_ty, llvm_v4i32_ty, llvm_i8_ty],
1887        [IntrReadMem, IntrArgMemOnly]>;
1888}
1889
1890// Misc.
1891let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1892  def int_x86_avx2_pmovmskb : GCCBuiltin<"__builtin_ia32_pmovmskb256">,
1893              Intrinsic<[llvm_i32_ty], [llvm_v32i8_ty], [IntrNoMem]>;
1894  def int_x86_avx2_pshuf_b : GCCBuiltin<"__builtin_ia32_pshufb256">,
1895              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1896                         llvm_v32i8_ty], [IntrNoMem]>;
1897  def int_x86_avx2_mpsadbw : GCCBuiltin<"__builtin_ia32_mpsadbw256">,
1898              Intrinsic<[llvm_v16i16_ty], [llvm_v32i8_ty, llvm_v32i8_ty,
1899                         llvm_i8_ty], [IntrNoMem, Commutative]>;
1900}
1901
1902//===----------------------------------------------------------------------===//
1903// FMA3 and FMA4
1904
1905let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1906  def int_x86_avx512_vfmadd_pd_512 :
1907          Intrinsic<[llvm_v8f64_ty],
1908          [llvm_v8f64_ty, llvm_v8f64_ty, llvm_v8f64_ty, llvm_i32_ty],
1909          [IntrNoMem]>;
1910
1911  def int_x86_avx512_vfmadd_ps_512 :
1912          Intrinsic<[llvm_v16f32_ty],
1913          [llvm_v16f32_ty, llvm_v16f32_ty, llvm_v16f32_ty, llvm_i32_ty],
1914          [IntrNoMem]>;
1915
1916  // TODO: Can we use 2 vfmadds+shufflevector?
1917  def int_x86_avx512_vfmaddsub_pd_512 :
1918          Intrinsic<[llvm_v8f64_ty],
1919          [llvm_v8f64_ty, llvm_v8f64_ty, llvm_v8f64_ty, llvm_i32_ty],
1920          [IntrNoMem]>;
1921
1922  def int_x86_avx512_vfmaddsub_ps_512 :
1923          Intrinsic<[llvm_v16f32_ty],
1924          [llvm_v16f32_ty, llvm_v16f32_ty, llvm_v16f32_ty, llvm_i32_ty],
1925          [IntrNoMem]>;
1926
1927  def int_x86_avx512_vfmadd_f64 :
1928          Intrinsic<[llvm_double_ty],
1929                    [llvm_double_ty, llvm_double_ty, llvm_double_ty, llvm_i32_ty],
1930                    [IntrNoMem]>;
1931  def int_x86_avx512_vfmadd_f32 :
1932          Intrinsic<[llvm_float_ty],
1933                    [llvm_float_ty, llvm_float_ty, llvm_float_ty, llvm_i32_ty],
1934                    [IntrNoMem]>;
1935
1936  def int_x86_avx512_vpmadd52h_uq_128 :
1937              GCCBuiltin<"__builtin_ia32_vpmadd52huq128">,
1938              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
1939                         llvm_v2i64_ty], [IntrNoMem]>;
1940  def int_x86_avx512_vpmadd52l_uq_128 :
1941              GCCBuiltin<"__builtin_ia32_vpmadd52luq128">,
1942              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
1943                         llvm_v2i64_ty], [IntrNoMem]>;
1944  def int_x86_avx512_vpmadd52h_uq_256 :
1945              GCCBuiltin<"__builtin_ia32_vpmadd52huq256">,
1946              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty,
1947                         llvm_v4i64_ty], [IntrNoMem]>;
1948  def int_x86_avx512_vpmadd52l_uq_256 :
1949              GCCBuiltin<"__builtin_ia32_vpmadd52luq256">,
1950              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty,
1951                         llvm_v4i64_ty], [IntrNoMem]>;
1952  def int_x86_avx512_vpmadd52h_uq_512 :
1953              GCCBuiltin<"__builtin_ia32_vpmadd52huq512">,
1954              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty,
1955                         llvm_v8i64_ty], [IntrNoMem]>;
1956  def int_x86_avx512_vpmadd52l_uq_512 :
1957              GCCBuiltin<"__builtin_ia32_vpmadd52luq512">,
1958              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty,
1959                         llvm_v8i64_ty], [IntrNoMem]>;
1960}
1961
1962// VNNI
1963let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1964  def int_x86_avx512_vpdpbusd_128 :
1965              GCCBuiltin<"__builtin_ia32_vpdpbusd128">,
1966              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
1967                         llvm_v4i32_ty], [IntrNoMem]>;
1968  def int_x86_avx512_vpdpbusd_256 :
1969              GCCBuiltin<"__builtin_ia32_vpdpbusd256">,
1970              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty,
1971                         llvm_v8i32_ty], [IntrNoMem]>;
1972  def int_x86_avx512_vpdpbusd_512 :
1973              GCCBuiltin<"__builtin_ia32_vpdpbusd512">,
1974              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty,
1975                         llvm_v16i32_ty], [IntrNoMem]>;
1976
1977  def int_x86_avx512_vpdpbusds_128 :
1978              GCCBuiltin<"__builtin_ia32_vpdpbusds128">,
1979              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
1980                         llvm_v4i32_ty], [IntrNoMem]>;
1981  def int_x86_avx512_vpdpbusds_256 :
1982              GCCBuiltin<"__builtin_ia32_vpdpbusds256">,
1983              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty,
1984                         llvm_v8i32_ty], [IntrNoMem]>;
1985  def int_x86_avx512_vpdpbusds_512 :
1986              GCCBuiltin<"__builtin_ia32_vpdpbusds512">,
1987              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty,
1988                         llvm_v16i32_ty], [IntrNoMem]>;
1989
1990  def int_x86_avx512_vpdpwssd_128 :
1991              GCCBuiltin<"__builtin_ia32_vpdpwssd128">,
1992              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
1993                         llvm_v4i32_ty], [IntrNoMem]>;
1994  def int_x86_avx512_vpdpwssd_256 :
1995              GCCBuiltin<"__builtin_ia32_vpdpwssd256">,
1996              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty,
1997                         llvm_v8i32_ty], [IntrNoMem]>;
1998  def int_x86_avx512_vpdpwssd_512 :
1999              GCCBuiltin<"__builtin_ia32_vpdpwssd512">,
2000              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty,
2001                         llvm_v16i32_ty], [IntrNoMem]>;
2002
2003  def int_x86_avx512_vpdpwssds_128 :
2004              GCCBuiltin<"__builtin_ia32_vpdpwssds128">,
2005              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
2006                         llvm_v4i32_ty], [IntrNoMem]>;
2007  def int_x86_avx512_vpdpwssds_256 :
2008              GCCBuiltin<"__builtin_ia32_vpdpwssds256">,
2009              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty,
2010                         llvm_v8i32_ty], [IntrNoMem]>;
2011  def int_x86_avx512_vpdpwssds_512 :
2012              GCCBuiltin<"__builtin_ia32_vpdpwssds512">,
2013              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty,
2014                         llvm_v16i32_ty], [IntrNoMem]>;
2015}
2016
2017//===----------------------------------------------------------------------===//
2018// XOP
2019
2020let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2021  def int_x86_xop_vpermil2pd : GCCBuiltin<"__builtin_ia32_vpermil2pd">,
2022              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
2023                                          llvm_v2i64_ty, llvm_i8_ty],
2024                        [IntrNoMem]>;
2025
2026  def int_x86_xop_vpermil2pd_256 :
2027              GCCBuiltin<"__builtin_ia32_vpermil2pd256">,
2028              Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4f64_ty,
2029                                          llvm_v4i64_ty, llvm_i8_ty],
2030                        [IntrNoMem]>;
2031
2032  def int_x86_xop_vpermil2ps : GCCBuiltin<"__builtin_ia32_vpermil2ps">,
2033              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
2034                                          llvm_v4i32_ty, llvm_i8_ty],
2035                        [IntrNoMem]>;
2036  def int_x86_xop_vpermil2ps_256 :
2037              GCCBuiltin<"__builtin_ia32_vpermil2ps256">,
2038              Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8f32_ty,
2039                                          llvm_v8i32_ty, llvm_i8_ty],
2040                        [IntrNoMem]>;
2041
2042  def int_x86_xop_vfrcz_pd : GCCBuiltin<"__builtin_ia32_vfrczpd">,
2043              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
2044  def int_x86_xop_vfrcz_ps : GCCBuiltin<"__builtin_ia32_vfrczps">,
2045              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
2046  def int_x86_xop_vfrcz_sd : GCCBuiltin<"__builtin_ia32_vfrczsd">,
2047              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
2048  def int_x86_xop_vfrcz_ss : GCCBuiltin<"__builtin_ia32_vfrczss">,
2049              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
2050  def int_x86_xop_vfrcz_pd_256 : GCCBuiltin<"__builtin_ia32_vfrczpd256">,
2051              Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty], [IntrNoMem]>;
2052  def int_x86_xop_vfrcz_ps_256 : GCCBuiltin<"__builtin_ia32_vfrczps256">,
2053              Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
2054
2055  def int_x86_xop_vpcomb : GCCBuiltin<"__builtin_ia32_vpcomb">,
2056              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
2057                         llvm_i8_ty], [IntrNoMem]>;
2058  def int_x86_xop_vpcomw : GCCBuiltin<"__builtin_ia32_vpcomw">,
2059              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
2060                         llvm_i8_ty], [IntrNoMem]>;
2061  def int_x86_xop_vpcomd : GCCBuiltin<"__builtin_ia32_vpcomd">,
2062              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
2063                         llvm_i8_ty], [IntrNoMem]>;
2064  def int_x86_xop_vpcomq : GCCBuiltin<"__builtin_ia32_vpcomq">,
2065              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
2066                         llvm_i8_ty], [IntrNoMem]>;
2067  def int_x86_xop_vpcomub : GCCBuiltin<"__builtin_ia32_vpcomub">,
2068              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
2069                         llvm_i8_ty], [IntrNoMem]>;
2070  def int_x86_xop_vpcomuw : GCCBuiltin<"__builtin_ia32_vpcomuw">,
2071              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
2072                         llvm_i8_ty], [IntrNoMem]>;
2073  def int_x86_xop_vpcomud : GCCBuiltin<"__builtin_ia32_vpcomud">,
2074              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
2075                         llvm_i8_ty], [IntrNoMem]>;
2076  def int_x86_xop_vpcomuq : GCCBuiltin<"__builtin_ia32_vpcomuq">,
2077              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
2078                         llvm_i8_ty], [IntrNoMem]>;
2079
2080  def int_x86_xop_vphaddbd :
2081              GCCBuiltin<"__builtin_ia32_vphaddbd">,
2082              Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2083  def int_x86_xop_vphaddbq :
2084              GCCBuiltin<"__builtin_ia32_vphaddbq">,
2085              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2086  def int_x86_xop_vphaddbw :
2087              GCCBuiltin<"__builtin_ia32_vphaddbw">,
2088              Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2089  def int_x86_xop_vphadddq :
2090              GCCBuiltin<"__builtin_ia32_vphadddq">,
2091              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
2092  def int_x86_xop_vphaddubd :
2093              GCCBuiltin<"__builtin_ia32_vphaddubd">,
2094              Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2095  def int_x86_xop_vphaddubq :
2096              GCCBuiltin<"__builtin_ia32_vphaddubq">,
2097              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2098  def int_x86_xop_vphaddubw :
2099              GCCBuiltin<"__builtin_ia32_vphaddubw">,
2100              Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2101  def int_x86_xop_vphaddudq :
2102              GCCBuiltin<"__builtin_ia32_vphaddudq">,
2103              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
2104  def int_x86_xop_vphadduwd :
2105              GCCBuiltin<"__builtin_ia32_vphadduwd">,
2106              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2107  def int_x86_xop_vphadduwq :
2108              GCCBuiltin<"__builtin_ia32_vphadduwq">,
2109              Intrinsic<[llvm_v2i64_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2110  def int_x86_xop_vphaddwd :
2111              GCCBuiltin<"__builtin_ia32_vphaddwd">,
2112              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2113  def int_x86_xop_vphaddwq :
2114              GCCBuiltin<"__builtin_ia32_vphaddwq">,
2115              Intrinsic<[llvm_v2i64_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2116  def int_x86_xop_vphsubbw :
2117              GCCBuiltin<"__builtin_ia32_vphsubbw">,
2118              Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2119  def int_x86_xop_vphsubdq :
2120              GCCBuiltin<"__builtin_ia32_vphsubdq">,
2121              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
2122  def int_x86_xop_vphsubwd :
2123              GCCBuiltin<"__builtin_ia32_vphsubwd">,
2124              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2125  def int_x86_xop_vpmacsdd :
2126              GCCBuiltin<"__builtin_ia32_vpmacsdd">,
2127              Intrinsic<[llvm_v4i32_ty],
2128                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
2129                        [IntrNoMem, Commutative]>;
2130  def int_x86_xop_vpmacsdqh :
2131              GCCBuiltin<"__builtin_ia32_vpmacsdqh">,
2132              Intrinsic<[llvm_v2i64_ty],
2133                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v2i64_ty],
2134                        [IntrNoMem, Commutative]>;
2135  def int_x86_xop_vpmacsdql :
2136              GCCBuiltin<"__builtin_ia32_vpmacsdql">,
2137              Intrinsic<[llvm_v2i64_ty],
2138                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v2i64_ty],
2139                        [IntrNoMem, Commutative]>;
2140  def int_x86_xop_vpmacssdd :
2141              GCCBuiltin<"__builtin_ia32_vpmacssdd">,
2142              Intrinsic<[llvm_v4i32_ty],
2143                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
2144                        [IntrNoMem, Commutative]>;
2145  def int_x86_xop_vpmacssdqh :
2146              GCCBuiltin<"__builtin_ia32_vpmacssdqh">,
2147              Intrinsic<[llvm_v2i64_ty],
2148                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v2i64_ty],
2149                        [IntrNoMem, Commutative]>;
2150  def int_x86_xop_vpmacssdql :
2151              GCCBuiltin<"__builtin_ia32_vpmacssdql">,
2152              Intrinsic<[llvm_v2i64_ty],
2153                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v2i64_ty],
2154                        [IntrNoMem, Commutative]>;
2155  def int_x86_xop_vpmacsswd :
2156              GCCBuiltin<"__builtin_ia32_vpmacsswd">,
2157              Intrinsic<[llvm_v4i32_ty],
2158                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v4i32_ty],
2159                        [IntrNoMem, Commutative]>;
2160  def int_x86_xop_vpmacssww :
2161              GCCBuiltin<"__builtin_ia32_vpmacssww">,
2162              Intrinsic<[llvm_v8i16_ty],
2163                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
2164                        [IntrNoMem, Commutative]>;
2165  def int_x86_xop_vpmacswd :
2166              GCCBuiltin<"__builtin_ia32_vpmacswd">,
2167              Intrinsic<[llvm_v4i32_ty],
2168                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v4i32_ty],
2169                        [IntrNoMem, Commutative]>;
2170  def int_x86_xop_vpmacsww :
2171              GCCBuiltin<"__builtin_ia32_vpmacsww">,
2172              Intrinsic<[llvm_v8i16_ty],
2173                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
2174                        [IntrNoMem, Commutative]>;
2175  def int_x86_xop_vpmadcsswd :
2176              GCCBuiltin<"__builtin_ia32_vpmadcsswd">,
2177              Intrinsic<[llvm_v4i32_ty],
2178                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v4i32_ty],
2179                        [IntrNoMem, Commutative]>;
2180  def int_x86_xop_vpmadcswd :
2181              GCCBuiltin<"__builtin_ia32_vpmadcswd">,
2182              Intrinsic<[llvm_v4i32_ty],
2183                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v4i32_ty],
2184                        [IntrNoMem, Commutative]>;
2185  def int_x86_xop_vpperm :
2186              GCCBuiltin<"__builtin_ia32_vpperm">,
2187              Intrinsic<[llvm_v16i8_ty],
2188                        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
2189                        [IntrNoMem]>;
2190
2191  def int_x86_xop_vprotb : GCCBuiltin<"__builtin_ia32_vprotb">,
2192              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
2193                        [IntrNoMem]>;
2194  def int_x86_xop_vprotd : GCCBuiltin<"__builtin_ia32_vprotd">,
2195              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
2196                        [IntrNoMem]>;
2197  def int_x86_xop_vprotq : GCCBuiltin<"__builtin_ia32_vprotq">,
2198              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
2199                        [IntrNoMem]>;
2200  def int_x86_xop_vprotw : GCCBuiltin<"__builtin_ia32_vprotw">,
2201              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
2202                        [IntrNoMem]>;
2203  def int_x86_xop_vprotbi : GCCBuiltin<"__builtin_ia32_vprotbi">,
2204              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i8_ty],
2205                        [IntrNoMem]>;
2206  def int_x86_xop_vprotdi : GCCBuiltin<"__builtin_ia32_vprotdi">,
2207              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_i8_ty],
2208                        [IntrNoMem]>;
2209  def int_x86_xop_vprotqi : GCCBuiltin<"__builtin_ia32_vprotqi">,
2210              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_i8_ty],
2211                        [IntrNoMem]>;
2212  def int_x86_xop_vprotwi : GCCBuiltin<"__builtin_ia32_vprotwi">,
2213              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_i8_ty],
2214                        [IntrNoMem]>;
2215
2216  def int_x86_xop_vpshab :
2217              GCCBuiltin<"__builtin_ia32_vpshab">,
2218              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
2219                        [IntrNoMem]>;
2220  def int_x86_xop_vpshad :
2221              GCCBuiltin<"__builtin_ia32_vpshad">,
2222              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
2223                        [IntrNoMem]>;
2224  def int_x86_xop_vpshaq :
2225              GCCBuiltin<"__builtin_ia32_vpshaq">,
2226              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
2227                        [IntrNoMem]>;
2228  def int_x86_xop_vpshaw :
2229              GCCBuiltin<"__builtin_ia32_vpshaw">,
2230              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
2231                        [IntrNoMem]>;
2232  def int_x86_xop_vpshlb :
2233              GCCBuiltin<"__builtin_ia32_vpshlb">,
2234              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
2235                        [IntrNoMem]>;
2236  def int_x86_xop_vpshld :
2237              GCCBuiltin<"__builtin_ia32_vpshld">,
2238              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
2239                        [IntrNoMem]>;
2240  def int_x86_xop_vpshlq :
2241              GCCBuiltin<"__builtin_ia32_vpshlq">,
2242              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
2243                        [IntrNoMem]>;
2244  def int_x86_xop_vpshlw :
2245              GCCBuiltin<"__builtin_ia32_vpshlw">,
2246              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
2247                        [IntrNoMem]>;
2248}
2249
2250//===----------------------------------------------------------------------===//
2251// LWP
2252let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2253  def int_x86_llwpcb :
2254              GCCBuiltin<"__builtin_ia32_llwpcb">,
2255              Intrinsic<[], [llvm_ptr_ty], []>;
2256  def int_x86_slwpcb :
2257              GCCBuiltin<"__builtin_ia32_slwpcb">,
2258              Intrinsic<[llvm_ptr_ty], [], []>;
2259  def int_x86_lwpins32 :
2260              GCCBuiltin<"__builtin_ia32_lwpins32">,
2261              Intrinsic<[llvm_i8_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
2262  def int_x86_lwpins64 :
2263              GCCBuiltin<"__builtin_ia32_lwpins64">,
2264              Intrinsic<[llvm_i8_ty], [llvm_i64_ty, llvm_i32_ty, llvm_i32_ty], []>;
2265  def int_x86_lwpval32 :
2266              GCCBuiltin<"__builtin_ia32_lwpval32">,
2267              Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
2268  def int_x86_lwpval64 :
2269              GCCBuiltin<"__builtin_ia32_lwpval64">,
2270              Intrinsic<[], [llvm_i64_ty, llvm_i32_ty, llvm_i32_ty], []>;
2271}
2272
2273//===----------------------------------------------------------------------===//
2274// MMX
2275
2276// Empty MMX state op.
2277let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2278  def int_x86_mmx_emms  : GCCBuiltin<"__builtin_ia32_emms">,
2279              Intrinsic<[], [], []>;
2280  def int_x86_mmx_femms : GCCBuiltin<"__builtin_ia32_femms">,
2281              Intrinsic<[], [], []>;
2282}
2283
2284// Integer arithmetic ops.
2285let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2286  // Addition
2287  def int_x86_mmx_padd_b : GCCBuiltin<"__builtin_ia32_paddb">,
2288              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2289                        [IntrNoMem, Commutative]>;
2290  def int_x86_mmx_padd_w : GCCBuiltin<"__builtin_ia32_paddw">,
2291              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2292                        [IntrNoMem, Commutative]>;
2293  def int_x86_mmx_padd_d : GCCBuiltin<"__builtin_ia32_paddd">,
2294              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2295                        [IntrNoMem, Commutative]>;
2296  def int_x86_mmx_padd_q : GCCBuiltin<"__builtin_ia32_paddq">,
2297              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2298                        [IntrNoMem, Commutative]>;
2299
2300  def int_x86_mmx_padds_b : GCCBuiltin<"__builtin_ia32_paddsb">,
2301              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2302                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2303  def int_x86_mmx_padds_w : GCCBuiltin<"__builtin_ia32_paddsw">,
2304              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2305                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2306
2307  def int_x86_mmx_paddus_b : GCCBuiltin<"__builtin_ia32_paddusb">,
2308              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2309                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2310  def int_x86_mmx_paddus_w : GCCBuiltin<"__builtin_ia32_paddusw">,
2311              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2312                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2313
2314  // Subtraction
2315  def int_x86_mmx_psub_b : GCCBuiltin<"__builtin_ia32_psubb">,
2316              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2317                        [IntrNoMem]>;
2318  def int_x86_mmx_psub_w : GCCBuiltin<"__builtin_ia32_psubw">,
2319              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2320                        [IntrNoMem]>;
2321  def int_x86_mmx_psub_d : GCCBuiltin<"__builtin_ia32_psubd">,
2322              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2323                        [IntrNoMem]>;
2324  def int_x86_mmx_psub_q : GCCBuiltin<"__builtin_ia32_psubq">,
2325              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2326                        [IntrNoMem]>;
2327
2328  def int_x86_mmx_psubs_b : GCCBuiltin<"__builtin_ia32_psubsb">,
2329              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2330                         llvm_x86mmx_ty], [IntrNoMem]>;
2331  def int_x86_mmx_psubs_w : GCCBuiltin<"__builtin_ia32_psubsw">,
2332              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2333                         llvm_x86mmx_ty], [IntrNoMem]>;
2334
2335  def int_x86_mmx_psubus_b : GCCBuiltin<"__builtin_ia32_psubusb">,
2336              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2337                         llvm_x86mmx_ty], [IntrNoMem]>;
2338  def int_x86_mmx_psubus_w : GCCBuiltin<"__builtin_ia32_psubusw">,
2339              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2340                         llvm_x86mmx_ty], [IntrNoMem]>;
2341
2342  // Multiplication
2343  def int_x86_mmx_pmulh_w : GCCBuiltin<"__builtin_ia32_pmulhw">,
2344              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2345                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2346  def int_x86_mmx_pmull_w : GCCBuiltin<"__builtin_ia32_pmullw">,
2347              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2348                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2349  def int_x86_mmx_pmulhu_w : GCCBuiltin<"__builtin_ia32_pmulhuw">,
2350              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2351                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2352  def int_x86_mmx_pmulu_dq : GCCBuiltin<"__builtin_ia32_pmuludq">,
2353              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2354                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2355  def int_x86_mmx_pmadd_wd : GCCBuiltin<"__builtin_ia32_pmaddwd">,
2356              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2357                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2358
2359  // Bitwise operations
2360  def int_x86_mmx_pand : GCCBuiltin<"__builtin_ia32_pand">,
2361              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2362                        [IntrNoMem, Commutative]>;
2363  def int_x86_mmx_pandn : GCCBuiltin<"__builtin_ia32_pandn">,
2364              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2365                        [IntrNoMem]>;
2366  def int_x86_mmx_por : GCCBuiltin<"__builtin_ia32_por">,
2367              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2368                        [IntrNoMem, Commutative]>;
2369  def int_x86_mmx_pxor : GCCBuiltin<"__builtin_ia32_pxor">,
2370              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2371                        [IntrNoMem, Commutative]>;
2372
2373  // Averages
2374  def int_x86_mmx_pavg_b : GCCBuiltin<"__builtin_ia32_pavgb">,
2375              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2376                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2377  def int_x86_mmx_pavg_w : GCCBuiltin<"__builtin_ia32_pavgw">,
2378              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2379                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2380
2381  // Maximum
2382  def int_x86_mmx_pmaxu_b : GCCBuiltin<"__builtin_ia32_pmaxub">,
2383              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2384                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2385  def int_x86_mmx_pmaxs_w : GCCBuiltin<"__builtin_ia32_pmaxsw">,
2386              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2387                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2388
2389  // Minimum
2390  def int_x86_mmx_pminu_b : GCCBuiltin<"__builtin_ia32_pminub">,
2391              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2392                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2393  def int_x86_mmx_pmins_w : GCCBuiltin<"__builtin_ia32_pminsw">,
2394              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2395                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2396
2397  // Packed sum of absolute differences
2398  def int_x86_mmx_psad_bw : GCCBuiltin<"__builtin_ia32_psadbw">,
2399              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2400                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2401}
2402
2403// Integer shift ops.
2404let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2405  // Shift left logical
2406  def int_x86_mmx_psll_w : GCCBuiltin<"__builtin_ia32_psllw">,
2407              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2408                         llvm_x86mmx_ty], [IntrNoMem]>;
2409  def int_x86_mmx_psll_d : GCCBuiltin<"__builtin_ia32_pslld">,
2410              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2411                         llvm_x86mmx_ty], [IntrNoMem]>;
2412  def int_x86_mmx_psll_q : GCCBuiltin<"__builtin_ia32_psllq">,
2413              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2414                         llvm_x86mmx_ty], [IntrNoMem]>;
2415
2416  def int_x86_mmx_psrl_w : GCCBuiltin<"__builtin_ia32_psrlw">,
2417              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2418                         llvm_x86mmx_ty], [IntrNoMem]>;
2419  def int_x86_mmx_psrl_d : GCCBuiltin<"__builtin_ia32_psrld">,
2420              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2421                         llvm_x86mmx_ty], [IntrNoMem]>;
2422  def int_x86_mmx_psrl_q : GCCBuiltin<"__builtin_ia32_psrlq">,
2423              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2424                         llvm_x86mmx_ty], [IntrNoMem]>;
2425
2426  def int_x86_mmx_psra_w : GCCBuiltin<"__builtin_ia32_psraw">,
2427              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2428                         llvm_x86mmx_ty], [IntrNoMem]>;
2429  def int_x86_mmx_psra_d : GCCBuiltin<"__builtin_ia32_psrad">,
2430              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2431                         llvm_x86mmx_ty], [IntrNoMem]>;
2432
2433  def int_x86_mmx_pslli_w : GCCBuiltin<"__builtin_ia32_psllwi">,
2434              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2435                         llvm_i32_ty], [IntrNoMem]>;
2436  def int_x86_mmx_pslli_d : GCCBuiltin<"__builtin_ia32_pslldi">,
2437              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2438                         llvm_i32_ty], [IntrNoMem]>;
2439  def int_x86_mmx_pslli_q : GCCBuiltin<"__builtin_ia32_psllqi">,
2440              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2441                         llvm_i32_ty], [IntrNoMem]>;
2442
2443  def int_x86_mmx_psrli_w : GCCBuiltin<"__builtin_ia32_psrlwi">,
2444              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2445                         llvm_i32_ty], [IntrNoMem]>;
2446  def int_x86_mmx_psrli_d : GCCBuiltin<"__builtin_ia32_psrldi">,
2447              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2448                         llvm_i32_ty], [IntrNoMem]>;
2449  def int_x86_mmx_psrli_q : GCCBuiltin<"__builtin_ia32_psrlqi">,
2450              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2451                         llvm_i32_ty], [IntrNoMem]>;
2452
2453  def int_x86_mmx_psrai_w : GCCBuiltin<"__builtin_ia32_psrawi">,
2454              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2455                         llvm_i32_ty], [IntrNoMem]>;
2456  def int_x86_mmx_psrai_d : GCCBuiltin<"__builtin_ia32_psradi">,
2457              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2458                         llvm_i32_ty], [IntrNoMem]>;
2459}
2460// Permute
2461let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2462  def int_x86_avx512_permvar_df_256 : GCCBuiltin<"__builtin_ia32_permvardf256">,
2463              Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
2464                        llvm_v4i64_ty],  [IntrNoMem]>;
2465  def int_x86_avx512_permvar_df_512 : GCCBuiltin<"__builtin_ia32_permvardf512">,
2466              Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty,
2467                        llvm_v8i64_ty],  [IntrNoMem]>;
2468  def int_x86_avx512_permvar_di_256 : GCCBuiltin<"__builtin_ia32_permvardi256">,
2469              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
2470                        llvm_v4i64_ty],  [IntrNoMem]>;
2471  def int_x86_avx512_permvar_di_512 : GCCBuiltin<"__builtin_ia32_permvardi512">,
2472              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
2473                        llvm_v8i64_ty],  [IntrNoMem]>;
2474  def int_x86_avx512_permvar_hi_128 : GCCBuiltin<"__builtin_ia32_permvarhi128">,
2475              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
2476                        llvm_v8i16_ty],  [IntrNoMem]>;
2477  def int_x86_avx512_permvar_hi_256 : GCCBuiltin<"__builtin_ia32_permvarhi256">,
2478              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
2479                        llvm_v16i16_ty],  [IntrNoMem]>;
2480  def int_x86_avx512_permvar_hi_512 : GCCBuiltin<"__builtin_ia32_permvarhi512">,
2481              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty,
2482                        llvm_v32i16_ty],  [IntrNoMem]>;
2483  def int_x86_avx512_permvar_qi_128 : GCCBuiltin<"__builtin_ia32_permvarqi128">,
2484              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
2485                        llvm_v16i8_ty],  [IntrNoMem]>;
2486  def int_x86_avx512_permvar_qi_256 : GCCBuiltin<"__builtin_ia32_permvarqi256">,
2487              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
2488                        llvm_v32i8_ty],  [IntrNoMem]>;
2489  def int_x86_avx512_permvar_qi_512 : GCCBuiltin<"__builtin_ia32_permvarqi512">,
2490              Intrinsic<[llvm_v64i8_ty], [llvm_v64i8_ty,
2491                        llvm_v64i8_ty],  [IntrNoMem]>;
2492  def int_x86_avx512_permvar_sf_512 : GCCBuiltin<"__builtin_ia32_permvarsf512">,
2493              Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty,
2494                        llvm_v16i32_ty],  [IntrNoMem]>;
2495  def int_x86_avx512_permvar_si_512 : GCCBuiltin<"__builtin_ia32_permvarsi512">,
2496              Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
2497                        llvm_v16i32_ty],  [IntrNoMem]>;
2498}
2499// Pack ops.
2500let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2501  def int_x86_mmx_packsswb : GCCBuiltin<"__builtin_ia32_packsswb">,
2502              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2503                         llvm_x86mmx_ty], [IntrNoMem]>;
2504  def int_x86_mmx_packssdw : GCCBuiltin<"__builtin_ia32_packssdw">,
2505              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2506                         llvm_x86mmx_ty], [IntrNoMem]>;
2507  def int_x86_mmx_packuswb : GCCBuiltin<"__builtin_ia32_packuswb">,
2508              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2509                         llvm_x86mmx_ty], [IntrNoMem]>;
2510}
2511
2512// Unpacking ops.
2513let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2514  def int_x86_mmx_punpckhbw : GCCBuiltin<"__builtin_ia32_punpckhbw">,
2515              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2516                        [IntrNoMem]>;
2517  def int_x86_mmx_punpckhwd : GCCBuiltin<"__builtin_ia32_punpckhwd">,
2518              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2519                        [IntrNoMem]>;
2520  def int_x86_mmx_punpckhdq : GCCBuiltin<"__builtin_ia32_punpckhdq">,
2521              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2522                        [IntrNoMem]>;
2523  def int_x86_mmx_punpcklbw : GCCBuiltin<"__builtin_ia32_punpcklbw">,
2524              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2525                        [IntrNoMem]>;
2526  def int_x86_mmx_punpcklwd : GCCBuiltin<"__builtin_ia32_punpcklwd">,
2527              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2528                        [IntrNoMem]>;
2529  def int_x86_mmx_punpckldq : GCCBuiltin<"__builtin_ia32_punpckldq">,
2530              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2531                        [IntrNoMem]>;
2532}
2533
2534// Integer comparison ops
2535let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2536  def int_x86_mmx_pcmpeq_b : GCCBuiltin<"__builtin_ia32_pcmpeqb">,
2537              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2538                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2539  def int_x86_mmx_pcmpeq_w : GCCBuiltin<"__builtin_ia32_pcmpeqw">,
2540              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2541                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2542  def int_x86_mmx_pcmpeq_d : GCCBuiltin<"__builtin_ia32_pcmpeqd">,
2543              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2544                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2545
2546  def int_x86_mmx_pcmpgt_b : GCCBuiltin<"__builtin_ia32_pcmpgtb">,
2547              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2548                         llvm_x86mmx_ty], [IntrNoMem]>;
2549  def int_x86_mmx_pcmpgt_w : GCCBuiltin<"__builtin_ia32_pcmpgtw">,
2550              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2551                         llvm_x86mmx_ty], [IntrNoMem]>;
2552  def int_x86_mmx_pcmpgt_d : GCCBuiltin<"__builtin_ia32_pcmpgtd">,
2553              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2554                         llvm_x86mmx_ty], [IntrNoMem]>;
2555}
2556
2557// Misc.
2558let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2559  def int_x86_mmx_maskmovq : GCCBuiltin<"__builtin_ia32_maskmovq">,
2560              Intrinsic<[], [llvm_x86mmx_ty, llvm_x86mmx_ty, llvm_ptr_ty], []>;
2561
2562  def int_x86_mmx_pmovmskb : GCCBuiltin<"__builtin_ia32_pmovmskb">,
2563              Intrinsic<[llvm_i32_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
2564
2565  def int_x86_mmx_movnt_dq : GCCBuiltin<"__builtin_ia32_movntq">,
2566              Intrinsic<[], [llvm_ptrx86mmx_ty, llvm_x86mmx_ty], []>;
2567
2568  def int_x86_mmx_palignr_b : GCCBuiltin<"__builtin_ia32_palignr">,
2569              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2570                        llvm_x86mmx_ty, llvm_i8_ty], [IntrNoMem]>;
2571
2572  def int_x86_mmx_pextr_w : GCCBuiltin<"__builtin_ia32_vec_ext_v4hi">,
2573              Intrinsic<[llvm_i32_ty], [llvm_x86mmx_ty, llvm_i32_ty],
2574                        [IntrNoMem]>;
2575
2576  def int_x86_mmx_pinsr_w : GCCBuiltin<"__builtin_ia32_vec_set_v4hi">,
2577              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2578                        llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2579}
2580
2581//===----------------------------------------------------------------------===//
2582// BMI
2583
2584let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2585  def int_x86_bmi_bextr_32 : GCCBuiltin<"__builtin_ia32_bextr_u32">,
2586              Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2587  def int_x86_bmi_bextr_64 : GCCBuiltin<"__builtin_ia32_bextr_u64">,
2588              Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
2589  def int_x86_bmi_bzhi_32 : GCCBuiltin<"__builtin_ia32_bzhi_si">,
2590              Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2591  def int_x86_bmi_bzhi_64 : GCCBuiltin<"__builtin_ia32_bzhi_di">,
2592              Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
2593  def int_x86_bmi_pdep_32 : GCCBuiltin<"__builtin_ia32_pdep_si">,
2594              Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2595  def int_x86_bmi_pdep_64 : GCCBuiltin<"__builtin_ia32_pdep_di">,
2596              Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
2597  def int_x86_bmi_pext_32 : GCCBuiltin<"__builtin_ia32_pext_si">,
2598              Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2599  def int_x86_bmi_pext_64 : GCCBuiltin<"__builtin_ia32_pext_di">,
2600              Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
2601}
2602
2603//===----------------------------------------------------------------------===//
2604// FS/GS Base
2605
2606let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2607  def int_x86_rdfsbase_32 : GCCBuiltin<"__builtin_ia32_rdfsbase32">,
2608              Intrinsic<[llvm_i32_ty], []>;
2609  def int_x86_rdgsbase_32 : GCCBuiltin<"__builtin_ia32_rdgsbase32">,
2610              Intrinsic<[llvm_i32_ty], []>;
2611  def int_x86_rdfsbase_64 : GCCBuiltin<"__builtin_ia32_rdfsbase64">,
2612              Intrinsic<[llvm_i64_ty], []>;
2613  def int_x86_rdgsbase_64 : GCCBuiltin<"__builtin_ia32_rdgsbase64">,
2614              Intrinsic<[llvm_i64_ty], []>;
2615  def int_x86_wrfsbase_32 : GCCBuiltin<"__builtin_ia32_wrfsbase32">,
2616              Intrinsic<[], [llvm_i32_ty]>;
2617  def int_x86_wrgsbase_32 : GCCBuiltin<"__builtin_ia32_wrgsbase32">,
2618              Intrinsic<[], [llvm_i32_ty]>;
2619  def int_x86_wrfsbase_64 : GCCBuiltin<"__builtin_ia32_wrfsbase64">,
2620              Intrinsic<[], [llvm_i64_ty]>;
2621  def int_x86_wrgsbase_64 : GCCBuiltin<"__builtin_ia32_wrgsbase64">,
2622              Intrinsic<[], [llvm_i64_ty]>;
2623}
2624
2625//===----------------------------------------------------------------------===//
2626// FXSR
2627let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2628  def int_x86_fxrstor : GCCBuiltin<"__builtin_ia32_fxrstor">,
2629              Intrinsic<[], [llvm_ptr_ty], []>;
2630  def int_x86_fxrstor64 : GCCBuiltin<"__builtin_ia32_fxrstor64">,
2631              Intrinsic<[], [llvm_ptr_ty], []>;
2632  def int_x86_fxsave : GCCBuiltin<"__builtin_ia32_fxsave">,
2633              Intrinsic<[], [llvm_ptr_ty], []>;
2634  def int_x86_fxsave64 : GCCBuiltin<"__builtin_ia32_fxsave64">,
2635              Intrinsic<[], [llvm_ptr_ty], []>;
2636}
2637
2638//===----------------------------------------------------------------------===//
2639// XSAVE
2640let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2641  def int_x86_xsave :
2642              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;
2643  def int_x86_xsave64 :
2644              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;
2645  def int_x86_xrstor :
2646              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;
2647  def int_x86_xrstor64 :
2648              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;
2649  def int_x86_xsaveopt :
2650              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;
2651  def int_x86_xsaveopt64 :
2652              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;
2653  def int_x86_xrstors :
2654              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;
2655  def int_x86_xrstors64 :
2656              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;
2657  def int_x86_xsavec :
2658              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;
2659  def int_x86_xsavec64 :
2660              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;
2661  def int_x86_xsaves :
2662              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;
2663  def int_x86_xsaves64 :
2664              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;
2665  def int_x86_xgetbv :
2666              Intrinsic<[llvm_i64_ty], [llvm_i32_ty], []>;
2667  def int_x86_xsetbv :
2668              Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
2669}
2670
2671//===----------------------------------------------------------------------===//
2672// CLFLUSHOPT and CLWB
2673let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2674  def int_x86_clflushopt : GCCBuiltin<"__builtin_ia32_clflushopt">,
2675              Intrinsic<[], [llvm_ptr_ty], []>;
2676
2677  def int_x86_clwb : GCCBuiltin<"__builtin_ia32_clwb">,
2678              Intrinsic<[], [llvm_ptr_ty], []>;
2679}
2680
2681//===----------------------------------------------------------------------===//
2682// Support protection key
2683let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2684  def int_x86_rdpkru : GCCBuiltin <"__builtin_ia32_rdpkru">,
2685              Intrinsic<[llvm_i32_ty], [], []>;
2686  def int_x86_wrpkru : GCCBuiltin<"__builtin_ia32_wrpkru">,
2687              Intrinsic<[], [llvm_i32_ty], []>;
2688}
2689//===----------------------------------------------------------------------===//
2690// Half float conversion
2691
2692let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2693  def int_x86_vcvtph2ps_128 : GCCBuiltin<"__builtin_ia32_vcvtph2ps">,
2694              Intrinsic<[llvm_v4f32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2695  def int_x86_vcvtph2ps_256 : GCCBuiltin<"__builtin_ia32_vcvtph2ps256">,
2696              Intrinsic<[llvm_v8f32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2697  def int_x86_vcvtps2ph_128 : GCCBuiltin<"__builtin_ia32_vcvtps2ph">,
2698              Intrinsic<[llvm_v8i16_ty], [llvm_v4f32_ty, llvm_i32_ty],
2699                        [IntrNoMem]>;
2700  def int_x86_vcvtps2ph_256 : GCCBuiltin<"__builtin_ia32_vcvtps2ph256">,
2701              Intrinsic<[llvm_v8i16_ty], [llvm_v8f32_ty, llvm_i32_ty],
2702                        [IntrNoMem]>;
2703  def int_x86_avx512_mask_vcvtph2ps_512 : GCCBuiltin<"__builtin_ia32_vcvtph2ps512_mask">,
2704              Intrinsic<[llvm_v16f32_ty], [llvm_v16i16_ty, llvm_v16f32_ty,
2705                                           llvm_i16_ty, llvm_i32_ty], [IntrNoMem]>;
2706  def int_x86_avx512_mask_vcvtph2ps_256 : GCCBuiltin<"__builtin_ia32_vcvtph2ps256_mask">,
2707              Intrinsic<[llvm_v8f32_ty], [llvm_v8i16_ty, llvm_v8f32_ty,
2708                                           llvm_i8_ty], [IntrNoMem]>;
2709  def int_x86_avx512_mask_vcvtph2ps_128 : GCCBuiltin<"__builtin_ia32_vcvtph2ps_mask">,
2710              Intrinsic<[llvm_v4f32_ty], [llvm_v8i16_ty, llvm_v4f32_ty,
2711                                           llvm_i8_ty], [IntrNoMem]>;
2712  def int_x86_avx512_mask_vcvtps2ph_512 : GCCBuiltin<"__builtin_ia32_vcvtps2ph512_mask">,
2713              Intrinsic<[llvm_v16i16_ty], [llvm_v16f32_ty, llvm_i32_ty,
2714                                           llvm_v16i16_ty, llvm_i16_ty], [IntrNoMem]>;
2715  def int_x86_avx512_mask_vcvtps2ph_256 : GCCBuiltin<"__builtin_ia32_vcvtps2ph256_mask">,
2716              Intrinsic<[llvm_v8i16_ty], [llvm_v8f32_ty, llvm_i32_ty,
2717                                           llvm_v8i16_ty, llvm_i8_ty], [IntrNoMem]>;
2718  def int_x86_avx512_mask_vcvtps2ph_128 : GCCBuiltin<"__builtin_ia32_vcvtps2ph_mask">,
2719              Intrinsic<[llvm_v8i16_ty], [llvm_v4f32_ty, llvm_i32_ty,
2720                                           llvm_v8i16_ty, llvm_i8_ty], [IntrNoMem]>;
2721}
2722
2723//===----------------------------------------------------------------------===//
2724// TBM
2725
2726let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2727  def int_x86_tbm_bextri_u32 : GCCBuiltin<"__builtin_ia32_bextri_u32">,
2728        Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2729  def int_x86_tbm_bextri_u64 : GCCBuiltin<"__builtin_ia32_bextri_u64">,
2730        Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
2731}
2732
2733//===----------------------------------------------------------------------===//
2734// RDRAND intrinsics - Return a random value and whether it is valid.
2735// RDSEED intrinsics - Return a NIST SP800-90B & C compliant random value and
2736// whether it is valid.
2737
2738let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2739  // These are declared side-effecting so they don't get eliminated by CSE or
2740  // LICM.
2741  def int_x86_rdrand_16 : Intrinsic<[llvm_i16_ty, llvm_i32_ty], [], []>;
2742  def int_x86_rdrand_32 : Intrinsic<[llvm_i32_ty, llvm_i32_ty], [], []>;
2743  def int_x86_rdrand_64 : Intrinsic<[llvm_i64_ty, llvm_i32_ty], [], []>;
2744  def int_x86_rdseed_16 : Intrinsic<[llvm_i16_ty, llvm_i32_ty], [], []>;
2745  def int_x86_rdseed_32 : Intrinsic<[llvm_i32_ty, llvm_i32_ty], [], []>;
2746  def int_x86_rdseed_64 : Intrinsic<[llvm_i64_ty, llvm_i32_ty], [], []>;
2747}
2748
2749//===----------------------------------------------------------------------===//
2750// ADX
2751
2752let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2753  def int_x86_addcarryx_u32: GCCBuiltin<"__builtin_ia32_addcarryx_u32">,
2754        Intrinsic<[llvm_i8_ty], [llvm_i8_ty, llvm_i32_ty, llvm_i32_ty,
2755                                 llvm_ptr_ty], [IntrArgMemOnly]>;
2756  def int_x86_addcarryx_u64: GCCBuiltin<"__builtin_ia32_addcarryx_u64">,
2757        Intrinsic<[llvm_i8_ty], [llvm_i8_ty, llvm_i64_ty, llvm_i64_ty,
2758                                 llvm_ptr_ty], [IntrArgMemOnly]>;
2759  def int_x86_addcarry_u32: GCCBuiltin<"__builtin_ia32_addcarry_u32">,
2760        Intrinsic<[llvm_i8_ty], [llvm_i8_ty, llvm_i32_ty, llvm_i32_ty,
2761                                 llvm_ptr_ty], [IntrArgMemOnly]>;
2762  def int_x86_addcarry_u64: GCCBuiltin<"__builtin_ia32_addcarry_u64">,
2763        Intrinsic<[llvm_i8_ty], [llvm_i8_ty, llvm_i64_ty, llvm_i64_ty,
2764                                 llvm_ptr_ty], [IntrArgMemOnly]>;
2765  def int_x86_subborrow_u32: GCCBuiltin<"__builtin_ia32_subborrow_u32">,
2766        Intrinsic<[llvm_i8_ty], [llvm_i8_ty, llvm_i32_ty, llvm_i32_ty,
2767                                 llvm_ptr_ty], [IntrArgMemOnly]>;
2768  def int_x86_subborrow_u64: GCCBuiltin<"__builtin_ia32_subborrow_u64">,
2769        Intrinsic<[llvm_i8_ty], [llvm_i8_ty, llvm_i64_ty, llvm_i64_ty,
2770                                 llvm_ptr_ty], [IntrArgMemOnly]>;
2771}
2772
2773//===----------------------------------------------------------------------===//
2774// RTM intrinsics. Transactional Memory support.
2775
2776let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2777  def int_x86_xbegin : GCCBuiltin<"__builtin_ia32_xbegin">,
2778              Intrinsic<[llvm_i32_ty], [], []>;
2779  def int_x86_xend : GCCBuiltin<"__builtin_ia32_xend">,
2780              Intrinsic<[], [], []>;
2781  def int_x86_xabort : GCCBuiltin<"__builtin_ia32_xabort">,
2782              Intrinsic<[], [llvm_i8_ty], []>;
2783  def int_x86_xtest : GCCBuiltin<"__builtin_ia32_xtest">,
2784              Intrinsic<[llvm_i32_ty], [], []>;
2785}
2786
2787//===----------------------------------------------------------------------===//
2788// AVX512
2789
2790// Conversion ops
2791let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2792  def int_x86_avx512_cvttss2si : GCCBuiltin<"__builtin_ia32_vcvttss2si32">,
2793              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty, llvm_i32_ty], [IntrNoMem]>;
2794  def int_x86_avx512_cvttss2si64 : GCCBuiltin<"__builtin_ia32_vcvttss2si64">,
2795              Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty, llvm_i32_ty], [IntrNoMem]>;
2796  def int_x86_avx512_cvttss2usi : GCCBuiltin<"__builtin_ia32_vcvttss2usi32">,
2797              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty, llvm_i32_ty], [IntrNoMem]>;
2798  def int_x86_avx512_cvttss2usi64 : GCCBuiltin<"__builtin_ia32_vcvttss2usi64">,
2799              Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty, llvm_i32_ty], [IntrNoMem]>;
2800  def int_x86_avx512_cvtusi2ss : GCCBuiltin<"__builtin_ia32_cvtusi2ss32">,
2801              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
2802                         llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2803  def int_x86_avx512_cvtusi642ss : GCCBuiltin<"__builtin_ia32_cvtusi2ss64">,
2804              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
2805                         llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
2806  def int_x86_avx512_cvttsd2si : GCCBuiltin<"__builtin_ia32_vcvttsd2si32">,
2807              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem]>;
2808  def int_x86_avx512_cvttsd2si64 : GCCBuiltin<"__builtin_ia32_vcvttsd2si64">,
2809              Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem]>;
2810  def int_x86_avx512_cvttsd2usi : GCCBuiltin<"__builtin_ia32_vcvttsd2usi32">,
2811              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem]>;
2812  def int_x86_avx512_cvttsd2usi64 : GCCBuiltin<"__builtin_ia32_vcvttsd2usi64">,
2813              Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem]>;
2814  def int_x86_avx512_cvtusi642sd : GCCBuiltin<"__builtin_ia32_cvtusi2sd64">,
2815              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
2816                         llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
2817  def int_x86_avx512_vcvtss2usi32 : GCCBuiltin<"__builtin_ia32_vcvtss2usi32">,
2818              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty, llvm_i32_ty], [IntrNoMem]>;
2819  def int_x86_avx512_vcvtss2usi64 : GCCBuiltin<"__builtin_ia32_vcvtss2usi64">,
2820              Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty, llvm_i32_ty], [IntrNoMem]>;
2821  def int_x86_avx512_vcvtss2si32 : GCCBuiltin<"__builtin_ia32_vcvtss2si32">,
2822              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty, llvm_i32_ty], [IntrNoMem]>;
2823  def int_x86_avx512_vcvtss2si64 : GCCBuiltin<"__builtin_ia32_vcvtss2si64">,
2824              Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty, llvm_i32_ty], [IntrNoMem]>;
2825  def int_x86_avx512_vcvtsd2usi32 : GCCBuiltin<"__builtin_ia32_vcvtsd2usi32">,
2826              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem]>;
2827  def int_x86_avx512_vcvtsd2usi64 : GCCBuiltin<"__builtin_ia32_vcvtsd2usi64">,
2828              Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem]>;
2829  def int_x86_avx512_vcvtsd2si32 : GCCBuiltin<"__builtin_ia32_vcvtsd2si32">,
2830              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem]>;
2831  def int_x86_avx512_vcvtsd2si64 : GCCBuiltin<"__builtin_ia32_vcvtsd2si64">,
2832              Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem]>;
2833  def int_x86_avx512_cvtsi2ss32 : GCCBuiltin<"__builtin_ia32_cvtsi2ss32">,
2834              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
2835                         llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2836  def int_x86_avx512_cvtsi2ss64 : GCCBuiltin<"__builtin_ia32_cvtsi2ss64">,
2837              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
2838                         llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
2839  def int_x86_avx512_cvtsi2sd64 : GCCBuiltin<"__builtin_ia32_cvtsi2sd64">,
2840              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
2841                         llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
2842}
2843
2844// Pack ops.
2845let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2846  def int_x86_avx512_packsswb_512 : GCCBuiltin<"__builtin_ia32_packsswb512">,
2847              Intrinsic<[llvm_v64i8_ty], [llvm_v32i16_ty,llvm_v32i16_ty],
2848                        [IntrNoMem]>;
2849  def int_x86_avx512_packssdw_512 : GCCBuiltin<"__builtin_ia32_packssdw512">,
2850              Intrinsic<[llvm_v32i16_ty], [llvm_v16i32_ty, llvm_v16i32_ty],
2851                         [IntrNoMem]>;
2852  def int_x86_avx512_packuswb_512 : GCCBuiltin<"__builtin_ia32_packuswb512">,
2853              Intrinsic<[llvm_v64i8_ty], [llvm_v32i16_ty,llvm_v32i16_ty],
2854                         [IntrNoMem]>;
2855  def int_x86_avx512_packusdw_512 : GCCBuiltin<"__builtin_ia32_packusdw512">,
2856              Intrinsic<[llvm_v32i16_ty], [llvm_v16i32_ty, llvm_v16i32_ty],
2857                         [IntrNoMem]>;
2858}
2859
2860// Vector convert
2861let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2862  def int_x86_avx512_mask_cvtdq2ps_512 :
2863        GCCBuiltin<"__builtin_ia32_cvtdq2ps512_mask">,
2864          Intrinsic<[llvm_v16f32_ty],
2865          [llvm_v16i32_ty, llvm_v16f32_ty,  llvm_i16_ty,  llvm_i32_ty],
2866          [IntrNoMem]>;
2867
2868  def int_x86_avx512_mask_cvtpd2dq_128 :
2869        GCCBuiltin<"__builtin_ia32_cvtpd2dq128_mask">,
2870          Intrinsic<[llvm_v4i32_ty],
2871          [llvm_v2f64_ty, llvm_v4i32_ty,  llvm_i8_ty],
2872          [IntrNoMem]>;
2873
2874  def int_x86_avx512_mask_cvtpd2dq_512 :
2875        GCCBuiltin<"__builtin_ia32_cvtpd2dq512_mask">,
2876          Intrinsic<[llvm_v8i32_ty],
2877          [llvm_v8f64_ty, llvm_v8i32_ty,  llvm_i8_ty,  llvm_i32_ty],
2878          [IntrNoMem]>;
2879
2880  def int_x86_avx512_mask_cvtpd2ps_512 :
2881        GCCBuiltin<"__builtin_ia32_cvtpd2ps512_mask">,
2882          Intrinsic<[llvm_v8f32_ty],
2883          [llvm_v8f64_ty, llvm_v8f32_ty,  llvm_i8_ty,  llvm_i32_ty],
2884          [IntrNoMem]>;
2885
2886  def int_x86_avx512_mask_cvtsd2ss_round :
2887        GCCBuiltin<"__builtin_ia32_cvtsd2ss_round_mask">,
2888          Intrinsic<[llvm_v4f32_ty],
2889          [llvm_v4f32_ty, llvm_v2f64_ty, llvm_v4f32_ty, llvm_i8_ty, llvm_i32_ty],
2890          [IntrNoMem]>;
2891
2892  def int_x86_avx512_mask_cvtss2sd_round :
2893        GCCBuiltin<"__builtin_ia32_cvtss2sd_round_mask">,
2894          Intrinsic<[llvm_v2f64_ty],
2895          [llvm_v2f64_ty, llvm_v4f32_ty, llvm_v2f64_ty, llvm_i8_ty, llvm_i32_ty],
2896          [IntrNoMem]>;
2897
2898  def int_x86_avx512_mask_cvtpd2ps :
2899        GCCBuiltin<"__builtin_ia32_cvtpd2ps_mask">,
2900          Intrinsic<[llvm_v4f32_ty],
2901          [llvm_v2f64_ty, llvm_v4f32_ty,  llvm_i8_ty],
2902          [IntrNoMem]>;
2903
2904  def int_x86_avx512_mask_cvtpd2qq_128 :
2905        GCCBuiltin<"__builtin_ia32_cvtpd2qq128_mask">,
2906          Intrinsic<[llvm_v2i64_ty],
2907          [llvm_v2f64_ty, llvm_v2i64_ty,  llvm_i8_ty],
2908          [IntrNoMem]>;
2909
2910  def int_x86_avx512_mask_cvtpd2qq_256 :
2911        GCCBuiltin<"__builtin_ia32_cvtpd2qq256_mask">,
2912          Intrinsic<[llvm_v4i64_ty],
2913          [llvm_v4f64_ty, llvm_v4i64_ty,  llvm_i8_ty],
2914          [IntrNoMem]>;
2915
2916  def int_x86_avx512_mask_cvtpd2qq_512 :
2917        GCCBuiltin<"__builtin_ia32_cvtpd2qq512_mask">,
2918          Intrinsic<[llvm_v8i64_ty],
2919          [llvm_v8f64_ty, llvm_v8i64_ty,  llvm_i8_ty,  llvm_i32_ty],
2920          [IntrNoMem]>;
2921
2922  def int_x86_avx512_mask_cvtpd2udq_128 :
2923        GCCBuiltin<"__builtin_ia32_cvtpd2udq128_mask">,
2924          Intrinsic<[llvm_v4i32_ty],
2925          [llvm_v2f64_ty, llvm_v4i32_ty,  llvm_i8_ty],
2926          [IntrNoMem]>;
2927
2928  def int_x86_avx512_mask_cvtpd2udq_256 :
2929        GCCBuiltin<"__builtin_ia32_cvtpd2udq256_mask">,
2930          Intrinsic<[llvm_v4i32_ty],
2931          [llvm_v4f64_ty, llvm_v4i32_ty,  llvm_i8_ty],
2932          [IntrNoMem]>;
2933
2934  def int_x86_avx512_mask_cvtpd2udq_512 :
2935        GCCBuiltin<"__builtin_ia32_cvtpd2udq512_mask">,
2936          Intrinsic<[llvm_v8i32_ty],
2937          [llvm_v8f64_ty, llvm_v8i32_ty,  llvm_i8_ty,  llvm_i32_ty],
2938          [IntrNoMem]>;
2939
2940  def int_x86_avx512_mask_cvtpd2uqq_128 :
2941        GCCBuiltin<"__builtin_ia32_cvtpd2uqq128_mask">,
2942          Intrinsic<[llvm_v2i64_ty],
2943          [llvm_v2f64_ty, llvm_v2i64_ty,  llvm_i8_ty],
2944          [IntrNoMem]>;
2945
2946  def int_x86_avx512_mask_cvtpd2uqq_256 :
2947        GCCBuiltin<"__builtin_ia32_cvtpd2uqq256_mask">,
2948          Intrinsic<[llvm_v4i64_ty],
2949          [llvm_v4f64_ty, llvm_v4i64_ty,  llvm_i8_ty],
2950          [IntrNoMem]>;
2951
2952  def int_x86_avx512_mask_cvtpd2uqq_512 :
2953        GCCBuiltin<"__builtin_ia32_cvtpd2uqq512_mask">,
2954          Intrinsic<[llvm_v8i64_ty],
2955          [llvm_v8f64_ty, llvm_v8i64_ty,  llvm_i8_ty,  llvm_i32_ty],
2956          [IntrNoMem]>;
2957
2958  def int_x86_avx512_mask_cvtps2dq_128 :
2959        GCCBuiltin<"__builtin_ia32_cvtps2dq128_mask">,
2960          Intrinsic<[llvm_v4i32_ty],
2961          [llvm_v4f32_ty, llvm_v4i32_ty,  llvm_i8_ty],
2962          [IntrNoMem]>;
2963
2964  def int_x86_avx512_mask_cvtps2dq_256 :
2965        GCCBuiltin<"__builtin_ia32_cvtps2dq256_mask">,
2966          Intrinsic<[llvm_v8i32_ty],
2967          [llvm_v8f32_ty, llvm_v8i32_ty,  llvm_i8_ty],
2968          [IntrNoMem]>;
2969
2970  def int_x86_avx512_mask_cvtps2dq_512 :
2971        GCCBuiltin<"__builtin_ia32_cvtps2dq512_mask">,
2972          Intrinsic<[llvm_v16i32_ty],
2973          [llvm_v16f32_ty, llvm_v16i32_ty,  llvm_i16_ty,  llvm_i32_ty],
2974          [IntrNoMem]>;
2975
2976  def int_x86_avx512_mask_cvtps2pd_512 :
2977        GCCBuiltin<"__builtin_ia32_cvtps2pd512_mask">,
2978          Intrinsic<[llvm_v8f64_ty],
2979          [llvm_v8f32_ty, llvm_v8f64_ty,  llvm_i8_ty,  llvm_i32_ty],
2980          [IntrNoMem]>;
2981
2982  def int_x86_avx512_mask_cvtps2qq_128 :
2983        GCCBuiltin<"__builtin_ia32_cvtps2qq128_mask">,
2984          Intrinsic<[llvm_v2i64_ty],
2985          [llvm_v4f32_ty, llvm_v2i64_ty,  llvm_i8_ty],
2986          [IntrNoMem]>;
2987
2988  def int_x86_avx512_mask_cvtps2qq_256 :
2989        GCCBuiltin<"__builtin_ia32_cvtps2qq256_mask">,
2990          Intrinsic<[llvm_v4i64_ty],
2991          [llvm_v4f32_ty, llvm_v4i64_ty,  llvm_i8_ty],
2992          [IntrNoMem]>;
2993
2994  def int_x86_avx512_mask_cvtps2qq_512 :
2995        GCCBuiltin<"__builtin_ia32_cvtps2qq512_mask">,
2996          Intrinsic<[llvm_v8i64_ty],
2997          [llvm_v8f32_ty, llvm_v8i64_ty,  llvm_i8_ty,  llvm_i32_ty],
2998          [IntrNoMem]>;
2999
3000  def int_x86_avx512_mask_cvtps2udq_128 :
3001        GCCBuiltin<"__builtin_ia32_cvtps2udq128_mask">,
3002          Intrinsic<[llvm_v4i32_ty],
3003          [llvm_v4f32_ty, llvm_v4i32_ty,  llvm_i8_ty],
3004          [IntrNoMem]>;
3005
3006  def int_x86_avx512_mask_cvtps2udq_256 :
3007        GCCBuiltin<"__builtin_ia32_cvtps2udq256_mask">,
3008          Intrinsic<[llvm_v8i32_ty],
3009          [llvm_v8f32_ty, llvm_v8i32_ty,  llvm_i8_ty],
3010          [IntrNoMem]>;
3011
3012  def int_x86_avx512_mask_cvtps2udq_512 :
3013        GCCBuiltin<"__builtin_ia32_cvtps2udq512_mask">,
3014          Intrinsic<[llvm_v16i32_ty],
3015          [llvm_v16f32_ty, llvm_v16i32_ty,  llvm_i16_ty,  llvm_i32_ty],
3016          [IntrNoMem]>;
3017
3018  def int_x86_avx512_mask_cvtps2uqq_128 :
3019        GCCBuiltin<"__builtin_ia32_cvtps2uqq128_mask">,
3020          Intrinsic<[llvm_v2i64_ty],
3021          [llvm_v4f32_ty, llvm_v2i64_ty,  llvm_i8_ty],
3022          [IntrNoMem]>;
3023
3024  def int_x86_avx512_mask_cvtps2uqq_256 :
3025        GCCBuiltin<"__builtin_ia32_cvtps2uqq256_mask">,
3026          Intrinsic<[llvm_v4i64_ty],
3027          [llvm_v4f32_ty, llvm_v4i64_ty,  llvm_i8_ty],
3028          [IntrNoMem]>;
3029
3030  def int_x86_avx512_mask_cvtps2uqq_512 :
3031        GCCBuiltin<"__builtin_ia32_cvtps2uqq512_mask">,
3032          Intrinsic<[llvm_v8i64_ty],
3033          [llvm_v8f32_ty, llvm_v8i64_ty,  llvm_i8_ty,  llvm_i32_ty],
3034          [IntrNoMem]>;
3035
3036  def int_x86_avx512_mask_cvtqq2pd_512 :
3037        GCCBuiltin<"__builtin_ia32_cvtqq2pd512_mask">,
3038          Intrinsic<[llvm_v8f64_ty],
3039          [llvm_v8i64_ty, llvm_v8f64_ty,  llvm_i8_ty,  llvm_i32_ty],
3040          [IntrNoMem]>;
3041
3042  def int_x86_avx512_mask_cvtqq2ps_128 :
3043        GCCBuiltin<"__builtin_ia32_cvtqq2ps128_mask">,
3044          Intrinsic<[llvm_v4f32_ty],
3045          [llvm_v2i64_ty, llvm_v4f32_ty,  llvm_i8_ty],
3046          [IntrNoMem]>;
3047
3048  def int_x86_avx512_mask_cvtqq2ps_256 :
3049        GCCBuiltin<"__builtin_ia32_cvtqq2ps256_mask">,
3050          Intrinsic<[llvm_v4f32_ty],
3051          [llvm_v4i64_ty, llvm_v4f32_ty,  llvm_i8_ty],
3052          [IntrNoMem]>;
3053
3054  def int_x86_avx512_mask_cvtqq2ps_512 :
3055        GCCBuiltin<"__builtin_ia32_cvtqq2ps512_mask">,
3056          Intrinsic<[llvm_v8f32_ty],
3057          [llvm_v8i64_ty, llvm_v8f32_ty,  llvm_i8_ty,  llvm_i32_ty],
3058          [IntrNoMem]>;
3059
3060  def int_x86_avx512_mask_cvttpd2dq_128 :
3061        GCCBuiltin<"__builtin_ia32_cvttpd2dq128_mask">,
3062          Intrinsic<[llvm_v4i32_ty],
3063          [llvm_v2f64_ty, llvm_v4i32_ty,  llvm_i8_ty],
3064          [IntrNoMem]>;
3065
3066  def int_x86_avx512_mask_cvttpd2dq_512 :
3067        GCCBuiltin<"__builtin_ia32_cvttpd2dq512_mask">,
3068          Intrinsic<[llvm_v8i32_ty],
3069          [llvm_v8f64_ty, llvm_v8i32_ty,  llvm_i8_ty,  llvm_i32_ty],
3070          [IntrNoMem]>;
3071
3072  def int_x86_avx512_mask_cvttpd2qq_128 :
3073        GCCBuiltin<"__builtin_ia32_cvttpd2qq128_mask">,
3074          Intrinsic<[llvm_v2i64_ty],
3075          [llvm_v2f64_ty, llvm_v2i64_ty,  llvm_i8_ty],
3076          [IntrNoMem]>;
3077
3078  def int_x86_avx512_mask_cvttpd2qq_256 :
3079        GCCBuiltin<"__builtin_ia32_cvttpd2qq256_mask">,
3080          Intrinsic<[llvm_v4i64_ty],
3081          [llvm_v4f64_ty, llvm_v4i64_ty,  llvm_i8_ty],
3082          [IntrNoMem]>;
3083
3084  def int_x86_avx512_mask_cvttpd2qq_512 :
3085        GCCBuiltin<"__builtin_ia32_cvttpd2qq512_mask">,
3086          Intrinsic<[llvm_v8i64_ty],
3087          [llvm_v8f64_ty, llvm_v8i64_ty,  llvm_i8_ty,  llvm_i32_ty],
3088          [IntrNoMem]>;
3089
3090  def int_x86_avx512_mask_cvttpd2udq_128 :
3091        GCCBuiltin<"__builtin_ia32_cvttpd2udq128_mask">,
3092          Intrinsic<[llvm_v4i32_ty],
3093          [llvm_v2f64_ty, llvm_v4i32_ty,  llvm_i8_ty],
3094          [IntrNoMem]>;
3095
3096  def int_x86_avx512_mask_cvttpd2udq_256 :
3097        GCCBuiltin<"__builtin_ia32_cvttpd2udq256_mask">,
3098          Intrinsic<[llvm_v4i32_ty],
3099          [llvm_v4f64_ty, llvm_v4i32_ty,  llvm_i8_ty],
3100          [IntrNoMem]>;
3101
3102  def int_x86_avx512_mask_cvttpd2udq_512 :
3103        GCCBuiltin<"__builtin_ia32_cvttpd2udq512_mask">,
3104          Intrinsic<[llvm_v8i32_ty],
3105          [llvm_v8f64_ty, llvm_v8i32_ty,  llvm_i8_ty,  llvm_i32_ty],
3106          [IntrNoMem]>;
3107
3108  def int_x86_avx512_mask_cvttpd2uqq_128 :
3109        GCCBuiltin<"__builtin_ia32_cvttpd2uqq128_mask">,
3110          Intrinsic<[llvm_v2i64_ty],
3111          [llvm_v2f64_ty, llvm_v2i64_ty,  llvm_i8_ty],
3112          [IntrNoMem]>;
3113
3114  def int_x86_avx512_mask_cvttpd2uqq_256 :
3115        GCCBuiltin<"__builtin_ia32_cvttpd2uqq256_mask">,
3116          Intrinsic<[llvm_v4i64_ty],
3117          [llvm_v4f64_ty, llvm_v4i64_ty,  llvm_i8_ty],
3118          [IntrNoMem]>;
3119
3120  def int_x86_avx512_mask_cvttpd2uqq_512 :
3121        GCCBuiltin<"__builtin_ia32_cvttpd2uqq512_mask">,
3122          Intrinsic<[llvm_v8i64_ty],
3123          [llvm_v8f64_ty, llvm_v8i64_ty,  llvm_i8_ty,  llvm_i32_ty],
3124          [IntrNoMem]>;
3125
3126  def int_x86_avx512_mask_cvttps2dq_512 :
3127        GCCBuiltin<"__builtin_ia32_cvttps2dq512_mask">,
3128          Intrinsic<[llvm_v16i32_ty],
3129          [llvm_v16f32_ty, llvm_v16i32_ty,  llvm_i16_ty,  llvm_i32_ty],
3130          [IntrNoMem]>;
3131
3132  def int_x86_avx512_mask_cvttps2qq_128 :
3133        GCCBuiltin<"__builtin_ia32_cvttps2qq128_mask">,
3134          Intrinsic<[llvm_v2i64_ty],
3135          [llvm_v4f32_ty, llvm_v2i64_ty,  llvm_i8_ty],
3136          [IntrNoMem]>;
3137
3138  def int_x86_avx512_mask_cvttps2qq_256 :
3139        GCCBuiltin<"__builtin_ia32_cvttps2qq256_mask">,
3140          Intrinsic<[llvm_v4i64_ty],
3141          [llvm_v4f32_ty, llvm_v4i64_ty,  llvm_i8_ty],
3142          [IntrNoMem]>;
3143
3144  def int_x86_avx512_mask_cvttps2qq_512 :
3145        GCCBuiltin<"__builtin_ia32_cvttps2qq512_mask">,
3146          Intrinsic<[llvm_v8i64_ty],
3147          [llvm_v8f32_ty, llvm_v8i64_ty,  llvm_i8_ty,  llvm_i32_ty],
3148          [IntrNoMem]>;
3149
3150  def int_x86_avx512_mask_cvttps2udq_128 :
3151        GCCBuiltin<"__builtin_ia32_cvttps2udq128_mask">,
3152          Intrinsic<[llvm_v4i32_ty],
3153          [llvm_v4f32_ty, llvm_v4i32_ty,  llvm_i8_ty],
3154          [IntrNoMem]>;
3155
3156  def int_x86_avx512_mask_cvttps2udq_256 :
3157        GCCBuiltin<"__builtin_ia32_cvttps2udq256_mask">,
3158          Intrinsic<[llvm_v8i32_ty],
3159          [llvm_v8f32_ty, llvm_v8i32_ty,  llvm_i8_ty],
3160          [IntrNoMem]>;
3161
3162  def int_x86_avx512_mask_cvttps2udq_512 :
3163        GCCBuiltin<"__builtin_ia32_cvttps2udq512_mask">,
3164          Intrinsic<[llvm_v16i32_ty],
3165          [llvm_v16f32_ty, llvm_v16i32_ty,  llvm_i16_ty,  llvm_i32_ty],
3166          [IntrNoMem]>;
3167
3168  def int_x86_avx512_mask_cvttps2uqq_128 :
3169        GCCBuiltin<"__builtin_ia32_cvttps2uqq128_mask">,
3170          Intrinsic<[llvm_v2i64_ty],
3171          [llvm_v4f32_ty, llvm_v2i64_ty,  llvm_i8_ty],
3172          [IntrNoMem]>;
3173
3174  def int_x86_avx512_mask_cvttps2uqq_256 :
3175        GCCBuiltin<"__builtin_ia32_cvttps2uqq256_mask">,
3176          Intrinsic<[llvm_v4i64_ty],
3177          [llvm_v4f32_ty, llvm_v4i64_ty,  llvm_i8_ty],
3178          [IntrNoMem]>;
3179
3180  def int_x86_avx512_mask_cvttps2uqq_512 :
3181        GCCBuiltin<"__builtin_ia32_cvttps2uqq512_mask">,
3182          Intrinsic<[llvm_v8i64_ty],
3183          [llvm_v8f32_ty, llvm_v8i64_ty,  llvm_i8_ty,  llvm_i32_ty],
3184          [IntrNoMem]>;
3185
3186  def int_x86_avx512_mask_cvtudq2ps_512 :
3187        GCCBuiltin<"__builtin_ia32_cvtudq2ps512_mask">,
3188          Intrinsic<[llvm_v16f32_ty],
3189          [llvm_v16i32_ty, llvm_v16f32_ty,  llvm_i16_ty,  llvm_i32_ty],
3190          [IntrNoMem]>;
3191
3192  def int_x86_avx512_mask_cvtuqq2pd_512 :
3193        GCCBuiltin<"__builtin_ia32_cvtuqq2pd512_mask">,
3194          Intrinsic<[llvm_v8f64_ty],
3195          [llvm_v8i64_ty, llvm_v8f64_ty,  llvm_i8_ty,  llvm_i32_ty],
3196          [IntrNoMem]>;
3197
3198  def int_x86_avx512_mask_cvtuqq2ps_128 :
3199        GCCBuiltin<"__builtin_ia32_cvtuqq2ps128_mask">,
3200          Intrinsic<[llvm_v4f32_ty],
3201          [llvm_v2i64_ty, llvm_v4f32_ty,  llvm_i8_ty],
3202          [IntrNoMem]>;
3203
3204  def int_x86_avx512_mask_cvtuqq2ps_256 :
3205        GCCBuiltin<"__builtin_ia32_cvtuqq2ps256_mask">,
3206          Intrinsic<[llvm_v4f32_ty],
3207          [llvm_v4i64_ty, llvm_v4f32_ty,  llvm_i8_ty],
3208          [IntrNoMem]>;
3209
3210  def int_x86_avx512_mask_cvtuqq2ps_512 :
3211        GCCBuiltin<"__builtin_ia32_cvtuqq2ps512_mask">,
3212          Intrinsic<[llvm_v8f32_ty],
3213          [llvm_v8i64_ty, llvm_v8f32_ty,  llvm_i8_ty,  llvm_i32_ty],
3214          [IntrNoMem]>;
3215
3216  def int_x86_avx512_mask_rndscale_pd_128 : GCCBuiltin<"__builtin_ia32_rndscalepd_128_mask">,
3217        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_i32_ty,
3218                                     llvm_v2f64_ty,  llvm_i8_ty], [IntrNoMem]>;
3219  def int_x86_avx512_mask_rndscale_pd_256 : GCCBuiltin<"__builtin_ia32_rndscalepd_256_mask">,
3220        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_i32_ty,
3221                                     llvm_v4f64_ty,  llvm_i8_ty], [IntrNoMem]>;
3222  def int_x86_avx512_mask_rndscale_pd_512 : GCCBuiltin<"__builtin_ia32_rndscalepd_mask">,
3223        Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_i32_ty, llvm_v8f64_ty,
3224                                     llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3225  def int_x86_avx512_mask_rndscale_ps_128 : GCCBuiltin<"__builtin_ia32_rndscaleps_128_mask">,
3226        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_i32_ty,
3227                                     llvm_v4f32_ty,  llvm_i8_ty], [IntrNoMem]>;
3228  def int_x86_avx512_mask_rndscale_ps_256 : GCCBuiltin<"__builtin_ia32_rndscaleps_256_mask">,
3229        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_i32_ty,
3230                                     llvm_v8f32_ty,  llvm_i8_ty], [IntrNoMem]>;
3231  def int_x86_avx512_mask_rndscale_ps_512 : GCCBuiltin<"__builtin_ia32_rndscaleps_mask">,
3232        Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_i32_ty, llvm_v16f32_ty,
3233                                     llvm_i16_ty, llvm_i32_ty], [IntrNoMem]>;
3234  def int_x86_avx512_mask_reduce_pd_128 : GCCBuiltin<"__builtin_ia32_reducepd128_mask">,
3235        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_i32_ty,
3236                                     llvm_v2f64_ty,  llvm_i8_ty], [IntrNoMem]>;
3237  def int_x86_avx512_mask_reduce_pd_256 : GCCBuiltin<"__builtin_ia32_reducepd256_mask">,
3238        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_i32_ty,
3239                                     llvm_v4f64_ty,  llvm_i8_ty], [IntrNoMem]>;
3240  def int_x86_avx512_mask_reduce_pd_512 : GCCBuiltin<"__builtin_ia32_reducepd512_mask">,
3241        Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_i32_ty, llvm_v8f64_ty,
3242                                     llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3243  def int_x86_avx512_mask_reduce_ps_128 : GCCBuiltin<"__builtin_ia32_reduceps128_mask">,
3244        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_i32_ty,
3245                                     llvm_v4f32_ty,  llvm_i8_ty], [IntrNoMem]>;
3246  def int_x86_avx512_mask_reduce_ps_256 : GCCBuiltin<"__builtin_ia32_reduceps256_mask">,
3247        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_i32_ty,
3248                                     llvm_v8f32_ty,  llvm_i8_ty], [IntrNoMem]>;
3249  def int_x86_avx512_mask_reduce_ps_512 : GCCBuiltin<"__builtin_ia32_reduceps512_mask">,
3250        Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_i32_ty, llvm_v16f32_ty,
3251                                     llvm_i16_ty, llvm_i32_ty], [IntrNoMem]>;
3252def int_x86_avx512_mask_range_pd_128 : GCCBuiltin<"__builtin_ia32_rangepd128_mask">,
3253        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty, llvm_i32_ty,
3254                                    llvm_v2f64_ty,  llvm_i8_ty], [IntrNoMem]>;
3255def int_x86_avx512_mask_range_pd_256 : GCCBuiltin<"__builtin_ia32_rangepd256_mask">,
3256        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4f64_ty, llvm_i32_ty,
3257                                    llvm_v4f64_ty,  llvm_i8_ty], [IntrNoMem]>;
3258def int_x86_avx512_mask_range_pd_512 : GCCBuiltin<"__builtin_ia32_rangepd512_mask">,
3259        Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty, llvm_i32_ty,
3260                                    llvm_v8f64_ty,  llvm_i8_ty,  llvm_i32_ty], [IntrNoMem]>;
3261def int_x86_avx512_mask_range_ps_128 : GCCBuiltin<"__builtin_ia32_rangeps128_mask">,
3262        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_i32_ty,
3263                                    llvm_v4f32_ty,  llvm_i8_ty], [IntrNoMem]>;
3264def int_x86_avx512_mask_range_ps_256 : GCCBuiltin<"__builtin_ia32_rangeps256_mask">,
3265        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8f32_ty, llvm_i32_ty,
3266                                    llvm_v8f32_ty,  llvm_i8_ty], [IntrNoMem]>;
3267def int_x86_avx512_mask_range_ps_512 : GCCBuiltin<"__builtin_ia32_rangeps512_mask">,
3268        Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty, llvm_i32_ty,
3269                                     llvm_v16f32_ty,  llvm_i16_ty,  llvm_i32_ty], [IntrNoMem]>;
3270}
3271
3272// Vector load with broadcast
3273let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
3274   def int_x86_avx512_broadcastmw_512 :
3275          GCCBuiltin<"__builtin_ia32_broadcastmw512">,
3276          Intrinsic<[llvm_v16i32_ty], [llvm_i16_ty], [IntrNoMem]>;
3277   def int_x86_avx512_broadcastmw_256 :
3278          GCCBuiltin<"__builtin_ia32_broadcastmw256">,
3279          Intrinsic<[llvm_v8i32_ty], [llvm_i16_ty], [IntrNoMem]>;
3280   def int_x86_avx512_broadcastmw_128 :
3281          GCCBuiltin<"__builtin_ia32_broadcastmw128">,
3282          Intrinsic<[llvm_v4i32_ty], [llvm_i16_ty], [IntrNoMem]>;
3283   def int_x86_avx512_broadcastmb_512 :
3284          GCCBuiltin<"__builtin_ia32_broadcastmb512">,
3285          Intrinsic<[llvm_v8i64_ty], [llvm_i8_ty], [IntrNoMem]>;
3286   def int_x86_avx512_broadcastmb_256 :
3287          GCCBuiltin<"__builtin_ia32_broadcastmb256">,
3288          Intrinsic<[llvm_v4i64_ty], [llvm_i8_ty], [IntrNoMem]>;
3289   def int_x86_avx512_broadcastmb_128 :
3290          GCCBuiltin<"__builtin_ia32_broadcastmb128">,
3291          Intrinsic<[llvm_v2i64_ty], [llvm_i8_ty], [IntrNoMem]>;
3292}
3293
3294// Arithmetic ops
3295let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
3296
3297  def int_x86_avx512_add_ps_512 : GCCBuiltin<"__builtin_ia32_addps512">,
3298          Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3299                     llvm_i32_ty], [IntrNoMem]>;
3300  def int_x86_avx512_add_pd_512 : GCCBuiltin<"__builtin_ia32_addpd512">,
3301          Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3302                     llvm_i32_ty], [IntrNoMem]>;
3303  def int_x86_avx512_sub_ps_512 : GCCBuiltin<"__builtin_ia32_subps512">,
3304          Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3305                     llvm_i32_ty], [IntrNoMem]>;
3306  def int_x86_avx512_sub_pd_512 : GCCBuiltin<"__builtin_ia32_subpd512">,
3307          Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3308                     llvm_i32_ty], [IntrNoMem]>;
3309  def int_x86_avx512_mul_ps_512 : GCCBuiltin<"__builtin_ia32_mulps512">,
3310          Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3311                     llvm_i32_ty], [IntrNoMem]>;
3312  def int_x86_avx512_mul_pd_512 : GCCBuiltin<"__builtin_ia32_mulpd512">,
3313          Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3314                     llvm_i32_ty], [IntrNoMem]>;
3315  def int_x86_avx512_div_ps_512 : GCCBuiltin<"__builtin_ia32_divps512">,
3316          Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3317                     llvm_i32_ty], [IntrNoMem]>;
3318  def int_x86_avx512_div_pd_512 : GCCBuiltin<"__builtin_ia32_divpd512">,
3319          Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3320                     llvm_i32_ty], [IntrNoMem]>;
3321
3322  def int_x86_avx512_max_ps_512 : GCCBuiltin<"__builtin_ia32_maxps512">,
3323          Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3324                     llvm_i32_ty], [IntrNoMem]>;
3325  def int_x86_avx512_max_pd_512 : GCCBuiltin<"__builtin_ia32_maxpd512">,
3326          Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3327                     llvm_i32_ty], [IntrNoMem]>;
3328  def int_x86_avx512_min_ps_512 : GCCBuiltin<"__builtin_ia32_minps512">,
3329          Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3330                     llvm_i32_ty], [IntrNoMem]>;
3331  def int_x86_avx512_min_pd_512 : GCCBuiltin<"__builtin_ia32_minpd512">,
3332          Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3333                     llvm_i32_ty], [IntrNoMem]>;
3334
3335  def int_x86_avx512_mask_add_ss_round : GCCBuiltin<"__builtin_ia32_addss_round_mask">,
3336          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3337                     llvm_v4f32_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3338  def int_x86_avx512_mask_div_ss_round : GCCBuiltin<"__builtin_ia32_divss_round_mask">,
3339          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3340                     llvm_v4f32_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3341  def int_x86_avx512_mask_mul_ss_round : GCCBuiltin<"__builtin_ia32_mulss_round_mask">,
3342          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3343                     llvm_v4f32_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3344  def int_x86_avx512_mask_sub_ss_round : GCCBuiltin<"__builtin_ia32_subss_round_mask">,
3345          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3346                     llvm_v4f32_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3347  def int_x86_avx512_mask_max_ss_round : GCCBuiltin<"__builtin_ia32_maxss_round_mask">,
3348          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3349                     llvm_v4f32_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3350  def int_x86_avx512_mask_min_ss_round : GCCBuiltin<"__builtin_ia32_minss_round_mask">,
3351          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3352                     llvm_v4f32_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3353  def int_x86_avx512_mask_add_sd_round : GCCBuiltin<"__builtin_ia32_addsd_round_mask">,
3354          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3355                     llvm_v2f64_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3356  def int_x86_avx512_mask_div_sd_round : GCCBuiltin<"__builtin_ia32_divsd_round_mask">,
3357          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3358                     llvm_v2f64_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3359  def int_x86_avx512_mask_mul_sd_round : GCCBuiltin<"__builtin_ia32_mulsd_round_mask">,
3360          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3361                     llvm_v2f64_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3362  def int_x86_avx512_mask_sub_sd_round : GCCBuiltin<"__builtin_ia32_subsd_round_mask">,
3363          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3364                     llvm_v2f64_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3365  def int_x86_avx512_mask_max_sd_round : GCCBuiltin<"__builtin_ia32_maxsd_round_mask">,
3366          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3367                     llvm_v2f64_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3368  def int_x86_avx512_mask_min_sd_round : GCCBuiltin<"__builtin_ia32_minsd_round_mask">,
3369          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3370                     llvm_v2f64_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3371
3372  def int_x86_avx512_mask_rndscale_ss : GCCBuiltin<"__builtin_ia32_rndscaless_round_mask">,
3373          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty,
3374                                     llvm_i8_ty, llvm_i32_ty, llvm_i32_ty],
3375                                     [IntrNoMem]>;
3376  def int_x86_avx512_mask_rndscale_sd : GCCBuiltin<"__builtin_ia32_rndscalesd_round_mask">,
3377          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty,
3378                                      llvm_i8_ty, llvm_i32_ty, llvm_i32_ty],
3379                                     [IntrNoMem]>;
3380  def int_x86_avx512_mask_range_ss : GCCBuiltin<"__builtin_ia32_rangess128_round_mask">,
3381          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty,
3382                                     llvm_i8_ty, llvm_i32_ty, llvm_i32_ty],
3383                                     [IntrNoMem]>;
3384  def int_x86_avx512_mask_range_sd : GCCBuiltin<"__builtin_ia32_rangesd128_round_mask">,
3385          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty,
3386                                      llvm_i8_ty, llvm_i32_ty, llvm_i32_ty],
3387                                     [IntrNoMem]>;
3388  def int_x86_avx512_mask_reduce_ss : GCCBuiltin<"__builtin_ia32_reducess_mask">,
3389          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty,
3390                                     llvm_i8_ty, llvm_i32_ty, llvm_i32_ty],
3391                                     [IntrNoMem]>;
3392  def int_x86_avx512_mask_reduce_sd : GCCBuiltin<"__builtin_ia32_reducesd_mask">,
3393          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty,
3394                                      llvm_i8_ty, llvm_i32_ty, llvm_i32_ty],
3395                                     [IntrNoMem]>;
3396  def int_x86_avx512_mask_scalef_sd : GCCBuiltin<"__builtin_ia32_scalefsd_round_mask">,
3397          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3398                                      llvm_v2f64_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3399  def int_x86_avx512_mask_scalef_ss : GCCBuiltin<"__builtin_ia32_scalefss_round_mask">,
3400          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3401                                      llvm_v4f32_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3402  def int_x86_avx512_mask_scalef_pd_128 : GCCBuiltin<"__builtin_ia32_scalefpd128_mask">,
3403          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3404                    llvm_v2f64_ty, llvm_i8_ty], [IntrNoMem]>;
3405  def int_x86_avx512_mask_scalef_pd_256 : GCCBuiltin<"__builtin_ia32_scalefpd256_mask">,
3406          Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4f64_ty,
3407                    llvm_v4f64_ty, llvm_i8_ty],[IntrNoMem]>;
3408  def int_x86_avx512_mask_scalef_pd_512 : GCCBuiltin<"__builtin_ia32_scalefpd512_mask">,
3409          Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3410                    llvm_v8f64_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3411  def int_x86_avx512_mask_scalef_ps_128 : GCCBuiltin<"__builtin_ia32_scalefps128_mask">,
3412          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3413                    llvm_v4f32_ty, llvm_i8_ty], [IntrNoMem]>;
3414  def int_x86_avx512_mask_scalef_ps_256 : GCCBuiltin<"__builtin_ia32_scalefps256_mask">,
3415          Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8f32_ty,
3416                    llvm_v8f32_ty, llvm_i8_ty], [IntrNoMem]>;
3417  def int_x86_avx512_mask_scalef_ps_512 : GCCBuiltin<"__builtin_ia32_scalefps512_mask">,
3418          Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3419                    llvm_v16f32_ty, llvm_i16_ty, llvm_i32_ty], [IntrNoMem]>;
3420
3421  def int_x86_avx512_mask_sqrt_ss :
3422        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty,
3423                                    llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3424  def int_x86_avx512_mask_sqrt_sd :
3425        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty,
3426                                    llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3427
3428  def int_x86_avx512_sqrt_pd_512 :
3429        Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_i32_ty], [IntrNoMem]>;
3430  def int_x86_avx512_sqrt_ps_512 :
3431        Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_i32_ty], [IntrNoMem]>;
3432  def int_x86_avx512_mask_fixupimm_pd_128 :
3433         GCCBuiltin<"__builtin_ia32_fixupimmpd128_mask">,
3434          Intrinsic<[llvm_v2f64_ty],
3435          [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2i64_ty, llvm_i32_ty, llvm_i8_ty],
3436          [IntrNoMem]>;
3437  def int_x86_avx512_maskz_fixupimm_pd_128 :
3438         GCCBuiltin<"__builtin_ia32_fixupimmpd128_maskz">,
3439          Intrinsic<[llvm_v2f64_ty],
3440          [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2i64_ty, llvm_i32_ty, llvm_i8_ty],
3441          [IntrNoMem]>;
3442  def int_x86_avx512_mask_fixupimm_pd_256 :
3443         GCCBuiltin<"__builtin_ia32_fixupimmpd256_mask">,
3444          Intrinsic<[llvm_v4f64_ty],
3445          [llvm_v4f64_ty, llvm_v4f64_ty, llvm_v4i64_ty, llvm_i32_ty, llvm_i8_ty],
3446          [IntrNoMem]>;
3447  def int_x86_avx512_maskz_fixupimm_pd_256 :
3448         GCCBuiltin<"__builtin_ia32_fixupimmpd256_maskz">,
3449          Intrinsic<[llvm_v4f64_ty],
3450          [llvm_v4f64_ty, llvm_v4f64_ty, llvm_v4i64_ty, llvm_i32_ty, llvm_i8_ty],
3451          [IntrNoMem]>;
3452  def int_x86_avx512_mask_fixupimm_pd_512 :
3453         GCCBuiltin<"__builtin_ia32_fixupimmpd512_mask">,
3454          Intrinsic<[llvm_v8f64_ty],
3455          [llvm_v8f64_ty, llvm_v8f64_ty, llvm_v8i64_ty, llvm_i32_ty, llvm_i8_ty,
3456          llvm_i32_ty], [IntrNoMem]>;
3457  def int_x86_avx512_maskz_fixupimm_pd_512 :
3458         GCCBuiltin<"__builtin_ia32_fixupimmpd512_maskz">,
3459          Intrinsic<[llvm_v8f64_ty],
3460          [llvm_v8f64_ty, llvm_v8f64_ty, llvm_v8i64_ty, llvm_i32_ty, llvm_i8_ty,
3461          llvm_i32_ty], [IntrNoMem]>;
3462  def int_x86_avx512_mask_fixupimm_ps_128 :
3463         GCCBuiltin<"__builtin_ia32_fixupimmps128_mask">,
3464          Intrinsic<[llvm_v4f32_ty],
3465          [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4i32_ty, llvm_i32_ty, llvm_i8_ty],
3466          [IntrNoMem]>;
3467  def int_x86_avx512_maskz_fixupimm_ps_128 :
3468         GCCBuiltin<"__builtin_ia32_fixupimmps128_maskz">,
3469          Intrinsic<[llvm_v4f32_ty],
3470          [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4i32_ty, llvm_i32_ty, llvm_i8_ty],
3471          [IntrNoMem]>;
3472  def int_x86_avx512_mask_fixupimm_ps_256 :
3473         GCCBuiltin<"__builtin_ia32_fixupimmps256_mask">,
3474          Intrinsic<[llvm_v8f32_ty],
3475          [llvm_v8f32_ty, llvm_v8f32_ty, llvm_v8i32_ty, llvm_i32_ty, llvm_i8_ty],
3476          [IntrNoMem]>;
3477  def int_x86_avx512_maskz_fixupimm_ps_256 :
3478         GCCBuiltin<"__builtin_ia32_fixupimmps256_maskz">,
3479          Intrinsic<[llvm_v8f32_ty],
3480          [llvm_v8f32_ty, llvm_v8f32_ty, llvm_v8i32_ty, llvm_i32_ty, llvm_i8_ty],
3481          [IntrNoMem]>;
3482  def int_x86_avx512_mask_fixupimm_ps_512 :
3483         GCCBuiltin<"__builtin_ia32_fixupimmps512_mask">,
3484          Intrinsic<[llvm_v16f32_ty],
3485          [llvm_v16f32_ty, llvm_v16f32_ty, llvm_v16i32_ty, llvm_i32_ty,
3486          llvm_i16_ty, llvm_i32_ty], [IntrNoMem]>;
3487  def int_x86_avx512_maskz_fixupimm_ps_512 :
3488         GCCBuiltin<"__builtin_ia32_fixupimmps512_maskz">,
3489          Intrinsic<[llvm_v16f32_ty],
3490          [llvm_v16f32_ty, llvm_v16f32_ty, llvm_v16i32_ty, llvm_i32_ty,
3491          llvm_i16_ty, llvm_i32_ty], [IntrNoMem]>;
3492  def int_x86_avx512_mask_fixupimm_sd :
3493         GCCBuiltin<"__builtin_ia32_fixupimmsd_mask">,
3494          Intrinsic<[llvm_v2f64_ty],
3495          [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2i64_ty, llvm_i32_ty, llvm_i8_ty,
3496          llvm_i32_ty], [IntrNoMem]>;
3497  def int_x86_avx512_maskz_fixupimm_sd :
3498         GCCBuiltin<"__builtin_ia32_fixupimmsd_maskz">,
3499          Intrinsic<[llvm_v2f64_ty],
3500          [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2i64_ty, llvm_i32_ty, llvm_i8_ty,
3501          llvm_i32_ty], [IntrNoMem]>;
3502  def int_x86_avx512_mask_fixupimm_ss :
3503         GCCBuiltin<"__builtin_ia32_fixupimmss_mask">,
3504          Intrinsic<[llvm_v4f32_ty],
3505          [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4i32_ty, llvm_i32_ty, llvm_i8_ty,
3506          llvm_i32_ty], [IntrNoMem]>;
3507  def int_x86_avx512_maskz_fixupimm_ss :
3508         GCCBuiltin<"__builtin_ia32_fixupimmss_maskz">,
3509          Intrinsic<[llvm_v4f32_ty],
3510          [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4i32_ty, llvm_i32_ty, llvm_i8_ty,
3511          llvm_i32_ty], [IntrNoMem]>;
3512  def int_x86_avx512_mask_getexp_pd_128 : GCCBuiltin<"__builtin_ia32_getexppd128_mask">,
3513        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3514                                    llvm_i8_ty], [IntrNoMem]>;
3515  def int_x86_avx512_mask_getexp_pd_256 : GCCBuiltin<"__builtin_ia32_getexppd256_mask">,
3516        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4f64_ty,
3517                                    llvm_i8_ty], [IntrNoMem]>;
3518  def int_x86_avx512_mask_getexp_pd_512 : GCCBuiltin<"__builtin_ia32_getexppd512_mask">,
3519        Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3520                                    llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3521  def int_x86_avx512_mask_getexp_ps_128 : GCCBuiltin<"__builtin_ia32_getexpps128_mask">,
3522        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3523                                     llvm_i8_ty], [IntrNoMem]>;
3524  def int_x86_avx512_mask_getexp_ps_256 : GCCBuiltin<"__builtin_ia32_getexpps256_mask">,
3525        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8f32_ty,
3526                                     llvm_i8_ty], [IntrNoMem]>;
3527  def int_x86_avx512_mask_getexp_ps_512 : GCCBuiltin<"__builtin_ia32_getexpps512_mask">,
3528        Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3529                                     llvm_i16_ty, llvm_i32_ty], [IntrNoMem]>;
3530
3531  def int_x86_avx512_mask_getexp_ss : GCCBuiltin<"__builtin_ia32_getexpss128_round_mask">,
3532        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty,
3533                                    llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3534  def int_x86_avx512_mask_getexp_sd : GCCBuiltin<"__builtin_ia32_getexpsd128_round_mask">,
3535        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty,
3536                                    llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3537
3538  def int_x86_avx512_mask_getmant_pd_128 :
3539         GCCBuiltin<"__builtin_ia32_getmantpd128_mask">,
3540          Intrinsic<[llvm_v2f64_ty],
3541          [llvm_v2f64_ty,llvm_i32_ty, llvm_v2f64_ty,  llvm_i8_ty],
3542          [IntrNoMem]>;
3543
3544  def int_x86_avx512_mask_getmant_pd_256 :
3545         GCCBuiltin<"__builtin_ia32_getmantpd256_mask">,
3546          Intrinsic<[llvm_v4f64_ty],
3547          [llvm_v4f64_ty,llvm_i32_ty, llvm_v4f64_ty,  llvm_i8_ty],
3548          [IntrNoMem]>;
3549
3550  def int_x86_avx512_mask_getmant_pd_512 :
3551         GCCBuiltin<"__builtin_ia32_getmantpd512_mask">,
3552          Intrinsic<[llvm_v8f64_ty],
3553          [llvm_v8f64_ty,llvm_i32_ty, llvm_v8f64_ty,  llvm_i8_ty,llvm_i32_ty ],
3554          [IntrNoMem]>;
3555
3556  def int_x86_avx512_mask_getmant_ps_128 :
3557         GCCBuiltin<"__builtin_ia32_getmantps128_mask">,
3558          Intrinsic<[llvm_v4f32_ty],
3559          [llvm_v4f32_ty, llvm_i32_ty, llvm_v4f32_ty,  llvm_i8_ty],
3560          [IntrNoMem]>;
3561
3562  def int_x86_avx512_mask_getmant_ps_256 :
3563         GCCBuiltin<"__builtin_ia32_getmantps256_mask">,
3564          Intrinsic<[llvm_v8f32_ty],
3565          [llvm_v8f32_ty, llvm_i32_ty, llvm_v8f32_ty,  llvm_i8_ty],
3566          [IntrNoMem]>;
3567
3568  def int_x86_avx512_mask_getmant_ps_512 :
3569         GCCBuiltin<"__builtin_ia32_getmantps512_mask">,
3570          Intrinsic<[llvm_v16f32_ty],
3571          [llvm_v16f32_ty,llvm_i32_ty, llvm_v16f32_ty,llvm_i16_ty,llvm_i32_ty],
3572          [IntrNoMem]>;
3573
3574  def int_x86_avx512_mask_getmant_ss :
3575         GCCBuiltin<"__builtin_ia32_getmantss_round_mask">,
3576          Intrinsic<[llvm_v4f32_ty],
3577          [llvm_v4f32_ty, llvm_v4f32_ty, llvm_i32_ty, llvm_v4f32_ty,
3578           llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3579
3580  def int_x86_avx512_mask_getmant_sd :
3581         GCCBuiltin<"__builtin_ia32_getmantsd_round_mask">,
3582          Intrinsic<[llvm_v2f64_ty],
3583          [llvm_v2f64_ty, llvm_v2f64_ty, llvm_i32_ty, llvm_v2f64_ty,
3584           llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3585
3586  def int_x86_avx512_rsqrt14_ss : GCCBuiltin<"__builtin_ia32_rsqrt14ss_mask">,
3587        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty,
3588                                    llvm_i8_ty], [IntrNoMem]>;
3589  def int_x86_avx512_rsqrt14_sd : GCCBuiltin<"__builtin_ia32_rsqrt14sd_mask">,
3590        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty,
3591                                    llvm_i8_ty], [IntrNoMem]>;
3592
3593  def int_x86_avx512_rsqrt14_pd_128 : GCCBuiltin<"__builtin_ia32_rsqrt14pd128_mask">,
3594        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3595                                    llvm_i8_ty], [IntrNoMem]>;
3596  def int_x86_avx512_rsqrt14_pd_256 : GCCBuiltin<"__builtin_ia32_rsqrt14pd256_mask">,
3597        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4f64_ty,
3598                                    llvm_i8_ty], [IntrNoMem]>;
3599  def int_x86_avx512_rsqrt14_pd_512 : GCCBuiltin<"__builtin_ia32_rsqrt14pd512_mask">,
3600        Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3601                                    llvm_i8_ty], [IntrNoMem]>;
3602  def int_x86_avx512_rsqrt14_ps_128 : GCCBuiltin<"__builtin_ia32_rsqrt14ps128_mask">,
3603        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3604                                     llvm_i8_ty], [IntrNoMem]>;
3605  def int_x86_avx512_rsqrt14_ps_256 : GCCBuiltin<"__builtin_ia32_rsqrt14ps256_mask">,
3606          Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8f32_ty,
3607                                     llvm_i8_ty], [IntrNoMem]>;
3608  def int_x86_avx512_rsqrt14_ps_512 : GCCBuiltin<"__builtin_ia32_rsqrt14ps512_mask">,
3609        Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3610                                     llvm_i16_ty], [IntrNoMem]>;
3611  def int_x86_avx512_rcp14_ss : GCCBuiltin<"__builtin_ia32_rcp14ss_mask">,
3612        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty,
3613                                    llvm_i8_ty], [IntrNoMem]>;
3614  def int_x86_avx512_rcp14_sd : GCCBuiltin<"__builtin_ia32_rcp14sd_mask">,
3615        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty,
3616                                    llvm_i8_ty], [IntrNoMem]>;
3617
3618  def int_x86_avx512_rcp14_pd_128 : GCCBuiltin<"__builtin_ia32_rcp14pd128_mask">,
3619        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3620                                    llvm_i8_ty], [IntrNoMem]>;
3621  def int_x86_avx512_rcp14_pd_256 : GCCBuiltin<"__builtin_ia32_rcp14pd256_mask">,
3622        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4f64_ty,
3623                                    llvm_i8_ty], [IntrNoMem]>;
3624  def int_x86_avx512_rcp14_pd_512 : GCCBuiltin<"__builtin_ia32_rcp14pd512_mask">,
3625        Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3626                                    llvm_i8_ty], [IntrNoMem]>;
3627  def int_x86_avx512_rcp14_ps_128 : GCCBuiltin<"__builtin_ia32_rcp14ps128_mask">,
3628        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3629                                     llvm_i8_ty], [IntrNoMem]>;
3630  def int_x86_avx512_rcp14_ps_256 : GCCBuiltin<"__builtin_ia32_rcp14ps256_mask">,
3631          Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8f32_ty,
3632                                     llvm_i8_ty], [IntrNoMem]>;
3633  def int_x86_avx512_rcp14_ps_512 : GCCBuiltin<"__builtin_ia32_rcp14ps512_mask">,
3634        Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3635                                     llvm_i16_ty], [IntrNoMem]>;
3636
3637  def int_x86_avx512_rcp28_ps : GCCBuiltin<"__builtin_ia32_rcp28ps_mask">,
3638            Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3639                                         llvm_i16_ty, llvm_i32_ty], [IntrNoMem]>;
3640  def int_x86_avx512_rcp28_pd : GCCBuiltin<"__builtin_ia32_rcp28pd_mask">,
3641            Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3642                                        llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3643  def int_x86_avx512_exp2_ps : GCCBuiltin<"__builtin_ia32_exp2ps_mask">,
3644            Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3645                                         llvm_i16_ty, llvm_i32_ty], [IntrNoMem]>;
3646  def int_x86_avx512_exp2_pd : GCCBuiltin<"__builtin_ia32_exp2pd_mask">,
3647            Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3648                                        llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
3649
3650  def int_x86_avx512_rcp28_ss : GCCBuiltin<"__builtin_ia32_rcp28ss_round_mask">,
3651            Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3652                                        llvm_v4f32_ty, llvm_i8_ty, llvm_i32_ty],
3653                      [IntrNoMem]>;
3654  def int_x86_avx512_rcp28_sd : GCCBuiltin<"__builtin_ia32_rcp28sd_round_mask">,
3655            Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3656                                        llvm_v2f64_ty, llvm_i8_ty, llvm_i32_ty],
3657                      [IntrNoMem]>;
3658  def int_x86_avx512_rsqrt28_ps : GCCBuiltin<"__builtin_ia32_rsqrt28ps_mask">,
3659            Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
3660                                         llvm_i16_ty, llvm_i32_ty],
3661                      [IntrNoMem]>;
3662  def int_x86_avx512_rsqrt28_pd : GCCBuiltin<"__builtin_ia32_rsqrt28pd_mask">,
3663            Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
3664                                        llvm_i8_ty, llvm_i32_ty],
3665                      [IntrNoMem]>;
3666  def int_x86_avx512_rsqrt28_ss : GCCBuiltin<"__builtin_ia32_rsqrt28ss_round_mask">,
3667            Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
3668                                        llvm_v4f32_ty, llvm_i8_ty, llvm_i32_ty],
3669                      [IntrNoMem]>;
3670  def int_x86_avx512_rsqrt28_sd : GCCBuiltin<"__builtin_ia32_rsqrt28sd_round_mask">,
3671            Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
3672                                        llvm_v2f64_ty, llvm_i8_ty, llvm_i32_ty],
3673                      [IntrNoMem]>;
3674  def int_x86_avx512_psad_bw_512 : GCCBuiltin<"__builtin_ia32_psadbw512">,
3675              Intrinsic<[llvm_v8i64_ty], [llvm_v64i8_ty, llvm_v64i8_ty],
3676                        [IntrNoMem, Commutative]>;
3677}
3678// Integer arithmetic ops
3679let TargetPrefix = "x86" in {
3680  def int_x86_avx512_mask_padds_b_128 : // FIXME: remove this intrinsic
3681          Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
3682                     llvm_v16i8_ty, llvm_i16_ty], [IntrNoMem]>;
3683  def int_x86_avx512_mask_padds_b_256 : // FIXME: remove this intrinsic
3684          Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty, llvm_v32i8_ty,
3685                     llvm_v32i8_ty, llvm_i32_ty], [IntrNoMem]>;
3686  def int_x86_avx512_mask_padds_b_512 : GCCBuiltin<"__builtin_ia32_paddsb512_mask">,
3687          Intrinsic<[llvm_v64i8_ty], [llvm_v64i8_ty, llvm_v64i8_ty,
3688                     llvm_v64i8_ty, llvm_i64_ty], [IntrNoMem]>;
3689  def int_x86_avx512_mask_padds_w_128 : // FIXME: remove this intrinsic
3690          Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
3691                     llvm_v8i16_ty, llvm_i8_ty], [IntrNoMem]>;
3692  def int_x86_avx512_mask_padds_w_256 : // FIXME: remove this intrinsic
3693          Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty,
3694                     llvm_v16i16_ty, llvm_i16_ty], [IntrNoMem]>;
3695  def int_x86_avx512_mask_padds_w_512 : GCCBuiltin<"__builtin_ia32_paddsw512_mask">,
3696          Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty,
3697                     llvm_v32i16_ty, llvm_i32_ty], [IntrNoMem]>;
3698  def int_x86_avx512_mask_paddus_b_128 : // FIXME: remove this intrinsic
3699          Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
3700                     llvm_v16i8_ty, llvm_i16_ty], [IntrNoMem]>;
3701  def int_x86_avx512_mask_paddus_b_256 : // FIXME: remove this intrinsic
3702          Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty, llvm_v32i8_ty,
3703                     llvm_v32i8_ty, llvm_i32_ty], [IntrNoMem]>;
3704  def int_x86_avx512_mask_paddus_b_512 : GCCBuiltin<"__builtin_ia32_paddusb512_mask">,
3705          Intrinsic<[llvm_v64i8_ty], [llvm_v64i8_ty, llvm_v64i8_ty,
3706                     llvm_v64i8_ty, llvm_i64_ty], [IntrNoMem]>;
3707  def int_x86_avx512_mask_paddus_w_128 : // FIXME: remove this intrinsic
3708          Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
3709                     llvm_v8i16_ty, llvm_i8_ty], [IntrNoMem]>;
3710  def int_x86_avx512_mask_paddus_w_256 : // FIXME: remove this intrinsic
3711          Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty,
3712                     llvm_v16i16_ty, llvm_i16_ty], [IntrNoMem]>;
3713  def int_x86_avx512_mask_paddus_w_512 : GCCBuiltin<"__builtin_ia32_paddusw512_mask">,
3714          Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty,
3715                     llvm_v32i16_ty, llvm_i32_ty], [IntrNoMem]>;
3716  def int_x86_avx512_mask_psubs_b_128 : // FIXME: remove this intrinsic
3717          Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
3718                     llvm_v16i8_ty, llvm_i16_ty], [IntrNoMem]>;
3719  def int_x86_avx512_mask_psubs_b_256 : // FIXME: remove this intrinsic
3720          Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty, llvm_v32i8_ty,
3721                     llvm_v32i8_ty, llvm_i32_ty], [IntrNoMem]>;
3722  def int_x86_avx512_mask_psubs_b_512 : GCCBuiltin<"__builtin_ia32_psubsb512_mask">,
3723          Intrinsic<[llvm_v64i8_ty], [llvm_v64i8_ty, llvm_v64i8_ty,
3724                     llvm_v64i8_ty, llvm_i64_ty], [IntrNoMem]>;
3725  def int_x86_avx512_mask_psubs_w_128 : // FIXME: remove this intrinsic
3726          Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
3727                     llvm_v8i16_ty, llvm_i8_ty], [IntrNoMem]>;
3728  def int_x86_avx512_mask_psubs_w_256 : // FIXME: remove this intrinsic
3729          Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty,
3730                     llvm_v16i16_ty, llvm_i16_ty], [IntrNoMem]>;
3731  def int_x86_avx512_mask_psubs_w_512 : GCCBuiltin<"__builtin_ia32_psubsw512_mask">,
3732          Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty,
3733                     llvm_v32i16_ty, llvm_i32_ty], [IntrNoMem]>;
3734  def int_x86_avx512_mask_psubus_b_128 : // FIXME: remove this intrinsic
3735          Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
3736                     llvm_v16i8_ty, llvm_i16_ty], [IntrNoMem]>;
3737  def int_x86_avx512_mask_psubus_b_256 : // FIXME: remove this intrinsic
3738          Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty, llvm_v32i8_ty,
3739                     llvm_v32i8_ty, llvm_i32_ty], [IntrNoMem]>;
3740  def int_x86_avx512_mask_psubus_b_512 : GCCBuiltin<"__builtin_ia32_psubusb512_mask">,
3741          Intrinsic<[llvm_v64i8_ty], [llvm_v64i8_ty, llvm_v64i8_ty,
3742                     llvm_v64i8_ty, llvm_i64_ty], [IntrNoMem]>;
3743  def int_x86_avx512_mask_psubus_w_128 : // FIXME: remove this intrinsic
3744          Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
3745                     llvm_v8i16_ty, llvm_i8_ty], [IntrNoMem]>;
3746  def int_x86_avx512_mask_psubus_w_256 : // FIXME: remove this intrinsic
3747          Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty,
3748                     llvm_v16i16_ty, llvm_i16_ty], [IntrNoMem]>;
3749  def int_x86_avx512_mask_psubus_w_512 : GCCBuiltin<"__builtin_ia32_psubusw512_mask">,
3750          Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty,
3751                     llvm_v32i16_ty, llvm_i32_ty], [IntrNoMem]>;
3752  def int_x86_avx512_pmulhu_w_512 : GCCBuiltin<"__builtin_ia32_pmulhuw512">,
3753              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty,
3754                         llvm_v32i16_ty], [IntrNoMem, Commutative]>;
3755  def int_x86_avx512_pmulh_w_512 : GCCBuiltin<"__builtin_ia32_pmulhw512">,
3756              Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty,
3757                         llvm_v32i16_ty], [IntrNoMem, Commutative]>;
3758  def int_x86_avx512_pmaddw_d_512 : GCCBuiltin<"__builtin_ia32_pmaddwd512">,
3759              Intrinsic<[llvm_v16i32_ty], [llvm_v32i16_ty,
3760                         llvm_v32i16_ty], [IntrNoMem, Commutative]>;
3761  def int_x86_avx512_pmaddubs_w_512 : GCCBuiltin<"__builtin_ia32_pmaddubsw512">,
3762              Intrinsic<[llvm_v32i16_ty], [llvm_v64i8_ty,
3763                         llvm_v64i8_ty], [IntrNoMem]>;
3764
3765  def int_x86_avx512_dbpsadbw_128 :
3766         GCCBuiltin<"__builtin_ia32_dbpsadbw128">,
3767          Intrinsic<[llvm_v8i16_ty],
3768                    [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty], [IntrNoMem]>;
3769
3770  def int_x86_avx512_dbpsadbw_256 :
3771         GCCBuiltin<"__builtin_ia32_dbpsadbw256">,
3772          Intrinsic<[llvm_v16i16_ty],
3773                    [llvm_v32i8_ty, llvm_v32i8_ty, llvm_i32_ty], [IntrNoMem]>;
3774
3775  def int_x86_avx512_dbpsadbw_512 :
3776         GCCBuiltin<"__builtin_ia32_dbpsadbw512">,
3777          Intrinsic<[llvm_v32i16_ty],
3778                    [llvm_v64i8_ty, llvm_v64i8_ty, llvm_i32_ty], [IntrNoMem]>;
3779}
3780
3781// Gather and Scatter ops
3782let TargetPrefix = "x86" in {
3783  def int_x86_avx512_gather_dpd_512  : GCCBuiltin<"__builtin_ia32_gathersiv8df">,
3784          Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_ptr_ty,
3785                     llvm_v8i32_ty, llvm_i8_ty, llvm_i32_ty],
3786                    [IntrReadMem, IntrArgMemOnly]>;
3787  def int_x86_avx512_gather_dps_512  : GCCBuiltin<"__builtin_ia32_gathersiv16sf">,
3788          Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_ptr_ty,
3789                     llvm_v16i32_ty, llvm_i16_ty, llvm_i32_ty],
3790                    [IntrReadMem, IntrArgMemOnly]>;
3791  def int_x86_avx512_gather_qpd_512  : GCCBuiltin<"__builtin_ia32_gatherdiv8df">,
3792          Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_ptr_ty,
3793                     llvm_v8i64_ty, llvm_i8_ty, llvm_i32_ty],
3794                    [IntrReadMem, IntrArgMemOnly]>;
3795  def int_x86_avx512_gather_qps_512  : GCCBuiltin<"__builtin_ia32_gatherdiv16sf">,
3796          Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_ptr_ty,
3797                     llvm_v8i64_ty, llvm_i8_ty, llvm_i32_ty],
3798                    [IntrReadMem, IntrArgMemOnly]>;
3799
3800
3801  def int_x86_avx512_gather_dpq_512  : GCCBuiltin<"__builtin_ia32_gathersiv8di">,
3802          Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_ptr_ty,
3803                     llvm_v8i32_ty, llvm_i8_ty, llvm_i32_ty],
3804                    [IntrReadMem, IntrArgMemOnly]>;
3805  def int_x86_avx512_gather_dpi_512  : GCCBuiltin<"__builtin_ia32_gathersiv16si">,
3806          Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_ptr_ty,
3807                     llvm_v16i32_ty, llvm_i16_ty, llvm_i32_ty],
3808                    [IntrReadMem, IntrArgMemOnly]>;
3809  def int_x86_avx512_gather_qpq_512  : GCCBuiltin<"__builtin_ia32_gatherdiv8di">,
3810          Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_ptr_ty,
3811                     llvm_v8i64_ty, llvm_i8_ty, llvm_i32_ty],
3812                    [IntrReadMem, IntrArgMemOnly]>;
3813  def int_x86_avx512_gather_qpi_512  : GCCBuiltin<"__builtin_ia32_gatherdiv16si">,
3814          Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_ptr_ty,
3815                     llvm_v8i64_ty, llvm_i8_ty, llvm_i32_ty],
3816                    [IntrReadMem, IntrArgMemOnly]>;
3817
3818  def int_x86_avx512_gather3div2_df :
3819        GCCBuiltin<"__builtin_ia32_gather3div2df">,
3820          Intrinsic<[llvm_v2f64_ty],
3821          [llvm_v2f64_ty, llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty, llvm_i32_ty],
3822          [IntrReadMem, IntrArgMemOnly]>;
3823
3824  def int_x86_avx512_gather3div2_di :
3825        GCCBuiltin<"__builtin_ia32_gather3div2di">,
3826          Intrinsic<[llvm_v2i64_ty],
3827          [llvm_v2i64_ty, llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty, llvm_i32_ty],
3828          [IntrReadMem, IntrArgMemOnly]>;
3829
3830  def int_x86_avx512_gather3div4_df :
3831        GCCBuiltin<"__builtin_ia32_gather3div4df">,
3832          Intrinsic<[llvm_v4f64_ty],
3833          [llvm_v4f64_ty, llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty, llvm_i32_ty],
3834          [IntrReadMem, IntrArgMemOnly]>;
3835
3836  def int_x86_avx512_gather3div4_di :
3837        GCCBuiltin<"__builtin_ia32_gather3div4di">,
3838          Intrinsic<[llvm_v4i64_ty],
3839          [llvm_v4i64_ty, llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty, llvm_i32_ty],
3840          [IntrReadMem, IntrArgMemOnly]>;
3841
3842  def int_x86_avx512_gather3div4_sf :
3843        GCCBuiltin<"__builtin_ia32_gather3div4sf">,
3844          Intrinsic<[llvm_v4f32_ty],
3845          [llvm_v4f32_ty, llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty, llvm_i32_ty],
3846          [IntrReadMem, IntrArgMemOnly]>;
3847
3848  def int_x86_avx512_gather3div4_si :
3849        GCCBuiltin<"__builtin_ia32_gather3div4si">,
3850          Intrinsic<[llvm_v4i32_ty],
3851          [llvm_v4i32_ty, llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty, llvm_i32_ty],
3852          [IntrReadMem, IntrArgMemOnly]>;
3853
3854  def int_x86_avx512_gather3div8_sf :
3855        GCCBuiltin<"__builtin_ia32_gather3div8sf">,
3856          Intrinsic<[llvm_v4f32_ty],
3857          [llvm_v4f32_ty, llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty, llvm_i32_ty],
3858          [IntrReadMem, IntrArgMemOnly]>;
3859
3860  def int_x86_avx512_gather3div8_si :
3861        GCCBuiltin<"__builtin_ia32_gather3div8si">,
3862          Intrinsic<[llvm_v4i32_ty],
3863          [llvm_v4i32_ty, llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty, llvm_i32_ty],
3864          [IntrReadMem, IntrArgMemOnly]>;
3865
3866  def int_x86_avx512_gather3siv2_df :
3867        GCCBuiltin<"__builtin_ia32_gather3siv2df">,
3868          Intrinsic<[llvm_v2f64_ty],
3869          [llvm_v2f64_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_i8_ty, llvm_i32_ty],
3870          [IntrReadMem, IntrArgMemOnly]>;
3871
3872  def int_x86_avx512_gather3siv2_di :
3873        GCCBuiltin<"__builtin_ia32_gather3siv2di">,
3874          Intrinsic<[llvm_v2i64_ty],
3875          [llvm_v2i64_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_i8_ty, llvm_i32_ty],
3876          [IntrReadMem, IntrArgMemOnly]>;
3877
3878  def int_x86_avx512_gather3siv4_df :
3879        GCCBuiltin<"__builtin_ia32_gather3siv4df">,
3880          Intrinsic<[llvm_v4f64_ty],
3881          [llvm_v4f64_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_i8_ty, llvm_i32_ty],
3882          [IntrReadMem, IntrArgMemOnly]>;
3883
3884  def int_x86_avx512_gather3siv4_di :
3885        GCCBuiltin<"__builtin_ia32_gather3siv4di">,
3886          Intrinsic<[llvm_v4i64_ty],
3887          [llvm_v4i64_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_i8_ty, llvm_i32_ty],
3888          [IntrReadMem, IntrArgMemOnly]>;
3889
3890  def int_x86_avx512_gather3siv4_sf :
3891        GCCBuiltin<"__builtin_ia32_gather3siv4sf">,
3892          Intrinsic<[llvm_v4f32_ty],
3893          [llvm_v4f32_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_i8_ty, llvm_i32_ty],
3894          [IntrReadMem, IntrArgMemOnly]>;
3895
3896  def int_x86_avx512_gather3siv4_si :
3897        GCCBuiltin<"__builtin_ia32_gather3siv4si">,
3898          Intrinsic<[llvm_v4i32_ty],
3899          [llvm_v4i32_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_i8_ty, llvm_i32_ty],
3900          [IntrReadMem, IntrArgMemOnly]>;
3901
3902  def int_x86_avx512_gather3siv8_sf :
3903        GCCBuiltin<"__builtin_ia32_gather3siv8sf">,
3904          Intrinsic<[llvm_v8f32_ty],
3905          [llvm_v8f32_ty, llvm_ptr_ty, llvm_v8i32_ty, llvm_i8_ty, llvm_i32_ty],
3906          [IntrReadMem, IntrArgMemOnly]>;
3907
3908  def int_x86_avx512_gather3siv8_si :
3909        GCCBuiltin<"__builtin_ia32_gather3siv8si">,
3910          Intrinsic<[llvm_v8i32_ty],
3911          [llvm_v8i32_ty, llvm_ptr_ty, llvm_v8i32_ty, llvm_i8_ty, llvm_i32_ty],
3912          [IntrReadMem, IntrArgMemOnly]>;
3913
3914// scatter
3915  def int_x86_avx512_scatter_dpd_512  : GCCBuiltin<"__builtin_ia32_scattersiv8df">,
3916          Intrinsic<[], [llvm_ptr_ty, llvm_i8_ty,
3917                        llvm_v8i32_ty, llvm_v8f64_ty, llvm_i32_ty],
3918                    [IntrArgMemOnly]>;
3919  def int_x86_avx512_scatter_dps_512  : GCCBuiltin<"__builtin_ia32_scattersiv16sf">,
3920          Intrinsic<[], [llvm_ptr_ty, llvm_i16_ty,
3921                       llvm_v16i32_ty, llvm_v16f32_ty, llvm_i32_ty],
3922                    [IntrArgMemOnly]>;
3923  def int_x86_avx512_scatter_qpd_512  : GCCBuiltin<"__builtin_ia32_scatterdiv8df">,
3924          Intrinsic<[], [llvm_ptr_ty, llvm_i8_ty,
3925                     llvm_v8i64_ty, llvm_v8f64_ty, llvm_i32_ty],
3926                    [IntrArgMemOnly]>;
3927  def int_x86_avx512_scatter_qps_512  : GCCBuiltin<"__builtin_ia32_scatterdiv16sf">,
3928          Intrinsic<[], [llvm_ptr_ty, llvm_i8_ty,
3929                     llvm_v8i64_ty, llvm_v8f32_ty, llvm_i32_ty],
3930                    [IntrArgMemOnly]>;
3931
3932
3933  def int_x86_avx512_scatter_dpq_512  : GCCBuiltin<"__builtin_ia32_scattersiv8di">,
3934          Intrinsic<[], [llvm_ptr_ty, llvm_i8_ty,
3935                         llvm_v8i32_ty, llvm_v8i64_ty, llvm_i32_ty],
3936                    [IntrArgMemOnly]>;
3937  def int_x86_avx512_scatter_dpi_512  : GCCBuiltin<"__builtin_ia32_scattersiv16si">,
3938          Intrinsic<[], [llvm_ptr_ty, llvm_i16_ty,
3939                     llvm_v16i32_ty, llvm_v16i32_ty, llvm_i32_ty],
3940                    [IntrArgMemOnly]>;
3941  def int_x86_avx512_scatter_qpq_512  : GCCBuiltin<"__builtin_ia32_scatterdiv8di">,
3942          Intrinsic<[], [llvm_ptr_ty, llvm_i8_ty,llvm_v8i64_ty, llvm_v8i64_ty,
3943                         llvm_i32_ty],
3944                    [IntrArgMemOnly]>;
3945  def int_x86_avx512_scatter_qpi_512  : GCCBuiltin<"__builtin_ia32_scatterdiv16si">,
3946          Intrinsic<[], [llvm_ptr_ty, llvm_i8_ty, llvm_v8i64_ty, llvm_v8i32_ty,
3947                         llvm_i32_ty],
3948                    [IntrArgMemOnly]>;
3949
3950  def int_x86_avx512_scatterdiv2_df :
3951       GCCBuiltin<"__builtin_ia32_scatterdiv2df">,
3952        Intrinsic<[],
3953        [llvm_ptr_ty, llvm_i8_ty, llvm_v2i64_ty, llvm_v2f64_ty, llvm_i32_ty],
3954        [IntrArgMemOnly]>;
3955
3956  def int_x86_avx512_scatterdiv2_di :
3957        GCCBuiltin<"__builtin_ia32_scatterdiv2di">,
3958          Intrinsic<[],
3959          [llvm_ptr_ty, llvm_i8_ty, llvm_v2i64_ty, llvm_v2i64_ty, llvm_i32_ty],
3960          [IntrArgMemOnly]>;
3961
3962  def int_x86_avx512_scatterdiv4_df :
3963        GCCBuiltin<"__builtin_ia32_scatterdiv4df">,
3964          Intrinsic<[],
3965          [llvm_ptr_ty, llvm_i8_ty, llvm_v4i64_ty, llvm_v4f64_ty, llvm_i32_ty],
3966          [IntrArgMemOnly]>;
3967
3968  def int_x86_avx512_scatterdiv4_di :
3969        GCCBuiltin<"__builtin_ia32_scatterdiv4di">,
3970          Intrinsic<[],
3971          [llvm_ptr_ty, llvm_i8_ty, llvm_v4i64_ty, llvm_v4i64_ty, llvm_i32_ty],
3972          [IntrArgMemOnly]>;
3973
3974  def int_x86_avx512_scatterdiv4_sf :
3975        GCCBuiltin<"__builtin_ia32_scatterdiv4sf">,
3976          Intrinsic<[],
3977          [llvm_ptr_ty, llvm_i8_ty, llvm_v2i64_ty, llvm_v4f32_ty, llvm_i32_ty],
3978          [IntrArgMemOnly]>;
3979
3980  def int_x86_avx512_scatterdiv4_si :
3981        GCCBuiltin<"__builtin_ia32_scatterdiv4si">,
3982          Intrinsic<[],
3983          [llvm_ptr_ty, llvm_i8_ty, llvm_v2i64_ty, llvm_v4i32_ty, llvm_i32_ty],
3984          [IntrArgMemOnly]>;
3985
3986  def int_x86_avx512_scatterdiv8_sf :
3987        GCCBuiltin<"__builtin_ia32_scatterdiv8sf">,
3988          Intrinsic<[],
3989          [llvm_ptr_ty, llvm_i8_ty, llvm_v4i64_ty, llvm_v4f32_ty, llvm_i32_ty],
3990          [IntrArgMemOnly]>;
3991
3992  def int_x86_avx512_scatterdiv8_si :
3993        GCCBuiltin<"__builtin_ia32_scatterdiv8si">,
3994          Intrinsic<[],
3995          [llvm_ptr_ty, llvm_i8_ty, llvm_v4i64_ty, llvm_v4i32_ty, llvm_i32_ty],
3996          [IntrArgMemOnly]>;
3997
3998  def int_x86_avx512_scattersiv2_df :
3999        GCCBuiltin<"__builtin_ia32_scattersiv2df">,
4000          Intrinsic<[],
4001          [llvm_ptr_ty, llvm_i8_ty, llvm_v4i32_ty, llvm_v2f64_ty, llvm_i32_ty],
4002          [IntrArgMemOnly]>;
4003
4004  def int_x86_avx512_scattersiv2_di :
4005        GCCBuiltin<"__builtin_ia32_scattersiv2di">,
4006          Intrinsic<[],
4007          [llvm_ptr_ty, llvm_i8_ty, llvm_v4i32_ty, llvm_v2i64_ty, llvm_i32_ty],
4008          [IntrArgMemOnly]>;
4009
4010  def int_x86_avx512_scattersiv4_df :
4011        GCCBuiltin<"__builtin_ia32_scattersiv4df">,
4012          Intrinsic<[],
4013          [llvm_ptr_ty, llvm_i8_ty, llvm_v4i32_ty, llvm_v4f64_ty, llvm_i32_ty],
4014          [IntrArgMemOnly]>;
4015
4016  def int_x86_avx512_scattersiv4_di :
4017        GCCBuiltin<"__builtin_ia32_scattersiv4di">,
4018          Intrinsic<[],
4019          [llvm_ptr_ty, llvm_i8_ty, llvm_v4i32_ty, llvm_v4i64_ty, llvm_i32_ty],
4020          [IntrArgMemOnly]>;
4021
4022  def int_x86_avx512_scattersiv4_sf :
4023        GCCBuiltin<"__builtin_ia32_scattersiv4sf">,
4024          Intrinsic<[],
4025          [llvm_ptr_ty, llvm_i8_ty, llvm_v4i32_ty, llvm_v4f32_ty, llvm_i32_ty],
4026          [IntrArgMemOnly]>;
4027
4028  def int_x86_avx512_scattersiv4_si :
4029        GCCBuiltin<"__builtin_ia32_scattersiv4si">,
4030          Intrinsic<[],
4031          [llvm_ptr_ty, llvm_i8_ty, llvm_v4i32_ty, llvm_v4i32_ty, llvm_i32_ty],
4032          [IntrArgMemOnly]>;
4033
4034  def int_x86_avx512_scattersiv8_sf :
4035        GCCBuiltin<"__builtin_ia32_scattersiv8sf">,
4036          Intrinsic<[],
4037          [llvm_ptr_ty, llvm_i8_ty, llvm_v8i32_ty, llvm_v8f32_ty, llvm_i32_ty],
4038          [IntrArgMemOnly]>;
4039
4040  def int_x86_avx512_scattersiv8_si :
4041        GCCBuiltin<"__builtin_ia32_scattersiv8si">,
4042          Intrinsic<[],
4043          [llvm_ptr_ty, llvm_i8_ty, llvm_v8i32_ty, llvm_v8i32_ty, llvm_i32_ty],
4044          [IntrArgMemOnly]>;
4045
4046  // gather prefetch
4047  def int_x86_avx512_gatherpf_dpd_512  : GCCBuiltin<"__builtin_ia32_gatherpfdpd">,
4048          Intrinsic<[], [llvm_i8_ty, llvm_v8i32_ty, llvm_ptr_ty,
4049                     llvm_i32_ty, llvm_i32_ty], [IntrArgMemOnly]>;
4050  def int_x86_avx512_gatherpf_dps_512  : GCCBuiltin<"__builtin_ia32_gatherpfdps">,
4051          Intrinsic<[], [llvm_i16_ty, llvm_v16i32_ty, llvm_ptr_ty,
4052                     llvm_i32_ty, llvm_i32_ty], [IntrArgMemOnly]>;
4053  def int_x86_avx512_gatherpf_qpd_512  : GCCBuiltin<"__builtin_ia32_gatherpfqpd">,
4054          Intrinsic<[], [llvm_i8_ty, llvm_v8i64_ty, llvm_ptr_ty,
4055                     llvm_i32_ty, llvm_i32_ty], [IntrArgMemOnly]>;
4056  def int_x86_avx512_gatherpf_qps_512  : GCCBuiltin<"__builtin_ia32_gatherpfqps">,
4057          Intrinsic<[], [llvm_i8_ty, llvm_v8i64_ty, llvm_ptr_ty,
4058                     llvm_i32_ty, llvm_i32_ty], [IntrArgMemOnly]>;
4059
4060  // scatter prefetch
4061  def int_x86_avx512_scatterpf_dpd_512  : GCCBuiltin<"__builtin_ia32_scatterpfdpd">,
4062          Intrinsic<[], [llvm_i8_ty, llvm_v8i32_ty, llvm_ptr_ty,
4063                     llvm_i32_ty, llvm_i32_ty], [IntrArgMemOnly]>;
4064  def int_x86_avx512_scatterpf_dps_512  : GCCBuiltin<"__builtin_ia32_scatterpfdps">,
4065          Intrinsic<[], [llvm_i16_ty, llvm_v16i32_ty, llvm_ptr_ty,
4066                     llvm_i32_ty, llvm_i32_ty], [IntrArgMemOnly]>;
4067  def int_x86_avx512_scatterpf_qpd_512  : GCCBuiltin<"__builtin_ia32_scatterpfqpd">,
4068          Intrinsic<[], [llvm_i8_ty, llvm_v8i64_ty, llvm_ptr_ty,
4069                     llvm_i32_ty, llvm_i32_ty], [IntrArgMemOnly]>;
4070  def int_x86_avx512_scatterpf_qps_512  : GCCBuiltin<"__builtin_ia32_scatterpfqps">,
4071          Intrinsic<[], [llvm_i8_ty, llvm_v8i64_ty, llvm_ptr_ty,
4072                     llvm_i32_ty, llvm_i32_ty], [IntrArgMemOnly]>;
4073}
4074
4075// AVX-512 conflict detection instruction
4076// Instructions that count the number of leading zero bits
4077let TargetPrefix = "x86" in {
4078  def int_x86_avx512_mask_conflict_d_128 :
4079          GCCBuiltin<"__builtin_ia32_vpconflictsi_128_mask">,
4080          Intrinsic<[llvm_v4i32_ty],
4081                    [llvm_v4i32_ty, llvm_v4i32_ty, llvm_i8_ty],
4082                    [IntrNoMem]>;
4083  def int_x86_avx512_mask_conflict_d_256 :
4084          GCCBuiltin<"__builtin_ia32_vpconflictsi_256_mask">,
4085          Intrinsic<[llvm_v8i32_ty],
4086                    [llvm_v8i32_ty, llvm_v8i32_ty, llvm_i8_ty],
4087                    [IntrNoMem]>;
4088  def int_x86_avx512_mask_conflict_d_512 :
4089          GCCBuiltin<"__builtin_ia32_vpconflictsi_512_mask">,
4090          Intrinsic<[llvm_v16i32_ty],
4091                    [llvm_v16i32_ty, llvm_v16i32_ty, llvm_i16_ty],
4092                    [IntrNoMem]>;
4093
4094  def int_x86_avx512_mask_conflict_q_128 :
4095          GCCBuiltin<"__builtin_ia32_vpconflictdi_128_mask">,
4096          Intrinsic<[llvm_v2i64_ty],
4097                    [llvm_v2i64_ty, llvm_v2i64_ty, llvm_i8_ty],
4098                    [IntrNoMem]>;
4099  def int_x86_avx512_mask_conflict_q_256 :
4100          GCCBuiltin<"__builtin_ia32_vpconflictdi_256_mask">,
4101          Intrinsic<[llvm_v4i64_ty],
4102                    [llvm_v4i64_ty, llvm_v4i64_ty, llvm_i8_ty],
4103                    [IntrNoMem]>;
4104  def int_x86_avx512_mask_conflict_q_512 :
4105          GCCBuiltin<"__builtin_ia32_vpconflictdi_512_mask">,
4106          Intrinsic<[llvm_v8i64_ty],
4107                    [llvm_v8i64_ty, llvm_v8i64_ty, llvm_i8_ty],
4108                    [IntrNoMem]>;
4109}
4110
4111// Compares
4112let TargetPrefix = "x86" in {
4113  // 512-bit
4114  def int_x86_avx512_vcomi_sd : GCCBuiltin<"__builtin_ia32_vcomisd">,
4115              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
4116                         llvm_v2f64_ty, llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
4117  def int_x86_avx512_vcomi_ss : GCCBuiltin<"__builtin_ia32_vcomiss">,
4118              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
4119                         llvm_v4f32_ty, llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
4120}
4121
4122// Compress, Expand
4123let TargetPrefix = "x86" in {
4124  def int_x86_avx512_mask_compress_ps_512 :
4125                             GCCBuiltin<"__builtin_ia32_compresssf512_mask">,
4126        Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
4127                   llvm_i16_ty], [IntrNoMem]>;
4128  def int_x86_avx512_mask_compress_pd_512 :
4129                             GCCBuiltin<"__builtin_ia32_compressdf512_mask">,
4130        Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
4131                   llvm_i8_ty], [IntrNoMem]>;
4132  def int_x86_avx512_mask_compress_ps_256 :
4133                             GCCBuiltin<"__builtin_ia32_compresssf256_mask">,
4134        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8f32_ty,
4135                   llvm_i8_ty], [IntrNoMem]>;
4136  def int_x86_avx512_mask_compress_pd_256 :
4137                             GCCBuiltin<"__builtin_ia32_compressdf256_mask">,
4138        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4f64_ty,
4139                   llvm_i8_ty], [IntrNoMem]>;
4140  def int_x86_avx512_mask_compress_ps_128 :
4141                             GCCBuiltin<"__builtin_ia32_compresssf128_mask">,
4142        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
4143                   llvm_i8_ty], [IntrNoMem]>;
4144  def int_x86_avx512_mask_compress_pd_128 :
4145                             GCCBuiltin<"__builtin_ia32_compressdf128_mask">,
4146        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
4147                   llvm_i8_ty], [IntrNoMem]>;
4148
4149  def int_x86_avx512_mask_compress_d_512 :
4150                             GCCBuiltin<"__builtin_ia32_compresssi512_mask">,
4151        Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty,
4152                   llvm_i16_ty], [IntrNoMem]>;
4153  def int_x86_avx512_mask_compress_q_512 :
4154                             GCCBuiltin<"__builtin_ia32_compressdi512_mask">,
4155        Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty,
4156                   llvm_i8_ty], [IntrNoMem]>;
4157  def int_x86_avx512_mask_compress_d_256 :
4158                             GCCBuiltin<"__builtin_ia32_compresssi256_mask">,
4159        Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty,
4160                   llvm_i8_ty], [IntrNoMem]>;
4161  def int_x86_avx512_mask_compress_q_256 :
4162                             GCCBuiltin<"__builtin_ia32_compressdi256_mask">,
4163        Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty,
4164                   llvm_i8_ty], [IntrNoMem]>;
4165  def int_x86_avx512_mask_compress_d_128 :
4166                             GCCBuiltin<"__builtin_ia32_compresssi128_mask">,
4167        Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
4168                   llvm_i8_ty], [IntrNoMem]>;
4169  def int_x86_avx512_mask_compress_q_128 :
4170                             GCCBuiltin<"__builtin_ia32_compressdi128_mask">,
4171        Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
4172                   llvm_i8_ty], [IntrNoMem]>;
4173
4174  def int_x86_avx512_mask_compress_b_512 :
4175                             GCCBuiltin<"__builtin_ia32_compressqi512_mask">,
4176        Intrinsic<[llvm_v64i8_ty], [llvm_v64i8_ty, llvm_v64i8_ty,
4177                   llvm_i64_ty], [IntrNoMem]>;
4178  def int_x86_avx512_mask_compress_w_512 :
4179                             GCCBuiltin<"__builtin_ia32_compresshi512_mask">,
4180        Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty,
4181                   llvm_i32_ty], [IntrNoMem]>;
4182  def int_x86_avx512_mask_compress_b_256 :
4183                             GCCBuiltin<"__builtin_ia32_compressqi256_mask">,
4184        Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty, llvm_v32i8_ty,
4185                   llvm_i32_ty], [IntrNoMem]>;
4186  def int_x86_avx512_mask_compress_w_256 :
4187                             GCCBuiltin<"__builtin_ia32_compresshi256_mask">,
4188        Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty,
4189                   llvm_i16_ty], [IntrNoMem]>;
4190  def int_x86_avx512_mask_compress_b_128 :
4191                             GCCBuiltin<"__builtin_ia32_compressqi128_mask">,
4192        Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
4193                   llvm_i16_ty], [IntrNoMem]>;
4194  def int_x86_avx512_mask_compress_w_128 :
4195                             GCCBuiltin<"__builtin_ia32_compresshi128_mask">,
4196        Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
4197                   llvm_i8_ty], [IntrNoMem]>;
4198
4199// expand
4200  def int_x86_avx512_mask_expand_ps_512 :
4201                             GCCBuiltin<"__builtin_ia32_expandsf512_mask">,
4202        Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
4203                   llvm_i16_ty], [IntrNoMem]>;
4204  def int_x86_avx512_mask_expand_pd_512 :
4205                             GCCBuiltin<"__builtin_ia32_expanddf512_mask">,
4206        Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
4207                   llvm_i8_ty], [IntrNoMem]>;
4208  def int_x86_avx512_mask_expand_ps_256 :
4209                             GCCBuiltin<"__builtin_ia32_expandsf256_mask">,
4210        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8f32_ty,
4211                   llvm_i8_ty], [IntrNoMem]>;
4212  def int_x86_avx512_mask_expand_pd_256 :
4213                             GCCBuiltin<"__builtin_ia32_expanddf256_mask">,
4214        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4f64_ty,
4215                   llvm_i8_ty], [IntrNoMem]>;
4216  def int_x86_avx512_mask_expand_ps_128 :
4217                             GCCBuiltin<"__builtin_ia32_expandsf128_mask">,
4218        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
4219                   llvm_i8_ty], [IntrNoMem]>;
4220  def int_x86_avx512_mask_expand_pd_128 :
4221                             GCCBuiltin<"__builtin_ia32_expanddf128_mask">,
4222        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
4223                   llvm_i8_ty], [IntrNoMem]>;
4224
4225  def int_x86_avx512_mask_expand_d_512 :
4226                             GCCBuiltin<"__builtin_ia32_expandsi512_mask">,
4227        Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty,
4228                   llvm_i16_ty], [IntrNoMem]>;
4229  def int_x86_avx512_mask_expand_q_512 :
4230                             GCCBuiltin<"__builtin_ia32_expanddi512_mask">,
4231        Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty,
4232                   llvm_i8_ty], [IntrNoMem]>;
4233  def int_x86_avx512_mask_expand_d_256 :
4234                             GCCBuiltin<"__builtin_ia32_expandsi256_mask">,
4235        Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty,
4236                   llvm_i8_ty], [IntrNoMem]>;
4237  def int_x86_avx512_mask_expand_q_256 :
4238                             GCCBuiltin<"__builtin_ia32_expanddi256_mask">,
4239        Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty,
4240                   llvm_i8_ty], [IntrNoMem]>;
4241  def int_x86_avx512_mask_expand_d_128 :
4242                             GCCBuiltin<"__builtin_ia32_expandsi128_mask">,
4243        Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
4244                   llvm_i8_ty], [IntrNoMem]>;
4245  def int_x86_avx512_mask_expand_q_128 :
4246                             GCCBuiltin<"__builtin_ia32_expanddi128_mask">,
4247        Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
4248                   llvm_i8_ty], [IntrNoMem]>;
4249
4250  def int_x86_avx512_mask_expand_b_512 :
4251                            GCCBuiltin<"__builtin_ia32_expandqi512_mask">,
4252        Intrinsic<[llvm_v64i8_ty], [llvm_v64i8_ty, llvm_v64i8_ty,
4253                   llvm_i64_ty], [IntrNoMem]>;
4254  def int_x86_avx512_mask_expand_w_512 :
4255                            GCCBuiltin<"__builtin_ia32_expandhi512_mask">,
4256        Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty,
4257                   llvm_i32_ty], [IntrNoMem]>;
4258  def int_x86_avx512_mask_expand_b_256 :
4259                            GCCBuiltin<"__builtin_ia32_expandqi256_mask">,
4260        Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty, llvm_v32i8_ty,
4261                   llvm_i32_ty], [IntrNoMem]>;
4262  def int_x86_avx512_mask_expand_w_256 :
4263                            GCCBuiltin<"__builtin_ia32_expandhi256_mask">,
4264        Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty,
4265                   llvm_i16_ty], [IntrNoMem]>;
4266  def int_x86_avx512_mask_expand_b_128 :
4267                            GCCBuiltin<"__builtin_ia32_expandqi128_mask">,
4268        Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
4269                   llvm_i16_ty], [IntrNoMem]>;
4270  def int_x86_avx512_mask_expand_w_128 :
4271                            GCCBuiltin<"__builtin_ia32_expandhi128_mask">,
4272        Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
4273                   llvm_i8_ty], [IntrNoMem]>;
4274}
4275
4276// VBMI2 Concat & Shift
4277let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
4278  def int_x86_avx512_vpshld_q_512 :
4279        GCCBuiltin<"__builtin_ia32_vpshldq512">,
4280        Intrinsic<[llvm_v8i64_ty],
4281                  [llvm_v8i64_ty, llvm_v8i64_ty, llvm_i32_ty], [IntrNoMem]>;
4282  def int_x86_avx512_vpshld_q_256 :
4283        GCCBuiltin<"__builtin_ia32_vpshldq256">,
4284        Intrinsic<[llvm_v4i64_ty],
4285                  [llvm_v4i64_ty, llvm_v4i64_ty, llvm_i32_ty], [IntrNoMem]>;
4286  def int_x86_avx512_vpshld_q_128 :
4287        GCCBuiltin<"__builtin_ia32_vpshldq128">,
4288        Intrinsic<[llvm_v2i64_ty],
4289                  [llvm_v2i64_ty, llvm_v2i64_ty, llvm_i32_ty], [IntrNoMem]>;
4290
4291  def int_x86_avx512_vpshld_d_512 :
4292        GCCBuiltin<"__builtin_ia32_vpshldd512">,
4293        Intrinsic<[llvm_v16i32_ty],
4294                  [llvm_v16i32_ty, llvm_v16i32_ty, llvm_i32_ty], [IntrNoMem]>;
4295  def int_x86_avx512_vpshld_d_256 :
4296        GCCBuiltin<"__builtin_ia32_vpshldd256">,
4297        Intrinsic<[llvm_v8i32_ty],
4298                  [llvm_v8i32_ty, llvm_v8i32_ty, llvm_i32_ty], [IntrNoMem]>;
4299  def int_x86_avx512_vpshld_d_128 :
4300        GCCBuiltin<"__builtin_ia32_vpshldd128">,
4301        Intrinsic<[llvm_v4i32_ty],
4302                  [llvm_v4i32_ty, llvm_v4i32_ty, llvm_i32_ty], [IntrNoMem]>;
4303
4304  def int_x86_avx512_vpshld_w_512 :
4305        GCCBuiltin<"__builtin_ia32_vpshldw512">,
4306        Intrinsic<[llvm_v32i16_ty],
4307                  [llvm_v32i16_ty, llvm_v32i16_ty, llvm_i32_ty], [IntrNoMem]>;
4308  def int_x86_avx512_vpshld_w_256 :
4309        GCCBuiltin<"__builtin_ia32_vpshldw256">,
4310        Intrinsic<[llvm_v16i16_ty],
4311                  [llvm_v16i16_ty, llvm_v16i16_ty, llvm_i32_ty], [IntrNoMem]>;
4312  def int_x86_avx512_vpshld_w_128 :
4313        GCCBuiltin<"__builtin_ia32_vpshldw128">,
4314        Intrinsic<[llvm_v8i16_ty],
4315                  [llvm_v8i16_ty, llvm_v8i16_ty, llvm_i32_ty], [IntrNoMem]>;
4316
4317  def int_x86_avx512_vpshrd_q_512 :
4318        GCCBuiltin<"__builtin_ia32_vpshrdq512">,
4319        Intrinsic<[llvm_v8i64_ty],
4320                  [llvm_v8i64_ty, llvm_v8i64_ty, llvm_i32_ty], [IntrNoMem]>;
4321  def int_x86_avx512_vpshrd_q_256 :
4322        GCCBuiltin<"__builtin_ia32_vpshrdq256">,
4323        Intrinsic<[llvm_v4i64_ty],
4324                  [llvm_v4i64_ty, llvm_v4i64_ty, llvm_i32_ty], [IntrNoMem]>;
4325  def int_x86_avx512_vpshrd_q_128 :
4326        GCCBuiltin<"__builtin_ia32_vpshrdq128">,
4327        Intrinsic<[llvm_v2i64_ty],
4328                  [llvm_v2i64_ty, llvm_v2i64_ty, llvm_i32_ty], [IntrNoMem]>;
4329
4330  def int_x86_avx512_vpshrd_d_512 :
4331        GCCBuiltin<"__builtin_ia32_vpshrdd512">,
4332        Intrinsic<[llvm_v16i32_ty],
4333                  [llvm_v16i32_ty, llvm_v16i32_ty, llvm_i32_ty], [IntrNoMem]>;
4334  def int_x86_avx512_vpshrd_d_256 :
4335        GCCBuiltin<"__builtin_ia32_vpshrdd256">,
4336        Intrinsic<[llvm_v8i32_ty],
4337                  [llvm_v8i32_ty, llvm_v8i32_ty, llvm_i32_ty], [IntrNoMem]>;
4338  def int_x86_avx512_vpshrd_d_128 :
4339        GCCBuiltin<"__builtin_ia32_vpshrdd128">,
4340        Intrinsic<[llvm_v4i32_ty],
4341                  [llvm_v4i32_ty, llvm_v4i32_ty, llvm_i32_ty], [IntrNoMem]>;
4342
4343  def int_x86_avx512_vpshrd_w_512 :
4344        GCCBuiltin<"__builtin_ia32_vpshrdw512">,
4345        Intrinsic<[llvm_v32i16_ty],
4346                  [llvm_v32i16_ty, llvm_v32i16_ty, llvm_i32_ty], [IntrNoMem]>;
4347  def int_x86_avx512_vpshrd_w_256 :
4348        GCCBuiltin<"__builtin_ia32_vpshrdw256">,
4349        Intrinsic<[llvm_v16i16_ty],
4350                  [llvm_v16i16_ty, llvm_v16i16_ty, llvm_i32_ty], [IntrNoMem]>;
4351  def int_x86_avx512_vpshrd_w_128 :
4352        GCCBuiltin<"__builtin_ia32_vpshrdw128">,
4353        Intrinsic<[llvm_v8i16_ty],
4354                  [llvm_v8i16_ty, llvm_v8i16_ty, llvm_i32_ty], [IntrNoMem]>;
4355
4356  def int_x86_avx512_mask_vpshldv_w_128 :
4357        GCCBuiltin<"__builtin_ia32_vpshldvw128_mask">,
4358        Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
4359                   llvm_v8i16_ty, llvm_i8_ty], [IntrNoMem]>;
4360  def int_x86_avx512_maskz_vpshldv_w_128 :
4361        GCCBuiltin<"__builtin_ia32_vpshldvw128_maskz">,
4362        Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
4363                   llvm_v8i16_ty, llvm_i8_ty], [IntrNoMem]>;
4364  def int_x86_avx512_mask_vpshldv_w_256 :
4365        GCCBuiltin<"__builtin_ia32_vpshldvw256_mask">,
4366        Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty,
4367                   llvm_v16i16_ty, llvm_i16_ty], [IntrNoMem]>;
4368  def int_x86_avx512_maskz_vpshldv_w_256 :
4369        GCCBuiltin<"__builtin_ia32_vpshldvw256_maskz">,
4370        Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty,
4371                   llvm_v16i16_ty, llvm_i16_ty], [IntrNoMem]>;
4372  def int_x86_avx512_mask_vpshldv_w_512 :
4373        GCCBuiltin<"__builtin_ia32_vpshldvw512_mask">,
4374        Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty,
4375                   llvm_v32i16_ty, llvm_i32_ty], [IntrNoMem]>;
4376  def int_x86_avx512_maskz_vpshldv_w_512 :
4377        GCCBuiltin<"__builtin_ia32_vpshldvw512_maskz">,
4378        Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty,
4379                   llvm_v32i16_ty, llvm_i32_ty], [IntrNoMem]>;
4380
4381  def int_x86_avx512_mask_vpshldv_q_128 :
4382        GCCBuiltin<"__builtin_ia32_vpshldvq128_mask">,
4383        Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
4384                   llvm_v2i64_ty, llvm_i8_ty], [IntrNoMem]>;
4385  def int_x86_avx512_maskz_vpshldv_q_128 :
4386        GCCBuiltin<"__builtin_ia32_vpshldvq128_maskz">,
4387        Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
4388                   llvm_v2i64_ty, llvm_i8_ty], [IntrNoMem]>;
4389  def int_x86_avx512_mask_vpshldv_q_256 :
4390        GCCBuiltin<"__builtin_ia32_vpshldvq256_mask">,
4391        Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty,
4392                   llvm_v4i64_ty, llvm_i8_ty], [IntrNoMem]>;
4393  def int_x86_avx512_maskz_vpshldv_q_256 :
4394        GCCBuiltin<"__builtin_ia32_vpshldvq256_maskz">,
4395        Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty,
4396                   llvm_v4i64_ty, llvm_i8_ty], [IntrNoMem]>;
4397  def int_x86_avx512_mask_vpshldv_q_512 :
4398        GCCBuiltin<"__builtin_ia32_vpshldvq512_mask">,
4399        Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty,
4400                   llvm_v8i64_ty, llvm_i8_ty], [IntrNoMem]>;
4401  def int_x86_avx512_maskz_vpshldv_q_512 :
4402        GCCBuiltin<"__builtin_ia32_vpshldvq512_maskz">,
4403        Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty,
4404                   llvm_v8i64_ty, llvm_i8_ty], [IntrNoMem]>;
4405
4406  def int_x86_avx512_mask_vpshldv_d_128 :
4407        GCCBuiltin<"__builtin_ia32_vpshldvd128_mask">,
4408        Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
4409                   llvm_v4i32_ty, llvm_i8_ty], [IntrNoMem]>;
4410  def int_x86_avx512_maskz_vpshldv_d_128 :
4411        GCCBuiltin<"__builtin_ia32_vpshldvd128_maskz">,
4412        Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
4413                   llvm_v4i32_ty, llvm_i8_ty], [IntrNoMem]>;
4414  def int_x86_avx512_mask_vpshldv_d_256 :
4415        GCCBuiltin<"__builtin_ia32_vpshldvd256_mask">,
4416        Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty,
4417                   llvm_v8i32_ty, llvm_i8_ty], [IntrNoMem]>;
4418  def int_x86_avx512_maskz_vpshldv_d_256 :
4419        GCCBuiltin<"__builtin_ia32_vpshldvd256_maskz">,
4420        Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty,
4421                   llvm_v8i32_ty, llvm_i8_ty], [IntrNoMem]>;
4422  def int_x86_avx512_mask_vpshldv_d_512 :
4423        GCCBuiltin<"__builtin_ia32_vpshldvd512_mask">,
4424        Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty,
4425                   llvm_v16i32_ty, llvm_i16_ty], [IntrNoMem]>;
4426  def int_x86_avx512_maskz_vpshldv_d_512 :
4427        GCCBuiltin<"__builtin_ia32_vpshldvd512_maskz">,
4428        Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty,
4429                   llvm_v16i32_ty, llvm_i16_ty], [IntrNoMem]>;
4430
4431  def int_x86_avx512_mask_vpshrdv_w_128 :
4432        GCCBuiltin<"__builtin_ia32_vpshrdvw128_mask">,
4433        Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
4434                   llvm_v8i16_ty, llvm_i8_ty], [IntrNoMem]>;
4435  def int_x86_avx512_maskz_vpshrdv_w_128 :
4436        GCCBuiltin<"__builtin_ia32_vpshrdvw128_maskz">,
4437        Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
4438                   llvm_v8i16_ty, llvm_i8_ty], [IntrNoMem]>;
4439  def int_x86_avx512_mask_vpshrdv_w_256 :
4440        GCCBuiltin<"__builtin_ia32_vpshrdvw256_mask">,
4441        Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty,
4442                   llvm_v16i16_ty, llvm_i16_ty], [IntrNoMem]>;
4443  def int_x86_avx512_maskz_vpshrdv_w_256 :
4444        GCCBuiltin<"__builtin_ia32_vpshrdvw256_maskz">,
4445        Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty,
4446                   llvm_v16i16_ty, llvm_i16_ty], [IntrNoMem]>;
4447  def int_x86_avx512_mask_vpshrdv_w_512 :
4448        GCCBuiltin<"__builtin_ia32_vpshrdvw512_mask">,
4449        Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty,
4450                   llvm_v32i16_ty, llvm_i32_ty], [IntrNoMem]>;
4451  def int_x86_avx512_maskz_vpshrdv_w_512 :
4452        GCCBuiltin<"__builtin_ia32_vpshrdvw512_maskz">,
4453        Intrinsic<[llvm_v32i16_ty], [llvm_v32i16_ty, llvm_v32i16_ty,
4454                   llvm_v32i16_ty, llvm_i32_ty], [IntrNoMem]>;
4455
4456  def int_x86_avx512_mask_vpshrdv_q_128 :
4457        GCCBuiltin<"__builtin_ia32_vpshrdvq128_mask">,
4458        Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
4459                   llvm_v2i64_ty, llvm_i8_ty], [IntrNoMem]>;
4460  def int_x86_avx512_maskz_vpshrdv_q_128 :
4461        GCCBuiltin<"__builtin_ia32_vpshrdvq128_maskz">,
4462        Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
4463                   llvm_v2i64_ty, llvm_i8_ty], [IntrNoMem]>;
4464  def int_x86_avx512_mask_vpshrdv_q_256 :
4465        GCCBuiltin<"__builtin_ia32_vpshrdvq256_mask">,
4466        Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty,
4467                   llvm_v4i64_ty, llvm_i8_ty], [IntrNoMem]>;
4468  def int_x86_avx512_maskz_vpshrdv_q_256 :
4469        GCCBuiltin<"__builtin_ia32_vpshrdvq256_maskz">,
4470        Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty,
4471                   llvm_v4i64_ty, llvm_i8_ty], [IntrNoMem]>;
4472  def int_x86_avx512_mask_vpshrdv_q_512 :
4473        GCCBuiltin<"__builtin_ia32_vpshrdvq512_mask">,
4474        Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty,
4475                   llvm_v8i64_ty, llvm_i8_ty], [IntrNoMem]>;
4476  def int_x86_avx512_maskz_vpshrdv_q_512 :
4477        GCCBuiltin<"__builtin_ia32_vpshrdvq512_maskz">,
4478        Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_v8i64_ty,
4479                   llvm_v8i64_ty, llvm_i8_ty], [IntrNoMem]>;
4480
4481  def int_x86_avx512_mask_vpshrdv_d_128 :
4482        GCCBuiltin<"__builtin_ia32_vpshrdvd128_mask">,
4483        Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
4484                   llvm_v4i32_ty, llvm_i8_ty], [IntrNoMem]>;
4485  def int_x86_avx512_maskz_vpshrdv_d_128 :
4486        GCCBuiltin<"__builtin_ia32_vpshrdvd128_maskz">,
4487        Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
4488                   llvm_v4i32_ty, llvm_i8_ty], [IntrNoMem]>;
4489  def int_x86_avx512_mask_vpshrdv_d_256 :
4490        GCCBuiltin<"__builtin_ia32_vpshrdvd256_mask">,
4491        Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty,
4492                   llvm_v8i32_ty, llvm_i8_ty], [IntrNoMem]>;
4493  def int_x86_avx512_maskz_vpshrdv_d_256 :
4494        GCCBuiltin<"__builtin_ia32_vpshrdvd256_maskz">,
4495        Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty,
4496                   llvm_v8i32_ty, llvm_i8_ty], [IntrNoMem]>;
4497  def int_x86_avx512_mask_vpshrdv_d_512 :
4498        GCCBuiltin<"__builtin_ia32_vpshrdvd512_mask">,
4499        Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty,
4500                   llvm_v16i32_ty, llvm_i16_ty], [IntrNoMem]>;
4501  def int_x86_avx512_maskz_vpshrdv_d_512 :
4502        GCCBuiltin<"__builtin_ia32_vpshrdvd512_maskz">,
4503        Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty,
4504                   llvm_v16i32_ty, llvm_i16_ty], [IntrNoMem]>;
4505}
4506
4507// truncate
4508let TargetPrefix = "x86" in {
4509  def int_x86_avx512_mask_pmov_qb_128 :
4510          GCCBuiltin<"__builtin_ia32_pmovqb128_mask">,
4511          Intrinsic<[llvm_v16i8_ty],
4512                    [llvm_v2i64_ty, llvm_v16i8_ty, llvm_i8_ty],
4513                    [IntrNoMem]>;
4514  def int_x86_avx512_mask_pmov_qb_mem_128 :
4515          GCCBuiltin<"__builtin_ia32_pmovqb128mem_mask">,
4516          Intrinsic<[],
4517                    [llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty],
4518                    [IntrArgMemOnly]>;
4519  def int_x86_avx512_mask_pmovs_qb_128 :
4520          GCCBuiltin<"__builtin_ia32_pmovsqb128_mask">,
4521          Intrinsic<[llvm_v16i8_ty],
4522                    [llvm_v2i64_ty, llvm_v16i8_ty, llvm_i8_ty],
4523                    [IntrNoMem]>;
4524  def int_x86_avx512_mask_pmovs_qb_mem_128 :
4525          GCCBuiltin<"__builtin_ia32_pmovsqb128mem_mask">,
4526          Intrinsic<[],
4527                    [llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty],
4528                    [IntrArgMemOnly]>;
4529  def int_x86_avx512_mask_pmovus_qb_128 :
4530          GCCBuiltin<"__builtin_ia32_pmovusqb128_mask">,
4531          Intrinsic<[llvm_v16i8_ty],
4532                    [llvm_v2i64_ty, llvm_v16i8_ty, llvm_i8_ty],
4533                    [IntrNoMem]>;
4534  def int_x86_avx512_mask_pmovus_qb_mem_128 :
4535          GCCBuiltin<"__builtin_ia32_pmovusqb128mem_mask">,
4536          Intrinsic<[],
4537                    [llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty],
4538                    [IntrArgMemOnly]>;
4539  def int_x86_avx512_mask_pmov_qb_256 :
4540          GCCBuiltin<"__builtin_ia32_pmovqb256_mask">,
4541          Intrinsic<[llvm_v16i8_ty],
4542                    [llvm_v4i64_ty, llvm_v16i8_ty, llvm_i8_ty],
4543                    [IntrNoMem]>;
4544  def int_x86_avx512_mask_pmov_qb_mem_256 :
4545          GCCBuiltin<"__builtin_ia32_pmovqb256mem_mask">,
4546          Intrinsic<[],
4547                    [llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty],
4548                    [IntrArgMemOnly]>;
4549  def int_x86_avx512_mask_pmovs_qb_256 :
4550          GCCBuiltin<"__builtin_ia32_pmovsqb256_mask">,
4551          Intrinsic<[llvm_v16i8_ty],
4552                    [llvm_v4i64_ty, llvm_v16i8_ty, llvm_i8_ty],
4553                    [IntrNoMem]>;
4554  def int_x86_avx512_mask_pmovs_qb_mem_256 :
4555          GCCBuiltin<"__builtin_ia32_pmovsqb256mem_mask">,
4556          Intrinsic<[],
4557                    [llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty],
4558                    [IntrArgMemOnly]>;
4559  def int_x86_avx512_mask_pmovus_qb_256 :
4560          GCCBuiltin<"__builtin_ia32_pmovusqb256_mask">,
4561          Intrinsic<[llvm_v16i8_ty],
4562                    [llvm_v4i64_ty, llvm_v16i8_ty, llvm_i8_ty],
4563                    [IntrNoMem]>;
4564  def int_x86_avx512_mask_pmovus_qb_mem_256 :
4565          GCCBuiltin<"__builtin_ia32_pmovusqb256mem_mask">,
4566          Intrinsic<[],
4567                    [llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty],
4568                    [IntrArgMemOnly]>;
4569  def int_x86_avx512_mask_pmov_qb_512 :
4570          GCCBuiltin<"__builtin_ia32_pmovqb512_mask">,
4571          Intrinsic<[llvm_v16i8_ty],
4572                    [llvm_v8i64_ty, llvm_v16i8_ty, llvm_i8_ty],
4573                    [IntrNoMem]>;
4574  def int_x86_avx512_mask_pmov_qb_mem_512 :
4575          GCCBuiltin<"__builtin_ia32_pmovqb512mem_mask">,
4576          Intrinsic<[],
4577                    [llvm_ptr_ty, llvm_v8i64_ty, llvm_i8_ty],
4578                    [IntrArgMemOnly]>;
4579  def int_x86_avx512_mask_pmovs_qb_512 :
4580          GCCBuiltin<"__builtin_ia32_pmovsqb512_mask">,
4581          Intrinsic<[llvm_v16i8_ty],
4582                    [llvm_v8i64_ty, llvm_v16i8_ty, llvm_i8_ty],
4583                    [IntrNoMem]>;
4584  def int_x86_avx512_mask_pmovs_qb_mem_512 :
4585          GCCBuiltin<"__builtin_ia32_pmovsqb512mem_mask">,
4586          Intrinsic<[],
4587                    [llvm_ptr_ty, llvm_v8i64_ty, llvm_i8_ty],
4588                    [IntrArgMemOnly]>;
4589  def int_x86_avx512_mask_pmovus_qb_512 :
4590          GCCBuiltin<"__builtin_ia32_pmovusqb512_mask">,
4591          Intrinsic<[llvm_v16i8_ty],
4592                    [llvm_v8i64_ty, llvm_v16i8_ty, llvm_i8_ty],
4593                    [IntrNoMem]>;
4594  def int_x86_avx512_mask_pmovus_qb_mem_512 :
4595          GCCBuiltin<"__builtin_ia32_pmovusqb512mem_mask">,
4596          Intrinsic<[],
4597                    [llvm_ptr_ty, llvm_v8i64_ty, llvm_i8_ty],
4598                    [IntrArgMemOnly]>;
4599  def int_x86_avx512_mask_pmov_qw_128 :
4600          GCCBuiltin<"__builtin_ia32_pmovqw128_mask">,
4601          Intrinsic<[llvm_v8i16_ty],
4602                    [llvm_v2i64_ty, llvm_v8i16_ty, llvm_i8_ty],
4603                    [IntrNoMem]>;
4604  def int_x86_avx512_mask_pmov_qw_mem_128 :
4605          GCCBuiltin<"__builtin_ia32_pmovqw128mem_mask">,
4606          Intrinsic<[],
4607                    [llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty],
4608                    [IntrArgMemOnly]>;
4609  def int_x86_avx512_mask_pmovs_qw_128 :
4610          GCCBuiltin<"__builtin_ia32_pmovsqw128_mask">,
4611          Intrinsic<[llvm_v8i16_ty],
4612                    [llvm_v2i64_ty, llvm_v8i16_ty, llvm_i8_ty],
4613                    [IntrNoMem]>;
4614  def int_x86_avx512_mask_pmovs_qw_mem_128 :
4615          GCCBuiltin<"__builtin_ia32_pmovsqw128mem_mask">,
4616          Intrinsic<[],
4617                    [llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty],
4618                    [IntrArgMemOnly]>;
4619  def int_x86_avx512_mask_pmovus_qw_128 :
4620          GCCBuiltin<"__builtin_ia32_pmovusqw128_mask">,
4621          Intrinsic<[llvm_v8i16_ty],
4622                    [llvm_v2i64_ty, llvm_v8i16_ty, llvm_i8_ty],
4623                    [IntrNoMem]>;
4624  def int_x86_avx512_mask_pmovus_qw_mem_128 :
4625          GCCBuiltin<"__builtin_ia32_pmovusqw128mem_mask">,
4626          Intrinsic<[],
4627                    [llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty],
4628                    [IntrArgMemOnly]>;
4629  def int_x86_avx512_mask_pmov_qw_256 :
4630          GCCBuiltin<"__builtin_ia32_pmovqw256_mask">,
4631          Intrinsic<[llvm_v8i16_ty],
4632                    [llvm_v4i64_ty, llvm_v8i16_ty, llvm_i8_ty],
4633                    [IntrNoMem]>;
4634  def int_x86_avx512_mask_pmov_qw_mem_256 :
4635          GCCBuiltin<"__builtin_ia32_pmovqw256mem_mask">,
4636          Intrinsic<[],
4637                    [llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty],
4638                    [IntrArgMemOnly]>;
4639  def int_x86_avx512_mask_pmovs_qw_256 :
4640          GCCBuiltin<"__builtin_ia32_pmovsqw256_mask">,
4641          Intrinsic<[llvm_v8i16_ty],
4642                    [llvm_v4i64_ty, llvm_v8i16_ty, llvm_i8_ty],
4643                    [IntrNoMem]>;
4644  def int_x86_avx512_mask_pmovs_qw_mem_256 :
4645          GCCBuiltin<"__builtin_ia32_pmovsqw256mem_mask">,
4646          Intrinsic<[],
4647                    [llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty],
4648                    [IntrArgMemOnly]>;
4649  def int_x86_avx512_mask_pmovus_qw_256 :
4650          GCCBuiltin<"__builtin_ia32_pmovusqw256_mask">,
4651          Intrinsic<[llvm_v8i16_ty],
4652                    [llvm_v4i64_ty, llvm_v8i16_ty, llvm_i8_ty],
4653                    [IntrNoMem]>;
4654  def int_x86_avx512_mask_pmovus_qw_mem_256 :
4655          GCCBuiltin<"__builtin_ia32_pmovusqw256mem_mask">,
4656          Intrinsic<[],
4657                    [llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty],
4658                    [IntrArgMemOnly]>;
4659  def int_x86_avx512_mask_pmov_qw_512 :
4660          Intrinsic<[llvm_v8i16_ty],
4661                    [llvm_v8i64_ty, llvm_v8i16_ty, llvm_i8_ty],
4662                    [IntrNoMem]>;
4663  def int_x86_avx512_mask_pmov_qw_mem_512 :
4664          GCCBuiltin<"__builtin_ia32_pmovqw512mem_mask">,
4665          Intrinsic<[],
4666                    [llvm_ptr_ty, llvm_v8i64_ty, llvm_i8_ty],
4667                    [IntrArgMemOnly]>;
4668  def int_x86_avx512_mask_pmovs_qw_512 :
4669          GCCBuiltin<"__builtin_ia32_pmovsqw512_mask">,
4670          Intrinsic<[llvm_v8i16_ty],
4671                    [llvm_v8i64_ty, llvm_v8i16_ty, llvm_i8_ty],
4672                    [IntrNoMem]>;
4673  def int_x86_avx512_mask_pmovs_qw_mem_512 :
4674          GCCBuiltin<"__builtin_ia32_pmovsqw512mem_mask">,
4675          Intrinsic<[],
4676                    [llvm_ptr_ty, llvm_v8i64_ty, llvm_i8_ty],
4677                    [IntrArgMemOnly]>;
4678  def int_x86_avx512_mask_pmovus_qw_512 :
4679          GCCBuiltin<"__builtin_ia32_pmovusqw512_mask">,
4680          Intrinsic<[llvm_v8i16_ty],
4681                    [llvm_v8i64_ty, llvm_v8i16_ty, llvm_i8_ty],
4682                    [IntrNoMem]>;
4683  def int_x86_avx512_mask_pmovus_qw_mem_512 :
4684          GCCBuiltin<"__builtin_ia32_pmovusqw512mem_mask">,
4685          Intrinsic<[],
4686                    [llvm_ptr_ty, llvm_v8i64_ty, llvm_i8_ty],
4687                    [IntrArgMemOnly]>;
4688  def int_x86_avx512_mask_pmov_qd_128 :
4689          GCCBuiltin<"__builtin_ia32_pmovqd128_mask">,
4690          Intrinsic<[llvm_v4i32_ty],
4691                    [llvm_v2i64_ty, llvm_v4i32_ty, llvm_i8_ty],
4692                    [IntrNoMem]>;
4693  def int_x86_avx512_mask_pmov_qd_mem_128 :
4694          GCCBuiltin<"__builtin_ia32_pmovqd128mem_mask">,
4695          Intrinsic<[],
4696                    [llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty],
4697                    [IntrArgMemOnly]>;
4698  def int_x86_avx512_mask_pmovs_qd_128 :
4699          GCCBuiltin<"__builtin_ia32_pmovsqd128_mask">,
4700          Intrinsic<[llvm_v4i32_ty],
4701                    [llvm_v2i64_ty, llvm_v4i32_ty, llvm_i8_ty],
4702                    [IntrNoMem]>;
4703  def int_x86_avx512_mask_pmovs_qd_mem_128 :
4704          GCCBuiltin<"__builtin_ia32_pmovsqd128mem_mask">,
4705          Intrinsic<[],
4706                    [llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty],
4707                    [IntrArgMemOnly]>;
4708  def int_x86_avx512_mask_pmovus_qd_128 :
4709          GCCBuiltin<"__builtin_ia32_pmovusqd128_mask">,
4710          Intrinsic<[llvm_v4i32_ty],
4711                    [llvm_v2i64_ty, llvm_v4i32_ty, llvm_i8_ty],
4712                    [IntrNoMem]>;
4713  def int_x86_avx512_mask_pmovus_qd_mem_128 :
4714          GCCBuiltin<"__builtin_ia32_pmovusqd128mem_mask">,
4715          Intrinsic<[],
4716                    [llvm_ptr_ty, llvm_v2i64_ty, llvm_i8_ty],
4717                    [IntrArgMemOnly]>;
4718  def int_x86_avx512_mask_pmov_qd_256 : // FIXME: Replace with trunc+select.
4719          Intrinsic<[llvm_v4i32_ty],
4720                    [llvm_v4i64_ty, llvm_v4i32_ty, llvm_i8_ty],
4721                    [IntrNoMem]>;
4722  def int_x86_avx512_mask_pmov_qd_mem_256 :
4723          GCCBuiltin<"__builtin_ia32_pmovqd256mem_mask">,
4724          Intrinsic<[],
4725                    [llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty],
4726                    [IntrArgMemOnly]>;
4727  def int_x86_avx512_mask_pmovs_qd_256 :
4728          GCCBuiltin<"__builtin_ia32_pmovsqd256_mask">,
4729          Intrinsic<[llvm_v4i32_ty],
4730                    [llvm_v4i64_ty, llvm_v4i32_ty, llvm_i8_ty],
4731                    [IntrNoMem]>;
4732  def int_x86_avx512_mask_pmovs_qd_mem_256 :
4733          GCCBuiltin<"__builtin_ia32_pmovsqd256mem_mask">,
4734          Intrinsic<[],
4735                    [llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty],
4736                    [IntrArgMemOnly]>;
4737  def int_x86_avx512_mask_pmovus_qd_256 :
4738          GCCBuiltin<"__builtin_ia32_pmovusqd256_mask">,
4739          Intrinsic<[llvm_v4i32_ty],
4740                    [llvm_v4i64_ty, llvm_v4i32_ty, llvm_i8_ty],
4741                    [IntrNoMem]>;
4742  def int_x86_avx512_mask_pmovus_qd_mem_256 :
4743          GCCBuiltin<"__builtin_ia32_pmovusqd256mem_mask">,
4744          Intrinsic<[],
4745                    [llvm_ptr_ty, llvm_v4i64_ty, llvm_i8_ty],
4746                    [IntrArgMemOnly]>;
4747  def int_x86_avx512_mask_pmov_qd_512 : // FIXME: Replace with trunc+select.
4748          Intrinsic<[llvm_v8i32_ty],
4749                    [llvm_v8i64_ty, llvm_v8i32_ty, llvm_i8_ty],
4750                    [IntrNoMem]>;
4751  def int_x86_avx512_mask_pmov_qd_mem_512 :
4752          GCCBuiltin<"__builtin_ia32_pmovqd512mem_mask">,
4753          Intrinsic<[],
4754                    [llvm_ptr_ty, llvm_v8i64_ty, llvm_i8_ty],
4755                    [IntrArgMemOnly]>;
4756  def int_x86_avx512_mask_pmovs_qd_512 :
4757          GCCBuiltin<"__builtin_ia32_pmovsqd512_mask">,
4758          Intrinsic<[llvm_v8i32_ty],
4759                    [llvm_v8i64_ty, llvm_v8i32_ty, llvm_i8_ty],
4760                    [IntrNoMem]>;
4761  def int_x86_avx512_mask_pmovs_qd_mem_512 :
4762          GCCBuiltin<"__builtin_ia32_pmovsqd512mem_mask">,
4763          Intrinsic<[],
4764                    [llvm_ptr_ty, llvm_v8i64_ty, llvm_i8_ty],
4765                    [IntrArgMemOnly]>;
4766  def int_x86_avx512_mask_pmovus_qd_512 :
4767          GCCBuiltin<"__builtin_ia32_pmovusqd512_mask">,
4768          Intrinsic<[llvm_v8i32_ty],
4769                    [llvm_v8i64_ty, llvm_v8i32_ty, llvm_i8_ty],
4770                    [IntrNoMem]>;
4771  def int_x86_avx512_mask_pmovus_qd_mem_512 :
4772          GCCBuiltin<"__builtin_ia32_pmovusqd512mem_mask">,
4773          Intrinsic<[],
4774                    [llvm_ptr_ty, llvm_v8i64_ty, llvm_i8_ty],
4775                    [IntrArgMemOnly]>;
4776  def int_x86_avx512_mask_pmov_db_128 :
4777          GCCBuiltin<"__builtin_ia32_pmovdb128_mask">,
4778          Intrinsic<[llvm_v16i8_ty],
4779                    [llvm_v4i32_ty, llvm_v16i8_ty, llvm_i8_ty],
4780                    [IntrNoMem]>;
4781  def int_x86_avx512_mask_pmov_db_mem_128 :
4782          GCCBuiltin<"__builtin_ia32_pmovdb128mem_mask">,
4783          Intrinsic<[],
4784                    [llvm_ptr_ty, llvm_v4i32_ty, llvm_i8_ty],
4785                    [IntrArgMemOnly]>;
4786  def int_x86_avx512_mask_pmovs_db_128 :
4787          GCCBuiltin<"__builtin_ia32_pmovsdb128_mask">,
4788          Intrinsic<[llvm_v16i8_ty],
4789                    [llvm_v4i32_ty, llvm_v16i8_ty, llvm_i8_ty],
4790                    [IntrNoMem]>;
4791  def int_x86_avx512_mask_pmovs_db_mem_128 :
4792          GCCBuiltin<"__builtin_ia32_pmovsdb128mem_mask">,
4793          Intrinsic<[],
4794                    [llvm_ptr_ty, llvm_v4i32_ty, llvm_i8_ty],
4795                    [IntrArgMemOnly]>;
4796  def int_x86_avx512_mask_pmovus_db_128 :
4797          GCCBuiltin<"__builtin_ia32_pmovusdb128_mask">,
4798          Intrinsic<[llvm_v16i8_ty],
4799                    [llvm_v4i32_ty, llvm_v16i8_ty, llvm_i8_ty],
4800                    [IntrNoMem]>;
4801  def int_x86_avx512_mask_pmovus_db_mem_128 :
4802          GCCBuiltin<"__builtin_ia32_pmovusdb128mem_mask">,
4803          Intrinsic<[],
4804                    [llvm_ptr_ty, llvm_v4i32_ty, llvm_i8_ty],
4805                    [IntrArgMemOnly]>;
4806  def int_x86_avx512_mask_pmov_db_256 :
4807          GCCBuiltin<"__builtin_ia32_pmovdb256_mask">,
4808          Intrinsic<[llvm_v16i8_ty],
4809                    [llvm_v8i32_ty, llvm_v16i8_ty, llvm_i8_ty],
4810                    [IntrNoMem]>;
4811  def int_x86_avx512_mask_pmov_db_mem_256 :
4812          GCCBuiltin<"__builtin_ia32_pmovdb256mem_mask">,
4813          Intrinsic<[],
4814                    [llvm_ptr_ty, llvm_v8i32_ty, llvm_i8_ty],
4815                    [IntrArgMemOnly]>;
4816  def int_x86_avx512_mask_pmovs_db_256 :
4817          GCCBuiltin<"__builtin_ia32_pmovsdb256_mask">,
4818          Intrinsic<[llvm_v16i8_ty],
4819                    [llvm_v8i32_ty, llvm_v16i8_ty, llvm_i8_ty],
4820                    [IntrNoMem]>;
4821  def int_x86_avx512_mask_pmovs_db_mem_256 :
4822          GCCBuiltin<"__builtin_ia32_pmovsdb256mem_mask">,
4823          Intrinsic<[],
4824                    [llvm_ptr_ty, llvm_v8i32_ty, llvm_i8_ty],
4825                    [IntrArgMemOnly]>;
4826  def int_x86_avx512_mask_pmovus_db_256 :
4827          GCCBuiltin<"__builtin_ia32_pmovusdb256_mask">,
4828          Intrinsic<[llvm_v16i8_ty],
4829                    [llvm_v8i32_ty, llvm_v16i8_ty, llvm_i8_ty],
4830                    [IntrNoMem]>;
4831  def int_x86_avx512_mask_pmovus_db_mem_256 :
4832          GCCBuiltin<"__builtin_ia32_pmovusdb256mem_mask">,
4833          Intrinsic<[],
4834                    [llvm_ptr_ty, llvm_v8i32_ty, llvm_i8_ty],
4835                    [IntrArgMemOnly]>;
4836  def int_x86_avx512_mask_pmov_db_512 :
4837          Intrinsic<[llvm_v16i8_ty],
4838                    [llvm_v16i32_ty, llvm_v16i8_ty, llvm_i16_ty],
4839                    [IntrNoMem]>;
4840  def int_x86_avx512_mask_pmov_db_mem_512 :
4841          GCCBuiltin<"__builtin_ia32_pmovdb512mem_mask">,
4842          Intrinsic<[],
4843                    [llvm_ptr_ty, llvm_v16i32_ty, llvm_i16_ty],
4844                    [IntrArgMemOnly]>;
4845  def int_x86_avx512_mask_pmovs_db_512 :
4846          GCCBuiltin<"__builtin_ia32_pmovsdb512_mask">,
4847          Intrinsic<[llvm_v16i8_ty],
4848                    [llvm_v16i32_ty, llvm_v16i8_ty, llvm_i16_ty],
4849                    [IntrNoMem]>;
4850  def int_x86_avx512_mask_pmovs_db_mem_512 :
4851          GCCBuiltin<"__builtin_ia32_pmovsdb512mem_mask">,
4852          Intrinsic<[],
4853                    [llvm_ptr_ty, llvm_v16i32_ty, llvm_i16_ty],
4854                    [IntrArgMemOnly]>;
4855  def int_x86_avx512_mask_pmovus_db_512 :
4856          GCCBuiltin<"__builtin_ia32_pmovusdb512_mask">,
4857          Intrinsic<[llvm_v16i8_ty],
4858                    [llvm_v16i32_ty, llvm_v16i8_ty, llvm_i16_ty],
4859                    [IntrNoMem]>;
4860  def int_x86_avx512_mask_pmovus_db_mem_512 :
4861          GCCBuiltin<"__builtin_ia32_pmovusdb512mem_mask">,
4862          Intrinsic<[],
4863                    [llvm_ptr_ty, llvm_v16i32_ty, llvm_i16_ty],
4864                    [IntrArgMemOnly]>;
4865  def int_x86_avx512_mask_pmov_dw_128 :
4866          GCCBuiltin<"__builtin_ia32_pmovdw128_mask">,
4867          Intrinsic<[llvm_v8i16_ty],
4868                    [llvm_v4i32_ty, llvm_v8i16_ty, llvm_i8_ty],
4869                    [IntrNoMem]>;
4870  def int_x86_avx512_mask_pmov_dw_mem_128 :
4871          GCCBuiltin<"__builtin_ia32_pmovdw128mem_mask">,
4872          Intrinsic<[],
4873                    [llvm_ptr_ty, llvm_v4i32_ty, llvm_i8_ty],
4874                    [IntrArgMemOnly]>;
4875  def int_x86_avx512_mask_pmovs_dw_128 :
4876          GCCBuiltin<"__builtin_ia32_pmovsdw128_mask">,
4877          Intrinsic<[llvm_v8i16_ty],
4878                    [llvm_v4i32_ty, llvm_v8i16_ty, llvm_i8_ty],
4879                    [IntrNoMem]>;
4880  def int_x86_avx512_mask_pmovs_dw_mem_128 :
4881          GCCBuiltin<"__builtin_ia32_pmovsdw128mem_mask">,
4882          Intrinsic<[],
4883                    [llvm_ptr_ty, llvm_v4i32_ty, llvm_i8_ty],
4884                    [IntrArgMemOnly]>;
4885  def int_x86_avx512_mask_pmovus_dw_128 :
4886          GCCBuiltin<"__builtin_ia32_pmovusdw128_mask">,
4887          Intrinsic<[llvm_v8i16_ty],
4888                    [llvm_v4i32_ty, llvm_v8i16_ty, llvm_i8_ty],
4889                    [IntrNoMem]>;
4890  def int_x86_avx512_mask_pmovus_dw_mem_128 :
4891          GCCBuiltin<"__builtin_ia32_pmovusdw128mem_mask">,
4892          Intrinsic<[],
4893                    [llvm_ptr_ty, llvm_v4i32_ty, llvm_i8_ty],
4894                    [IntrArgMemOnly]>;
4895  def int_x86_avx512_mask_pmov_dw_256 :
4896          GCCBuiltin<"__builtin_ia32_pmovdw256_mask">,
4897          Intrinsic<[llvm_v8i16_ty],
4898                    [llvm_v8i32_ty, llvm_v8i16_ty, llvm_i8_ty],
4899                    [IntrNoMem]>;
4900  def int_x86_avx512_mask_pmov_dw_mem_256 :
4901          GCCBuiltin<"__builtin_ia32_pmovdw256mem_mask">,
4902          Intrinsic<[],
4903                    [llvm_ptr_ty, llvm_v8i32_ty, llvm_i8_ty],
4904                    [IntrArgMemOnly]>;
4905  def int_x86_avx512_mask_pmovs_dw_256 :
4906          GCCBuiltin<"__builtin_ia32_pmovsdw256_mask">,
4907          Intrinsic<[llvm_v8i16_ty],
4908                    [llvm_v8i32_ty, llvm_v8i16_ty, llvm_i8_ty],
4909                    [IntrNoMem]>;
4910  def int_x86_avx512_mask_pmovs_dw_mem_256 :
4911          GCCBuiltin<"__builtin_ia32_pmovsdw256mem_mask">,
4912          Intrinsic<[],
4913                    [llvm_ptr_ty, llvm_v8i32_ty, llvm_i8_ty],
4914                    [IntrArgMemOnly]>;
4915  def int_x86_avx512_mask_pmovus_dw_256 :
4916          GCCBuiltin<"__builtin_ia32_pmovusdw256_mask">,
4917          Intrinsic<[llvm_v8i16_ty],
4918                    [llvm_v8i32_ty, llvm_v8i16_ty, llvm_i8_ty],
4919                    [IntrNoMem]>;
4920  def int_x86_avx512_mask_pmovus_dw_mem_256 :
4921          GCCBuiltin<"__builtin_ia32_pmovusdw256mem_mask">,
4922          Intrinsic<[],
4923                    [llvm_ptr_ty, llvm_v8i32_ty, llvm_i8_ty],
4924                    [IntrArgMemOnly]>;
4925  def int_x86_avx512_mask_pmov_dw_512 :
4926          Intrinsic<[llvm_v16i16_ty],
4927                    [llvm_v16i32_ty, llvm_v16i16_ty, llvm_i16_ty],
4928                    [IntrNoMem]>;
4929  def int_x86_avx512_mask_pmov_dw_mem_512 :
4930          GCCBuiltin<"__builtin_ia32_pmovdw512mem_mask">,
4931          Intrinsic<[],
4932                    [llvm_ptr_ty, llvm_v16i32_ty, llvm_i16_ty],
4933                    [IntrArgMemOnly]>;
4934  def int_x86_avx512_mask_pmovs_dw_512 :
4935          GCCBuiltin<"__builtin_ia32_pmovsdw512_mask">,
4936          Intrinsic<[llvm_v16i16_ty],
4937                    [llvm_v16i32_ty, llvm_v16i16_ty, llvm_i16_ty],
4938                    [IntrNoMem]>;
4939  def int_x86_avx512_mask_pmovs_dw_mem_512 :
4940          GCCBuiltin<"__builtin_ia32_pmovsdw512mem_mask">,
4941          Intrinsic<[],
4942                    [llvm_ptr_ty, llvm_v16i32_ty, llvm_i16_ty],
4943                    [IntrArgMemOnly]>;
4944  def int_x86_avx512_mask_pmovus_dw_512 :
4945          GCCBuiltin<"__builtin_ia32_pmovusdw512_mask">,
4946          Intrinsic<[llvm_v16i16_ty],
4947                    [llvm_v16i32_ty, llvm_v16i16_ty, llvm_i16_ty],
4948                    [IntrNoMem]>;
4949  def int_x86_avx512_mask_pmovus_dw_mem_512 :
4950          GCCBuiltin<"__builtin_ia32_pmovusdw512mem_mask">,
4951          Intrinsic<[],
4952                    [llvm_ptr_ty, llvm_v16i32_ty, llvm_i16_ty],
4953                    [IntrArgMemOnly]>;
4954  def int_x86_avx512_mask_pmov_wb_128 :
4955          GCCBuiltin<"__builtin_ia32_pmovwb128_mask">,
4956          Intrinsic<[llvm_v16i8_ty],
4957                    [llvm_v8i16_ty, llvm_v16i8_ty, llvm_i8_ty],
4958                    [IntrNoMem]>;
4959  def int_x86_avx512_mask_pmov_wb_mem_128 :
4960          GCCBuiltin<"__builtin_ia32_pmovwb128mem_mask">,
4961          Intrinsic<[],
4962                    [llvm_ptr_ty, llvm_v8i16_ty, llvm_i8_ty],
4963                    [IntrArgMemOnly]>;
4964  def int_x86_avx512_mask_pmovs_wb_128 :
4965          GCCBuiltin<"__builtin_ia32_pmovswb128_mask">,
4966          Intrinsic<[llvm_v16i8_ty],
4967                    [llvm_v8i16_ty, llvm_v16i8_ty, llvm_i8_ty],
4968                    [IntrNoMem]>;
4969  def int_x86_avx512_mask_pmovs_wb_mem_128 :
4970          GCCBuiltin<"__builtin_ia32_pmovswb128mem_mask">,
4971          Intrinsic<[],
4972                    [llvm_ptr_ty, llvm_v8i16_ty, llvm_i8_ty],
4973                    [IntrArgMemOnly]>;
4974  def int_x86_avx512_mask_pmovus_wb_128 :
4975          GCCBuiltin<"__builtin_ia32_pmovuswb128_mask">,
4976          Intrinsic<[llvm_v16i8_ty],
4977                    [llvm_v8i16_ty, llvm_v16i8_ty, llvm_i8_ty],
4978                    [IntrNoMem]>;
4979  def int_x86_avx512_mask_pmovus_wb_mem_128 :
4980          GCCBuiltin<"__builtin_ia32_pmovuswb128mem_mask">,
4981          Intrinsic<[],
4982                    [llvm_ptr_ty, llvm_v8i16_ty, llvm_i8_ty],
4983                    [IntrArgMemOnly]>;
4984  def int_x86_avx512_mask_pmov_wb_256 : // FIXME: Replace with trunc+select.
4985          Intrinsic<[llvm_v16i8_ty],
4986                    [llvm_v16i16_ty, llvm_v16i8_ty, llvm_i16_ty],
4987                    [IntrNoMem]>;
4988  def int_x86_avx512_mask_pmov_wb_mem_256 :
4989          GCCBuiltin<"__builtin_ia32_pmovwb256mem_mask">,
4990          Intrinsic<[],
4991                    [llvm_ptr_ty, llvm_v16i16_ty, llvm_i16_ty],
4992                    [IntrArgMemOnly]>;
4993  def int_x86_avx512_mask_pmovs_wb_256 :
4994          GCCBuiltin<"__builtin_ia32_pmovswb256_mask">,
4995          Intrinsic<[llvm_v16i8_ty],
4996                    [llvm_v16i16_ty, llvm_v16i8_ty, llvm_i16_ty],
4997                    [IntrNoMem]>;
4998  def int_x86_avx512_mask_pmovs_wb_mem_256 :
4999          GCCBuiltin<"__builtin_ia32_pmovswb256mem_mask">,
5000          Intrinsic<[],
5001                    [llvm_ptr_ty, llvm_v16i16_ty, llvm_i16_ty],
5002                    [IntrArgMemOnly]>;
5003  def int_x86_avx512_mask_pmovus_wb_256 :
5004          GCCBuiltin<"__builtin_ia32_pmovuswb256_mask">,
5005          Intrinsic<[llvm_v16i8_ty],
5006                    [llvm_v16i16_ty, llvm_v16i8_ty, llvm_i16_ty],
5007                    [IntrNoMem]>;
5008  def int_x86_avx512_mask_pmovus_wb_mem_256 :
5009          GCCBuiltin<"__builtin_ia32_pmovuswb256mem_mask">,
5010          Intrinsic<[],
5011                    [llvm_ptr_ty, llvm_v16i16_ty, llvm_i16_ty],
5012                    [IntrArgMemOnly]>;
5013  def int_x86_avx512_mask_pmov_wb_512 : // FIXME: Replace with trunc+select.
5014          Intrinsic<[llvm_v32i8_ty],
5015                    [llvm_v32i16_ty, llvm_v32i8_ty, llvm_i32_ty],
5016                    [IntrNoMem]>;
5017  def int_x86_avx512_mask_pmov_wb_mem_512 :
5018          GCCBuiltin<"__builtin_ia32_pmovwb512mem_mask">,
5019          Intrinsic<[],
5020                    [llvm_ptr_ty, llvm_v32i16_ty, llvm_i32_ty],
5021                    [IntrArgMemOnly]>;
5022  def int_x86_avx512_mask_pmovs_wb_512 :
5023          GCCBuiltin<"__builtin_ia32_pmovswb512_mask">,
5024          Intrinsic<[llvm_v32i8_ty],
5025                    [llvm_v32i16_ty, llvm_v32i8_ty, llvm_i32_ty],
5026                    [IntrNoMem]>;
5027  def int_x86_avx512_mask_pmovs_wb_mem_512 :
5028          GCCBuiltin<"__builtin_ia32_pmovswb512mem_mask">,
5029          Intrinsic<[],
5030                    [llvm_ptr_ty, llvm_v32i16_ty, llvm_i32_ty],
5031                    [IntrArgMemOnly]>;
5032  def int_x86_avx512_mask_pmovus_wb_512 :
5033          GCCBuiltin<"__builtin_ia32_pmovuswb512_mask">,
5034          Intrinsic<[llvm_v32i8_ty],
5035                    [llvm_v32i16_ty, llvm_v32i8_ty, llvm_i32_ty],
5036                    [IntrNoMem]>;
5037  def int_x86_avx512_mask_pmovus_wb_mem_512 :
5038          GCCBuiltin<"__builtin_ia32_pmovuswb512mem_mask">,
5039          Intrinsic<[],
5040                    [llvm_ptr_ty, llvm_v32i16_ty, llvm_i32_ty],
5041                    [IntrArgMemOnly]>;
5042}
5043
5044// Bitwise ternary logic
5045let TargetPrefix = "x86" in {
5046  def int_x86_avx512_pternlog_d_128 :
5047          GCCBuiltin<"__builtin_ia32_pternlogd128">,
5048          Intrinsic<[llvm_v4i32_ty],
5049                    [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty, llvm_i32_ty],
5050                    [IntrNoMem]>;
5051
5052  def int_x86_avx512_pternlog_d_256 :
5053          GCCBuiltin<"__builtin_ia32_pternlogd256">,
5054          Intrinsic<[llvm_v8i32_ty],
5055                    [llvm_v8i32_ty, llvm_v8i32_ty, llvm_v8i32_ty, llvm_i32_ty],
5056                    [IntrNoMem]>;
5057
5058  def int_x86_avx512_pternlog_d_512 :
5059          GCCBuiltin<"__builtin_ia32_pternlogd512">,
5060          Intrinsic<[llvm_v16i32_ty],
5061                    [llvm_v16i32_ty, llvm_v16i32_ty, llvm_v16i32_ty,
5062                     llvm_i32_ty], [IntrNoMem]>;
5063
5064  def int_x86_avx512_pternlog_q_128 :
5065          GCCBuiltin<"__builtin_ia32_pternlogq128">,
5066          Intrinsic<[llvm_v2i64_ty],
5067                    [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty, llvm_i32_ty],
5068                    [IntrNoMem]>;
5069
5070  def int_x86_avx512_pternlog_q_256 :
5071          GCCBuiltin<"__builtin_ia32_pternlogq256">,
5072          Intrinsic<[llvm_v4i64_ty],
5073                    [llvm_v4i64_ty, llvm_v4i64_ty, llvm_v4i64_ty, llvm_i32_ty],
5074                    [IntrNoMem]>;
5075
5076  def int_x86_avx512_pternlog_q_512 :
5077          GCCBuiltin<"__builtin_ia32_pternlogq512">,
5078          Intrinsic<[llvm_v8i64_ty],
5079                    [llvm_v8i64_ty, llvm_v8i64_ty, llvm_v8i64_ty, llvm_i32_ty],
5080                    [IntrNoMem]>;
5081}
5082
5083// Misc.
5084let TargetPrefix = "x86" in {
5085  // NOTE: These comparison intrinsics are not used by clang as long as the
5086  //       distinction in signaling behaviour is not implemented.
5087  def int_x86_avx512_cmp_ps_512 :
5088              Intrinsic<[llvm_v16i1_ty], [llvm_v16f32_ty, llvm_v16f32_ty,
5089                         llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
5090  def int_x86_avx512_cmp_pd_512 :
5091              Intrinsic<[llvm_v8i1_ty], [llvm_v8f64_ty, llvm_v8f64_ty,
5092                         llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
5093  def int_x86_avx512_cmp_ps_256 :
5094              Intrinsic<[llvm_v8i1_ty], [llvm_v8f32_ty, llvm_v8f32_ty,
5095                         llvm_i32_ty], [IntrNoMem]>;
5096  def int_x86_avx512_cmp_pd_256 :
5097              Intrinsic<[llvm_v4i1_ty], [llvm_v4f64_ty, llvm_v4f64_ty,
5098                         llvm_i32_ty], [IntrNoMem]>;
5099  def int_x86_avx512_cmp_ps_128 :
5100            Intrinsic<[llvm_v4i1_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
5101                       llvm_i32_ty], [IntrNoMem]>;
5102  def int_x86_avx512_cmp_pd_128 :
5103            Intrinsic<[llvm_v2i1_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
5104                       llvm_i32_ty], [IntrNoMem]>;
5105
5106  def int_x86_avx512_mask_cmp_ss :
5107        GCCBuiltin<"__builtin_ia32_cmpss_mask">,
5108              Intrinsic<[llvm_i8_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
5109                         llvm_i32_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
5110  def int_x86_avx512_mask_cmp_sd :
5111        GCCBuiltin<"__builtin_ia32_cmpsd_mask">,
5112              Intrinsic<[llvm_i8_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
5113                         llvm_i32_ty, llvm_i8_ty, llvm_i32_ty], [IntrNoMem]>;
5114}
5115
5116//===----------------------------------------------------------------------===//
5117// SHA intrinsics
5118let TargetPrefix = "x86" in {
5119  def int_x86_sha1rnds4 : GCCBuiltin<"__builtin_ia32_sha1rnds4">,
5120        Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty, llvm_i8_ty],
5121                  [IntrNoMem]>;
5122  def int_x86_sha1nexte : GCCBuiltin<"__builtin_ia32_sha1nexte">,
5123      Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
5124  def int_x86_sha1msg1 : GCCBuiltin<"__builtin_ia32_sha1msg1">,
5125      Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
5126  def int_x86_sha1msg2 : GCCBuiltin<"__builtin_ia32_sha1msg2">,
5127      Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
5128  def int_x86_sha256rnds2 : GCCBuiltin<"__builtin_ia32_sha256rnds2">,
5129      Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
5130                [IntrNoMem]>;
5131  def int_x86_sha256msg1 : GCCBuiltin<"__builtin_ia32_sha256msg1">,
5132      Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
5133  def int_x86_sha256msg2 : GCCBuiltin<"__builtin_ia32_sha256msg2">,
5134      Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
5135}
5136
5137//===----------------------------------------------------------------------===//
5138// Thread synchronization ops with timer.
5139let TargetPrefix = "x86" in {
5140  def int_x86_monitorx
5141      : GCCBuiltin<"__builtin_ia32_monitorx">,
5142        Intrinsic<[], [ llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty ], []>;
5143  def int_x86_mwaitx
5144      : GCCBuiltin<"__builtin_ia32_mwaitx">,
5145        Intrinsic<[], [ llvm_i32_ty, llvm_i32_ty, llvm_i32_ty ], []>;
5146}
5147
5148//===----------------------------------------------------------------------===//
5149// Cache-line zero
5150let TargetPrefix = "x86" in {
5151  def int_x86_clzero : GCCBuiltin<"__builtin_ia32_clzero">,
5152      Intrinsic<[], [llvm_ptr_ty], []>;
5153}
5154
5155//===----------------------------------------------------------------------===//
5156// Cache write back intrinsics
5157
5158let TargetPrefix = "x86" in {
5159  // Write back and invalidate
5160  def int_x86_wbinvd : GCCBuiltin<"__builtin_ia32_wbinvd">,
5161      Intrinsic<[], [], []>;
5162
5163  // Write back no-invalidate
5164  def int_x86_wbnoinvd : GCCBuiltin<"__builtin_ia32_wbnoinvd">,
5165      Intrinsic<[], [], []>;
5166}
5167
5168//===----------------------------------------------------------------------===//
5169// Cache-line demote
5170
5171let TargetPrefix = "x86" in {
5172  def int_x86_cldemote : GCCBuiltin<"__builtin_ia32_cldemote">,
5173      Intrinsic<[], [llvm_ptr_ty], []>;
5174}
5175
5176//===----------------------------------------------------------------------===//
5177// Wait and pause enhancements
5178let TargetPrefix = "x86" in {
5179  def int_x86_umonitor : GCCBuiltin<"__builtin_ia32_umonitor">,
5180              Intrinsic<[], [llvm_ptr_ty], []>;
5181  def int_x86_umwait : GCCBuiltin<"__builtin_ia32_umwait">,
5182              Intrinsic<[llvm_i8_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
5183  def int_x86_tpause : GCCBuiltin<"__builtin_ia32_tpause">,
5184              Intrinsic<[llvm_i8_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
5185}
5186
5187//===----------------------------------------------------------------------===//
5188// Direct Move Instructions
5189
5190let TargetPrefix = "x86" in {
5191  def int_x86_directstore32 : GCCBuiltin<"__builtin_ia32_directstore_u32">,
5192      Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty], []>;
5193  def int_x86_directstore64 : GCCBuiltin<"__builtin_ia32_directstore_u64">,
5194      Intrinsic<[], [llvm_ptr_ty, llvm_i64_ty], []>;
5195  def int_x86_movdir64b : GCCBuiltin<"__builtin_ia32_movdir64b">,
5196      Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty], []>;
5197}
5198
5199//===----------------------------------------------------------------------===//
5200// PTWrite - Write data to processor trace pocket
5201
5202let TargetPrefix = "x86" in {
5203  def int_x86_ptwrite32 : GCCBuiltin<"__builtin_ia32_ptwrite32">,
5204              Intrinsic<[], [llvm_i32_ty], []>;
5205  def int_x86_ptwrite64 : GCCBuiltin<"__builtin_ia32_ptwrite64">,
5206              Intrinsic<[], [llvm_i64_ty], []>;
5207}
5208
5209//===----------------------------------------------------------------------===//
5210// INVPCID - Invalidate Process-Context Identifier
5211
5212let TargetPrefix = "x86" in {
5213  def int_x86_invpcid : GCCBuiltin<"__builtin_ia32_invpcid">,
5214              Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty], []>;
5215}
5216