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// SSE1
22
23// Arithmetic ops
24let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
25  def int_x86_sse_add_ss : GCCBuiltin<"__builtin_ia32_addss">,
26              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
27                         llvm_v4f32_ty], [IntrNoMem]>;
28  def int_x86_sse_sub_ss : GCCBuiltin<"__builtin_ia32_subss">,
29              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
30                         llvm_v4f32_ty], [IntrNoMem]>;
31  def int_x86_sse_mul_ss : GCCBuiltin<"__builtin_ia32_mulss">,
32              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
33                         llvm_v4f32_ty], [IntrNoMem]>;
34  def int_x86_sse_div_ss : GCCBuiltin<"__builtin_ia32_divss">,
35              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
36                         llvm_v4f32_ty], [IntrNoMem]>;
37  def int_x86_sse_sqrt_ss : GCCBuiltin<"__builtin_ia32_sqrtss">,
38              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
39                        [IntrNoMem]>;
40  def int_x86_sse_sqrt_ps : GCCBuiltin<"__builtin_ia32_sqrtps">,
41              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
42                        [IntrNoMem]>;
43  def int_x86_sse_rcp_ss : GCCBuiltin<"__builtin_ia32_rcpss">,
44              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
45                        [IntrNoMem]>;
46  def int_x86_sse_rcp_ps : GCCBuiltin<"__builtin_ia32_rcpps">,
47              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
48                        [IntrNoMem]>;
49  def int_x86_sse_rsqrt_ss : GCCBuiltin<"__builtin_ia32_rsqrtss">,
50              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
51                        [IntrNoMem]>;
52  def int_x86_sse_rsqrt_ps : GCCBuiltin<"__builtin_ia32_rsqrtps">,
53              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],
54                        [IntrNoMem]>;
55  def int_x86_sse_min_ss : GCCBuiltin<"__builtin_ia32_minss">,
56              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
57                         llvm_v4f32_ty], [IntrNoMem]>;
58  def int_x86_sse_min_ps : GCCBuiltin<"__builtin_ia32_minps">,
59              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
60                         llvm_v4f32_ty], [IntrNoMem]>;
61  def int_x86_sse_max_ss : GCCBuiltin<"__builtin_ia32_maxss">,
62              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
63                         llvm_v4f32_ty], [IntrNoMem]>;
64  def int_x86_sse_max_ps : GCCBuiltin<"__builtin_ia32_maxps">,
65              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
66                         llvm_v4f32_ty], [IntrNoMem]>;
67}
68
69// Comparison ops
70let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
71  def int_x86_sse_cmp_ss :
72              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
73                         llvm_v4f32_ty, llvm_i8_ty], [IntrNoMem]>;
74  def int_x86_sse_cmp_ps :
75              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
76                         llvm_v4f32_ty, llvm_i8_ty], [IntrNoMem]>;
77  def int_x86_sse_comieq_ss : GCCBuiltin<"__builtin_ia32_comieq">,
78              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
79                         llvm_v4f32_ty], [IntrNoMem]>;
80  def int_x86_sse_comilt_ss : GCCBuiltin<"__builtin_ia32_comilt">,
81              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
82                         llvm_v4f32_ty], [IntrNoMem]>;
83  def int_x86_sse_comile_ss : GCCBuiltin<"__builtin_ia32_comile">,
84              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
85                         llvm_v4f32_ty], [IntrNoMem]>;
86  def int_x86_sse_comigt_ss : GCCBuiltin<"__builtin_ia32_comigt">,
87              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
88                         llvm_v4f32_ty], [IntrNoMem]>;
89  def int_x86_sse_comige_ss : GCCBuiltin<"__builtin_ia32_comige">,
90              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
91                         llvm_v4f32_ty], [IntrNoMem]>;
92  def int_x86_sse_comineq_ss : GCCBuiltin<"__builtin_ia32_comineq">,
93              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
94                         llvm_v4f32_ty], [IntrNoMem]>;
95  def int_x86_sse_ucomieq_ss : GCCBuiltin<"__builtin_ia32_ucomieq">,
96              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
97                         llvm_v4f32_ty], [IntrNoMem]>;
98  def int_x86_sse_ucomilt_ss : GCCBuiltin<"__builtin_ia32_ucomilt">,
99              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
100                         llvm_v4f32_ty], [IntrNoMem]>;
101  def int_x86_sse_ucomile_ss : GCCBuiltin<"__builtin_ia32_ucomile">,
102              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
103                         llvm_v4f32_ty], [IntrNoMem]>;
104  def int_x86_sse_ucomigt_ss : GCCBuiltin<"__builtin_ia32_ucomigt">,
105              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
106                         llvm_v4f32_ty], [IntrNoMem]>;
107  def int_x86_sse_ucomige_ss : GCCBuiltin<"__builtin_ia32_ucomige">,
108              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
109                         llvm_v4f32_ty], [IntrNoMem]>;
110  def int_x86_sse_ucomineq_ss : GCCBuiltin<"__builtin_ia32_ucomineq">,
111              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
112                         llvm_v4f32_ty], [IntrNoMem]>;
113}
114
115
116// Conversion ops
117let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
118  def int_x86_sse_cvtss2si : GCCBuiltin<"__builtin_ia32_cvtss2si">,
119              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
120  def int_x86_sse_cvtss2si64 : GCCBuiltin<"__builtin_ia32_cvtss2si64">,
121              Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty], [IntrNoMem]>;
122  def int_x86_sse_cvttss2si : GCCBuiltin<"__builtin_ia32_cvttss2si">,
123              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
124  def int_x86_sse_cvttss2si64 : GCCBuiltin<"__builtin_ia32_cvttss2si64">,
125              Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty], [IntrNoMem]>;
126  def int_x86_sse_cvtsi2ss : GCCBuiltin<"__builtin_ia32_cvtsi2ss">,
127              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
128                         llvm_i32_ty], [IntrNoMem]>;
129  def int_x86_sse_cvtsi642ss : GCCBuiltin<"__builtin_ia32_cvtsi642ss">,
130              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
131                         llvm_i64_ty], [IntrNoMem]>;
132  def int_x86_sse_cvtps2pi : GCCBuiltin<"__builtin_ia32_cvtps2pi">,
133              Intrinsic<[llvm_v2i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
134  def int_x86_sse_cvttps2pi: GCCBuiltin<"__builtin_ia32_cvttps2pi">,
135              Intrinsic<[llvm_v2i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
136  def int_x86_sse_cvtpi2ps : GCCBuiltin<"__builtin_ia32_cvtpi2ps">,
137              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
138                         llvm_v2i32_ty], [IntrNoMem]>;
139}
140
141// SIMD load ops
142let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
143  def int_x86_sse_loadu_ps : GCCBuiltin<"__builtin_ia32_loadups">,
144              Intrinsic<[llvm_v4f32_ty], [llvm_ptr_ty], [IntrReadMem]>;
145}
146
147// SIMD store ops
148let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
149  def int_x86_sse_storeu_ps : GCCBuiltin<"__builtin_ia32_storeups">,
150              Intrinsic<[], [llvm_ptr_ty,
151                         llvm_v4f32_ty], []>;
152}
153
154// Cacheability support ops
155let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
156  def int_x86_sse_movnt_ps : GCCBuiltin<"__builtin_ia32_movntps">,
157              Intrinsic<[], [llvm_ptr_ty,
158                         llvm_v4f32_ty], []>;
159  def int_x86_sse_sfence : GCCBuiltin<"__builtin_ia32_sfence">,
160              Intrinsic<[], [], []>;
161}
162
163// Control register.
164let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
165  def int_x86_sse_stmxcsr :
166              Intrinsic<[], [llvm_ptr_ty], []>;
167  def int_x86_sse_ldmxcsr :
168              Intrinsic<[], [llvm_ptr_ty], []>;
169}
170
171// Misc.
172let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
173  def int_x86_sse_movmsk_ps : GCCBuiltin<"__builtin_ia32_movmskps">,
174              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
175}
176
177//===----------------------------------------------------------------------===//
178// SSE2
179
180// FP arithmetic ops
181let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
182  def int_x86_sse2_add_sd : GCCBuiltin<"__builtin_ia32_addsd">,
183              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
184                         llvm_v2f64_ty], [IntrNoMem]>;
185  def int_x86_sse2_sub_sd : GCCBuiltin<"__builtin_ia32_subsd">,
186              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
187                         llvm_v2f64_ty], [IntrNoMem]>;
188  def int_x86_sse2_mul_sd : GCCBuiltin<"__builtin_ia32_mulsd">,
189              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
190                         llvm_v2f64_ty], [IntrNoMem]>;
191  def int_x86_sse2_div_sd : GCCBuiltin<"__builtin_ia32_divsd">,
192              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
193                         llvm_v2f64_ty], [IntrNoMem]>;
194  def int_x86_sse2_sqrt_sd : GCCBuiltin<"__builtin_ia32_sqrtsd">,
195              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty],
196                        [IntrNoMem]>;
197  def int_x86_sse2_sqrt_pd : GCCBuiltin<"__builtin_ia32_sqrtpd">,
198              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty],
199                        [IntrNoMem]>;
200  def int_x86_sse2_min_sd : GCCBuiltin<"__builtin_ia32_minsd">,
201              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
202                         llvm_v2f64_ty], [IntrNoMem]>;
203  def int_x86_sse2_min_pd : GCCBuiltin<"__builtin_ia32_minpd">,
204              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
205                         llvm_v2f64_ty], [IntrNoMem]>;
206  def int_x86_sse2_max_sd : GCCBuiltin<"__builtin_ia32_maxsd">,
207              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
208                         llvm_v2f64_ty], [IntrNoMem]>;
209  def int_x86_sse2_max_pd : GCCBuiltin<"__builtin_ia32_maxpd">,
210              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
211                         llvm_v2f64_ty], [IntrNoMem]>;
212}
213
214// FP comparison ops
215let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
216  def int_x86_sse2_cmp_sd :
217              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
218                         llvm_v2f64_ty, llvm_i8_ty], [IntrNoMem]>;
219  def int_x86_sse2_cmp_pd :
220              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
221                         llvm_v2f64_ty, llvm_i8_ty], [IntrNoMem]>;
222  def int_x86_sse2_comieq_sd : GCCBuiltin<"__builtin_ia32_comisdeq">,
223              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
224                         llvm_v2f64_ty], [IntrNoMem]>;
225  def int_x86_sse2_comilt_sd : GCCBuiltin<"__builtin_ia32_comisdlt">,
226              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
227                         llvm_v2f64_ty], [IntrNoMem]>;
228  def int_x86_sse2_comile_sd : GCCBuiltin<"__builtin_ia32_comisdle">,
229              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
230                         llvm_v2f64_ty], [IntrNoMem]>;
231  def int_x86_sse2_comigt_sd : GCCBuiltin<"__builtin_ia32_comisdgt">,
232              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
233                         llvm_v2f64_ty], [IntrNoMem]>;
234  def int_x86_sse2_comige_sd : GCCBuiltin<"__builtin_ia32_comisdge">,
235              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
236                         llvm_v2f64_ty], [IntrNoMem]>;
237  def int_x86_sse2_comineq_sd : GCCBuiltin<"__builtin_ia32_comisdneq">,
238              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
239                         llvm_v2f64_ty], [IntrNoMem]>;
240  def int_x86_sse2_ucomieq_sd : GCCBuiltin<"__builtin_ia32_ucomisdeq">,
241              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
242                         llvm_v2f64_ty], [IntrNoMem]>;
243  def int_x86_sse2_ucomilt_sd : GCCBuiltin<"__builtin_ia32_ucomisdlt">,
244              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
245                         llvm_v2f64_ty], [IntrNoMem]>;
246  def int_x86_sse2_ucomile_sd : GCCBuiltin<"__builtin_ia32_ucomisdle">,
247              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
248                         llvm_v2f64_ty], [IntrNoMem]>;
249  def int_x86_sse2_ucomigt_sd : GCCBuiltin<"__builtin_ia32_ucomisdgt">,
250              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
251                         llvm_v2f64_ty], [IntrNoMem]>;
252  def int_x86_sse2_ucomige_sd : GCCBuiltin<"__builtin_ia32_ucomisdge">,
253              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
254                         llvm_v2f64_ty], [IntrNoMem]>;
255  def int_x86_sse2_ucomineq_sd : GCCBuiltin<"__builtin_ia32_ucomisdneq">,
256              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
257                         llvm_v2f64_ty], [IntrNoMem]>;
258}
259
260// Integer arithmetic ops.
261let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
262  def int_x86_sse2_padds_b : GCCBuiltin<"__builtin_ia32_paddsb128">,
263              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
264                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
265  def int_x86_sse2_padds_w : GCCBuiltin<"__builtin_ia32_paddsw128">,
266              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
267                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
268  def int_x86_sse2_paddus_b : GCCBuiltin<"__builtin_ia32_paddusb128">,
269              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
270                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
271  def int_x86_sse2_paddus_w : GCCBuiltin<"__builtin_ia32_paddusw128">,
272              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
273                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
274  def int_x86_sse2_psubs_b : GCCBuiltin<"__builtin_ia32_psubsb128">,
275              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
276                         llvm_v16i8_ty], [IntrNoMem]>;
277  def int_x86_sse2_psubs_w : GCCBuiltin<"__builtin_ia32_psubsw128">,
278              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
279                         llvm_v8i16_ty], [IntrNoMem]>;
280  def int_x86_sse2_psubus_b : GCCBuiltin<"__builtin_ia32_psubusb128">,
281              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
282                         llvm_v16i8_ty], [IntrNoMem]>;
283  def int_x86_sse2_psubus_w : GCCBuiltin<"__builtin_ia32_psubusw128">,
284              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
285                         llvm_v8i16_ty], [IntrNoMem]>;
286  def int_x86_sse2_pmulhu_w : GCCBuiltin<"__builtin_ia32_pmulhuw128">,
287              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
288                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
289  def int_x86_sse2_pmulh_w : GCCBuiltin<"__builtin_ia32_pmulhw128">,
290              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
291                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
292  def int_x86_sse2_pmulu_dq : GCCBuiltin<"__builtin_ia32_pmuludq128">,
293              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty,
294                         llvm_v4i32_ty], [IntrNoMem, Commutative]>;
295  def int_x86_sse2_pmadd_wd : GCCBuiltin<"__builtin_ia32_pmaddwd128">,
296              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty,
297                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
298  def int_x86_sse2_pavg_b : GCCBuiltin<"__builtin_ia32_pavgb128">,
299              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
300                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
301  def int_x86_sse2_pavg_w : GCCBuiltin<"__builtin_ia32_pavgw128">,
302              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
303                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
304  def int_x86_sse2_pmaxu_b : GCCBuiltin<"__builtin_ia32_pmaxub128">,
305              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
306                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
307  def int_x86_sse2_pmaxs_w : GCCBuiltin<"__builtin_ia32_pmaxsw128">,
308              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
309                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
310  def int_x86_sse2_pminu_b : GCCBuiltin<"__builtin_ia32_pminub128">,
311              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
312                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
313  def int_x86_sse2_pmins_w : GCCBuiltin<"__builtin_ia32_pminsw128">,
314              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
315                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
316  def int_x86_sse2_psad_bw : GCCBuiltin<"__builtin_ia32_psadbw128">,
317              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty,
318                         llvm_v16i8_ty], [IntrNoMem, Commutative]>;
319}
320
321// Integer shift ops.
322let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
323  def int_x86_sse2_psll_w : GCCBuiltin<"__builtin_ia32_psllw128">,
324              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
325                         llvm_v8i16_ty], [IntrNoMem]>;
326  def int_x86_sse2_psll_d : GCCBuiltin<"__builtin_ia32_pslld128">,
327              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
328                         llvm_v4i32_ty], [IntrNoMem]>;
329  def int_x86_sse2_psll_q : GCCBuiltin<"__builtin_ia32_psllq128">,
330              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
331                         llvm_v2i64_ty], [IntrNoMem]>;
332  def int_x86_sse2_psrl_w : GCCBuiltin<"__builtin_ia32_psrlw128">,
333              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
334                         llvm_v8i16_ty], [IntrNoMem]>;
335  def int_x86_sse2_psrl_d : GCCBuiltin<"__builtin_ia32_psrld128">,
336              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
337                         llvm_v4i32_ty], [IntrNoMem]>;
338  def int_x86_sse2_psrl_q : GCCBuiltin<"__builtin_ia32_psrlq128">,
339              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
340                         llvm_v2i64_ty], [IntrNoMem]>;
341  def int_x86_sse2_psra_w : GCCBuiltin<"__builtin_ia32_psraw128">,
342              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
343                         llvm_v8i16_ty], [IntrNoMem]>;
344  def int_x86_sse2_psra_d : GCCBuiltin<"__builtin_ia32_psrad128">,
345              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
346                         llvm_v4i32_ty], [IntrNoMem]>;
347
348  def int_x86_sse2_pslli_w : GCCBuiltin<"__builtin_ia32_psllwi128">,
349              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
350                         llvm_i32_ty], [IntrNoMem]>;
351  def int_x86_sse2_pslli_d : GCCBuiltin<"__builtin_ia32_pslldi128">,
352              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
353                         llvm_i32_ty], [IntrNoMem]>;
354  def int_x86_sse2_pslli_q : GCCBuiltin<"__builtin_ia32_psllqi128">,
355              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
356                         llvm_i32_ty], [IntrNoMem]>;
357  def int_x86_sse2_psrli_w : GCCBuiltin<"__builtin_ia32_psrlwi128">,
358              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
359                         llvm_i32_ty], [IntrNoMem]>;
360  def int_x86_sse2_psrli_d : GCCBuiltin<"__builtin_ia32_psrldi128">,
361              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
362                         llvm_i32_ty], [IntrNoMem]>;
363  def int_x86_sse2_psrli_q : GCCBuiltin<"__builtin_ia32_psrlqi128">,
364              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
365                         llvm_i32_ty], [IntrNoMem]>;
366  def int_x86_sse2_psrai_w : GCCBuiltin<"__builtin_ia32_psrawi128">,
367              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
368                         llvm_i32_ty], [IntrNoMem]>;
369  def int_x86_sse2_psrai_d : GCCBuiltin<"__builtin_ia32_psradi128">,
370              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
371                         llvm_i32_ty], [IntrNoMem]>;
372
373  def int_x86_sse2_psll_dq : GCCBuiltin<"__builtin_ia32_pslldqi128">,
374              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
375                         llvm_i32_ty], [IntrNoMem]>;
376  def int_x86_sse2_psrl_dq : GCCBuiltin<"__builtin_ia32_psrldqi128">,
377              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
378                         llvm_i32_ty], [IntrNoMem]>;
379  def int_x86_sse2_psll_dq_bs : GCCBuiltin<"__builtin_ia32_pslldqi128_byteshift">,
380              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
381                         llvm_i32_ty], [IntrNoMem]>;
382  def int_x86_sse2_psrl_dq_bs : GCCBuiltin<"__builtin_ia32_psrldqi128_byteshift">,
383              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
384                         llvm_i32_ty], [IntrNoMem]>;
385}
386
387// Integer comparison ops
388let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
389  def int_x86_sse2_pcmpeq_b : GCCBuiltin<"__builtin_ia32_pcmpeqb128">,
390              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
391                         llvm_v16i8_ty], [IntrNoMem]>;
392  def int_x86_sse2_pcmpeq_w : GCCBuiltin<"__builtin_ia32_pcmpeqw128">,
393              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
394                         llvm_v8i16_ty], [IntrNoMem]>;
395  def int_x86_sse2_pcmpeq_d : GCCBuiltin<"__builtin_ia32_pcmpeqd128">,
396              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
397                         llvm_v4i32_ty], [IntrNoMem]>;
398  def int_x86_sse2_pcmpgt_b : GCCBuiltin<"__builtin_ia32_pcmpgtb128">,
399              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
400                         llvm_v16i8_ty], [IntrNoMem]>;
401  def int_x86_sse2_pcmpgt_w : GCCBuiltin<"__builtin_ia32_pcmpgtw128">,
402              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
403                         llvm_v8i16_ty], [IntrNoMem]>;
404  def int_x86_sse2_pcmpgt_d : GCCBuiltin<"__builtin_ia32_pcmpgtd128">,
405              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
406                         llvm_v4i32_ty], [IntrNoMem]>;
407}
408
409// Conversion ops
410let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
411  def int_x86_sse2_cvtdq2pd : GCCBuiltin<"__builtin_ia32_cvtdq2pd">,
412              Intrinsic<[llvm_v2f64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
413  def int_x86_sse2_cvtdq2ps : GCCBuiltin<"__builtin_ia32_cvtdq2ps">,
414              Intrinsic<[llvm_v4f32_ty], [llvm_v4i32_ty], [IntrNoMem]>;
415  def int_x86_sse2_cvtpd2dq : GCCBuiltin<"__builtin_ia32_cvtpd2dq">,
416              Intrinsic<[llvm_v4i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
417  def int_x86_sse2_cvttpd2dq : GCCBuiltin<"__builtin_ia32_cvttpd2dq">,
418              Intrinsic<[llvm_v4i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
419  def int_x86_sse2_cvtpd2ps : GCCBuiltin<"__builtin_ia32_cvtpd2ps">,
420              Intrinsic<[llvm_v4f32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
421  def int_x86_sse2_cvtps2dq : GCCBuiltin<"__builtin_ia32_cvtps2dq">,
422              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
423  def int_x86_sse2_cvttps2dq : GCCBuiltin<"__builtin_ia32_cvttps2dq">,
424              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
425  def int_x86_sse2_cvtps2pd : GCCBuiltin<"__builtin_ia32_cvtps2pd">,
426              Intrinsic<[llvm_v2f64_ty], [llvm_v4f32_ty], [IntrNoMem]>;
427  def int_x86_sse2_cvtsd2si : GCCBuiltin<"__builtin_ia32_cvtsd2si">,
428              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
429  def int_x86_sse2_cvtsd2si64 : GCCBuiltin<"__builtin_ia32_cvtsd2si64">,
430              Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
431  def int_x86_sse2_cvttsd2si : GCCBuiltin<"__builtin_ia32_cvttsd2si">,
432              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
433  def int_x86_sse2_cvttsd2si64 : GCCBuiltin<"__builtin_ia32_cvttsd2si64">,
434              Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
435  def int_x86_sse2_cvtsi2sd : GCCBuiltin<"__builtin_ia32_cvtsi2sd">,
436              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
437                         llvm_i32_ty], [IntrNoMem]>;
438  def int_x86_sse2_cvtsi642sd : GCCBuiltin<"__builtin_ia32_cvtsi642sd">,
439              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
440                         llvm_i64_ty], [IntrNoMem]>;
441  def int_x86_sse2_cvtsd2ss : GCCBuiltin<"__builtin_ia32_cvtsd2ss">,
442              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
443                         llvm_v2f64_ty], [IntrNoMem]>;
444  def int_x86_sse2_cvtss2sd : GCCBuiltin<"__builtin_ia32_cvtss2sd">,
445              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
446                         llvm_v4f32_ty], [IntrNoMem]>;
447  def int_x86_sse_cvtpd2pi : GCCBuiltin<"__builtin_ia32_cvtpd2pi">,
448              Intrinsic<[llvm_v2i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
449  def int_x86_sse_cvttpd2pi: GCCBuiltin<"__builtin_ia32_cvttpd2pi">,
450              Intrinsic<[llvm_v2i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
451  def int_x86_sse_cvtpi2pd : GCCBuiltin<"__builtin_ia32_cvtpi2pd">,
452              Intrinsic<[llvm_v2f64_ty], [llvm_v2i32_ty], [IntrNoMem]>;
453}
454
455// SIMD load ops
456let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
457  def int_x86_sse2_loadu_pd : GCCBuiltin<"__builtin_ia32_loadupd">,
458              Intrinsic<[llvm_v2f64_ty], [llvm_ptr_ty], [IntrReadMem]>;
459  def int_x86_sse2_loadu_dq : GCCBuiltin<"__builtin_ia32_loaddqu">,
460              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrReadMem]>;
461}
462
463// SIMD store ops
464let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
465  def int_x86_sse2_storeu_pd : GCCBuiltin<"__builtin_ia32_storeupd">,
466              Intrinsic<[], [llvm_ptr_ty,
467                         llvm_v2f64_ty], []>;
468  def int_x86_sse2_storeu_dq : GCCBuiltin<"__builtin_ia32_storedqu">,
469              Intrinsic<[], [llvm_ptr_ty,
470                         llvm_v16i8_ty], []>;
471  def int_x86_sse2_storel_dq : GCCBuiltin<"__builtin_ia32_storelv4si">,
472              Intrinsic<[], [llvm_ptr_ty,
473                         llvm_v4i32_ty], []>;
474}
475
476// Cacheability support ops
477let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
478  def int_x86_sse2_movnt_dq : GCCBuiltin<"__builtin_ia32_movntdq">,
479              Intrinsic<[], [llvm_ptr_ty,
480                         llvm_v2i64_ty], []>;
481  def int_x86_sse2_movnt_pd : GCCBuiltin<"__builtin_ia32_movntpd">,
482              Intrinsic<[], [llvm_ptr_ty,
483                         llvm_v2f64_ty], []>;
484  def int_x86_sse2_movnt_i : GCCBuiltin<"__builtin_ia32_movnti">,
485              Intrinsic<[], [llvm_ptr_ty,
486                         llvm_i32_ty], []>;
487}
488
489// Misc.
490let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
491  def int_x86_sse2_packsswb_128 : GCCBuiltin<"__builtin_ia32_packsswb128">,
492              Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty,
493                         llvm_v8i16_ty], [IntrNoMem]>;
494  def int_x86_sse2_packssdw_128 : GCCBuiltin<"__builtin_ia32_packssdw128">,
495              Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty,
496                         llvm_v4i32_ty], [IntrNoMem]>;
497  def int_x86_sse2_packuswb_128 : GCCBuiltin<"__builtin_ia32_packuswb128">,
498              Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty,
499                         llvm_v8i16_ty], [IntrNoMem]>;
500  def int_x86_sse2_movmsk_pd : GCCBuiltin<"__builtin_ia32_movmskpd">,
501              Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
502  def int_x86_sse2_pmovmskb_128 : GCCBuiltin<"__builtin_ia32_pmovmskb128">,
503              Intrinsic<[llvm_i32_ty], [llvm_v16i8_ty], [IntrNoMem]>;
504  def int_x86_sse2_maskmov_dqu : GCCBuiltin<"__builtin_ia32_maskmovdqu">,
505              Intrinsic<[], [llvm_v16i8_ty,
506                         llvm_v16i8_ty, llvm_ptr_ty], []>;
507  def int_x86_sse2_clflush : GCCBuiltin<"__builtin_ia32_clflush">,
508              Intrinsic<[], [llvm_ptr_ty], []>;
509  def int_x86_sse2_lfence : GCCBuiltin<"__builtin_ia32_lfence">,
510              Intrinsic<[], [], []>;
511  def int_x86_sse2_mfence : GCCBuiltin<"__builtin_ia32_mfence">,
512              Intrinsic<[], [], []>;
513}
514
515//===----------------------------------------------------------------------===//
516// SSE3
517
518// Addition / subtraction ops.
519let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
520  def int_x86_sse3_addsub_ps : GCCBuiltin<"__builtin_ia32_addsubps">,
521              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
522                         llvm_v4f32_ty], [IntrNoMem]>;
523  def int_x86_sse3_addsub_pd : GCCBuiltin<"__builtin_ia32_addsubpd">,
524              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
525                         llvm_v2f64_ty], [IntrNoMem]>;
526}
527
528// Horizontal ops.
529let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
530  def int_x86_sse3_hadd_ps : GCCBuiltin<"__builtin_ia32_haddps">,
531              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
532                         llvm_v4f32_ty], [IntrNoMem]>;
533  def int_x86_sse3_hadd_pd : GCCBuiltin<"__builtin_ia32_haddpd">,
534              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
535                         llvm_v2f64_ty], [IntrNoMem]>;
536  def int_x86_sse3_hsub_ps : GCCBuiltin<"__builtin_ia32_hsubps">,
537              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
538                         llvm_v4f32_ty], [IntrNoMem]>;
539  def int_x86_sse3_hsub_pd : GCCBuiltin<"__builtin_ia32_hsubpd">,
540              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
541                         llvm_v2f64_ty], [IntrNoMem]>;
542}
543
544// Specialized unaligned load.
545let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
546  def int_x86_sse3_ldu_dq : GCCBuiltin<"__builtin_ia32_lddqu">,
547              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrReadMem]>;
548}
549
550// Thread synchronization ops.
551let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
552  def int_x86_sse3_monitor : GCCBuiltin<"__builtin_ia32_monitor">,
553              Intrinsic<[], [llvm_ptr_ty,
554                         llvm_i32_ty, llvm_i32_ty], []>;
555  def int_x86_sse3_mwait : GCCBuiltin<"__builtin_ia32_mwait">,
556              Intrinsic<[], [llvm_i32_ty,
557                         llvm_i32_ty], []>;
558}
559
560//===----------------------------------------------------------------------===//
561// SSSE3
562
563// Horizontal arithmetic ops
564let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
565  def int_x86_ssse3_phadd_w         : GCCBuiltin<"__builtin_ia32_phaddw">,
566              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
567                         llvm_v4i16_ty], [IntrNoMem]>;
568  def int_x86_ssse3_phadd_w_128     : GCCBuiltin<"__builtin_ia32_phaddw128">,
569              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
570                         llvm_v8i16_ty], [IntrNoMem]>;
571
572  def int_x86_ssse3_phadd_d         : GCCBuiltin<"__builtin_ia32_phaddd">,
573              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty,
574                         llvm_v2i32_ty], [IntrNoMem]>;
575  def int_x86_ssse3_phadd_d_128     : GCCBuiltin<"__builtin_ia32_phaddd128">,
576              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
577                         llvm_v4i32_ty], [IntrNoMem]>;
578
579  def int_x86_ssse3_phadd_sw        : GCCBuiltin<"__builtin_ia32_phaddsw">,
580              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
581                         llvm_v4i16_ty], [IntrNoMem]>;
582  def int_x86_ssse3_phadd_sw_128    : GCCBuiltin<"__builtin_ia32_phaddsw128">,
583              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
584                         llvm_v4i32_ty], [IntrNoMem]>;
585
586  def int_x86_ssse3_phsub_w         : GCCBuiltin<"__builtin_ia32_phsubw">,
587              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
588                         llvm_v4i16_ty], [IntrNoMem]>;
589  def int_x86_ssse3_phsub_w_128     : GCCBuiltin<"__builtin_ia32_phsubw128">,
590              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
591                         llvm_v8i16_ty], [IntrNoMem]>;
592
593  def int_x86_ssse3_phsub_d         : GCCBuiltin<"__builtin_ia32_phsubd">,
594              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty,
595                         llvm_v2i32_ty], [IntrNoMem]>;
596  def int_x86_ssse3_phsub_d_128     : GCCBuiltin<"__builtin_ia32_phsubd128">,
597              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
598                         llvm_v4i32_ty], [IntrNoMem]>;
599
600  def int_x86_ssse3_phsub_sw        : GCCBuiltin<"__builtin_ia32_phsubsw">,
601              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
602                         llvm_v4i16_ty], [IntrNoMem]>;
603  def int_x86_ssse3_phsub_sw_128    : GCCBuiltin<"__builtin_ia32_phsubsw128">,
604              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
605                         llvm_v8i16_ty], [IntrNoMem]>;
606
607  def int_x86_ssse3_pmadd_ub_sw     : GCCBuiltin<"__builtin_ia32_pmaddubsw">,
608              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
609                         llvm_v4i16_ty], [IntrNoMem]>;
610  def int_x86_ssse3_pmadd_ub_sw_128 : GCCBuiltin<"__builtin_ia32_pmaddubsw128">,
611              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
612                         llvm_v8i16_ty], [IntrNoMem]>;
613}
614
615// Packed multiply high with round and scale
616let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
617  def int_x86_ssse3_pmul_hr_sw      : GCCBuiltin<"__builtin_ia32_pmulhrsw">,
618              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
619                         llvm_v4i16_ty], [IntrNoMem, Commutative]>;
620  def int_x86_ssse3_pmul_hr_sw_128  : GCCBuiltin<"__builtin_ia32_pmulhrsw128">,
621              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
622                         llvm_v8i16_ty], [IntrNoMem, Commutative]>;
623}
624
625// Shuffle ops
626let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
627  def int_x86_ssse3_pshuf_b         : GCCBuiltin<"__builtin_ia32_pshufb">,
628              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty,
629                         llvm_v8i8_ty], [IntrNoMem]>;
630  def int_x86_ssse3_pshuf_b_128     : GCCBuiltin<"__builtin_ia32_pshufb128">,
631              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
632                         llvm_v16i8_ty], [IntrNoMem]>;
633  def int_x86_ssse3_pshuf_w         : GCCBuiltin<"__builtin_ia32_pshufw">,
634              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty, llvm_i32_ty],
635                         [IntrNoMem]>;
636}
637
638// Sign ops
639let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
640  def int_x86_ssse3_psign_b         : GCCBuiltin<"__builtin_ia32_psignb">,
641              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty,
642                         llvm_v8i8_ty], [IntrNoMem]>;
643  def int_x86_ssse3_psign_b_128     : GCCBuiltin<"__builtin_ia32_psignb128">,
644              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
645                         llvm_v16i8_ty], [IntrNoMem]>;
646
647  def int_x86_ssse3_psign_w         : GCCBuiltin<"__builtin_ia32_psignw">,
648              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
649                         llvm_v4i16_ty], [IntrNoMem]>;
650  def int_x86_ssse3_psign_w_128     : GCCBuiltin<"__builtin_ia32_psignw128">,
651              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
652                         llvm_v8i16_ty], [IntrNoMem]>;
653
654  def int_x86_ssse3_psign_d         : GCCBuiltin<"__builtin_ia32_psignd">,
655              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty,
656                         llvm_v2i32_ty], [IntrNoMem]>;
657  def int_x86_ssse3_psign_d_128     : GCCBuiltin<"__builtin_ia32_psignd128">,
658              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
659                         llvm_v4i32_ty], [IntrNoMem]>;
660}
661
662// Absolute value ops
663let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
664  def int_x86_ssse3_pabs_b     : GCCBuiltin<"__builtin_ia32_pabsb">,
665              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty], [IntrNoMem]>;
666  def int_x86_ssse3_pabs_b_128 : GCCBuiltin<"__builtin_ia32_pabsb128">,
667              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
668
669  def int_x86_ssse3_pabs_w     : GCCBuiltin<"__builtin_ia32_pabsw">,
670              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty], [IntrNoMem]>;
671  def int_x86_ssse3_pabs_w_128 : GCCBuiltin<"__builtin_ia32_pabsw128">,
672              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty], [IntrNoMem]>;
673
674  def int_x86_ssse3_pabs_d     : GCCBuiltin<"__builtin_ia32_pabsd">,
675              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty], [IntrNoMem]>;
676  def int_x86_ssse3_pabs_d_128 : GCCBuiltin<"__builtin_ia32_pabsd128">,
677              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty], [IntrNoMem]>;
678}
679
680//===----------------------------------------------------------------------===//
681// SSE4.1
682
683// FP rounding ops
684let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
685  def int_x86_sse41_round_ss        : GCCBuiltin<"__builtin_ia32_roundss">,
686              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,
687                         llvm_i32_ty], [IntrNoMem]>;
688  def int_x86_sse41_round_ps        : GCCBuiltin<"__builtin_ia32_roundps">,
689              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
690                         llvm_i32_ty], [IntrNoMem]>;
691  def int_x86_sse41_round_sd        : GCCBuiltin<"__builtin_ia32_roundsd">,
692              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,
693                         llvm_i32_ty], [IntrNoMem]>;
694  def int_x86_sse41_round_pd        : GCCBuiltin<"__builtin_ia32_roundpd">,
695              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
696                         llvm_i32_ty], [IntrNoMem]>;
697}
698
699// Vector sign and zero extend
700let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
701  def int_x86_sse41_pmovsxbd        : GCCBuiltin<"__builtin_ia32_pmovsxbd128">,
702              Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty],
703                        [IntrNoMem]>;
704  def int_x86_sse41_pmovsxbq        : GCCBuiltin<"__builtin_ia32_pmovsxbq128">,
705              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty],
706                        [IntrNoMem]>;
707  def int_x86_sse41_pmovsxbw        : GCCBuiltin<"__builtin_ia32_pmovsxbw128">,
708              Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty],
709                        [IntrNoMem]>;
710  def int_x86_sse41_pmovsxdq        : GCCBuiltin<"__builtin_ia32_pmovsxdq128">,
711              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty],
712                        [IntrNoMem]>;
713  def int_x86_sse41_pmovsxwd        : GCCBuiltin<"__builtin_ia32_pmovsxwd128">,
714              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty],
715                        [IntrNoMem]>;
716  def int_x86_sse41_pmovsxwq        : GCCBuiltin<"__builtin_ia32_pmovsxwq128">,
717              Intrinsic<[llvm_v2i64_ty], [llvm_v8i16_ty],
718                        [IntrNoMem]>;
719  def int_x86_sse41_pmovzxbd        : GCCBuiltin<"__builtin_ia32_pmovzxbd128">,
720              Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty],
721                        [IntrNoMem]>;
722  def int_x86_sse41_pmovzxbq        : GCCBuiltin<"__builtin_ia32_pmovzxbq128">,
723              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty],
724                        [IntrNoMem]>;
725  def int_x86_sse41_pmovzxbw        : GCCBuiltin<"__builtin_ia32_pmovzxbw128">,
726              Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty],
727                        [IntrNoMem]>;
728  def int_x86_sse41_pmovzxdq        : GCCBuiltin<"__builtin_ia32_pmovzxdq128">,
729              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty],
730                        [IntrNoMem]>;
731  def int_x86_sse41_pmovzxwd        : GCCBuiltin<"__builtin_ia32_pmovzxwd128">,
732              Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty],
733                        [IntrNoMem]>;
734  def int_x86_sse41_pmovzxwq        : GCCBuiltin<"__builtin_ia32_pmovzxwq128">,
735              Intrinsic<[llvm_v2i64_ty], [llvm_v8i16_ty],
736                        [IntrNoMem]>;
737}
738
739// Vector min element
740let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
741  def int_x86_sse41_phminposuw     : GCCBuiltin<"__builtin_ia32_phminposuw128">,
742              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty],
743                        [IntrNoMem]>;
744}
745
746// Vector compare, min, max
747let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
748  def int_x86_sse41_pcmpeqq         : GCCBuiltin<"__builtin_ia32_pcmpeqq">,
749              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
750                        [IntrNoMem, Commutative]>;
751  def int_x86_sse42_pcmpgtq         : GCCBuiltin<"__builtin_ia32_pcmpgtq">,
752              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
753                        [IntrNoMem]>;
754  def int_x86_sse41_pmaxsb          : GCCBuiltin<"__builtin_ia32_pmaxsb128">,
755              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
756                        [IntrNoMem, Commutative]>;
757  def int_x86_sse41_pmaxsd          : GCCBuiltin<"__builtin_ia32_pmaxsd128">,
758              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
759                        [IntrNoMem, Commutative]>;
760  def int_x86_sse41_pmaxud          : GCCBuiltin<"__builtin_ia32_pmaxud128">,
761              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
762                        [IntrNoMem, Commutative]>;
763  def int_x86_sse41_pmaxuw          : GCCBuiltin<"__builtin_ia32_pmaxuw128">,
764              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
765                        [IntrNoMem, Commutative]>;
766  def int_x86_sse41_pminsb          : GCCBuiltin<"__builtin_ia32_pminsb128">,
767              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
768                        [IntrNoMem, Commutative]>;
769  def int_x86_sse41_pminsd          : GCCBuiltin<"__builtin_ia32_pminsd128">,
770              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
771                        [IntrNoMem, Commutative]>;
772  def int_x86_sse41_pminud          : GCCBuiltin<"__builtin_ia32_pminud128">,
773              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
774                        [IntrNoMem, Commutative]>;
775  def int_x86_sse41_pminuw          : GCCBuiltin<"__builtin_ia32_pminuw128">,
776              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
777                        [IntrNoMem, Commutative]>;
778}
779
780// Advanced Encryption Standard (AES) Instructions
781let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
782  def int_x86_aesni_aesimc          : GCCBuiltin<"__builtin_ia32_aesimc128">,
783              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty],
784                        [IntrNoMem]>;
785  def int_x86_aesni_aesenc          : GCCBuiltin<"__builtin_ia32_aesenc128">,
786              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
787                        [IntrNoMem]>;
788  def int_x86_aesni_aesenclast : GCCBuiltin<"__builtin_ia32_aesenclast128">,
789              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
790                        [IntrNoMem]>;
791  def int_x86_aesni_aesdec          : GCCBuiltin<"__builtin_ia32_aesdec128">,
792              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
793                        [IntrNoMem]>;
794  def int_x86_aesni_aesdeclast : GCCBuiltin<"__builtin_ia32_aesdeclast128">,
795              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
796                        [IntrNoMem]>;
797  def int_x86_aesni_aeskeygenassist :
798              GCCBuiltin<"__builtin_ia32_aeskeygenassist128">,
799              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_i8_ty],
800                        [IntrNoMem]>;
801}
802
803// Vector pack
804let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
805  def int_x86_sse41_packusdw        : GCCBuiltin<"__builtin_ia32_packusdw128">,
806              Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
807                        [IntrNoMem]>;
808}
809
810// Vector multiply
811let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
812  def int_x86_sse41_pmuldq          : GCCBuiltin<"__builtin_ia32_pmuldq128">,
813              Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
814                        [IntrNoMem, Commutative]>;
815}
816
817// Vector extract
818let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
819  def int_x86_sse41_pextrb         :
820              Intrinsic<[llvm_i32_ty], [llvm_v16i8_ty, llvm_i32_ty],
821                        [IntrNoMem]>;
822  def int_x86_sse41_pextrd         :
823              Intrinsic<[llvm_i32_ty], [llvm_v4i32_ty, llvm_i32_ty],
824                        [IntrNoMem]>;
825  def int_x86_sse41_pextrq         :
826              Intrinsic<[llvm_i64_ty], [llvm_v2i64_ty, llvm_i32_ty],
827                        [IntrNoMem]>;
828  def int_x86_sse41_extractps      : GCCBuiltin<"__builtin_ia32_extractps128">,
829              Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty, llvm_i32_ty],
830                        [IntrNoMem]>;
831}
832
833// Vector insert
834let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
835  def int_x86_sse41_insertps       : GCCBuiltin<"__builtin_ia32_insertps128">,
836          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,llvm_i32_ty],
837                    [IntrNoMem]>;
838}
839
840// Vector blend
841let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
842  def int_x86_sse41_pblendvb         : GCCBuiltin<"__builtin_ia32_pblendvb128">,
843        Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,llvm_v16i8_ty],
844                  [IntrNoMem]>;
845  def int_x86_sse41_pblendw          : GCCBuiltin<"__builtin_ia32_pblendw128">,
846        Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty, llvm_i32_ty],
847                  [IntrNoMem]>;
848  def int_x86_sse41_blendpd          : GCCBuiltin<"__builtin_ia32_blendpd">,
849        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty, llvm_i32_ty],
850                  [IntrNoMem]>;
851  def int_x86_sse41_blendps          : GCCBuiltin<"__builtin_ia32_blendps">,
852        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_i32_ty],
853                  [IntrNoMem]>;
854  def int_x86_sse41_blendvpd         : GCCBuiltin<"__builtin_ia32_blendvpd">,
855        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,llvm_v2f64_ty],
856                  [IntrNoMem]>;
857  def int_x86_sse41_blendvps         : GCCBuiltin<"__builtin_ia32_blendvps">,
858        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,llvm_v4f32_ty],
859                  [IntrNoMem]>;
860}
861
862// Vector dot product
863let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
864  def int_x86_sse41_dppd            : GCCBuiltin<"__builtin_ia32_dppd">,
865          Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty,llvm_i32_ty],
866                    [IntrNoMem, Commutative]>;
867  def int_x86_sse41_dpps            : GCCBuiltin<"__builtin_ia32_dpps">,
868          Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty,llvm_i32_ty],
869                    [IntrNoMem, Commutative]>;
870}
871
872// Vector sum of absolute differences
873let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
874  def int_x86_sse41_mpsadbw         : GCCBuiltin<"__builtin_ia32_mpsadbw128">,
875          Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,llvm_i32_ty],
876                    [IntrNoMem, Commutative]>;
877}
878
879// Cacheability support ops
880let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
881  def int_x86_sse41_movntdqa        : GCCBuiltin<"__builtin_ia32_movntdqa">,
882          Intrinsic<[llvm_v2i64_ty], [llvm_ptr_ty], [IntrReadMem]>;
883}
884
885// Test instruction with bitwise comparison.
886let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
887  def int_x86_sse41_ptestz          : GCCBuiltin<"__builtin_ia32_ptestz128">,
888          Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
889                    [IntrNoMem]>;
890  def int_x86_sse41_ptestc          : GCCBuiltin<"__builtin_ia32_ptestc128">,
891          Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
892                    [IntrNoMem]>;
893  def int_x86_sse41_ptestnzc        : GCCBuiltin<"__builtin_ia32_ptestnzc128">,
894          Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
895                    [IntrNoMem]>;
896}
897
898//===----------------------------------------------------------------------===//
899// SSE4.2
900
901// Miscellaneous
902// CRC Instruction
903let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
904  def int_x86_sse42_crc32_8         : GCCBuiltin<"__builtin_ia32_crc32qi">,
905          Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i8_ty],
906                    [IntrNoMem]>;
907  def int_x86_sse42_crc32_16         : GCCBuiltin<"__builtin_ia32_crc32hi">,
908          Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i16_ty],
909                    [IntrNoMem]>;
910  def int_x86_sse42_crc32_32         : GCCBuiltin<"__builtin_ia32_crc32si">,
911          Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
912                    [IntrNoMem]>;
913  def int_x86_sse42_crc64_8         :
914          Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i8_ty],
915                    [IntrNoMem]>;
916  def int_x86_sse42_crc64_64         : GCCBuiltin<"__builtin_ia32_crc32di">,
917          Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
918                    [IntrNoMem]>;
919}
920
921// String/text processing ops.
922let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
923  def int_x86_sse42_pcmpistrm128  : GCCBuiltin<"__builtin_ia32_pcmpistrm128">,
924	  Intrinsic<[llvm_v16i8_ty],
925		    [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
926		    [IntrNoMem]>;
927  def int_x86_sse42_pcmpistri128  : GCCBuiltin<"__builtin_ia32_pcmpistri128">,
928	  Intrinsic<[llvm_i32_ty],
929		    [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
930		    [IntrNoMem]>;
931  def int_x86_sse42_pcmpistria128 : GCCBuiltin<"__builtin_ia32_pcmpistria128">,
932	  Intrinsic<[llvm_i32_ty],
933		    [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
934		    [IntrNoMem]>;
935  def int_x86_sse42_pcmpistric128 : GCCBuiltin<"__builtin_ia32_pcmpistric128">,
936	  Intrinsic<[llvm_i32_ty],
937		    [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
938		    [IntrNoMem]>;
939  def int_x86_sse42_pcmpistrio128 : GCCBuiltin<"__builtin_ia32_pcmpistrio128">,
940	  Intrinsic<[llvm_i32_ty],
941		    [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
942		    [IntrNoMem]>;
943  def int_x86_sse42_pcmpistris128 : GCCBuiltin<"__builtin_ia32_pcmpistris128">,
944	  Intrinsic<[llvm_i32_ty],
945		    [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
946		    [IntrNoMem]>;
947  def int_x86_sse42_pcmpistriz128 : GCCBuiltin<"__builtin_ia32_pcmpistriz128">,
948	  Intrinsic<[llvm_i32_ty],
949		    [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i8_ty],
950		    [IntrNoMem]>;
951  def int_x86_sse42_pcmpestrm128  : GCCBuiltin<"__builtin_ia32_pcmpestrm128">,
952	  Intrinsic<[llvm_v16i8_ty],
953		    [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
954		     llvm_i8_ty],
955		    [IntrNoMem]>;
956  def int_x86_sse42_pcmpestri128  : GCCBuiltin<"__builtin_ia32_pcmpestri128">,
957	  Intrinsic<[llvm_i32_ty],
958		    [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
959		     llvm_i8_ty],
960		    [IntrNoMem]>;
961  def int_x86_sse42_pcmpestria128 : GCCBuiltin<"__builtin_ia32_pcmpestria128">,
962	  Intrinsic<[llvm_i32_ty],
963		    [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
964		     llvm_i8_ty],
965		    [IntrNoMem]>;
966  def int_x86_sse42_pcmpestric128 : GCCBuiltin<"__builtin_ia32_pcmpestric128">,
967	  Intrinsic<[llvm_i32_ty],
968		    [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
969		     llvm_i8_ty],
970		    [IntrNoMem]>;
971  def int_x86_sse42_pcmpestrio128 : GCCBuiltin<"__builtin_ia32_pcmpestrio128">,
972	  Intrinsic<[llvm_i32_ty],
973		    [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
974		     llvm_i8_ty],
975		    [IntrNoMem]>;
976  def int_x86_sse42_pcmpestris128 : GCCBuiltin<"__builtin_ia32_pcmpestris128">,
977	  Intrinsic<[llvm_i32_ty],
978		    [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
979		     llvm_i8_ty],
980		    [IntrNoMem]>;
981  def int_x86_sse42_pcmpestriz128 : GCCBuiltin<"__builtin_ia32_pcmpestriz128">,
982	  Intrinsic<[llvm_i32_ty],
983		    [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty, llvm_i32_ty,
984		     llvm_i8_ty],
985		    [IntrNoMem]>;
986}
987
988//===----------------------------------------------------------------------===//
989// AVX
990
991// Arithmetic ops
992let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
993  def int_x86_avx_addsub_pd_256 : GCCBuiltin<"__builtin_ia32_addsubpd256">,
994        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
995                  llvm_v4f64_ty], [IntrNoMem]>;
996  def int_x86_avx_addsub_ps_256 : GCCBuiltin<"__builtin_ia32_addsubps256">,
997        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
998                  llvm_v8f32_ty], [IntrNoMem]>;
999  def int_x86_avx_max_pd_256 : GCCBuiltin<"__builtin_ia32_maxpd256">,
1000        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1001                  llvm_v4f64_ty], [IntrNoMem]>;
1002  def int_x86_avx_max_ps_256 : GCCBuiltin<"__builtin_ia32_maxps256">,
1003        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1004                  llvm_v8f32_ty], [IntrNoMem]>;
1005  def int_x86_avx_min_pd_256 : GCCBuiltin<"__builtin_ia32_minpd256">,
1006        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1007                  llvm_v4f64_ty], [IntrNoMem]>;
1008  def int_x86_avx_min_ps_256 : GCCBuiltin<"__builtin_ia32_minps256">,
1009        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1010                  llvm_v8f32_ty], [IntrNoMem]>;
1011
1012  def int_x86_avx_sqrt_pd_256 : GCCBuiltin<"__builtin_ia32_sqrtpd256">,
1013        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1014  def int_x86_avx_sqrt_ps_256 : GCCBuiltin<"__builtin_ia32_sqrtps256">,
1015        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1016
1017  def int_x86_avx_rsqrt_ps_256 : GCCBuiltin<"__builtin_ia32_rsqrtps256">,
1018        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1019
1020  def int_x86_avx_rcp_ps_256 : GCCBuiltin<"__builtin_ia32_rcpps256">,
1021        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1022
1023  def int_x86_avx_round_pd_256 : GCCBuiltin<"__builtin_ia32_roundpd256">,
1024        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1025                  llvm_i32_ty], [IntrNoMem]>;
1026  def int_x86_avx_round_ps_256 : GCCBuiltin<"__builtin_ia32_roundps256">,
1027        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1028                  llvm_i32_ty], [IntrNoMem]>;
1029}
1030
1031// Horizontal ops
1032let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1033  def int_x86_avx_hadd_pd_256 : GCCBuiltin<"__builtin_ia32_haddpd256">,
1034        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1035                  llvm_v4f64_ty], [IntrNoMem]>;
1036  def int_x86_avx_hsub_ps_256 : GCCBuiltin<"__builtin_ia32_hsubps256">,
1037        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1038                  llvm_v8f32_ty], [IntrNoMem]>;
1039  def int_x86_avx_hsub_pd_256 : GCCBuiltin<"__builtin_ia32_hsubpd256">,
1040        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1041                  llvm_v4f64_ty], [IntrNoMem]>;
1042  def int_x86_avx_hadd_ps_256 : GCCBuiltin<"__builtin_ia32_haddps256">,
1043        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1044                  llvm_v8f32_ty], [IntrNoMem]>;
1045}
1046
1047// Vector permutation
1048let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1049  def int_x86_avx_vpermilvar_pd : GCCBuiltin<"__builtin_ia32_vpermilvarpd">,
1050        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
1051                  llvm_v2i64_ty], [IntrNoMem]>;
1052  def int_x86_avx_vpermilvar_ps : GCCBuiltin<"__builtin_ia32_vpermilvarps">,
1053        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
1054                  llvm_v4i32_ty], [IntrNoMem]>;
1055
1056  def int_x86_avx_vpermilvar_pd_256 :
1057        GCCBuiltin<"__builtin_ia32_vpermilvarpd256">,
1058        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4i64_ty], [IntrNoMem]>;
1059  def int_x86_avx_vpermilvar_ps_256 :
1060        GCCBuiltin<"__builtin_ia32_vpermilvarps256">,
1061        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8i32_ty], [IntrNoMem]>;
1062
1063  def int_x86_avx_vperm2f128_pd_256 :
1064        GCCBuiltin<"__builtin_ia32_vperm2f128_pd256">,
1065        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1066                  llvm_v4f64_ty, llvm_i8_ty], [IntrNoMem]>;
1067  def int_x86_avx_vperm2f128_ps_256 :
1068        GCCBuiltin<"__builtin_ia32_vperm2f128_ps256">,
1069        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1070                  llvm_v8f32_ty, llvm_i8_ty], [IntrNoMem]>;
1071  def int_x86_avx_vperm2f128_si_256 :
1072        GCCBuiltin<"__builtin_ia32_vperm2f128_si256">,
1073        Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1074                  llvm_v8i32_ty, llvm_i8_ty], [IntrNoMem]>;
1075
1076  def int_x86_avx_vpermil_pd : GCCBuiltin<"__builtin_ia32_vpermilpd">,
1077        Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
1078                  llvm_i8_ty], [IntrNoMem]>;
1079  def int_x86_avx_vpermil_ps : GCCBuiltin<"__builtin_ia32_vpermilps">,
1080        Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
1081                  llvm_i8_ty], [IntrNoMem]>;
1082
1083  def int_x86_avx_vpermil_pd_256 : GCCBuiltin<"__builtin_ia32_vpermilpd256">,
1084        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1085                  llvm_i8_ty], [IntrNoMem]>;
1086  def int_x86_avx_vpermil_ps_256 : GCCBuiltin<"__builtin_ia32_vpermilps256">,
1087        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1088                  llvm_i8_ty], [IntrNoMem]>;
1089}
1090
1091// Vector blend
1092let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1093  def int_x86_avx_blend_pd_256 : GCCBuiltin<"__builtin_ia32_blendpd256">,
1094        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1095                  llvm_v4f64_ty, llvm_i32_ty], [IntrNoMem]>;
1096  def int_x86_avx_blend_ps_256 : GCCBuiltin<"__builtin_ia32_blendps256">,
1097        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1098                  llvm_v8f32_ty, llvm_i32_ty], [IntrNoMem]>;
1099  def int_x86_avx_blendv_pd_256 : GCCBuiltin<"__builtin_ia32_blendvpd256">,
1100        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1101                  llvm_v4f64_ty, llvm_v4f64_ty], [IntrNoMem]>;
1102  def int_x86_avx_blendv_ps_256 : GCCBuiltin<"__builtin_ia32_blendvps256">,
1103        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1104                  llvm_v8f32_ty, llvm_v8f32_ty], [IntrNoMem]>;
1105}
1106
1107// Vector dot product
1108let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1109  def int_x86_avx_dp_ps_256 : GCCBuiltin<"__builtin_ia32_dpps256">,
1110        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1111                  llvm_v8f32_ty, llvm_i32_ty], [IntrNoMem]>;
1112}
1113
1114// Vector compare
1115let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1116  def int_x86_avx_cmp_pd_256 : GCCBuiltin<"__builtin_ia32_cmppd256">,
1117        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1118                  llvm_v4f64_ty, llvm_i8_ty], [IntrNoMem]>;
1119  def int_x86_avx_cmp_ps_256 : GCCBuiltin<"__builtin_ia32_cmpps256">,
1120        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1121                  llvm_v8f32_ty, llvm_i8_ty], [IntrNoMem]>;
1122}
1123
1124// Vector extract and insert
1125let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1126  def int_x86_avx_vextractf128_pd_256 :
1127        GCCBuiltin<"__builtin_ia32_vextractf128_pd256">,
1128        Intrinsic<[llvm_v2f64_ty], [llvm_v4f64_ty, llvm_i8_ty], [IntrNoMem]>;
1129  def int_x86_avx_vextractf128_ps_256 :
1130        GCCBuiltin<"__builtin_ia32_vextractf128_ps256">,
1131        Intrinsic<[llvm_v4f32_ty], [llvm_v8f32_ty, llvm_i8_ty], [IntrNoMem]>;
1132  def int_x86_avx_vextractf128_si_256 :
1133        GCCBuiltin<"__builtin_ia32_vextractf128_si256">,
1134        Intrinsic<[llvm_v4i32_ty], [llvm_v8i32_ty, llvm_i8_ty], [IntrNoMem]>;
1135
1136  def int_x86_avx_vinsertf128_pd_256 :
1137        GCCBuiltin<"__builtin_ia32_vinsertf128_pd256">,
1138        Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty,
1139                  llvm_v2f64_ty, llvm_i8_ty], [IntrNoMem]>;
1140  def int_x86_avx_vinsertf128_ps_256 :
1141        GCCBuiltin<"__builtin_ia32_vinsertf128_ps256">,
1142        Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty,
1143                  llvm_v4f32_ty, llvm_i8_ty], [IntrNoMem]>;
1144  def int_x86_avx_vinsertf128_si_256 :
1145        GCCBuiltin<"__builtin_ia32_vinsertf128_si256">,
1146        Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty,
1147                  llvm_v4i32_ty, llvm_i8_ty], [IntrNoMem]>;
1148}
1149
1150// Vector convert
1151let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1152  def int_x86_avx_cvtdq2_pd_256 : GCCBuiltin<"__builtin_ia32_cvtdq2pd256">,
1153        Intrinsic<[llvm_v4f64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
1154  def int_x86_avx_cvtdq2_ps_256 : GCCBuiltin<"__builtin_ia32_cvtdq2ps256">,
1155        Intrinsic<[llvm_v8f32_ty], [llvm_v8i32_ty], [IntrNoMem]>;
1156  def int_x86_avx_cvt_pd2_ps_256 : GCCBuiltin<"__builtin_ia32_cvtpd2ps256">,
1157        Intrinsic<[llvm_v4f32_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1158  def int_x86_avx_cvt_ps2dq_256 : GCCBuiltin<"__builtin_ia32_cvtps2dq256">,
1159        Intrinsic<[llvm_v8i32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1160  def int_x86_avx_cvt_ps2_pd_256 : GCCBuiltin<"__builtin_ia32_cvtps2pd256">,
1161        Intrinsic<[llvm_v4f64_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1162  def int_x86_avx_cvtt_pd2dq_256 : GCCBuiltin<"__builtin_ia32_cvttpd2dq256">,
1163        Intrinsic<[llvm_v4i32_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1164  def int_x86_avx_cvt_pd2dq_256 : GCCBuiltin<"__builtin_ia32_cvtpd2dq256">,
1165        Intrinsic<[llvm_v4i32_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1166  def int_x86_avx_cvtt_ps2dq_256 : GCCBuiltin<"__builtin_ia32_cvttps2dq256">,
1167        Intrinsic<[llvm_v8i32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1168}
1169
1170// Vector bit test
1171let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1172  def int_x86_avx_vtestz_pd : GCCBuiltin<"__builtin_ia32_vtestzpd">,
1173        Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
1174                  llvm_v2f64_ty], [IntrNoMem]>;
1175  def int_x86_avx_vtestc_pd : GCCBuiltin<"__builtin_ia32_vtestcpd">,
1176        Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
1177                  llvm_v2f64_ty], [IntrNoMem]>;
1178  def int_x86_avx_vtestnzc_pd : GCCBuiltin<"__builtin_ia32_vtestnzcpd">,
1179        Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty,
1180                  llvm_v2f64_ty], [IntrNoMem]>;
1181  def int_x86_avx_vtestz_ps : GCCBuiltin<"__builtin_ia32_vtestzps">,
1182        Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
1183                  llvm_v4f32_ty], [IntrNoMem]>;
1184  def int_x86_avx_vtestc_ps : GCCBuiltin<"__builtin_ia32_vtestcps">,
1185        Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
1186                  llvm_v4f32_ty], [IntrNoMem]>;
1187  def int_x86_avx_vtestnzc_ps : GCCBuiltin<"__builtin_ia32_vtestnzcps">,
1188        Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty,
1189                  llvm_v4f32_ty], [IntrNoMem]>;
1190  def int_x86_avx_vtestz_pd_256 : GCCBuiltin<"__builtin_ia32_vtestzpd256">,
1191        Intrinsic<[llvm_i32_ty], [llvm_v4f64_ty,
1192                  llvm_v4f64_ty], [IntrNoMem]>;
1193  def int_x86_avx_vtestc_pd_256 : GCCBuiltin<"__builtin_ia32_vtestcpd256">,
1194        Intrinsic<[llvm_i32_ty], [llvm_v4f64_ty,
1195                  llvm_v4f64_ty], [IntrNoMem]>;
1196  def int_x86_avx_vtestnzc_pd_256 : GCCBuiltin<"__builtin_ia32_vtestnzcpd256">,
1197        Intrinsic<[llvm_i32_ty], [llvm_v4f64_ty,
1198                  llvm_v4f64_ty], [IntrNoMem]>;
1199  def int_x86_avx_vtestz_ps_256 : GCCBuiltin<"__builtin_ia32_vtestzps256">,
1200        Intrinsic<[llvm_i32_ty], [llvm_v8f32_ty,
1201                  llvm_v8f32_ty], [IntrNoMem]>;
1202  def int_x86_avx_vtestc_ps_256 : GCCBuiltin<"__builtin_ia32_vtestcps256">,
1203        Intrinsic<[llvm_i32_ty], [llvm_v8f32_ty,
1204                  llvm_v8f32_ty], [IntrNoMem]>;
1205  def int_x86_avx_vtestnzc_ps_256 : GCCBuiltin<"__builtin_ia32_vtestnzcps256">,
1206        Intrinsic<[llvm_i32_ty], [llvm_v8f32_ty,
1207                  llvm_v8f32_ty], [IntrNoMem]>;
1208  def int_x86_avx_ptestz_256 : GCCBuiltin<"__builtin_ia32_ptestz256">,
1209        Intrinsic<[llvm_i32_ty], [llvm_v4i64_ty,
1210                  llvm_v4i64_ty], [IntrNoMem]>;
1211  def int_x86_avx_ptestc_256 : GCCBuiltin<"__builtin_ia32_ptestc256">,
1212        Intrinsic<[llvm_i32_ty], [llvm_v4i64_ty,
1213                  llvm_v4i64_ty], [IntrNoMem]>;
1214  def int_x86_avx_ptestnzc_256 : GCCBuiltin<"__builtin_ia32_ptestnzc256">,
1215        Intrinsic<[llvm_i32_ty], [llvm_v4i64_ty,
1216                  llvm_v4i64_ty], [IntrNoMem]>;
1217}
1218
1219// Vector extract sign mask
1220let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1221  def int_x86_avx_movmsk_pd_256 : GCCBuiltin<"__builtin_ia32_movmskpd256">,
1222        Intrinsic<[llvm_i32_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1223  def int_x86_avx_movmsk_ps_256 : GCCBuiltin<"__builtin_ia32_movmskps256">,
1224        Intrinsic<[llvm_i32_ty], [llvm_v8f32_ty], [IntrNoMem]>;
1225}
1226
1227// Vector zero
1228let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1229  def int_x86_avx_vzeroall : GCCBuiltin<"__builtin_ia32_vzeroall">,
1230        Intrinsic<[], [], []>;
1231  def int_x86_avx_vzeroupper : GCCBuiltin<"__builtin_ia32_vzeroupper">,
1232        Intrinsic<[], [], []>;
1233}
1234
1235// Vector load with broadcast
1236let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1237  def int_x86_avx_vbroadcastss :
1238        GCCBuiltin<"__builtin_ia32_vbroadcastss">,
1239        Intrinsic<[llvm_v4f32_ty], [llvm_ptr_ty], [IntrReadMem]>;
1240  def int_x86_avx_vbroadcast_sd_256 :
1241        GCCBuiltin<"__builtin_ia32_vbroadcastsd256">,
1242        Intrinsic<[llvm_v4f64_ty], [llvm_ptr_ty], [IntrReadMem]>;
1243  def int_x86_avx_vbroadcastss_256 :
1244        GCCBuiltin<"__builtin_ia32_vbroadcastss256">,
1245        Intrinsic<[llvm_v8f32_ty], [llvm_ptr_ty], [IntrReadMem]>;
1246  def int_x86_avx_vbroadcastf128_pd_256 :
1247        GCCBuiltin<"__builtin_ia32_vbroadcastf128_pd256">,
1248        Intrinsic<[llvm_v4f64_ty], [llvm_ptr_ty], [IntrReadMem]>;
1249  def int_x86_avx_vbroadcastf128_ps_256 :
1250        GCCBuiltin<"__builtin_ia32_vbroadcastf128_ps256">,
1251        Intrinsic<[llvm_v8f32_ty], [llvm_ptr_ty], [IntrReadMem]>;
1252}
1253
1254// SIMD load ops
1255let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1256  def int_x86_avx_loadu_pd_256 : GCCBuiltin<"__builtin_ia32_loadupd256">,
1257        Intrinsic<[llvm_v4f64_ty], [llvm_ptr_ty], [IntrReadMem]>;
1258  def int_x86_avx_loadu_ps_256 : GCCBuiltin<"__builtin_ia32_loadups256">,
1259        Intrinsic<[llvm_v8f32_ty], [llvm_ptr_ty], [IntrReadMem]>;
1260  def int_x86_avx_loadu_dq_256 : GCCBuiltin<"__builtin_ia32_loaddqu256">,
1261        Intrinsic<[llvm_v32i8_ty], [llvm_ptr_ty], [IntrReadMem]>;
1262  def int_x86_avx_ldu_dq_256 : GCCBuiltin<"__builtin_ia32_lddqu256">,
1263        Intrinsic<[llvm_v32i8_ty], [llvm_ptr_ty], [IntrReadMem]>;
1264}
1265
1266// SIMD store ops
1267let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1268  def int_x86_avx_storeu_pd_256 : GCCBuiltin<"__builtin_ia32_storeupd256">,
1269        Intrinsic<[], [llvm_ptr_ty, llvm_v4f64_ty], []>;
1270  def int_x86_avx_storeu_ps_256 : GCCBuiltin<"__builtin_ia32_storeups256">,
1271        Intrinsic<[], [llvm_ptr_ty, llvm_v8f32_ty], []>;
1272  def int_x86_avx_storeu_dq_256 : GCCBuiltin<"__builtin_ia32_storedqu256">,
1273        Intrinsic<[], [llvm_ptr_ty, llvm_v32i8_ty], []>;
1274}
1275
1276// Cacheability support ops
1277let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1278  def int_x86_avx_movnt_dq_256 : GCCBuiltin<"__builtin_ia32_movntdq256">,
1279        Intrinsic<[], [llvm_ptr_ty, llvm_v4i64_ty], []>;
1280  def int_x86_avx_movnt_pd_256 : GCCBuiltin<"__builtin_ia32_movntpd256">,
1281        Intrinsic<[], [llvm_ptr_ty, llvm_v4f64_ty], []>;
1282  def int_x86_avx_movnt_ps_256 : GCCBuiltin<"__builtin_ia32_movntps256">,
1283        Intrinsic<[], [llvm_ptr_ty, llvm_v8f32_ty], []>;
1284}
1285
1286// Conditional load ops
1287let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1288  def int_x86_avx_maskload_pd : GCCBuiltin<"__builtin_ia32_maskloadpd">,
1289        Intrinsic<[llvm_v2f64_ty], [llvm_ptr_ty, llvm_v2f64_ty], [IntrReadMem]>;
1290  def int_x86_avx_maskload_ps : GCCBuiltin<"__builtin_ia32_maskloadps">,
1291        Intrinsic<[llvm_v4f32_ty], [llvm_ptr_ty, llvm_v4f32_ty], [IntrReadMem]>;
1292  def int_x86_avx_maskload_pd_256 : GCCBuiltin<"__builtin_ia32_maskloadpd256">,
1293        Intrinsic<[llvm_v4f64_ty], [llvm_ptr_ty, llvm_v4f64_ty], [IntrReadMem]>;
1294  def int_x86_avx_maskload_ps_256 : GCCBuiltin<"__builtin_ia32_maskloadps256">,
1295        Intrinsic<[llvm_v8f32_ty], [llvm_ptr_ty, llvm_v8f32_ty], [IntrReadMem]>;
1296}
1297
1298// Conditional store ops
1299let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1300  def int_x86_avx_maskstore_pd : GCCBuiltin<"__builtin_ia32_maskstorepd">,
1301        Intrinsic<[], [llvm_ptr_ty,
1302                  llvm_v2f64_ty, llvm_v2f64_ty], []>;
1303  def int_x86_avx_maskstore_ps : GCCBuiltin<"__builtin_ia32_maskstoreps">,
1304        Intrinsic<[], [llvm_ptr_ty,
1305                  llvm_v4f32_ty, llvm_v4f32_ty], []>;
1306  def int_x86_avx_maskstore_pd_256 :
1307        GCCBuiltin<"__builtin_ia32_maskstorepd256">,
1308        Intrinsic<[], [llvm_ptr_ty,
1309                  llvm_v4f64_ty, llvm_v4f64_ty], []>;
1310  def int_x86_avx_maskstore_ps_256 :
1311        GCCBuiltin<"__builtin_ia32_maskstoreps256">,
1312        Intrinsic<[], [llvm_ptr_ty,
1313                  llvm_v8f32_ty, llvm_v8f32_ty], []>;
1314}
1315
1316//===----------------------------------------------------------------------===//
1317// MMX
1318
1319// Empty MMX state op.
1320let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1321  def int_x86_mmx_emms  : GCCBuiltin<"__builtin_ia32_emms">,
1322              Intrinsic<[], [], []>;
1323  def int_x86_mmx_femms : GCCBuiltin<"__builtin_ia32_femms">,
1324              Intrinsic<[], [], []>;
1325}
1326
1327// Integer arithmetic ops.
1328let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1329  // Addition
1330  def int_x86_mmx_padd_b : GCCBuiltin<"__builtin_ia32_paddb">,
1331              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty, llvm_v8i8_ty],
1332                        [IntrNoMem]>;
1333  def int_x86_mmx_padd_w : GCCBuiltin<"__builtin_ia32_paddw">,
1334              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty, llvm_v4i16_ty],
1335                        [IntrNoMem]>;
1336  def int_x86_mmx_padd_d : GCCBuiltin<"__builtin_ia32_paddd">,
1337              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty, llvm_v2i32_ty],
1338                        [IntrNoMem]>;
1339  def int_x86_mmx_padd_q : GCCBuiltin<"__builtin_ia32_paddq">,
1340              Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty],
1341                        [IntrNoMem]>;
1342
1343  def int_x86_mmx_padds_b : GCCBuiltin<"__builtin_ia32_paddsb">,
1344              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty,
1345                         llvm_v8i8_ty], [IntrNoMem, Commutative]>;
1346  def int_x86_mmx_padds_w : GCCBuiltin<"__builtin_ia32_paddsw">,
1347              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1348                         llvm_v4i16_ty], [IntrNoMem, Commutative]>;
1349
1350  def int_x86_mmx_paddus_b : GCCBuiltin<"__builtin_ia32_paddusb">,
1351              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty,
1352                         llvm_v8i8_ty], [IntrNoMem, Commutative]>;
1353  def int_x86_mmx_paddus_w : GCCBuiltin<"__builtin_ia32_paddusw">,
1354              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1355                         llvm_v4i16_ty], [IntrNoMem, Commutative]>;
1356
1357  // Subtraction
1358  def int_x86_mmx_psub_b : GCCBuiltin<"__builtin_ia32_psubb">,
1359              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty, llvm_v8i8_ty],
1360                        [IntrNoMem]>;
1361  def int_x86_mmx_psub_w : GCCBuiltin<"__builtin_ia32_psubw">,
1362              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty, llvm_v4i16_ty],
1363                        [IntrNoMem]>;
1364  def int_x86_mmx_psub_d : GCCBuiltin<"__builtin_ia32_psubd">,
1365              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty, llvm_v2i32_ty],
1366                        [IntrNoMem]>;
1367  def int_x86_mmx_psub_q : GCCBuiltin<"__builtin_ia32_psubq">,
1368              Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty],
1369                        [IntrNoMem]>;
1370
1371  def int_x86_mmx_psubs_b : GCCBuiltin<"__builtin_ia32_psubsb">,
1372              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty,
1373                         llvm_v8i8_ty], [IntrNoMem]>;
1374  def int_x86_mmx_psubs_w : GCCBuiltin<"__builtin_ia32_psubsw">,
1375              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1376                         llvm_v4i16_ty], [IntrNoMem]>;
1377
1378  def int_x86_mmx_psubus_b : GCCBuiltin<"__builtin_ia32_psubusb">,
1379              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty,
1380                         llvm_v8i8_ty], [IntrNoMem]>;
1381  def int_x86_mmx_psubus_w : GCCBuiltin<"__builtin_ia32_psubusw">,
1382              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1383                         llvm_v4i16_ty], [IntrNoMem]>;
1384
1385  // Multiplication
1386  def int_x86_mmx_pmulh_w : GCCBuiltin<"__builtin_ia32_pmulhw">,
1387              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1388                         llvm_v4i16_ty], [IntrNoMem, Commutative]>;
1389  def int_x86_mmx_pmull_w : GCCBuiltin<"__builtin_ia32_pmullw">,
1390              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1391                         llvm_v4i16_ty], [IntrNoMem, Commutative]>;
1392  def int_x86_mmx_pmulhu_w : GCCBuiltin<"__builtin_ia32_pmulhuw">,
1393              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1394                         llvm_v4i16_ty], [IntrNoMem, Commutative]>;
1395  def int_x86_mmx_pmulu_dq : GCCBuiltin<"__builtin_ia32_pmuludq">,
1396              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty,
1397                         llvm_v2i32_ty], [IntrNoMem, Commutative]>;
1398  def int_x86_mmx_pmadd_wd : GCCBuiltin<"__builtin_ia32_pmaddwd">,
1399              Intrinsic<[llvm_v2i32_ty], [llvm_v4i16_ty,
1400                         llvm_v4i16_ty], [IntrNoMem, Commutative]>;
1401
1402  // Bitwise operations
1403  def int_x86_mmx_pand : GCCBuiltin<"__builtin_ia32_pand">,
1404              Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty],
1405                        [IntrNoMem]>;
1406  def int_x86_mmx_pandn : GCCBuiltin<"__builtin_ia32_pandn">,
1407              Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty],
1408                        [IntrNoMem]>;
1409  def int_x86_mmx_por : GCCBuiltin<"__builtin_ia32_por">,
1410              Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty],
1411                        [IntrNoMem]>;
1412  def int_x86_mmx_pxor : GCCBuiltin<"__builtin_ia32_pxor">,
1413              Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty],
1414                        [IntrNoMem]>;
1415
1416  // Averages
1417  def int_x86_mmx_pavg_b : GCCBuiltin<"__builtin_ia32_pavgb">,
1418              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty,
1419                         llvm_v8i8_ty], [IntrNoMem, Commutative]>;
1420  def int_x86_mmx_pavg_w : GCCBuiltin<"__builtin_ia32_pavgw">,
1421              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1422                         llvm_v4i16_ty], [IntrNoMem, Commutative]>;
1423
1424  // Maximum
1425  def int_x86_mmx_pmaxu_b : GCCBuiltin<"__builtin_ia32_pmaxub">,
1426              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty,
1427                         llvm_v8i8_ty], [IntrNoMem, Commutative]>;
1428  def int_x86_mmx_pmaxs_w : GCCBuiltin<"__builtin_ia32_pmaxsw">,
1429              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1430                         llvm_v4i16_ty], [IntrNoMem, Commutative]>;
1431
1432  // Minimum
1433  def int_x86_mmx_pminu_b : GCCBuiltin<"__builtin_ia32_pminub">,
1434              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty,
1435                         llvm_v8i8_ty], [IntrNoMem, Commutative]>;
1436  def int_x86_mmx_pmins_w : GCCBuiltin<"__builtin_ia32_pminsw">,
1437              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1438                         llvm_v4i16_ty], [IntrNoMem, Commutative]>;
1439
1440  // Packed sum of absolute differences
1441  def int_x86_mmx_psad_bw : GCCBuiltin<"__builtin_ia32_psadbw">,
1442              Intrinsic<[llvm_v4i16_ty], [llvm_v8i8_ty,
1443                         llvm_v8i8_ty], [IntrNoMem, Commutative]>;
1444}
1445
1446// Integer shift ops.
1447let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1448  // Shift left logical
1449  def int_x86_mmx_psll_w : GCCBuiltin<"__builtin_ia32_psllw">,
1450              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1451                         llvm_v1i64_ty], [IntrNoMem]>;
1452  def int_x86_mmx_psll_d : GCCBuiltin<"__builtin_ia32_pslld">,
1453              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty,
1454                         llvm_v1i64_ty], [IntrNoMem]>;
1455  def int_x86_mmx_psll_q : GCCBuiltin<"__builtin_ia32_psllq">,
1456              Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty,
1457                         llvm_v1i64_ty], [IntrNoMem]>;
1458
1459  def int_x86_mmx_psrl_w : GCCBuiltin<"__builtin_ia32_psrlw">,
1460              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1461                         llvm_v1i64_ty], [IntrNoMem]>;
1462  def int_x86_mmx_psrl_d : GCCBuiltin<"__builtin_ia32_psrld">,
1463              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty,
1464                         llvm_v1i64_ty], [IntrNoMem]>;
1465  def int_x86_mmx_psrl_q : GCCBuiltin<"__builtin_ia32_psrlq">,
1466              Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty,
1467                         llvm_v1i64_ty], [IntrNoMem]>;
1468
1469  def int_x86_mmx_psra_w : GCCBuiltin<"__builtin_ia32_psraw">,
1470              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1471                         llvm_v1i64_ty], [IntrNoMem]>;
1472  def int_x86_mmx_psra_d : GCCBuiltin<"__builtin_ia32_psrad">,
1473              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty,
1474                         llvm_v1i64_ty], [IntrNoMem]>;
1475
1476  def int_x86_mmx_pslli_w : GCCBuiltin<"__builtin_ia32_psllwi">,
1477              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1478                         llvm_i32_ty], [IntrNoMem]>;
1479  def int_x86_mmx_pslli_d : GCCBuiltin<"__builtin_ia32_pslldi">,
1480              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty,
1481                         llvm_i32_ty], [IntrNoMem]>;
1482  def int_x86_mmx_pslli_q : GCCBuiltin<"__builtin_ia32_psllqi">,
1483              Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty,
1484                         llvm_i32_ty], [IntrNoMem]>;
1485
1486  def int_x86_mmx_psrli_w : GCCBuiltin<"__builtin_ia32_psrlwi">,
1487              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1488                         llvm_i32_ty], [IntrNoMem]>;
1489  def int_x86_mmx_psrli_d : GCCBuiltin<"__builtin_ia32_psrldi">,
1490              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty,
1491                         llvm_i32_ty], [IntrNoMem]>;
1492  def int_x86_mmx_psrli_q : GCCBuiltin<"__builtin_ia32_psrlqi">,
1493              Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty,
1494                         llvm_i32_ty], [IntrNoMem]>;
1495
1496  def int_x86_mmx_psrai_w : GCCBuiltin<"__builtin_ia32_psrawi">,
1497              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1498                         llvm_i32_ty], [IntrNoMem]>;
1499  def int_x86_mmx_psrai_d : GCCBuiltin<"__builtin_ia32_psradi">,
1500              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty,
1501                         llvm_i32_ty], [IntrNoMem]>;
1502}
1503
1504// Pack ops.
1505let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1506  def int_x86_mmx_packsswb : GCCBuiltin<"__builtin_ia32_packsswb">,
1507              Intrinsic<[llvm_v8i8_ty], [llvm_v4i16_ty,
1508                         llvm_v4i16_ty], [IntrNoMem]>;
1509  def int_x86_mmx_packssdw : GCCBuiltin<"__builtin_ia32_packssdw">,
1510              Intrinsic<[llvm_v4i16_ty], [llvm_v2i32_ty,
1511                         llvm_v2i32_ty], [IntrNoMem]>;
1512  def int_x86_mmx_packuswb : GCCBuiltin<"__builtin_ia32_packuswb">,
1513              Intrinsic<[llvm_v8i8_ty], [llvm_v4i16_ty,
1514                         llvm_v4i16_ty], [IntrNoMem]>;
1515}
1516
1517// Unpacking ops.
1518let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1519  def int_x86_mmx_punpckhbw : GCCBuiltin<"__builtin_ia32_punpckhbw">,
1520              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty, llvm_v8i8_ty],
1521                        [IntrNoMem]>;
1522  def int_x86_mmx_punpckhwd : GCCBuiltin<"__builtin_ia32_punpckhwd">,
1523              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty, llvm_v4i16_ty],
1524                        [IntrNoMem]>;
1525  def int_x86_mmx_punpckhdq : GCCBuiltin<"__builtin_ia32_punpckhdq">,
1526              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty, llvm_v2i32_ty],
1527                        [IntrNoMem]>;
1528  def int_x86_mmx_punpcklbw : GCCBuiltin<"__builtin_ia32_punpcklbw">,
1529              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty, llvm_v8i8_ty],
1530                        [IntrNoMem]>;
1531  def int_x86_mmx_punpcklwd : GCCBuiltin<"__builtin_ia32_punpcklwd">,
1532              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty, llvm_v4i16_ty],
1533                        [IntrNoMem]>;
1534  def int_x86_mmx_punpckldq : GCCBuiltin<"__builtin_ia32_punpckldq">,
1535              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty, llvm_v2i32_ty],
1536                        [IntrNoMem]>;
1537}
1538
1539// Integer comparison ops
1540let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1541  def int_x86_mmx_pcmpeq_b : GCCBuiltin<"__builtin_ia32_pcmpeqb">,
1542              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty,
1543                         llvm_v8i8_ty], [IntrNoMem]>;
1544  def int_x86_mmx_pcmpeq_w : GCCBuiltin<"__builtin_ia32_pcmpeqw">,
1545              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1546                         llvm_v4i16_ty], [IntrNoMem]>;
1547  def int_x86_mmx_pcmpeq_d : GCCBuiltin<"__builtin_ia32_pcmpeqd">,
1548              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty,
1549                         llvm_v2i32_ty], [IntrNoMem]>;
1550
1551  def int_x86_mmx_pcmpgt_b : GCCBuiltin<"__builtin_ia32_pcmpgtb">,
1552              Intrinsic<[llvm_v8i8_ty], [llvm_v8i8_ty,
1553                         llvm_v8i8_ty], [IntrNoMem]>;
1554  def int_x86_mmx_pcmpgt_w : GCCBuiltin<"__builtin_ia32_pcmpgtw">,
1555              Intrinsic<[llvm_v4i16_ty], [llvm_v4i16_ty,
1556                         llvm_v4i16_ty], [IntrNoMem]>;
1557  def int_x86_mmx_pcmpgt_d : GCCBuiltin<"__builtin_ia32_pcmpgtd">,
1558              Intrinsic<[llvm_v2i32_ty], [llvm_v2i32_ty,
1559                         llvm_v2i32_ty], [IntrNoMem]>;
1560}
1561
1562// Misc.
1563let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
1564  def int_x86_mmx_maskmovq : GCCBuiltin<"__builtin_ia32_maskmovq">,
1565              Intrinsic<[], [llvm_v8i8_ty, llvm_v8i8_ty, llvm_ptr_ty], []>;
1566
1567  def int_x86_mmx_pmovmskb : GCCBuiltin<"__builtin_ia32_pmovmskb">,
1568              Intrinsic<[llvm_i32_ty], [llvm_v8i8_ty], [IntrNoMem]>;
1569
1570  def int_x86_mmx_movnt_dq : GCCBuiltin<"__builtin_ia32_movntq">,
1571              Intrinsic<[], [llvm_ptr_ty, llvm_v1i64_ty], []>;
1572
1573//   def int_x86_mmx_palignr_b : GCCBuiltin<"__builtin_ia32_palignr">,
1574//               Intrinsic<[llvm_v1i64_ty], [llvm_1i64_ty,
1575//                          llvm_v1i64_ty, llvm_i8_ty], [IntrNoMem]>;
1576
1577  def int_x86_mmx_pextr_w :
1578              Intrinsic<[llvm_i32_ty], [llvm_v1i64_ty, llvm_i32_ty],
1579                        [IntrNoMem]>;
1580
1581  def int_x86_mmx_pinsr_w :
1582              Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty,
1583                        llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
1584
1585  def int_x86_mmx_cvtsi32_si64 :
1586              Intrinsic<[llvm_v1i64_ty], [llvm_i32_ty], [IntrNoMem]>;
1587  def int_x86_mmx_cvtsi64_si32 :
1588              Intrinsic<[llvm_i32_ty], [llvm_v1i64_ty], [IntrNoMem]>;
1589
1590  def int_x86_mmx_vec_init_b : GCCBuiltin<"__builtin_ia32_vec_init_v8qi">,
1591              Intrinsic<[llvm_v8i8_ty],
1592                        [llvm_i8_ty, llvm_i8_ty, llvm_i8_ty, llvm_i8_ty,
1593                         llvm_i8_ty, llvm_i8_ty, llvm_i8_ty, llvm_i8_ty],
1594                        [IntrNoMem]>;
1595  def int_x86_mmx_vec_init_w : GCCBuiltin<"__builtin_ia32_vec_init_v4hi">,
1596              Intrinsic<[llvm_v4i16_ty],
1597                        [llvm_i16_ty, llvm_i16_ty, llvm_i16_ty, llvm_i16_ty],
1598                        [IntrNoMem]>;
1599  def int_x86_mmx_vec_init_d : GCCBuiltin<"__builtin_ia32_vec_init_v2si">,
1600              Intrinsic<[llvm_v2i32_ty],
1601                        [llvm_i32_ty, llvm_i32_ty],
1602                        [IntrNoMem]>;
1603
1604  def int_x86_mmx_vec_ext_d : GCCBuiltin<"__builtin_ia32_vec_ext_v2si">,
1605              Intrinsic<[llvm_v2i32_ty],
1606                        [llvm_v2i32_ty, llvm_i32_ty],
1607                        [IntrNoMem]>;
1608}
1609