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