OSDN Git Service

Add tests for SSE intrinsics in non-avx mode by copying from the AVX test cases....
[android-x86/external-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   %res = call <4 x float> @llvm.x86.sse2.cvtsd2ss(<4 x float> %a0, <2 x double> %a1) ; <<4 x float>> [#uses=1]
146   ret <4 x float> %res
147 }
148 declare <4 x float> @llvm.x86.sse2.cvtsd2ss(<4 x float>, <2 x double>) nounwind readnone
149
150
151 define <2 x double> @test_x86_sse2_cvtsi2sd(<2 x double> %a0) {
152   ; CHECK: movl
153   ; CHECK: cvtsi2sd
154   %res = call <2 x double> @llvm.x86.sse2.cvtsi2sd(<2 x double> %a0, i32 7) ; <<2 x double>> [#uses=1]
155   ret <2 x double> %res
156 }
157 declare <2 x double> @llvm.x86.sse2.cvtsi2sd(<2 x double>, i32) nounwind readnone
158
159
160 define <2 x double> @test_x86_sse2_cvtss2sd(<2 x double> %a0, <4 x float> %a1) {
161   ; CHECK: cvtss2sd
162   %res = call <2 x double> @llvm.x86.sse2.cvtss2sd(<2 x double> %a0, <4 x float> %a1) ; <<2 x double>> [#uses=1]
163   ret <2 x double> %res
164 }
165 declare <2 x double> @llvm.x86.sse2.cvtss2sd(<2 x double>, <4 x float>) nounwind readnone
166
167
168 define <4 x i32> @test_x86_sse2_cvttpd2dq(<2 x double> %a0) {
169   ; CHECK: cvttpd2dq
170   %res = call <4 x i32> @llvm.x86.sse2.cvttpd2dq(<2 x double> %a0) ; <<4 x i32>> [#uses=1]
171   ret <4 x i32> %res
172 }
173 declare <4 x i32> @llvm.x86.sse2.cvttpd2dq(<2 x double>) nounwind readnone
174
175
176 define <4 x i32> @test_x86_sse2_cvttps2dq(<4 x float> %a0) {
177   ; CHECK: cvttps2dq
178   %res = call <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float> %a0) ; <<4 x i32>> [#uses=1]
179   ret <4 x i32> %res
180 }
181 declare <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float>) nounwind readnone
182
183
184 define i32 @test_x86_sse2_cvttsd2si(<2 x double> %a0) {
185   ; CHECK: cvttsd2si
186   %res = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %a0) ; <i32> [#uses=1]
187   ret i32 %res
188 }
189 declare i32 @llvm.x86.sse2.cvttsd2si(<2 x double>) nounwind readnone
190
191
192 define <2 x double> @test_x86_sse2_div_sd(<2 x double> %a0, <2 x double> %a1) {
193   ; CHECK: divsd
194   %res = call <2 x double> @llvm.x86.sse2.div.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
195   ret <2 x double> %res
196 }
197 declare <2 x double> @llvm.x86.sse2.div.sd(<2 x double>, <2 x double>) nounwind readnone
198
199
200
201 define <2 x double> @test_x86_sse2_max_pd(<2 x double> %a0, <2 x double> %a1) {
202   ; CHECK: maxpd
203   %res = call <2 x double> @llvm.x86.sse2.max.pd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
204   ret <2 x double> %res
205 }
206 declare <2 x double> @llvm.x86.sse2.max.pd(<2 x double>, <2 x double>) nounwind readnone
207
208
209 define <2 x double> @test_x86_sse2_max_sd(<2 x double> %a0, <2 x double> %a1) {
210   ; CHECK: maxsd
211   %res = call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
212   ret <2 x double> %res
213 }
214 declare <2 x double> @llvm.x86.sse2.max.sd(<2 x double>, <2 x double>) nounwind readnone
215
216
217 define <2 x double> @test_x86_sse2_min_pd(<2 x double> %a0, <2 x double> %a1) {
218   ; CHECK: minpd
219   %res = call <2 x double> @llvm.x86.sse2.min.pd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
220   ret <2 x double> %res
221 }
222 declare <2 x double> @llvm.x86.sse2.min.pd(<2 x double>, <2 x double>) nounwind readnone
223
224
225 define <2 x double> @test_x86_sse2_min_sd(<2 x double> %a0, <2 x double> %a1) {
226   ; CHECK: minsd
227   %res = call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
228   ret <2 x double> %res
229 }
230 declare <2 x double> @llvm.x86.sse2.min.sd(<2 x double>, <2 x double>) nounwind readnone
231
232
233 define i32 @test_x86_sse2_movmsk_pd(<2 x double> %a0) {
234   ; CHECK: movmskpd
235   %res = call i32 @llvm.x86.sse2.movmsk.pd(<2 x double> %a0) ; <i32> [#uses=1]
236   ret i32 %res
237 }
238 declare i32 @llvm.x86.sse2.movmsk.pd(<2 x double>) nounwind readnone
239
240
241
242
243 define <2 x double> @test_x86_sse2_mul_sd(<2 x double> %a0, <2 x double> %a1) {
244   ; CHECK: test_x86_sse2_mul_sd
245   ; CHECK: mulsd
246   %res = call <2 x double> @llvm.x86.sse2.mul.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
247   ret <2 x double> %res
248 }
249 declare <2 x double> @llvm.x86.sse2.mul.sd(<2 x double>, <2 x double>) nounwind readnone
250
251
252 define <8 x i16> @test_x86_sse2_packssdw_128(<4 x i32> %a0, <4 x i32> %a1) {
253   ; CHECK: packssdw
254   %res = call <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32> %a0, <4 x i32> %a1) ; <<8 x i16>> [#uses=1]
255   ret <8 x i16> %res
256 }
257 declare <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32>, <4 x i32>) nounwind readnone
258
259
260 define <16 x i8> @test_x86_sse2_packsswb_128(<8 x i16> %a0, <8 x i16> %a1) {
261   ; CHECK: packsswb
262   %res = call <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16> %a0, <8 x i16> %a1) ; <<16 x i8>> [#uses=1]
263   ret <16 x i8> %res
264 }
265 declare <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16>, <8 x i16>) nounwind readnone
266
267
268 define <16 x i8> @test_x86_sse2_packuswb_128(<8 x i16> %a0, <8 x i16> %a1) {
269   ; CHECK: packuswb
270   %res = call <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16> %a0, <8 x i16> %a1) ; <<16 x i8>> [#uses=1]
271   ret <16 x i8> %res
272 }
273 declare <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16>, <8 x i16>) nounwind readnone
274
275
276 define <16 x i8> @test_x86_sse2_padds_b(<16 x i8> %a0, <16 x i8> %a1) {
277   ; CHECK: paddsb
278   %res = call <16 x i8> @llvm.x86.sse2.padds.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
279   ret <16 x i8> %res
280 }
281 declare <16 x i8> @llvm.x86.sse2.padds.b(<16 x i8>, <16 x i8>) nounwind readnone
282
283
284 define <8 x i16> @test_x86_sse2_padds_w(<8 x i16> %a0, <8 x i16> %a1) {
285   ; CHECK: paddsw
286   %res = call <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
287   ret <8 x i16> %res
288 }
289 declare <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16>, <8 x i16>) nounwind readnone
290
291
292 define <16 x i8> @test_x86_sse2_paddus_b(<16 x i8> %a0, <16 x i8> %a1) {
293   ; CHECK: paddusb
294   %res = call <16 x i8> @llvm.x86.sse2.paddus.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
295   ret <16 x i8> %res
296 }
297 declare <16 x i8> @llvm.x86.sse2.paddus.b(<16 x i8>, <16 x i8>) nounwind readnone
298
299
300 define <8 x i16> @test_x86_sse2_paddus_w(<8 x i16> %a0, <8 x i16> %a1) {
301   ; CHECK: paddusw
302   %res = call <8 x i16> @llvm.x86.sse2.paddus.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
303   ret <8 x i16> %res
304 }
305 declare <8 x i16> @llvm.x86.sse2.paddus.w(<8 x i16>, <8 x i16>) nounwind readnone
306
307
308 define <16 x i8> @test_x86_sse2_pavg_b(<16 x i8> %a0, <16 x i8> %a1) {
309   ; CHECK: pavgb
310   %res = call <16 x i8> @llvm.x86.sse2.pavg.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
311   ret <16 x i8> %res
312 }
313 declare <16 x i8> @llvm.x86.sse2.pavg.b(<16 x i8>, <16 x i8>) nounwind readnone
314
315
316 define <8 x i16> @test_x86_sse2_pavg_w(<8 x i16> %a0, <8 x i16> %a1) {
317   ; CHECK: pavgw
318   %res = call <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
319   ret <8 x i16> %res
320 }
321 declare <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16>, <8 x i16>) nounwind readnone
322
323
324 define <4 x i32> @test_x86_sse2_pmadd_wd(<8 x i16> %a0, <8 x i16> %a1) {
325   ; CHECK: pmaddwd
326   %res = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %a0, <8 x i16> %a1) ; <<4 x i32>> [#uses=1]
327   ret <4 x i32> %res
328 }
329 declare <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16>, <8 x i16>) nounwind readnone
330
331
332 define <8 x i16> @test_x86_sse2_pmaxs_w(<8 x i16> %a0, <8 x i16> %a1) {
333   ; CHECK: pmaxsw
334   %res = call <8 x i16> @llvm.x86.sse2.pmaxs.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
335   ret <8 x i16> %res
336 }
337 declare <8 x i16> @llvm.x86.sse2.pmaxs.w(<8 x i16>, <8 x i16>) nounwind readnone
338
339
340 define <16 x i8> @test_x86_sse2_pmaxu_b(<16 x i8> %a0, <16 x i8> %a1) {
341   ; CHECK: pmaxub
342   %res = call <16 x i8> @llvm.x86.sse2.pmaxu.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
343   ret <16 x i8> %res
344 }
345 declare <16 x i8> @llvm.x86.sse2.pmaxu.b(<16 x i8>, <16 x i8>) nounwind readnone
346
347
348 define <8 x i16> @test_x86_sse2_pmins_w(<8 x i16> %a0, <8 x i16> %a1) {
349   ; CHECK: pminsw
350   %res = call <8 x i16> @llvm.x86.sse2.pmins.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
351   ret <8 x i16> %res
352 }
353 declare <8 x i16> @llvm.x86.sse2.pmins.w(<8 x i16>, <8 x i16>) nounwind readnone
354
355
356 define <16 x i8> @test_x86_sse2_pminu_b(<16 x i8> %a0, <16 x i8> %a1) {
357   ; CHECK: pminub
358   %res = call <16 x i8> @llvm.x86.sse2.pminu.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
359   ret <16 x i8> %res
360 }
361 declare <16 x i8> @llvm.x86.sse2.pminu.b(<16 x i8>, <16 x i8>) nounwind readnone
362
363
364 define i32 @test_x86_sse2_pmovmskb_128(<16 x i8> %a0) {
365   ; CHECK: pmovmskb
366   %res = call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %a0) ; <i32> [#uses=1]
367   ret i32 %res
368 }
369 declare i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8>) nounwind readnone
370
371
372 define <8 x i16> @test_x86_sse2_pmulh_w(<8 x i16> %a0, <8 x i16> %a1) {
373   ; CHECK: pmulhw
374   %res = call <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
375   ret <8 x i16> %res
376 }
377 declare <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16>, <8 x i16>) nounwind readnone
378
379
380 define <8 x i16> @test_x86_sse2_pmulhu_w(<8 x i16> %a0, <8 x i16> %a1) {
381   ; CHECK: pmulhuw
382   %res = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
383   ret <8 x i16> %res
384 }
385 declare <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16>, <8 x i16>) nounwind readnone
386
387
388 define <2 x i64> @test_x86_sse2_pmulu_dq(<4 x i32> %a0, <4 x i32> %a1) {
389   ; CHECK: pmuludq
390   %res = call <2 x i64> @llvm.x86.sse2.pmulu.dq(<4 x i32> %a0, <4 x i32> %a1) ; <<2 x i64>> [#uses=1]
391   ret <2 x i64> %res
392 }
393 declare <2 x i64> @llvm.x86.sse2.pmulu.dq(<4 x i32>, <4 x i32>) nounwind readnone
394
395
396 define <2 x i64> @test_x86_sse2_psad_bw(<16 x i8> %a0, <16 x i8> %a1) {
397   ; CHECK: psadbw
398   %res = call <2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8> %a0, <16 x i8> %a1) ; <<2 x i64>> [#uses=1]
399   ret <2 x i64> %res
400 }
401 declare <2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8>, <16 x i8>) nounwind readnone
402
403
404 define <4 x i32> @test_x86_sse2_psll_d(<4 x i32> %a0, <4 x i32> %a1) {
405   ; CHECK: pslld
406   %res = call <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32> %a0, <4 x i32> %a1) ; <<4 x i32>> [#uses=1]
407   ret <4 x i32> %res
408 }
409 declare <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32>, <4 x i32>) nounwind readnone
410
411
412 define <2 x i64> @test_x86_sse2_psll_dq(<2 x i64> %a0) {
413   ; CHECK: pslldq
414   %res = call <2 x i64> @llvm.x86.sse2.psll.dq(<2 x i64> %a0, i32 7) ; <<2 x i64>> [#uses=1]
415   ret <2 x i64> %res
416 }
417 declare <2 x i64> @llvm.x86.sse2.psll.dq(<2 x i64>, i32) nounwind readnone
418
419
420 define <2 x i64> @test_x86_sse2_psll_dq_bs(<2 x i64> %a0) {
421   ; CHECK: pslldq
422   %res = call <2 x i64> @llvm.x86.sse2.psll.dq.bs(<2 x i64> %a0, i32 7) ; <<2 x i64>> [#uses=1]
423   ret <2 x i64> %res
424 }
425 declare <2 x i64> @llvm.x86.sse2.psll.dq.bs(<2 x i64>, i32) nounwind readnone
426
427
428 define <2 x i64> @test_x86_sse2_psll_q(<2 x i64> %a0, <2 x i64> %a1) {
429   ; CHECK: psllq
430   %res = call <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64> %a0, <2 x i64> %a1) ; <<2 x i64>> [#uses=1]
431   ret <2 x i64> %res
432 }
433 declare <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64>, <2 x i64>) nounwind readnone
434
435
436 define <8 x i16> @test_x86_sse2_psll_w(<8 x i16> %a0, <8 x i16> %a1) {
437   ; CHECK: psllw
438   %res = call <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
439   ret <8 x i16> %res
440 }
441 declare <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16>, <8 x i16>) nounwind readnone
442
443
444 define <4 x i32> @test_x86_sse2_pslli_d(<4 x i32> %a0) {
445   ; CHECK: pslld
446   %res = call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %a0, i32 7) ; <<4 x i32>> [#uses=1]
447   ret <4 x i32> %res
448 }
449 declare <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32>, i32) nounwind readnone
450
451
452 define <2 x i64> @test_x86_sse2_pslli_q(<2 x i64> %a0) {
453   ; CHECK: psllq
454   %res = call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %a0, i32 7) ; <<2 x i64>> [#uses=1]
455   ret <2 x i64> %res
456 }
457 declare <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64>, i32) nounwind readnone
458
459
460 define <8 x i16> @test_x86_sse2_pslli_w(<8 x i16> %a0) {
461   ; CHECK: psllw
462   %res = call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %a0, i32 7) ; <<8 x i16>> [#uses=1]
463   ret <8 x i16> %res
464 }
465 declare <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16>, i32) nounwind readnone
466
467
468 define <4 x i32> @test_x86_sse2_psra_d(<4 x i32> %a0, <4 x i32> %a1) {
469   ; CHECK: psrad
470   %res = call <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32> %a0, <4 x i32> %a1) ; <<4 x i32>> [#uses=1]
471   ret <4 x i32> %res
472 }
473 declare <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32>, <4 x i32>) nounwind readnone
474
475
476 define <8 x i16> @test_x86_sse2_psra_w(<8 x i16> %a0, <8 x i16> %a1) {
477   ; CHECK: psraw
478   %res = call <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
479   ret <8 x i16> %res
480 }
481 declare <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16>, <8 x i16>) nounwind readnone
482
483
484 define <4 x i32> @test_x86_sse2_psrai_d(<4 x i32> %a0) {
485   ; CHECK: psrad
486   %res = call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> %a0, i32 7) ; <<4 x i32>> [#uses=1]
487   ret <4 x i32> %res
488 }
489 declare <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32>, i32) nounwind readnone
490
491
492 define <8 x i16> @test_x86_sse2_psrai_w(<8 x i16> %a0) {
493   ; CHECK: psraw
494   %res = call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> %a0, i32 7) ; <<8 x i16>> [#uses=1]
495   ret <8 x i16> %res
496 }
497 declare <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16>, i32) nounwind readnone
498
499
500 define <4 x i32> @test_x86_sse2_psrl_d(<4 x i32> %a0, <4 x i32> %a1) {
501   ; CHECK: psrld
502   %res = call <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32> %a0, <4 x i32> %a1) ; <<4 x i32>> [#uses=1]
503   ret <4 x i32> %res
504 }
505 declare <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32>, <4 x i32>) nounwind readnone
506
507
508 define <2 x i64> @test_x86_sse2_psrl_dq(<2 x i64> %a0) {
509   ; CHECK: psrldq
510   %res = call <2 x i64> @llvm.x86.sse2.psrl.dq(<2 x i64> %a0, i32 7) ; <<2 x i64>> [#uses=1]
511   ret <2 x i64> %res
512 }
513 declare <2 x i64> @llvm.x86.sse2.psrl.dq(<2 x i64>, i32) nounwind readnone
514
515
516 define <2 x i64> @test_x86_sse2_psrl_dq_bs(<2 x i64> %a0) {
517   ; CHECK: psrldq
518   %res = call <2 x i64> @llvm.x86.sse2.psrl.dq.bs(<2 x i64> %a0, i32 7) ; <<2 x i64>> [#uses=1]
519   ret <2 x i64> %res
520 }
521 declare <2 x i64> @llvm.x86.sse2.psrl.dq.bs(<2 x i64>, i32) nounwind readnone
522
523
524 define <2 x i64> @test_x86_sse2_psrl_q(<2 x i64> %a0, <2 x i64> %a1) {
525   ; CHECK: psrlq
526   %res = call <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64> %a0, <2 x i64> %a1) ; <<2 x i64>> [#uses=1]
527   ret <2 x i64> %res
528 }
529 declare <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64>, <2 x i64>) nounwind readnone
530
531
532 define <8 x i16> @test_x86_sse2_psrl_w(<8 x i16> %a0, <8 x i16> %a1) {
533   ; CHECK: psrlw
534   %res = call <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
535   ret <8 x i16> %res
536 }
537 declare <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16>, <8 x i16>) nounwind readnone
538
539
540 define <4 x i32> @test_x86_sse2_psrli_d(<4 x i32> %a0) {
541   ; CHECK: psrld
542   %res = call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %a0, i32 7) ; <<4 x i32>> [#uses=1]
543   ret <4 x i32> %res
544 }
545 declare <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32>, i32) nounwind readnone
546
547
548 define <2 x i64> @test_x86_sse2_psrli_q(<2 x i64> %a0) {
549   ; CHECK: psrlq
550   %res = call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %a0, i32 7) ; <<2 x i64>> [#uses=1]
551   ret <2 x i64> %res
552 }
553 declare <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64>, i32) nounwind readnone
554
555
556 define <8 x i16> @test_x86_sse2_psrli_w(<8 x i16> %a0) {
557   ; CHECK: psrlw
558   %res = call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %a0, i32 7) ; <<8 x i16>> [#uses=1]
559   ret <8 x i16> %res
560 }
561 declare <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16>, i32) nounwind readnone
562
563
564 define <16 x i8> @test_x86_sse2_psubs_b(<16 x i8> %a0, <16 x i8> %a1) {
565   ; CHECK: psubsb
566   %res = call <16 x i8> @llvm.x86.sse2.psubs.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
567   ret <16 x i8> %res
568 }
569 declare <16 x i8> @llvm.x86.sse2.psubs.b(<16 x i8>, <16 x i8>) nounwind readnone
570
571
572 define <8 x i16> @test_x86_sse2_psubs_w(<8 x i16> %a0, <8 x i16> %a1) {
573   ; CHECK: psubsw
574   %res = call <8 x i16> @llvm.x86.sse2.psubs.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
575   ret <8 x i16> %res
576 }
577 declare <8 x i16> @llvm.x86.sse2.psubs.w(<8 x i16>, <8 x i16>) nounwind readnone
578
579
580 define <16 x i8> @test_x86_sse2_psubus_b(<16 x i8> %a0, <16 x i8> %a1) {
581   ; CHECK: psubusb
582   %res = call <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8> %a0, <16 x i8> %a1) ; <<16 x i8>> [#uses=1]
583   ret <16 x i8> %res
584 }
585 declare <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8>, <16 x i8>) nounwind readnone
586
587
588 define <8 x i16> @test_x86_sse2_psubus_w(<8 x i16> %a0, <8 x i16> %a1) {
589   ; CHECK: psubusw
590   %res = call <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16> %a0, <8 x i16> %a1) ; <<8 x i16>> [#uses=1]
591   ret <8 x i16> %res
592 }
593 declare <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16>, <8 x i16>) nounwind readnone
594
595
596 define <2 x double> @test_x86_sse2_sqrt_pd(<2 x double> %a0) {
597   ; CHECK: sqrtpd
598   %res = call <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double> %a0) ; <<2 x double>> [#uses=1]
599   ret <2 x double> %res
600 }
601 declare <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double>) nounwind readnone
602
603
604 define <2 x double> @test_x86_sse2_sqrt_sd(<2 x double> %a0) {
605   ; CHECK: sqrtsd
606   %res = call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %a0) ; <<2 x double>> [#uses=1]
607   ret <2 x double> %res
608 }
609 declare <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double>) nounwind readnone
610
611
612 define void @test_x86_sse2_storel_dq(i8* %a0, <4 x i32> %a1) {
613   ; CHECK: test_x86_sse2_storel_dq
614   ; CHECK: movl
615   ; CHECK: movq
616   call void @llvm.x86.sse2.storel.dq(i8* %a0, <4 x i32> %a1)
617   ret void
618 }
619 declare void @llvm.x86.sse2.storel.dq(i8*, <4 x i32>) nounwind
620
621
622 define void @test_x86_sse2_storeu_dq(i8* %a0, <16 x i8> %a1) {
623   ; CHECK: test_x86_sse2_storeu_dq
624   ; CHECK: movl
625   ; CHECK: movdqu
626   ; add operation forces the execution domain.
627   %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>
628   call void @llvm.x86.sse2.storeu.dq(i8* %a0, <16 x i8> %a2)
629   ret void
630 }
631 declare void @llvm.x86.sse2.storeu.dq(i8*, <16 x i8>) nounwind
632
633
634 define void @test_x86_sse2_storeu_pd(i8* %a0, <2 x double> %a1) {
635   ; CHECK: test_x86_sse2_storeu_pd
636   ; CHECK: movl
637   ; CHECK: movupd
638   ; fadd operation forces the execution domain.
639   %a2 = fadd <2 x double> %a1, <double 0x0, double 0x4200000000000000>
640   call void @llvm.x86.sse2.storeu.pd(i8* %a0, <2 x double> %a2)
641   ret void
642 }
643 declare void @llvm.x86.sse2.storeu.pd(i8*, <2 x double>) nounwind
644
645
646 define <2 x double> @test_x86_sse2_sub_sd(<2 x double> %a0, <2 x double> %a1) {
647   ; CHECK: test_x86_sse2_sub_sd
648   ; CHECK: subsd
649   %res = call <2 x double> @llvm.x86.sse2.sub.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
650   ret <2 x double> %res
651 }
652 declare <2 x double> @llvm.x86.sse2.sub.sd(<2 x double>, <2 x double>) nounwind readnone
653
654
655 define i32 @test_x86_sse2_ucomieq_sd(<2 x double> %a0, <2 x double> %a1) {
656   ; CHECK: ucomisd
657   ; CHECK: sete
658   ; CHECK: movzbl
659   %res = call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
660   ret i32 %res
661 }
662 declare i32 @llvm.x86.sse2.ucomieq.sd(<2 x double>, <2 x double>) nounwind readnone
663
664
665 define i32 @test_x86_sse2_ucomige_sd(<2 x double> %a0, <2 x double> %a1) {
666   ; CHECK: ucomisd
667   ; CHECK: setae
668   ; CHECK: movzbl
669   %res = call i32 @llvm.x86.sse2.ucomige.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
670   ret i32 %res
671 }
672 declare i32 @llvm.x86.sse2.ucomige.sd(<2 x double>, <2 x double>) nounwind readnone
673
674
675 define i32 @test_x86_sse2_ucomigt_sd(<2 x double> %a0, <2 x double> %a1) {
676   ; CHECK: ucomisd
677   ; CHECK: seta
678   ; CHECK: movzbl
679   %res = call i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
680   ret i32 %res
681 }
682 declare i32 @llvm.x86.sse2.ucomigt.sd(<2 x double>, <2 x double>) nounwind readnone
683
684
685 define i32 @test_x86_sse2_ucomile_sd(<2 x double> %a0, <2 x double> %a1) {
686   ; CHECK: ucomisd
687   ; CHECK: setbe
688   ; CHECK: movzbl
689   %res = call i32 @llvm.x86.sse2.ucomile.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
690   ret i32 %res
691 }
692 declare i32 @llvm.x86.sse2.ucomile.sd(<2 x double>, <2 x double>) nounwind readnone
693
694
695 define i32 @test_x86_sse2_ucomilt_sd(<2 x double> %a0, <2 x double> %a1) {
696   ; CHECK: ucomisd
697   ; CHECK: sbbl
698   %res = call i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
699   ret i32 %res
700 }
701 declare i32 @llvm.x86.sse2.ucomilt.sd(<2 x double>, <2 x double>) nounwind readnone
702
703
704 define i32 @test_x86_sse2_ucomineq_sd(<2 x double> %a0, <2 x double> %a1) {
705   ; CHECK: ucomisd
706   ; CHECK: setne
707   ; CHECK: movzbl
708   %res = call i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
709   ret i32 %res
710 }
711 declare i32 @llvm.x86.sse2.ucomineq.sd(<2 x double>, <2 x double>) nounwind readnone