IntrinsicsX86.td revision 263508
1//===- IntrinsicsX86.td - Defines X86 intrinsics -----------*- tablegen -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines all of the X86-specific intrinsics.
11//
12//===----------------------------------------------------------------------===//
13
14//===----------------------------------------------------------------------===//
15// Interrupt traps
16let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
17  def int_x86_int : Intrinsic<[], [llvm_i8_ty]>;
18}
19
20//===----------------------------------------------------------------------===//
21// 3DNow!
22
23let TargetPrefix = "x86" in {
24  def int_x86_3dnow_pavgusb : GCCBuiltin<"__builtin_ia32_pavgusb">,
25              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
26                        [IntrNoMem]>;
27  def int_x86_3dnow_pf2id : GCCBuiltin<"__builtin_ia32_pf2id">,
28              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
29  def int_x86_3dnow_pfacc : GCCBuiltin<"__builtin_ia32_pfacc">,
30              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
31                        [IntrNoMem]>;
32  def int_x86_3dnow_pfadd : GCCBuiltin<"__builtin_ia32_pfadd">,
33              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
34                        [IntrNoMem]>;
35  def int_x86_3dnow_pfcmpeq : GCCBuiltin<"__builtin_ia32_pfcmpeq">,
36              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
37                        [IntrNoMem]>;
38  def int_x86_3dnow_pfcmpge : GCCBuiltin<"__builtin_ia32_pfcmpge">,
39              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
40                        [IntrNoMem]>;
41  def int_x86_3dnow_pfcmpgt : GCCBuiltin<"__builtin_ia32_pfcmpgt">,
42              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
43                        [IntrNoMem]>;
44  def int_x86_3dnow_pfmax : GCCBuiltin<"__builtin_ia32_pfmax">,
45              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
46                        [IntrNoMem]>;
47  def int_x86_3dnow_pfmin : GCCBuiltin<"__builtin_ia32_pfmin">,
48              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
49                        [IntrNoMem]>;
50  def int_x86_3dnow_pfmul : GCCBuiltin<"__builtin_ia32_pfmul">,
51              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
52                        [IntrNoMem]>;
53  def int_x86_3dnow_pfrcp : GCCBuiltin<"__builtin_ia32_pfrcp">,
54              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
55  def int_x86_3dnow_pfrcpit1 : GCCBuiltin<"__builtin_ia32_pfrcpit1">,
56              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
57                        [IntrNoMem]>;
58  def int_x86_3dnow_pfrcpit2 : GCCBuiltin<"__builtin_ia32_pfrcpit2">,
59              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
60                        [IntrNoMem]>;
61  def int_x86_3dnow_pfrsqrt : GCCBuiltin<"__builtin_ia32_pfrsqrt">,
62              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
63  def int_x86_3dnow_pfrsqit1 : GCCBuiltin<"__builtin_ia32_pfrsqit1">,
64              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
65                        [IntrNoMem]>;
66  def int_x86_3dnow_pfsub : GCCBuiltin<"__builtin_ia32_pfsub">,
67              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
68                        [IntrNoMem]>;
69  def int_x86_3dnow_pfsubr : GCCBuiltin<"__builtin_ia32_pfsubr">,
70              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
71                        [IntrNoMem]>;
72  def int_x86_3dnow_pi2fd : GCCBuiltin<"__builtin_ia32_pi2fd">,
73              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
74  def int_x86_3dnow_pmulhrw : GCCBuiltin<"__builtin_ia32_pmulhrw">,
75              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
76                        [IntrNoMem]>;
77}
78
79//===----------------------------------------------------------------------===//
80// 3DNow! extensions
81
82let TargetPrefix = "x86" in {
83  def int_x86_3dnowa_pf2iw : GCCBuiltin<"__builtin_ia32_pf2iw">,
84              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
85  def int_x86_3dnowa_pfnacc : GCCBuiltin<"__builtin_ia32_pfnacc">,
86              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
87                        [IntrNoMem]>;
88  def int_x86_3dnowa_pfpnacc : GCCBuiltin<"__builtin_ia32_pfpnacc">,
89              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
90                        [IntrNoMem]>;
91  def int_x86_3dnowa_pi2fw : GCCBuiltin<"__builtin_ia32_pi2fw">,
92              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
93  def int_x86_3dnowa_pswapd :
94              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
95}
96
97//===----------------------------------------------------------------------===//
98// SSE1
99
100// Arithmetic ops
101let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
102  def int_x86_sse_add_ss : GCCBuiltin<"__builtin_ia32_addss">,
103              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
104                         llvm_v4f32_ty], [IntrNoMem]>;
105  def int_x86_sse_sub_ss : GCCBuiltin<"__builtin_ia32_subss">,
106              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
107                         llvm_v4f32_ty], [IntrNoMem]>;
108  def int_x86_sse_mul_ss : GCCBuiltin<"__builtin_ia32_mulss">,
109              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
110                         llvm_v4f32_ty], [IntrNoMem]>;
111  def int_x86_sse_div_ss : GCCBuiltin<"__builtin_ia32_divss">,
112              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
113                         llvm_v4f32_ty], [IntrNoMem]>;
114  def int_x86_sse_sqrt_ss : GCCBuiltin<"__builtin_ia32_sqrtss">,
115              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
116                        [IntrNoMem]>;
117  def int_x86_sse_sqrt_ps : GCCBuiltin<"__builtin_ia32_sqrtps">,
118              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
119                        [IntrNoMem]>;
120  def int_x86_sse_rcp_ss : GCCBuiltin<"__builtin_ia32_rcpss">,
121              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
122                        [IntrNoMem]>;
123  def int_x86_sse_rcp_ps : GCCBuiltin<"__builtin_ia32_rcpps">,
124              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
125                        [IntrNoMem]>;
126  def int_x86_sse_rsqrt_ss : GCCBuiltin<"__builtin_ia32_rsqrtss">,
127              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
128                        [IntrNoMem]>;
129  def int_x86_sse_rsqrt_ps : GCCBuiltin<"__builtin_ia32_rsqrtps">,
130              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
131                        [IntrNoMem]>;
132  def int_x86_sse_min_ss : GCCBuiltin<"__builtin_ia32_minss">,
133              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
134                         llvm_v4f32_ty], [IntrNoMem]>;
135  def int_x86_sse_min_ps : GCCBuiltin<"__builtin_ia32_minps">,
136              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
137                         llvm_v4f32_ty], [IntrNoMem]>;
138  def int_x86_sse_max_ss : GCCBuiltin<"__builtin_ia32_maxss">,
139              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
140                         llvm_v4f32_ty], [IntrNoMem]>;
141  def int_x86_sse_max_ps : GCCBuiltin<"__builtin_ia32_maxps">,
142              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
143                         llvm_v4f32_ty], [IntrNoMem]>;
144}
145
146// Comparison ops
147let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
148  def int_x86_sse_cmp_ss : GCCBuiltin<"__builtin_ia32_cmpss">,
149              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
150                         llvm_v4f32_ty, llvm_i8_ty], [IntrNoMem]>;
151  def int_x86_sse_cmp_ps : GCCBuiltin<"__builtin_ia32_cmpps">,
152              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
153                         llvm_v4f32_ty, llvm_i8_ty], [IntrNoMem]>;
154  def int_x86_sse_comieq_ss : GCCBuiltin<"__builtin_ia32_comieq">,
155              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
156                         llvm_v4f32_ty], [IntrNoMem]>;
157  def int_x86_sse_comilt_ss : GCCBuiltin<"__builtin_ia32_comilt">,
158              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
159                         llvm_v4f32_ty], [IntrNoMem]>;
160  def int_x86_sse_comile_ss : GCCBuiltin<"__builtin_ia32_comile">,
161              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
162                         llvm_v4f32_ty], [IntrNoMem]>;
163  def int_x86_sse_comigt_ss : GCCBuiltin<"__builtin_ia32_comigt">,
164              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
165                         llvm_v4f32_ty], [IntrNoMem]>;
166  def int_x86_sse_comige_ss : GCCBuiltin<"__builtin_ia32_comige">,
167              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
168                         llvm_v4f32_ty], [IntrNoMem]>;
169  def int_x86_sse_comineq_ss : GCCBuiltin<"__builtin_ia32_comineq">,
170              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
171                         llvm_v4f32_ty], [IntrNoMem]>;
172  def int_x86_sse_ucomieq_ss : GCCBuiltin<"__builtin_ia32_ucomieq">,
173              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
174                         llvm_v4f32_ty], [IntrNoMem]>;
175  def int_x86_sse_ucomilt_ss : GCCBuiltin<"__builtin_ia32_ucomilt">,
176              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
177                         llvm_v4f32_ty], [IntrNoMem]>;
178  def int_x86_sse_ucomile_ss : GCCBuiltin<"__builtin_ia32_ucomile">,
179              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
180                         llvm_v4f32_ty], [IntrNoMem]>;
181  def int_x86_sse_ucomigt_ss : GCCBuiltin<"__builtin_ia32_ucomigt">,
182              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
183                         llvm_v4f32_ty], [IntrNoMem]>;
184  def int_x86_sse_ucomige_ss : GCCBuiltin<"__builtin_ia32_ucomige">,
185              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
186                         llvm_v4f32_ty], [IntrNoMem]>;
187  def int_x86_sse_ucomineq_ss : GCCBuiltin<"__builtin_ia32_ucomineq">,
188              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
189                         llvm_v4f32_ty], [IntrNoMem]>;
190}
191
192
193// Conversion ops
194let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
195  def int_x86_sse_cvtss2si : GCCBuiltin<"__builtin_ia32_cvtss2si">,
196              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
197  def int_x86_sse_cvtss2si64 : GCCBuiltin<"__builtin_ia32_cvtss2si64">,
198              Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty], [IntrNoMem]>;
199  def int_x86_sse_cvttss2si : GCCBuiltin<"__builtin_ia32_cvttss2si">,
200              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
201  def int_x86_sse_cvttss2si64 : GCCBuiltin<"__builtin_ia32_cvttss2si64">,
202              Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty], [IntrNoMem]>;
203  def int_x86_sse_cvtsi2ss : GCCBuiltin<"__builtin_ia32_cvtsi2ss">,
204              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
205                         llvm_i32_ty], [IntrNoMem]>;
206  def int_x86_sse_cvtsi642ss : GCCBuiltin<"__builtin_ia32_cvtsi642ss">,
207              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
208                         llvm_i64_ty], [IntrNoMem]>;
209
210  def int_x86_sse_cvtps2pi : GCCBuiltin<"__builtin_ia32_cvtps2pi">,
211              Intrinsic<[llvm_x86mmx_ty], [llvm_v4f32_ty], [IntrNoMem]>;
212  def int_x86_sse_cvttps2pi: GCCBuiltin<"__builtin_ia32_cvttps2pi">,
213              Intrinsic<[llvm_x86mmx_ty], [llvm_v4f32_ty], [IntrNoMem]>;
214  def int_x86_sse_cvtpi2ps : GCCBuiltin<"__builtin_ia32_cvtpi2ps">,
215              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
216                         llvm_x86mmx_ty], [IntrNoMem]>;
217}
218
219// SIMD store ops
220let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
221  def int_x86_sse_storeu_ps : GCCBuiltin<"__builtin_ia32_storeups">,
222              Intrinsic<[], [llvm_ptr_ty,
223                         llvm_v4f32_ty], [IntrReadWriteArgMem]>;
224}
225
226// Cacheability support ops
227let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
228  def int_x86_sse_sfence : GCCBuiltin<"__builtin_ia32_sfence">,
229              Intrinsic<[], [], []>;
230}
231
232// Control register.
233let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
234  def int_x86_sse_stmxcsr :
235              Intrinsic<[], [llvm_ptr_ty], []>;
236  def int_x86_sse_ldmxcsr :
237              Intrinsic<[], [llvm_ptr_ty], []>;
238}
239
240// Misc.
241let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
242  def int_x86_sse_movmsk_ps : GCCBuiltin<"__builtin_ia32_movmskps">,
243              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
244}
245
246//===----------------------------------------------------------------------===//
247// SSE2
248
249// FP arithmetic ops
250let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
251  def int_x86_sse2_add_sd : GCCBuiltin<"__builtin_ia32_addsd">,
252              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
253                         llvm_v2f64_ty], [IntrNoMem]>;
254  def int_x86_sse2_sub_sd : GCCBuiltin<"__builtin_ia32_subsd">,
255              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
256                         llvm_v2f64_ty], [IntrNoMem]>;
257  def int_x86_sse2_mul_sd : GCCBuiltin<"__builtin_ia32_mulsd">,
258              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
259                         llvm_v2f64_ty], [IntrNoMem]>;
260  def int_x86_sse2_div_sd : GCCBuiltin<"__builtin_ia32_divsd">,
261              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
262                         llvm_v2f64_ty], [IntrNoMem]>;
263  def int_x86_sse2_sqrt_sd : GCCBuiltin<"__builtin_ia32_sqrtsd">,
264              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty],
265                        [IntrNoMem]>;
266  def int_x86_sse2_sqrt_pd : GCCBuiltin<"__builtin_ia32_sqrtpd">,
267              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty],
268                        [IntrNoMem]>;
269  def int_x86_sse2_min_sd : GCCBuiltin<"__builtin_ia32_minsd">,
270              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
271                         llvm_v2f64_ty], [IntrNoMem]>;
272  def int_x86_sse2_min_pd : GCCBuiltin<"__builtin_ia32_minpd">,
273              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
274                         llvm_v2f64_ty], [IntrNoMem]>;
275  def int_x86_sse2_max_sd : GCCBuiltin<"__builtin_ia32_maxsd">,
276              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
277                         llvm_v2f64_ty], [IntrNoMem]>;
278  def int_x86_sse2_max_pd : GCCBuiltin<"__builtin_ia32_maxpd">,
279              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
280                         llvm_v2f64_ty], [IntrNoMem]>;
281}
282
283// FP comparison ops
284let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
285  def int_x86_sse2_cmp_sd : GCCBuiltin<"__builtin_ia32_cmpsd">,
286              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
287                         llvm_v2f64_ty, llvm_i8_ty], [IntrNoMem]>;
288  def int_x86_sse2_cmp_pd : GCCBuiltin<"__builtin_ia32_cmppd">,
289              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
290                         llvm_v2f64_ty, llvm_i8_ty], [IntrNoMem]>;
291  def int_x86_sse2_comieq_sd : GCCBuiltin<"__builtin_ia32_comisdeq">,
292              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
293                         llvm_v2f64_ty], [IntrNoMem]>;
294  def int_x86_sse2_comilt_sd : GCCBuiltin<"__builtin_ia32_comisdlt">,
295              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
296                         llvm_v2f64_ty], [IntrNoMem]>;
297  def int_x86_sse2_comile_sd : GCCBuiltin<"__builtin_ia32_comisdle">,
298              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
299                         llvm_v2f64_ty], [IntrNoMem]>;
300  def int_x86_sse2_comigt_sd : GCCBuiltin<"__builtin_ia32_comisdgt">,
301              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
302                         llvm_v2f64_ty], [IntrNoMem]>;
303  def int_x86_sse2_comige_sd : GCCBuiltin<"__builtin_ia32_comisdge">,
304              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
305                         llvm_v2f64_ty], [IntrNoMem]>;
306  def int_x86_sse2_comineq_sd : GCCBuiltin<"__builtin_ia32_comisdneq">,
307              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
308                         llvm_v2f64_ty], [IntrNoMem]>;
309  def int_x86_sse2_ucomieq_sd : GCCBuiltin<"__builtin_ia32_ucomisdeq">,
310              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
311                         llvm_v2f64_ty], [IntrNoMem]>;
312  def int_x86_sse2_ucomilt_sd : GCCBuiltin<"__builtin_ia32_ucomisdlt">,
313              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
314                         llvm_v2f64_ty], [IntrNoMem]>;
315  def int_x86_sse2_ucomile_sd : GCCBuiltin<"__builtin_ia32_ucomisdle">,
316              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
317                         llvm_v2f64_ty], [IntrNoMem]>;
318  def int_x86_sse2_ucomigt_sd : GCCBuiltin<"__builtin_ia32_ucomisdgt">,
319              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
320                         llvm_v2f64_ty], [IntrNoMem]>;
321  def int_x86_sse2_ucomige_sd : GCCBuiltin<"__builtin_ia32_ucomisdge">,
322              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
323                         llvm_v2f64_ty], [IntrNoMem]>;
324  def int_x86_sse2_ucomineq_sd : GCCBuiltin<"__builtin_ia32_ucomisdneq">,
325              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
326                         llvm_v2f64_ty], [IntrNoMem]>;
327}
328
329// Integer arithmetic ops.
330let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
331  def int_x86_sse2_padds_b : GCCBuiltin<"__builtin_ia32_paddsb128">,
332              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
333                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
334  def int_x86_sse2_padds_w : GCCBuiltin<"__builtin_ia32_paddsw128">,
335              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
336                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
337  def int_x86_sse2_paddus_b : GCCBuiltin<"__builtin_ia32_paddusb128">,
338              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
339                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
340  def int_x86_sse2_paddus_w : GCCBuiltin<"__builtin_ia32_paddusw128">,
341              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
342                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
343  def int_x86_sse2_psubs_b : GCCBuiltin<"__builtin_ia32_psubsb128">,
344              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
345                         llvm_v16i8_ty], [IntrNoMem]>;
346  def int_x86_sse2_psubs_w : GCCBuiltin<"__builtin_ia32_psubsw128">,
347              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
348                         llvm_v8i16_ty], [IntrNoMem]>;
349  def int_x86_sse2_psubus_b : GCCBuiltin<"__builtin_ia32_psubusb128">,
350              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
351                         llvm_v16i8_ty], [IntrNoMem]>;
352  def int_x86_sse2_psubus_w : GCCBuiltin<"__builtin_ia32_psubusw128">,
353              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
354                         llvm_v8i16_ty], [IntrNoMem]>;
355  def int_x86_sse2_pmulhu_w : GCCBuiltin<"__builtin_ia32_pmulhuw128">,
356              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
357                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
358  def int_x86_sse2_pmulh_w : GCCBuiltin<"__builtin_ia32_pmulhw128">,
359              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
360                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
361  def int_x86_sse2_pmulu_dq : GCCBuiltin<"__builtin_ia32_pmuludq128">,
362              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty,
363                         llvm_v4i32_ty], [IntrNoMem, Commutative]>;
364  def int_x86_sse2_pmadd_wd : GCCBuiltin<"__builtin_ia32_pmaddwd128">,
365              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty,
366                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
367  def int_x86_sse2_pavg_b : GCCBuiltin<"__builtin_ia32_pavgb128">,
368              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
369                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
370  def int_x86_sse2_pavg_w : GCCBuiltin<"__builtin_ia32_pavgw128">,
371              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
372                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
373  def int_x86_sse2_pmaxu_b : GCCBuiltin<"__builtin_ia32_pmaxub128">,
374              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
375                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
376  def int_x86_sse2_pmaxs_w : GCCBuiltin<"__builtin_ia32_pmaxsw128">,
377              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
378                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
379  def int_x86_sse2_pminu_b : GCCBuiltin<"__builtin_ia32_pminub128">,
380              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
381                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
382  def int_x86_sse2_pmins_w : GCCBuiltin<"__builtin_ia32_pminsw128">,
383              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
384                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
385  def int_x86_sse2_psad_bw : GCCBuiltin<"__builtin_ia32_psadbw128">,
386              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty,
387                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
388}
389
390// Integer shift ops.
391let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
392  def int_x86_sse2_psll_w : GCCBuiltin<"__builtin_ia32_psllw128">,
393              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
394                         llvm_v8i16_ty], [IntrNoMem]>;
395  def int_x86_sse2_psll_d : GCCBuiltin<"__builtin_ia32_pslld128">,
396              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
397                         llvm_v4i32_ty], [IntrNoMem]>;
398  def int_x86_sse2_psll_q : GCCBuiltin<"__builtin_ia32_psllq128">,
399              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
400                         llvm_v2i64_ty], [IntrNoMem]>;
401  def int_x86_sse2_psrl_w : GCCBuiltin<"__builtin_ia32_psrlw128">,
402              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
403                         llvm_v8i16_ty], [IntrNoMem]>;
404  def int_x86_sse2_psrl_d : GCCBuiltin<"__builtin_ia32_psrld128">,
405              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
406                         llvm_v4i32_ty], [IntrNoMem]>;
407  def int_x86_sse2_psrl_q : GCCBuiltin<"__builtin_ia32_psrlq128">,
408              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
409                         llvm_v2i64_ty], [IntrNoMem]>;
410  def int_x86_sse2_psra_w : GCCBuiltin<"__builtin_ia32_psraw128">,
411              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
412                         llvm_v8i16_ty], [IntrNoMem]>;
413  def int_x86_sse2_psra_d : GCCBuiltin<"__builtin_ia32_psrad128">,
414              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
415                         llvm_v4i32_ty], [IntrNoMem]>;
416
417  def int_x86_sse2_pslli_w : GCCBuiltin<"__builtin_ia32_psllwi128">,
418              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
419                         llvm_i32_ty], [IntrNoMem]>;
420  def int_x86_sse2_pslli_d : GCCBuiltin<"__builtin_ia32_pslldi128">,
421              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
422                         llvm_i32_ty], [IntrNoMem]>;
423  def int_x86_sse2_pslli_q : GCCBuiltin<"__builtin_ia32_psllqi128">,
424              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
425                         llvm_i32_ty], [IntrNoMem]>;
426  def int_x86_sse2_psrli_w : GCCBuiltin<"__builtin_ia32_psrlwi128">,
427              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
428                         llvm_i32_ty], [IntrNoMem]>;
429  def int_x86_sse2_psrli_d : GCCBuiltin<"__builtin_ia32_psrldi128">,
430              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
431                         llvm_i32_ty], [IntrNoMem]>;
432  def int_x86_sse2_psrli_q : GCCBuiltin<"__builtin_ia32_psrlqi128">,
433              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
434                         llvm_i32_ty], [IntrNoMem]>;
435  def int_x86_sse2_psrai_w : GCCBuiltin<"__builtin_ia32_psrawi128">,
436              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
437                         llvm_i32_ty], [IntrNoMem]>;
438  def int_x86_sse2_psrai_d : GCCBuiltin<"__builtin_ia32_psradi128">,
439              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
440                         llvm_i32_ty], [IntrNoMem]>;
441
442  def int_x86_sse2_psll_dq : GCCBuiltin<"__builtin_ia32_pslldqi128">,
443              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
444                         llvm_i32_ty], [IntrNoMem]>;
445  def int_x86_sse2_psrl_dq : GCCBuiltin<"__builtin_ia32_psrldqi128">,
446              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
447                         llvm_i32_ty], [IntrNoMem]>;
448  def int_x86_sse2_psll_dq_bs : GCCBuiltin<"__builtin_ia32_pslldqi128_byteshift">,
449              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
450                         llvm_i32_ty], [IntrNoMem]>;
451  def int_x86_sse2_psrl_dq_bs : GCCBuiltin<"__builtin_ia32_psrldqi128_byteshift">,
452              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
453                         llvm_i32_ty], [IntrNoMem]>;
454}
455
456// Conversion ops
457let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
458  def int_x86_sse2_cvtdq2pd : GCCBuiltin<"__builtin_ia32_cvtdq2pd">,
459              Intrinsic<[llvm_v2f64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
460  def int_x86_sse2_cvtdq2ps : GCCBuiltin<"__builtin_ia32_cvtdq2ps">,
461              Intrinsic<[llvm_v4f32_ty], [llvm_v4i32_ty], [IntrNoMem]>;
462  def int_x86_sse2_cvtpd2dq : GCCBuiltin<"__builtin_ia32_cvtpd2dq">,
463              Intrinsic<[llvm_v4i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
464  def int_x86_sse2_cvttpd2dq : GCCBuiltin<"__builtin_ia32_cvttpd2dq">,
465              Intrinsic<[llvm_v4i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
466  def int_x86_sse2_cvtpd2ps : GCCBuiltin<"__builtin_ia32_cvtpd2ps">,
467              Intrinsic<[llvm_v4f32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
468  def int_x86_sse2_cvtps2dq : GCCBuiltin<"__builtin_ia32_cvtps2dq">,
469              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
470  def int_x86_sse2_cvttps2dq : GCCBuiltin<"__builtin_ia32_cvttps2dq">,
471              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
472  def int_x86_sse2_cvtps2pd : GCCBuiltin<"__builtin_ia32_cvtps2pd">,
473              Intrinsic<[llvm_v2f64_ty], [llvm_v4f32_ty], [IntrNoMem]>;
474  def int_x86_sse2_cvtsd2si : GCCBuiltin<"__builtin_ia32_cvtsd2si">,
475              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
476  def int_x86_sse2_cvtsd2si64 : GCCBuiltin<"__builtin_ia32_cvtsd2si64">,
477              Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
478  def int_x86_sse2_cvttsd2si : GCCBuiltin<"__builtin_ia32_cvttsd2si">,
479              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
480  def int_x86_sse2_cvttsd2si64 : GCCBuiltin<"__builtin_ia32_cvttsd2si64">,
481              Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
482  def int_x86_sse2_cvtsi2sd : GCCBuiltin<"__builtin_ia32_cvtsi2sd">,
483              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
484                         llvm_i32_ty], [IntrNoMem]>;
485  def int_x86_sse2_cvtsi642sd : GCCBuiltin<"__builtin_ia32_cvtsi642sd">,
486              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
487                         llvm_i64_ty], [IntrNoMem]>;
488  def int_x86_sse2_cvtsd2ss : GCCBuiltin<"__builtin_ia32_cvtsd2ss">,
489              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
490                         llvm_v2f64_ty], [IntrNoMem]>;
491  def int_x86_sse2_cvtss2sd : GCCBuiltin<"__builtin_ia32_cvtss2sd">,
492              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
493                         llvm_v4f32_ty], [IntrNoMem]>;
494  def int_x86_sse_cvtpd2pi : GCCBuiltin<"__builtin_ia32_cvtpd2pi">,
495              Intrinsic<[llvm_x86mmx_ty], [llvm_v2f64_ty], [IntrNoMem]>;
496  def int_x86_sse_cvttpd2pi: GCCBuiltin<"__builtin_ia32_cvttpd2pi">,
497              Intrinsic<[llvm_x86mmx_ty], [llvm_v2f64_ty], [IntrNoMem]>;
498  def int_x86_sse_cvtpi2pd : GCCBuiltin<"__builtin_ia32_cvtpi2pd">,
499              Intrinsic<[llvm_v2f64_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
500}
501
502// SIMD store ops
503let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
504  def int_x86_sse2_storeu_pd : GCCBuiltin<"__builtin_ia32_storeupd">,
505              Intrinsic<[], [llvm_ptr_ty,
506                         llvm_v2f64_ty], [IntrReadWriteArgMem]>;
507  def int_x86_sse2_storeu_dq : GCCBuiltin<"__builtin_ia32_storedqu">,
508              Intrinsic<[], [llvm_ptr_ty,
509                         llvm_v16i8_ty], [IntrReadWriteArgMem]>;
510  def int_x86_sse2_storel_dq : GCCBuiltin<"__builtin_ia32_storelv4si">,
511              Intrinsic<[], [llvm_ptr_ty,
512                         llvm_v4i32_ty], [IntrReadWriteArgMem]>;
513}
514
515// Misc.
516let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
517  def int_x86_sse2_packsswb_128 : GCCBuiltin<"__builtin_ia32_packsswb128">,
518              Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty,
519                         llvm_v8i16_ty], [IntrNoMem]>;
520  def int_x86_sse2_packssdw_128 : GCCBuiltin<"__builtin_ia32_packssdw128">,
521              Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty,
522                         llvm_v4i32_ty], [IntrNoMem]>;
523  def int_x86_sse2_packuswb_128 : GCCBuiltin<"__builtin_ia32_packuswb128">,
524              Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty,
525                         llvm_v8i16_ty], [IntrNoMem]>;
526  def int_x86_sse2_movmsk_pd : GCCBuiltin<"__builtin_ia32_movmskpd">,
527              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
528  def int_x86_sse2_pmovmskb_128 : GCCBuiltin<"__builtin_ia32_pmovmskb128">,
529              Intrinsic<[llvm_i32_ty], [llvm_v16i8_ty], [IntrNoMem]>;
530  def int_x86_sse2_maskmov_dqu : GCCBuiltin<"__builtin_ia32_maskmovdqu">,
531              Intrinsic<[], [llvm_v16i8_ty,
532                         llvm_v16i8_ty, llvm_ptr_ty], []>;
533  def int_x86_sse2_clflush : GCCBuiltin<"__builtin_ia32_clflush">,
534              Intrinsic<[], [llvm_ptr_ty], []>;
535  def int_x86_sse2_lfence : GCCBuiltin<"__builtin_ia32_lfence">,
536              Intrinsic<[], [], []>;
537  def int_x86_sse2_mfence : GCCBuiltin<"__builtin_ia32_mfence">,
538              Intrinsic<[], [], []>;
539}
540
541//===----------------------------------------------------------------------===//
542// SSE3
543
544// Addition / subtraction ops.
545let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
546  def int_x86_sse3_addsub_ps : GCCBuiltin<"__builtin_ia32_addsubps">,
547              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
548                         llvm_v4f32_ty], [IntrNoMem]>;
549  def int_x86_sse3_addsub_pd : GCCBuiltin<"__builtin_ia32_addsubpd">,
550              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
551                         llvm_v2f64_ty], [IntrNoMem]>;
552}
553
554// Horizontal ops.
555let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
556  def int_x86_sse3_hadd_ps : GCCBuiltin<"__builtin_ia32_haddps">,
557              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
558                         llvm_v4f32_ty], [IntrNoMem]>;
559  def int_x86_sse3_hadd_pd : GCCBuiltin<"__builtin_ia32_haddpd">,
560              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
561                         llvm_v2f64_ty], [IntrNoMem]>;
562  def int_x86_sse3_hsub_ps : GCCBuiltin<"__builtin_ia32_hsubps">,
563              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
564                         llvm_v4f32_ty], [IntrNoMem]>;
565  def int_x86_sse3_hsub_pd : GCCBuiltin<"__builtin_ia32_hsubpd">,
566              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
567                         llvm_v2f64_ty], [IntrNoMem]>;
568}
569
570// Specialized unaligned load.
571let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
572  def int_x86_sse3_ldu_dq : GCCBuiltin<"__builtin_ia32_lddqu">,
573              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrReadMem]>;
574}
575
576// Thread synchronization ops.
577let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
578  def int_x86_sse3_monitor : GCCBuiltin<"__builtin_ia32_monitor">,
579              Intrinsic<[], [llvm_ptr_ty,
580                         llvm_i32_ty, llvm_i32_ty], []>;
581  def int_x86_sse3_mwait : GCCBuiltin<"__builtin_ia32_mwait">,
582              Intrinsic<[], [llvm_i32_ty,
583                         llvm_i32_ty], []>;
584}
585
586//===----------------------------------------------------------------------===//
587// SSSE3
588
589// Horizontal arithmetic ops
590let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
591  def int_x86_ssse3_phadd_w         : GCCBuiltin<"__builtin_ia32_phaddw">,
592              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
593                         llvm_x86mmx_ty], [IntrNoMem]>;
594  def int_x86_ssse3_phadd_w_128     : GCCBuiltin<"__builtin_ia32_phaddw128">,
595              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
596                         llvm_v8i16_ty], [IntrNoMem]>;
597
598  def int_x86_ssse3_phadd_d         : GCCBuiltin<"__builtin_ia32_phaddd">,
599              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
600                         llvm_x86mmx_ty], [IntrNoMem]>;
601  def int_x86_ssse3_phadd_d_128     : GCCBuiltin<"__builtin_ia32_phaddd128">,
602              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
603                         llvm_v4i32_ty], [IntrNoMem]>;
604
605  def int_x86_ssse3_phadd_sw        : GCCBuiltin<"__builtin_ia32_phaddsw">,
606              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
607                         llvm_x86mmx_ty], [IntrNoMem]>;
608  def int_x86_ssse3_phadd_sw_128    : GCCBuiltin<"__builtin_ia32_phaddsw128">,
609              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
610                         llvm_v8i16_ty], [IntrNoMem]>;
611
612  def int_x86_ssse3_phsub_w         : GCCBuiltin<"__builtin_ia32_phsubw">,
613              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
614                         llvm_x86mmx_ty], [IntrNoMem]>;
615  def int_x86_ssse3_phsub_w_128     : GCCBuiltin<"__builtin_ia32_phsubw128">,
616              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
617                         llvm_v8i16_ty], [IntrNoMem]>;
618
619  def int_x86_ssse3_phsub_d         : GCCBuiltin<"__builtin_ia32_phsubd">,
620              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
621                         llvm_x86mmx_ty], [IntrNoMem]>;
622  def int_x86_ssse3_phsub_d_128     : GCCBuiltin<"__builtin_ia32_phsubd128">,
623              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
624                         llvm_v4i32_ty], [IntrNoMem]>;
625
626  def int_x86_ssse3_phsub_sw        : GCCBuiltin<"__builtin_ia32_phsubsw">,
627              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
628                         llvm_x86mmx_ty], [IntrNoMem]>;
629  def int_x86_ssse3_phsub_sw_128    : GCCBuiltin<"__builtin_ia32_phsubsw128">,
630              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
631                         llvm_v8i16_ty], [IntrNoMem]>;
632
633  def int_x86_ssse3_pmadd_ub_sw     : GCCBuiltin<"__builtin_ia32_pmaddubsw">,
634              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
635                         llvm_x86mmx_ty], [IntrNoMem]>;
636  def int_x86_ssse3_pmadd_ub_sw_128 : GCCBuiltin<"__builtin_ia32_pmaddubsw128">,
637              Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty,
638                         llvm_v16i8_ty], [IntrNoMem]>;
639}
640
641// Packed multiply high with round and scale
642let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
643  def int_x86_ssse3_pmul_hr_sw      : GCCBuiltin<"__builtin_ia32_pmulhrsw">,
644              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
645                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
646  def int_x86_ssse3_pmul_hr_sw_128  : GCCBuiltin<"__builtin_ia32_pmulhrsw128">,
647              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
648                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
649}
650
651// Shuffle ops
652let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
653  def int_x86_ssse3_pshuf_b         : GCCBuiltin<"__builtin_ia32_pshufb">,
654              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
655                         llvm_x86mmx_ty], [IntrNoMem]>;
656  def int_x86_ssse3_pshuf_b_128     : GCCBuiltin<"__builtin_ia32_pshufb128">,
657              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
658                         llvm_v16i8_ty], [IntrNoMem]>;
659  def int_x86_sse_pshuf_w           : GCCBuiltin<"__builtin_ia32_pshufw">,
660              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_i8_ty],
661                         [IntrNoMem]>;
662}
663
664// Sign ops
665let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
666  def int_x86_ssse3_psign_b         : GCCBuiltin<"__builtin_ia32_psignb">,
667              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
668                         llvm_x86mmx_ty], [IntrNoMem]>;
669  def int_x86_ssse3_psign_b_128     : GCCBuiltin<"__builtin_ia32_psignb128">,
670              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
671                         llvm_v16i8_ty], [IntrNoMem]>;
672
673  def int_x86_ssse3_psign_w         : GCCBuiltin<"__builtin_ia32_psignw">,
674              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
675                         llvm_x86mmx_ty], [IntrNoMem]>;
676  def int_x86_ssse3_psign_w_128     : GCCBuiltin<"__builtin_ia32_psignw128">,
677              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
678                         llvm_v8i16_ty], [IntrNoMem]>;
679
680  def int_x86_ssse3_psign_d         : GCCBuiltin<"__builtin_ia32_psignd">,
681              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
682                         llvm_x86mmx_ty], [IntrNoMem]>;
683  def int_x86_ssse3_psign_d_128     : GCCBuiltin<"__builtin_ia32_psignd128">,
684              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
685                         llvm_v4i32_ty], [IntrNoMem]>;
686}
687
688// Absolute value ops
689let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
690  def int_x86_ssse3_pabs_b     : GCCBuiltin<"__builtin_ia32_pabsb">,
691              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
692  def int_x86_ssse3_pabs_b_128 : GCCBuiltin<"__builtin_ia32_pabsb128">,
693              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
694
695  def int_x86_ssse3_pabs_w     : GCCBuiltin<"__builtin_ia32_pabsw">,
696              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
697  def int_x86_ssse3_pabs_w_128 : GCCBuiltin<"__builtin_ia32_pabsw128">,
698              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty], [IntrNoMem]>;
699
700  def int_x86_ssse3_pabs_d     : GCCBuiltin<"__builtin_ia32_pabsd">,
701              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
702  def int_x86_ssse3_pabs_d_128 : GCCBuiltin<"__builtin_ia32_pabsd128">,
703              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty], [IntrNoMem]>;
704}
705
706//===----------------------------------------------------------------------===//
707// SSE4.1
708
709// FP rounding ops
710let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
711  def int_x86_sse41_round_ss        : GCCBuiltin<"__builtin_ia32_roundss">,
712              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
713                         llvm_i32_ty], [IntrNoMem]>;
714  def int_x86_sse41_round_ps        : GCCBuiltin<"__builtin_ia32_roundps">,
715              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
716                         llvm_i32_ty], [IntrNoMem]>;
717  def int_x86_sse41_round_sd        : GCCBuiltin<"__builtin_ia32_roundsd">,
718              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
719                         llvm_i32_ty], [IntrNoMem]>;
720  def int_x86_sse41_round_pd        : GCCBuiltin<"__builtin_ia32_roundpd">,
721              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
722                         llvm_i32_ty], [IntrNoMem]>;
723}
724
725// Vector sign and zero extend
726let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
727  def int_x86_sse41_pmovsxbd        : GCCBuiltin<"__builtin_ia32_pmovsxbd128">,
728              Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty],
729                        [IntrNoMem]>;
730  def int_x86_sse41_pmovsxbq        : GCCBuiltin<"__builtin_ia32_pmovsxbq128">,
731              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty],
732                        [IntrNoMem]>;
733  def int_x86_sse41_pmovsxbw        : GCCBuiltin<"__builtin_ia32_pmovsxbw128">,
734              Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty],
735                        [IntrNoMem]>;
736  def int_x86_sse41_pmovsxdq        : GCCBuiltin<"__builtin_ia32_pmovsxdq128">,
737              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty],
738                        [IntrNoMem]>;
739  def int_x86_sse41_pmovsxwd        : GCCBuiltin<"__builtin_ia32_pmovsxwd128">,
740              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty],
741                        [IntrNoMem]>;
742  def int_x86_sse41_pmovsxwq        : GCCBuiltin<"__builtin_ia32_pmovsxwq128">,
743              Intrinsic<[llvm_v2i64_ty], [llvm_v8i16_ty],
744                        [IntrNoMem]>;
745  def int_x86_sse41_pmovzxbd        : GCCBuiltin<"__builtin_ia32_pmovzxbd128">,
746              Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty],
747                        [IntrNoMem]>;
748  def int_x86_sse41_pmovzxbq        : GCCBuiltin<"__builtin_ia32_pmovzxbq128">,
749              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty],
750                        [IntrNoMem]>;
751  def int_x86_sse41_pmovzxbw        : GCCBuiltin<"__builtin_ia32_pmovzxbw128">,
752              Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty],
753                        [IntrNoMem]>;
754  def int_x86_sse41_pmovzxdq        : GCCBuiltin<"__builtin_ia32_pmovzxdq128">,
755              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty],
756                        [IntrNoMem]>;
757  def int_x86_sse41_pmovzxwd        : GCCBuiltin<"__builtin_ia32_pmovzxwd128">,
758              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty],
759                        [IntrNoMem]>;
760  def int_x86_sse41_pmovzxwq        : GCCBuiltin<"__builtin_ia32_pmovzxwq128">,
761              Intrinsic<[llvm_v2i64_ty], [llvm_v8i16_ty],
762                        [IntrNoMem]>;
763}
764
765// Vector min element
766let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
767  def int_x86_sse41_phminposuw     : GCCBuiltin<"__builtin_ia32_phminposuw128">,
768              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty],
769                        [IntrNoMem]>;
770}
771
772// Vector compare, min, max
773let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
774  def int_x86_sse41_pmaxsb          : GCCBuiltin<"__builtin_ia32_pmaxsb128">,
775              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
776                        [IntrNoMem, Commutative]>;
777  def int_x86_sse41_pmaxsd          : GCCBuiltin<"__builtin_ia32_pmaxsd128">,
778              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
779                        [IntrNoMem, Commutative]>;
780  def int_x86_sse41_pmaxud          : GCCBuiltin<"__builtin_ia32_pmaxud128">,
781              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
782                        [IntrNoMem, Commutative]>;
783  def int_x86_sse41_pmaxuw          : GCCBuiltin<"__builtin_ia32_pmaxuw128">,
784              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
785                        [IntrNoMem, Commutative]>;
786  def int_x86_sse41_pminsb          : GCCBuiltin<"__builtin_ia32_pminsb128">,
787              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
788                        [IntrNoMem, Commutative]>;
789  def int_x86_sse41_pminsd          : GCCBuiltin<"__builtin_ia32_pminsd128">,
790              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
791                        [IntrNoMem, Commutative]>;
792  def int_x86_sse41_pminud          : GCCBuiltin<"__builtin_ia32_pminud128">,
793              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
794                        [IntrNoMem, Commutative]>;
795  def int_x86_sse41_pminuw          : GCCBuiltin<"__builtin_ia32_pminuw128">,
796              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
797                        [IntrNoMem, Commutative]>;
798}
799
800// Advanced Encryption Standard (AES) Instructions
801let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
802  def int_x86_aesni_aesimc          : GCCBuiltin<"__builtin_ia32_aesimc128">,
803              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty],
804                        [IntrNoMem]>;
805  def int_x86_aesni_aesenc          : GCCBuiltin<"__builtin_ia32_aesenc128">,
806              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
807                        [IntrNoMem]>;
808  def int_x86_aesni_aesenclast : GCCBuiltin<"__builtin_ia32_aesenclast128">,
809              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
810                        [IntrNoMem]>;
811  def int_x86_aesni_aesdec          : GCCBuiltin<"__builtin_ia32_aesdec128">,
812              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
813                        [IntrNoMem]>;
814  def int_x86_aesni_aesdeclast : GCCBuiltin<"__builtin_ia32_aesdeclast128">,
815              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
816                        [IntrNoMem]>;
817  def int_x86_aesni_aeskeygenassist :
818              GCCBuiltin<"__builtin_ia32_aeskeygenassist128">,
819              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_i8_ty],
820                        [IntrNoMem]>;
821}
822
823// PCLMUL instruction
824let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
825  def int_x86_pclmulqdq : GCCBuiltin<"__builtin_ia32_pclmulqdq128">,
826          Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty, llvm_i8_ty],
827                    [IntrNoMem]>;
828}
829
830// Vector pack
831let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
832  def int_x86_sse41_packusdw        : GCCBuiltin<"__builtin_ia32_packusdw128">,
833              Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
834                        [IntrNoMem]>;
835}
836
837// Vector multiply
838let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
839  def int_x86_sse41_pmuldq          : GCCBuiltin<"__builtin_ia32_pmuldq128">,
840              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
841                        [IntrNoMem, Commutative]>;
842}
843
844// Vector extract
845let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
846  def int_x86_sse41_pextrb         :
847              Intrinsic<[llvm_i32_ty], [llvm_v16i8_ty, llvm_i32_ty],
848                        [IntrNoMem]>;
849  def int_x86_sse41_pextrd         :
850              Intrinsic<[llvm_i32_ty], [llvm_v4i32_ty, llvm_i32_ty],
851                        [IntrNoMem]>;
852  def int_x86_sse41_pextrq         :
853              Intrinsic<[llvm_i64_ty], [llvm_v2i64_ty, llvm_i32_ty],
854                        [IntrNoMem]>;
855  def int_x86_sse41_extractps      : GCCBuiltin<"__builtin_ia32_extractps128">,
856              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty, llvm_i32_ty],
857                        [IntrNoMem]>;
858}
859
860// Vector insert
861let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
862  def int_x86_sse41_insertps       : GCCBuiltin<"__builtin_ia32_insertps128">,
863          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,llvm_i32_ty],
864                    [IntrNoMem]>;
865}
866
867// Vector blend
868let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
869  def int_x86_sse41_pblendvb         : GCCBuiltin<"__builtin_ia32_pblendvb128">,
870        Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,llvm_v16i8_ty],
871                  [IntrNoMem]>;
872  def int_x86_sse41_pblendw          : GCCBuiltin<"__builtin_ia32_pblendw128">,
873        Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty, llvm_i32_ty],
874                  [IntrNoMem]>;
875  def int_x86_sse41_blendpd          : GCCBuiltin<"__builtin_ia32_blendpd">,
876        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty, llvm_i32_ty],
877                  [IntrNoMem]>;
878  def int_x86_sse41_blendps          : GCCBuiltin<"__builtin_ia32_blendps">,
879        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_i32_ty],
880                  [IntrNoMem]>;
881  def int_x86_sse41_blendvpd         : GCCBuiltin<"__builtin_ia32_blendvpd">,
882        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,llvm_v2f64_ty],
883                  [IntrNoMem]>;
884  def int_x86_sse41_blendvps         : GCCBuiltin<"__builtin_ia32_blendvps">,
885        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,llvm_v4f32_ty],
886                  [IntrNoMem]>;
887}
888
889// Vector dot product
890let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
891  def int_x86_sse41_dppd            : GCCBuiltin<"__builtin_ia32_dppd">,
892          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,llvm_i32_ty],
893                    [IntrNoMem, Commutative]>;
894  def int_x86_sse41_dpps            : GCCBuiltin<"__builtin_ia32_dpps">,
895          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,llvm_i32_ty],
896                    [IntrNoMem, Commutative]>;
897}
898
899// Vector sum of absolute differences
900let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
901  def int_x86_sse41_mpsadbw         : GCCBuiltin<"__builtin_ia32_mpsadbw128">,
902          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty,llvm_i32_ty],
903                    [IntrNoMem, Commutative]>;
904}
905
906// Cacheability support ops
907let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
908  def int_x86_sse41_movntdqa        : GCCBuiltin<"__builtin_ia32_movntdqa">,
909          Intrinsic<[llvm_v2i64_ty], [llvm_ptr_ty], [IntrReadMem]>;
910}
911
912// Test instruction with bitwise comparison.
913let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
914  def int_x86_sse41_ptestz          : GCCBuiltin<"__builtin_ia32_ptestz128">,
915          Intrinsic<[llvm_i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
916                    [IntrNoMem]>;
917  def int_x86_sse41_ptestc          : GCCBuiltin<"__builtin_ia32_ptestc128">,
918          Intrinsic<[llvm_i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
919                    [IntrNoMem]>;
920  def int_x86_sse41_ptestnzc        : GCCBuiltin<"__builtin_ia32_ptestnzc128">,
921          Intrinsic<[llvm_i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
922                    [IntrNoMem]>;
923}
924
925//===----------------------------------------------------------------------===//
926// SSE4.2
927
928// Miscellaneous
929// CRC Instruction
930let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
931  def int_x86_sse42_crc32_32_8       : GCCBuiltin<"__builtin_ia32_crc32qi">,
932          Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i8_ty],
933                    [IntrNoMem]>;
934  def int_x86_sse42_crc32_32_16      : GCCBuiltin<"__builtin_ia32_crc32hi">,
935          Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i16_ty],
936                    [IntrNoMem]>;
937  def int_x86_sse42_crc32_32_32      : GCCBuiltin<"__builtin_ia32_crc32si">,
938          Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
939                    [IntrNoMem]>;
940  def int_x86_sse42_crc32_64_64      : GCCBuiltin<"__builtin_ia32_crc32di">,
941          Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
942                    [IntrNoMem]>;
943}
944
945// String/text processing ops.
946let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
947  def int_x86_sse42_pcmpistrm128  : GCCBuiltin<"__builtin_ia32_pcmpistrm128">,
948    Intrinsic<[llvm_v16i8_ty],
949        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
950        [IntrNoMem]>;
951  def int_x86_sse42_pcmpistri128  : GCCBuiltin<"__builtin_ia32_pcmpistri128">,
952    Intrinsic<[llvm_i32_ty],
953        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
954        [IntrNoMem]>;
955  def int_x86_sse42_pcmpistria128 : GCCBuiltin<"__builtin_ia32_pcmpistria128">,
956    Intrinsic<[llvm_i32_ty],
957        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
958        [IntrNoMem]>;
959  def int_x86_sse42_pcmpistric128 : GCCBuiltin<"__builtin_ia32_pcmpistric128">,
960    Intrinsic<[llvm_i32_ty],
961        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
962        [IntrNoMem]>;
963  def int_x86_sse42_pcmpistrio128 : GCCBuiltin<"__builtin_ia32_pcmpistrio128">,
964    Intrinsic<[llvm_i32_ty],
965        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
966        [IntrNoMem]>;
967  def int_x86_sse42_pcmpistris128 : GCCBuiltin<"__builtin_ia32_pcmpistris128">,
968    Intrinsic<[llvm_i32_ty],
969        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
970        [IntrNoMem]>;
971  def int_x86_sse42_pcmpistriz128 : GCCBuiltin<"__builtin_ia32_pcmpistriz128">,
972    Intrinsic<[llvm_i32_ty],
973        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
974        [IntrNoMem]>;
975  def int_x86_sse42_pcmpestrm128  : GCCBuiltin<"__builtin_ia32_pcmpestrm128">,
976    Intrinsic<[llvm_v16i8_ty],
977        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
978         llvm_i8_ty],
979        [IntrNoMem]>;
980  def int_x86_sse42_pcmpestri128  : GCCBuiltin<"__builtin_ia32_pcmpestri128">,
981    Intrinsic<[llvm_i32_ty],
982        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
983         llvm_i8_ty],
984        [IntrNoMem]>;
985  def int_x86_sse42_pcmpestria128 : GCCBuiltin<"__builtin_ia32_pcmpestria128">,
986    Intrinsic<[llvm_i32_ty],
987        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
988         llvm_i8_ty],
989        [IntrNoMem]>;
990  def int_x86_sse42_pcmpestric128 : GCCBuiltin<"__builtin_ia32_pcmpestric128">,
991    Intrinsic<[llvm_i32_ty],
992        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
993         llvm_i8_ty],
994        [IntrNoMem]>;
995  def int_x86_sse42_pcmpestrio128 : GCCBuiltin<"__builtin_ia32_pcmpestrio128">,
996    Intrinsic<[llvm_i32_ty],
997        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
998         llvm_i8_ty],
999        [IntrNoMem]>;
1000  def int_x86_sse42_pcmpestris128 : GCCBuiltin<"__builtin_ia32_pcmpestris128">,
1001    Intrinsic<[llvm_i32_ty],
1002        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
1003         llvm_i8_ty],
1004        [IntrNoMem]>;
1005  def int_x86_sse42_pcmpestriz128 : GCCBuiltin<"__builtin_ia32_pcmpestriz128">,
1006    Intrinsic<[llvm_i32_ty],
1007        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
1008         llvm_i8_ty],
1009        [IntrNoMem]>;
1010}
1011
1012//===----------------------------------------------------------------------===//
1013// SSE4A
1014
1015let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1016  def int_x86_sse4a_extrqi : GCCBuiltin<"__builtin_ia32_extrqi">,
1017    Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_i8_ty, llvm_i8_ty],
1018              [IntrNoMem]>;
1019  def int_x86_sse4a_extrq  : GCCBuiltin<"__builtin_ia32_extrq">,
1020    Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v16i8_ty], [IntrNoMem]>;
1021
1022  def int_x86_sse4a_insertqi : GCCBuiltin<"__builtin_ia32_insertqi">,
1023    Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
1024                                llvm_i8_ty, llvm_i8_ty], [IntrNoMem]>;
1025  def int_x86_sse4a_insertq  : GCCBuiltin<"__builtin_ia32_insertq">,
1026    Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty], [IntrNoMem]>;
1027
1028  def int_x86_sse4a_movnt_ss : GCCBuiltin<"__builtin_ia32_movntss">,
1029    Intrinsic<[], [llvm_ptr_ty, llvm_v4f32_ty], []>;
1030  def int_x86_sse4a_movnt_sd : GCCBuiltin<"__builtin_ia32_movntsd">,
1031    Intrinsic<[], [llvm_ptr_ty, llvm_v2f64_ty], []>;
1032}
1033
1034//===----------------------------------------------------------------------===//
1035// AVX
1036
1037// Arithmetic ops
1038let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1039  def int_x86_avx_addsub_pd_256 : GCCBuiltin<"__builtin_ia32_addsubpd256">,
1040        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1041                  llvm_v4f64_ty], [IntrNoMem]>;
1042  def int_x86_avx_addsub_ps_256 : GCCBuiltin<"__builtin_ia32_addsubps256">,
1043        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1044                  llvm_v8f32_ty], [IntrNoMem]>;
1045  def int_x86_avx_max_pd_256 : GCCBuiltin<"__builtin_ia32_maxpd256">,
1046        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1047                  llvm_v4f64_ty], [IntrNoMem]>;
1048  def int_x86_avx_max_ps_256 : GCCBuiltin<"__builtin_ia32_maxps256">,
1049        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1050                  llvm_v8f32_ty], [IntrNoMem]>;
1051  def int_x86_avx_min_pd_256 : GCCBuiltin<"__builtin_ia32_minpd256">,
1052        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1053                  llvm_v4f64_ty], [IntrNoMem]>;
1054  def int_x86_avx_min_ps_256 : GCCBuiltin<"__builtin_ia32_minps256">,
1055        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1056                  llvm_v8f32_ty], [IntrNoMem]>;
1057
1058  def int_x86_avx_sqrt_pd_256 : GCCBuiltin<"__builtin_ia32_sqrtpd256">,
1059        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1060  def int_x86_avx_sqrt_ps_256 : GCCBuiltin<"__builtin_ia32_sqrtps256">,
1061        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1062
1063  def int_x86_avx_rsqrt_ps_256 : GCCBuiltin<"__builtin_ia32_rsqrtps256">,
1064        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1065
1066  def int_x86_avx_rcp_ps_256 : GCCBuiltin<"__builtin_ia32_rcpps256">,
1067        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1068
1069  def int_x86_avx_round_pd_256 : GCCBuiltin<"__builtin_ia32_roundpd256">,
1070        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1071                  llvm_i32_ty], [IntrNoMem]>;
1072  def int_x86_avx_round_ps_256 : GCCBuiltin<"__builtin_ia32_roundps256">,
1073        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1074                  llvm_i32_ty], [IntrNoMem]>;
1075}
1076
1077// Horizontal ops
1078let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1079  def int_x86_avx_hadd_pd_256 : GCCBuiltin<"__builtin_ia32_haddpd256">,
1080        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1081                  llvm_v4f64_ty], [IntrNoMem]>;
1082  def int_x86_avx_hsub_ps_256 : GCCBuiltin<"__builtin_ia32_hsubps256">,
1083        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1084                  llvm_v8f32_ty], [IntrNoMem]>;
1085  def int_x86_avx_hsub_pd_256 : GCCBuiltin<"__builtin_ia32_hsubpd256">,
1086        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1087                  llvm_v4f64_ty], [IntrNoMem]>;
1088  def int_x86_avx_hadd_ps_256 : GCCBuiltin<"__builtin_ia32_haddps256">,
1089        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1090                  llvm_v8f32_ty], [IntrNoMem]>;
1091}
1092
1093// Vector permutation
1094let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1095  def int_x86_avx_vpermilvar_pd : GCCBuiltin<"__builtin_ia32_vpermilvarpd">,
1096        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
1097                  llvm_v2i64_ty], [IntrNoMem]>;
1098  def int_x86_avx_vpermilvar_ps : GCCBuiltin<"__builtin_ia32_vpermilvarps">,
1099        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
1100                  llvm_v4i32_ty], [IntrNoMem]>;
1101
1102  def int_x86_avx_vpermilvar_pd_256 :
1103        GCCBuiltin<"__builtin_ia32_vpermilvarpd256">,
1104        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4i64_ty], [IntrNoMem]>;
1105  def int_x86_avx_vpermilvar_ps_256 :
1106        GCCBuiltin<"__builtin_ia32_vpermilvarps256">,
1107        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8i32_ty], [IntrNoMem]>;
1108
1109  def int_x86_avx_vperm2f128_pd_256 :
1110        GCCBuiltin<"__builtin_ia32_vperm2f128_pd256">,
1111        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1112                  llvm_v4f64_ty, llvm_i8_ty], [IntrNoMem]>;
1113  def int_x86_avx_vperm2f128_ps_256 :
1114        GCCBuiltin<"__builtin_ia32_vperm2f128_ps256">,
1115        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1116                  llvm_v8f32_ty, llvm_i8_ty], [IntrNoMem]>;
1117  def int_x86_avx_vperm2f128_si_256 :
1118        GCCBuiltin<"__builtin_ia32_vperm2f128_si256">,
1119        Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1120                  llvm_v8i32_ty, llvm_i8_ty], [IntrNoMem]>;
1121}
1122
1123// Vector blend
1124let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1125  def int_x86_avx_blend_pd_256 : GCCBuiltin<"__builtin_ia32_blendpd256">,
1126        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1127                  llvm_v4f64_ty, llvm_i32_ty], [IntrNoMem]>;
1128  def int_x86_avx_blend_ps_256 : GCCBuiltin<"__builtin_ia32_blendps256">,
1129        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1130                  llvm_v8f32_ty, llvm_i32_ty], [IntrNoMem]>;
1131  def int_x86_avx_blendv_pd_256 : GCCBuiltin<"__builtin_ia32_blendvpd256">,
1132        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1133                  llvm_v4f64_ty, llvm_v4f64_ty], [IntrNoMem]>;
1134  def int_x86_avx_blendv_ps_256 : GCCBuiltin<"__builtin_ia32_blendvps256">,
1135        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1136                  llvm_v8f32_ty, llvm_v8f32_ty], [IntrNoMem]>;
1137}
1138
1139// Vector dot product
1140let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1141  def int_x86_avx_dp_ps_256 : GCCBuiltin<"__builtin_ia32_dpps256">,
1142        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1143                  llvm_v8f32_ty, llvm_i32_ty], [IntrNoMem]>;
1144}
1145
1146// Vector compare
1147let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1148  def int_x86_avx_cmp_pd_256 : GCCBuiltin<"__builtin_ia32_cmppd256">,
1149        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1150                  llvm_v4f64_ty, llvm_i8_ty], [IntrNoMem]>;
1151  def int_x86_avx_cmp_ps_256 : GCCBuiltin<"__builtin_ia32_cmpps256">,
1152        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1153                  llvm_v8f32_ty, llvm_i8_ty], [IntrNoMem]>;
1154}
1155
1156// Vector extract and insert
1157let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1158  def int_x86_avx_vextractf128_pd_256 :
1159        GCCBuiltin<"__builtin_ia32_vextractf128_pd256">,
1160        Intrinsic<[llvm_v2f64_ty], [llvm_v4f64_ty, llvm_i8_ty], [IntrNoMem]>;
1161  def int_x86_avx_vextractf128_ps_256 :
1162        GCCBuiltin<"__builtin_ia32_vextractf128_ps256">,
1163        Intrinsic<[llvm_v4f32_ty], [llvm_v8f32_ty, llvm_i8_ty], [IntrNoMem]>;
1164  def int_x86_avx_vextractf128_si_256 :
1165        GCCBuiltin<"__builtin_ia32_vextractf128_si256">,
1166        Intrinsic<[llvm_v4i32_ty], [llvm_v8i32_ty, llvm_i8_ty], [IntrNoMem]>;
1167
1168  def int_x86_avx_vinsertf128_pd_256 :
1169        GCCBuiltin<"__builtin_ia32_vinsertf128_pd256">,
1170        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1171                  llvm_v2f64_ty, llvm_i8_ty], [IntrNoMem]>;
1172  def int_x86_avx_vinsertf128_ps_256 :
1173        GCCBuiltin<"__builtin_ia32_vinsertf128_ps256">,
1174        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1175                  llvm_v4f32_ty, llvm_i8_ty], [IntrNoMem]>;
1176  def int_x86_avx_vinsertf128_si_256 :
1177        GCCBuiltin<"__builtin_ia32_vinsertf128_si256">,
1178        Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1179                  llvm_v4i32_ty, llvm_i8_ty], [IntrNoMem]>;
1180}
1181
1182// Vector convert
1183let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1184  def int_x86_avx_cvtdq2_pd_256 : GCCBuiltin<"__builtin_ia32_cvtdq2pd256">,
1185        Intrinsic<[llvm_v4f64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
1186  def int_x86_avx_cvtdq2_ps_256 : GCCBuiltin<"__builtin_ia32_cvtdq2ps256">,
1187        Intrinsic<[llvm_v8f32_ty], [llvm_v8i32_ty], [IntrNoMem]>;
1188  def int_x86_avx_cvt_pd2_ps_256 : GCCBuiltin<"__builtin_ia32_cvtpd2ps256">,
1189        Intrinsic<[llvm_v4f32_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1190  def int_x86_avx_cvt_ps2dq_256 : GCCBuiltin<"__builtin_ia32_cvtps2dq256">,
1191        Intrinsic<[llvm_v8i32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1192  def int_x86_avx_cvt_ps2_pd_256 : GCCBuiltin<"__builtin_ia32_cvtps2pd256">,
1193        Intrinsic<[llvm_v4f64_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1194  def int_x86_avx_cvtt_pd2dq_256 : GCCBuiltin<"__builtin_ia32_cvttpd2dq256">,
1195        Intrinsic<[llvm_v4i32_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1196  def int_x86_avx_cvt_pd2dq_256 : GCCBuiltin<"__builtin_ia32_cvtpd2dq256">,
1197        Intrinsic<[llvm_v4i32_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1198  def int_x86_avx_cvtt_ps2dq_256 : GCCBuiltin<"__builtin_ia32_cvttps2dq256">,
1199        Intrinsic<[llvm_v8i32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1200}
1201
1202// Vector bit test
1203let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1204  def int_x86_avx_vtestz_pd : GCCBuiltin<"__builtin_ia32_vtestzpd">,
1205        Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
1206                  llvm_v2f64_ty], [IntrNoMem]>;
1207  def int_x86_avx_vtestc_pd : GCCBuiltin<"__builtin_ia32_vtestcpd">,
1208        Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
1209                  llvm_v2f64_ty], [IntrNoMem]>;
1210  def int_x86_avx_vtestnzc_pd : GCCBuiltin<"__builtin_ia32_vtestnzcpd">,
1211        Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
1212                  llvm_v2f64_ty], [IntrNoMem]>;
1213  def int_x86_avx_vtestz_ps : GCCBuiltin<"__builtin_ia32_vtestzps">,
1214        Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
1215                  llvm_v4f32_ty], [IntrNoMem]>;
1216  def int_x86_avx_vtestc_ps : GCCBuiltin<"__builtin_ia32_vtestcps">,
1217        Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
1218                  llvm_v4f32_ty], [IntrNoMem]>;
1219  def int_x86_avx_vtestnzc_ps : GCCBuiltin<"__builtin_ia32_vtestnzcps">,
1220        Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
1221                  llvm_v4f32_ty], [IntrNoMem]>;
1222  def int_x86_avx_vtestz_pd_256 : GCCBuiltin<"__builtin_ia32_vtestzpd256">,
1223        Intrinsic<[llvm_i32_ty], [llvm_v4f64_ty,
1224                  llvm_v4f64_ty], [IntrNoMem]>;
1225  def int_x86_avx_vtestc_pd_256 : GCCBuiltin<"__builtin_ia32_vtestcpd256">,
1226        Intrinsic<[llvm_i32_ty], [llvm_v4f64_ty,
1227                  llvm_v4f64_ty], [IntrNoMem]>;
1228  def int_x86_avx_vtestnzc_pd_256 : GCCBuiltin<"__builtin_ia32_vtestnzcpd256">,
1229        Intrinsic<[llvm_i32_ty], [llvm_v4f64_ty,
1230                  llvm_v4f64_ty], [IntrNoMem]>;
1231  def int_x86_avx_vtestz_ps_256 : GCCBuiltin<"__builtin_ia32_vtestzps256">,
1232        Intrinsic<[llvm_i32_ty], [llvm_v8f32_ty,
1233                  llvm_v8f32_ty], [IntrNoMem]>;
1234  def int_x86_avx_vtestc_ps_256 : GCCBuiltin<"__builtin_ia32_vtestcps256">,
1235        Intrinsic<[llvm_i32_ty], [llvm_v8f32_ty,
1236                  llvm_v8f32_ty], [IntrNoMem]>;
1237  def int_x86_avx_vtestnzc_ps_256 : GCCBuiltin<"__builtin_ia32_vtestnzcps256">,
1238        Intrinsic<[llvm_i32_ty], [llvm_v8f32_ty,
1239                  llvm_v8f32_ty], [IntrNoMem]>;
1240  def int_x86_avx_ptestz_256 : GCCBuiltin<"__builtin_ia32_ptestz256">,
1241        Intrinsic<[llvm_i32_ty], [llvm_v4i64_ty,
1242                  llvm_v4i64_ty], [IntrNoMem]>;
1243  def int_x86_avx_ptestc_256 : GCCBuiltin<"__builtin_ia32_ptestc256">,
1244        Intrinsic<[llvm_i32_ty], [llvm_v4i64_ty,
1245                  llvm_v4i64_ty], [IntrNoMem]>;
1246  def int_x86_avx_ptestnzc_256 : GCCBuiltin<"__builtin_ia32_ptestnzc256">,
1247        Intrinsic<[llvm_i32_ty], [llvm_v4i64_ty,
1248                  llvm_v4i64_ty], [IntrNoMem]>;
1249}
1250
1251// Vector extract sign mask
1252let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1253  def int_x86_avx_movmsk_pd_256 : GCCBuiltin<"__builtin_ia32_movmskpd256">,
1254        Intrinsic<[llvm_i32_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1255  def int_x86_avx_movmsk_ps_256 : GCCBuiltin<"__builtin_ia32_movmskps256">,
1256        Intrinsic<[llvm_i32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1257}
1258
1259// Vector zero
1260let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1261  def int_x86_avx_vzeroall : GCCBuiltin<"__builtin_ia32_vzeroall">,
1262        Intrinsic<[], [], []>;
1263  def int_x86_avx_vzeroupper : GCCBuiltin<"__builtin_ia32_vzeroupper">,
1264        Intrinsic<[], [], []>;
1265}
1266
1267// Vector load with broadcast
1268let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1269  def int_x86_avx_vbroadcast_ss :
1270        GCCBuiltin<"__builtin_ia32_vbroadcastss">,
1271        Intrinsic<[llvm_v4f32_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
1272  def int_x86_avx_vbroadcast_sd_256 :
1273        GCCBuiltin<"__builtin_ia32_vbroadcastsd256">,
1274        Intrinsic<[llvm_v4f64_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
1275  def int_x86_avx_vbroadcast_ss_256 :
1276        GCCBuiltin<"__builtin_ia32_vbroadcastss256">,
1277        Intrinsic<[llvm_v8f32_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
1278  def int_x86_avx_vbroadcastf128_pd_256 :
1279        GCCBuiltin<"__builtin_ia32_vbroadcastf128_pd256">,
1280        Intrinsic<[llvm_v4f64_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
1281  def int_x86_avx_vbroadcastf128_ps_256 :
1282        GCCBuiltin<"__builtin_ia32_vbroadcastf128_ps256">,
1283        Intrinsic<[llvm_v8f32_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
1284}
1285
1286// SIMD load ops
1287let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1288  def int_x86_avx_ldu_dq_256 : GCCBuiltin<"__builtin_ia32_lddqu256">,
1289        Intrinsic<[llvm_v32i8_ty], [llvm_ptr_ty], [IntrReadMem]>;
1290}
1291
1292// SIMD store ops
1293let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1294  def int_x86_avx_storeu_pd_256 : GCCBuiltin<"__builtin_ia32_storeupd256">,
1295        Intrinsic<[], [llvm_ptr_ty, llvm_v4f64_ty], [IntrReadWriteArgMem]>;
1296  def int_x86_avx_storeu_ps_256 : GCCBuiltin<"__builtin_ia32_storeups256">,
1297        Intrinsic<[], [llvm_ptr_ty, llvm_v8f32_ty], [IntrReadWriteArgMem]>;
1298  def int_x86_avx_storeu_dq_256 : GCCBuiltin<"__builtin_ia32_storedqu256">,
1299        Intrinsic<[], [llvm_ptr_ty, llvm_v32i8_ty], [IntrReadWriteArgMem]>;
1300}
1301
1302// Conditional load ops
1303let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1304  def int_x86_avx_maskload_pd : GCCBuiltin<"__builtin_ia32_maskloadpd">,
1305        Intrinsic<[llvm_v2f64_ty], [llvm_ptr_ty, llvm_v2f64_ty],
1306                  [IntrReadArgMem]>;
1307  def int_x86_avx_maskload_ps : GCCBuiltin<"__builtin_ia32_maskloadps">,
1308        Intrinsic<[llvm_v4f32_ty], [llvm_ptr_ty, llvm_v4f32_ty],
1309                  [IntrReadArgMem]>;
1310  def int_x86_avx_maskload_pd_256 : GCCBuiltin<"__builtin_ia32_maskloadpd256">,
1311        Intrinsic<[llvm_v4f64_ty], [llvm_ptr_ty, llvm_v4f64_ty],
1312                  [IntrReadArgMem]>;
1313  def int_x86_avx_maskload_ps_256 : GCCBuiltin<"__builtin_ia32_maskloadps256">,
1314        Intrinsic<[llvm_v8f32_ty], [llvm_ptr_ty, llvm_v8f32_ty],
1315                  [IntrReadArgMem]>;
1316}
1317
1318// Conditional store ops
1319let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1320  def int_x86_avx_maskstore_pd : GCCBuiltin<"__builtin_ia32_maskstorepd">,
1321        Intrinsic<[], [llvm_ptr_ty,
1322                  llvm_v2f64_ty, llvm_v2f64_ty], [IntrReadWriteArgMem]>;
1323  def int_x86_avx_maskstore_ps : GCCBuiltin<"__builtin_ia32_maskstoreps">,
1324        Intrinsic<[], [llvm_ptr_ty,
1325                  llvm_v4f32_ty, llvm_v4f32_ty], [IntrReadWriteArgMem]>;
1326  def int_x86_avx_maskstore_pd_256 :
1327        GCCBuiltin<"__builtin_ia32_maskstorepd256">,
1328        Intrinsic<[], [llvm_ptr_ty,
1329                  llvm_v4f64_ty, llvm_v4f64_ty], [IntrReadWriteArgMem]>;
1330  def int_x86_avx_maskstore_ps_256 :
1331        GCCBuiltin<"__builtin_ia32_maskstoreps256">,
1332        Intrinsic<[], [llvm_ptr_ty,
1333                  llvm_v8f32_ty, llvm_v8f32_ty], [IntrReadWriteArgMem]>;
1334}
1335
1336//===----------------------------------------------------------------------===//
1337// AVX2
1338
1339// Integer arithmetic ops.
1340let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1341  def int_x86_avx2_padds_b : GCCBuiltin<"__builtin_ia32_paddsb256">,
1342              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1343                         llvm_v32i8_ty], [IntrNoMem, Commutative]>;
1344  def int_x86_avx2_padds_w : GCCBuiltin<"__builtin_ia32_paddsw256">,
1345              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1346                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1347  def int_x86_avx2_paddus_b : GCCBuiltin<"__builtin_ia32_paddusb256">,
1348              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1349                         llvm_v32i8_ty], [IntrNoMem, Commutative]>;
1350  def int_x86_avx2_paddus_w : GCCBuiltin<"__builtin_ia32_paddusw256">,
1351              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1352                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1353  def int_x86_avx2_psubs_b : GCCBuiltin<"__builtin_ia32_psubsb256">,
1354              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1355                         llvm_v32i8_ty], [IntrNoMem]>;
1356  def int_x86_avx2_psubs_w : GCCBuiltin<"__builtin_ia32_psubsw256">,
1357              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1358                         llvm_v16i16_ty], [IntrNoMem]>;
1359  def int_x86_avx2_psubus_b : GCCBuiltin<"__builtin_ia32_psubusb256">,
1360              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1361                         llvm_v32i8_ty], [IntrNoMem]>;
1362  def int_x86_avx2_psubus_w : GCCBuiltin<"__builtin_ia32_psubusw256">,
1363              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1364                         llvm_v16i16_ty], [IntrNoMem]>;
1365  def int_x86_avx2_pmulhu_w : GCCBuiltin<"__builtin_ia32_pmulhuw256">,
1366              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1367                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1368  def int_x86_avx2_pmulh_w : GCCBuiltin<"__builtin_ia32_pmulhw256">,
1369              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1370                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1371  def int_x86_avx2_pmulu_dq : GCCBuiltin<"__builtin_ia32_pmuludq256">,
1372              Intrinsic<[llvm_v4i64_ty], [llvm_v8i32_ty,
1373                         llvm_v8i32_ty], [IntrNoMem, Commutative]>;
1374  def int_x86_avx2_pmul_dq : GCCBuiltin<"__builtin_ia32_pmuldq256">,
1375              Intrinsic<[llvm_v4i64_ty], [llvm_v8i32_ty,
1376                         llvm_v8i32_ty], [IntrNoMem, Commutative]>;
1377  def int_x86_avx2_pmadd_wd : GCCBuiltin<"__builtin_ia32_pmaddwd256">,
1378              Intrinsic<[llvm_v8i32_ty], [llvm_v16i16_ty,
1379                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1380  def int_x86_avx2_pavg_b : GCCBuiltin<"__builtin_ia32_pavgb256">,
1381              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1382                         llvm_v32i8_ty], [IntrNoMem, Commutative]>;
1383  def int_x86_avx2_pavg_w : GCCBuiltin<"__builtin_ia32_pavgw256">,
1384              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1385                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1386  def int_x86_avx2_psad_bw : GCCBuiltin<"__builtin_ia32_psadbw256">,
1387              Intrinsic<[llvm_v4i64_ty], [llvm_v32i8_ty,
1388                         llvm_v32i8_ty], [IntrNoMem, Commutative]>;
1389}
1390
1391// Vector min, max
1392let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1393  def int_x86_avx2_pmaxu_b : GCCBuiltin<"__builtin_ia32_pmaxub256">,
1394              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1395                         llvm_v32i8_ty], [IntrNoMem, Commutative]>;
1396  def int_x86_avx2_pmaxu_w : GCCBuiltin<"__builtin_ia32_pmaxuw256">,
1397              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1398                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1399  def int_x86_avx2_pmaxu_d : GCCBuiltin<"__builtin_ia32_pmaxud256">,
1400              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1401                         llvm_v8i32_ty], [IntrNoMem, Commutative]>;
1402  def int_x86_avx2_pmaxs_b : GCCBuiltin<"__builtin_ia32_pmaxsb256">,
1403              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1404                         llvm_v32i8_ty], [IntrNoMem, Commutative]>;
1405  def int_x86_avx2_pmaxs_w : GCCBuiltin<"__builtin_ia32_pmaxsw256">,
1406              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1407                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1408  def int_x86_avx2_pmaxs_d : GCCBuiltin<"__builtin_ia32_pmaxsd256">,
1409              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1410                         llvm_v8i32_ty], [IntrNoMem, Commutative]>;
1411  def int_x86_avx2_pminu_b : GCCBuiltin<"__builtin_ia32_pminub256">,
1412              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1413                         llvm_v32i8_ty], [IntrNoMem, Commutative]>;
1414  def int_x86_avx2_pminu_w : GCCBuiltin<"__builtin_ia32_pminuw256">,
1415              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1416                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1417  def int_x86_avx2_pminu_d : GCCBuiltin<"__builtin_ia32_pminud256">,
1418              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1419                         llvm_v8i32_ty], [IntrNoMem, Commutative]>;
1420  def int_x86_avx2_pmins_b : GCCBuiltin<"__builtin_ia32_pminsb256">,
1421              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1422                         llvm_v32i8_ty], [IntrNoMem, Commutative]>;
1423  def int_x86_avx2_pmins_w : GCCBuiltin<"__builtin_ia32_pminsw256">,
1424              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1425                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1426  def int_x86_avx2_pmins_d : GCCBuiltin<"__builtin_ia32_pminsd256">,
1427              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1428                         llvm_v8i32_ty], [IntrNoMem, Commutative]>;
1429}
1430
1431// Integer shift ops.
1432let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1433  def int_x86_avx2_psll_w : GCCBuiltin<"__builtin_ia32_psllw256">,
1434              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1435                         llvm_v8i16_ty], [IntrNoMem]>;
1436  def int_x86_avx2_psll_d : GCCBuiltin<"__builtin_ia32_pslld256">,
1437              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1438                         llvm_v4i32_ty], [IntrNoMem]>;
1439  def int_x86_avx2_psll_q : GCCBuiltin<"__builtin_ia32_psllq256">,
1440              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1441                         llvm_v2i64_ty], [IntrNoMem]>;
1442  def int_x86_avx2_psrl_w : GCCBuiltin<"__builtin_ia32_psrlw256">,
1443              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1444                         llvm_v8i16_ty], [IntrNoMem]>;
1445  def int_x86_avx2_psrl_d : GCCBuiltin<"__builtin_ia32_psrld256">,
1446              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1447                         llvm_v4i32_ty], [IntrNoMem]>;
1448  def int_x86_avx2_psrl_q : GCCBuiltin<"__builtin_ia32_psrlq256">,
1449              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1450                         llvm_v2i64_ty], [IntrNoMem]>;
1451  def int_x86_avx2_psra_w : GCCBuiltin<"__builtin_ia32_psraw256">,
1452              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1453                         llvm_v8i16_ty], [IntrNoMem]>;
1454  def int_x86_avx2_psra_d : GCCBuiltin<"__builtin_ia32_psrad256">,
1455              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1456                         llvm_v4i32_ty], [IntrNoMem]>;
1457
1458  def int_x86_avx2_pslli_w : GCCBuiltin<"__builtin_ia32_psllwi256">,
1459              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1460                         llvm_i32_ty], [IntrNoMem]>;
1461  def int_x86_avx2_pslli_d : GCCBuiltin<"__builtin_ia32_pslldi256">,
1462              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1463                         llvm_i32_ty], [IntrNoMem]>;
1464  def int_x86_avx2_pslli_q : GCCBuiltin<"__builtin_ia32_psllqi256">,
1465              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1466                         llvm_i32_ty], [IntrNoMem]>;
1467  def int_x86_avx2_psrli_w : GCCBuiltin<"__builtin_ia32_psrlwi256">,
1468              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1469                         llvm_i32_ty], [IntrNoMem]>;
1470  def int_x86_avx2_psrli_d : GCCBuiltin<"__builtin_ia32_psrldi256">,
1471              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1472                         llvm_i32_ty], [IntrNoMem]>;
1473  def int_x86_avx2_psrli_q : GCCBuiltin<"__builtin_ia32_psrlqi256">,
1474              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1475                         llvm_i32_ty], [IntrNoMem]>;
1476  def int_x86_avx2_psrai_w : GCCBuiltin<"__builtin_ia32_psrawi256">,
1477              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1478                         llvm_i32_ty], [IntrNoMem]>;
1479  def int_x86_avx2_psrai_d : GCCBuiltin<"__builtin_ia32_psradi256">,
1480              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1481                         llvm_i32_ty], [IntrNoMem]>;
1482
1483  def int_x86_avx2_psll_dq : GCCBuiltin<"__builtin_ia32_pslldqi256">,
1484              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1485                         llvm_i32_ty], [IntrNoMem]>;
1486  def int_x86_avx2_psrl_dq : GCCBuiltin<"__builtin_ia32_psrldqi256">,
1487              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1488                         llvm_i32_ty], [IntrNoMem]>;
1489  def int_x86_avx2_psll_dq_bs : GCCBuiltin<"__builtin_ia32_pslldqi256_byteshift">,
1490              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1491                         llvm_i32_ty], [IntrNoMem]>;
1492  def int_x86_avx2_psrl_dq_bs : GCCBuiltin<"__builtin_ia32_psrldqi256_byteshift">,
1493              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1494                         llvm_i32_ty], [IntrNoMem]>;
1495}
1496
1497// Pack ops.
1498let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1499  def int_x86_avx2_packsswb : GCCBuiltin<"__builtin_ia32_packsswb256">,
1500              Intrinsic<[llvm_v32i8_ty], [llvm_v16i16_ty,
1501                         llvm_v16i16_ty], [IntrNoMem]>;
1502  def int_x86_avx2_packssdw : GCCBuiltin<"__builtin_ia32_packssdw256">,
1503              Intrinsic<[llvm_v16i16_ty], [llvm_v8i32_ty,
1504                         llvm_v8i32_ty], [IntrNoMem]>;
1505  def int_x86_avx2_packuswb : GCCBuiltin<"__builtin_ia32_packuswb256">,
1506              Intrinsic<[llvm_v32i8_ty], [llvm_v16i16_ty,
1507                         llvm_v16i16_ty], [IntrNoMem]>;
1508  def int_x86_avx2_packusdw : GCCBuiltin<"__builtin_ia32_packusdw256">,
1509              Intrinsic<[llvm_v16i16_ty], [llvm_v8i32_ty,
1510                         llvm_v8i32_ty], [IntrNoMem]>;
1511}
1512
1513// Absolute value ops
1514let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1515  def int_x86_avx2_pabs_b : GCCBuiltin<"__builtin_ia32_pabsb256">,
1516              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty], [IntrNoMem]>;
1517  def int_x86_avx2_pabs_w : GCCBuiltin<"__builtin_ia32_pabsw256">,
1518              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty], [IntrNoMem]>;
1519  def int_x86_avx2_pabs_d : GCCBuiltin<"__builtin_ia32_pabsd256">,
1520              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty], [IntrNoMem]>;
1521}
1522
1523// Horizontal arithmetic ops
1524let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1525  def int_x86_avx2_phadd_w : GCCBuiltin<"__builtin_ia32_phaddw256">,
1526              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1527                         llvm_v16i16_ty], [IntrNoMem]>;
1528  def int_x86_avx2_phadd_d : GCCBuiltin<"__builtin_ia32_phaddd256">,
1529              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1530                         llvm_v8i32_ty], [IntrNoMem]>;
1531  def int_x86_avx2_phadd_sw : GCCBuiltin<"__builtin_ia32_phaddsw256">,
1532              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1533                         llvm_v16i16_ty], [IntrNoMem]>;
1534  def int_x86_avx2_phsub_w : GCCBuiltin<"__builtin_ia32_phsubw256">,
1535              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1536                         llvm_v16i16_ty], [IntrNoMem]>;
1537  def int_x86_avx2_phsub_d : GCCBuiltin<"__builtin_ia32_phsubd256">,
1538              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1539                         llvm_v8i32_ty], [IntrNoMem]>;
1540  def int_x86_avx2_phsub_sw : GCCBuiltin<"__builtin_ia32_phsubsw256">,
1541              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1542                         llvm_v16i16_ty], [IntrNoMem]>;
1543  def int_x86_avx2_pmadd_ub_sw : GCCBuiltin<"__builtin_ia32_pmaddubsw256">,
1544              Intrinsic<[llvm_v16i16_ty], [llvm_v32i8_ty,
1545                         llvm_v32i8_ty], [IntrNoMem]>;
1546}
1547
1548// Sign ops
1549let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1550  def int_x86_avx2_psign_b : GCCBuiltin<"__builtin_ia32_psignb256">,
1551              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1552                         llvm_v32i8_ty], [IntrNoMem]>;
1553  def int_x86_avx2_psign_w : GCCBuiltin<"__builtin_ia32_psignw256">,
1554              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1555                         llvm_v16i16_ty], [IntrNoMem]>;
1556  def int_x86_avx2_psign_d : GCCBuiltin<"__builtin_ia32_psignd256">,
1557              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1558                         llvm_v8i32_ty], [IntrNoMem]>;
1559}
1560
1561// Packed multiply high with round and scale
1562let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1563  def int_x86_avx2_pmul_hr_sw : GCCBuiltin<"__builtin_ia32_pmulhrsw256">,
1564              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty,
1565                         llvm_v16i16_ty], [IntrNoMem, Commutative]>;
1566}
1567
1568// Vector sign and zero extend
1569let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1570  def int_x86_avx2_pmovsxbd : GCCBuiltin<"__builtin_ia32_pmovsxbd256">,
1571              Intrinsic<[llvm_v8i32_ty], [llvm_v16i8_ty],
1572                        [IntrNoMem]>;
1573  def int_x86_avx2_pmovsxbq : GCCBuiltin<"__builtin_ia32_pmovsxbq256">,
1574              Intrinsic<[llvm_v4i64_ty], [llvm_v16i8_ty],
1575                        [IntrNoMem]>;
1576  def int_x86_avx2_pmovsxbw : GCCBuiltin<"__builtin_ia32_pmovsxbw256">,
1577              Intrinsic<[llvm_v16i16_ty], [llvm_v16i8_ty],
1578                        [IntrNoMem]>;
1579  def int_x86_avx2_pmovsxdq : GCCBuiltin<"__builtin_ia32_pmovsxdq256">,
1580              Intrinsic<[llvm_v4i64_ty], [llvm_v4i32_ty],
1581                        [IntrNoMem]>;
1582  def int_x86_avx2_pmovsxwd : GCCBuiltin<"__builtin_ia32_pmovsxwd256">,
1583              Intrinsic<[llvm_v8i32_ty], [llvm_v8i16_ty],
1584                        [IntrNoMem]>;
1585  def int_x86_avx2_pmovsxwq : GCCBuiltin<"__builtin_ia32_pmovsxwq256">,
1586              Intrinsic<[llvm_v4i64_ty], [llvm_v8i16_ty],
1587                        [IntrNoMem]>;
1588  def int_x86_avx2_pmovzxbd : GCCBuiltin<"__builtin_ia32_pmovzxbd256">,
1589              Intrinsic<[llvm_v8i32_ty], [llvm_v16i8_ty],
1590                        [IntrNoMem]>;
1591  def int_x86_avx2_pmovzxbq : GCCBuiltin<"__builtin_ia32_pmovzxbq256">,
1592              Intrinsic<[llvm_v4i64_ty], [llvm_v16i8_ty],
1593                        [IntrNoMem]>;
1594  def int_x86_avx2_pmovzxbw : GCCBuiltin<"__builtin_ia32_pmovzxbw256">,
1595              Intrinsic<[llvm_v16i16_ty], [llvm_v16i8_ty],
1596                        [IntrNoMem]>;
1597  def int_x86_avx2_pmovzxdq : GCCBuiltin<"__builtin_ia32_pmovzxdq256">,
1598              Intrinsic<[llvm_v4i64_ty], [llvm_v4i32_ty],
1599                        [IntrNoMem]>;
1600  def int_x86_avx2_pmovzxwd : GCCBuiltin<"__builtin_ia32_pmovzxwd256">,
1601              Intrinsic<[llvm_v8i32_ty], [llvm_v8i16_ty],
1602                        [IntrNoMem]>;
1603  def int_x86_avx2_pmovzxwq : GCCBuiltin<"__builtin_ia32_pmovzxwq256">,
1604              Intrinsic<[llvm_v4i64_ty], [llvm_v8i16_ty],
1605                        [IntrNoMem]>;
1606}
1607
1608// Vector blend
1609let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1610  def int_x86_avx2_pblendvb : GCCBuiltin<"__builtin_ia32_pblendvb256">,
1611              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty, llvm_v32i8_ty,
1612                         llvm_v32i8_ty], [IntrNoMem]>;
1613  def int_x86_avx2_pblendw : GCCBuiltin<"__builtin_ia32_pblendw256">,
1614              Intrinsic<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_v16i16_ty,
1615                         llvm_i32_ty], [IntrNoMem]>;
1616  def int_x86_avx2_pblendd_128 : GCCBuiltin<"__builtin_ia32_pblendd128">,
1617              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
1618                         llvm_i32_ty], [IntrNoMem]>;
1619  def int_x86_avx2_pblendd_256 : GCCBuiltin<"__builtin_ia32_pblendd256">,
1620              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty,
1621                         llvm_i32_ty], [IntrNoMem]>;
1622}
1623
1624// Vector load with broadcast
1625let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1626  def int_x86_avx2_vbroadcast_ss_ps :
1627              GCCBuiltin<"__builtin_ia32_vbroadcastss_ps">,
1628              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1629  def int_x86_avx2_vbroadcast_sd_pd_256 :
1630              GCCBuiltin<"__builtin_ia32_vbroadcastsd_pd256">,
1631              Intrinsic<[llvm_v4f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
1632  def int_x86_avx2_vbroadcast_ss_ps_256 :
1633              GCCBuiltin<"__builtin_ia32_vbroadcastss_ps256">,
1634              Intrinsic<[llvm_v8f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1635  def int_x86_avx2_vbroadcasti128 :
1636              Intrinsic<[llvm_v4i64_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
1637  def int_x86_avx2_pbroadcastb_128 :
1638              GCCBuiltin<"__builtin_ia32_pbroadcastb128">,
1639              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
1640  def int_x86_avx2_pbroadcastb_256 :
1641              GCCBuiltin<"__builtin_ia32_pbroadcastb256">,
1642              Intrinsic<[llvm_v32i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
1643  def int_x86_avx2_pbroadcastw_128 :
1644              GCCBuiltin<"__builtin_ia32_pbroadcastw128">,
1645              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty], [IntrNoMem]>;
1646  def int_x86_avx2_pbroadcastw_256 :
1647              GCCBuiltin<"__builtin_ia32_pbroadcastw256">,
1648              Intrinsic<[llvm_v16i16_ty], [llvm_v8i16_ty], [IntrNoMem]>;
1649  def int_x86_avx2_pbroadcastd_128 :
1650              GCCBuiltin<"__builtin_ia32_pbroadcastd128">,
1651              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty], [IntrNoMem]>;
1652  def int_x86_avx2_pbroadcastd_256 :
1653              GCCBuiltin<"__builtin_ia32_pbroadcastd256">,
1654              Intrinsic<[llvm_v8i32_ty], [llvm_v4i32_ty], [IntrNoMem]>;
1655  def int_x86_avx2_pbroadcastq_128 :
1656              GCCBuiltin<"__builtin_ia32_pbroadcastq128">,
1657              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty], [IntrNoMem]>;
1658  def int_x86_avx2_pbroadcastq_256 :
1659              GCCBuiltin<"__builtin_ia32_pbroadcastq256">,
1660              Intrinsic<[llvm_v4i64_ty], [llvm_v2i64_ty], [IntrNoMem]>;
1661}
1662
1663// Vector permutation
1664let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1665  def int_x86_avx2_permd : GCCBuiltin<"__builtin_ia32_permvarsi256">,
1666              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty],
1667                        [IntrNoMem]>;
1668  def int_x86_avx2_permps : GCCBuiltin<"__builtin_ia32_permvarsf256">,
1669              Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8f32_ty],
1670                        [IntrNoMem]>;
1671  def int_x86_avx2_vperm2i128 : GCCBuiltin<"__builtin_ia32_permti256">,
1672              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1673                         llvm_v4i64_ty, llvm_i8_ty], [IntrNoMem]>;
1674}
1675
1676// Vector extract and insert
1677let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1678  def int_x86_avx2_vextracti128 : GCCBuiltin<"__builtin_ia32_extract128i256">,
1679              Intrinsic<[llvm_v2i64_ty], [llvm_v4i64_ty,
1680                         llvm_i8_ty], [IntrNoMem]>;
1681  def int_x86_avx2_vinserti128 : GCCBuiltin<"__builtin_ia32_insert128i256">,
1682              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty,
1683                         llvm_v2i64_ty, llvm_i8_ty], [IntrNoMem]>;
1684}
1685
1686// Conditional load ops
1687let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1688  def int_x86_avx2_maskload_d : GCCBuiltin<"__builtin_ia32_maskloadd">,
1689        Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty, llvm_v4i32_ty],
1690                  [IntrReadArgMem]>;
1691  def int_x86_avx2_maskload_q : GCCBuiltin<"__builtin_ia32_maskloadq">,
1692        Intrinsic<[llvm_v2i64_ty], [llvm_ptr_ty, llvm_v2i64_ty],
1693                  [IntrReadArgMem]>;
1694  def int_x86_avx2_maskload_d_256 : GCCBuiltin<"__builtin_ia32_maskloadd256">,
1695        Intrinsic<[llvm_v8i32_ty], [llvm_ptr_ty, llvm_v8i32_ty],
1696                  [IntrReadArgMem]>;
1697  def int_x86_avx2_maskload_q_256 : GCCBuiltin<"__builtin_ia32_maskloadq256">,
1698        Intrinsic<[llvm_v4i64_ty], [llvm_ptr_ty, llvm_v4i64_ty],
1699                  [IntrReadArgMem]>;
1700}
1701
1702// Conditional store ops
1703let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1704  def int_x86_avx2_maskstore_d : GCCBuiltin<"__builtin_ia32_maskstored">,
1705        Intrinsic<[], [llvm_ptr_ty, llvm_v4i32_ty, llvm_v4i32_ty],
1706                  [IntrReadWriteArgMem]>;
1707  def int_x86_avx2_maskstore_q : GCCBuiltin<"__builtin_ia32_maskstoreq">,
1708        Intrinsic<[], [llvm_ptr_ty, llvm_v2i64_ty, llvm_v2i64_ty],
1709                  [IntrReadWriteArgMem]>;
1710  def int_x86_avx2_maskstore_d_256 :
1711        GCCBuiltin<"__builtin_ia32_maskstored256">,
1712        Intrinsic<[], [llvm_ptr_ty, llvm_v8i32_ty, llvm_v8i32_ty],
1713                  [IntrReadWriteArgMem]>;
1714  def int_x86_avx2_maskstore_q_256 :
1715        GCCBuiltin<"__builtin_ia32_maskstoreq256">,
1716        Intrinsic<[], [llvm_ptr_ty, llvm_v4i64_ty, llvm_v4i64_ty],
1717                  [IntrReadWriteArgMem]>;
1718}
1719
1720// Variable bit shift ops
1721let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1722  def int_x86_avx2_psllv_d : GCCBuiltin<"__builtin_ia32_psllv4si">,
1723              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1724                        [IntrNoMem]>;
1725  def int_x86_avx2_psllv_d_256 : GCCBuiltin<"__builtin_ia32_psllv8si">,
1726              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty],
1727                        [IntrNoMem]>;
1728  def int_x86_avx2_psllv_q : GCCBuiltin<"__builtin_ia32_psllv2di">,
1729              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
1730                        [IntrNoMem]>;
1731  def int_x86_avx2_psllv_q_256 : GCCBuiltin<"__builtin_ia32_psllv4di">,
1732              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty],
1733                        [IntrNoMem]>;
1734
1735  def int_x86_avx2_psrlv_d : GCCBuiltin<"__builtin_ia32_psrlv4si">,
1736              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1737                        [IntrNoMem]>;
1738  def int_x86_avx2_psrlv_d_256 : GCCBuiltin<"__builtin_ia32_psrlv8si">,
1739              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty],
1740                        [IntrNoMem]>;
1741  def int_x86_avx2_psrlv_q : GCCBuiltin<"__builtin_ia32_psrlv2di">,
1742              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
1743                        [IntrNoMem]>;
1744  def int_x86_avx2_psrlv_q_256 : GCCBuiltin<"__builtin_ia32_psrlv4di">,
1745              Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty],
1746                        [IntrNoMem]>;
1747
1748  def int_x86_avx2_psrav_d : GCCBuiltin<"__builtin_ia32_psrav4si">,
1749              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1750                        [IntrNoMem]>;
1751  def int_x86_avx2_psrav_d_256 : GCCBuiltin<"__builtin_ia32_psrav8si">,
1752              Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty],
1753                        [IntrNoMem]>;
1754}
1755
1756// Gather ops
1757let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1758  def int_x86_avx2_gather_d_pd : GCCBuiltin<"__builtin_ia32_gatherd_pd">,
1759      Intrinsic<[llvm_v2f64_ty],
1760        [llvm_v2f64_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_v2f64_ty, llvm_i8_ty],
1761        [IntrReadMem]>;
1762  def int_x86_avx2_gather_d_pd_256 : GCCBuiltin<"__builtin_ia32_gatherd_pd256">,
1763      Intrinsic<[llvm_v4f64_ty],
1764        [llvm_v4f64_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_v4f64_ty, llvm_i8_ty],
1765        [IntrReadMem]>;
1766  def int_x86_avx2_gather_q_pd : GCCBuiltin<"__builtin_ia32_gatherq_pd">,
1767      Intrinsic<[llvm_v2f64_ty],
1768        [llvm_v2f64_ty, llvm_ptr_ty, llvm_v2i64_ty, llvm_v2f64_ty, llvm_i8_ty],
1769        [IntrReadMem]>;
1770  def int_x86_avx2_gather_q_pd_256 : GCCBuiltin<"__builtin_ia32_gatherq_pd256">,
1771      Intrinsic<[llvm_v4f64_ty],
1772        [llvm_v4f64_ty, llvm_ptr_ty, llvm_v4i64_ty, llvm_v4f64_ty, llvm_i8_ty],
1773        [IntrReadMem]>;
1774  def int_x86_avx2_gather_d_ps : GCCBuiltin<"__builtin_ia32_gatherd_ps">,
1775      Intrinsic<[llvm_v4f32_ty],
1776        [llvm_v4f32_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_v4f32_ty, llvm_i8_ty],
1777        [IntrReadMem]>;
1778  def int_x86_avx2_gather_d_ps_256 : GCCBuiltin<"__builtin_ia32_gatherd_ps256">,
1779      Intrinsic<[llvm_v8f32_ty],
1780        [llvm_v8f32_ty, llvm_ptr_ty, llvm_v8i32_ty, llvm_v8f32_ty, llvm_i8_ty],
1781        [IntrReadMem]>;
1782  def int_x86_avx2_gather_q_ps : GCCBuiltin<"__builtin_ia32_gatherq_ps">,
1783      Intrinsic<[llvm_v4f32_ty],
1784        [llvm_v4f32_ty, llvm_ptr_ty, llvm_v2i64_ty, llvm_v4f32_ty, llvm_i8_ty],
1785        [IntrReadMem]>;
1786  def int_x86_avx2_gather_q_ps_256 : GCCBuiltin<"__builtin_ia32_gatherq_ps256">,
1787      Intrinsic<[llvm_v4f32_ty],
1788        [llvm_v4f32_ty, llvm_ptr_ty, llvm_v4i64_ty, llvm_v4f32_ty, llvm_i8_ty],
1789        [IntrReadMem]>;
1790
1791  def int_x86_avx2_gather_d_q : GCCBuiltin<"__builtin_ia32_gatherd_q">,
1792      Intrinsic<[llvm_v2i64_ty],
1793        [llvm_v2i64_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_v2i64_ty, llvm_i8_ty],
1794        [IntrReadMem]>;
1795  def int_x86_avx2_gather_d_q_256 : GCCBuiltin<"__builtin_ia32_gatherd_q256">,
1796      Intrinsic<[llvm_v4i64_ty],
1797        [llvm_v4i64_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_v4i64_ty, llvm_i8_ty],
1798        [IntrReadMem]>;
1799  def int_x86_avx2_gather_q_q : GCCBuiltin<"__builtin_ia32_gatherq_q">,
1800      Intrinsic<[llvm_v2i64_ty],
1801        [llvm_v2i64_ty, llvm_ptr_ty, llvm_v2i64_ty, llvm_v2i64_ty, llvm_i8_ty],
1802        [IntrReadMem]>;
1803  def int_x86_avx2_gather_q_q_256 : GCCBuiltin<"__builtin_ia32_gatherq_q256">,
1804      Intrinsic<[llvm_v4i64_ty],
1805        [llvm_v4i64_ty, llvm_ptr_ty, llvm_v4i64_ty, llvm_v4i64_ty, llvm_i8_ty],
1806        [IntrReadMem]>;
1807  def int_x86_avx2_gather_d_d : GCCBuiltin<"__builtin_ia32_gatherd_d">,
1808      Intrinsic<[llvm_v4i32_ty],
1809        [llvm_v4i32_ty, llvm_ptr_ty, llvm_v4i32_ty, llvm_v4i32_ty, llvm_i8_ty],
1810        [IntrReadMem]>;
1811  def int_x86_avx2_gather_d_d_256 : GCCBuiltin<"__builtin_ia32_gatherd_d256">,
1812      Intrinsic<[llvm_v8i32_ty],
1813        [llvm_v8i32_ty, llvm_ptr_ty, llvm_v8i32_ty, llvm_v8i32_ty, llvm_i8_ty],
1814        [IntrReadMem]>;
1815  def int_x86_avx2_gather_q_d : GCCBuiltin<"__builtin_ia32_gatherq_d">,
1816      Intrinsic<[llvm_v4i32_ty],
1817        [llvm_v4i32_ty, llvm_ptr_ty, llvm_v2i64_ty, llvm_v4i32_ty, llvm_i8_ty],
1818        [IntrReadMem]>;
1819  def int_x86_avx2_gather_q_d_256 : GCCBuiltin<"__builtin_ia32_gatherq_d256">,
1820      Intrinsic<[llvm_v4i32_ty],
1821        [llvm_v4i32_ty, llvm_ptr_ty, llvm_v4i64_ty, llvm_v4i32_ty, llvm_i8_ty],
1822        [IntrReadMem]>;
1823}
1824
1825// Misc.
1826let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1827  def int_x86_avx2_pmovmskb : GCCBuiltin<"__builtin_ia32_pmovmskb256">,
1828              Intrinsic<[llvm_i32_ty], [llvm_v32i8_ty], [IntrNoMem]>;
1829  def int_x86_avx2_pshuf_b : GCCBuiltin<"__builtin_ia32_pshufb256">,
1830              Intrinsic<[llvm_v32i8_ty], [llvm_v32i8_ty,
1831                         llvm_v32i8_ty], [IntrNoMem]>;
1832  def int_x86_avx2_mpsadbw : GCCBuiltin<"__builtin_ia32_mpsadbw256">,
1833              Intrinsic<[llvm_v16i16_ty], [llvm_v32i8_ty, llvm_v32i8_ty,
1834                         llvm_i32_ty], [IntrNoMem, Commutative]>;
1835  def int_x86_avx2_movntdqa : GCCBuiltin<"__builtin_ia32_movntdqa256">,
1836              Intrinsic<[llvm_v4i64_ty], [llvm_ptr_ty], [IntrReadMem]>;
1837}
1838
1839//===----------------------------------------------------------------------===//
1840// FMA3 and FMA4
1841
1842let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1843  def int_x86_fma_vfmadd_ss : GCCBuiltin<"__builtin_ia32_vfmaddss">,
1844              Intrinsic<[llvm_v4f32_ty],
1845                        [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
1846                        [IntrNoMem]>;
1847  def int_x86_fma_vfmadd_sd : GCCBuiltin<"__builtin_ia32_vfmaddsd">,
1848              Intrinsic<[llvm_v2f64_ty],
1849                        [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty],
1850                        [IntrNoMem]>;
1851  def int_x86_fma_vfmadd_ps : GCCBuiltin<"__builtin_ia32_vfmaddps">,
1852              Intrinsic<[llvm_v4f32_ty],
1853                        [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
1854                        [IntrNoMem]>;
1855  def int_x86_fma_vfmadd_pd : GCCBuiltin<"__builtin_ia32_vfmaddpd">,
1856              Intrinsic<[llvm_v2f64_ty],
1857                        [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty],
1858                        [IntrNoMem]>;
1859  def int_x86_fma_vfmadd_ps_256 : GCCBuiltin<"__builtin_ia32_vfmaddps256">,
1860              Intrinsic<[llvm_v8f32_ty],
1861                        [llvm_v8f32_ty, llvm_v8f32_ty, llvm_v8f32_ty],
1862                        [IntrNoMem]>;
1863  def int_x86_fma_vfmadd_pd_256 : GCCBuiltin<"__builtin_ia32_vfmaddpd256">,
1864              Intrinsic<[llvm_v4f64_ty],
1865                        [llvm_v4f64_ty, llvm_v4f64_ty, llvm_v4f64_ty],
1866                        [IntrNoMem]>;
1867  def int_x86_fma_vfmadd_ps_512 : GCCBuiltin<"__builtin_ia32_vfmaddps512">,
1868              Intrinsic<[llvm_v16f32_ty],
1869                        [llvm_v16f32_ty, llvm_v16f32_ty, llvm_v16f32_ty],
1870                        [IntrNoMem]>;
1871  def int_x86_fma_vfmadd_pd_512 : GCCBuiltin<"__builtin_ia32_vfmaddpd512">,
1872              Intrinsic<[llvm_v8f64_ty],
1873                        [llvm_v8f64_ty, llvm_v8f64_ty, llvm_v8f64_ty],
1874                        [IntrNoMem]>;
1875  def int_x86_fma_vfmsub_ss : GCCBuiltin<"__builtin_ia32_vfmsubss">,
1876              Intrinsic<[llvm_v4f32_ty],
1877                        [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
1878                        [IntrNoMem]>;
1879  def int_x86_fma_vfmsub_sd : GCCBuiltin<"__builtin_ia32_vfmsubsd">,
1880              Intrinsic<[llvm_v2f64_ty],
1881                        [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty],
1882                        [IntrNoMem]>;
1883  def int_x86_fma_vfmsub_ps : GCCBuiltin<"__builtin_ia32_vfmsubps">,
1884              Intrinsic<[llvm_v4f32_ty],
1885                        [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
1886                        [IntrNoMem]>;
1887  def int_x86_fma_vfmsub_pd : GCCBuiltin<"__builtin_ia32_vfmsubpd">,
1888              Intrinsic<[llvm_v2f64_ty],
1889                        [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty],
1890                        [IntrNoMem]>;
1891  def int_x86_fma_vfmsub_ps_256 : GCCBuiltin<"__builtin_ia32_vfmsubps256">,
1892              Intrinsic<[llvm_v8f32_ty],
1893                        [llvm_v8f32_ty, llvm_v8f32_ty, llvm_v8f32_ty],
1894                        [IntrNoMem]>;
1895  def int_x86_fma_vfmsub_pd_256 : GCCBuiltin<"__builtin_ia32_vfmsubpd256">,
1896              Intrinsic<[llvm_v4f64_ty],
1897                        [llvm_v4f64_ty, llvm_v4f64_ty, llvm_v4f64_ty],
1898                        [IntrNoMem]>;
1899  def int_x86_fma_vfmsub_ps_512 : GCCBuiltin<"__builtin_ia32_vfmsubps512">,
1900              Intrinsic<[llvm_v16f32_ty],
1901                        [llvm_v16f32_ty, llvm_v16f32_ty, llvm_v16f32_ty],
1902                        [IntrNoMem]>;
1903  def int_x86_fma_vfmsub_pd_512 : GCCBuiltin<"__builtin_ia32_vfmsubpd512">,
1904              Intrinsic<[llvm_v8f64_ty],
1905                        [llvm_v8f64_ty, llvm_v8f64_ty, llvm_v8f64_ty],
1906                        [IntrNoMem]>;
1907  def int_x86_fma_vfnmadd_ss : GCCBuiltin<"__builtin_ia32_vfnmaddss">,
1908              Intrinsic<[llvm_v4f32_ty],
1909                        [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
1910                        [IntrNoMem]>;
1911  def int_x86_fma_vfnmadd_sd : GCCBuiltin<"__builtin_ia32_vfnmaddsd">,
1912              Intrinsic<[llvm_v2f64_ty],
1913                        [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty],
1914                        [IntrNoMem]>;
1915  def int_x86_fma_vfnmadd_ps : GCCBuiltin<"__builtin_ia32_vfnmaddps">,
1916              Intrinsic<[llvm_v4f32_ty],
1917                        [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
1918                        [IntrNoMem]>;
1919  def int_x86_fma_vfnmadd_pd : GCCBuiltin<"__builtin_ia32_vfnmaddpd">,
1920              Intrinsic<[llvm_v2f64_ty],
1921                        [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty],
1922                        [IntrNoMem]>;
1923  def int_x86_fma_vfnmadd_ps_256 : GCCBuiltin<"__builtin_ia32_vfnmaddps256">,
1924              Intrinsic<[llvm_v8f32_ty],
1925                        [llvm_v8f32_ty, llvm_v8f32_ty, llvm_v8f32_ty],
1926                        [IntrNoMem]>;
1927  def int_x86_fma_vfnmadd_pd_256 : GCCBuiltin<"__builtin_ia32_vfnmaddpd256">,
1928              Intrinsic<[llvm_v4f64_ty],
1929                        [llvm_v4f64_ty, llvm_v4f64_ty, llvm_v4f64_ty],
1930                        [IntrNoMem]>;
1931  def int_x86_fma_vfnmadd_ps_512 : GCCBuiltin<"__builtin_ia32_vfnmaddps512">,
1932              Intrinsic<[llvm_v16f32_ty],
1933                        [llvm_v16f32_ty, llvm_v16f32_ty, llvm_v16f32_ty],
1934                        [IntrNoMem]>;
1935  def int_x86_fma_vfnmadd_pd_512 : GCCBuiltin<"__builtin_ia32_vfnmaddpd512">,
1936              Intrinsic<[llvm_v8f64_ty],
1937                        [llvm_v8f64_ty, llvm_v8f64_ty, llvm_v8f64_ty],
1938                        [IntrNoMem]>;
1939  def int_x86_fma_vfnmsub_ss : GCCBuiltin<"__builtin_ia32_vfnmsubss">,
1940              Intrinsic<[llvm_v4f32_ty],
1941                        [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
1942                        [IntrNoMem]>;
1943  def int_x86_fma_vfnmsub_sd : GCCBuiltin<"__builtin_ia32_vfnmsubsd">,
1944              Intrinsic<[llvm_v2f64_ty],
1945                        [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty],
1946                        [IntrNoMem]>;
1947  def int_x86_fma_vfnmsub_ps : GCCBuiltin<"__builtin_ia32_vfnmsubps">,
1948              Intrinsic<[llvm_v4f32_ty],
1949                        [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
1950                        [IntrNoMem]>;
1951  def int_x86_fma_vfnmsub_pd : GCCBuiltin<"__builtin_ia32_vfnmsubpd">,
1952              Intrinsic<[llvm_v2f64_ty],
1953                        [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty],
1954                        [IntrNoMem]>;
1955  def int_x86_fma_vfnmsub_ps_256 : GCCBuiltin<"__builtin_ia32_vfnmsubps256">,
1956              Intrinsic<[llvm_v8f32_ty],
1957                        [llvm_v8f32_ty, llvm_v8f32_ty, llvm_v8f32_ty],
1958                        [IntrNoMem]>;
1959  def int_x86_fma_vfnmsub_pd_256 : GCCBuiltin<"__builtin_ia32_vfnmsubpd256">,
1960              Intrinsic<[llvm_v4f64_ty],
1961                        [llvm_v4f64_ty, llvm_v4f64_ty, llvm_v4f64_ty],
1962                        [IntrNoMem]>;
1963  def int_x86_fma_vfnmsub_ps_512 : GCCBuiltin<"__builtin_ia32_vfnmsubps512">,
1964              Intrinsic<[llvm_v16f32_ty],
1965                        [llvm_v16f32_ty, llvm_v16f32_ty, llvm_v16f32_ty],
1966                        [IntrNoMem]>;
1967  def int_x86_fma_vfnmsub_pd_512 : GCCBuiltin<"__builtin_ia32_vfnmsubpd512">,
1968              Intrinsic<[llvm_v8f64_ty],
1969                        [llvm_v8f64_ty, llvm_v8f64_ty, llvm_v8f64_ty],
1970                        [IntrNoMem]>;
1971  def int_x86_fma_vfmaddsub_ps : GCCBuiltin<"__builtin_ia32_vfmaddsubps">,
1972              Intrinsic<[llvm_v4f32_ty],
1973                        [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
1974                        [IntrNoMem]>;
1975  def int_x86_fma_vfmaddsub_pd : GCCBuiltin<"__builtin_ia32_vfmaddsubpd">,
1976              Intrinsic<[llvm_v2f64_ty],
1977                        [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty],
1978                        [IntrNoMem]>;
1979  def int_x86_fma_vfmaddsub_ps_256 :
1980               GCCBuiltin<"__builtin_ia32_vfmaddsubps256">,
1981              Intrinsic<[llvm_v8f32_ty],
1982                        [llvm_v8f32_ty, llvm_v8f32_ty, llvm_v8f32_ty],
1983                        [IntrNoMem]>;
1984  def int_x86_fma_vfmaddsub_pd_256 :
1985              GCCBuiltin<"__builtin_ia32_vfmaddsubpd256">,
1986              Intrinsic<[llvm_v4f64_ty],
1987                        [llvm_v4f64_ty, llvm_v4f64_ty, llvm_v4f64_ty],
1988                        [IntrNoMem]>;
1989  def int_x86_fma_vfmaddsub_ps_512 : GCCBuiltin<"__builtin_ia32_vfmaddsubps512">,
1990              Intrinsic<[llvm_v16f32_ty],
1991                        [llvm_v16f32_ty, llvm_v16f32_ty, llvm_v16f32_ty],
1992                        [IntrNoMem]>;
1993  def int_x86_fma_vfmaddsub_pd_512 : GCCBuiltin<"__builtin_ia32_vfmaddsubpd512">,
1994              Intrinsic<[llvm_v8f64_ty],
1995                        [llvm_v8f64_ty, llvm_v8f64_ty, llvm_v8f64_ty],
1996                        [IntrNoMem]>;
1997  def int_x86_fma_vfmsubadd_ps : GCCBuiltin<"__builtin_ia32_vfmsubaddps">,
1998              Intrinsic<[llvm_v4f32_ty],
1999                        [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
2000                        [IntrNoMem]>;
2001  def int_x86_fma_vfmsubadd_pd : GCCBuiltin<"__builtin_ia32_vfmsubaddpd">,
2002              Intrinsic<[llvm_v2f64_ty],
2003                        [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty],
2004                        [IntrNoMem]>;
2005  def int_x86_fma_vfmsubadd_ps_256 :
2006              GCCBuiltin<"__builtin_ia32_vfmsubaddps256">,
2007              Intrinsic<[llvm_v8f32_ty],
2008                        [llvm_v8f32_ty, llvm_v8f32_ty, llvm_v8f32_ty],
2009                        [IntrNoMem]>;
2010  def int_x86_fma_vfmsubadd_pd_256 :
2011              GCCBuiltin<"__builtin_ia32_vfmsubaddpd256">,
2012              Intrinsic<[llvm_v4f64_ty],
2013                        [llvm_v4f64_ty, llvm_v4f64_ty, llvm_v4f64_ty],
2014                        [IntrNoMem]>;
2015  def int_x86_fma_vfmsubadd_ps_512 : GCCBuiltin<"__builtin_ia32_vfmsubaddps512">,
2016              Intrinsic<[llvm_v16f32_ty],
2017                        [llvm_v16f32_ty, llvm_v16f32_ty, llvm_v16f32_ty],
2018                        [IntrNoMem]>;
2019  def int_x86_fma_vfmsubadd_pd_512 : GCCBuiltin<"__builtin_ia32_vfmsubaddpd512">,
2020              Intrinsic<[llvm_v8f64_ty],
2021                        [llvm_v8f64_ty, llvm_v8f64_ty, llvm_v8f64_ty],
2022                        [IntrNoMem]>;
2023}
2024
2025//===----------------------------------------------------------------------===//
2026// XOP
2027
2028  def int_x86_xop_vpermil2pd : GCCBuiltin<"__builtin_ia32_vpermil2pd">,
2029              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
2030                                          llvm_v2f64_ty, llvm_i8_ty],
2031                        [IntrNoMem]>;
2032
2033  def int_x86_xop_vpermil2pd_256 :
2034              GCCBuiltin<"__builtin_ia32_vpermil2pd256">,
2035              Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4f64_ty,
2036                                          llvm_v4f64_ty, llvm_i8_ty],
2037                        [IntrNoMem]>;
2038
2039  def int_x86_xop_vpermil2ps : GCCBuiltin<"__builtin_ia32_vpermil2ps">,
2040              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
2041                                          llvm_v4f32_ty, llvm_i8_ty],
2042                        [IntrNoMem]>;
2043  def int_x86_xop_vpermil2ps_256 :
2044              GCCBuiltin<"__builtin_ia32_vpermil2ps256">,
2045              Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8f32_ty,
2046                                          llvm_v8f32_ty, llvm_i8_ty],
2047                        [IntrNoMem]>;
2048
2049  def int_x86_xop_vfrcz_pd : GCCBuiltin<"__builtin_ia32_vfrczpd">,
2050              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
2051  def int_x86_xop_vfrcz_ps : GCCBuiltin<"__builtin_ia32_vfrczps">,
2052              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
2053  def int_x86_xop_vfrcz_sd : GCCBuiltin<"__builtin_ia32_vfrczsd">,
2054              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
2055  def int_x86_xop_vfrcz_ss : GCCBuiltin<"__builtin_ia32_vfrczss">,
2056              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
2057  def int_x86_xop_vfrcz_pd_256 : GCCBuiltin<"__builtin_ia32_vfrczpd256">,
2058              Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty], [IntrNoMem]>;
2059  def int_x86_xop_vfrcz_ps_256 : GCCBuiltin<"__builtin_ia32_vfrczps256">,
2060              Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
2061
2062  def int_x86_xop_vpcmov :
2063              GCCBuiltin<"__builtin_ia32_vpcmov">,
2064              Intrinsic<[llvm_v2i64_ty],
2065                        [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],
2066                        [IntrNoMem]>;
2067  def int_x86_xop_vpcmov_256 :
2068              GCCBuiltin<"__builtin_ia32_vpcmov_256">,
2069              Intrinsic<[llvm_v4i64_ty],
2070                        [llvm_v4i64_ty, llvm_v4i64_ty, llvm_v4i64_ty],
2071                        [IntrNoMem]>;
2072
2073  def int_x86_xop_vpcomb : GCCBuiltin<"__builtin_ia32_vpcomb">,
2074              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
2075                         llvm_i8_ty], [IntrNoMem]>;
2076  def int_x86_xop_vpcomw : GCCBuiltin<"__builtin_ia32_vpcomw">,
2077              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
2078                         llvm_i8_ty], [IntrNoMem]>;
2079  def int_x86_xop_vpcomd : GCCBuiltin<"__builtin_ia32_vpcomd">,
2080              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
2081                         llvm_i8_ty], [IntrNoMem]>;
2082  def int_x86_xop_vpcomq : GCCBuiltin<"__builtin_ia32_vpcomq">,
2083              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
2084                         llvm_i8_ty], [IntrNoMem]>;
2085  def int_x86_xop_vpcomub : GCCBuiltin<"__builtin_ia32_vpcomub">,
2086              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
2087                         llvm_i8_ty], [IntrNoMem]>;
2088  def int_x86_xop_vpcomuw : GCCBuiltin<"__builtin_ia32_vpcomuw">,
2089              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
2090                         llvm_i8_ty], [IntrNoMem]>;
2091  def int_x86_xop_vpcomud : GCCBuiltin<"__builtin_ia32_vpcomud">,
2092              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
2093                         llvm_i8_ty], [IntrNoMem]>;
2094  def int_x86_xop_vpcomuq : GCCBuiltin<"__builtin_ia32_vpcomuq">,
2095              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
2096                         llvm_i8_ty], [IntrNoMem]>;
2097
2098  def int_x86_xop_vphaddbd :
2099              GCCBuiltin<"__builtin_ia32_vphaddbd">,
2100              Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2101  def int_x86_xop_vphaddbq :
2102              GCCBuiltin<"__builtin_ia32_vphaddbq">,
2103              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2104  def int_x86_xop_vphaddbw :
2105              GCCBuiltin<"__builtin_ia32_vphaddbw">,
2106              Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2107  def int_x86_xop_vphadddq :
2108              GCCBuiltin<"__builtin_ia32_vphadddq">,
2109              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
2110  def int_x86_xop_vphaddubd :
2111              GCCBuiltin<"__builtin_ia32_vphaddubd">,
2112              Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2113  def int_x86_xop_vphaddubq :
2114              GCCBuiltin<"__builtin_ia32_vphaddubq">,
2115              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2116  def int_x86_xop_vphaddubw :
2117              GCCBuiltin<"__builtin_ia32_vphaddubw">,
2118              Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2119  def int_x86_xop_vphaddudq :
2120              GCCBuiltin<"__builtin_ia32_vphaddudq">,
2121              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
2122  def int_x86_xop_vphadduwd :
2123              GCCBuiltin<"__builtin_ia32_vphadduwd">,
2124              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2125  def int_x86_xop_vphadduwq :
2126              GCCBuiltin<"__builtin_ia32_vphadduwq">,
2127              Intrinsic<[llvm_v2i64_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2128  def int_x86_xop_vphaddwd :
2129              GCCBuiltin<"__builtin_ia32_vphaddwd">,
2130              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2131  def int_x86_xop_vphaddwq :
2132              GCCBuiltin<"__builtin_ia32_vphaddwq">,
2133              Intrinsic<[llvm_v2i64_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2134  def int_x86_xop_vphsubbw :
2135              GCCBuiltin<"__builtin_ia32_vphsubbw">,
2136              Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
2137  def int_x86_xop_vphsubdq :
2138              GCCBuiltin<"__builtin_ia32_vphsubdq">,
2139              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
2140  def int_x86_xop_vphsubwd :
2141              GCCBuiltin<"__builtin_ia32_vphsubwd">,
2142              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2143  def int_x86_xop_vpmacsdd :
2144              GCCBuiltin<"__builtin_ia32_vpmacsdd">,
2145              Intrinsic<[llvm_v4i32_ty],
2146                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
2147                        [IntrNoMem]>;
2148  def int_x86_xop_vpmacsdqh :
2149              GCCBuiltin<"__builtin_ia32_vpmacsdqh">,
2150              Intrinsic<[llvm_v2i64_ty],
2151                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v2i64_ty],
2152                        [IntrNoMem]>;
2153  def int_x86_xop_vpmacsdql :
2154              GCCBuiltin<"__builtin_ia32_vpmacsdql">,
2155              Intrinsic<[llvm_v2i64_ty],
2156                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v2i64_ty],
2157                        [IntrNoMem]>;
2158  def int_x86_xop_vpmacssdd :
2159              GCCBuiltin<"__builtin_ia32_vpmacssdd">,
2160              Intrinsic<[llvm_v4i32_ty],
2161                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
2162                        [IntrNoMem]>;
2163  def int_x86_xop_vpmacssdqh :
2164              GCCBuiltin<"__builtin_ia32_vpmacssdqh">,
2165              Intrinsic<[llvm_v2i64_ty],
2166                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v2i64_ty],
2167                        [IntrNoMem]>;
2168  def int_x86_xop_vpmacssdql :
2169              GCCBuiltin<"__builtin_ia32_vpmacssdql">,
2170              Intrinsic<[llvm_v2i64_ty],
2171                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v2i64_ty],
2172                        [IntrNoMem]>;
2173  def int_x86_xop_vpmacsswd :
2174              GCCBuiltin<"__builtin_ia32_vpmacsswd">,
2175              Intrinsic<[llvm_v4i32_ty],
2176                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v4i32_ty],
2177                        [IntrNoMem]>;
2178  def int_x86_xop_vpmacssww :
2179              GCCBuiltin<"__builtin_ia32_vpmacssww">,
2180              Intrinsic<[llvm_v8i16_ty],
2181                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
2182                        [IntrNoMem]>;
2183  def int_x86_xop_vpmacswd :
2184              GCCBuiltin<"__builtin_ia32_vpmacswd">,
2185              Intrinsic<[llvm_v4i32_ty],
2186                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v4i32_ty],
2187                        [IntrNoMem]>;
2188  def int_x86_xop_vpmacsww :
2189              GCCBuiltin<"__builtin_ia32_vpmacsww">,
2190              Intrinsic<[llvm_v8i16_ty],
2191                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
2192                        [IntrNoMem]>;
2193  def int_x86_xop_vpmadcsswd :
2194              GCCBuiltin<"__builtin_ia32_vpmadcsswd">,
2195              Intrinsic<[llvm_v4i32_ty],
2196                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v4i32_ty],
2197                        [IntrNoMem]>;
2198  def int_x86_xop_vpmadcswd :
2199              GCCBuiltin<"__builtin_ia32_vpmadcswd">,
2200              Intrinsic<[llvm_v4i32_ty],
2201                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v4i32_ty],
2202                        [IntrNoMem]>;
2203  def int_x86_xop_vpperm :
2204              GCCBuiltin<"__builtin_ia32_vpperm">,
2205              Intrinsic<[llvm_v16i8_ty],
2206                        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
2207                        [IntrNoMem]>;
2208
2209  def int_x86_xop_vprotb : GCCBuiltin<"__builtin_ia32_vprotb">,
2210              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
2211                        [IntrNoMem]>;
2212  def int_x86_xop_vprotd : GCCBuiltin<"__builtin_ia32_vprotd">,
2213              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
2214                        [IntrNoMem]>;
2215  def int_x86_xop_vprotq : GCCBuiltin<"__builtin_ia32_vprotq">,
2216              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
2217                        [IntrNoMem]>;
2218  def int_x86_xop_vprotw : GCCBuiltin<"__builtin_ia32_vprotw">,
2219              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
2220                        [IntrNoMem]>;
2221  def int_x86_xop_vprotbi : GCCBuiltin<"__builtin_ia32_vprotbi">,
2222              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i8_ty],
2223                        [IntrNoMem]>;
2224  def int_x86_xop_vprotdi : GCCBuiltin<"__builtin_ia32_vprotdi">,
2225              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_i8_ty],
2226                        [IntrNoMem]>;
2227  def int_x86_xop_vprotqi : GCCBuiltin<"__builtin_ia32_vprotqi">,
2228              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_i8_ty],
2229                        [IntrNoMem]>;
2230  def int_x86_xop_vprotwi : GCCBuiltin<"__builtin_ia32_vprotwi">,
2231              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_i8_ty],
2232                        [IntrNoMem]>;
2233
2234  def int_x86_xop_vpshab :
2235              GCCBuiltin<"__builtin_ia32_vpshab">,
2236              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
2237                        [IntrNoMem]>;
2238  def int_x86_xop_vpshad :
2239              GCCBuiltin<"__builtin_ia32_vpshad">,
2240              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
2241                        [IntrNoMem]>;
2242  def int_x86_xop_vpshaq :
2243              GCCBuiltin<"__builtin_ia32_vpshaq">,
2244              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
2245                        [IntrNoMem]>;
2246  def int_x86_xop_vpshaw :
2247              GCCBuiltin<"__builtin_ia32_vpshaw">,
2248              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
2249                        [IntrNoMem]>;
2250  def int_x86_xop_vpshlb :
2251              GCCBuiltin<"__builtin_ia32_vpshlb">,
2252              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
2253                        [IntrNoMem]>;
2254  def int_x86_xop_vpshld :
2255              GCCBuiltin<"__builtin_ia32_vpshld">,
2256              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
2257                        [IntrNoMem]>;
2258  def int_x86_xop_vpshlq :
2259              GCCBuiltin<"__builtin_ia32_vpshlq">,
2260              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
2261                        [IntrNoMem]>;
2262  def int_x86_xop_vpshlw :
2263              GCCBuiltin<"__builtin_ia32_vpshlw">,
2264              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
2265                        [IntrNoMem]>;
2266
2267//===----------------------------------------------------------------------===//
2268// MMX
2269
2270// Empty MMX state op.
2271let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2272  def int_x86_mmx_emms  : GCCBuiltin<"__builtin_ia32_emms">,
2273              Intrinsic<[], [], []>;
2274  def int_x86_mmx_femms : GCCBuiltin<"__builtin_ia32_femms">,
2275              Intrinsic<[], [], []>;
2276}
2277
2278// Integer arithmetic ops.
2279let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2280  // Addition
2281  def int_x86_mmx_padd_b : GCCBuiltin<"__builtin_ia32_paddb">,
2282              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2283                        [IntrNoMem]>;
2284  def int_x86_mmx_padd_w : GCCBuiltin<"__builtin_ia32_paddw">,
2285              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2286                        [IntrNoMem]>;
2287  def int_x86_mmx_padd_d : GCCBuiltin<"__builtin_ia32_paddd">,
2288              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2289                        [IntrNoMem]>;
2290  def int_x86_mmx_padd_q : GCCBuiltin<"__builtin_ia32_paddq">,
2291              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2292                        [IntrNoMem]>;
2293
2294  def int_x86_mmx_padds_b : GCCBuiltin<"__builtin_ia32_paddsb">,
2295              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2296                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2297  def int_x86_mmx_padds_w : GCCBuiltin<"__builtin_ia32_paddsw">,
2298              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2299                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2300
2301  def int_x86_mmx_paddus_b : GCCBuiltin<"__builtin_ia32_paddusb">,
2302              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2303                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2304  def int_x86_mmx_paddus_w : GCCBuiltin<"__builtin_ia32_paddusw">,
2305              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2306                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2307
2308  // Subtraction
2309  def int_x86_mmx_psub_b : GCCBuiltin<"__builtin_ia32_psubb">,
2310              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2311                        [IntrNoMem]>;
2312  def int_x86_mmx_psub_w : GCCBuiltin<"__builtin_ia32_psubw">,
2313              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2314                        [IntrNoMem]>;
2315  def int_x86_mmx_psub_d : GCCBuiltin<"__builtin_ia32_psubd">,
2316              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2317                        [IntrNoMem]>;
2318  def int_x86_mmx_psub_q : GCCBuiltin<"__builtin_ia32_psubq">,
2319              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2320                        [IntrNoMem]>;
2321
2322  def int_x86_mmx_psubs_b : GCCBuiltin<"__builtin_ia32_psubsb">,
2323              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2324                         llvm_x86mmx_ty], [IntrNoMem]>;
2325  def int_x86_mmx_psubs_w : GCCBuiltin<"__builtin_ia32_psubsw">,
2326              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2327                         llvm_x86mmx_ty], [IntrNoMem]>;
2328
2329  def int_x86_mmx_psubus_b : GCCBuiltin<"__builtin_ia32_psubusb">,
2330              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2331                         llvm_x86mmx_ty], [IntrNoMem]>;
2332  def int_x86_mmx_psubus_w : GCCBuiltin<"__builtin_ia32_psubusw">,
2333              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2334                         llvm_x86mmx_ty], [IntrNoMem]>;
2335
2336  // Multiplication
2337  def int_x86_mmx_pmulh_w : GCCBuiltin<"__builtin_ia32_pmulhw">,
2338              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2339                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2340  def int_x86_mmx_pmull_w : GCCBuiltin<"__builtin_ia32_pmullw">,
2341              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2342                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2343  def int_x86_mmx_pmulhu_w : GCCBuiltin<"__builtin_ia32_pmulhuw">,
2344              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2345                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2346  def int_x86_mmx_pmulu_dq : GCCBuiltin<"__builtin_ia32_pmuludq">,
2347              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2348                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2349  def int_x86_mmx_pmadd_wd : GCCBuiltin<"__builtin_ia32_pmaddwd">,
2350              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2351                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2352
2353  // Bitwise operations
2354  def int_x86_mmx_pand : GCCBuiltin<"__builtin_ia32_pand">,
2355              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2356                        [IntrNoMem]>;
2357  def int_x86_mmx_pandn : GCCBuiltin<"__builtin_ia32_pandn">,
2358              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2359                        [IntrNoMem]>;
2360  def int_x86_mmx_por : GCCBuiltin<"__builtin_ia32_por">,
2361              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2362                        [IntrNoMem]>;
2363  def int_x86_mmx_pxor : GCCBuiltin<"__builtin_ia32_pxor">,
2364              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2365                        [IntrNoMem]>;
2366
2367  // Averages
2368  def int_x86_mmx_pavg_b : GCCBuiltin<"__builtin_ia32_pavgb">,
2369              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2370                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2371  def int_x86_mmx_pavg_w : GCCBuiltin<"__builtin_ia32_pavgw">,
2372              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2373                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2374
2375  // Maximum
2376  def int_x86_mmx_pmaxu_b : GCCBuiltin<"__builtin_ia32_pmaxub">,
2377              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2378                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2379  def int_x86_mmx_pmaxs_w : GCCBuiltin<"__builtin_ia32_pmaxsw">,
2380              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2381                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2382
2383  // Minimum
2384  def int_x86_mmx_pminu_b : GCCBuiltin<"__builtin_ia32_pminub">,
2385              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2386                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2387  def int_x86_mmx_pmins_w : GCCBuiltin<"__builtin_ia32_pminsw">,
2388              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2389                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2390
2391  // Packed sum of absolute differences
2392  def int_x86_mmx_psad_bw : GCCBuiltin<"__builtin_ia32_psadbw">,
2393              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2394                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2395}
2396
2397// Integer shift ops.
2398let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2399  // Shift left logical
2400  def int_x86_mmx_psll_w : GCCBuiltin<"__builtin_ia32_psllw">,
2401              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2402                         llvm_x86mmx_ty], [IntrNoMem]>;
2403  def int_x86_mmx_psll_d : GCCBuiltin<"__builtin_ia32_pslld">,
2404              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2405                         llvm_x86mmx_ty], [IntrNoMem]>;
2406  def int_x86_mmx_psll_q : GCCBuiltin<"__builtin_ia32_psllq">,
2407              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2408                         llvm_x86mmx_ty], [IntrNoMem]>;
2409
2410  def int_x86_mmx_psrl_w : GCCBuiltin<"__builtin_ia32_psrlw">,
2411              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2412                         llvm_x86mmx_ty], [IntrNoMem]>;
2413  def int_x86_mmx_psrl_d : GCCBuiltin<"__builtin_ia32_psrld">,
2414              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2415                         llvm_x86mmx_ty], [IntrNoMem]>;
2416  def int_x86_mmx_psrl_q : GCCBuiltin<"__builtin_ia32_psrlq">,
2417              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2418                         llvm_x86mmx_ty], [IntrNoMem]>;
2419
2420  def int_x86_mmx_psra_w : GCCBuiltin<"__builtin_ia32_psraw">,
2421              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2422                         llvm_x86mmx_ty], [IntrNoMem]>;
2423  def int_x86_mmx_psra_d : GCCBuiltin<"__builtin_ia32_psrad">,
2424              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2425                         llvm_x86mmx_ty], [IntrNoMem]>;
2426
2427  def int_x86_mmx_pslli_w : GCCBuiltin<"__builtin_ia32_psllwi">,
2428              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2429                         llvm_i32_ty], [IntrNoMem]>;
2430  def int_x86_mmx_pslli_d : GCCBuiltin<"__builtin_ia32_pslldi">,
2431              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2432                         llvm_i32_ty], [IntrNoMem]>;
2433  def int_x86_mmx_pslli_q : GCCBuiltin<"__builtin_ia32_psllqi">,
2434              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2435                         llvm_i32_ty], [IntrNoMem]>;
2436
2437  def int_x86_mmx_psrli_w : GCCBuiltin<"__builtin_ia32_psrlwi">,
2438              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2439                         llvm_i32_ty], [IntrNoMem]>;
2440  def int_x86_mmx_psrli_d : GCCBuiltin<"__builtin_ia32_psrldi">,
2441              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2442                         llvm_i32_ty], [IntrNoMem]>;
2443  def int_x86_mmx_psrli_q : GCCBuiltin<"__builtin_ia32_psrlqi">,
2444              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2445                         llvm_i32_ty], [IntrNoMem]>;
2446
2447  def int_x86_mmx_psrai_w : GCCBuiltin<"__builtin_ia32_psrawi">,
2448              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2449                         llvm_i32_ty], [IntrNoMem]>;
2450  def int_x86_mmx_psrai_d : GCCBuiltin<"__builtin_ia32_psradi">,
2451              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2452                         llvm_i32_ty], [IntrNoMem]>;
2453}
2454
2455// Pack ops.
2456let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2457  def int_x86_mmx_packsswb : GCCBuiltin<"__builtin_ia32_packsswb">,
2458              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2459                         llvm_x86mmx_ty], [IntrNoMem]>;
2460  def int_x86_mmx_packssdw : GCCBuiltin<"__builtin_ia32_packssdw">,
2461              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2462                         llvm_x86mmx_ty], [IntrNoMem]>;
2463  def int_x86_mmx_packuswb : GCCBuiltin<"__builtin_ia32_packuswb">,
2464              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2465                         llvm_x86mmx_ty], [IntrNoMem]>;
2466}
2467
2468// Unpacking ops.
2469let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2470  def int_x86_mmx_punpckhbw : GCCBuiltin<"__builtin_ia32_punpckhbw">,
2471              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2472                        [IntrNoMem]>;
2473  def int_x86_mmx_punpckhwd : GCCBuiltin<"__builtin_ia32_punpckhwd">,
2474              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2475                        [IntrNoMem]>;
2476  def int_x86_mmx_punpckhdq : GCCBuiltin<"__builtin_ia32_punpckhdq">,
2477              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2478                        [IntrNoMem]>;
2479  def int_x86_mmx_punpcklbw : GCCBuiltin<"__builtin_ia32_punpcklbw">,
2480              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2481                        [IntrNoMem]>;
2482  def int_x86_mmx_punpcklwd : GCCBuiltin<"__builtin_ia32_punpcklwd">,
2483              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2484                        [IntrNoMem]>;
2485  def int_x86_mmx_punpckldq : GCCBuiltin<"__builtin_ia32_punpckldq">,
2486              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty],
2487                        [IntrNoMem]>;
2488}
2489
2490// Integer comparison ops
2491let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2492  def int_x86_mmx_pcmpeq_b : GCCBuiltin<"__builtin_ia32_pcmpeqb">,
2493              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2494                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2495  def int_x86_mmx_pcmpeq_w : GCCBuiltin<"__builtin_ia32_pcmpeqw">,
2496              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2497                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2498  def int_x86_mmx_pcmpeq_d : GCCBuiltin<"__builtin_ia32_pcmpeqd">,
2499              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2500                         llvm_x86mmx_ty], [IntrNoMem, Commutative]>;
2501
2502  def int_x86_mmx_pcmpgt_b : GCCBuiltin<"__builtin_ia32_pcmpgtb">,
2503              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2504                         llvm_x86mmx_ty], [IntrNoMem]>;
2505  def int_x86_mmx_pcmpgt_w : GCCBuiltin<"__builtin_ia32_pcmpgtw">,
2506              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2507                         llvm_x86mmx_ty], [IntrNoMem]>;
2508  def int_x86_mmx_pcmpgt_d : GCCBuiltin<"__builtin_ia32_pcmpgtd">,
2509              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2510                         llvm_x86mmx_ty], [IntrNoMem]>;
2511}
2512
2513// Misc.
2514let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2515  def int_x86_mmx_maskmovq : GCCBuiltin<"__builtin_ia32_maskmovq">,
2516              Intrinsic<[], [llvm_x86mmx_ty, llvm_x86mmx_ty, llvm_ptr_ty], []>;
2517
2518  def int_x86_mmx_pmovmskb : GCCBuiltin<"__builtin_ia32_pmovmskb">,
2519              Intrinsic<[llvm_i32_ty], [llvm_x86mmx_ty], [IntrNoMem]>;
2520
2521  def int_x86_mmx_movnt_dq : GCCBuiltin<"__builtin_ia32_movntq">,
2522              Intrinsic<[], [llvm_ptrx86mmx_ty, llvm_x86mmx_ty], []>;
2523
2524  def int_x86_mmx_palignr_b : GCCBuiltin<"__builtin_ia32_palignr">,
2525              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2526                        llvm_x86mmx_ty, llvm_i8_ty], [IntrNoMem]>;
2527
2528  def int_x86_mmx_pextr_w : GCCBuiltin<"__builtin_ia32_vec_ext_v4hi">,
2529              Intrinsic<[llvm_i32_ty], [llvm_x86mmx_ty, llvm_i32_ty],
2530                        [IntrNoMem]>;
2531
2532  def int_x86_mmx_pinsr_w : GCCBuiltin<"__builtin_ia32_vec_set_v4hi">,
2533              Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty,
2534                        llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2535}
2536
2537//===----------------------------------------------------------------------===//
2538// BMI
2539
2540let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2541  def int_x86_bmi_bextr_32 : GCCBuiltin<"__builtin_ia32_bextr_u32">,
2542              Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2543  def int_x86_bmi_bextr_64 : GCCBuiltin<"__builtin_ia32_bextr_u64">,
2544              Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
2545  def int_x86_bmi_bzhi_32 : GCCBuiltin<"__builtin_ia32_bzhi_si">,
2546              Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2547  def int_x86_bmi_bzhi_64 : GCCBuiltin<"__builtin_ia32_bzhi_di">,
2548              Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
2549  def int_x86_bmi_pdep_32 : GCCBuiltin<"__builtin_ia32_pdep_si">,
2550              Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2551  def int_x86_bmi_pdep_64 : GCCBuiltin<"__builtin_ia32_pdep_di">,
2552              Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
2553  def int_x86_bmi_pext_32 : GCCBuiltin<"__builtin_ia32_pext_si">,
2554              Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2555  def int_x86_bmi_pext_64 : GCCBuiltin<"__builtin_ia32_pext_di">,
2556              Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
2557}
2558
2559//===----------------------------------------------------------------------===//
2560// FS/GS Base
2561
2562let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2563  def int_x86_rdfsbase_32 : GCCBuiltin<"__builtin_ia32_rdfsbase32">,
2564              Intrinsic<[llvm_i32_ty], []>;
2565  def int_x86_rdgsbase_32 : GCCBuiltin<"__builtin_ia32_rdgsbase32">,
2566              Intrinsic<[llvm_i32_ty], []>;
2567  def int_x86_rdfsbase_64 : GCCBuiltin<"__builtin_ia32_rdfsbase64">,
2568              Intrinsic<[llvm_i64_ty], []>;
2569  def int_x86_rdgsbase_64 : GCCBuiltin<"__builtin_ia32_rdgsbase64">,
2570              Intrinsic<[llvm_i64_ty], []>;
2571  def int_x86_wrfsbase_32 : GCCBuiltin<"__builtin_ia32_wrfsbase32">,
2572              Intrinsic<[], [llvm_i32_ty]>;
2573  def int_x86_wrgsbase_32 : GCCBuiltin<"__builtin_ia32_wrgsbase32">,
2574              Intrinsic<[], [llvm_i32_ty]>;
2575  def int_x86_wrfsbase_64 : GCCBuiltin<"__builtin_ia32_wrfsbase64">,
2576              Intrinsic<[], [llvm_i64_ty]>;
2577  def int_x86_wrgsbase_64 : GCCBuiltin<"__builtin_ia32_wrgsbase64">,
2578              Intrinsic<[], [llvm_i64_ty]>;
2579}
2580
2581//===----------------------------------------------------------------------===//
2582// Half float conversion
2583
2584let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2585  def int_x86_vcvtph2ps_128 : GCCBuiltin<"__builtin_ia32_vcvtph2ps">,
2586              Intrinsic<[llvm_v4f32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2587  def int_x86_vcvtph2ps_256 : GCCBuiltin<"__builtin_ia32_vcvtph2ps256">,
2588              Intrinsic<[llvm_v8f32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
2589  def int_x86_vcvtps2ph_128 : GCCBuiltin<"__builtin_ia32_vcvtps2ph">,
2590              Intrinsic<[llvm_v8i16_ty], [llvm_v4f32_ty, llvm_i32_ty],
2591                        [IntrNoMem]>;
2592  def int_x86_vcvtps2ph_256 : GCCBuiltin<"__builtin_ia32_vcvtps2ph256">,
2593              Intrinsic<[llvm_v8i16_ty], [llvm_v8f32_ty, llvm_i32_ty],
2594                        [IntrNoMem]>;
2595}
2596
2597//===----------------------------------------------------------------------===//
2598// TBM
2599
2600let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2601  def int_x86_tbm_bextri_u32 : GCCBuiltin<"__builtin_ia32_bextri_u32">,
2602        Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
2603  def int_x86_tbm_bextri_u64 : GCCBuiltin<"__builtin_ia32_bextri_u64">,
2604        Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
2605}
2606
2607//===----------------------------------------------------------------------===//
2608// RDRAND intrinsics - Return a random value and whether it is valid.
2609// RDSEED intrinsics - Return a NIST SP800-90B & C compliant random value and
2610// whether it is valid.
2611
2612let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2613  // These are declared side-effecting so they don't get eliminated by CSE or
2614  // LICM.
2615  def int_x86_rdrand_16 : Intrinsic<[llvm_i16_ty, llvm_i32_ty], [], []>;
2616  def int_x86_rdrand_32 : Intrinsic<[llvm_i32_ty, llvm_i32_ty], [], []>;
2617  def int_x86_rdrand_64 : Intrinsic<[llvm_i64_ty, llvm_i32_ty], [], []>;
2618  def int_x86_rdseed_16 : Intrinsic<[llvm_i16_ty, llvm_i32_ty], [], []>;
2619  def int_x86_rdseed_32 : Intrinsic<[llvm_i32_ty, llvm_i32_ty], [], []>;
2620  def int_x86_rdseed_64 : Intrinsic<[llvm_i64_ty, llvm_i32_ty], [], []>;
2621}
2622
2623//===----------------------------------------------------------------------===//
2624// RTM intrinsics. Transactional Memory support.
2625
2626let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2627  def int_x86_xbegin : GCCBuiltin<"__builtin_ia32_xbegin">,
2628              Intrinsic<[llvm_i32_ty], [], []>;
2629  def int_x86_xend : GCCBuiltin<"__builtin_ia32_xend">,
2630              Intrinsic<[], [], []>;
2631  def int_x86_xabort : GCCBuiltin<"__builtin_ia32_xabort">,
2632              Intrinsic<[], [llvm_i8_ty], [IntrNoReturn]>;
2633  def int_x86_xtest : GCCBuiltin<"__builtin_ia32_xtest">,
2634              Intrinsic<[llvm_i32_ty], [], []>;
2635}
2636
2637//===----------------------------------------------------------------------===//
2638// AVX512
2639
2640// Mask ops
2641let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2642  // Mask instructions
2643  // 16-bit mask
2644  def int_x86_kadd_v16i1 : GCCBuiltin<"__builtin_ia32_kaddw">,
2645              Intrinsic<[llvm_v16i1_ty], [llvm_v16i1_ty, llvm_v16i1_ty],
2646                         [IntrNoMem]>;
2647  def int_x86_kand_v16i1 : GCCBuiltin<"__builtin_ia32_kandw">,
2648              Intrinsic<[llvm_v16i1_ty], [llvm_v16i1_ty, llvm_v16i1_ty],
2649                         [IntrNoMem]>;
2650  def int_x86_kandn_v16i1 : GCCBuiltin<"__builtin_ia32_kandnw">,
2651              Intrinsic<[llvm_v16i1_ty], [llvm_v16i1_ty, llvm_v16i1_ty],
2652                         [IntrNoMem]>;
2653  def int_x86_knot_v16i1 : GCCBuiltin<"__builtin_ia32_knotw">,
2654              Intrinsic<[llvm_v16i1_ty], [llvm_v16i1_ty], [IntrNoMem]>;
2655  def int_x86_kor_v16i1 : GCCBuiltin<"__builtin_ia32_korw">,
2656              Intrinsic<[llvm_v16i1_ty], [llvm_v16i1_ty, llvm_v16i1_ty],
2657                         [IntrNoMem]>;
2658  def int_x86_kxor_v16i1 : GCCBuiltin<"__builtin_ia32_kxorw">,
2659              Intrinsic<[llvm_v16i1_ty], [llvm_v16i1_ty, llvm_v16i1_ty],
2660                         [IntrNoMem]>;
2661  def int_x86_kxnor_v16i1 : GCCBuiltin<"__builtin_ia32_kxnorw">,
2662              Intrinsic<[llvm_v16i1_ty], [llvm_v16i1_ty, llvm_v16i1_ty],
2663                         [IntrNoMem]>;
2664  def int_x86_mask2int_v16i1 : GCCBuiltin<"__builtin_ia32_mask2intw">,
2665              Intrinsic<[llvm_i32_ty], [llvm_v16i1_ty], [IntrNoMem]>;
2666  def int_x86_int2mask_v16i1 : GCCBuiltin<"__builtin_ia32_int2maskw">,
2667              Intrinsic<[llvm_v16i1_ty], [llvm_i32_ty], [IntrNoMem]>;
2668  def int_x86_kunpck_v16i1 : GCCBuiltin<"__builtin_ia32_kunpckbw">,
2669              Intrinsic<[llvm_v16i1_ty], [llvm_v8i1_ty, llvm_v8i1_ty],
2670                         [IntrNoMem]>;
2671  def int_x86_avx512_kortestz : GCCBuiltin<"__builtin_ia32_kortestz">,
2672              Intrinsic<[llvm_i32_ty], [llvm_i16_ty, llvm_i16_ty],
2673                        [IntrNoMem]>;
2674  def int_x86_avx512_kortestc : GCCBuiltin<"__builtin_ia32_kortestc">,
2675              Intrinsic<[llvm_i32_ty], [llvm_i16_ty, llvm_i16_ty],
2676                        [IntrNoMem]>;
2677}
2678
2679// Conversion ops
2680let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2681  def int_x86_avx512_cvtss2usi : GCCBuiltin<"__builtin_ia32_cvtss2usi">,
2682              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
2683  def int_x86_avx512_cvtss2usi64 : GCCBuiltin<"__builtin_ia32_cvtss2usi64">,
2684              Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty], [IntrNoMem]>;
2685  def int_x86_avx512_cvttss2usi : GCCBuiltin<"__builtin_ia32_cvttss2usi">,
2686              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
2687  def int_x86_avx512_cvttss2usi64 : GCCBuiltin<"__builtin_ia32_cvttss2usi64">,
2688              Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty], [IntrNoMem]>;
2689  def int_x86_avx512_cvtusi2ss : GCCBuiltin<"__builtin_ia32_cvtusi2ss">,
2690              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
2691                         llvm_i32_ty], [IntrNoMem]>;
2692  def int_x86_avx512_cvtusi642ss : GCCBuiltin<"__builtin_ia32_cvtusi642ss">,
2693              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
2694                         llvm_i64_ty], [IntrNoMem]>;
2695
2696  def int_x86_avx512_cvtsd2usi : GCCBuiltin<"__builtin_ia32_cvtsd2usi">,
2697              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
2698  def int_x86_avx512_cvtsd2usi64 : GCCBuiltin<"__builtin_ia32_cvtsd2usi64">,
2699              Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
2700  def int_x86_avx512_cvttsd2usi : GCCBuiltin<"__builtin_ia32_cvttsd2usi">,
2701              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
2702  def int_x86_avx512_cvttsd2usi64 : GCCBuiltin<"__builtin_ia32_cvttsd2usi64">,
2703              Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
2704  def int_x86_avx512_cvtusi2sd : GCCBuiltin<"__builtin_ia32_cvtusi2sd">,
2705              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
2706                         llvm_i32_ty], [IntrNoMem]>;
2707  def int_x86_avx512_cvtusi642sd : GCCBuiltin<"__builtin_ia32_cvtusi642sd">,
2708              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
2709                         llvm_i64_ty], [IntrNoMem]>;
2710
2711  def int_x86_avx512_vcvtph2ps_512 : GCCBuiltin<"__builtin_ia32_vcvtph2ps512">,
2712              Intrinsic<[llvm_v16f32_ty], [llvm_v16i16_ty], [IntrNoMem]>;
2713  def int_x86_avx512_vcvtps2ph_512 : GCCBuiltin<"__builtin_ia32_vcvtps2ph512">,
2714              Intrinsic<[llvm_v16i16_ty], [llvm_v16f32_ty, llvm_i32_ty],
2715                        [IntrNoMem]>;
2716}
2717
2718// Vector convert
2719let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2720  def int_x86_avx512_cvt_ps2dq_512 : GCCBuiltin<"__builtin_ia32_cvtps2dq512">,
2721        Intrinsic<[llvm_v16i32_ty], [llvm_v16f32_ty], [IntrNoMem]>;
2722  def int_x86_avx512_cvtdq2_ps_512 : GCCBuiltin<"__builtin_ia32_cvtdq2ps512">,
2723        Intrinsic<[llvm_v16f32_ty], [llvm_v16i32_ty], [IntrNoMem]>;
2724}
2725
2726// Vector load with broadcast
2727let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2728  def int_x86_avx512_vbroadcast_ss_512 :
2729        GCCBuiltin<"__builtin_ia32_vbroadcastss512">,
2730        Intrinsic<[llvm_v16f32_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
2731  def int_x86_avx512_vbroadcast_ss_ps_512 :
2732              GCCBuiltin<"__builtin_ia32_vbroadcastss_ps512">,
2733              Intrinsic<[llvm_v16f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
2734
2735  def int_x86_avx512_vbroadcast_sd_512 :
2736        GCCBuiltin<"__builtin_ia32_vbroadcastsd512">,
2737        Intrinsic<[llvm_v8f64_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
2738  def int_x86_avx512_vbroadcast_sd_pd_512 :
2739              GCCBuiltin<"__builtin_ia32_vbroadcastsd_pd512">,
2740              Intrinsic<[llvm_v8f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
2741
2742  def int_x86_avx512_pbroadcastd_512 :
2743         GCCBuiltin<"__builtin_ia32_pbroadcastd512">,
2744         Intrinsic<[llvm_v16i32_ty], [llvm_v4i32_ty], [IntrNoMem]>;
2745  def int_x86_avx512_pbroadcastd_i32_512 :
2746         Intrinsic<[llvm_v16i32_ty], [llvm_i32_ty], [IntrNoMem]>;
2747
2748  def int_x86_avx512_pbroadcastq_512 :
2749         GCCBuiltin<"__builtin_ia32_pbroadcastq512">,
2750         Intrinsic<[llvm_v8i64_ty], [llvm_v2i64_ty], [IntrNoMem]>;
2751  def int_x86_avx512_pbroadcastq_i64_512 :
2752         Intrinsic<[llvm_v8i64_ty], [llvm_i64_ty], [IntrNoMem]>;
2753}
2754
2755// Vector sign and zero extend
2756let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2757  def int_x86_avx512_pmovzxbq : GCCBuiltin<"__builtin_ia32_pmovzxbq512">,
2758              Intrinsic<[llvm_v8i64_ty], [llvm_v16i8_ty],
2759                        [IntrNoMem]>;
2760  def int_x86_avx512_pmovzxwd : GCCBuiltin<"__builtin_ia32_pmovzxwd512">,
2761              Intrinsic<[llvm_v16i32_ty], [llvm_v16i16_ty],
2762                        [IntrNoMem]>;
2763  def int_x86_avx512_pmovzxbd : GCCBuiltin<"__builtin_ia32_pmovzxbd512">,
2764              Intrinsic<[llvm_v16i32_ty], [llvm_v16i8_ty],
2765                        [IntrNoMem]>;
2766  def int_x86_avx512_pmovzxwq : GCCBuiltin<"__builtin_ia32_pmovzxwq512">,
2767              Intrinsic<[llvm_v8i64_ty], [llvm_v8i16_ty],
2768                        [IntrNoMem]>;
2769  def int_x86_avx512_pmovzxdq : GCCBuiltin<"__builtin_ia32_pmovzxdq512">,
2770              Intrinsic<[llvm_v8i64_ty], [llvm_v8i32_ty],
2771                        [IntrNoMem]>;
2772}
2773
2774// Arithmetic ops
2775let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2776  def int_x86_avx512_min_ps_512 : GCCBuiltin<"__builtin_ia32_minps512">,
2777      Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty,
2778                llvm_v16f32_ty], [IntrNoMem]>;
2779  def int_x86_avx512_min_pd_512 : GCCBuiltin<"__builtin_ia32_minpd512">,
2780      Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty,
2781                llvm_v8f64_ty], [IntrNoMem]>;
2782  def int_x86_avx512_max_ps_512 : GCCBuiltin<"__builtin_ia32_maxps512">,
2783      Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty,
2784                llvm_v16f32_ty], [IntrNoMem]>;
2785  def int_x86_avx512_max_pd_512 : GCCBuiltin<"__builtin_ia32_maxpd512">,
2786      Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty,
2787                llvm_v8f64_ty], [IntrNoMem]>;
2788
2789  def int_x86_avx512_pmaxu_d : GCCBuiltin<"__builtin_ia32_pmaxud512">,
2790      Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
2791                llvm_v16i32_ty], [IntrNoMem]>;
2792  def int_x86_avx512_pmaxu_q : GCCBuiltin<"__builtin_ia32_pmaxuq512">,
2793      Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
2794                llvm_v8i64_ty], [IntrNoMem]>;
2795  def int_x86_avx512_pmaxs_d : GCCBuiltin<"__builtin_ia32_pmaxsd512">,
2796      Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
2797                llvm_v16i32_ty], [IntrNoMem]>;
2798  def int_x86_avx512_pmaxs_q : GCCBuiltin<"__builtin_ia32_pmaxsq512">,
2799      Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
2800                llvm_v8i64_ty], [IntrNoMem]>;
2801
2802  def int_x86_avx512_pminu_d : GCCBuiltin<"__builtin_ia32_pminud512">,
2803      Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
2804                llvm_v16i32_ty], [IntrNoMem]>;
2805  def int_x86_avx512_pminu_q : GCCBuiltin<"__builtin_ia32_pminuq512">,
2806      Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
2807                llvm_v8i64_ty], [IntrNoMem]>;
2808  def int_x86_avx512_pmins_d : GCCBuiltin<"__builtin_ia32_pminsd512">,
2809      Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
2810                llvm_v16i32_ty], [IntrNoMem]>;
2811  def int_x86_avx512_pmins_q : GCCBuiltin<"__builtin_ia32_pminsq512">,
2812      Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
2813                llvm_v8i64_ty], [IntrNoMem]>;
2814
2815  def int_x86_avx512_rndscale_ss        : GCCBuiltin<"__builtin_ia32_rndscaless">,
2816              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
2817                         llvm_i32_ty], [IntrNoMem]>;
2818  def int_x86_avx512_rndscale_sd        : GCCBuiltin<"__builtin_ia32_rndscalesd">,
2819              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
2820                         llvm_i32_ty], [IntrNoMem]>;
2821  def int_x86_avx512_sqrt_ss        : GCCBuiltin<"__builtin_ia32_sqrtrndss">,
2822              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
2823                        [IntrNoMem]>;
2824  def int_x86_avx512_sqrt_sd        : GCCBuiltin<"__builtin_ia32_sqrtrndsd">,
2825              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty],
2826                        [IntrNoMem]>;
2827
2828  def int_x86_avx512_rndscale_ps_512        : GCCBuiltin<"__builtin_ia32_rndscaleps512">,
2829              Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty,
2830                         llvm_i32_ty], [IntrNoMem]>;
2831  def int_x86_avx512_rndscale_pd_512        : GCCBuiltin<"__builtin_ia32_rndscalepd512">,
2832              Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty,
2833                         llvm_i32_ty], [IntrNoMem]>;
2834                         
2835  def int_x86_avx512_sqrt_pd_512 : GCCBuiltin<"__builtin_ia32_sqrtpd512">,
2836        Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty], [IntrNoMem]>;
2837  def int_x86_avx512_sqrt_ps_512 : GCCBuiltin<"__builtin_ia32_sqrtps512">,
2838        Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty], [IntrNoMem]>;
2839
2840  def int_x86_avx512_rcp14_ps_512 : GCCBuiltin<"__builtin_ia32_rcp14ps512">,
2841            Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty],
2842                      [IntrNoMem]>;
2843  def int_x86_avx512_rcp14_pd_512 : GCCBuiltin<"__builtin_ia32_rcp14pd512">,
2844            Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty],
2845                      [IntrNoMem]>;
2846  def int_x86_avx512_rcp14_ss : GCCBuiltin<"__builtin_ia32_rcp14ss">,
2847            Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
2848                      [IntrNoMem]>;
2849  def int_x86_avx512_rcp14_sd : GCCBuiltin<"__builtin_ia32_rcp14sd">,
2850            Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty],
2851                      [IntrNoMem]>;
2852  def int_x86_avx512_rsqrt14_ps_512 : GCCBuiltin<"__builtin_ia32_rsqrt14ps512">,
2853            Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty],
2854                      [IntrNoMem]>;
2855  def int_x86_avx512_rsqrt14_pd_512 : GCCBuiltin<"__builtin_ia32_rsqrt14pd512">,
2856            Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty],
2857                      [IntrNoMem]>;
2858  def int_x86_avx512_rsqrt14_ss : GCCBuiltin<"__builtin_ia32_rsqrt14ss">,
2859            Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
2860                      [IntrNoMem]>;
2861  def int_x86_avx512_rsqrt14_sd : GCCBuiltin<"__builtin_ia32_rsqrt14sd">,
2862            Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty],
2863                      [IntrNoMem]>;
2864
2865  def int_x86_avx512_rcp28_ps_512 : GCCBuiltin<"__builtin_ia32_rcp28ps512">,
2866            Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty],
2867                      [IntrNoMem]>;
2868  def int_x86_avx512_rcp28_pd_512 : GCCBuiltin<"__builtin_ia32_rcp28pd512">,
2869            Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty],
2870                      [IntrNoMem]>;
2871  def int_x86_avx512_rcp28_ss : GCCBuiltin<"__builtin_ia32_rcp28ss">,
2872            Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
2873                      [IntrNoMem]>;
2874  def int_x86_avx512_rcp28_sd : GCCBuiltin<"__builtin_ia32_rcp28sd">,
2875            Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty],
2876                      [IntrNoMem]>;
2877  def int_x86_avx512_rsqrt28_ps_512 : GCCBuiltin<"__builtin_ia32_rsqrt28ps512">,
2878            Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty],
2879                      [IntrNoMem]>;
2880  def int_x86_avx512_rsqrt28_pd_512 : GCCBuiltin<"__builtin_ia32_rsqrt28pd512">,
2881            Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty],
2882                      [IntrNoMem]>;
2883  def int_x86_avx512_rsqrt28_ss : GCCBuiltin<"__builtin_ia32_rsqrt28ss">,
2884            Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
2885                      [IntrNoMem]>;
2886  def int_x86_avx512_rsqrt28_sd : GCCBuiltin<"__builtin_ia32_rsqrt28sd">,
2887            Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty],
2888                      [IntrNoMem]>;
2889}
2890
2891// Integer shift ops.
2892let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
2893  def int_x86_avx512_psll_dq : GCCBuiltin<"__builtin_ia32_pslldqi512">,
2894              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
2895                         llvm_i32_ty], [IntrNoMem]>;
2896  def int_x86_avx512_psrl_dq : GCCBuiltin<"__builtin_ia32_psrldqi512">,
2897              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
2898                         llvm_i32_ty], [IntrNoMem]>;
2899  def int_x86_avx512_psll_dq_bs : GCCBuiltin<"__builtin_ia32_pslldqi512_byteshift">,
2900              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
2901                         llvm_i32_ty], [IntrNoMem]>;
2902  def int_x86_avx512_psrl_dq_bs : GCCBuiltin<"__builtin_ia32_psrldqi512_byteshift">,
2903              Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
2904                         llvm_i32_ty], [IntrNoMem]>;
2905}
2906
2907// Gather and Scatter ops
2908let TargetPrefix = "x86" in {
2909  def int_x86_avx512_gather_dpd_mask_512  : GCCBuiltin<"__builtin_ia32_mask_gatherdpd512">,
2910          Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_i8_ty,
2911                     llvm_v8i32_ty, llvm_ptr_ty, llvm_i32_ty],
2912                    [IntrReadMem]>;
2913  def int_x86_avx512_gather_dps_mask_512  : GCCBuiltin<"__builtin_ia32_mask_gatherdps512">,
2914          Intrinsic<[llvm_v16f32_ty], [llvm_v16f32_ty, llvm_i16_ty,
2915                     llvm_v16i32_ty, llvm_ptr_ty, llvm_i32_ty],
2916                    [IntrReadMem]>;
2917  def int_x86_avx512_gather_qpd_mask_512  : GCCBuiltin<"__builtin_ia32_mask_gatherqpd512">,
2918          Intrinsic<[llvm_v8f64_ty], [llvm_v8f64_ty, llvm_i8_ty,
2919                     llvm_v8i64_ty, llvm_ptr_ty, llvm_i32_ty],
2920                    [IntrReadMem]>;
2921  def int_x86_avx512_gather_qps_mask_512  : GCCBuiltin<"__builtin_ia32_mask_gatherqps512">,
2922          Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_i8_ty,
2923                     llvm_v8i64_ty, llvm_ptr_ty, llvm_i32_ty],
2924                    [IntrReadMem]>;
2925
2926  def int_x86_avx512_gather_dpd_512  : GCCBuiltin<"__builtin_ia32_gatherdpd512">,
2927          Intrinsic<[llvm_v8f64_ty], [llvm_v8i32_ty, llvm_ptr_ty,
2928                     llvm_i32_ty],
2929                    [IntrReadMem]>;
2930  def int_x86_avx512_gather_dps_512  : GCCBuiltin<"__builtin_ia32_gatherdps512">,
2931          Intrinsic<[llvm_v16f32_ty], [llvm_v16i32_ty, llvm_ptr_ty,
2932                     llvm_i32_ty],
2933                    [IntrReadMem]>;
2934  def int_x86_avx512_gather_qpd_512  : GCCBuiltin<"__builtin_ia32_gatherqpd512">,
2935          Intrinsic<[llvm_v8f64_ty], [llvm_v8i64_ty, llvm_ptr_ty,
2936                     llvm_i32_ty],
2937                    [IntrReadArgMem]>;
2938  def int_x86_avx512_gather_qps_512  : GCCBuiltin<"__builtin_ia32_gatherqps512">,
2939          Intrinsic<[llvm_v8f32_ty], [llvm_v8i64_ty, llvm_ptr_ty, 
2940                     llvm_i32_ty],
2941                    [IntrReadMem]>;
2942
2943  def int_x86_avx512_gather_dpq_mask_512  : GCCBuiltin<"__builtin_ia32_mask_gatherdpq512">,
2944          Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_i8_ty,
2945                     llvm_v8i32_ty, llvm_ptr_ty, llvm_i32_ty],
2946                    [IntrReadMem]>;
2947  def int_x86_avx512_gather_dpi_mask_512  : GCCBuiltin<"__builtin_ia32_mask_gatherdpi512">,
2948          Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_i16_ty,
2949                     llvm_v16i32_ty, llvm_ptr_ty, llvm_i32_ty],
2950                    [IntrReadArgMem]>;
2951  def int_x86_avx512_gather_qpq_mask_512  : GCCBuiltin<"__builtin_ia32_mask_gatherqpq512">,
2952          Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_i8_ty,
2953                     llvm_v8i64_ty, llvm_ptr_ty, llvm_i32_ty],
2954                    [IntrReadArgMem]>;
2955  def int_x86_avx512_gather_qpi_mask_512  : GCCBuiltin<"__builtin_ia32_mask_gatherqpi512">,
2956          Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_i8_ty,
2957                     llvm_v8i64_ty, llvm_ptr_ty, llvm_i32_ty],
2958                    [IntrReadMem]>;
2959
2960  def int_x86_avx512_gather_dpq_512  : GCCBuiltin<"__builtin_ia32_gatherdpq512">,
2961          Intrinsic<[llvm_v8i64_ty], [llvm_v8i32_ty, llvm_ptr_ty,
2962                     llvm_i32_ty],
2963                    [IntrReadArgMem]>;
2964  def int_x86_avx512_gather_dpi_512  : GCCBuiltin<"__builtin_ia32_gatherdpi512">,
2965          Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_ptr_ty, 
2966                     llvm_i32_ty],
2967                    [IntrReadArgMem]>;
2968  def int_x86_avx512_gather_qpq_512  : GCCBuiltin<"__builtin_ia32_gatherqpq512">,
2969          Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty, llvm_ptr_ty,
2970                     llvm_i32_ty],
2971                    [IntrReadArgMem]>;
2972  def int_x86_avx512_gather_qpi_512  : GCCBuiltin<"__builtin_ia32_gatherqpi512">,
2973          Intrinsic<[llvm_v8i32_ty], [llvm_v8i64_ty, llvm_ptr_ty,
2974                     llvm_i32_ty],
2975                    [IntrReadArgMem]>;
2976// scatter
2977  def int_x86_avx512_scatter_dpd_mask_512  : GCCBuiltin<"__builtin_ia32_mask_scatterdpd512">,
2978          Intrinsic<[], [llvm_ptr_ty, llvm_i8_ty,
2979                        llvm_v8i32_ty, llvm_v8f64_ty, llvm_i32_ty],
2980                    [IntrReadWriteArgMem]>;
2981  def int_x86_avx512_scatter_dps_mask_512  : GCCBuiltin<"__builtin_ia32_mask_scatterdps512">,
2982          Intrinsic<[], [llvm_ptr_ty, llvm_i16_ty,
2983                       llvm_v16i32_ty, llvm_v16f32_ty, llvm_i32_ty],
2984                    [IntrReadWriteArgMem]>;
2985  def int_x86_avx512_scatter_qpd_mask_512  : GCCBuiltin<"__builtin_ia32_mask_scatterqpd512">,
2986          Intrinsic<[], [llvm_ptr_ty, llvm_i8_ty,
2987                     llvm_v8i64_ty, llvm_v8f64_ty, llvm_i32_ty],
2988                    [IntrReadWriteArgMem]>;
2989  def int_x86_avx512_scatter_qps_mask_512  : GCCBuiltin<"__builtin_ia32_mask_scatterqps512">,
2990          Intrinsic<[], [llvm_ptr_ty, llvm_i8_ty,
2991                     llvm_v8i64_ty, llvm_v8f32_ty, llvm_i32_ty],
2992                    [IntrReadWriteArgMem]>;
2993
2994  def int_x86_avx512_scatter_dpd_512  : GCCBuiltin<"__builtin_ia32_scatterdpd512">,
2995          Intrinsic<[], [llvm_ptr_ty, llvm_v8i32_ty, llvm_v8f64_ty, 
2996                         llvm_i32_ty],
2997                    [IntrReadWriteArgMem]>;
2998  def int_x86_avx512_scatter_dps_512  : GCCBuiltin<"__builtin_ia32_scatterdps512">,
2999          Intrinsic<[], [llvm_ptr_ty, llvm_v16i32_ty, llvm_v16f32_ty, 
3000                         llvm_i32_ty],
3001                    [IntrReadWriteArgMem]>;
3002  def int_x86_avx512_scatter_qpd_512  : GCCBuiltin<"__builtin_ia32_scatterqpd512">,
3003          Intrinsic<[], [llvm_ptr_ty, llvm_v8i64_ty, llvm_v8f64_ty, 
3004                         llvm_i32_ty],
3005                    [IntrReadWriteArgMem]>;
3006  def int_x86_avx512_scatter_qps_512  : GCCBuiltin<"__builtin_ia32_scatterqps512">,
3007          Intrinsic<[], [llvm_ptr_ty, llvm_v8i64_ty, llvm_v8f32_ty, 
3008                         llvm_i32_ty],
3009                    [IntrReadWriteArgMem]>;
3010
3011  def int_x86_avx512_scatter_dpq_mask_512  : GCCBuiltin<"__builtin_ia32_mask_scatterdpq512">,
3012          Intrinsic<[], [llvm_ptr_ty, llvm_i8_ty, llvm_v8i32_ty, 
3013                         llvm_v8i64_ty, llvm_i32_ty],
3014                    [IntrReadWriteArgMem]>;
3015  def int_x86_avx512_scatter_dpi_mask_512  : GCCBuiltin<"__builtin_ia32_mask_scatterdpi512">,
3016          Intrinsic<[], [llvm_ptr_ty, llvm_i16_ty,
3017                     llvm_v16i32_ty, llvm_v16i32_ty, llvm_i32_ty],
3018                    [IntrReadWriteArgMem]>;
3019  def int_x86_avx512_scatter_qpq_mask_512  : GCCBuiltin<"__builtin_ia32_mask_scatterqpq512">,
3020          Intrinsic<[], [llvm_ptr_ty, llvm_i8_ty,
3021                     llvm_v8i64_ty, llvm_v8i64_ty, llvm_i32_ty],
3022                    [IntrReadWriteArgMem]>;
3023  def int_x86_avx512_scatter_qpi_mask_512  : GCCBuiltin<"__builtin_ia32_mask_scatterqpi512">,
3024          Intrinsic<[], [llvm_ptr_ty, llvm_i8_ty,
3025                     llvm_v8i64_ty, llvm_v8i32_ty, llvm_i32_ty],
3026                    [IntrReadWriteArgMem]>;
3027
3028  def int_x86_avx512_scatter_dpq_512  : GCCBuiltin<"__builtin_ia32_scatterdpq512">,
3029          Intrinsic<[], [llvm_ptr_ty,
3030                         llvm_v8i32_ty, llvm_v8i64_ty, llvm_i32_ty],
3031                    []>;
3032  def int_x86_avx512_scatter_dpi_512  : GCCBuiltin<"__builtin_ia32_scatterdpi512">,
3033          Intrinsic<[], [llvm_ptr_ty,
3034                     llvm_v16i32_ty, llvm_v16i32_ty, llvm_i32_ty],
3035                    []>;
3036  def int_x86_avx512_scatter_qpq_512  : GCCBuiltin<"__builtin_ia32_scatterqpq512">,
3037          Intrinsic<[], [llvm_ptr_ty, llvm_v8i64_ty, llvm_v8i64_ty,
3038                         llvm_i32_ty],
3039                    []>;
3040  def int_x86_avx512_scatter_qpi_512  : GCCBuiltin<"__builtin_ia32_scatterqpi512">,
3041          Intrinsic<[], [llvm_ptr_ty, llvm_v8i64_ty, llvm_v8i32_ty, 
3042                         llvm_i32_ty],
3043                    []>;
3044}
3045
3046// AVX-512 conflict detection
3047let TargetPrefix = "x86" in {
3048  def int_x86_avx512_conflict_d_512 : GCCBuiltin<"__builtin_ia32_conflictd512">,
3049          Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty],
3050          []>;
3051  def int_x86_avx512_conflict_d_mask_512 :
3052          GCCBuiltin<"__builtin_ia32_mask_conflictd512">,
3053          Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty,
3054                    llvm_v16i1_ty, llvm_v16i32_ty],
3055                    []>;
3056  def int_x86_avx512_conflict_d_maskz_512:
3057          GCCBuiltin<"__builtin_ia32_maskz_conflictd512">,
3058          Intrinsic<[llvm_v16i32_ty], [llvm_v16i1_ty, llvm_v16i32_ty],
3059                    []>;
3060
3061  def int_x86_avx512_conflict_q_512 : GCCBuiltin<"__builtin_ia32_conflictq512">,
3062          Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty],
3063          []>;
3064  def int_x86_avx512_conflict_q_mask_512 :
3065          GCCBuiltin<"__builtin_ia32_mask_conflictq512">,
3066          Intrinsic<[llvm_v8i64_ty], [llvm_v8i64_ty,
3067                    llvm_v8i1_ty, llvm_v8i64_ty],
3068                    []>;
3069  def int_x86_avx512_conflict_q_maskz_512:
3070          GCCBuiltin<"__builtin_ia32_maskz_conflictq512">,
3071          Intrinsic<[llvm_v8i64_ty], [llvm_v8i1_ty, llvm_v8i64_ty],
3072                    []>;
3073}
3074
3075// Vector blend
3076let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
3077  def int_x86_avx512_mskblend_ps_512 : GCCBuiltin<"__builtin_ia32_mskblendps512">,
3078        Intrinsic<[llvm_v16f32_ty],
3079                  [llvm_v16i1_ty, llvm_v16f32_ty, llvm_v16f32_ty],
3080                  [IntrNoMem]>;
3081  def int_x86_avx512_mskblend_pd_512 : GCCBuiltin<"__builtin_ia32_mskblendpd512">,
3082        Intrinsic<[llvm_v8f64_ty],
3083                  [llvm_v8i1_ty, llvm_v8f64_ty, llvm_v8f64_ty],
3084                  [IntrNoMem]>;
3085
3086  def int_x86_avx512_mskblend_d_512 : GCCBuiltin<"__builtin_ia32_mskblendd512">,
3087        Intrinsic<[llvm_v16i32_ty],
3088                  [llvm_v16i1_ty, llvm_v16i32_ty, llvm_v16i32_ty],
3089                  [IntrNoMem]>;
3090  def int_x86_avx512_mskblend_q_512 : GCCBuiltin<"__builtin_ia32_mskblendq512">,
3091        Intrinsic<[llvm_v8i64_ty],
3092                  [llvm_v8i1_ty, llvm_v8i64_ty, llvm_v8i64_ty],
3093                  [IntrNoMem]>;
3094}
3095
3096// Misc.
3097let TargetPrefix = "x86" in {
3098  def int_x86_avx512_cmpeq_pi_512 : GCCBuiltin<"__builtin_ia32_cmpeqpi512">,
3099            Intrinsic<[llvm_i16_ty], [llvm_v16i32_ty, llvm_v16i32_ty],
3100                      [IntrNoMem]>;
3101  def int_x86_avx512_and_pi : GCCBuiltin<"__builtin_ia32_andpi512">,
3102            Intrinsic<[llvm_v16i32_ty], [llvm_v16i32_ty, llvm_v16i32_ty],
3103         [IntrNoMem]>;
3104}
3105
3106//===----------------------------------------------------------------------===//
3107// SHA intrinsics
3108let TargetPrefix = "x86" in {
3109  def int_x86_sha1rnds4 : GCCBuiltin<"__builtin_ia32_sha1rnds4">,
3110        Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty, llvm_i8_ty],
3111                  [IntrNoMem]>;
3112  def int_x86_sha1nexte : GCCBuiltin<"__builtin_ia32_sha1nexte">,
3113      Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
3114  def int_x86_sha1msg1 : GCCBuiltin<"__builtin_ia32_sha1msg1">,
3115      Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
3116  def int_x86_sha1msg2 : GCCBuiltin<"__builtin_ia32_sha1msg2">,
3117      Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
3118  def int_x86_sha256rnds2 : GCCBuiltin<"__builtin_ia32_sha256rnds2">,
3119      Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
3120                [IntrNoMem]>;
3121  def int_x86_sha256msg1 : GCCBuiltin<"__builtin_ia32_sha256msg1">,
3122      Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
3123  def int_x86_sha256msg2 : GCCBuiltin<"__builtin_ia32_sha256msg2">,
3124      Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
3125}
3126