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