Add a triple to switch.ll test.
[oota-llvm.git] / test / CodeGen / X86 / sse2-intrinsics-x86.ll
1 ; RUN: llc < %s -mtriple=i386-apple-darwin -mattr=-avx,+sse2 | FileCheck %s
2
3 define <2 x double> @test_x86_sse2_add_sd(<2 x double> %a0, <2 x double> %a1) {
4   ; CHECK: addsd
5   %res = call <2 x double> @llvm.x86.sse2.add.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
6   ret <2 x double> %res
7 }
8 declare <2 x double> @llvm.x86.sse2.add.sd(<2 x double>, <2 x double>) nounwind readnone
9
10
11 define <2 x double> @test_x86_sse2_cmp_pd(<2 x double> %a0, <2 x double> %a1) {
12   ; CHECK: cmpordpd
13   %res = call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %a0, <2 x double> %a1, i8 7) ; <<2 x double>> [#uses=1]
14   ret <2 x double> %res
15 }
16 declare <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double>, <2 x double>, i8) nounwind readnone
17
18
19 define <2 x double> @test_x86_sse2_cmp_sd(<2 x double> %a0, <2 x double> %a1) {
20   ; CHECK: cmpordsd
21   %res = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a0, <2 x double> %a1, i8 7) ; <<2 x double>> [#uses=1]
22   ret <2 x double> %res
23 }
24 declare <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double>, <2 x double>, i8) nounwind readnone
25
26
27 define i32 @test_x86_sse2_comieq_sd(<2 x double> %a0, <2 x double> %a1) {
28   ; CHECK: comisd
29   ; CHECK: sete
30   ; CHECK: movzbl
31   %res = call i32 @llvm.x86.sse2.comieq.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
32   ret i32 %res
33 }
34 declare i32 @llvm.x86.sse2.comieq.sd(<2 x double>, <2 x double>) nounwind readnone
35
36
37 define i32 @test_x86_sse2_comige_sd(<2 x double> %a0, <2 x double> %a1) {
38   ; CHECK: comisd
39   ; CHECK: setae
40   ; CHECK: movzbl
41   %res = call i32 @llvm.x86.sse2.comige.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
42   ret i32 %res
43 }
44 declare i32 @llvm.x86.sse2.comige.sd(<2 x double>, <2 x double>) nounwind readnone
45
46
47 define i32 @test_x86_sse2_comigt_sd(<2 x double> %a0, <2 x double> %a1) {
48   ; CHECK: comisd
49   ; CHECK: seta
50   ; CHECK: movzbl
51   %res = call i32 @llvm.x86.sse2.comigt.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
52   ret i32 %res
53 }
54 declare i32 @llvm.x86.sse2.comigt.sd(<2 x double>, <2 x double>) nounwind readnone
55
56
57 define i32 @test_x86_sse2_comile_sd(<2 x double> %a0, <2 x double> %a1) {
58   ; CHECK: comisd
59   ; CHECK: setbe
60   ; CHECK: movzbl
61   %res = call i32 @llvm.x86.sse2.comile.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
62   ret i32 %res
63 }
64 declare i32 @llvm.x86.sse2.comile.sd(<2 x double>, <2 x double>) nounwind readnone
65
66
67 define i32 @test_x86_sse2_comilt_sd(<2 x double> %a0, <2 x double> %a1) {
68   ; CHECK: comisd
69   ; CHECK: sbbl    %eax, %eax
70   ; CHECK: andl    $1, %eax
71   %res = call i32 @llvm.x86.sse2.comilt.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
72   ret i32 %res
73 }
74 declare i32 @llvm.x86.sse2.comilt.sd(<2 x double>, <2 x double>) nounwind readnone
75
76
77 define i32 @test_x86_sse2_comineq_sd(<2 x double> %a0, <2 x double> %a1) {
78   ; CHECK: comisd
79   ; CHECK: setne
80   ; CHECK: movzbl
81   %res = call i32 @llvm.x86.sse2.comineq.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
82   ret i32 %res
83 }
84 declare i32 @llvm.x86.sse2.comineq.sd(<2 x double>, <2 x double>) nounwind readnone
85
86
87 define <2 x double> @test_x86_sse2_cvtdq2pd(<4 x i32> %a0) {
88   ; CHECK: cvtdq2pd
89   %res = call <2 x double> @llvm.x86.sse2.cvtdq2pd(<4 x i32> %a0) ; <<2 x double>> [#uses=1]
90   ret <2 x double> %res
91 }
92 declare <2 x double> @llvm.x86.sse2.cvtdq2pd(<4 x i32>) nounwind readnone
93
94
95 define <4 x float> @test_x86_sse2_cvtdq2ps(<4 x i32> %a0) {
96   ; CHECK: cvtdq2ps
97   %res = call <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32> %a0) ; <<4 x float>> [#uses=1]
98   ret <4 x float> %res
99 }
100 declare <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32>) nounwind readnone
101
102
103 define <4 x i32> @test_x86_sse2_cvtpd2dq(<2 x double> %a0) {
104   ; CHECK: cvtpd2dq
105   %res = call <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double> %a0) ; <<4 x i32>> [#uses=1]
106   ret <4 x i32> %res
107 }
108 declare <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double>) nounwind readnone
109
110
111 define <4 x float> @test_x86_sse2_cvtpd2ps(<2 x double> %a0) {
112   ; CHECK: cvtpd2ps
113   %res = call <4 x float> @llvm.x86.sse2.cvtpd2ps(<2 x double> %a0) ; <<4 x float>> [#uses=1]
114   ret <4 x float> %res
115 }
116 declare <4 x float> @llvm.x86.sse2.cvtpd2ps(<2 x double>) nounwind readnone
117
118
119 define <4 x i32> @test_x86_sse2_cvtps2dq(<4 x float> %a0) {
120   ; CHECK: cvtps2dq
121   %res = call <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float> %a0) ; <<4 x i32>> [#uses=1]
122   ret <4 x i32> %res
123 }
124 declare <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float>) nounwind readnone
125
126
127 define <2 x double> @test_x86_sse2_cvtps2pd(<4 x float> %a0) {
128   ; CHECK: cvtps2pd
129   %res = call <2 x double> @llvm.x86.sse2.cvtps2pd(<4 x float> %a0) ; <<2 x double>> [#uses=1]
130   ret <2 x double> %res
131 }
132 declare <2 x double> @llvm.x86.sse2.cvtps2pd(<4 x float>) nounwind readnone
133
134
135 define i32 @test_x86_sse2_cvtsd2si(<2 x double> %a0) {
136   ; CHECK: cvtsd2si
137   %res = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %a0) ; <i32> [#uses=1]
138   ret i32 %res
139 }
140 declare i32 @llvm.x86.sse2.cvtsd2si(<2 x double>) nounwind readnone
141
142
143 define <4 x float> @test_x86_sse2_cvtsd2ss(<4 x float> %a0, <2 x double> %a1) {
144   ; CHECK: cvtsd2ss 
145   ; CHECK-NOT: cvtsd2ss %xmm{{[0-9]+}}, %xmm{{[0-9]+}}, %xmm{{[0-9]+}} 
146   %res = call <4 x float> @llvm.x86.sse2.cvtsd2ss(<4 x float> %a0, <2 x double> %a1) ; <<4 x float>> [#uses=1]
147   ret <4 x float> %res
148 }
149 declare <4 x float> @llvm.x86.sse2.cvtsd2ss(<4 x float>, <2 x double>) nounwind readnone
150
151
152 define <2 x double> @test_x86_sse2_cvtsi2sd(<2 x double> %a0) {
153   ; CHECK: movl
154   ; CHECK: cvtsi2sd
155   %res = call <2 x double> @llvm.x86.sse2.cvtsi2sd(<2 x double> %a0, i32 7) ; <<2 x double>> [#uses=1]
156   ret <2 x double> %res
157 }
158 declare <2 x double> @llvm.x86.sse2.cvtsi2sd(<2 x double>, i32) nounwind readnone
159
160
161 define <2 x double> @test_x86_sse2_cvtss2sd(<2 x double> %a0, <4 x float> %a1) {
162   ; CHECK: cvtss2sd
163   %res = call <2 x double> @llvm.x86.sse2.cvtss2sd(<2 x double> %a0, <4 x float> %a1) ; <<2 x double>> [#uses=1]
164   ret <2 x double> %res
165 }
166 declare <2 x double> @llvm.x86.sse2.cvtss2sd(<2 x double>, <4 x float>) nounwind readnone
167
168
169 define <4 x i32> @test_x86_sse2_cvttpd2dq(<2 x double> %a0) {
170   ; CHECK: cvttpd2dq
171   %res = call <4 x i32> @llvm.x86.sse2.cvttpd2dq(<2 x double> %a0) ; <<4 x i32>> [#uses=1]
172   ret <4 x i32> %res
173 }
174 declare <4 x i32> @llvm.x86.sse2.cvttpd2dq(<2 x double>) nounwind readnone
175
176
177 define <4 x i32> @test_x86_sse2_cvttps2dq(<4 x float> %a0) {
178   ; CHECK: cvttps2dq
179   %res = call <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float> %a0) ; <<4 x i32>> [#uses=1]
180   ret <4 x i32> %res
181 }
182 declare <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float>) nounwind readnone
183
184
185 define i32 @test_x86_sse2_cvttsd2si(<2 x double> %a0) {
186   ; CHECK: cvttsd2si
187   %res = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %a0) ; <i32> [#uses=1]
188   ret i32 %res
189 }
190 declare i32 @llvm.x86.sse2.cvttsd2si(<2 x double>) nounwind readnone
191
192
193 define <2 x double> @test_x86_sse2_div_sd(<2 x double> %a0, <2 x double> %a1) {
194   ; CHECK: divsd
195   %res = call <2 x double> @llvm.x86.sse2.div.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
196   ret <2 x double> %res
197 }
198 declare <2 x double> @llvm.x86.sse2.div.sd(<2 x double>, <2 x double>) nounwind readnone
199
200
201
202 define <2 x double> @test_x86_sse2_max_pd(<2 x double> %a0, <2 x double> %a1) {
203   ; CHECK: maxpd
204   %res = call <2 x double> @llvm.x86.sse2.max.pd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
205   ret <2 x double> %res
206 }
207 declare <2 x double> @llvm.x86.sse2.max.pd(<2 x double>, <2 x double>) nounwind readnone
208
209
210 define <2 x double> @test_x86_sse2_max_sd(<2 x double> %a0, <2 x double> %a1) {
211   ; CHECK: maxsd
212   %res = call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
213   ret <2 x double> %res
214 }
215 declare <2 x double> @llvm.x86.sse2.max.sd(<2 x double>, <2 x double>) nounwind readnone
216
217
218 define <2 x double> @test_x86_sse2_min_pd(<2 x double> %a0, <2 x double> %a1) {
219   ; CHECK: minpd
220   %res = call <2 x double> @llvm.x86.sse2.min.pd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
221   ret <2 x double> %res
222 }
223 declare <2 x double> @llvm.x86.sse2.min.pd(<2 x double>, <2 x double>) nounwind readnone
224
225
226 define <2 x double> @test_x86_sse2_min_sd(<2 x double> %a0, <2 x double> %a1) {
227   ; CHECK: minsd
228   %res = call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
229   ret <2 x double> %res
230 }
231 declare <2 x double> @llvm.x86.sse2.min.sd(<2 x double>, <2 x double>) nounwind readnone
232
233
234 define i32 @test_x86_sse2_movmsk_pd(<2 x double> %a0) {
235   ; CHECK: movmskpd
236   %res = call i32 @llvm.x86.sse2.movmsk.pd(<2 x double> %a0) ; <i32> [#uses=1]
237   ret i32 %res
238 }
239 declare i32 @llvm.x86.sse2.movmsk.pd(<2 x double>) nounwind readnone
240
241
242
243
244 define <2 x double> @test_x86_sse2_mul_sd(<2 x double> %a0, <2 x double> %a1) {
245   ; CHECK: test_x86_sse2_mul_sd
246   ; CHECK: mulsd
247   %res = call <2 x double> @llvm.x86.sse2.mul.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
248   ret <2 x double> %res
249 }
250 declare <2 x double> @llvm.x86.sse2.mul.sd(<2 x double>, <2 x double>) nounwind readnone
251
252
253 define <8 x i16> @test_x86_sse2_packssdw_128(<4 x i32> %a0, <4 x i32> %a1) {
254   ; CHECK: packssdw
255   %res = call <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32> %a0, <4 x i32> %a1) ; <<8 x i16>> [#uses=1]
256   ret <8 x i16> %res
257 }
258 declare <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32>, <4 x i32>) nounwind readnone
259
260
261 define <16 x i8> @test_x86_sse2_packsswb_128(<8 x i16> %a0, <8 x i16> %a1) {
262   ; CHECK: packsswb
263   %res = call <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16> %a0, <8 x i16> %a1) ; <<16 x i8>> [#uses=1]
264   ret <16 x i8> %res
265 }
266 declare <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16>, <8 x i16>) nounwind readnone
267
268
269 define <16 x i8> @test_x86_sse2_packuswb_128(<8 x i16> %a0, <8 x i16> %a1) {
270   ; CHECK: packuswb
271   %res = call <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16> %a0, <8 x i16> %a1) ; <<16 x i8>> [#uses=1]
272   ret <16 x i8> %res
273 }
274 declare <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16>, <8 x i16>) nounwind readnone
275
276
277 define <16 x i8> @test_x86_sse2_padds_b(<16 x i8> %a0, <16 x i8> %a1) {
278   ; CHECK: paddsb
279   %res = call <16 x i8> @llvm.x86.sse2.padds.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
280   ret <16 x i8> %res
281 }
282 declare <16 x i8> @llvm.x86.sse2.padds.b(<16 x i8>, <16 x i8>) nounwind readnone
283
284
285 define <8 x i16> @test_x86_sse2_padds_w(<8 x i16> %a0, <8 x i16> %a1) {
286   ; CHECK: paddsw
287   %res = call <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
288   ret <8 x i16> %res
289 }
290 declare <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16>, <8 x i16>) nounwind readnone
291
292
293 define <16 x i8> @test_x86_sse2_paddus_b(<16 x i8> %a0, <16 x i8> %a1) {
294   ; CHECK: paddusb
295   %res = call <16 x i8> @llvm.x86.sse2.paddus.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
296   ret <16 x i8> %res
297 }
298 declare <16 x i8> @llvm.x86.sse2.paddus.b(<16 x i8>, <16 x i8>) nounwind readnone
299
300
301 define <8 x i16> @test_x86_sse2_paddus_w(<8 x i16> %a0, <8 x i16> %a1) {
302   ; CHECK: paddusw
303   %res = call <8 x i16> @llvm.x86.sse2.paddus.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
304   ret <8 x i16> %res
305 }
306 declare <8 x i16> @llvm.x86.sse2.paddus.w(<8 x i16>, <8 x i16>) nounwind readnone
307
308
309 define <16 x i8> @test_x86_sse2_pavg_b(<16 x i8> %a0, <16 x i8> %a1) {
310   ; CHECK: pavgb
311   %res = call <16 x i8> @llvm.x86.sse2.pavg.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
312   ret <16 x i8> %res
313 }
314 declare <16 x i8> @llvm.x86.sse2.pavg.b(<16 x i8>, <16 x i8>) nounwind readnone
315
316
317 define <8 x i16> @test_x86_sse2_pavg_w(<8 x i16> %a0, <8 x i16> %a1) {
318   ; CHECK: pavgw
319   %res = call <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
320   ret <8 x i16> %res
321 }
322 declare <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16>, <8 x i16>) nounwind readnone
323
324
325 define <4 x i32> @test_x86_sse2_pmadd_wd(<8 x i16> %a0, <8 x i16> %a1) {
326   ; CHECK: pmaddwd
327   %res = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %a0, <8 x i16> %a1) ; <<4 x i32>> [#uses=1]
328   ret <4 x i32> %res
329 }
330 declare <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16>, <8 x i16>) nounwind readnone
331
332
333 define <8 x i16> @test_x86_sse2_pmaxs_w(<8 x i16> %a0, <8 x i16> %a1) {
334   ; CHECK: pmaxsw
335   %res = call <8 x i16> @llvm.x86.sse2.pmaxs.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
336   ret <8 x i16> %res
337 }
338 declare <8 x i16> @llvm.x86.sse2.pmaxs.w(<8 x i16>, <8 x i16>) nounwind readnone
339
340
341 define <16 x i8> @test_x86_sse2_pmaxu_b(<16 x i8> %a0, <16 x i8> %a1) {
342   ; CHECK: pmaxub
343   %res = call <16 x i8> @llvm.x86.sse2.pmaxu.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
344   ret <16 x i8> %res
345 }
346 declare <16 x i8> @llvm.x86.sse2.pmaxu.b(<16 x i8>, <16 x i8>) nounwind readnone
347
348
349 define <8 x i16> @test_x86_sse2_pmins_w(<8 x i16> %a0, <8 x i16> %a1) {
350   ; CHECK: pminsw
351   %res = call <8 x i16> @llvm.x86.sse2.pmins.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
352   ret <8 x i16> %res
353 }
354 declare <8 x i16> @llvm.x86.sse2.pmins.w(<8 x i16>, <8 x i16>) nounwind readnone
355
356
357 define <16 x i8> @test_x86_sse2_pminu_b(<16 x i8> %a0, <16 x i8> %a1) {
358   ; CHECK: pminub
359   %res = call <16 x i8> @llvm.x86.sse2.pminu.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
360   ret <16 x i8> %res
361 }
362 declare <16 x i8> @llvm.x86.sse2.pminu.b(<16 x i8>, <16 x i8>) nounwind readnone
363
364
365 define i32 @test_x86_sse2_pmovmskb_128(<16 x i8> %a0) {
366   ; CHECK: pmovmskb
367   %res = call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %a0) ; <i32> [#uses=1]
368   ret i32 %res
369 }
370 declare i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8>) nounwind readnone
371
372
373 define <8 x i16> @test_x86_sse2_pmulh_w(<8 x i16> %a0, <8 x i16> %a1) {
374   ; CHECK: pmulhw
375   %res = call <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
376   ret <8 x i16> %res
377 }
378 declare <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16>, <8 x i16>) nounwind readnone
379
380
381 define <8 x i16> @test_x86_sse2_pmulhu_w(<8 x i16> %a0, <8 x i16> %a1) {
382   ; CHECK: pmulhuw
383   %res = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
384   ret <8 x i16> %res
385 }
386 declare <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16>, <8 x i16>) nounwind readnone
387
388
389 define <2 x i64> @test_x86_sse2_pmulu_dq(<4 x i32> %a0, <4 x i32> %a1) {
390   ; CHECK: pmuludq
391   %res = call <2 x i64> @llvm.x86.sse2.pmulu.dq(<4 x i32> %a0, <4 x i32> %a1) ; <<2 x i64>> [#uses=1]
392   ret <2 x i64> %res
393 }
394 declare <2 x i64> @llvm.x86.sse2.pmulu.dq(<4 x i32>, <4 x i32>) nounwind readnone
395
396
397 define <2 x i64> @test_x86_sse2_psad_bw(<16 x i8> %a0, <16 x i8> %a1) {
398   ; CHECK: psadbw
399   %res = call <2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8> %a0, <16 x i8> %a1) ; <<2 x i64>> [#uses=1]
400   ret <2 x i64> %res
401 }
402 declare <2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8>, <16 x i8>) nounwind readnone
403
404
405 define <4 x i32> @test_x86_sse2_psll_d(<4 x i32> %a0, <4 x i32> %a1) {
406   ; CHECK: pslld
407   %res = call <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32> %a0, <4 x i32> %a1) ; <<4 x i32>> [#uses=1]
408   ret <4 x i32> %res
409 }
410 declare <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32>, <4 x i32>) nounwind readnone
411
412
413 define <2 x i64> @test_x86_sse2_psll_q(<2 x i64> %a0, <2 x i64> %a1) {
414   ; CHECK: psllq
415   %res = call <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64> %a0, <2 x i64> %a1) ; <<2 x i64>> [#uses=1]
416   ret <2 x i64> %res
417 }
418 declare <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64>, <2 x i64>) nounwind readnone
419
420
421 define <8 x i16> @test_x86_sse2_psll_w(<8 x i16> %a0, <8 x i16> %a1) {
422   ; CHECK: psllw
423   %res = call <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
424   ret <8 x i16> %res
425 }
426 declare <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16>, <8 x i16>) nounwind readnone
427
428
429 define <4 x i32> @test_x86_sse2_pslli_d(<4 x i32> %a0) {
430   ; CHECK: pslld
431   %res = call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %a0, i32 7) ; <<4 x i32>> [#uses=1]
432   ret <4 x i32> %res
433 }
434 declare <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32>, i32) nounwind readnone
435
436
437 define <2 x i64> @test_x86_sse2_pslli_q(<2 x i64> %a0) {
438   ; CHECK: psllq
439   %res = call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %a0, i32 7) ; <<2 x i64>> [#uses=1]
440   ret <2 x i64> %res
441 }
442 declare <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64>, i32) nounwind readnone
443
444
445 define <8 x i16> @test_x86_sse2_pslli_w(<8 x i16> %a0) {
446   ; CHECK: psllw
447   %res = call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %a0, i32 7) ; <<8 x i16>> [#uses=1]
448   ret <8 x i16> %res
449 }
450 declare <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16>, i32) nounwind readnone
451
452
453 define <4 x i32> @test_x86_sse2_psra_d(<4 x i32> %a0, <4 x i32> %a1) {
454   ; CHECK: psrad
455   %res = call <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32> %a0, <4 x i32> %a1) ; <<4 x i32>> [#uses=1]
456   ret <4 x i32> %res
457 }
458 declare <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32>, <4 x i32>) nounwind readnone
459
460
461 define <8 x i16> @test_x86_sse2_psra_w(<8 x i16> %a0, <8 x i16> %a1) {
462   ; CHECK: psraw
463   %res = call <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
464   ret <8 x i16> %res
465 }
466 declare <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16>, <8 x i16>) nounwind readnone
467
468
469 define <4 x i32> @test_x86_sse2_psrai_d(<4 x i32> %a0) {
470   ; CHECK: psrad
471   %res = call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> %a0, i32 7) ; <<4 x i32>> [#uses=1]
472   ret <4 x i32> %res
473 }
474 declare <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32>, i32) nounwind readnone
475
476
477 define <8 x i16> @test_x86_sse2_psrai_w(<8 x i16> %a0) {
478   ; CHECK: psraw
479   %res = call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> %a0, i32 7) ; <<8 x i16>> [#uses=1]
480   ret <8 x i16> %res
481 }
482 declare <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16>, i32) nounwind readnone
483
484
485 define <4 x i32> @test_x86_sse2_psrl_d(<4 x i32> %a0, <4 x i32> %a1) {
486   ; CHECK: psrld
487   %res = call <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32> %a0, <4 x i32> %a1) ; <<4 x i32>> [#uses=1]
488   ret <4 x i32> %res
489 }
490 declare <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32>, <4 x i32>) nounwind readnone
491
492
493 define <2 x i64> @test_x86_sse2_psrl_q(<2 x i64> %a0, <2 x i64> %a1) {
494   ; CHECK: psrlq
495   %res = call <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64> %a0, <2 x i64> %a1) ; <<2 x i64>> [#uses=1]
496   ret <2 x i64> %res
497 }
498 declare <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64>, <2 x i64>) nounwind readnone
499
500
501 define <8 x i16> @test_x86_sse2_psrl_w(<8 x i16> %a0, <8 x i16> %a1) {
502   ; CHECK: psrlw
503   %res = call <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
504   ret <8 x i16> %res
505 }
506 declare <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16>, <8 x i16>) nounwind readnone
507
508
509 define <4 x i32> @test_x86_sse2_psrli_d(<4 x i32> %a0) {
510   ; CHECK: psrld
511   %res = call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %a0, i32 7) ; <<4 x i32>> [#uses=1]
512   ret <4 x i32> %res
513 }
514 declare <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32>, i32) nounwind readnone
515
516
517 define <2 x i64> @test_x86_sse2_psrli_q(<2 x i64> %a0) {
518   ; CHECK: psrlq
519   %res = call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %a0, i32 7) ; <<2 x i64>> [#uses=1]
520   ret <2 x i64> %res
521 }
522 declare <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64>, i32) nounwind readnone
523
524
525 define <8 x i16> @test_x86_sse2_psrli_w(<8 x i16> %a0) {
526   ; CHECK: psrlw
527   %res = call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %a0, i32 7) ; <<8 x i16>> [#uses=1]
528   ret <8 x i16> %res
529 }
530 declare <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16>, i32) nounwind readnone
531
532
533 define <16 x i8> @test_x86_sse2_psubs_b(<16 x i8> %a0, <16 x i8> %a1) {
534   ; CHECK: psubsb
535   %res = call <16 x i8> @llvm.x86.sse2.psubs.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
536   ret <16 x i8> %res
537 }
538 declare <16 x i8> @llvm.x86.sse2.psubs.b(<16 x i8>, <16 x i8>) nounwind readnone
539
540
541 define <8 x i16> @test_x86_sse2_psubs_w(<8 x i16> %a0, <8 x i16> %a1) {
542   ; CHECK: psubsw
543   %res = call <8 x i16> @llvm.x86.sse2.psubs.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
544   ret <8 x i16> %res
545 }
546 declare <8 x i16> @llvm.x86.sse2.psubs.w(<8 x i16>, <8 x i16>) nounwind readnone
547
548
549 define <16 x i8> @test_x86_sse2_psubus_b(<16 x i8> %a0, <16 x i8> %a1) {
550   ; CHECK: psubusb
551   %res = call <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
552   ret <16 x i8> %res
553 }
554 declare <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8>, <16 x i8>) nounwind readnone
555
556
557 define <8 x i16> @test_x86_sse2_psubus_w(<8 x i16> %a0, <8 x i16> %a1) {
558   ; CHECK: psubusw
559   %res = call <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
560   ret <8 x i16> %res
561 }
562 declare <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16>, <8 x i16>) nounwind readnone
563
564
565 define <2 x double> @test_x86_sse2_sqrt_pd(<2 x double> %a0) {
566   ; CHECK: sqrtpd
567   %res = call <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double> %a0) ; <<2 x double>> [#uses=1]
568   ret <2 x double> %res
569 }
570 declare <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double>) nounwind readnone
571
572
573 define <2 x double> @test_x86_sse2_sqrt_sd(<2 x double> %a0) {
574   ; CHECK: sqrtsd
575   %res = call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %a0) ; <<2 x double>> [#uses=1]
576   ret <2 x double> %res
577 }
578 declare <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double>) nounwind readnone
579
580
581 define void @test_x86_sse2_storel_dq(i8* %a0, <4 x i32> %a1) {
582   ; CHECK: test_x86_sse2_storel_dq
583   ; CHECK: movl
584   ; CHECK: movlps
585   call void @llvm.x86.sse2.storel.dq(i8* %a0, <4 x i32> %a1)
586   ret void
587 }
588 declare void @llvm.x86.sse2.storel.dq(i8*, <4 x i32>) nounwind
589
590
591 define void @test_x86_sse2_storeu_dq(i8* %a0, <16 x i8> %a1) {
592   ; CHECK: test_x86_sse2_storeu_dq
593   ; CHECK: movl
594   ; CHECK: movdqu
595   ; add operation forces the execution domain.
596   %a2 = add <16 x i8> %a1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
597   call void @llvm.x86.sse2.storeu.dq(i8* %a0, <16 x i8> %a2)
598   ret void
599 }
600 declare void @llvm.x86.sse2.storeu.dq(i8*, <16 x i8>) nounwind
601
602
603 define void @test_x86_sse2_storeu_pd(i8* %a0, <2 x double> %a1) {
604   ; CHECK: test_x86_sse2_storeu_pd
605   ; CHECK: movl
606   ; CHECK: movupd
607   ; fadd operation forces the execution domain.
608   %a2 = fadd <2 x double> %a1, <double 0x0, double 0x4200000000000000>
609   call void @llvm.x86.sse2.storeu.pd(i8* %a0, <2 x double> %a2)
610   ret void
611 }
612 declare void @llvm.x86.sse2.storeu.pd(i8*, <2 x double>) nounwind
613
614
615 define <2 x double> @test_x86_sse2_sub_sd(<2 x double> %a0, <2 x double> %a1) {
616   ; CHECK: test_x86_sse2_sub_sd
617   ; CHECK: subsd
618   %res = call <2 x double> @llvm.x86.sse2.sub.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
619   ret <2 x double> %res
620 }
621 declare <2 x double> @llvm.x86.sse2.sub.sd(<2 x double>, <2 x double>) nounwind readnone
622
623
624 define i32 @test_x86_sse2_ucomieq_sd(<2 x double> %a0, <2 x double> %a1) {
625   ; CHECK: ucomisd
626   ; CHECK: sete
627   ; CHECK: movzbl
628   %res = call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
629   ret i32 %res
630 }
631 declare i32 @llvm.x86.sse2.ucomieq.sd(<2 x double>, <2 x double>) nounwind readnone
632
633
634 define i32 @test_x86_sse2_ucomige_sd(<2 x double> %a0, <2 x double> %a1) {
635   ; CHECK: ucomisd
636   ; CHECK: setae
637   ; CHECK: movzbl
638   %res = call i32 @llvm.x86.sse2.ucomige.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
639   ret i32 %res
640 }
641 declare i32 @llvm.x86.sse2.ucomige.sd(<2 x double>, <2 x double>) nounwind readnone
642
643
644 define i32 @test_x86_sse2_ucomigt_sd(<2 x double> %a0, <2 x double> %a1) {
645   ; CHECK: ucomisd
646   ; CHECK: seta
647   ; CHECK: movzbl
648   %res = call i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
649   ret i32 %res
650 }
651 declare i32 @llvm.x86.sse2.ucomigt.sd(<2 x double>, <2 x double>) nounwind readnone
652
653
654 define i32 @test_x86_sse2_ucomile_sd(<2 x double> %a0, <2 x double> %a1) {
655   ; CHECK: ucomisd
656   ; CHECK: setbe
657   ; CHECK: movzbl
658   %res = call i32 @llvm.x86.sse2.ucomile.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
659   ret i32 %res
660 }
661 declare i32 @llvm.x86.sse2.ucomile.sd(<2 x double>, <2 x double>) nounwind readnone
662
663
664 define i32 @test_x86_sse2_ucomilt_sd(<2 x double> %a0, <2 x double> %a1) {
665   ; CHECK: ucomisd
666   ; CHECK: sbbl
667   %res = call i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
668   ret i32 %res
669 }
670 declare i32 @llvm.x86.sse2.ucomilt.sd(<2 x double>, <2 x double>) nounwind readnone
671
672
673 define i32 @test_x86_sse2_ucomineq_sd(<2 x double> %a0, <2 x double> %a1) {
674   ; CHECK: ucomisd
675   ; CHECK: setne
676   ; CHECK: movzbl
677   %res = call i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
678   ret i32 %res
679 }
680 declare i32 @llvm.x86.sse2.ucomineq.sd(<2 x double>, <2 x double>) nounwind readnone
681
682 define void @test_x86_sse2_pause() {
683   ; CHECK: pause
684   tail call void @llvm.x86.sse2.pause()
685   ret void 
686 }
687 declare void @llvm.x86.sse2.pause() nounwind
688
689 define <4 x i32> @test_x86_sse2_pshuf_d(<4 x i32> %a) {
690 ; CHECK-LABEL: test_x86_sse2_pshuf_d:
691 ; CHECK: pshufd $27
692 entry:
693    %res = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 27) nounwind readnone
694    ret <4 x i32> %res
695 }
696 declare <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32>, i8) nounwind readnone
697
698 define <8 x i16> @test_x86_sse2_pshufl_w(<8 x i16> %a) {
699 ; CHECK-LABEL: test_x86_sse2_pshufl_w:
700 ; CHECK: pshuflw $27
701 entry:
702    %res = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %a, i8 27) nounwind readnone
703    ret <8 x i16> %res
704 }
705 declare <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16>, i8) nounwind readnone
706
707 define <8 x i16> @test_x86_sse2_pshufh_w(<8 x i16> %a) {
708 ; CHECK-LABEL: test_x86_sse2_pshufh_w:
709 ; CHECK: pshufhw $27
710 entry:
711    %res = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %a, i8 27) nounwind readnone
712    ret <8 x i16> %res
713 }
714 declare <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16>, i8) nounwind readnone