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