]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/sse2-intrinsics-fast-isel.ll
Vendor import of llvm release_40 branch r292009:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / sse2-intrinsics-fast-isel.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -fast-isel -mtriple=i386-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=X32
3 ; RUN: llc < %s -fast-isel -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=X64
4
5 ; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/sse2-builtins.c
6
7 define <2 x i64> @test_mm_add_epi8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
8 ; X32-LABEL: test_mm_add_epi8:
9 ; X32:       # BB#0:
10 ; X32-NEXT:    paddb %xmm1, %xmm0
11 ; X32-NEXT:    retl
12 ;
13 ; X64-LABEL: test_mm_add_epi8:
14 ; X64:       # BB#0:
15 ; X64-NEXT:    paddb %xmm1, %xmm0
16 ; X64-NEXT:    retq
17   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
18   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
19   %res = add <16 x i8> %arg0, %arg1
20   %bc = bitcast <16 x i8> %res to <2 x i64>
21   ret <2 x i64> %bc
22 }
23
24 define <2 x i64> @test_mm_add_epi16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
25 ; X32-LABEL: test_mm_add_epi16:
26 ; X32:       # BB#0:
27 ; X32-NEXT:    paddw %xmm1, %xmm0
28 ; X32-NEXT:    retl
29 ;
30 ; X64-LABEL: test_mm_add_epi16:
31 ; X64:       # BB#0:
32 ; X64-NEXT:    paddw %xmm1, %xmm0
33 ; X64-NEXT:    retq
34   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
35   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
36   %res = add <8 x i16> %arg0, %arg1
37   %bc = bitcast <8 x i16> %res to <2 x i64>
38   ret <2 x i64> %bc
39 }
40
41 define <2 x i64> @test_mm_add_epi32(<2 x i64> %a0, <2 x i64> %a1) nounwind {
42 ; X32-LABEL: test_mm_add_epi32:
43 ; X32:       # BB#0:
44 ; X32-NEXT:    paddd %xmm1, %xmm0
45 ; X32-NEXT:    retl
46 ;
47 ; X64-LABEL: test_mm_add_epi32:
48 ; X64:       # BB#0:
49 ; X64-NEXT:    paddd %xmm1, %xmm0
50 ; X64-NEXT:    retq
51   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
52   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
53   %res = add <4 x i32> %arg0, %arg1
54   %bc = bitcast <4 x i32> %res to <2 x i64>
55   ret <2 x i64> %bc
56 }
57
58 define <2 x i64> @test_mm_add_epi64(<2 x i64> %a0, <2 x i64> %a1) nounwind {
59 ; X32-LABEL: test_mm_add_epi64:
60 ; X32:       # BB#0:
61 ; X32-NEXT:    paddq %xmm1, %xmm0
62 ; X32-NEXT:    retl
63 ;
64 ; X64-LABEL: test_mm_add_epi64:
65 ; X64:       # BB#0:
66 ; X64-NEXT:    paddq %xmm1, %xmm0
67 ; X64-NEXT:    retq
68   %res = add <2 x i64> %a0, %a1
69   ret <2 x i64> %res
70 }
71
72 define <2 x double> @test_mm_add_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
73 ; X32-LABEL: test_mm_add_pd:
74 ; X32:       # BB#0:
75 ; X32-NEXT:    addpd %xmm1, %xmm0
76 ; X32-NEXT:    retl
77 ;
78 ; X64-LABEL: test_mm_add_pd:
79 ; X64:       # BB#0:
80 ; X64-NEXT:    addpd %xmm1, %xmm0
81 ; X64-NEXT:    retq
82   %res = fadd <2 x double> %a0, %a1
83   ret <2 x double> %res
84 }
85
86 define <2 x double> @test_mm_add_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
87 ; X32-LABEL: test_mm_add_sd:
88 ; X32:       # BB#0:
89 ; X32-NEXT:    addsd %xmm1, %xmm0
90 ; X32-NEXT:    retl
91 ;
92 ; X64-LABEL: test_mm_add_sd:
93 ; X64:       # BB#0:
94 ; X64-NEXT:    addsd %xmm1, %xmm0
95 ; X64-NEXT:    retq
96   %ext0 = extractelement <2 x double> %a0, i32 0
97   %ext1 = extractelement <2 x double> %a1, i32 0
98   %fadd = fadd double %ext0, %ext1
99   %res = insertelement <2 x double> %a0, double %fadd, i32 0
100   ret <2 x double> %res
101 }
102
103 define <2 x i64> @test_mm_adds_epi8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
104 ; X32-LABEL: test_mm_adds_epi8:
105 ; X32:       # BB#0:
106 ; X32-NEXT:    paddsb %xmm1, %xmm0
107 ; X32-NEXT:    retl
108 ;
109 ; X64-LABEL: test_mm_adds_epi8:
110 ; X64:       # BB#0:
111 ; X64-NEXT:    paddsb %xmm1, %xmm0
112 ; X64-NEXT:    retq
113   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
114   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
115   %res = call <16 x i8> @llvm.x86.sse2.padds.b(<16 x i8> %arg0, <16 x i8> %arg1)
116   %bc = bitcast <16 x i8> %res to <2 x i64>
117   ret <2 x i64> %bc
118 }
119 declare <16 x i8> @llvm.x86.sse2.padds.b(<16 x i8>, <16 x i8>) nounwind readnone
120
121 define <2 x i64> @test_mm_adds_epi16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
122 ; X32-LABEL: test_mm_adds_epi16:
123 ; X32:       # BB#0:
124 ; X32-NEXT:    paddsw %xmm1, %xmm0
125 ; X32-NEXT:    retl
126 ;
127 ; X64-LABEL: test_mm_adds_epi16:
128 ; X64:       # BB#0:
129 ; X64-NEXT:    paddsw %xmm1, %xmm0
130 ; X64-NEXT:    retq
131   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
132   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
133   %res = call <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16> %arg0, <8 x i16> %arg1)
134   %bc = bitcast <8 x i16> %res to <2 x i64>
135   ret <2 x i64> %bc
136 }
137 declare <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16>, <8 x i16>) nounwind readnone
138
139 define <2 x i64> @test_mm_adds_epu8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
140 ; X32-LABEL: test_mm_adds_epu8:
141 ; X32:       # BB#0:
142 ; X32-NEXT:    paddusb %xmm1, %xmm0
143 ; X32-NEXT:    retl
144 ;
145 ; X64-LABEL: test_mm_adds_epu8:
146 ; X64:       # BB#0:
147 ; X64-NEXT:    paddusb %xmm1, %xmm0
148 ; X64-NEXT:    retq
149   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
150   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
151   %res = call <16 x i8> @llvm.x86.sse2.paddus.b(<16 x i8> %arg0, <16 x i8> %arg1)
152   %bc = bitcast <16 x i8> %res to <2 x i64>
153   ret <2 x i64> %bc
154 }
155 declare <16 x i8> @llvm.x86.sse2.paddus.b(<16 x i8>, <16 x i8>) nounwind readnone
156
157 define <2 x i64> @test_mm_adds_epu16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
158 ; X32-LABEL: test_mm_adds_epu16:
159 ; X32:       # BB#0:
160 ; X32-NEXT:    paddusw %xmm1, %xmm0
161 ; X32-NEXT:    retl
162 ;
163 ; X64-LABEL: test_mm_adds_epu16:
164 ; X64:       # BB#0:
165 ; X64-NEXT:    paddusw %xmm1, %xmm0
166 ; X64-NEXT:    retq
167   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
168   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
169   %res = call <8 x i16> @llvm.x86.sse2.paddus.w(<8 x i16> %arg0, <8 x i16> %arg1)
170   %bc = bitcast <8 x i16> %res to <2 x i64>
171   ret <2 x i64> %bc
172 }
173 declare <8 x i16> @llvm.x86.sse2.paddus.w(<8 x i16>, <8 x i16>) nounwind readnone
174
175 define <2 x double> @test_mm_and_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
176 ; X32-LABEL: test_mm_and_pd:
177 ; X32:       # BB#0:
178 ; X32-NEXT:    andps %xmm1, %xmm0
179 ; X32-NEXT:    retl
180 ;
181 ; X64-LABEL: test_mm_and_pd:
182 ; X64:       # BB#0:
183 ; X64-NEXT:    andps %xmm1, %xmm0
184 ; X64-NEXT:    retq
185   %arg0 = bitcast <2 x double> %a0 to <4 x i32>
186   %arg1 = bitcast <2 x double> %a1 to <4 x i32>
187   %res = and <4 x i32> %arg0, %arg1
188   %bc = bitcast <4 x i32> %res to <2 x double>
189   ret <2 x double> %bc
190 }
191
192 define <2 x i64> @test_mm_and_si128(<2 x i64> %a0, <2 x i64> %a1) nounwind {
193 ; X32-LABEL: test_mm_and_si128:
194 ; X32:       # BB#0:
195 ; X32-NEXT:    andps %xmm1, %xmm0
196 ; X32-NEXT:    retl
197 ;
198 ; X64-LABEL: test_mm_and_si128:
199 ; X64:       # BB#0:
200 ; X64-NEXT:    andps %xmm1, %xmm0
201 ; X64-NEXT:    retq
202   %res = and <2 x i64> %a0, %a1
203   ret <2 x i64> %res
204 }
205
206 define <2 x double> @test_mm_andnot_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
207 ; X32-LABEL: test_mm_andnot_pd:
208 ; X32:       # BB#0:
209 ; X32-NEXT:    andnps %xmm1, %xmm0
210 ; X32-NEXT:    retl
211 ;
212 ; X64-LABEL: test_mm_andnot_pd:
213 ; X64:       # BB#0:
214 ; X64-NEXT:    andnps %xmm1, %xmm0
215 ; X64-NEXT:    retq
216   %arg0 = bitcast <2 x double> %a0 to <4 x i32>
217   %arg1 = bitcast <2 x double> %a1 to <4 x i32>
218   %not = xor <4 x i32> %arg0, <i32 -1, i32 -1, i32 -1, i32 -1>
219   %res = and <4 x i32> %not, %arg1
220   %bc = bitcast <4 x i32> %res to <2 x double>
221   ret <2 x double> %bc
222 }
223
224 define <2 x i64> @test_mm_andnot_si128(<2 x i64> %a0, <2 x i64> %a1) nounwind {
225 ; X32-LABEL: test_mm_andnot_si128:
226 ; X32:       # BB#0:
227 ; X32-NEXT:    pcmpeqd %xmm2, %xmm2
228 ; X32-NEXT:    pxor %xmm2, %xmm0
229 ; X32-NEXT:    pand %xmm1, %xmm0
230 ; X32-NEXT:    retl
231 ;
232 ; X64-LABEL: test_mm_andnot_si128:
233 ; X64:       # BB#0:
234 ; X64-NEXT:    pcmpeqd %xmm2, %xmm2
235 ; X64-NEXT:    pxor %xmm2, %xmm0
236 ; X64-NEXT:    pand %xmm1, %xmm0
237 ; X64-NEXT:    retq
238   %not = xor <2 x i64> %a0, <i64 -1, i64 -1>
239   %res = and <2 x i64> %not, %a1
240   ret <2 x i64> %res
241 }
242
243 define <2 x i64> @test_mm_avg_epu8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
244 ; X32-LABEL: test_mm_avg_epu8:
245 ; X32:       # BB#0:
246 ; X32-NEXT:    pavgb %xmm1, %xmm0
247 ; X32-NEXT:    retl
248 ;
249 ; X64-LABEL: test_mm_avg_epu8:
250 ; X64:       # BB#0:
251 ; X64-NEXT:    pavgb %xmm1, %xmm0
252 ; X64-NEXT:    retq
253   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
254   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
255   %res = call <16 x i8> @llvm.x86.sse2.pavg.b(<16 x i8> %arg0, <16 x i8> %arg1)
256   %bc = bitcast <16 x i8> %res to <2 x i64>
257   ret <2 x i64> %bc
258 }
259 declare <16 x i8> @llvm.x86.sse2.pavg.b(<16 x i8> %arg0, <16 x i8> %arg1) nounwind readnone
260
261 define <2 x i64> @test_mm_avg_epu16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
262 ; X32-LABEL: test_mm_avg_epu16:
263 ; X32:       # BB#0:
264 ; X32-NEXT:    pavgw %xmm1, %xmm0
265 ; X32-NEXT:    retl
266 ;
267 ; X64-LABEL: test_mm_avg_epu16:
268 ; X64:       # BB#0:
269 ; X64-NEXT:    pavgw %xmm1, %xmm0
270 ; X64-NEXT:    retq
271   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
272   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
273   %res = call <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16> %arg0, <8 x i16> %arg1)
274   %bc = bitcast <8 x i16> %res to <2 x i64>
275   ret <2 x i64> %bc
276 }
277 declare <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16>, <8 x i16>) nounwind readnone
278
279 define <2 x i64> @test_mm_bslli_si128(<2 x i64> %a0) nounwind {
280 ; X32-LABEL: test_mm_bslli_si128:
281 ; X32:       # BB#0:
282 ; X32-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10]
283 ; X32-NEXT:    retl
284 ;
285 ; X64-LABEL: test_mm_bslli_si128:
286 ; X64:       # BB#0:
287 ; X64-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10]
288 ; X64-NEXT:    retq
289   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
290   %res = shufflevector <16 x i8> zeroinitializer, <16 x i8> %arg0, <16 x i32> <i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26>
291   %bc = bitcast <16 x i8> %res to <2 x i64>
292   ret <2 x i64> %bc
293 }
294
295 define <2 x i64> @test_mm_bsrli_si128(<2 x i64> %a0) nounwind {
296 ; X32-LABEL: test_mm_bsrli_si128:
297 ; X32:       # BB#0:
298 ; X32-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero
299 ; X32-NEXT:    retl
300 ;
301 ; X64-LABEL: test_mm_bsrli_si128:
302 ; X64:       # BB#0:
303 ; X64-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero
304 ; X64-NEXT:    retq
305   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
306   %res = shufflevector <16 x i8> %arg0, <16 x i8> zeroinitializer, <16 x i32> <i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20>
307   %bc = bitcast <16 x i8> %res to <2 x i64>
308   ret <2 x i64> %bc
309 }
310
311 define <4 x float> @test_mm_castpd_ps(<2 x double> %a0) nounwind {
312 ; X32-LABEL: test_mm_castpd_ps:
313 ; X32:       # BB#0:
314 ; X32-NEXT:    retl
315 ;
316 ; X64-LABEL: test_mm_castpd_ps:
317 ; X64:       # BB#0:
318 ; X64-NEXT:    retq
319   %res = bitcast <2 x double> %a0 to <4 x float>
320   ret <4 x float> %res
321 }
322
323 define <2 x i64> @test_mm_castpd_si128(<2 x double> %a0) nounwind {
324 ; X32-LABEL: test_mm_castpd_si128:
325 ; X32:       # BB#0:
326 ; X32-NEXT:    retl
327 ;
328 ; X64-LABEL: test_mm_castpd_si128:
329 ; X64:       # BB#0:
330 ; X64-NEXT:    retq
331   %res = bitcast <2 x double> %a0 to <2 x i64>
332   ret <2 x i64> %res
333 }
334
335 define <2 x double> @test_mm_castps_pd(<4 x float> %a0) nounwind {
336 ; X32-LABEL: test_mm_castps_pd:
337 ; X32:       # BB#0:
338 ; X32-NEXT:    retl
339 ;
340 ; X64-LABEL: test_mm_castps_pd:
341 ; X64:       # BB#0:
342 ; X64-NEXT:    retq
343   %res = bitcast <4 x float> %a0 to <2 x double>
344   ret <2 x double> %res
345 }
346
347 define <2 x i64> @test_mm_castps_si128(<4 x float> %a0) nounwind {
348 ; X32-LABEL: test_mm_castps_si128:
349 ; X32:       # BB#0:
350 ; X32-NEXT:    retl
351 ;
352 ; X64-LABEL: test_mm_castps_si128:
353 ; X64:       # BB#0:
354 ; X64-NEXT:    retq
355   %res = bitcast <4 x float> %a0 to <2 x i64>
356   ret <2 x i64> %res
357 }
358
359 define <2 x double> @test_mm_castsi128_pd(<2 x i64> %a0) nounwind {
360 ; X32-LABEL: test_mm_castsi128_pd:
361 ; X32:       # BB#0:
362 ; X32-NEXT:    retl
363 ;
364 ; X64-LABEL: test_mm_castsi128_pd:
365 ; X64:       # BB#0:
366 ; X64-NEXT:    retq
367   %res = bitcast <2 x i64> %a0 to <2 x double>
368   ret <2 x double> %res
369 }
370
371 define <4 x float> @test_mm_castsi128_ps(<2 x i64> %a0) nounwind {
372 ; X32-LABEL: test_mm_castsi128_ps:
373 ; X32:       # BB#0:
374 ; X32-NEXT:    retl
375 ;
376 ; X64-LABEL: test_mm_castsi128_ps:
377 ; X64:       # BB#0:
378 ; X64-NEXT:    retq
379   %res = bitcast <2 x i64> %a0 to <4 x float>
380   ret <4 x float> %res
381 }
382
383 define void @test_mm_clflush(i8* %a0) nounwind {
384 ; X32-LABEL: test_mm_clflush:
385 ; X32:       # BB#0:
386 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
387 ; X32-NEXT:    clflush (%eax)
388 ; X32-NEXT:    retl
389 ;
390 ; X64-LABEL: test_mm_clflush:
391 ; X64:       # BB#0:
392 ; X64-NEXT:    clflush (%rdi)
393 ; X64-NEXT:    retq
394   call void @llvm.x86.sse2.clflush(i8* %a0)
395   ret void
396 }
397 declare void @llvm.x86.sse2.clflush(i8*) nounwind readnone
398
399 define <2 x i64> @test_mm_cmpeq_epi8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
400 ; X32-LABEL: test_mm_cmpeq_epi8:
401 ; X32:       # BB#0:
402 ; X32-NEXT:    pcmpeqb %xmm1, %xmm0
403 ; X32-NEXT:    retl
404 ;
405 ; X64-LABEL: test_mm_cmpeq_epi8:
406 ; X64:       # BB#0:
407 ; X64-NEXT:    pcmpeqb %xmm1, %xmm0
408 ; X64-NEXT:    retq
409   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
410   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
411   %cmp = icmp eq <16 x i8> %arg0, %arg1
412   %res = sext <16 x i1> %cmp to <16 x i8>
413   %bc = bitcast <16 x i8> %res to <2 x i64>
414   ret <2 x i64> %bc
415 }
416
417 define <2 x i64> @test_mm_cmpeq_epi16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
418 ; X32-LABEL: test_mm_cmpeq_epi16:
419 ; X32:       # BB#0:
420 ; X32-NEXT:    pcmpeqw %xmm1, %xmm0
421 ; X32-NEXT:    retl
422 ;
423 ; X64-LABEL: test_mm_cmpeq_epi16:
424 ; X64:       # BB#0:
425 ; X64-NEXT:    pcmpeqw %xmm1, %xmm0
426 ; X64-NEXT:    retq
427   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
428   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
429   %cmp = icmp eq <8 x i16> %arg0, %arg1
430   %res = sext <8 x i1> %cmp to <8 x i16>
431   %bc = bitcast <8 x i16> %res to <2 x i64>
432   ret <2 x i64> %bc
433 }
434
435 define <2 x i64> @test_mm_cmpeq_epi32(<2 x i64> %a0, <2 x i64> %a1) nounwind {
436 ; X32-LABEL: test_mm_cmpeq_epi32:
437 ; X32:       # BB#0:
438 ; X32-NEXT:    pcmpeqd %xmm1, %xmm0
439 ; X32-NEXT:    retl
440 ;
441 ; X64-LABEL: test_mm_cmpeq_epi32:
442 ; X64:       # BB#0:
443 ; X64-NEXT:    pcmpeqd %xmm1, %xmm0
444 ; X64-NEXT:    retq
445   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
446   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
447   %cmp = icmp eq <4 x i32> %arg0, %arg1
448   %res = sext <4 x i1> %cmp to <4 x i32>
449   %bc = bitcast <4 x i32> %res to <2 x i64>
450   ret <2 x i64> %bc
451 }
452
453 define <2 x double> @test_mm_cmpeq_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
454 ; X32-LABEL: test_mm_cmpeq_pd:
455 ; X32:       # BB#0:
456 ; X32-NEXT:    cmpeqpd %xmm1, %xmm0
457 ; X32-NEXT:    retl
458 ;
459 ; X64-LABEL: test_mm_cmpeq_pd:
460 ; X64:       # BB#0:
461 ; X64-NEXT:    cmpeqpd %xmm1, %xmm0
462 ; X64-NEXT:    retq
463   %fcmp = fcmp oeq <2 x double> %a0, %a1
464   %sext = sext <2 x i1> %fcmp to <2 x i64>
465   %res = bitcast <2 x i64> %sext to <2 x double>
466   ret <2 x double> %res
467 }
468
469 define <2 x double> @test_mm_cmpeq_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
470 ; X32-LABEL: test_mm_cmpeq_sd:
471 ; X32:       # BB#0:
472 ; X32-NEXT:    cmpeqsd %xmm1, %xmm0
473 ; X32-NEXT:    retl
474 ;
475 ; X64-LABEL: test_mm_cmpeq_sd:
476 ; X64:       # BB#0:
477 ; X64-NEXT:    cmpeqsd %xmm1, %xmm0
478 ; X64-NEXT:    retq
479   %res = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a0, <2 x double> %a1, i8 0)
480   ret <2 x double> %res
481 }
482 declare <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double>, <2 x double>, i8) nounwind readnone
483
484 define <2 x double> @test_mm_cmpge_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
485 ; X32-LABEL: test_mm_cmpge_pd:
486 ; X32:       # BB#0:
487 ; X32-NEXT:    cmplepd %xmm0, %xmm1
488 ; X32-NEXT:    movapd %xmm1, %xmm0
489 ; X32-NEXT:    retl
490 ;
491 ; X64-LABEL: test_mm_cmpge_pd:
492 ; X64:       # BB#0:
493 ; X64-NEXT:    cmplepd %xmm0, %xmm1
494 ; X64-NEXT:    movapd %xmm1, %xmm0
495 ; X64-NEXT:    retq
496   %fcmp = fcmp ole <2 x double> %a1, %a0
497   %sext = sext <2 x i1> %fcmp to <2 x i64>
498   %res = bitcast <2 x i64> %sext to <2 x double>
499   ret <2 x double> %res
500 }
501
502 define <2 x double> @test_mm_cmpge_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
503 ; X32-LABEL: test_mm_cmpge_sd:
504 ; X32:       # BB#0:
505 ; X32-NEXT:    cmplesd %xmm0, %xmm1
506 ; X32-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
507 ; X32-NEXT:    retl
508 ;
509 ; X64-LABEL: test_mm_cmpge_sd:
510 ; X64:       # BB#0:
511 ; X64-NEXT:    cmplesd %xmm0, %xmm1
512 ; X64-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
513 ; X64-NEXT:    retq
514   %cmp = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a1, <2 x double> %a0, i8 2)
515   %ext0 = extractelement <2 x double> %cmp, i32 0
516   %ins0 = insertelement <2 x double> undef, double %ext0, i32 0
517   %ext1 = extractelement <2 x double> %a0, i32 1
518   %ins1 = insertelement <2 x double> %ins0, double %ext1, i32 1
519   ret <2 x double> %ins1
520 }
521
522 define <2 x i64> @test_mm_cmpgt_epi8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
523 ; X32-LABEL: test_mm_cmpgt_epi8:
524 ; X32:       # BB#0:
525 ; X32-NEXT:    pcmpgtb %xmm1, %xmm0
526 ; X32-NEXT:    retl
527 ;
528 ; X64-LABEL: test_mm_cmpgt_epi8:
529 ; X64:       # BB#0:
530 ; X64-NEXT:    pcmpgtb %xmm1, %xmm0
531 ; X64-NEXT:    retq
532   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
533   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
534   %cmp = icmp sgt <16 x i8> %arg0, %arg1
535   %res = sext <16 x i1> %cmp to <16 x i8>
536   %bc = bitcast <16 x i8> %res to <2 x i64>
537   ret <2 x i64> %bc
538 }
539
540 define <2 x i64> @test_mm_cmpgt_epi16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
541 ; X32-LABEL: test_mm_cmpgt_epi16:
542 ; X32:       # BB#0:
543 ; X32-NEXT:    pcmpgtw %xmm1, %xmm0
544 ; X32-NEXT:    retl
545 ;
546 ; X64-LABEL: test_mm_cmpgt_epi16:
547 ; X64:       # BB#0:
548 ; X64-NEXT:    pcmpgtw %xmm1, %xmm0
549 ; X64-NEXT:    retq
550   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
551   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
552   %cmp = icmp sgt <8 x i16> %arg0, %arg1
553   %res = sext <8 x i1> %cmp to <8 x i16>
554   %bc = bitcast <8 x i16> %res to <2 x i64>
555   ret <2 x i64> %bc
556 }
557
558 define <2 x i64> @test_mm_cmpgt_epi32(<2 x i64> %a0, <2 x i64> %a1) nounwind {
559 ; X32-LABEL: test_mm_cmpgt_epi32:
560 ; X32:       # BB#0:
561 ; X32-NEXT:    pcmpgtd %xmm1, %xmm0
562 ; X32-NEXT:    retl
563 ;
564 ; X64-LABEL: test_mm_cmpgt_epi32:
565 ; X64:       # BB#0:
566 ; X64-NEXT:    pcmpgtd %xmm1, %xmm0
567 ; X64-NEXT:    retq
568   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
569   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
570   %cmp = icmp sgt <4 x i32> %arg0, %arg1
571   %res = sext <4 x i1> %cmp to <4 x i32>
572   %bc = bitcast <4 x i32> %res to <2 x i64>
573   ret <2 x i64> %bc
574 }
575
576 define <2 x double> @test_mm_cmpgt_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
577 ; X32-LABEL: test_mm_cmpgt_pd:
578 ; X32:       # BB#0:
579 ; X32-NEXT:    cmpltpd %xmm0, %xmm1
580 ; X32-NEXT:    movapd %xmm1, %xmm0
581 ; X32-NEXT:    retl
582 ;
583 ; X64-LABEL: test_mm_cmpgt_pd:
584 ; X64:       # BB#0:
585 ; X64-NEXT:    cmpltpd %xmm0, %xmm1
586 ; X64-NEXT:    movapd %xmm1, %xmm0
587 ; X64-NEXT:    retq
588   %fcmp = fcmp olt <2 x double> %a1, %a0
589   %sext = sext <2 x i1> %fcmp to <2 x i64>
590   %res = bitcast <2 x i64> %sext to <2 x double>
591   ret <2 x double> %res
592 }
593
594 define <2 x double> @test_mm_cmpgt_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
595 ; X32-LABEL: test_mm_cmpgt_sd:
596 ; X32:       # BB#0:
597 ; X32-NEXT:    cmpltsd %xmm0, %xmm1
598 ; X32-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
599 ; X32-NEXT:    retl
600 ;
601 ; X64-LABEL: test_mm_cmpgt_sd:
602 ; X64:       # BB#0:
603 ; X64-NEXT:    cmpltsd %xmm0, %xmm1
604 ; X64-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
605 ; X64-NEXT:    retq
606   %cmp = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a1, <2 x double> %a0, i8 1)
607   %ext0 = extractelement <2 x double> %cmp, i32 0
608   %ins0 = insertelement <2 x double> undef, double %ext0, i32 0
609   %ext1 = extractelement <2 x double> %a0, i32 1
610   %ins1 = insertelement <2 x double> %ins0, double %ext1, i32 1
611   ret <2 x double> %ins1
612 }
613
614 define <2 x double> @test_mm_cmple_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
615 ; X32-LABEL: test_mm_cmple_pd:
616 ; X32:       # BB#0:
617 ; X32-NEXT:    cmplepd %xmm1, %xmm0
618 ; X32-NEXT:    retl
619 ;
620 ; X64-LABEL: test_mm_cmple_pd:
621 ; X64:       # BB#0:
622 ; X64-NEXT:    cmplepd %xmm1, %xmm0
623 ; X64-NEXT:    retq
624   %fcmp = fcmp ole <2 x double> %a0, %a1
625   %sext = sext <2 x i1> %fcmp to <2 x i64>
626   %res = bitcast <2 x i64> %sext to <2 x double>
627   ret <2 x double> %res
628 }
629
630 define <2 x double> @test_mm_cmple_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
631 ; X32-LABEL: test_mm_cmple_sd:
632 ; X32:       # BB#0:
633 ; X32-NEXT:    cmplesd %xmm1, %xmm0
634 ; X32-NEXT:    retl
635 ;
636 ; X64-LABEL: test_mm_cmple_sd:
637 ; X64:       # BB#0:
638 ; X64-NEXT:    cmplesd %xmm1, %xmm0
639 ; X64-NEXT:    retq
640   %res = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a0, <2 x double> %a1, i8 2)
641   ret <2 x double> %res
642 }
643
644 define <2 x i64> @test_mm_cmplt_epi8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
645 ; X32-LABEL: test_mm_cmplt_epi8:
646 ; X32:       # BB#0:
647 ; X32-NEXT:    pcmpgtb %xmm0, %xmm1
648 ; X32-NEXT:    movdqa %xmm1, %xmm0
649 ; X32-NEXT:    retl
650 ;
651 ; X64-LABEL: test_mm_cmplt_epi8:
652 ; X64:       # BB#0:
653 ; X64-NEXT:    pcmpgtb %xmm0, %xmm1
654 ; X64-NEXT:    movdqa %xmm1, %xmm0
655 ; X64-NEXT:    retq
656   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
657   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
658   %cmp = icmp sgt <16 x i8> %arg1, %arg0
659   %res = sext <16 x i1> %cmp to <16 x i8>
660   %bc = bitcast <16 x i8> %res to <2 x i64>
661   ret <2 x i64> %bc
662 }
663
664 define <2 x i64> @test_mm_cmplt_epi16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
665 ; X32-LABEL: test_mm_cmplt_epi16:
666 ; X32:       # BB#0:
667 ; X32-NEXT:    pcmpgtw %xmm0, %xmm1
668 ; X32-NEXT:    movdqa %xmm1, %xmm0
669 ; X32-NEXT:    retl
670 ;
671 ; X64-LABEL: test_mm_cmplt_epi16:
672 ; X64:       # BB#0:
673 ; X64-NEXT:    pcmpgtw %xmm0, %xmm1
674 ; X64-NEXT:    movdqa %xmm1, %xmm0
675 ; X64-NEXT:    retq
676   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
677   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
678   %cmp = icmp sgt <8 x i16> %arg1, %arg0
679   %res = sext <8 x i1> %cmp to <8 x i16>
680   %bc = bitcast <8 x i16> %res to <2 x i64>
681   ret <2 x i64> %bc
682 }
683
684 define <2 x i64> @test_mm_cmplt_epi32(<2 x i64> %a0, <2 x i64> %a1) nounwind {
685 ; X32-LABEL: test_mm_cmplt_epi32:
686 ; X32:       # BB#0:
687 ; X32-NEXT:    pcmpgtd %xmm0, %xmm1
688 ; X32-NEXT:    movdqa %xmm1, %xmm0
689 ; X32-NEXT:    retl
690 ;
691 ; X64-LABEL: test_mm_cmplt_epi32:
692 ; X64:       # BB#0:
693 ; X64-NEXT:    pcmpgtd %xmm0, %xmm1
694 ; X64-NEXT:    movdqa %xmm1, %xmm0
695 ; X64-NEXT:    retq
696   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
697   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
698   %cmp = icmp sgt <4 x i32> %arg1, %arg0
699   %res = sext <4 x i1> %cmp to <4 x i32>
700   %bc = bitcast <4 x i32> %res to <2 x i64>
701   ret <2 x i64> %bc
702 }
703
704 define <2 x double> @test_mm_cmplt_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
705 ; X32-LABEL: test_mm_cmplt_pd:
706 ; X32:       # BB#0:
707 ; X32-NEXT:    cmpltpd %xmm1, %xmm0
708 ; X32-NEXT:    retl
709 ;
710 ; X64-LABEL: test_mm_cmplt_pd:
711 ; X64:       # BB#0:
712 ; X64-NEXT:    cmpltpd %xmm1, %xmm0
713 ; X64-NEXT:    retq
714   %fcmp = fcmp olt <2 x double> %a0, %a1
715   %sext = sext <2 x i1> %fcmp to <2 x i64>
716   %res = bitcast <2 x i64> %sext to <2 x double>
717   ret <2 x double> %res
718 }
719
720 define <2 x double> @test_mm_cmplt_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
721 ; X32-LABEL: test_mm_cmplt_sd:
722 ; X32:       # BB#0:
723 ; X32-NEXT:    cmpltsd %xmm1, %xmm0
724 ; X32-NEXT:    retl
725 ;
726 ; X64-LABEL: test_mm_cmplt_sd:
727 ; X64:       # BB#0:
728 ; X64-NEXT:    cmpltsd %xmm1, %xmm0
729 ; X64-NEXT:    retq
730   %res = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a0, <2 x double> %a1, i8 1)
731   ret <2 x double> %res
732 }
733
734 define <2 x double> @test_mm_cmpneq_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
735 ; X32-LABEL: test_mm_cmpneq_pd:
736 ; X32:       # BB#0:
737 ; X32-NEXT:    cmpneqpd %xmm1, %xmm0
738 ; X32-NEXT:    retl
739 ;
740 ; X64-LABEL: test_mm_cmpneq_pd:
741 ; X64:       # BB#0:
742 ; X64-NEXT:    cmpneqpd %xmm1, %xmm0
743 ; X64-NEXT:    retq
744   %fcmp = fcmp une <2 x double> %a0, %a1
745   %sext = sext <2 x i1> %fcmp to <2 x i64>
746   %res = bitcast <2 x i64> %sext to <2 x double>
747   ret <2 x double> %res
748 }
749
750 define <2 x double> @test_mm_cmpneq_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
751 ; X32-LABEL: test_mm_cmpneq_sd:
752 ; X32:       # BB#0:
753 ; X32-NEXT:    cmpneqsd %xmm1, %xmm0
754 ; X32-NEXT:    retl
755 ;
756 ; X64-LABEL: test_mm_cmpneq_sd:
757 ; X64:       # BB#0:
758 ; X64-NEXT:    cmpneqsd %xmm1, %xmm0
759 ; X64-NEXT:    retq
760   %res = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a0, <2 x double> %a1, i8 4)
761   ret <2 x double> %res
762 }
763
764 define <2 x double> @test_mm_cmpnge_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
765 ; X32-LABEL: test_mm_cmpnge_pd:
766 ; X32:       # BB#0:
767 ; X32-NEXT:    cmpnlepd %xmm0, %xmm1
768 ; X32-NEXT:    movapd %xmm1, %xmm0
769 ; X32-NEXT:    retl
770 ;
771 ; X64-LABEL: test_mm_cmpnge_pd:
772 ; X64:       # BB#0:
773 ; X64-NEXT:    cmpnlepd %xmm0, %xmm1
774 ; X64-NEXT:    movapd %xmm1, %xmm0
775 ; X64-NEXT:    retq
776   %fcmp = fcmp ugt <2 x double> %a1, %a0
777   %sext = sext <2 x i1> %fcmp to <2 x i64>
778   %res = bitcast <2 x i64> %sext to <2 x double>
779   ret <2 x double> %res
780 }
781
782 define <2 x double> @test_mm_cmpnge_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
783 ; X32-LABEL: test_mm_cmpnge_sd:
784 ; X32:       # BB#0:
785 ; X32-NEXT:    cmpnlesd %xmm0, %xmm1
786 ; X32-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
787 ; X32-NEXT:    retl
788 ;
789 ; X64-LABEL: test_mm_cmpnge_sd:
790 ; X64:       # BB#0:
791 ; X64-NEXT:    cmpnlesd %xmm0, %xmm1
792 ; X64-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
793 ; X64-NEXT:    retq
794   %cmp = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a1, <2 x double> %a0, i8 6)
795   %ext0 = extractelement <2 x double> %cmp, i32 0
796   %ins0 = insertelement <2 x double> undef, double %ext0, i32 0
797   %ext1 = extractelement <2 x double> %a0, i32 1
798   %ins1 = insertelement <2 x double> %ins0, double %ext1, i32 1
799   ret <2 x double> %ins1
800 }
801
802 define <2 x double> @test_mm_cmpngt_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
803 ; X32-LABEL: test_mm_cmpngt_pd:
804 ; X32:       # BB#0:
805 ; X32-NEXT:    cmpnltpd %xmm0, %xmm1
806 ; X32-NEXT:    movapd %xmm1, %xmm0
807 ; X32-NEXT:    retl
808 ;
809 ; X64-LABEL: test_mm_cmpngt_pd:
810 ; X64:       # BB#0:
811 ; X64-NEXT:    cmpnltpd %xmm0, %xmm1
812 ; X64-NEXT:    movapd %xmm1, %xmm0
813 ; X64-NEXT:    retq
814   %fcmp = fcmp uge <2 x double> %a1, %a0
815   %sext = sext <2 x i1> %fcmp to <2 x i64>
816   %res = bitcast <2 x i64> %sext to <2 x double>
817   ret <2 x double> %res
818 }
819
820 define <2 x double> @test_mm_cmpngt_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
821 ; X32-LABEL: test_mm_cmpngt_sd:
822 ; X32:       # BB#0:
823 ; X32-NEXT:    cmpnltsd %xmm0, %xmm1
824 ; X32-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
825 ; X32-NEXT:    retl
826 ;
827 ; X64-LABEL: test_mm_cmpngt_sd:
828 ; X64:       # BB#0:
829 ; X64-NEXT:    cmpnltsd %xmm0, %xmm1
830 ; X64-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
831 ; X64-NEXT:    retq
832   %cmp = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a1, <2 x double> %a0, i8 5)
833   %ext0 = extractelement <2 x double> %cmp, i32 0
834   %ins0 = insertelement <2 x double> undef, double %ext0, i32 0
835   %ext1 = extractelement <2 x double> %a0, i32 1
836   %ins1 = insertelement <2 x double> %ins0, double %ext1, i32 1
837   ret <2 x double> %ins1
838 }
839
840 define <2 x double> @test_mm_cmpnle_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
841 ; X32-LABEL: test_mm_cmpnle_pd:
842 ; X32:       # BB#0:
843 ; X32-NEXT:    cmpnlepd %xmm1, %xmm0
844 ; X32-NEXT:    retl
845 ;
846 ; X64-LABEL: test_mm_cmpnle_pd:
847 ; X64:       # BB#0:
848 ; X64-NEXT:    cmpnlepd %xmm1, %xmm0
849 ; X64-NEXT:    retq
850   %fcmp = fcmp ugt <2 x double> %a0, %a1
851   %sext = sext <2 x i1> %fcmp to <2 x i64>
852   %res = bitcast <2 x i64> %sext to <2 x double>
853   ret <2 x double> %res
854 }
855
856 define <2 x double> @test_mm_cmpnle_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
857 ; X32-LABEL: test_mm_cmpnle_sd:
858 ; X32:       # BB#0:
859 ; X32-NEXT:    cmpnlesd %xmm1, %xmm0
860 ; X32-NEXT:    retl
861 ;
862 ; X64-LABEL: test_mm_cmpnle_sd:
863 ; X64:       # BB#0:
864 ; X64-NEXT:    cmpnlesd %xmm1, %xmm0
865 ; X64-NEXT:    retq
866   %res = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a0, <2 x double> %a1, i8 6)
867   ret <2 x double> %res
868 }
869
870 define <2 x double> @test_mm_cmpnlt_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
871 ; X32-LABEL: test_mm_cmpnlt_pd:
872 ; X32:       # BB#0:
873 ; X32-NEXT:    cmpnltpd %xmm1, %xmm0
874 ; X32-NEXT:    retl
875 ;
876 ; X64-LABEL: test_mm_cmpnlt_pd:
877 ; X64:       # BB#0:
878 ; X64-NEXT:    cmpnltpd %xmm1, %xmm0
879 ; X64-NEXT:    retq
880   %fcmp = fcmp uge <2 x double> %a0, %a1
881   %sext = sext <2 x i1> %fcmp to <2 x i64>
882   %res = bitcast <2 x i64> %sext to <2 x double>
883   ret <2 x double> %res
884 }
885
886 define <2 x double> @test_mm_cmpnlt_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
887 ; X32-LABEL: test_mm_cmpnlt_sd:
888 ; X32:       # BB#0:
889 ; X32-NEXT:    cmpnltsd %xmm1, %xmm0
890 ; X32-NEXT:    retl
891 ;
892 ; X64-LABEL: test_mm_cmpnlt_sd:
893 ; X64:       # BB#0:
894 ; X64-NEXT:    cmpnltsd %xmm1, %xmm0
895 ; X64-NEXT:    retq
896   %res = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a0, <2 x double> %a1, i8 5)
897   ret <2 x double> %res
898 }
899
900 define <2 x double> @test_mm_cmpord_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
901 ; X32-LABEL: test_mm_cmpord_pd:
902 ; X32:       # BB#0:
903 ; X32-NEXT:    cmpordpd %xmm1, %xmm0
904 ; X32-NEXT:    retl
905 ;
906 ; X64-LABEL: test_mm_cmpord_pd:
907 ; X64:       # BB#0:
908 ; X64-NEXT:    cmpordpd %xmm1, %xmm0
909 ; X64-NEXT:    retq
910   %fcmp = fcmp ord <2 x double> %a0, %a1
911   %sext = sext <2 x i1> %fcmp to <2 x i64>
912   %res = bitcast <2 x i64> %sext to <2 x double>
913   ret <2 x double> %res
914 }
915
916 define <2 x double> @test_mm_cmpord_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
917 ; X32-LABEL: test_mm_cmpord_sd:
918 ; X32:       # BB#0:
919 ; X32-NEXT:    cmpordsd %xmm1, %xmm0
920 ; X32-NEXT:    retl
921 ;
922 ; X64-LABEL: test_mm_cmpord_sd:
923 ; X64:       # BB#0:
924 ; X64-NEXT:    cmpordsd %xmm1, %xmm0
925 ; X64-NEXT:    retq
926   %res = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a0, <2 x double> %a1, i8 7)
927   ret <2 x double> %res
928 }
929
930 define <2 x double> @test_mm_cmpunord_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
931 ; X32-LABEL: test_mm_cmpunord_pd:
932 ; X32:       # BB#0:
933 ; X32-NEXT:    cmpunordpd %xmm1, %xmm0
934 ; X32-NEXT:    retl
935 ;
936 ; X64-LABEL: test_mm_cmpunord_pd:
937 ; X64:       # BB#0:
938 ; X64-NEXT:    cmpunordpd %xmm1, %xmm0
939 ; X64-NEXT:    retq
940   %fcmp = fcmp uno <2 x double> %a0, %a1
941   %sext = sext <2 x i1> %fcmp to <2 x i64>
942   %res = bitcast <2 x i64> %sext to <2 x double>
943   ret <2 x double> %res
944 }
945
946 define <2 x double> @test_mm_cmpunord_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
947 ; X32-LABEL: test_mm_cmpunord_sd:
948 ; X32:       # BB#0:
949 ; X32-NEXT:    cmpunordsd %xmm1, %xmm0
950 ; X32-NEXT:    retl
951 ;
952 ; X64-LABEL: test_mm_cmpunord_sd:
953 ; X64:       # BB#0:
954 ; X64-NEXT:    cmpunordsd %xmm1, %xmm0
955 ; X64-NEXT:    retq
956   %res = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a0, <2 x double> %a1, i8 3)
957   ret <2 x double> %res
958 }
959
960 define i32 @test_mm_comieq_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
961 ; X32-LABEL: test_mm_comieq_sd:
962 ; X32:       # BB#0:
963 ; X32-NEXT:    comisd %xmm1, %xmm0
964 ; X32-NEXT:    setnp %al
965 ; X32-NEXT:    sete %cl
966 ; X32-NEXT:    andb %al, %cl
967 ; X32-NEXT:    movzbl %cl, %eax
968 ; X32-NEXT:    retl
969 ;
970 ; X64-LABEL: test_mm_comieq_sd:
971 ; X64:       # BB#0:
972 ; X64-NEXT:    comisd %xmm1, %xmm0
973 ; X64-NEXT:    setnp %al
974 ; X64-NEXT:    sete %cl
975 ; X64-NEXT:    andb %al, %cl
976 ; X64-NEXT:    movzbl %cl, %eax
977 ; X64-NEXT:    retq
978   %res = call i32 @llvm.x86.sse2.comieq.sd(<2 x double> %a0, <2 x double> %a1)
979   ret i32 %res
980 }
981 declare i32 @llvm.x86.sse2.comieq.sd(<2 x double>, <2 x double>) nounwind readnone
982
983 define i32 @test_mm_comige_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
984 ; X32-LABEL: test_mm_comige_sd:
985 ; X32:       # BB#0:
986 ; X32-NEXT:    xorl %eax, %eax
987 ; X32-NEXT:    comisd %xmm1, %xmm0
988 ; X32-NEXT:    setae %al
989 ; X32-NEXT:    retl
990 ;
991 ; X64-LABEL: test_mm_comige_sd:
992 ; X64:       # BB#0:
993 ; X64-NEXT:    xorl %eax, %eax
994 ; X64-NEXT:    comisd %xmm1, %xmm0
995 ; X64-NEXT:    setae %al
996 ; X64-NEXT:    retq
997   %res = call i32 @llvm.x86.sse2.comige.sd(<2 x double> %a0, <2 x double> %a1)
998   ret i32 %res
999 }
1000 declare i32 @llvm.x86.sse2.comige.sd(<2 x double>, <2 x double>) nounwind readnone
1001
1002 define i32 @test_mm_comigt_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
1003 ; X32-LABEL: test_mm_comigt_sd:
1004 ; X32:       # BB#0:
1005 ; X32-NEXT:    xorl %eax, %eax
1006 ; X32-NEXT:    comisd %xmm1, %xmm0
1007 ; X32-NEXT:    seta %al
1008 ; X32-NEXT:    retl
1009 ;
1010 ; X64-LABEL: test_mm_comigt_sd:
1011 ; X64:       # BB#0:
1012 ; X64-NEXT:    xorl %eax, %eax
1013 ; X64-NEXT:    comisd %xmm1, %xmm0
1014 ; X64-NEXT:    seta %al
1015 ; X64-NEXT:    retq
1016   %res = call i32 @llvm.x86.sse2.comigt.sd(<2 x double> %a0, <2 x double> %a1)
1017   ret i32 %res
1018 }
1019 declare i32 @llvm.x86.sse2.comigt.sd(<2 x double>, <2 x double>) nounwind readnone
1020
1021 define i32 @test_mm_comile_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
1022 ; X32-LABEL: test_mm_comile_sd:
1023 ; X32:       # BB#0:
1024 ; X32-NEXT:    xorl %eax, %eax
1025 ; X32-NEXT:    comisd %xmm0, %xmm1
1026 ; X32-NEXT:    setae %al
1027 ; X32-NEXT:    retl
1028 ;
1029 ; X64-LABEL: test_mm_comile_sd:
1030 ; X64:       # BB#0:
1031 ; X64-NEXT:    xorl %eax, %eax
1032 ; X64-NEXT:    comisd %xmm0, %xmm1
1033 ; X64-NEXT:    setae %al
1034 ; X64-NEXT:    retq
1035   %res = call i32 @llvm.x86.sse2.comile.sd(<2 x double> %a0, <2 x double> %a1)
1036   ret i32 %res
1037 }
1038 declare i32 @llvm.x86.sse2.comile.sd(<2 x double>, <2 x double>) nounwind readnone
1039
1040 define i32 @test_mm_comilt_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
1041 ; X32-LABEL: test_mm_comilt_sd:
1042 ; X32:       # BB#0:
1043 ; X32-NEXT:    xorl %eax, %eax
1044 ; X32-NEXT:    comisd %xmm0, %xmm1
1045 ; X32-NEXT:    seta %al
1046 ; X32-NEXT:    retl
1047 ;
1048 ; X64-LABEL: test_mm_comilt_sd:
1049 ; X64:       # BB#0:
1050 ; X64-NEXT:    xorl %eax, %eax
1051 ; X64-NEXT:    comisd %xmm0, %xmm1
1052 ; X64-NEXT:    seta %al
1053 ; X64-NEXT:    retq
1054   %res = call i32 @llvm.x86.sse2.comilt.sd(<2 x double> %a0, <2 x double> %a1)
1055   ret i32 %res
1056 }
1057 declare i32 @llvm.x86.sse2.comilt.sd(<2 x double>, <2 x double>) nounwind readnone
1058
1059 define i32 @test_mm_comineq_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
1060 ; X32-LABEL: test_mm_comineq_sd:
1061 ; X32:       # BB#0:
1062 ; X32-NEXT:    comisd %xmm1, %xmm0
1063 ; X32-NEXT:    setp %al
1064 ; X32-NEXT:    setne %cl
1065 ; X32-NEXT:    orb %al, %cl
1066 ; X32-NEXT:    movzbl %cl, %eax
1067 ; X32-NEXT:    retl
1068 ;
1069 ; X64-LABEL: test_mm_comineq_sd:
1070 ; X64:       # BB#0:
1071 ; X64-NEXT:    comisd %xmm1, %xmm0
1072 ; X64-NEXT:    setp %al
1073 ; X64-NEXT:    setne %cl
1074 ; X64-NEXT:    orb %al, %cl
1075 ; X64-NEXT:    movzbl %cl, %eax
1076 ; X64-NEXT:    retq
1077   %res = call i32 @llvm.x86.sse2.comineq.sd(<2 x double> %a0, <2 x double> %a1)
1078   ret i32 %res
1079 }
1080 declare i32 @llvm.x86.sse2.comineq.sd(<2 x double>, <2 x double>) nounwind readnone
1081
1082 define <2 x double> @test_mm_cvtepi32_pd(<2 x i64> %a0) nounwind {
1083 ; X32-LABEL: test_mm_cvtepi32_pd:
1084 ; X32:       # BB#0:
1085 ; X32-NEXT:    cvtdq2pd %xmm0, %xmm0
1086 ; X32-NEXT:    retl
1087 ;
1088 ; X64-LABEL: test_mm_cvtepi32_pd:
1089 ; X64:       # BB#0:
1090 ; X64-NEXT:    cvtdq2pd %xmm0, %xmm0
1091 ; X64-NEXT:    retq
1092   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
1093   %ext = shufflevector <4 x i32> %arg0, <4 x i32> %arg0, <2 x i32> <i32 0, i32 1>
1094   %res = sitofp <2 x i32> %ext to <2 x double>
1095   ret <2 x double> %res
1096 }
1097
1098 define <4 x float> @test_mm_cvtepi32_ps(<2 x i64> %a0) nounwind {
1099 ; X32-LABEL: test_mm_cvtepi32_ps:
1100 ; X32:       # BB#0:
1101 ; X32-NEXT:    cvtdq2ps %xmm0, %xmm0
1102 ; X32-NEXT:    retl
1103 ;
1104 ; X64-LABEL: test_mm_cvtepi32_ps:
1105 ; X64:       # BB#0:
1106 ; X64-NEXT:    cvtdq2ps %xmm0, %xmm0
1107 ; X64-NEXT:    retq
1108   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
1109   %res = call <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32> %arg0)
1110   ret <4 x float> %res
1111 }
1112 declare <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32>) nounwind readnone
1113
1114 define <2 x i64> @test_mm_cvtpd_epi32(<2 x double> %a0) nounwind {
1115 ; X32-LABEL: test_mm_cvtpd_epi32:
1116 ; X32:       # BB#0:
1117 ; X32-NEXT:    cvtpd2dq %xmm0, %xmm0
1118 ; X32-NEXT:    retl
1119 ;
1120 ; X64-LABEL: test_mm_cvtpd_epi32:
1121 ; X64:       # BB#0:
1122 ; X64-NEXT:    cvtpd2dq %xmm0, %xmm0
1123 ; X64-NEXT:    retq
1124   %res = call <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double> %a0)
1125   %bc = bitcast <4 x i32> %res to <2 x i64>
1126   ret <2 x i64> %bc
1127 }
1128 declare <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double>) nounwind readnone
1129
1130 define <4 x float> @test_mm_cvtpd_ps(<2 x double> %a0) nounwind {
1131 ; X32-LABEL: test_mm_cvtpd_ps:
1132 ; X32:       # BB#0:
1133 ; X32-NEXT:    cvtpd2ps %xmm0, %xmm0
1134 ; X32-NEXT:    retl
1135 ;
1136 ; X64-LABEL: test_mm_cvtpd_ps:
1137 ; X64:       # BB#0:
1138 ; X64-NEXT:    cvtpd2ps %xmm0, %xmm0
1139 ; X64-NEXT:    retq
1140   %res = call <4 x float> @llvm.x86.sse2.cvtpd2ps(<2 x double> %a0)
1141   ret <4 x float> %res
1142 }
1143 declare <4 x float> @llvm.x86.sse2.cvtpd2ps(<2 x double>) nounwind readnone
1144
1145 define <2 x i64> @test_mm_cvtps_epi32(<4 x float> %a0) nounwind {
1146 ; X32-LABEL: test_mm_cvtps_epi32:
1147 ; X32:       # BB#0:
1148 ; X32-NEXT:    cvtps2dq %xmm0, %xmm0
1149 ; X32-NEXT:    retl
1150 ;
1151 ; X64-LABEL: test_mm_cvtps_epi32:
1152 ; X64:       # BB#0:
1153 ; X64-NEXT:    cvtps2dq %xmm0, %xmm0
1154 ; X64-NEXT:    retq
1155   %res = call <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float> %a0)
1156   %bc = bitcast <4 x i32> %res to <2 x i64>
1157   ret <2 x i64> %bc
1158 }
1159 declare <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float>) nounwind readnone
1160
1161 define <2 x double> @test_mm_cvtps_pd(<4 x float> %a0) nounwind {
1162 ; X32-LABEL: test_mm_cvtps_pd:
1163 ; X32:       # BB#0:
1164 ; X32-NEXT:    cvtps2pd %xmm0, %xmm0
1165 ; X32-NEXT:    retl
1166 ;
1167 ; X64-LABEL: test_mm_cvtps_pd:
1168 ; X64:       # BB#0:
1169 ; X64-NEXT:    cvtps2pd %xmm0, %xmm0
1170 ; X64-NEXT:    retq
1171   %ext = shufflevector <4 x float> %a0, <4 x float> %a0, <2 x i32> <i32 0, i32 1>
1172   %res = fpext <2 x float> %ext to <2 x double>
1173   ret <2 x double> %res
1174 }
1175
1176 define double @test_mm_cvtsd_f64(<2 x double> %a0) nounwind {
1177 ; X32-LABEL: test_mm_cvtsd_f64:
1178 ; X32:       # BB#0:
1179 ; X32-NEXT:    pushl %ebp
1180 ; X32-NEXT:    movl %esp, %ebp
1181 ; X32-NEXT:    andl $-8, %esp
1182 ; X32-NEXT:    subl $8, %esp
1183 ; X32-NEXT:    movlps %xmm0, (%esp)
1184 ; X32-NEXT:    fldl (%esp)
1185 ; X32-NEXT:    movl %ebp, %esp
1186 ; X32-NEXT:    popl %ebp
1187 ; X32-NEXT:    retl
1188 ;
1189 ; X64-LABEL: test_mm_cvtsd_f64:
1190 ; X64:       # BB#0:
1191 ; X64-NEXT:    retq
1192   %res = extractelement <2 x double> %a0, i32 0
1193   ret double %res
1194 }
1195
1196 define i32 @test_mm_cvtsd_si32(<2 x double> %a0) nounwind {
1197 ; X32-LABEL: test_mm_cvtsd_si32:
1198 ; X32:       # BB#0:
1199 ; X32-NEXT:    cvtsd2si %xmm0, %eax
1200 ; X32-NEXT:    retl
1201 ;
1202 ; X64-LABEL: test_mm_cvtsd_si32:
1203 ; X64:       # BB#0:
1204 ; X64-NEXT:    cvtsd2si %xmm0, %eax
1205 ; X64-NEXT:    retq
1206   %res = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %a0)
1207   ret i32 %res
1208 }
1209 declare i32 @llvm.x86.sse2.cvtsd2si(<2 x double>) nounwind readnone
1210
1211 define <4 x float> @test_mm_cvtsd_ss(<4 x float> %a0, <2 x double> %a1) {
1212 ; X32-LABEL: test_mm_cvtsd_ss:
1213 ; X32:       # BB#0:
1214 ; X32-NEXT:    cvtsd2ss %xmm1, %xmm0
1215 ; X32-NEXT:    retl
1216 ;
1217 ; X64-LABEL: test_mm_cvtsd_ss:
1218 ; X64:       # BB#0:
1219 ; X64-NEXT:    cvtsd2ss %xmm1, %xmm0
1220 ; X64-NEXT:    retq
1221   %res = call <4 x float> @llvm.x86.sse2.cvtsd2ss(<4 x float> %a0, <2 x double> %a1)
1222   ret <4 x float> %res
1223 }
1224 declare <4 x float> @llvm.x86.sse2.cvtsd2ss(<4 x float>, <2 x double>) nounwind readnone
1225
1226 define <4 x float> @test_mm_cvtsd_ss_load(<4 x float> %a0, <2 x double>* %p1) {
1227 ; X32-LABEL: test_mm_cvtsd_ss_load:
1228 ; X32:       # BB#0:
1229 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1230 ; X32-NEXT:    cvtsd2ss (%eax), %xmm0
1231 ; X32-NEXT:    retl
1232 ;
1233 ; X64-LABEL: test_mm_cvtsd_ss_load:
1234 ; X64:       # BB#0:
1235 ; X64-NEXT:    cvtsd2ss (%rdi), %xmm0
1236 ; X64-NEXT:    retq
1237   %a1 = load <2 x double>, <2 x double>* %p1
1238   %res = call <4 x float> @llvm.x86.sse2.cvtsd2ss(<4 x float> %a0, <2 x double> %a1)
1239   ret <4 x float> %res
1240 }
1241
1242 define i32 @test_mm_cvtsi128_si32(<2 x i64> %a0) nounwind {
1243 ; X32-LABEL: test_mm_cvtsi128_si32:
1244 ; X32:       # BB#0:
1245 ; X32-NEXT:    movd %xmm0, %eax
1246 ; X32-NEXT:    retl
1247 ;
1248 ; X64-LABEL: test_mm_cvtsi128_si32:
1249 ; X64:       # BB#0:
1250 ; X64-NEXT:    movd %xmm0, %eax
1251 ; X64-NEXT:    retq
1252   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
1253   %res = extractelement <4 x i32> %arg0, i32 0
1254   ret i32 %res
1255 }
1256
1257 define <2 x double> @test_mm_cvtsi32_sd(<2 x double> %a0, i32 %a1) nounwind {
1258 ; X32-LABEL: test_mm_cvtsi32_sd:
1259 ; X32:       # BB#0:
1260 ; X32-NEXT:    cvtsi2sdl {{[0-9]+}}(%esp), %xmm0
1261 ; X32-NEXT:    retl
1262 ;
1263 ; X64-LABEL: test_mm_cvtsi32_sd:
1264 ; X64:       # BB#0:
1265 ; X64-NEXT:    cvtsi2sdl %edi, %xmm0
1266 ; X64-NEXT:    retq
1267   %cvt = sitofp i32 %a1 to double
1268   %res = insertelement <2 x double> %a0, double %cvt, i32 0
1269   ret <2 x double> %res
1270 }
1271
1272 define <2 x i64> @test_mm_cvtsi32_si128(i32 %a0) nounwind {
1273 ; X32-LABEL: test_mm_cvtsi32_si128:
1274 ; X32:       # BB#0:
1275 ; X32-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1276 ; X32-NEXT:    retl
1277 ;
1278 ; X64-LABEL: test_mm_cvtsi32_si128:
1279 ; X64:       # BB#0:
1280 ; X64-NEXT:    movd %edi, %xmm0
1281 ; X64-NEXT:    retq
1282   %res0 = insertelement <4 x i32> undef, i32 %a0, i32 0
1283   %res1 = insertelement <4 x i32> %res0, i32 0, i32 1
1284   %res2 = insertelement <4 x i32> %res1, i32 0, i32 2
1285   %res3 = insertelement <4 x i32> %res2, i32 0, i32 3
1286   %res = bitcast <4 x i32> %res3 to <2 x i64>
1287   ret <2 x i64> %res
1288 }
1289
1290 define <2 x double> @test_mm_cvtss_sd(<2 x double> %a0, <4 x float> %a1) nounwind {
1291 ; X32-LABEL: test_mm_cvtss_sd:
1292 ; X32:       # BB#0:
1293 ; X32-NEXT:    cvtss2sd %xmm1, %xmm0
1294 ; X32-NEXT:    retl
1295 ;
1296 ; X64-LABEL: test_mm_cvtss_sd:
1297 ; X64:       # BB#0:
1298 ; X64-NEXT:    cvtss2sd %xmm1, %xmm0
1299 ; X64-NEXT:    retq
1300   %ext = extractelement <4 x float> %a1, i32 0
1301   %cvt = fpext float %ext to double
1302   %res = insertelement <2 x double> %a0, double %cvt, i32 0
1303   ret <2 x double> %res
1304 }
1305
1306 define <2 x i64> @test_mm_cvttpd_epi32(<2 x double> %a0) nounwind {
1307 ; X32-LABEL: test_mm_cvttpd_epi32:
1308 ; X32:       # BB#0:
1309 ; X32-NEXT:    cvttpd2dq %xmm0, %xmm0
1310 ; X32-NEXT:    retl
1311 ;
1312 ; X64-LABEL: test_mm_cvttpd_epi32:
1313 ; X64:       # BB#0:
1314 ; X64-NEXT:    cvttpd2dq %xmm0, %xmm0
1315 ; X64-NEXT:    retq
1316   %res = call <4 x i32> @llvm.x86.sse2.cvttpd2dq(<2 x double> %a0)
1317   %bc = bitcast <4 x i32> %res to <2 x i64>
1318   ret <2 x i64> %bc
1319 }
1320 declare <4 x i32> @llvm.x86.sse2.cvttpd2dq(<2 x double>) nounwind readnone
1321
1322 define <2 x i64> @test_mm_cvttps_epi32(<4 x float> %a0) nounwind {
1323 ; X32-LABEL: test_mm_cvttps_epi32:
1324 ; X32:       # BB#0:
1325 ; X32-NEXT:    cvttps2dq %xmm0, %xmm0
1326 ; X32-NEXT:    retl
1327 ;
1328 ; X64-LABEL: test_mm_cvttps_epi32:
1329 ; X64:       # BB#0:
1330 ; X64-NEXT:    cvttps2dq %xmm0, %xmm0
1331 ; X64-NEXT:    retq
1332   %res = call <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float> %a0)
1333   %bc = bitcast <4 x i32> %res to <2 x i64>
1334   ret <2 x i64> %bc
1335 }
1336 declare <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float>) nounwind readnone
1337
1338 define i32 @test_mm_cvttsd_si32(<2 x double> %a0) nounwind {
1339 ; X32-LABEL: test_mm_cvttsd_si32:
1340 ; X32:       # BB#0:
1341 ; X32-NEXT:    cvttsd2si %xmm0, %eax
1342 ; X32-NEXT:    retl
1343 ;
1344 ; X64-LABEL: test_mm_cvttsd_si32:
1345 ; X64:       # BB#0:
1346 ; X64-NEXT:    cvttsd2si %xmm0, %eax
1347 ; X64-NEXT:    retq
1348   %res = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %a0)
1349   ret i32 %res
1350 }
1351 declare i32 @llvm.x86.sse2.cvttsd2si(<2 x double>) nounwind readnone
1352
1353 define <2 x double> @test_mm_div_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
1354 ; X32-LABEL: test_mm_div_pd:
1355 ; X32:       # BB#0:
1356 ; X32-NEXT:    divpd %xmm1, %xmm0
1357 ; X32-NEXT:    retl
1358 ;
1359 ; X64-LABEL: test_mm_div_pd:
1360 ; X64:       # BB#0:
1361 ; X64-NEXT:    divpd %xmm1, %xmm0
1362 ; X64-NEXT:    retq
1363   %res = fdiv <2 x double> %a0, %a1
1364   ret <2 x double> %res
1365 }
1366
1367 define <2 x double> @test_mm_div_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
1368 ; X32-LABEL: test_mm_div_sd:
1369 ; X32:       # BB#0:
1370 ; X32-NEXT:    divsd %xmm1, %xmm0
1371 ; X32-NEXT:    retl
1372 ;
1373 ; X64-LABEL: test_mm_div_sd:
1374 ; X64:       # BB#0:
1375 ; X64-NEXT:    divsd %xmm1, %xmm0
1376 ; X64-NEXT:    retq
1377   %ext0 = extractelement <2 x double> %a0, i32 0
1378   %ext1 = extractelement <2 x double> %a1, i32 0
1379   %fdiv = fdiv double %ext0, %ext1
1380   %res = insertelement <2 x double> %a0, double %fdiv, i32 0
1381   ret <2 x double> %res
1382 }
1383
1384 define i32 @test_mm_extract_epi16(<2 x i64> %a0) nounwind {
1385 ; X32-LABEL: test_mm_extract_epi16:
1386 ; X32:       # BB#0:
1387 ; X32-NEXT:    pextrw $1, %xmm0, %eax
1388 ; X32-NEXT:    movzwl %ax, %eax
1389 ; X32-NEXT:    retl
1390 ;
1391 ; X64-LABEL: test_mm_extract_epi16:
1392 ; X64:       # BB#0:
1393 ; X64-NEXT:    pextrw $1, %xmm0, %eax
1394 ; X64-NEXT:    movzwl %ax, %eax
1395 ; X64-NEXT:    retq
1396   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
1397   %ext = extractelement <8 x i16> %arg0, i32 1
1398   %res = zext i16 %ext to i32
1399   ret i32 %res
1400 }
1401
1402 define <2 x i64> @test_mm_insert_epi16(<2 x i64> %a0, i16 %a1) nounwind {
1403 ; X32-LABEL: test_mm_insert_epi16:
1404 ; X32:       # BB#0:
1405 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
1406 ; X32-NEXT:    pinsrw $1, %eax, %xmm0
1407 ; X32-NEXT:    retl
1408 ;
1409 ; X64-LABEL: test_mm_insert_epi16:
1410 ; X64:       # BB#0:
1411 ; X64-NEXT:    pinsrw $1, %edi, %xmm0
1412 ; X64-NEXT:    retq
1413   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
1414   %res = insertelement <8 x i16> %arg0, i16 %a1,i32 1
1415   %bc = bitcast <8 x i16> %res to <2 x i64>
1416   ret <2 x i64> %bc
1417 }
1418
1419 define void @test_mm_lfence() nounwind {
1420 ; X32-LABEL: test_mm_lfence:
1421 ; X32:       # BB#0:
1422 ; X32-NEXT:    lfence
1423 ; X32-NEXT:    retl
1424 ;
1425 ; X64-LABEL: test_mm_lfence:
1426 ; X64:       # BB#0:
1427 ; X64-NEXT:    lfence
1428 ; X64-NEXT:    retq
1429   call void @llvm.x86.sse2.lfence()
1430   ret void
1431 }
1432 declare void @llvm.x86.sse2.lfence() nounwind readnone
1433
1434 define <2 x double> @test_mm_load_pd(double* %a0) nounwind {
1435 ; X32-LABEL: test_mm_load_pd:
1436 ; X32:       # BB#0:
1437 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1438 ; X32-NEXT:    movaps (%eax), %xmm0
1439 ; X32-NEXT:    retl
1440 ;
1441 ; X64-LABEL: test_mm_load_pd:
1442 ; X64:       # BB#0:
1443 ; X64-NEXT:    movaps (%rdi), %xmm0
1444 ; X64-NEXT:    retq
1445   %arg0 = bitcast double* %a0 to <2 x double>*
1446   %res = load <2 x double>, <2 x double>* %arg0, align 16
1447   ret <2 x double> %res
1448 }
1449
1450 define <2 x double> @test_mm_load_sd(double* %a0) nounwind {
1451 ; X32-LABEL: test_mm_load_sd:
1452 ; X32:       # BB#0:
1453 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1454 ; X32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1455 ; X32-NEXT:    retl
1456 ;
1457 ; X64-LABEL: test_mm_load_sd:
1458 ; X64:       # BB#0:
1459 ; X64-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1460 ; X64-NEXT:    retq
1461   %ld = load double, double* %a0, align 1
1462   %res0 = insertelement <2 x double> undef, double %ld, i32 0
1463   %res1 = insertelement <2 x double> %res0, double 0.0, i32 1
1464   ret <2 x double> %res1
1465 }
1466
1467 define <2 x i64> @test_mm_load_si128(<2 x i64>* %a0) nounwind {
1468 ; X32-LABEL: test_mm_load_si128:
1469 ; X32:       # BB#0:
1470 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1471 ; X32-NEXT:    movaps (%eax), %xmm0
1472 ; X32-NEXT:    retl
1473 ;
1474 ; X64-LABEL: test_mm_load_si128:
1475 ; X64:       # BB#0:
1476 ; X64-NEXT:    movaps (%rdi), %xmm0
1477 ; X64-NEXT:    retq
1478   %res = load <2 x i64>, <2 x i64>* %a0, align 16
1479   ret <2 x i64> %res
1480 }
1481
1482 define <2 x double> @test_mm_load1_pd(double* %a0) nounwind {
1483 ; X32-LABEL: test_mm_load1_pd:
1484 ; X32:       # BB#0:
1485 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1486 ; X32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1487 ; X32-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
1488 ; X32-NEXT:    retl
1489 ;
1490 ; X64-LABEL: test_mm_load1_pd:
1491 ; X64:       # BB#0:
1492 ; X64-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1493 ; X64-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
1494 ; X64-NEXT:    retq
1495   %ld = load double, double* %a0, align 8
1496   %res0 = insertelement <2 x double> undef, double %ld, i32 0
1497   %res1 = insertelement <2 x double> %res0, double %ld, i32 1
1498   ret <2 x double> %res1
1499 }
1500
1501 define <2 x double> @test_mm_loadh_pd(<2 x double> %a0, double* %a1) nounwind {
1502 ; X32-LABEL: test_mm_loadh_pd:
1503 ; X32:       # BB#0:
1504 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1505 ; X32-NEXT:    movhpd {{.*#+}} xmm0 = xmm0[0],mem[0]
1506 ; X32-NEXT:    retl
1507 ;
1508 ; X64-LABEL: test_mm_loadh_pd:
1509 ; X64:       # BB#0:
1510 ; X64-NEXT:    movhpd {{.*#+}} xmm0 = xmm0[0],mem[0]
1511 ; X64-NEXT:    retq
1512   %ld = load double, double* %a1, align 8
1513   %res = insertelement <2 x double> %a0, double %ld, i32 1
1514   ret <2 x double> %res
1515 }
1516
1517 define <2 x i64> @test_mm_loadl_epi64(<2 x i64> %a0, <2 x i64>* %a1) nounwind {
1518 ; X32-LABEL: test_mm_loadl_epi64:
1519 ; X32:       # BB#0:
1520 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1521 ; X32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1522 ; X32-NEXT:    retl
1523 ;
1524 ; X64-LABEL: test_mm_loadl_epi64:
1525 ; X64:       # BB#0:
1526 ; X64-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1527 ; X64-NEXT:    retq
1528   %bc = bitcast <2 x i64>* %a1 to i64*
1529   %ld = load i64, i64* %bc, align 1
1530   %res0 = insertelement <2 x i64> undef, i64 %ld, i32 0
1531   %res1 = insertelement <2 x i64> %res0, i64 0, i32 1
1532   ret <2 x i64> %res1
1533 }
1534
1535 define <2 x double> @test_mm_loadl_pd(<2 x double> %a0, double* %a1) nounwind {
1536 ; X32-LABEL: test_mm_loadl_pd:
1537 ; X32:       # BB#0:
1538 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1539 ; X32-NEXT:    movlpd {{.*#+}} xmm0 = mem[0],xmm0[1]
1540 ; X32-NEXT:    retl
1541 ;
1542 ; X64-LABEL: test_mm_loadl_pd:
1543 ; X64:       # BB#0:
1544 ; X64-NEXT:    movlpd {{.*#+}} xmm0 = mem[0],xmm0[1]
1545 ; X64-NEXT:    retq
1546   %ld = load double, double* %a1, align 8
1547   %res = insertelement <2 x double> %a0, double %ld, i32 0
1548   ret <2 x double> %res
1549 }
1550
1551 define <2 x double> @test_mm_loadr_pd(double* %a0) nounwind {
1552 ; X32-LABEL: test_mm_loadr_pd:
1553 ; X32:       # BB#0:
1554 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1555 ; X32-NEXT:    movapd (%eax), %xmm0
1556 ; X32-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
1557 ; X32-NEXT:    retl
1558 ;
1559 ; X64-LABEL: test_mm_loadr_pd:
1560 ; X64:       # BB#0:
1561 ; X64-NEXT:    movapd (%rdi), %xmm0
1562 ; X64-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
1563 ; X64-NEXT:    retq
1564   %arg0 = bitcast double* %a0 to <2 x double>*
1565   %ld = load <2 x double>, <2 x double>* %arg0, align 16
1566   %res = shufflevector <2 x double> %ld, <2 x double> undef, <2 x i32> <i32 1, i32 0>
1567   ret <2 x double> %res
1568 }
1569
1570 define <2 x double> @test_mm_loadu_pd(double* %a0) nounwind {
1571 ; X32-LABEL: test_mm_loadu_pd:
1572 ; X32:       # BB#0:
1573 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1574 ; X32-NEXT:    movups (%eax), %xmm0
1575 ; X32-NEXT:    retl
1576 ;
1577 ; X64-LABEL: test_mm_loadu_pd:
1578 ; X64:       # BB#0:
1579 ; X64-NEXT:    movups (%rdi), %xmm0
1580 ; X64-NEXT:    retq
1581   %arg0 = bitcast double* %a0 to <2 x double>*
1582   %res = load <2 x double>, <2 x double>* %arg0, align 1
1583   ret <2 x double> %res
1584 }
1585
1586 define <2 x i64> @test_mm_loadu_si128(<2 x i64>* %a0) nounwind {
1587 ; X32-LABEL: test_mm_loadu_si128:
1588 ; X32:       # BB#0:
1589 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1590 ; X32-NEXT:    movups (%eax), %xmm0
1591 ; X32-NEXT:    retl
1592 ;
1593 ; X64-LABEL: test_mm_loadu_si128:
1594 ; X64:       # BB#0:
1595 ; X64-NEXT:    movups (%rdi), %xmm0
1596 ; X64-NEXT:    retq
1597   %res = load <2 x i64>, <2 x i64>* %a0, align 1
1598   ret <2 x i64> %res
1599 }
1600
1601 define <2 x i64> @test_mm_madd_epi16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
1602 ; X32-LABEL: test_mm_madd_epi16:
1603 ; X32:       # BB#0:
1604 ; X32-NEXT:    pmaddwd %xmm1, %xmm0
1605 ; X32-NEXT:    retl
1606 ;
1607 ; X64-LABEL: test_mm_madd_epi16:
1608 ; X64:       # BB#0:
1609 ; X64-NEXT:    pmaddwd %xmm1, %xmm0
1610 ; X64-NEXT:    retq
1611   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
1612   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
1613   %res = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %arg0, <8 x i16> %arg1)
1614   %bc = bitcast <4 x i32> %res to <2 x i64>
1615   ret <2 x i64> %bc
1616 }
1617 declare <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16>, <8 x i16>) nounwind readnone
1618
1619 define void @test_mm_maskmoveu_si128(<2 x i64> %a0, <2 x i64> %a1, i8* %a2) nounwind {
1620 ; X32-LABEL: test_mm_maskmoveu_si128:
1621 ; X32:       # BB#0:
1622 ; X32-NEXT:    pushl %edi
1623 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edi
1624 ; X32-NEXT:    maskmovdqu %xmm1, %xmm0
1625 ; X32-NEXT:    popl %edi
1626 ; X32-NEXT:    retl
1627 ;
1628 ; X64-LABEL: test_mm_maskmoveu_si128:
1629 ; X64:       # BB#0:
1630 ; X64-NEXT:    maskmovdqu %xmm1, %xmm0
1631 ; X64-NEXT:    retq
1632   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
1633   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
1634   call void @llvm.x86.sse2.maskmov.dqu(<16 x i8> %arg0, <16 x i8> %arg1, i8* %a2)
1635   ret void
1636 }
1637 declare void @llvm.x86.sse2.maskmov.dqu(<16 x i8>, <16 x i8>, i8*) nounwind
1638
1639 define <2 x i64> @test_mm_max_epi16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
1640 ; X32-LABEL: test_mm_max_epi16:
1641 ; X32:       # BB#0:
1642 ; X32-NEXT:    pmaxsw %xmm1, %xmm0
1643 ; X32-NEXT:    retl
1644 ;
1645 ; X64-LABEL: test_mm_max_epi16:
1646 ; X64:       # BB#0:
1647 ; X64-NEXT:    pmaxsw %xmm1, %xmm0
1648 ; X64-NEXT:    retq
1649   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
1650   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
1651   %cmp = icmp sgt <8 x i16> %arg0, %arg1
1652   %sel = select <8 x i1> %cmp, <8 x i16> %arg0, <8 x i16> %arg1
1653   %bc = bitcast <8 x i16> %sel to <2 x i64>
1654   ret <2 x i64> %bc
1655 }
1656
1657 define <2 x i64> @test_mm_max_epu8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
1658 ; X32-LABEL: test_mm_max_epu8:
1659 ; X32:       # BB#0:
1660 ; X32-NEXT:    pmaxub %xmm1, %xmm0
1661 ; X32-NEXT:    retl
1662 ;
1663 ; X64-LABEL: test_mm_max_epu8:
1664 ; X64:       # BB#0:
1665 ; X64-NEXT:    pmaxub %xmm1, %xmm0
1666 ; X64-NEXT:    retq
1667   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
1668   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
1669   %cmp = icmp ugt <16 x i8> %arg0, %arg1
1670   %sel = select <16 x i1> %cmp, <16 x i8> %arg0, <16 x i8> %arg1
1671   %bc = bitcast <16 x i8> %sel to <2 x i64>
1672   ret <2 x i64> %bc
1673 }
1674
1675 define <2 x double> @test_mm_max_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
1676 ; X32-LABEL: test_mm_max_pd:
1677 ; X32:       # BB#0:
1678 ; X32-NEXT:    maxpd %xmm1, %xmm0
1679 ; X32-NEXT:    retl
1680 ;
1681 ; X64-LABEL: test_mm_max_pd:
1682 ; X64:       # BB#0:
1683 ; X64-NEXT:    maxpd %xmm1, %xmm0
1684 ; X64-NEXT:    retq
1685   %res = call <2 x double> @llvm.x86.sse2.max.pd(<2 x double> %a0, <2 x double> %a1)
1686   ret <2 x double> %res
1687 }
1688 declare <2 x double> @llvm.x86.sse2.max.pd(<2 x double>, <2 x double>) nounwind readnone
1689
1690 define <2 x double> @test_mm_max_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
1691 ; X32-LABEL: test_mm_max_sd:
1692 ; X32:       # BB#0:
1693 ; X32-NEXT:    maxsd %xmm1, %xmm0
1694 ; X32-NEXT:    retl
1695 ;
1696 ; X64-LABEL: test_mm_max_sd:
1697 ; X64:       # BB#0:
1698 ; X64-NEXT:    maxsd %xmm1, %xmm0
1699 ; X64-NEXT:    retq
1700   %res = call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %a0, <2 x double> %a1)
1701   ret <2 x double> %res
1702 }
1703 declare <2 x double> @llvm.x86.sse2.max.sd(<2 x double>, <2 x double>) nounwind readnone
1704
1705 define void @test_mm_mfence() nounwind {
1706 ; X32-LABEL: test_mm_mfence:
1707 ; X32:       # BB#0:
1708 ; X32-NEXT:    mfence
1709 ; X32-NEXT:    retl
1710 ;
1711 ; X64-LABEL: test_mm_mfence:
1712 ; X64:       # BB#0:
1713 ; X64-NEXT:    mfence
1714 ; X64-NEXT:    retq
1715   call void @llvm.x86.sse2.mfence()
1716   ret void
1717 }
1718 declare void @llvm.x86.sse2.mfence() nounwind readnone
1719
1720 define <2 x i64> @test_mm_min_epi16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
1721 ; X32-LABEL: test_mm_min_epi16:
1722 ; X32:       # BB#0:
1723 ; X32-NEXT:    pminsw %xmm1, %xmm0
1724 ; X32-NEXT:    retl
1725 ;
1726 ; X64-LABEL: test_mm_min_epi16:
1727 ; X64:       # BB#0:
1728 ; X64-NEXT:    pminsw %xmm1, %xmm0
1729 ; X64-NEXT:    retq
1730   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
1731   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
1732   %cmp = icmp slt <8 x i16> %arg0, %arg1
1733   %sel = select <8 x i1> %cmp, <8 x i16> %arg0, <8 x i16> %arg1
1734   %bc = bitcast <8 x i16> %sel to <2 x i64>
1735   ret <2 x i64> %bc
1736 }
1737
1738 define <2 x i64> @test_mm_min_epu8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
1739 ; X32-LABEL: test_mm_min_epu8:
1740 ; X32:       # BB#0:
1741 ; X32-NEXT:    pminub %xmm1, %xmm0
1742 ; X32-NEXT:    retl
1743 ;
1744 ; X64-LABEL: test_mm_min_epu8:
1745 ; X64:       # BB#0:
1746 ; X64-NEXT:    pminub %xmm1, %xmm0
1747 ; X64-NEXT:    retq
1748   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
1749   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
1750   %cmp = icmp ult <16 x i8> %arg0, %arg1
1751   %sel = select <16 x i1> %cmp, <16 x i8> %arg0, <16 x i8> %arg1
1752   %bc = bitcast <16 x i8> %sel to <2 x i64>
1753   ret <2 x i64> %bc
1754 }
1755
1756 define <2 x double> @test_mm_min_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
1757 ; X32-LABEL: test_mm_min_pd:
1758 ; X32:       # BB#0:
1759 ; X32-NEXT:    minpd %xmm1, %xmm0
1760 ; X32-NEXT:    retl
1761 ;
1762 ; X64-LABEL: test_mm_min_pd:
1763 ; X64:       # BB#0:
1764 ; X64-NEXT:    minpd %xmm1, %xmm0
1765 ; X64-NEXT:    retq
1766   %res = call <2 x double> @llvm.x86.sse2.min.pd(<2 x double> %a0, <2 x double> %a1)
1767   ret <2 x double> %res
1768 }
1769 declare <2 x double> @llvm.x86.sse2.min.pd(<2 x double>, <2 x double>) nounwind readnone
1770
1771 define <2 x double> @test_mm_min_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
1772 ; X32-LABEL: test_mm_min_sd:
1773 ; X32:       # BB#0:
1774 ; X32-NEXT:    minsd %xmm1, %xmm0
1775 ; X32-NEXT:    retl
1776 ;
1777 ; X64-LABEL: test_mm_min_sd:
1778 ; X64:       # BB#0:
1779 ; X64-NEXT:    minsd %xmm1, %xmm0
1780 ; X64-NEXT:    retq
1781   %res = call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %a0, <2 x double> %a1)
1782   ret <2 x double> %res
1783 }
1784 declare <2 x double> @llvm.x86.sse2.min.sd(<2 x double>, <2 x double>) nounwind readnone
1785
1786 define <2 x i64> @test_mm_move_epi64(<2 x i64> %a0) nounwind {
1787 ; X32-LABEL: test_mm_move_epi64:
1788 ; X32:       # BB#0:
1789 ; X32-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
1790 ; X32-NEXT:    retl
1791 ;
1792 ; X64-LABEL: test_mm_move_epi64:
1793 ; X64:       # BB#0:
1794 ; X64-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
1795 ; X64-NEXT:    retq
1796   %res = shufflevector <2 x i64> %a0, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 2>
1797   ret <2 x i64> %res
1798 }
1799
1800 define <2 x double> @test_mm_move_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
1801 ; X32-LABEL: test_mm_move_sd:
1802 ; X32:       # BB#0:
1803 ; X32-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1804 ; X32-NEXT:    retl
1805 ;
1806 ; X64-LABEL: test_mm_move_sd:
1807 ; X64:       # BB#0:
1808 ; X64-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1809 ; X64-NEXT:    retq
1810   %ext0 = extractelement <2 x double> %a1, i32 0
1811   %res0 = insertelement <2 x double> undef, double %ext0, i32 0
1812   %ext1 = extractelement <2 x double> %a0, i32 1
1813   %res1 = insertelement <2 x double> %res0, double %ext1, i32 1
1814   ret <2 x double> %res1
1815 }
1816
1817 define i32 @test_mm_movemask_epi8(<2 x i64> %a0) nounwind {
1818 ; X32-LABEL: test_mm_movemask_epi8:
1819 ; X32:       # BB#0:
1820 ; X32-NEXT:    pmovmskb %xmm0, %eax
1821 ; X32-NEXT:    retl
1822 ;
1823 ; X64-LABEL: test_mm_movemask_epi8:
1824 ; X64:       # BB#0:
1825 ; X64-NEXT:    pmovmskb %xmm0, %eax
1826 ; X64-NEXT:    retq
1827   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
1828   %res = call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %arg0)
1829   ret i32 %res
1830 }
1831 declare i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8>) nounwind readnone
1832
1833 define i32 @test_mm_movemask_pd(<2 x double> %a0) nounwind {
1834 ; X32-LABEL: test_mm_movemask_pd:
1835 ; X32:       # BB#0:
1836 ; X32-NEXT:    movmskpd %xmm0, %eax
1837 ; X32-NEXT:    retl
1838 ;
1839 ; X64-LABEL: test_mm_movemask_pd:
1840 ; X64:       # BB#0:
1841 ; X64-NEXT:    movmskpd %xmm0, %eax
1842 ; X64-NEXT:    retq
1843   %res = call i32 @llvm.x86.sse2.movmsk.pd(<2 x double> %a0)
1844   ret i32 %res
1845 }
1846 declare i32 @llvm.x86.sse2.movmsk.pd(<2 x double>) nounwind readnone
1847
1848 define <2 x i64> @test_mm_mul_epu32(<2 x i64> %a0, <2 x i64> %a1) {
1849 ; X32-LABEL: test_mm_mul_epu32:
1850 ; X32:       # BB#0:
1851 ; X32-NEXT:    pmuludq %xmm1, %xmm0
1852 ; X32-NEXT:    retl
1853 ;
1854 ; X64-LABEL: test_mm_mul_epu32:
1855 ; X64:       # BB#0:
1856 ; X64-NEXT:    pmuludq %xmm1, %xmm0
1857 ; X64-NEXT:    retq
1858   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
1859   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
1860   %res = call <2 x i64> @llvm.x86.sse2.pmulu.dq(<4 x i32> %arg0, <4 x i32> %arg1)
1861   ret <2 x i64> %res
1862 }
1863 declare <2 x i64> @llvm.x86.sse2.pmulu.dq(<4 x i32>, <4 x i32>) nounwind readnone
1864
1865 define <2 x double> @test_mm_mul_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
1866 ; X32-LABEL: test_mm_mul_pd:
1867 ; X32:       # BB#0:
1868 ; X32-NEXT:    mulpd %xmm1, %xmm0
1869 ; X32-NEXT:    retl
1870 ;
1871 ; X64-LABEL: test_mm_mul_pd:
1872 ; X64:       # BB#0:
1873 ; X64-NEXT:    mulpd %xmm1, %xmm0
1874 ; X64-NEXT:    retq
1875   %res = fmul <2 x double> %a0, %a1
1876   ret <2 x double> %res
1877 }
1878
1879 define <2 x double> @test_mm_mul_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
1880 ; X32-LABEL: test_mm_mul_sd:
1881 ; X32:       # BB#0:
1882 ; X32-NEXT:    mulsd %xmm1, %xmm0
1883 ; X32-NEXT:    retl
1884 ;
1885 ; X64-LABEL: test_mm_mul_sd:
1886 ; X64:       # BB#0:
1887 ; X64-NEXT:    mulsd %xmm1, %xmm0
1888 ; X64-NEXT:    retq
1889   %ext0 = extractelement <2 x double> %a0, i32 0
1890   %ext1 = extractelement <2 x double> %a1, i32 0
1891   %fmul = fmul double %ext0, %ext1
1892   %res = insertelement <2 x double> %a0, double %fmul, i32 0
1893   ret <2 x double> %res
1894 }
1895
1896 define <2 x i64> @test_mm_mulhi_epi16(<2 x i64> %a0, <2 x i64> %a1) {
1897 ; X32-LABEL: test_mm_mulhi_epi16:
1898 ; X32:       # BB#0:
1899 ; X32-NEXT:    pmulhw %xmm1, %xmm0
1900 ; X32-NEXT:    retl
1901 ;
1902 ; X64-LABEL: test_mm_mulhi_epi16:
1903 ; X64:       # BB#0:
1904 ; X64-NEXT:    pmulhw %xmm1, %xmm0
1905 ; X64-NEXT:    retq
1906   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
1907   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
1908   %res = call <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16> %arg0, <8 x i16> %arg1)
1909   %bc = bitcast <8 x i16> %res to <2 x i64>
1910   ret <2 x i64> %bc
1911 }
1912 declare <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16>, <8 x i16>) nounwind readnone
1913
1914 define <2 x i64> @test_mm_mulhi_epu16(<2 x i64> %a0, <2 x i64> %a1) {
1915 ; X32-LABEL: test_mm_mulhi_epu16:
1916 ; X32:       # BB#0:
1917 ; X32-NEXT:    pmulhuw %xmm1, %xmm0
1918 ; X32-NEXT:    retl
1919 ;
1920 ; X64-LABEL: test_mm_mulhi_epu16:
1921 ; X64:       # BB#0:
1922 ; X64-NEXT:    pmulhuw %xmm1, %xmm0
1923 ; X64-NEXT:    retq
1924   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
1925   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
1926   %res = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %arg0, <8 x i16> %arg1)
1927   %bc = bitcast <8 x i16> %res to <2 x i64>
1928   ret <2 x i64> %bc
1929 }
1930 declare <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16>, <8 x i16>) nounwind readnone
1931
1932 define <2 x i64> @test_mm_mullo_epi16(<2 x i64> %a0, <2 x i64> %a1) {
1933 ; X32-LABEL: test_mm_mullo_epi16:
1934 ; X32:       # BB#0:
1935 ; X32-NEXT:    pmullw %xmm1, %xmm0
1936 ; X32-NEXT:    retl
1937 ;
1938 ; X64-LABEL: test_mm_mullo_epi16:
1939 ; X64:       # BB#0:
1940 ; X64-NEXT:    pmullw %xmm1, %xmm0
1941 ; X64-NEXT:    retq
1942   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
1943   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
1944   %res = mul <8 x i16> %arg0, %arg1
1945   %bc = bitcast <8 x i16> %res to <2 x i64>
1946   ret <2 x i64> %bc
1947 }
1948
1949 define <2 x double> @test_mm_or_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
1950 ; X32-LABEL: test_mm_or_pd:
1951 ; X32:       # BB#0:
1952 ; X32-NEXT:    orps %xmm1, %xmm0
1953 ; X32-NEXT:    retl
1954 ;
1955 ; X64-LABEL: test_mm_or_pd:
1956 ; X64:       # BB#0:
1957 ; X64-NEXT:    orps %xmm1, %xmm0
1958 ; X64-NEXT:    retq
1959   %arg0 = bitcast <2 x double> %a0 to <4 x i32>
1960   %arg1 = bitcast <2 x double> %a1 to <4 x i32>
1961   %res = or <4 x i32> %arg0, %arg1
1962   %bc = bitcast <4 x i32> %res to <2 x double>
1963   ret <2 x double> %bc
1964 }
1965
1966 define <2 x i64> @test_mm_or_si128(<2 x i64> %a0, <2 x i64> %a1) nounwind {
1967 ; X32-LABEL: test_mm_or_si128:
1968 ; X32:       # BB#0:
1969 ; X32-NEXT:    orps %xmm1, %xmm0
1970 ; X32-NEXT:    retl
1971 ;
1972 ; X64-LABEL: test_mm_or_si128:
1973 ; X64:       # BB#0:
1974 ; X64-NEXT:    orps %xmm1, %xmm0
1975 ; X64-NEXT:    retq
1976   %res = or <2 x i64> %a0, %a1
1977   ret <2 x i64> %res
1978 }
1979
1980 define <2 x i64> @test_mm_packs_epi16(<2 x i64> %a0, <2 x i64> %a1) {
1981 ; X32-LABEL: test_mm_packs_epi16:
1982 ; X32:       # BB#0:
1983 ; X32-NEXT:    packsswb %xmm1, %xmm0
1984 ; X32-NEXT:    retl
1985 ;
1986 ; X64-LABEL: test_mm_packs_epi16:
1987 ; X64:       # BB#0:
1988 ; X64-NEXT:    packsswb %xmm1, %xmm0
1989 ; X64-NEXT:    retq
1990   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
1991   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
1992   %res = call <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16> %arg0, <8 x i16> %arg1)
1993   %bc = bitcast <16 x i8> %res to <2 x i64>
1994   ret <2 x i64> %bc
1995 }
1996 declare <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16>, <8 x i16>) nounwind readnone
1997
1998 define <2 x i64> @test_mm_packs_epi32(<2 x i64> %a0, <2 x i64> %a1) {
1999 ; X32-LABEL: test_mm_packs_epi32:
2000 ; X32:       # BB#0:
2001 ; X32-NEXT:    packssdw %xmm1, %xmm0
2002 ; X32-NEXT:    retl
2003 ;
2004 ; X64-LABEL: test_mm_packs_epi32:
2005 ; X64:       # BB#0:
2006 ; X64-NEXT:    packssdw %xmm1, %xmm0
2007 ; X64-NEXT:    retq
2008   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
2009   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
2010   %res = call <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32> %arg0, <4 x i32> %arg1)
2011   %bc = bitcast <8 x i16> %res to <2 x i64>
2012   ret <2 x i64> %bc
2013 }
2014 declare <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32>, <4 x i32>) nounwind readnone
2015
2016 define <2 x i64> @test_mm_packus_epi16(<2 x i64> %a0, <2 x i64> %a1) {
2017 ; X32-LABEL: test_mm_packus_epi16:
2018 ; X32:       # BB#0:
2019 ; X32-NEXT:    packuswb %xmm1, %xmm0
2020 ; X32-NEXT:    retl
2021 ;
2022 ; X64-LABEL: test_mm_packus_epi16:
2023 ; X64:       # BB#0:
2024 ; X64-NEXT:    packuswb %xmm1, %xmm0
2025 ; X64-NEXT:    retq
2026   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
2027   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
2028   %res = call <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16> %arg0, <8 x i16> %arg1)
2029   %bc = bitcast <16 x i8> %res to <2 x i64>
2030   ret <2 x i64> %bc
2031 }
2032 declare <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16>, <8 x i16>) nounwind readnone
2033
2034 define void @test_mm_pause() nounwind {
2035 ; X32-LABEL: test_mm_pause:
2036 ; X32:       # BB#0:
2037 ; X32-NEXT:    pause
2038 ; X32-NEXT:    retl
2039 ;
2040 ; X64-LABEL: test_mm_pause:
2041 ; X64:       # BB#0:
2042 ; X64-NEXT:    pause
2043 ; X64-NEXT:    retq
2044   call void @llvm.x86.sse2.pause()
2045   ret void
2046 }
2047 declare void @llvm.x86.sse2.pause() nounwind readnone
2048
2049 define <2 x i64> @test_mm_sad_epu8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
2050 ; X32-LABEL: test_mm_sad_epu8:
2051 ; X32:       # BB#0:
2052 ; X32-NEXT:    psadbw %xmm1, %xmm0
2053 ; X32-NEXT:    retl
2054 ;
2055 ; X64-LABEL: test_mm_sad_epu8:
2056 ; X64:       # BB#0:
2057 ; X64-NEXT:    psadbw %xmm1, %xmm0
2058 ; X64-NEXT:    retq
2059   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
2060   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
2061   %res = call <2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8> %arg0, <16 x i8> %arg1)
2062   ret <2 x i64> %res
2063 }
2064 declare <2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8>, <16 x i8>) nounwind readnone
2065
2066 define <2 x i64> @test_mm_set_epi8(i8 %a0, i8 %a1, i8 %a2, i8 %a3, i8 %a4, i8 %a5, i8 %a6, i8 %a7, i8 %a8, i8 %a9, i8 %a10, i8 %a11, i8 %a12, i8 %a13, i8 %a14, i8 %a15) nounwind {
2067 ; X32-LABEL: test_mm_set_epi8:
2068 ; X32:       # BB#0:
2069 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2070 ; X32-NEXT:    movd %eax, %xmm0
2071 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2072 ; X32-NEXT:    movd %eax, %xmm1
2073 ; X32-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2074 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2075 ; X32-NEXT:    movd %eax, %xmm0
2076 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2077 ; X32-NEXT:    movd %eax, %xmm2
2078 ; X32-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2079 ; X32-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
2080 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2081 ; X32-NEXT:    movd %eax, %xmm0
2082 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2083 ; X32-NEXT:    movd %eax, %xmm3
2084 ; X32-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
2085 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2086 ; X32-NEXT:    movd %eax, %xmm0
2087 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2088 ; X32-NEXT:    movd %eax, %xmm1
2089 ; X32-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2090 ; X32-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
2091 ; X32-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
2092 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2093 ; X32-NEXT:    movd %eax, %xmm0
2094 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2095 ; X32-NEXT:    movd %eax, %xmm2
2096 ; X32-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2097 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2098 ; X32-NEXT:    movd %eax, %xmm0
2099 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2100 ; X32-NEXT:    movd %eax, %xmm3
2101 ; X32-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
2102 ; X32-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2103 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2104 ; X32-NEXT:    movd %eax, %xmm0
2105 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2106 ; X32-NEXT:    movd %eax, %xmm2
2107 ; X32-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2108 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2109 ; X32-NEXT:    movd %eax, %xmm4
2110 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2111 ; X32-NEXT:    movd %eax, %xmm0
2112 ; X32-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
2113 ; X32-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
2114 ; X32-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
2115 ; X32-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2116 ; X32-NEXT:    retl
2117 ;
2118 ; X64-LABEL: test_mm_set_epi8:
2119 ; X64:       # BB#0:
2120 ; X64-NEXT:    movzbl %dil, %eax
2121 ; X64-NEXT:    movd %eax, %xmm0
2122 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2123 ; X64-NEXT:    movd %eax, %xmm1
2124 ; X64-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2125 ; X64-NEXT:    movzbl %r8b, %eax
2126 ; X64-NEXT:    movd %eax, %xmm0
2127 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2128 ; X64-NEXT:    movd %eax, %xmm2
2129 ; X64-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2130 ; X64-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
2131 ; X64-NEXT:    movzbl %dl, %eax
2132 ; X64-NEXT:    movd %eax, %xmm0
2133 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2134 ; X64-NEXT:    movd %eax, %xmm3
2135 ; X64-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
2136 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2137 ; X64-NEXT:    movd %eax, %xmm0
2138 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2139 ; X64-NEXT:    movd %eax, %xmm1
2140 ; X64-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2141 ; X64-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
2142 ; X64-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
2143 ; X64-NEXT:    movzbl %sil, %eax
2144 ; X64-NEXT:    movd %eax, %xmm0
2145 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2146 ; X64-NEXT:    movd %eax, %xmm2
2147 ; X64-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2148 ; X64-NEXT:    movzbl %r9b, %eax
2149 ; X64-NEXT:    movd %eax, %xmm0
2150 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2151 ; X64-NEXT:    movd %eax, %xmm3
2152 ; X64-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
2153 ; X64-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2154 ; X64-NEXT:    movzbl %cl, %eax
2155 ; X64-NEXT:    movd %eax, %xmm0
2156 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2157 ; X64-NEXT:    movd %eax, %xmm2
2158 ; X64-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2159 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2160 ; X64-NEXT:    movd %eax, %xmm4
2161 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2162 ; X64-NEXT:    movd %eax, %xmm0
2163 ; X64-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
2164 ; X64-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
2165 ; X64-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
2166 ; X64-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2167 ; X64-NEXT:    retq
2168   %res0  = insertelement <16 x i8> undef,  i8 %a15, i32 0
2169   %res1  = insertelement <16 x i8> %res0,  i8 %a14, i32 1
2170   %res2  = insertelement <16 x i8> %res1,  i8 %a13, i32 2
2171   %res3  = insertelement <16 x i8> %res2,  i8 %a12, i32 3
2172   %res4  = insertelement <16 x i8> %res3,  i8 %a11, i32 4
2173   %res5  = insertelement <16 x i8> %res4,  i8 %a10, i32 5
2174   %res6  = insertelement <16 x i8> %res5,  i8 %a9 , i32 6
2175   %res7  = insertelement <16 x i8> %res6,  i8 %a8 , i32 7
2176   %res8  = insertelement <16 x i8> %res7,  i8 %a7 , i32 8
2177   %res9  = insertelement <16 x i8> %res8,  i8 %a6 , i32 9
2178   %res10 = insertelement <16 x i8> %res9,  i8 %a5 , i32 10
2179   %res11 = insertelement <16 x i8> %res10, i8 %a4 , i32 11
2180   %res12 = insertelement <16 x i8> %res11, i8 %a3 , i32 12
2181   %res13 = insertelement <16 x i8> %res12, i8 %a2 , i32 13
2182   %res14 = insertelement <16 x i8> %res13, i8 %a1 , i32 14
2183   %res15 = insertelement <16 x i8> %res14, i8 %a0 , i32 15
2184   %res = bitcast <16 x i8> %res15 to <2 x i64>
2185   ret <2 x i64> %res
2186 }
2187
2188 define <2 x i64> @test_mm_set_epi16(i16 %a0, i16 %a1, i16 %a2, i16 %a3, i16 %a4, i16 %a5, i16 %a6, i16 %a7) nounwind {
2189 ; X32-LABEL: test_mm_set_epi16:
2190 ; X32:       # BB#0:
2191 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2192 ; X32-NEXT:    movd %eax, %xmm1
2193 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2194 ; X32-NEXT:    movd %eax, %xmm2
2195 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2196 ; X32-NEXT:    movd %eax, %xmm3
2197 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2198 ; X32-NEXT:    movd %eax, %xmm4
2199 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2200 ; X32-NEXT:    movd %eax, %xmm5
2201 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2202 ; X32-NEXT:    movd %eax, %xmm6
2203 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2204 ; X32-NEXT:    movd %eax, %xmm7
2205 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2206 ; X32-NEXT:    movd %eax, %xmm0
2207 ; X32-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
2208 ; X32-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
2209 ; X32-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
2210 ; X32-NEXT:    punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1],xmm6[2],xmm5[2],xmm6[3],xmm5[3]
2211 ; X32-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1],xmm0[2],xmm7[2],xmm0[3],xmm7[3]
2212 ; X32-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm6[0],xmm0[1],xmm6[1],xmm0[2],xmm6[2],xmm0[3],xmm6[3]
2213 ; X32-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
2214 ; X32-NEXT:    retl
2215 ;
2216 ; X64-LABEL: test_mm_set_epi16:
2217 ; X64:       # BB#0:
2218 ; X64-NEXT:    movw {{[0-9]+}}(%rsp), %r10w
2219 ; X64-NEXT:    movw {{[0-9]+}}(%rsp), %ax
2220 ; X64-NEXT:    movd %edi, %xmm0
2221 ; X64-NEXT:    movd %r8d, %xmm1
2222 ; X64-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2223 ; X64-NEXT:    movd %edx, %xmm0
2224 ; X64-NEXT:    movd %eax, %xmm2
2225 ; X64-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2226 ; X64-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
2227 ; X64-NEXT:    movd %esi, %xmm0
2228 ; X64-NEXT:    movd %r9d, %xmm1
2229 ; X64-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2230 ; X64-NEXT:    movd %ecx, %xmm3
2231 ; X64-NEXT:    movd %r10d, %xmm0
2232 ; X64-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
2233 ; X64-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2234 ; X64-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
2235 ; X64-NEXT:    retq
2236   %res0  = insertelement <8 x i16> undef, i16 %a7, i32 0
2237   %res1  = insertelement <8 x i16> %res0, i16 %a6, i32 1
2238   %res2  = insertelement <8 x i16> %res1, i16 %a5, i32 2
2239   %res3  = insertelement <8 x i16> %res2, i16 %a4, i32 3
2240   %res4  = insertelement <8 x i16> %res3, i16 %a3, i32 4
2241   %res5  = insertelement <8 x i16> %res4, i16 %a2, i32 5
2242   %res6  = insertelement <8 x i16> %res5, i16 %a1, i32 6
2243   %res7  = insertelement <8 x i16> %res6, i16 %a0, i32 7
2244   %res = bitcast <8 x i16> %res7 to <2 x i64>
2245   ret <2 x i64> %res
2246 }
2247
2248 define <2 x i64> @test_mm_set_epi32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind {
2249 ; X32-LABEL: test_mm_set_epi32:
2250 ; X32:       # BB#0:
2251 ; X32-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2252 ; X32-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2253 ; X32-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
2254 ; X32-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
2255 ; X32-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2256 ; X32-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2257 ; X32-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2258 ; X32-NEXT:    retl
2259 ;
2260 ; X64-LABEL: test_mm_set_epi32:
2261 ; X64:       # BB#0:
2262 ; X64-NEXT:    movd %edi, %xmm0
2263 ; X64-NEXT:    movd %edx, %xmm1
2264 ; X64-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
2265 ; X64-NEXT:    movd %esi, %xmm2
2266 ; X64-NEXT:    movd %ecx, %xmm0
2267 ; X64-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2268 ; X64-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2269 ; X64-NEXT:    retq
2270   %res0  = insertelement <4 x i32> undef, i32 %a3, i32 0
2271   %res1  = insertelement <4 x i32> %res0, i32 %a2, i32 1
2272   %res2  = insertelement <4 x i32> %res1, i32 %a1, i32 2
2273   %res3  = insertelement <4 x i32> %res2, i32 %a0, i32 3
2274   %res = bitcast <4 x i32> %res3 to <2 x i64>
2275   ret <2 x i64> %res
2276 }
2277
2278 ; TODO test_mm_set_epi64
2279
2280 define <2 x i64> @test_mm_set_epi64x(i64 %a0, i64 %a1) nounwind {
2281 ; X32-LABEL: test_mm_set_epi64x:
2282 ; X32:       # BB#0:
2283 ; X32-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2284 ; X32-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2285 ; X32-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2286 ; X32-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2287 ; X32-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
2288 ; X32-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
2289 ; X32-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2290 ; X32-NEXT:    retl
2291 ;
2292 ; X64-LABEL: test_mm_set_epi64x:
2293 ; X64:       # BB#0:
2294 ; X64-NEXT:    movd %rdi, %xmm1
2295 ; X64-NEXT:    movd %rsi, %xmm0
2296 ; X64-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2297 ; X64-NEXT:    retq
2298   %res0  = insertelement <2 x i64> undef, i64 %a1, i32 0
2299   %res1  = insertelement <2 x i64> %res0, i64 %a0, i32 1
2300   ret <2 x i64> %res1
2301 }
2302
2303 define <2 x double> @test_mm_set_pd(double %a0, double %a1) nounwind {
2304 ; X32-LABEL: test_mm_set_pd:
2305 ; X32:       # BB#0:
2306 ; X32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
2307 ; X32-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
2308 ; X32-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2309 ; X32-NEXT:    retl
2310 ;
2311 ; X64-LABEL: test_mm_set_pd:
2312 ; X64:       # BB#0:
2313 ; X64-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2314 ; X64-NEXT:    movapd %xmm1, %xmm0
2315 ; X64-NEXT:    retq
2316   %res0  = insertelement <2 x double> undef, double %a1, i32 0
2317   %res1  = insertelement <2 x double> %res0, double %a0, i32 1
2318   ret <2 x double> %res1
2319 }
2320
2321 define <2 x double> @test_mm_set_sd(double %a0) nounwind {
2322 ; X32-LABEL: test_mm_set_sd:
2323 ; X32:       # BB#0:
2324 ; X32-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2325 ; X32-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
2326 ; X32-NEXT:    retl
2327 ;
2328 ; X64-LABEL: test_mm_set_sd:
2329 ; X64:       # BB#0:
2330 ; X64-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
2331 ; X64-NEXT:    retq
2332   %res0  = insertelement <2 x double> undef, double %a0, i32 0
2333   %res1  = insertelement <2 x double> %res0, double 0.0, i32 1
2334   ret <2 x double> %res1
2335 }
2336
2337 define <2 x i64> @test_mm_set1_epi8(i8 %a0) nounwind {
2338 ; X32-LABEL: test_mm_set1_epi8:
2339 ; X32:       # BB#0:
2340 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2341 ; X32-NEXT:    movd %eax, %xmm0
2342 ; X32-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2343 ; X32-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2344 ; X32-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2345 ; X32-NEXT:    retl
2346 ;
2347 ; X64-LABEL: test_mm_set1_epi8:
2348 ; X64:       # BB#0:
2349 ; X64-NEXT:    movzbl %dil, %eax
2350 ; X64-NEXT:    movd %eax, %xmm0
2351 ; X64-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2352 ; X64-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2353 ; X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2354 ; X64-NEXT:    retq
2355   %res0  = insertelement <16 x i8> undef,  i8 %a0, i32 0
2356   %res1  = insertelement <16 x i8> %res0,  i8 %a0, i32 1
2357   %res2  = insertelement <16 x i8> %res1,  i8 %a0, i32 2
2358   %res3  = insertelement <16 x i8> %res2,  i8 %a0, i32 3
2359   %res4  = insertelement <16 x i8> %res3,  i8 %a0, i32 4
2360   %res5  = insertelement <16 x i8> %res4,  i8 %a0, i32 5
2361   %res6  = insertelement <16 x i8> %res5,  i8 %a0, i32 6
2362   %res7  = insertelement <16 x i8> %res6,  i8 %a0, i32 7
2363   %res8  = insertelement <16 x i8> %res7,  i8 %a0, i32 8
2364   %res9  = insertelement <16 x i8> %res8,  i8 %a0, i32 9
2365   %res10 = insertelement <16 x i8> %res9,  i8 %a0, i32 10
2366   %res11 = insertelement <16 x i8> %res10, i8 %a0, i32 11
2367   %res12 = insertelement <16 x i8> %res11, i8 %a0, i32 12
2368   %res13 = insertelement <16 x i8> %res12, i8 %a0, i32 13
2369   %res14 = insertelement <16 x i8> %res13, i8 %a0, i32 14
2370   %res15 = insertelement <16 x i8> %res14, i8 %a0, i32 15
2371   %res = bitcast <16 x i8> %res15 to <2 x i64>
2372   ret <2 x i64> %res
2373 }
2374
2375 define <2 x i64> @test_mm_set1_epi16(i16 %a0) nounwind {
2376 ; X32-LABEL: test_mm_set1_epi16:
2377 ; X32:       # BB#0:
2378 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2379 ; X32-NEXT:    movd %eax, %xmm0
2380 ; X32-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2381 ; X32-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2382 ; X32-NEXT:    retl
2383 ;
2384 ; X64-LABEL: test_mm_set1_epi16:
2385 ; X64:       # BB#0:
2386 ; X64-NEXT:    movd %edi, %xmm0
2387 ; X64-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2388 ; X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2389 ; X64-NEXT:    retq
2390   %res0  = insertelement <8 x i16> undef, i16 %a0, i32 0
2391   %res1  = insertelement <8 x i16> %res0, i16 %a0, i32 1
2392   %res2  = insertelement <8 x i16> %res1, i16 %a0, i32 2
2393   %res3  = insertelement <8 x i16> %res2, i16 %a0, i32 3
2394   %res4  = insertelement <8 x i16> %res3, i16 %a0, i32 4
2395   %res5  = insertelement <8 x i16> %res4, i16 %a0, i32 5
2396   %res6  = insertelement <8 x i16> %res5, i16 %a0, i32 6
2397   %res7  = insertelement <8 x i16> %res6, i16 %a0, i32 7
2398   %res = bitcast <8 x i16> %res7 to <2 x i64>
2399   ret <2 x i64> %res
2400 }
2401
2402 define <2 x i64> @test_mm_set1_epi32(i32 %a0) nounwind {
2403 ; X32-LABEL: test_mm_set1_epi32:
2404 ; X32:       # BB#0:
2405 ; X32-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2406 ; X32-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2407 ; X32-NEXT:    retl
2408 ;
2409 ; X64-LABEL: test_mm_set1_epi32:
2410 ; X64:       # BB#0:
2411 ; X64-NEXT:    movd %edi, %xmm0
2412 ; X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2413 ; X64-NEXT:    retq
2414   %res0  = insertelement <4 x i32> undef, i32 %a0, i32 0
2415   %res1  = insertelement <4 x i32> %res0, i32 %a0, i32 1
2416   %res2  = insertelement <4 x i32> %res1, i32 %a0, i32 2
2417   %res3  = insertelement <4 x i32> %res2, i32 %a0, i32 3
2418   %res = bitcast <4 x i32> %res3 to <2 x i64>
2419   ret <2 x i64> %res
2420 }
2421
2422 ; TODO test_mm_set1_epi64
2423
2424 define <2 x i64> @test_mm_set1_epi64x(i64 %a0) nounwind {
2425 ; X32-LABEL: test_mm_set1_epi64x:
2426 ; X32:       # BB#0:
2427 ; X32-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2428 ; X32-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2429 ; X32-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2430 ; X32-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
2431 ; X32-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2432 ; X32-NEXT:    retl
2433 ;
2434 ; X64-LABEL: test_mm_set1_epi64x:
2435 ; X64:       # BB#0:
2436 ; X64-NEXT:    movd %rdi, %xmm0
2437 ; X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
2438 ; X64-NEXT:    retq
2439   %res0  = insertelement <2 x i64> undef, i64 %a0, i32 0
2440   %res1  = insertelement <2 x i64> %res0, i64 %a0, i32 1
2441   ret <2 x i64> %res1
2442 }
2443
2444 define <2 x double> @test_mm_set1_pd(double %a0) nounwind {
2445 ; X32-LABEL: test_mm_set1_pd:
2446 ; X32:       # BB#0:
2447 ; X32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
2448 ; X32-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
2449 ; X32-NEXT:    retl
2450 ;
2451 ; X64-LABEL: test_mm_set1_pd:
2452 ; X64:       # BB#0:
2453 ; X64-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
2454 ; X64-NEXT:    retq
2455   %res0  = insertelement <2 x double> undef, double %a0, i32 0
2456   %res1  = insertelement <2 x double> %res0, double %a0, i32 1
2457   ret <2 x double> %res1
2458 }
2459
2460 define <2 x i64> @test_mm_setr_epi8(i8 %a0, i8 %a1, i8 %a2, i8 %a3, i8 %a4, i8 %a5, i8 %a6, i8 %a7, i8 %a8, i8 %a9, i8 %a10, i8 %a11, i8 %a12, i8 %a13, i8 %a14, i8 %a15) nounwind {
2461 ; X32-LABEL: test_mm_setr_epi8:
2462 ; X32:       # BB#0:
2463 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2464 ; X32-NEXT:    movd %eax, %xmm0
2465 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2466 ; X32-NEXT:    movd %eax, %xmm1
2467 ; X32-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2468 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2469 ; X32-NEXT:    movd %eax, %xmm0
2470 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2471 ; X32-NEXT:    movd %eax, %xmm2
2472 ; X32-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2473 ; X32-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
2474 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2475 ; X32-NEXT:    movd %eax, %xmm0
2476 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2477 ; X32-NEXT:    movd %eax, %xmm3
2478 ; X32-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
2479 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2480 ; X32-NEXT:    movd %eax, %xmm0
2481 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2482 ; X32-NEXT:    movd %eax, %xmm1
2483 ; X32-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2484 ; X32-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
2485 ; X32-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
2486 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2487 ; X32-NEXT:    movd %eax, %xmm0
2488 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2489 ; X32-NEXT:    movd %eax, %xmm2
2490 ; X32-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2491 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2492 ; X32-NEXT:    movd %eax, %xmm0
2493 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2494 ; X32-NEXT:    movd %eax, %xmm3
2495 ; X32-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
2496 ; X32-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2497 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2498 ; X32-NEXT:    movd %eax, %xmm0
2499 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2500 ; X32-NEXT:    movd %eax, %xmm2
2501 ; X32-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2502 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2503 ; X32-NEXT:    movd %eax, %xmm4
2504 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
2505 ; X32-NEXT:    movd %eax, %xmm0
2506 ; X32-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
2507 ; X32-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
2508 ; X32-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
2509 ; X32-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2510 ; X32-NEXT:    retl
2511 ;
2512 ; X64-LABEL: test_mm_setr_epi8:
2513 ; X64:       # BB#0:
2514 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2515 ; X64-NEXT:    movd %eax, %xmm0
2516 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2517 ; X64-NEXT:    movd %eax, %xmm1
2518 ; X64-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2519 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2520 ; X64-NEXT:    movd %eax, %xmm0
2521 ; X64-NEXT:    movzbl %cl, %eax
2522 ; X64-NEXT:    movd %eax, %xmm2
2523 ; X64-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2524 ; X64-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
2525 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2526 ; X64-NEXT:    movd %eax, %xmm0
2527 ; X64-NEXT:    movzbl %r9b, %eax
2528 ; X64-NEXT:    movd %eax, %xmm3
2529 ; X64-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
2530 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2531 ; X64-NEXT:    movd %eax, %xmm0
2532 ; X64-NEXT:    movzbl %sil, %eax
2533 ; X64-NEXT:    movd %eax, %xmm1
2534 ; X64-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2535 ; X64-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
2536 ; X64-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
2537 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2538 ; X64-NEXT:    movd %eax, %xmm0
2539 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2540 ; X64-NEXT:    movd %eax, %xmm2
2541 ; X64-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2542 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2543 ; X64-NEXT:    movd %eax, %xmm0
2544 ; X64-NEXT:    movzbl %dl, %eax
2545 ; X64-NEXT:    movd %eax, %xmm3
2546 ; X64-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
2547 ; X64-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2548 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2549 ; X64-NEXT:    movd %eax, %xmm0
2550 ; X64-NEXT:    movzbl %r8b, %eax
2551 ; X64-NEXT:    movd %eax, %xmm2
2552 ; X64-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2553 ; X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
2554 ; X64-NEXT:    movd %eax, %xmm4
2555 ; X64-NEXT:    movzbl %dil, %eax
2556 ; X64-NEXT:    movd %eax, %xmm0
2557 ; X64-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
2558 ; X64-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
2559 ; X64-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
2560 ; X64-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2561 ; X64-NEXT:    retq
2562   %res0  = insertelement <16 x i8> undef,  i8 %a0 , i32 0
2563   %res1  = insertelement <16 x i8> %res0,  i8 %a1 , i32 1
2564   %res2  = insertelement <16 x i8> %res1,  i8 %a2 , i32 2
2565   %res3  = insertelement <16 x i8> %res2,  i8 %a3 , i32 3
2566   %res4  = insertelement <16 x i8> %res3,  i8 %a4 , i32 4
2567   %res5  = insertelement <16 x i8> %res4,  i8 %a5 , i32 5
2568   %res6  = insertelement <16 x i8> %res5,  i8 %a6 , i32 6
2569   %res7  = insertelement <16 x i8> %res6,  i8 %a7 , i32 7
2570   %res8  = insertelement <16 x i8> %res7,  i8 %a8 , i32 8
2571   %res9  = insertelement <16 x i8> %res8,  i8 %a9 , i32 9
2572   %res10 = insertelement <16 x i8> %res9,  i8 %a10, i32 10
2573   %res11 = insertelement <16 x i8> %res10, i8 %a11, i32 11
2574   %res12 = insertelement <16 x i8> %res11, i8 %a12, i32 12
2575   %res13 = insertelement <16 x i8> %res12, i8 %a13, i32 13
2576   %res14 = insertelement <16 x i8> %res13, i8 %a14, i32 14
2577   %res15 = insertelement <16 x i8> %res14, i8 %a15, i32 15
2578   %res = bitcast <16 x i8> %res15 to <2 x i64>
2579   ret <2 x i64> %res
2580 }
2581
2582 define <2 x i64> @test_mm_setr_epi16(i16 %a0, i16 %a1, i16 %a2, i16 %a3, i16 %a4, i16 %a5, i16 %a6, i16 %a7) nounwind {
2583 ; X32-LABEL: test_mm_setr_epi16:
2584 ; X32:       # BB#0:
2585 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2586 ; X32-NEXT:    movd %eax, %xmm1
2587 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2588 ; X32-NEXT:    movd %eax, %xmm2
2589 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2590 ; X32-NEXT:    movd %eax, %xmm3
2591 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2592 ; X32-NEXT:    movd %eax, %xmm4
2593 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2594 ; X32-NEXT:    movd %eax, %xmm5
2595 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2596 ; X32-NEXT:    movd %eax, %xmm6
2597 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2598 ; X32-NEXT:    movd %eax, %xmm7
2599 ; X32-NEXT:    movw {{[0-9]+}}(%esp), %ax
2600 ; X32-NEXT:    movd %eax, %xmm0
2601 ; X32-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
2602 ; X32-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
2603 ; X32-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
2604 ; X32-NEXT:    punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1],xmm6[2],xmm5[2],xmm6[3],xmm5[3]
2605 ; X32-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1],xmm0[2],xmm7[2],xmm0[3],xmm7[3]
2606 ; X32-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm6[0],xmm0[1],xmm6[1],xmm0[2],xmm6[2],xmm0[3],xmm6[3]
2607 ; X32-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
2608 ; X32-NEXT:    retl
2609 ;
2610 ; X64-LABEL: test_mm_setr_epi16:
2611 ; X64:       # BB#0:
2612 ; X64-NEXT:    movw {{[0-9]+}}(%rsp), %ax
2613 ; X64-NEXT:    movw {{[0-9]+}}(%rsp), %r10w
2614 ; X64-NEXT:    movd %eax, %xmm0
2615 ; X64-NEXT:    movd %ecx, %xmm1
2616 ; X64-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2617 ; X64-NEXT:    movd %r9d, %xmm0
2618 ; X64-NEXT:    movd %esi, %xmm2
2619 ; X64-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2620 ; X64-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
2621 ; X64-NEXT:    movd %r10d, %xmm0
2622 ; X64-NEXT:    movd %edx, %xmm1
2623 ; X64-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2624 ; X64-NEXT:    movd %r8d, %xmm3
2625 ; X64-NEXT:    movd %edi, %xmm0
2626 ; X64-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
2627 ; X64-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2628 ; X64-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
2629 ; X64-NEXT:    retq
2630   %res0  = insertelement <8 x i16> undef, i16 %a0, i32 0
2631   %res1  = insertelement <8 x i16> %res0, i16 %a1, i32 1
2632   %res2  = insertelement <8 x i16> %res1, i16 %a2, i32 2
2633   %res3  = insertelement <8 x i16> %res2, i16 %a3, i32 3
2634   %res4  = insertelement <8 x i16> %res3, i16 %a4, i32 4
2635   %res5  = insertelement <8 x i16> %res4, i16 %a5, i32 5
2636   %res6  = insertelement <8 x i16> %res5, i16 %a6, i32 6
2637   %res7  = insertelement <8 x i16> %res6, i16 %a7, i32 7
2638   %res = bitcast <8 x i16> %res7 to <2 x i64>
2639   ret <2 x i64> %res
2640 }
2641
2642 define <2 x i64> @test_mm_setr_epi32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind {
2643 ; X32-LABEL: test_mm_setr_epi32:
2644 ; X32:       # BB#0:
2645 ; X32-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2646 ; X32-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2647 ; X32-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
2648 ; X32-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
2649 ; X32-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2650 ; X32-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2651 ; X32-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2652 ; X32-NEXT:    retl
2653 ;
2654 ; X64-LABEL: test_mm_setr_epi32:
2655 ; X64:       # BB#0:
2656 ; X64-NEXT:    movd %ecx, %xmm0
2657 ; X64-NEXT:    movd %esi, %xmm1
2658 ; X64-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
2659 ; X64-NEXT:    movd %edx, %xmm2
2660 ; X64-NEXT:    movd %edi, %xmm0
2661 ; X64-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2662 ; X64-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2663 ; X64-NEXT:    retq
2664   %res0  = insertelement <4 x i32> undef, i32 %a0, i32 0
2665   %res1  = insertelement <4 x i32> %res0, i32 %a1, i32 1
2666   %res2  = insertelement <4 x i32> %res1, i32 %a2, i32 2
2667   %res3  = insertelement <4 x i32> %res2, i32 %a3, i32 3
2668   %res = bitcast <4 x i32> %res3 to <2 x i64>
2669   ret <2 x i64> %res
2670 }
2671
2672 ; TODO test_mm_setr_epi64
2673
2674 define <2 x i64> @test_mm_setr_epi64x(i64 %a0, i64 %a1) nounwind {
2675 ; X32-LABEL: test_mm_setr_epi64x:
2676 ; X32:       # BB#0:
2677 ; X32-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2678 ; X32-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2679 ; X32-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2680 ; X32-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2681 ; X32-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
2682 ; X32-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
2683 ; X32-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2684 ; X32-NEXT:    retl
2685 ;
2686 ; X64-LABEL: test_mm_setr_epi64x:
2687 ; X64:       # BB#0:
2688 ; X64-NEXT:    movd %rsi, %xmm1
2689 ; X64-NEXT:    movd %rdi, %xmm0
2690 ; X64-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2691 ; X64-NEXT:    retq
2692   %res0  = insertelement <2 x i64> undef, i64 %a0, i32 0
2693   %res1  = insertelement <2 x i64> %res0, i64 %a1, i32 1
2694   ret <2 x i64> %res1
2695 }
2696
2697 define <2 x double> @test_mm_setr_pd(double %a0, double %a1) nounwind {
2698 ; X32-LABEL: test_mm_setr_pd:
2699 ; X32:       # BB#0:
2700 ; X32-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
2701 ; X32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
2702 ; X32-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2703 ; X32-NEXT:    retl
2704 ;
2705 ; X64-LABEL: test_mm_setr_pd:
2706 ; X64:       # BB#0:
2707 ; X64-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2708 ; X64-NEXT:    retq
2709   %res0  = insertelement <2 x double> undef, double %a0, i32 0
2710   %res1  = insertelement <2 x double> %res0, double %a1, i32 1
2711   ret <2 x double> %res1
2712 }
2713
2714 define <2 x double> @test_mm_setzero_pd() {
2715 ; X32-LABEL: test_mm_setzero_pd:
2716 ; X32:       # BB#0:
2717 ; X32-NEXT:    xorps %xmm0, %xmm0
2718 ; X32-NEXT:    retl
2719 ;
2720 ; X64-LABEL: test_mm_setzero_pd:
2721 ; X64:       # BB#0:
2722 ; X64-NEXT:    xorps %xmm0, %xmm0
2723 ; X64-NEXT:    retq
2724   ret <2 x double> zeroinitializer
2725 }
2726
2727 define <2 x i64> @test_mm_setzero_si128() {
2728 ; X32-LABEL: test_mm_setzero_si128:
2729 ; X32:       # BB#0:
2730 ; X32-NEXT:    xorps %xmm0, %xmm0
2731 ; X32-NEXT:    retl
2732 ;
2733 ; X64-LABEL: test_mm_setzero_si128:
2734 ; X64:       # BB#0:
2735 ; X64-NEXT:    xorps %xmm0, %xmm0
2736 ; X64-NEXT:    retq
2737   ret <2 x i64> zeroinitializer
2738 }
2739
2740 define <2 x i64> @test_mm_shuffle_epi32(<2 x i64> %a0) {
2741 ; X32-LABEL: test_mm_shuffle_epi32:
2742 ; X32:       # BB#0:
2743 ; X32-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2744 ; X32-NEXT:    retl
2745 ;
2746 ; X64-LABEL: test_mm_shuffle_epi32:
2747 ; X64:       # BB#0:
2748 ; X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2749 ; X64-NEXT:    retq
2750   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
2751   %res = shufflevector <4 x i32> %arg0, <4 x i32> undef, <4 x i32> zeroinitializer
2752   %bc = bitcast <4 x i32> %res to <2 x i64>
2753   ret <2 x i64> %bc
2754 }
2755
2756 define <2 x double> @test_mm_shuffle_pd(<2 x double> %a0, <2 x double> %a1) {
2757 ; X32-LABEL: test_mm_shuffle_pd:
2758 ; X32:       # BB#0:
2759 ; X32-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
2760 ; X32-NEXT:    retl
2761 ;
2762 ; X64-LABEL: test_mm_shuffle_pd:
2763 ; X64:       # BB#0:
2764 ; X64-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
2765 ; X64-NEXT:    retq
2766   %res = shufflevector <2 x double> %a0, <2 x double> %a1, <2 x i32> <i32 1, i32 2>
2767   ret <2 x double> %res
2768 }
2769
2770 define <2 x i64> @test_mm_shufflehi_epi16(<2 x i64> %a0) {
2771 ; X32-LABEL: test_mm_shufflehi_epi16:
2772 ; X32:       # BB#0:
2773 ; X32-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
2774 ; X32-NEXT:    retl
2775 ;
2776 ; X64-LABEL: test_mm_shufflehi_epi16:
2777 ; X64:       # BB#0:
2778 ; X64-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
2779 ; X64-NEXT:    retq
2780   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
2781   %res = shufflevector <8 x i16> %arg0, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 4, i32 4, i32 4>
2782   %bc = bitcast <8 x i16> %res to <2 x i64>
2783   ret <2 x i64> %bc
2784 }
2785
2786 define <2 x i64> @test_mm_shufflelo_epi16(<2 x i64> %a0) {
2787 ; X32-LABEL: test_mm_shufflelo_epi16:
2788 ; X32:       # BB#0:
2789 ; X32-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2790 ; X32-NEXT:    retl
2791 ;
2792 ; X64-LABEL: test_mm_shufflelo_epi16:
2793 ; X64:       # BB#0:
2794 ; X64-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2795 ; X64-NEXT:    retq
2796   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
2797   %res = shufflevector <8 x i16> %arg0, <8 x i16> undef, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 4, i32 5, i32 6, i32 7>
2798   %bc = bitcast <8 x i16> %res to <2 x i64>
2799   ret <2 x i64> %bc
2800 }
2801
2802 define <2 x i64> @test_mm_sll_epi16(<2 x i64> %a0, <2 x i64> %a1) {
2803 ; X32-LABEL: test_mm_sll_epi16:
2804 ; X32:       # BB#0:
2805 ; X32-NEXT:    psllw %xmm1, %xmm0
2806 ; X32-NEXT:    retl
2807 ;
2808 ; X64-LABEL: test_mm_sll_epi16:
2809 ; X64:       # BB#0:
2810 ; X64-NEXT:    psllw %xmm1, %xmm0
2811 ; X64-NEXT:    retq
2812   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
2813   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
2814   %res = call <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16> %arg0, <8 x i16> %arg1)
2815   %bc = bitcast <8 x i16> %res to <2 x i64>
2816   ret <2 x i64> %bc
2817 }
2818 declare <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16>, <8 x i16>) nounwind readnone
2819
2820 define <2 x i64> @test_mm_sll_epi32(<2 x i64> %a0, <2 x i64> %a1) {
2821 ; X32-LABEL: test_mm_sll_epi32:
2822 ; X32:       # BB#0:
2823 ; X32-NEXT:    pslld %xmm1, %xmm0
2824 ; X32-NEXT:    retl
2825 ;
2826 ; X64-LABEL: test_mm_sll_epi32:
2827 ; X64:       # BB#0:
2828 ; X64-NEXT:    pslld %xmm1, %xmm0
2829 ; X64-NEXT:    retq
2830   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
2831   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
2832   %res = call <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32> %arg0, <4 x i32> %arg1)
2833   %bc = bitcast <4 x i32> %res to <2 x i64>
2834   ret <2 x i64> %bc
2835 }
2836 declare <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32>, <4 x i32>) nounwind readnone
2837
2838 define <2 x i64> @test_mm_sll_epi64(<2 x i64> %a0, <2 x i64> %a1) {
2839 ; X32-LABEL: test_mm_sll_epi64:
2840 ; X32:       # BB#0:
2841 ; X32-NEXT:    psllq %xmm1, %xmm0
2842 ; X32-NEXT:    retl
2843 ;
2844 ; X64-LABEL: test_mm_sll_epi64:
2845 ; X64:       # BB#0:
2846 ; X64-NEXT:    psllq %xmm1, %xmm0
2847 ; X64-NEXT:    retq
2848   %res = call <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64> %a0, <2 x i64> %a1)
2849   ret <2 x i64> %res
2850 }
2851 declare <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64>, <2 x i64>) nounwind readnone
2852
2853 define <2 x i64> @test_mm_slli_epi16(<2 x i64> %a0) {
2854 ; X32-LABEL: test_mm_slli_epi16:
2855 ; X32:       # BB#0:
2856 ; X32-NEXT:    psllw $1, %xmm0
2857 ; X32-NEXT:    retl
2858 ;
2859 ; X64-LABEL: test_mm_slli_epi16:
2860 ; X64:       # BB#0:
2861 ; X64-NEXT:    psllw $1, %xmm0
2862 ; X64-NEXT:    retq
2863   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
2864   %res = call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %arg0, i32 1)
2865   %bc = bitcast <8 x i16> %res to <2 x i64>
2866   ret <2 x i64> %bc
2867 }
2868 declare <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16>, i32) nounwind readnone
2869
2870 define <2 x i64> @test_mm_slli_epi32(<2 x i64> %a0) {
2871 ; X32-LABEL: test_mm_slli_epi32:
2872 ; X32:       # BB#0:
2873 ; X32-NEXT:    pslld $1, %xmm0
2874 ; X32-NEXT:    retl
2875 ;
2876 ; X64-LABEL: test_mm_slli_epi32:
2877 ; X64:       # BB#0:
2878 ; X64-NEXT:    pslld $1, %xmm0
2879 ; X64-NEXT:    retq
2880   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
2881   %res = call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %arg0, i32 1)
2882   %bc = bitcast <4 x i32> %res to <2 x i64>
2883   ret <2 x i64> %bc
2884 }
2885 declare <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32>, i32) nounwind readnone
2886
2887 define <2 x i64> @test_mm_slli_epi64(<2 x i64> %a0) {
2888 ; X32-LABEL: test_mm_slli_epi64:
2889 ; X32:       # BB#0:
2890 ; X32-NEXT:    psllq $1, %xmm0
2891 ; X32-NEXT:    retl
2892 ;
2893 ; X64-LABEL: test_mm_slli_epi64:
2894 ; X64:       # BB#0:
2895 ; X64-NEXT:    psllq $1, %xmm0
2896 ; X64-NEXT:    retq
2897   %res = call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %a0, i32 1)
2898   ret <2 x i64> %res
2899 }
2900 declare <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64>, i32) nounwind readnone
2901
2902 define <2 x i64> @test_mm_slli_si128(<2 x i64> %a0) nounwind {
2903 ; X32-LABEL: test_mm_slli_si128:
2904 ; X32:       # BB#0:
2905 ; X32-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10]
2906 ; X32-NEXT:    retl
2907 ;
2908 ; X64-LABEL: test_mm_slli_si128:
2909 ; X64:       # BB#0:
2910 ; X64-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10]
2911 ; X64-NEXT:    retq
2912   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
2913   %res = shufflevector <16 x i8> zeroinitializer, <16 x i8> %arg0, <16 x i32> <i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26>
2914   %bc = bitcast <16 x i8> %res to <2 x i64>
2915   ret <2 x i64> %bc
2916 }
2917
2918 define <2 x double> @test_mm_sqrt_pd(<2 x double> %a0) nounwind {
2919 ; X32-LABEL: test_mm_sqrt_pd:
2920 ; X32:       # BB#0:
2921 ; X32-NEXT:    sqrtpd %xmm0, %xmm0
2922 ; X32-NEXT:    retl
2923 ;
2924 ; X64-LABEL: test_mm_sqrt_pd:
2925 ; X64:       # BB#0:
2926 ; X64-NEXT:    sqrtpd %xmm0, %xmm0
2927 ; X64-NEXT:    retq
2928   %res = call <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double> %a0)
2929   ret <2 x double> %res
2930 }
2931 declare <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double>) nounwind readnone
2932
2933 define <2 x double> @test_mm_sqrt_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
2934 ; X32-LABEL: test_mm_sqrt_sd:
2935 ; X32:       # BB#0:
2936 ; X32-NEXT:    sqrtsd %xmm0, %xmm1
2937 ; X32-NEXT:    movaps %xmm1, %xmm0
2938 ; X32-NEXT:    retl
2939 ;
2940 ; X64-LABEL: test_mm_sqrt_sd:
2941 ; X64:       # BB#0:
2942 ; X64-NEXT:    sqrtsd %xmm0, %xmm1
2943 ; X64-NEXT:    movaps %xmm1, %xmm0
2944 ; X64-NEXT:    retq
2945   %call = call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %a0)
2946   %ext0 = extractelement <2 x double> %call, i32 0
2947   %ins0 = insertelement <2 x double> undef, double %ext0, i32 0
2948   %ext1 = extractelement <2 x double> %a1, i32 1
2949   %ins1 = insertelement <2 x double> %ins0, double %ext1, i32 1
2950   ret <2 x double> %ins1
2951 }
2952 declare <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double>) nounwind readnone
2953
2954 define <2 x i64> @test_mm_sra_epi16(<2 x i64> %a0, <2 x i64> %a1) {
2955 ; X32-LABEL: test_mm_sra_epi16:
2956 ; X32:       # BB#0:
2957 ; X32-NEXT:    psraw %xmm1, %xmm0
2958 ; X32-NEXT:    retl
2959 ;
2960 ; X64-LABEL: test_mm_sra_epi16:
2961 ; X64:       # BB#0:
2962 ; X64-NEXT:    psraw %xmm1, %xmm0
2963 ; X64-NEXT:    retq
2964   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
2965   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
2966   %res = call <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16> %arg0, <8 x i16> %arg1)
2967   %bc = bitcast <8 x i16> %res to <2 x i64>
2968   ret <2 x i64> %bc
2969 }
2970 declare <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16>, <8 x i16>) nounwind readnone
2971
2972 define <2 x i64> @test_mm_sra_epi32(<2 x i64> %a0, <2 x i64> %a1) {
2973 ; X32-LABEL: test_mm_sra_epi32:
2974 ; X32:       # BB#0:
2975 ; X32-NEXT:    psrad %xmm1, %xmm0
2976 ; X32-NEXT:    retl
2977 ;
2978 ; X64-LABEL: test_mm_sra_epi32:
2979 ; X64:       # BB#0:
2980 ; X64-NEXT:    psrad %xmm1, %xmm0
2981 ; X64-NEXT:    retq
2982   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
2983   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
2984   %res = call <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32> %arg0, <4 x i32> %arg1)
2985   %bc = bitcast <4 x i32> %res to <2 x i64>
2986   ret <2 x i64> %bc
2987 }
2988 declare <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32>, <4 x i32>) nounwind readnone
2989
2990 define <2 x i64> @test_mm_srai_epi16(<2 x i64> %a0) {
2991 ; X32-LABEL: test_mm_srai_epi16:
2992 ; X32:       # BB#0:
2993 ; X32-NEXT:    psraw $1, %xmm0
2994 ; X32-NEXT:    retl
2995 ;
2996 ; X64-LABEL: test_mm_srai_epi16:
2997 ; X64:       # BB#0:
2998 ; X64-NEXT:    psraw $1, %xmm0
2999 ; X64-NEXT:    retq
3000   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
3001   %res = call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> %arg0, i32 1)
3002   %bc = bitcast <8 x i16> %res to <2 x i64>
3003   ret <2 x i64> %bc
3004 }
3005 declare <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16>, i32) nounwind readnone
3006
3007 define <2 x i64> @test_mm_srai_epi32(<2 x i64> %a0) {
3008 ; X32-LABEL: test_mm_srai_epi32:
3009 ; X32:       # BB#0:
3010 ; X32-NEXT:    psrad $1, %xmm0
3011 ; X32-NEXT:    retl
3012 ;
3013 ; X64-LABEL: test_mm_srai_epi32:
3014 ; X64:       # BB#0:
3015 ; X64-NEXT:    psrad $1, %xmm0
3016 ; X64-NEXT:    retq
3017   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
3018   %res = call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> %arg0, i32 1)
3019   %bc = bitcast <4 x i32> %res to <2 x i64>
3020   ret <2 x i64> %bc
3021 }
3022 declare <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32>, i32) nounwind readnone
3023
3024 define <2 x i64> @test_mm_srl_epi16(<2 x i64> %a0, <2 x i64> %a1) {
3025 ; X32-LABEL: test_mm_srl_epi16:
3026 ; X32:       # BB#0:
3027 ; X32-NEXT:    psrlw %xmm1, %xmm0
3028 ; X32-NEXT:    retl
3029 ;
3030 ; X64-LABEL: test_mm_srl_epi16:
3031 ; X64:       # BB#0:
3032 ; X64-NEXT:    psrlw %xmm1, %xmm0
3033 ; X64-NEXT:    retq
3034   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
3035   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
3036   %res = call <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16> %arg0, <8 x i16> %arg1)
3037   %bc = bitcast <8 x i16> %res to <2 x i64>
3038   ret <2 x i64> %bc
3039 }
3040 declare <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16>, <8 x i16>) nounwind readnone
3041
3042 define <2 x i64> @test_mm_srl_epi32(<2 x i64> %a0, <2 x i64> %a1) {
3043 ; X32-LABEL: test_mm_srl_epi32:
3044 ; X32:       # BB#0:
3045 ; X32-NEXT:    psrld %xmm1, %xmm0
3046 ; X32-NEXT:    retl
3047 ;
3048 ; X64-LABEL: test_mm_srl_epi32:
3049 ; X64:       # BB#0:
3050 ; X64-NEXT:    psrld %xmm1, %xmm0
3051 ; X64-NEXT:    retq
3052   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
3053   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
3054   %res = call <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32> %arg0, <4 x i32> %arg1)
3055   %bc = bitcast <4 x i32> %res to <2 x i64>
3056   ret <2 x i64> %bc
3057 }
3058 declare <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32>, <4 x i32>) nounwind readnone
3059
3060 define <2 x i64> @test_mm_srl_epi64(<2 x i64> %a0, <2 x i64> %a1) {
3061 ; X32-LABEL: test_mm_srl_epi64:
3062 ; X32:       # BB#0:
3063 ; X32-NEXT:    psrlq %xmm1, %xmm0
3064 ; X32-NEXT:    retl
3065 ;
3066 ; X64-LABEL: test_mm_srl_epi64:
3067 ; X64:       # BB#0:
3068 ; X64-NEXT:    psrlq %xmm1, %xmm0
3069 ; X64-NEXT:    retq
3070   %res = call <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64> %a0, <2 x i64> %a1)
3071   ret <2 x i64> %res
3072 }
3073 declare <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64>, <2 x i64>) nounwind readnone
3074
3075 define <2 x i64> @test_mm_srli_epi16(<2 x i64> %a0) {
3076 ; X32-LABEL: test_mm_srli_epi16:
3077 ; X32:       # BB#0:
3078 ; X32-NEXT:    psrlw $1, %xmm0
3079 ; X32-NEXT:    retl
3080 ;
3081 ; X64-LABEL: test_mm_srli_epi16:
3082 ; X64:       # BB#0:
3083 ; X64-NEXT:    psrlw $1, %xmm0
3084 ; X64-NEXT:    retq
3085   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
3086   %res = call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %arg0, i32 1)
3087   %bc = bitcast <8 x i16> %res to <2 x i64>
3088   ret <2 x i64> %bc
3089 }
3090 declare <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16>, i32) nounwind readnone
3091
3092 define <2 x i64> @test_mm_srli_epi32(<2 x i64> %a0) {
3093 ; X32-LABEL: test_mm_srli_epi32:
3094 ; X32:       # BB#0:
3095 ; X32-NEXT:    psrld $1, %xmm0
3096 ; X32-NEXT:    retl
3097 ;
3098 ; X64-LABEL: test_mm_srli_epi32:
3099 ; X64:       # BB#0:
3100 ; X64-NEXT:    psrld $1, %xmm0
3101 ; X64-NEXT:    retq
3102   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
3103   %res = call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %arg0, i32 1)
3104   %bc = bitcast <4 x i32> %res to <2 x i64>
3105   ret <2 x i64> %bc
3106 }
3107 declare <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32>, i32) nounwind readnone
3108
3109 define <2 x i64> @test_mm_srli_epi64(<2 x i64> %a0) {
3110 ; X32-LABEL: test_mm_srli_epi64:
3111 ; X32:       # BB#0:
3112 ; X32-NEXT:    psrlq $1, %xmm0
3113 ; X32-NEXT:    retl
3114 ;
3115 ; X64-LABEL: test_mm_srli_epi64:
3116 ; X64:       # BB#0:
3117 ; X64-NEXT:    psrlq $1, %xmm0
3118 ; X64-NEXT:    retq
3119   %res = call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %a0, i32 1)
3120   ret <2 x i64> %res
3121 }
3122 declare <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64>, i32) nounwind readnone
3123
3124 define <2 x i64> @test_mm_srli_si128(<2 x i64> %a0) nounwind {
3125 ; X32-LABEL: test_mm_srli_si128:
3126 ; X32:       # BB#0:
3127 ; X32-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero
3128 ; X32-NEXT:    retl
3129 ;
3130 ; X64-LABEL: test_mm_srli_si128:
3131 ; X64:       # BB#0:
3132 ; X64-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero
3133 ; X64-NEXT:    retq
3134   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
3135   %res = shufflevector <16 x i8> %arg0, <16 x i8> zeroinitializer, <16 x i32> <i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20>
3136   %bc = bitcast <16 x i8> %res to <2 x i64>
3137   ret <2 x i64> %bc
3138 }
3139
3140 define void @test_mm_store_pd(double *%a0, <2 x double> %a1) {
3141 ; X32-LABEL: test_mm_store_pd:
3142 ; X32:       # BB#0:
3143 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3144 ; X32-NEXT:    movaps %xmm0, (%eax)
3145 ; X32-NEXT:    retl
3146 ;
3147 ; X64-LABEL: test_mm_store_pd:
3148 ; X64:       # BB#0:
3149 ; X64-NEXT:    movaps %xmm0, (%rdi)
3150 ; X64-NEXT:    retq
3151   %arg0 = bitcast double* %a0 to <2 x double>*
3152   store <2 x double> %a1, <2 x double>* %arg0, align 16
3153   ret void
3154 }
3155
3156 define void @test_mm_store_pd1(double *%a0, <2 x double> %a1) {
3157 ; X32-LABEL: test_mm_store_pd1:
3158 ; X32:       # BB#0:
3159 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3160 ; X32-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
3161 ; X32-NEXT:    movaps %xmm0, (%eax)
3162 ; X32-NEXT:    retl
3163 ;
3164 ; X64-LABEL: test_mm_store_pd1:
3165 ; X64:       # BB#0:
3166 ; X64-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
3167 ; X64-NEXT:    movaps %xmm0, (%rdi)
3168 ; X64-NEXT:    retq
3169   %arg0 = bitcast double * %a0 to <2 x double>*
3170   %shuf = shufflevector <2 x double> %a1, <2 x double> undef, <2 x i32> zeroinitializer
3171   store <2 x double> %shuf, <2 x double>* %arg0, align 16
3172   ret void
3173 }
3174
3175 define void @test_mm_store_sd(double *%a0, <2 x double> %a1) {
3176 ; X32-LABEL: test_mm_store_sd:
3177 ; X32:       # BB#0:
3178 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3179 ; X32-NEXT:    movsd %xmm0, (%eax)
3180 ; X32-NEXT:    retl
3181 ;
3182 ; X64-LABEL: test_mm_store_sd:
3183 ; X64:       # BB#0:
3184 ; X64-NEXT:    movsd %xmm0, (%rdi)
3185 ; X64-NEXT:    retq
3186   %ext = extractelement <2 x double> %a1, i32 0
3187   store double %ext, double* %a0, align 1
3188   ret void
3189 }
3190
3191 define void @test_mm_store_si128(<2 x i64> *%a0, <2 x i64> %a1) {
3192 ; X32-LABEL: test_mm_store_si128:
3193 ; X32:       # BB#0:
3194 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3195 ; X32-NEXT:    movaps %xmm0, (%eax)
3196 ; X32-NEXT:    retl
3197 ;
3198 ; X64-LABEL: test_mm_store_si128:
3199 ; X64:       # BB#0:
3200 ; X64-NEXT:    movaps %xmm0, (%rdi)
3201 ; X64-NEXT:    retq
3202   store <2 x i64> %a1, <2 x i64>* %a0, align 16
3203   ret void
3204 }
3205
3206 define void @test_mm_store1_pd(double *%a0, <2 x double> %a1) {
3207 ; X32-LABEL: test_mm_store1_pd:
3208 ; X32:       # BB#0:
3209 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3210 ; X32-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
3211 ; X32-NEXT:    movaps %xmm0, (%eax)
3212 ; X32-NEXT:    retl
3213 ;
3214 ; X64-LABEL: test_mm_store1_pd:
3215 ; X64:       # BB#0:
3216 ; X64-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
3217 ; X64-NEXT:    movaps %xmm0, (%rdi)
3218 ; X64-NEXT:    retq
3219   %arg0 = bitcast double * %a0 to <2 x double>*
3220   %shuf = shufflevector <2 x double> %a1, <2 x double> undef, <2 x i32> zeroinitializer
3221   store <2 x double> %shuf, <2 x double>* %arg0, align 16
3222   ret void
3223 }
3224
3225 define void @test_mm_storeh_sd(double *%a0, <2 x double> %a1) {
3226 ; X32-LABEL: test_mm_storeh_sd:
3227 ; X32:       # BB#0:
3228 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3229 ; X32-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
3230 ; X32-NEXT:    movsd %xmm0, (%eax)
3231 ; X32-NEXT:    retl
3232 ;
3233 ; X64-LABEL: test_mm_storeh_sd:
3234 ; X64:       # BB#0:
3235 ; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
3236 ; X64-NEXT:    movsd %xmm0, (%rdi)
3237 ; X64-NEXT:    retq
3238   %ext = extractelement <2 x double> %a1, i32 1
3239   store double %ext, double* %a0, align 8
3240   ret void
3241 }
3242
3243 define void @test_mm_storel_epi64(<2 x i64> *%a0, <2 x i64> %a1) {
3244 ; X32-LABEL: test_mm_storel_epi64:
3245 ; X32:       # BB#0:
3246 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3247 ; X32-NEXT:    movlps %xmm0, (%eax)
3248 ; X32-NEXT:    retl
3249 ;
3250 ; X64-LABEL: test_mm_storel_epi64:
3251 ; X64:       # BB#0:
3252 ; X64-NEXT:    movd %xmm0, %rax
3253 ; X64-NEXT:    movq %rax, (%rdi)
3254 ; X64-NEXT:    retq
3255   %ext = extractelement <2 x i64> %a1, i32 0
3256   %bc = bitcast <2 x i64> *%a0 to i64*
3257   store i64 %ext, i64* %bc, align 8
3258   ret void
3259 }
3260
3261 define void @test_mm_storel_sd(double *%a0, <2 x double> %a1) {
3262 ; X32-LABEL: test_mm_storel_sd:
3263 ; X32:       # BB#0:
3264 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3265 ; X32-NEXT:    movsd %xmm0, (%eax)
3266 ; X32-NEXT:    retl
3267 ;
3268 ; X64-LABEL: test_mm_storel_sd:
3269 ; X64:       # BB#0:
3270 ; X64-NEXT:    movsd %xmm0, (%rdi)
3271 ; X64-NEXT:    retq
3272   %ext = extractelement <2 x double> %a1, i32 0
3273   store double %ext, double* %a0, align 8
3274   ret void
3275 }
3276
3277 define void @test_mm_storer_pd(double *%a0, <2 x double> %a1) {
3278 ; X32-LABEL: test_mm_storer_pd:
3279 ; X32:       # BB#0:
3280 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3281 ; X32-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
3282 ; X32-NEXT:    movapd %xmm0, (%eax)
3283 ; X32-NEXT:    retl
3284 ;
3285 ; X64-LABEL: test_mm_storer_pd:
3286 ; X64:       # BB#0:
3287 ; X64-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
3288 ; X64-NEXT:    movapd %xmm0, (%rdi)
3289 ; X64-NEXT:    retq
3290   %arg0 = bitcast double* %a0 to <2 x double>*
3291   %shuf = shufflevector <2 x double> %a1, <2 x double> undef, <2 x i32> <i32 1, i32 0>
3292   store <2 x double> %shuf, <2 x double>* %arg0, align 16
3293   ret void
3294 }
3295
3296 define void @test_mm_storeu_pd(double *%a0, <2 x double> %a1) {
3297 ; X32-LABEL: test_mm_storeu_pd:
3298 ; X32:       # BB#0:
3299 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3300 ; X32-NEXT:    movups %xmm0, (%eax)
3301 ; X32-NEXT:    retl
3302 ;
3303 ; X64-LABEL: test_mm_storeu_pd:
3304 ; X64:       # BB#0:
3305 ; X64-NEXT:    movups %xmm0, (%rdi)
3306 ; X64-NEXT:    retq
3307   %arg0 = bitcast double* %a0 to <2 x double>*
3308   store <2 x double> %a1, <2 x double>* %arg0, align 1
3309   ret void
3310 }
3311
3312 define void @test_mm_storeu_si128(<2 x i64> *%a0, <2 x i64> %a1) {
3313 ; X32-LABEL: test_mm_storeu_si128:
3314 ; X32:       # BB#0:
3315 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3316 ; X32-NEXT:    movups %xmm0, (%eax)
3317 ; X32-NEXT:    retl
3318 ;
3319 ; X64-LABEL: test_mm_storeu_si128:
3320 ; X64:       # BB#0:
3321 ; X64-NEXT:    movups %xmm0, (%rdi)
3322 ; X64-NEXT:    retq
3323   store <2 x i64> %a1, <2 x i64>* %a0, align 1
3324   ret void
3325 }
3326
3327 define void @test_mm_stream_pd(double *%a0, <2 x double> %a1) {
3328 ; X32-LABEL: test_mm_stream_pd:
3329 ; X32:       # BB#0:
3330 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3331 ; X32-NEXT:    movntps %xmm0, (%eax)
3332 ; X32-NEXT:    retl
3333 ;
3334 ; X64-LABEL: test_mm_stream_pd:
3335 ; X64:       # BB#0:
3336 ; X64-NEXT:    movntps %xmm0, (%rdi)
3337 ; X64-NEXT:    retq
3338   %arg0 = bitcast double* %a0 to <2 x double>*
3339   store <2 x double> %a1, <2 x double>* %arg0, align 16, !nontemporal !0
3340   ret void
3341 }
3342
3343 define void @test_mm_stream_si32(i32 *%a0, i32 %a1) {
3344 ; X32-LABEL: test_mm_stream_si32:
3345 ; X32:       # BB#0:
3346 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3347 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
3348 ; X32-NEXT:    movntil %eax, (%ecx)
3349 ; X32-NEXT:    retl
3350 ;
3351 ; X64-LABEL: test_mm_stream_si32:
3352 ; X64:       # BB#0:
3353 ; X64-NEXT:    movntil %esi, (%rdi)
3354 ; X64-NEXT:    retq
3355   store i32 %a1, i32* %a0, align 1, !nontemporal !0
3356   ret void
3357 }
3358
3359 define void @test_mm_stream_si128(<2 x i64> *%a0, <2 x i64> %a1) {
3360 ; X32-LABEL: test_mm_stream_si128:
3361 ; X32:       # BB#0:
3362 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
3363 ; X32-NEXT:    movntps %xmm0, (%eax)
3364 ; X32-NEXT:    retl
3365 ;
3366 ; X64-LABEL: test_mm_stream_si128:
3367 ; X64:       # BB#0:
3368 ; X64-NEXT:    movntps %xmm0, (%rdi)
3369 ; X64-NEXT:    retq
3370   store <2 x i64> %a1, <2 x i64>* %a0, align 16, !nontemporal !0
3371   ret void
3372 }
3373
3374 define <2 x i64> @test_mm_sub_epi8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
3375 ; X32-LABEL: test_mm_sub_epi8:
3376 ; X32:       # BB#0:
3377 ; X32-NEXT:    psubb %xmm1, %xmm0
3378 ; X32-NEXT:    retl
3379 ;
3380 ; X64-LABEL: test_mm_sub_epi8:
3381 ; X64:       # BB#0:
3382 ; X64-NEXT:    psubb %xmm1, %xmm0
3383 ; X64-NEXT:    retq
3384   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
3385   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
3386   %res = sub <16 x i8> %arg0, %arg1
3387   %bc = bitcast <16 x i8> %res to <2 x i64>
3388   ret <2 x i64> %bc
3389 }
3390
3391 define <2 x i64> @test_mm_sub_epi16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
3392 ; X32-LABEL: test_mm_sub_epi16:
3393 ; X32:       # BB#0:
3394 ; X32-NEXT:    psubw %xmm1, %xmm0
3395 ; X32-NEXT:    retl
3396 ;
3397 ; X64-LABEL: test_mm_sub_epi16:
3398 ; X64:       # BB#0:
3399 ; X64-NEXT:    psubw %xmm1, %xmm0
3400 ; X64-NEXT:    retq
3401   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
3402   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
3403   %res = sub <8 x i16> %arg0, %arg1
3404   %bc = bitcast <8 x i16> %res to <2 x i64>
3405   ret <2 x i64> %bc
3406 }
3407
3408 define <2 x i64> @test_mm_sub_epi32(<2 x i64> %a0, <2 x i64> %a1) nounwind {
3409 ; X32-LABEL: test_mm_sub_epi32:
3410 ; X32:       # BB#0:
3411 ; X32-NEXT:    psubd %xmm1, %xmm0
3412 ; X32-NEXT:    retl
3413 ;
3414 ; X64-LABEL: test_mm_sub_epi32:
3415 ; X64:       # BB#0:
3416 ; X64-NEXT:    psubd %xmm1, %xmm0
3417 ; X64-NEXT:    retq
3418   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
3419   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
3420   %res = sub <4 x i32> %arg0, %arg1
3421   %bc = bitcast <4 x i32> %res to <2 x i64>
3422   ret <2 x i64> %bc
3423 }
3424
3425 define <2 x i64> @test_mm_sub_epi64(<2 x i64> %a0, <2 x i64> %a1) nounwind {
3426 ; X32-LABEL: test_mm_sub_epi64:
3427 ; X32:       # BB#0:
3428 ; X32-NEXT:    psubq %xmm1, %xmm0
3429 ; X32-NEXT:    retl
3430 ;
3431 ; X64-LABEL: test_mm_sub_epi64:
3432 ; X64:       # BB#0:
3433 ; X64-NEXT:    psubq %xmm1, %xmm0
3434 ; X64-NEXT:    retq
3435   %res = sub <2 x i64> %a0, %a1
3436   ret <2 x i64> %res
3437 }
3438
3439 define <2 x double> @test_mm_sub_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
3440 ; X32-LABEL: test_mm_sub_pd:
3441 ; X32:       # BB#0:
3442 ; X32-NEXT:    subpd %xmm1, %xmm0
3443 ; X32-NEXT:    retl
3444 ;
3445 ; X64-LABEL: test_mm_sub_pd:
3446 ; X64:       # BB#0:
3447 ; X64-NEXT:    subpd %xmm1, %xmm0
3448 ; X64-NEXT:    retq
3449   %res = fsub <2 x double> %a0, %a1
3450   ret <2 x double> %res
3451 }
3452
3453 define <2 x double> @test_mm_sub_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
3454 ; X32-LABEL: test_mm_sub_sd:
3455 ; X32:       # BB#0:
3456 ; X32-NEXT:    subsd %xmm1, %xmm0
3457 ; X32-NEXT:    retl
3458 ;
3459 ; X64-LABEL: test_mm_sub_sd:
3460 ; X64:       # BB#0:
3461 ; X64-NEXT:    subsd %xmm1, %xmm0
3462 ; X64-NEXT:    retq
3463   %ext0 = extractelement <2 x double> %a0, i32 0
3464   %ext1 = extractelement <2 x double> %a1, i32 0
3465   %fsub = fsub double %ext0, %ext1
3466   %res = insertelement <2 x double> %a0, double %fsub, i32 0
3467   ret <2 x double> %res
3468 }
3469
3470 define <2 x i64> @test_mm_subs_epi8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
3471 ; X32-LABEL: test_mm_subs_epi8:
3472 ; X32:       # BB#0:
3473 ; X32-NEXT:    psubsb %xmm1, %xmm0
3474 ; X32-NEXT:    retl
3475 ;
3476 ; X64-LABEL: test_mm_subs_epi8:
3477 ; X64:       # BB#0:
3478 ; X64-NEXT:    psubsb %xmm1, %xmm0
3479 ; X64-NEXT:    retq
3480   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
3481   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
3482   %res = call <16 x i8> @llvm.x86.sse2.psubs.b(<16 x i8> %arg0, <16 x i8> %arg1)
3483   %bc = bitcast <16 x i8> %res to <2 x i64>
3484   ret <2 x i64> %bc
3485 }
3486 declare <16 x i8> @llvm.x86.sse2.psubs.b(<16 x i8>, <16 x i8>) nounwind readnone
3487
3488 define <2 x i64> @test_mm_subs_epi16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
3489 ; X32-LABEL: test_mm_subs_epi16:
3490 ; X32:       # BB#0:
3491 ; X32-NEXT:    psubsw %xmm1, %xmm0
3492 ; X32-NEXT:    retl
3493 ;
3494 ; X64-LABEL: test_mm_subs_epi16:
3495 ; X64:       # BB#0:
3496 ; X64-NEXT:    psubsw %xmm1, %xmm0
3497 ; X64-NEXT:    retq
3498   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
3499   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
3500   %res = call <8 x i16> @llvm.x86.sse2.psubs.w(<8 x i16> %arg0, <8 x i16> %arg1)
3501   %bc = bitcast <8 x i16> %res to <2 x i64>
3502   ret <2 x i64> %bc
3503 }
3504 declare <8 x i16> @llvm.x86.sse2.psubs.w(<8 x i16>, <8 x i16>) nounwind readnone
3505
3506 define <2 x i64> @test_mm_subs_epu8(<2 x i64> %a0, <2 x i64> %a1) nounwind {
3507 ; X32-LABEL: test_mm_subs_epu8:
3508 ; X32:       # BB#0:
3509 ; X32-NEXT:    psubusb %xmm1, %xmm0
3510 ; X32-NEXT:    retl
3511 ;
3512 ; X64-LABEL: test_mm_subs_epu8:
3513 ; X64:       # BB#0:
3514 ; X64-NEXT:    psubusb %xmm1, %xmm0
3515 ; X64-NEXT:    retq
3516   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
3517   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
3518   %res = call <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8> %arg0, <16 x i8> %arg1)
3519   %bc = bitcast <16 x i8> %res to <2 x i64>
3520   ret <2 x i64> %bc
3521 }
3522 declare <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8>, <16 x i8>) nounwind readnone
3523
3524 define <2 x i64> @test_mm_subs_epu16(<2 x i64> %a0, <2 x i64> %a1) nounwind {
3525 ; X32-LABEL: test_mm_subs_epu16:
3526 ; X32:       # BB#0:
3527 ; X32-NEXT:    psubusw %xmm1, %xmm0
3528 ; X32-NEXT:    retl
3529 ;
3530 ; X64-LABEL: test_mm_subs_epu16:
3531 ; X64:       # BB#0:
3532 ; X64-NEXT:    psubusw %xmm1, %xmm0
3533 ; X64-NEXT:    retq
3534   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
3535   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
3536   %res = call <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16> %arg0, <8 x i16> %arg1)
3537   %bc = bitcast <8 x i16> %res to <2 x i64>
3538   ret <2 x i64> %bc
3539 }
3540 declare <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16>, <8 x i16>) nounwind readnone
3541
3542 define i32 @test_mm_ucomieq_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
3543 ; X32-LABEL: test_mm_ucomieq_sd:
3544 ; X32:       # BB#0:
3545 ; X32-NEXT:    ucomisd %xmm1, %xmm0
3546 ; X32-NEXT:    setnp %al
3547 ; X32-NEXT:    sete %cl
3548 ; X32-NEXT:    andb %al, %cl
3549 ; X32-NEXT:    movzbl %cl, %eax
3550 ; X32-NEXT:    retl
3551 ;
3552 ; X64-LABEL: test_mm_ucomieq_sd:
3553 ; X64:       # BB#0:
3554 ; X64-NEXT:    ucomisd %xmm1, %xmm0
3555 ; X64-NEXT:    setnp %al
3556 ; X64-NEXT:    sete %cl
3557 ; X64-NEXT:    andb %al, %cl
3558 ; X64-NEXT:    movzbl %cl, %eax
3559 ; X64-NEXT:    retq
3560   %res = call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %a0, <2 x double> %a1)
3561   ret i32 %res
3562 }
3563 declare i32 @llvm.x86.sse2.ucomieq.sd(<2 x double>, <2 x double>) nounwind readnone
3564
3565 define i32 @test_mm_ucomige_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
3566 ; X32-LABEL: test_mm_ucomige_sd:
3567 ; X32:       # BB#0:
3568 ; X32-NEXT:    xorl %eax, %eax
3569 ; X32-NEXT:    ucomisd %xmm1, %xmm0
3570 ; X32-NEXT:    setae %al
3571 ; X32-NEXT:    retl
3572 ;
3573 ; X64-LABEL: test_mm_ucomige_sd:
3574 ; X64:       # BB#0:
3575 ; X64-NEXT:    xorl %eax, %eax
3576 ; X64-NEXT:    ucomisd %xmm1, %xmm0
3577 ; X64-NEXT:    setae %al
3578 ; X64-NEXT:    retq
3579   %res = call i32 @llvm.x86.sse2.ucomige.sd(<2 x double> %a0, <2 x double> %a1)
3580   ret i32 %res
3581 }
3582 declare i32 @llvm.x86.sse2.ucomige.sd(<2 x double>, <2 x double>) nounwind readnone
3583
3584 define i32 @test_mm_ucomigt_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
3585 ; X32-LABEL: test_mm_ucomigt_sd:
3586 ; X32:       # BB#0:
3587 ; X32-NEXT:    xorl %eax, %eax
3588 ; X32-NEXT:    ucomisd %xmm1, %xmm0
3589 ; X32-NEXT:    seta %al
3590 ; X32-NEXT:    retl
3591 ;
3592 ; X64-LABEL: test_mm_ucomigt_sd:
3593 ; X64:       # BB#0:
3594 ; X64-NEXT:    xorl %eax, %eax
3595 ; X64-NEXT:    ucomisd %xmm1, %xmm0
3596 ; X64-NEXT:    seta %al
3597 ; X64-NEXT:    retq
3598   %res = call i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> %a0, <2 x double> %a1)
3599   ret i32 %res
3600 }
3601 declare i32 @llvm.x86.sse2.ucomigt.sd(<2 x double>, <2 x double>) nounwind readnone
3602
3603 define i32 @test_mm_ucomile_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
3604 ; X32-LABEL: test_mm_ucomile_sd:
3605 ; X32:       # BB#0:
3606 ; X32-NEXT:    xorl %eax, %eax
3607 ; X32-NEXT:    ucomisd %xmm0, %xmm1
3608 ; X32-NEXT:    setae %al
3609 ; X32-NEXT:    retl
3610 ;
3611 ; X64-LABEL: test_mm_ucomile_sd:
3612 ; X64:       # BB#0:
3613 ; X64-NEXT:    xorl %eax, %eax
3614 ; X64-NEXT:    ucomisd %xmm0, %xmm1
3615 ; X64-NEXT:    setae %al
3616 ; X64-NEXT:    retq
3617   %res = call i32 @llvm.x86.sse2.ucomile.sd(<2 x double> %a0, <2 x double> %a1)
3618   ret i32 %res
3619 }
3620 declare i32 @llvm.x86.sse2.ucomile.sd(<2 x double>, <2 x double>) nounwind readnone
3621
3622 define i32 @test_mm_ucomilt_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
3623 ; X32-LABEL: test_mm_ucomilt_sd:
3624 ; X32:       # BB#0:
3625 ; X32-NEXT:    xorl %eax, %eax
3626 ; X32-NEXT:    ucomisd %xmm0, %xmm1
3627 ; X32-NEXT:    seta %al
3628 ; X32-NEXT:    retl
3629 ;
3630 ; X64-LABEL: test_mm_ucomilt_sd:
3631 ; X64:       # BB#0:
3632 ; X64-NEXT:    xorl %eax, %eax
3633 ; X64-NEXT:    ucomisd %xmm0, %xmm1
3634 ; X64-NEXT:    seta %al
3635 ; X64-NEXT:    retq
3636   %res = call i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> %a0, <2 x double> %a1)
3637   ret i32 %res
3638 }
3639 declare i32 @llvm.x86.sse2.ucomilt.sd(<2 x double>, <2 x double>) nounwind readnone
3640
3641 define i32 @test_mm_ucomineq_sd(<2 x double> %a0, <2 x double> %a1) nounwind {
3642 ; X32-LABEL: test_mm_ucomineq_sd:
3643 ; X32:       # BB#0:
3644 ; X32-NEXT:    ucomisd %xmm1, %xmm0
3645 ; X32-NEXT:    setp %al
3646 ; X32-NEXT:    setne %cl
3647 ; X32-NEXT:    orb %al, %cl
3648 ; X32-NEXT:    movzbl %cl, %eax
3649 ; X32-NEXT:    retl
3650 ;
3651 ; X64-LABEL: test_mm_ucomineq_sd:
3652 ; X64:       # BB#0:
3653 ; X64-NEXT:    ucomisd %xmm1, %xmm0
3654 ; X64-NEXT:    setp %al
3655 ; X64-NEXT:    setne %cl
3656 ; X64-NEXT:    orb %al, %cl
3657 ; X64-NEXT:    movzbl %cl, %eax
3658 ; X64-NEXT:    retq
3659   %res = call i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> %a0, <2 x double> %a1)
3660   ret i32 %res
3661 }
3662 declare i32 @llvm.x86.sse2.ucomineq.sd(<2 x double>, <2 x double>) nounwind readnone
3663
3664 define <2 x double> @test_mm_undefined_pd() {
3665 ; X32-LABEL: test_mm_undefined_pd:
3666 ; X32:       # BB#0:
3667 ; X32-NEXT:    retl
3668 ;
3669 ; X64-LABEL: test_mm_undefined_pd:
3670 ; X64:       # BB#0:
3671 ; X64-NEXT:    retq
3672   ret <2 x double> undef
3673 }
3674
3675 define <2 x i64> @test_mm_undefined_si128() {
3676 ; X32-LABEL: test_mm_undefined_si128:
3677 ; X32:       # BB#0:
3678 ; X32-NEXT:    retl
3679 ;
3680 ; X64-LABEL: test_mm_undefined_si128:
3681 ; X64:       # BB#0:
3682 ; X64-NEXT:    retq
3683   ret <2 x i64> undef
3684 }
3685
3686 define <2 x i64> @test_mm_unpackhi_epi8(<2 x i64> %a0, <2 x i64> %a1) {
3687 ; X32-LABEL: test_mm_unpackhi_epi8:
3688 ; X32:       # BB#0:
3689 ; X32-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
3690 ; X32-NEXT:    retl
3691 ;
3692 ; X64-LABEL: test_mm_unpackhi_epi8:
3693 ; X64:       # BB#0:
3694 ; X64-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
3695 ; X64-NEXT:    retq
3696   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
3697   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
3698   %res = shufflevector <16 x i8> %arg0, <16 x i8> %arg1, <16 x i32> <i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>
3699   %bc = bitcast <16 x i8> %res to <2 x i64>
3700   ret <2 x i64> %bc
3701 }
3702
3703 define <2 x i64> @test_mm_unpackhi_epi16(<2 x i64> %a0, <2 x i64> %a1) {
3704 ; X32-LABEL: test_mm_unpackhi_epi16:
3705 ; X32:       # BB#0:
3706 ; X32-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
3707 ; X32-NEXT:    retl
3708 ;
3709 ; X64-LABEL: test_mm_unpackhi_epi16:
3710 ; X64:       # BB#0:
3711 ; X64-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
3712 ; X64-NEXT:    retq
3713   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
3714   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
3715   %res = shufflevector <8 x i16> %arg0, <8 x i16> %arg1, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
3716   %bc = bitcast <8 x i16> %res to <2 x i64>
3717   ret <2 x i64> %bc
3718 }
3719
3720 define <2 x i64> @test_mm_unpackhi_epi32(<2 x i64> %a0, <2 x i64> %a1) {
3721 ; X32-LABEL: test_mm_unpackhi_epi32:
3722 ; X32:       # BB#0:
3723 ; X32-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3724 ; X32-NEXT:    retl
3725 ;
3726 ; X64-LABEL: test_mm_unpackhi_epi32:
3727 ; X64:       # BB#0:
3728 ; X64-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3729 ; X64-NEXT:    retq
3730   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
3731   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
3732   %res = shufflevector <4 x i32> %arg0,<4 x i32> %arg1, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
3733   %bc = bitcast <4 x i32> %res to <2 x i64>
3734   ret <2 x i64> %bc
3735 }
3736
3737 define <2 x i64> @test_mm_unpackhi_epi64(<2 x i64> %a0, <2 x i64> %a1) {
3738 ; X32-LABEL: test_mm_unpackhi_epi64:
3739 ; X32:       # BB#0:
3740 ; X32-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
3741 ; X32-NEXT:    retl
3742 ;
3743 ; X64-LABEL: test_mm_unpackhi_epi64:
3744 ; X64:       # BB#0:
3745 ; X64-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
3746 ; X64-NEXT:    retq
3747   %res = shufflevector <2 x i64> %a0, <2 x i64> %a1, <2 x i32> <i32 1, i32 3>
3748   ret <2 x i64> %res
3749 }
3750
3751 define <2 x double> @test_mm_unpackhi_pd(<2 x double> %a0, <2 x double> %a1) {
3752 ; X32-LABEL: test_mm_unpackhi_pd:
3753 ; X32:       # BB#0:
3754 ; X32-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
3755 ; X32-NEXT:    retl
3756 ;
3757 ; X64-LABEL: test_mm_unpackhi_pd:
3758 ; X64:       # BB#0:
3759 ; X64-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
3760 ; X64-NEXT:    retq
3761   %res = shufflevector <2 x double> %a0, <2 x double> %a1, <2 x i32> <i32 1, i32 3>
3762   ret <2 x double> %res
3763 }
3764
3765 define <2 x i64> @test_mm_unpacklo_epi8(<2 x i64> %a0, <2 x i64> %a1) {
3766 ; X32-LABEL: test_mm_unpacklo_epi8:
3767 ; X32:       # BB#0:
3768 ; X32-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
3769 ; X32-NEXT:    retl
3770 ;
3771 ; X64-LABEL: test_mm_unpacklo_epi8:
3772 ; X64:       # BB#0:
3773 ; X64-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
3774 ; X64-NEXT:    retq
3775   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
3776   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
3777   %res = shufflevector <16 x i8> %arg0, <16 x i8> %arg1, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23>
3778   %bc = bitcast <16 x i8> %res to <2 x i64>
3779   ret <2 x i64> %bc
3780 }
3781
3782 define <2 x i64> @test_mm_unpacklo_epi16(<2 x i64> %a0, <2 x i64> %a1) {
3783 ; X32-LABEL: test_mm_unpacklo_epi16:
3784 ; X32:       # BB#0:
3785 ; X32-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3786 ; X32-NEXT:    retl
3787 ;
3788 ; X64-LABEL: test_mm_unpacklo_epi16:
3789 ; X64:       # BB#0:
3790 ; X64-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3791 ; X64-NEXT:    retq
3792   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
3793   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
3794   %res = shufflevector <8 x i16> %arg0, <8 x i16> %arg1, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
3795   %bc = bitcast <8 x i16> %res to <2 x i64>
3796   ret <2 x i64> %bc
3797 }
3798
3799 define <2 x i64> @test_mm_unpacklo_epi32(<2 x i64> %a0, <2 x i64> %a1) {
3800 ; X32-LABEL: test_mm_unpacklo_epi32:
3801 ; X32:       # BB#0:
3802 ; X32-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3803 ; X32-NEXT:    retl
3804 ;
3805 ; X64-LABEL: test_mm_unpacklo_epi32:
3806 ; X64:       # BB#0:
3807 ; X64-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3808 ; X64-NEXT:    retq
3809   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
3810   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
3811   %res = shufflevector <4 x i32> %arg0,<4 x i32> %arg1, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
3812   %bc = bitcast <4 x i32> %res to <2 x i64>
3813   ret <2 x i64> %bc
3814 }
3815
3816 define <2 x i64> @test_mm_unpacklo_epi64(<2 x i64> %a0, <2 x i64> %a1) {
3817 ; X32-LABEL: test_mm_unpacklo_epi64:
3818 ; X32:       # BB#0:
3819 ; X32-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3820 ; X32-NEXT:    retl
3821 ;
3822 ; X64-LABEL: test_mm_unpacklo_epi64:
3823 ; X64:       # BB#0:
3824 ; X64-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3825 ; X64-NEXT:    retq
3826   %res = shufflevector <2 x i64> %a0, <2 x i64> %a1, <2 x i32> <i32 0, i32 2>
3827   ret <2 x i64> %res
3828 }
3829
3830 define <2 x double> @test_mm_unpacklo_pd(<2 x double> %a0, <2 x double> %a1) {
3831 ; X32-LABEL: test_mm_unpacklo_pd:
3832 ; X32:       # BB#0:
3833 ; X32-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3834 ; X32-NEXT:    retl
3835 ;
3836 ; X64-LABEL: test_mm_unpacklo_pd:
3837 ; X64:       # BB#0:
3838 ; X64-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3839 ; X64-NEXT:    retq
3840   %res = shufflevector <2 x double> %a0, <2 x double> %a1, <2 x i32> <i32 0, i32 2>
3841   ret <2 x double> %res
3842 }
3843
3844 define <2 x double> @test_mm_xor_pd(<2 x double> %a0, <2 x double> %a1) nounwind {
3845 ; X32-LABEL: test_mm_xor_pd:
3846 ; X32:       # BB#0:
3847 ; X32-NEXT:    xorps %xmm1, %xmm0
3848 ; X32-NEXT:    retl
3849 ;
3850 ; X64-LABEL: test_mm_xor_pd:
3851 ; X64:       # BB#0:
3852 ; X64-NEXT:    xorps %xmm1, %xmm0
3853 ; X64-NEXT:    retq
3854   %arg0 = bitcast <2 x double> %a0 to <4 x i32>
3855   %arg1 = bitcast <2 x double> %a1 to <4 x i32>
3856   %res = xor <4 x i32> %arg0, %arg1
3857   %bc = bitcast <4 x i32> %res to <2 x double>
3858   ret <2 x double> %bc
3859 }
3860
3861 define <2 x i64> @test_mm_xor_si128(<2 x i64> %a0, <2 x i64> %a1) nounwind {
3862 ; X32-LABEL: test_mm_xor_si128:
3863 ; X32:       # BB#0:
3864 ; X32-NEXT:    xorps %xmm1, %xmm0
3865 ; X32-NEXT:    retl
3866 ;
3867 ; X64-LABEL: test_mm_xor_si128:
3868 ; X64:       # BB#0:
3869 ; X64-NEXT:    xorps %xmm1, %xmm0
3870 ; X64-NEXT:    retq
3871   %res = xor <2 x i64> %a0, %a1
3872   ret <2 x i64> %res
3873 }
3874
3875 !0 = !{i32 1}
3876