[X86] Add intrinsics for reading and writing to the flags register
[oota-llvm.git] / test / CodeGen / X86 / ssse3-intrinsics-fast-isel.ll
1 ; RUN: llc < %s -fast-isel -mtriple=i386-unknown-unknown -mattr=ssse3 | FileCheck %s --check-prefix=ALL  --check-prefix=X32
2 ; RUN: llc < %s -fast-isel -mtriple=x86_64-unknown-unknown -mattr=ssse3 | FileCheck %s --check-prefix=ALL  --check-prefix=X64
3
4 ; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/ssse3-builtins.c
5
6 define <2 x i64> @test_mm_abs_epi8(<2 x i64> %a0) {
7 ; X32-LABEL: test_mm_abs_epi8:
8 ; X32:       # BB#0:
9 ; X32-NEXT:    pabsb %xmm0, %xmm0
10 ; X32-NEXT:    retl
11 ;
12 ; X64-LABEL: test_mm_abs_epi8:
13 ; X64:       # BB#0:
14 ; X64-NEXT:    pabsb %xmm0, %xmm0
15 ; X64-NEXT:    retq
16   %arg = bitcast <2 x i64> %a0 to <16 x i8>
17   %call = call <16 x i8> @llvm.x86.ssse3.pabs.b.128(<16 x i8> %arg)
18   %res = bitcast <16 x i8> %call to <2 x i64>
19   ret <2 x i64> %res
20 }
21 declare <16 x i8> @llvm.x86.ssse3.pabs.b.128(<16 x i8>) nounwind readnone
22
23 define <2 x i64> @test_mm_abs_epi16(<2 x i64> %a0) {
24 ; X32-LABEL: test_mm_abs_epi16:
25 ; X32:       # BB#0:
26 ; X32-NEXT:    pabsw %xmm0, %xmm0
27 ; X32-NEXT:    retl
28 ;
29 ; X64-LABEL: test_mm_abs_epi16:
30 ; X64:       # BB#0:
31 ; X64-NEXT:    pabsw %xmm0, %xmm0
32 ; X64-NEXT:    retq
33   %arg = bitcast <2 x i64> %a0 to <8 x i16>
34   %call = call <8 x i16> @llvm.x86.ssse3.pabs.w.128(<8 x i16> %arg)
35   %res = bitcast <8 x i16> %call to <2 x i64>
36   ret <2 x i64> %res
37 }
38 declare <8 x i16> @llvm.x86.ssse3.pabs.w.128(<8 x i16>) nounwind readnone
39
40 define <2 x i64> @test_mm_abs_epi32(<2 x i64> %a0) {
41 ; X32-LABEL: test_mm_abs_epi32:
42 ; X32:       # BB#0:
43 ; X32-NEXT:    pabsd %xmm0, %xmm0
44 ; X32-NEXT:    retl
45 ;
46 ; X64-LABEL: test_mm_abs_epi32:
47 ; X64:       # BB#0:
48 ; X64-NEXT:    pabsd %xmm0, %xmm0
49 ; X64-NEXT:    retq
50   %arg = bitcast <2 x i64> %a0 to <4 x i32>
51   %call = call <4 x i32> @llvm.x86.ssse3.pabs.d.128(<4 x i32> %arg)
52   %res = bitcast <4 x i32> %call to <2 x i64>
53   ret <2 x i64> %res
54 }
55 declare <4 x i32> @llvm.x86.ssse3.pabs.d.128(<4 x i32>) nounwind readnone
56
57 define <2 x i64> @test_mm_alignr_epi8(<2 x i64> %a0, <2 x i64> %a1) {
58 ; X32-LABEL: test_mm_alignr_epi8:
59 ; X32:       # BB#0:
60 ; X32-NEXT:    palignr {{.*#}} xmm1 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1]
61 ; X32-NEXT:    movdqa %xmm1, %xmm0
62 ; X32-NEXT:    retl
63 ;
64 ; X64-LABEL: test_mm_alignr_epi8:
65 ; X64:       # BB#0:
66 ; X64-NEXT:    palignr {{.*#}} xmm1 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1]
67 ; X64-NEXT:    movdqa %xmm1, %xmm0
68 ; X64-NEXT:    retq
69   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
70   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
71   %shuf = shufflevector <16 x i8> %arg0, <16 x i8> %arg1, <16 x i32> <i32 2, i32 3, i32 4, 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>
72   %res = bitcast <16 x i8> %shuf to <2 x i64>
73   ret <2 x i64> %res
74 }
75
76 define <2 x i64> @test_mm_hadd_epi16(<2 x i64> %a0, <2 x i64> %a1) {
77 ; X32-LABEL: test_mm_hadd_epi16:
78 ; X32:       # BB#0:
79 ; X32-NEXT:    phaddw %xmm1, %xmm0
80 ; X32-NEXT:    retl
81 ;
82 ; X64-LABEL: test_mm_hadd_epi16:
83 ; X64:       # BB#0:
84 ; X64-NEXT:    phaddw %xmm1, %xmm0
85 ; X64-NEXT:    retq
86   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
87   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
88   %call = call <8 x i16> @llvm.x86.ssse3.phadd.w.128(<8 x i16> %arg0, <8 x i16> %arg1)
89   %res = bitcast <8 x i16> %call to <2 x i64>
90   ret <2 x i64> %res
91 }
92 declare <8 x i16> @llvm.x86.ssse3.phadd.w.128(<8 x i16>, <8 x i16>) nounwind readnone
93
94 define <2 x i64> @test_mm_hadd_epi32(<2 x i64> %a0, <2 x i64> %a1) {
95 ; X32-LABEL: test_mm_hadd_epi32:
96 ; X32:       # BB#0:
97 ; X32-NEXT:    phaddd %xmm1, %xmm0
98 ; X32-NEXT:    retl
99 ;
100 ; X64-LABEL: test_mm_hadd_epi32:
101 ; X64:       # BB#0:
102 ; X64-NEXT:    phaddd %xmm1, %xmm0
103 ; X64-NEXT:    retq
104   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
105   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
106   %call = call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> %arg0, <4 x i32> %arg1)
107   %res = bitcast <4 x i32> %call to <2 x i64>
108   ret <2 x i64> %res
109 }
110 declare <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32>, <4 x i32>) nounwind readnone
111
112 define <2 x i64> @test_mm_hadds_epi16(<2 x i64> %a0, <2 x i64> %a1) {
113 ; X32-LABEL: test_mm_hadds_epi16:
114 ; X32:       # BB#0:
115 ; X32-NEXT:    phaddsw %xmm1, %xmm0
116 ; X32-NEXT:    retl
117 ;
118 ; X64-LABEL: test_mm_hadds_epi16:
119 ; X64:       # BB#0:
120 ; X64-NEXT:    phaddsw %xmm1, %xmm0
121 ; X64-NEXT:    retq
122   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
123   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
124   %call = call <8 x i16> @llvm.x86.ssse3.phadd.sw.128(<8 x i16> %arg0, <8 x i16> %arg1)
125   %res = bitcast <8 x i16> %call to <2 x i64>
126   ret <2 x i64> %res
127 }
128 declare <8 x i16> @llvm.x86.ssse3.phadd.sw.128(<8 x i16>, <8 x i16>) nounwind readnone
129
130 define <2 x i64> @test_mm_hsub_epi16(<2 x i64> %a0, <2 x i64> %a1) {
131 ; X32-LABEL: test_mm_hsub_epi16:
132 ; X32:       # BB#0:
133 ; X32-NEXT:    phsubw %xmm1, %xmm0
134 ; X32-NEXT:    retl
135 ;
136 ; X64-LABEL: test_mm_hsub_epi16:
137 ; X64:       # BB#0:
138 ; X64-NEXT:    phsubw %xmm1, %xmm0
139 ; X64-NEXT:    retq
140   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
141   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
142   %call = call <8 x i16> @llvm.x86.ssse3.phsub.w.128(<8 x i16> %arg0, <8 x i16> %arg1)
143   %res = bitcast <8 x i16> %call to <2 x i64>
144   ret <2 x i64> %res
145 }
146 declare <8 x i16> @llvm.x86.ssse3.phsub.w.128(<8 x i16>, <8 x i16>) nounwind readnone
147
148 define <2 x i64> @test_mm_hsub_epi32(<2 x i64> %a0, <2 x i64> %a1) {
149 ; X32-LABEL: test_mm_hsub_epi32:
150 ; X32:       # BB#0:
151 ; X32-NEXT:    phsubd %xmm1, %xmm0
152 ; X32-NEXT:    retl
153 ;
154 ; X64-LABEL: test_mm_hsub_epi32:
155 ; X64:       # BB#0:
156 ; X64-NEXT:    phsubd %xmm1, %xmm0
157 ; X64-NEXT:    retq
158   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
159   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
160   %call = call <4 x i32> @llvm.x86.ssse3.phsub.d.128(<4 x i32> %arg0, <4 x i32> %arg1)
161   %res = bitcast <4 x i32> %call to <2 x i64>
162   ret <2 x i64> %res
163 }
164 declare <4 x i32> @llvm.x86.ssse3.phsub.d.128(<4 x i32>, <4 x i32>) nounwind readnone
165
166 define <2 x i64> @test_mm_hsubs_epi16(<2 x i64> %a0, <2 x i64> %a1) {
167 ; X32-LABEL: test_mm_hsubs_epi16:
168 ; X32:       # BB#0:
169 ; X32-NEXT:    phsubsw %xmm1, %xmm0
170 ; X32-NEXT:    retl
171 ;
172 ; X64-LABEL: test_mm_hsubs_epi16:
173 ; X64:       # BB#0:
174 ; X64-NEXT:    phsubsw %xmm1, %xmm0
175 ; X64-NEXT:    retq
176   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
177   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
178   %call = call <8 x i16> @llvm.x86.ssse3.phsub.sw.128(<8 x i16> %arg0, <8 x i16> %arg1)
179   %res = bitcast <8 x i16> %call to <2 x i64>
180   ret <2 x i64> %res
181 }
182 declare <8 x i16> @llvm.x86.ssse3.phsub.sw.128(<8 x i16>, <8 x i16>) nounwind readnone
183
184 define <2 x i64> @test_mm_maddubs_epi16(<2 x i64> %a0, <2 x i64> %a1) {
185 ; X32-LABEL: test_mm_maddubs_epi16:
186 ; X32:       # BB#0:
187 ; X32-NEXT:    pmaddubsw %xmm1, %xmm0
188 ; X32-NEXT:    retl
189 ;
190 ; X64-LABEL: test_mm_maddubs_epi16:
191 ; X64:       # BB#0:
192 ; X64-NEXT:    pmaddubsw %xmm1, %xmm0
193 ; X64-NEXT:    retq
194   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
195   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
196   %call = call <8 x i16> @llvm.x86.ssse3.pmadd.ub.sw.128(<16 x i8> %arg0, <16 x i8> %arg1)
197   %res = bitcast <8 x i16> %call to <2 x i64>
198   ret <2 x i64> %res
199 }
200 declare <8 x i16> @llvm.x86.ssse3.pmadd.ub.sw.128(<16 x i8>, <16 x i8>) nounwind readnone
201
202 define <2 x i64> @test_mm_mulhrs_epi16(<2 x i64> %a0, <2 x i64> %a1) {
203 ; X32-LABEL: test_mm_mulhrs_epi16:
204 ; X32:       # BB#0:
205 ; X32-NEXT:    pmulhrsw %xmm1, %xmm0
206 ; X32-NEXT:    retl
207 ;
208 ; X64-LABEL: test_mm_mulhrs_epi16:
209 ; X64:       # BB#0:
210 ; X64-NEXT:    pmulhrsw %xmm1, %xmm0
211 ; X64-NEXT:    retq
212   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
213   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
214   %call = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> %arg0, <8 x i16> %arg1)
215   %res = bitcast <8 x i16> %call to <2 x i64>
216   ret <2 x i64> %res
217 }
218 declare <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16>, <8 x i16>) nounwind readnone
219
220 define <2 x i64> @test_mm_shuffle_epi8(<2 x i64> %a0, <2 x i64> %a1) {
221 ; X32-LABEL: test_mm_shuffle_epi8:
222 ; X32:       # BB#0:
223 ; X32-NEXT:    pshufb %xmm1, %xmm0
224 ; X32-NEXT:    retl
225 ;
226 ; X64-LABEL: test_mm_shuffle_epi8:
227 ; X64:       # BB#0:
228 ; X64-NEXT:    pshufb %xmm1, %xmm0
229 ; X64-NEXT:    retq
230   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
231   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
232   %call = call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %arg0, <16 x i8> %arg1)
233   %res = bitcast <16 x i8> %call to <2 x i64>
234   ret <2 x i64> %res
235 }
236 declare <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8>, <16 x i8>) nounwind readnone
237
238 define <2 x i64> @test_mm_sign_epi8(<2 x i64> %a0, <2 x i64> %a1) {
239 ; X32-LABEL: test_mm_sign_epi8:
240 ; X32:       # BB#0:
241 ; X32-NEXT:    psignb %xmm1, %xmm0
242 ; X32-NEXT:    retl
243 ;
244 ; X64-LABEL: test_mm_sign_epi8:
245 ; X64:       # BB#0:
246 ; X64-NEXT:    psignb %xmm1, %xmm0
247 ; X64-NEXT:    retq
248   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
249   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
250   %call = call <16 x i8> @llvm.x86.ssse3.psign.b.128(<16 x i8> %arg0, <16 x i8> %arg1)
251   %res = bitcast <16 x i8> %call to <2 x i64>
252   ret <2 x i64> %res
253 }
254 declare <16 x i8> @llvm.x86.ssse3.psign.b.128(<16 x i8>, <16 x i8>) nounwind readnone
255
256 define <2 x i64> @test_mm_sign_epi16(<2 x i64> %a0, <2 x i64> %a1) {
257 ; X32-LABEL: test_mm_sign_epi16:
258 ; X32:       # BB#0:
259 ; X32-NEXT:    psignw %xmm1, %xmm0
260 ; X32-NEXT:    retl
261 ;
262 ; X64-LABEL: test_mm_sign_epi16:
263 ; X64:       # BB#0:
264 ; X64-NEXT:    psignw %xmm1, %xmm0
265 ; X64-NEXT:    retq
266   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
267   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
268   %call = call <8 x i16> @llvm.x86.ssse3.psign.w.128(<8 x i16> %arg0, <8 x i16> %arg1)
269   %res = bitcast <8 x i16> %call to <2 x i64>
270   ret <2 x i64> %res
271 }
272 declare <8 x i16> @llvm.x86.ssse3.psign.w.128(<8 x i16>, <8 x i16>) nounwind readnone
273
274 define <2 x i64> @test_mm_sign_epi32(<2 x i64> %a0, <2 x i64> %a1) {
275 ; X32-LABEL: test_mm_sign_epi32:
276 ; X32:       # BB#0:
277 ; X32-NEXT:    psignd %xmm1, %xmm0
278 ; X32-NEXT:    retl
279 ;
280 ; X64-LABEL: test_mm_sign_epi32:
281 ; X64:       # BB#0:
282 ; X64-NEXT:    psignd %xmm1, %xmm0
283 ; X64-NEXT:    retq
284   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
285   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
286   %call = call <4 x i32> @llvm.x86.ssse3.psign.d.128(<4 x i32> %arg0, <4 x i32> %arg1)
287   %res = bitcast <4 x i32> %call to <2 x i64>
288   ret <2 x i64> %res
289 }
290 declare <4 x i32> @llvm.x86.ssse3.psign.d.128(<4 x i32>, <4 x i32>) nounwind readnone