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