Let llvm::ReplaceInstWithInst copy debug location from old to new instruction.
[oota-llvm.git] / test / CodeGen / X86 / vec_shift8.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE41
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX
4
5 ;
6 ; Vectorized integer shifts
7 ;
8
9 define <2 x i64> @shl_8i16(<8 x i16> %r, <8 x i16> %a) nounwind readnone ssp {
10 entry:
11 ; ALL-NOT: shll
12 ;
13 ; SSE2:       psllw   $12, %xmm1
14 ; SSE2-NEXT:  movdqa  %xmm1, %xmm2
15 ; SSE2-NEXT:  psraw   $15, %xmm2
16 ; SSE2-NEXT:  movdqa  %xmm2, %xmm3
17 ; SSE2-NEXT:  pandn   %xmm0, %xmm3
18 ; SSE2-NEXT:  psllw   $8, %xmm0
19 ; SSE2-NEXT:  pand    %xmm2, %xmm0
20 ; SSE2-NEXT:  por     %xmm3, %xmm0
21 ; SSE2-NEXT:  paddw   %xmm1, %xmm1
22 ; SSE2-NEXT:  movdqa  %xmm1, %xmm2
23 ; SSE2-NEXT:  psraw   $15, %xmm2
24 ; SSE2-NEXT:  movdqa  %xmm2, %xmm3
25 ; SSE2-NEXT:  pandn   %xmm0, %xmm3
26 ; SSE2-NEXT:  psllw   $4, %xmm0
27 ; SSE2-NEXT:  pand    %xmm2, %xmm0
28 ; SSE2-NEXT:  por     %xmm3, %xmm0
29 ; SSE2-NEXT:  paddw   %xmm1, %xmm1
30 ; SSE2-NEXT:  movdqa  %xmm1, %xmm2
31 ; SSE2-NEXT:  psraw   $15, %xmm2
32 ; SSE2-NEXT:  movdqa  %xmm2, %xmm3
33 ; SSE2-NEXT:  pandn   %xmm0, %xmm3
34 ; SSE2-NEXT:  psllw   $2, %xmm0
35 ; SSE2-NEXT:  pand    %xmm2, %xmm0
36 ; SSE2-NEXT:  por     %xmm3, %xmm0
37 ; SSE2-NEXT:  paddw   %xmm1, %xmm1
38 ; SSE2-NEXT:  psraw   $15, %xmm1
39 ; SSE2-NEXT:  movdqa  %xmm1, %xmm2
40 ; SSE2-NEXT:  pandn   %xmm0, %xmm2
41 ; SSE2-NEXT:  psllw   $1, %xmm0
42 ; SSE2-NEXT:  pand    %xmm1, %xmm0
43 ; SSE2-NEXT:  por     %xmm2, %xmm0
44 ; SSE2-NEXT:  retq
45 ;
46 ; SSE41:      movdqa   %xmm0, %xmm2
47 ; SSE41-NEXT: movdqa   %xmm1, %xmm0
48 ; SSE41-NEXT: psllw    $12, %xmm0
49 ; SSE41-NEXT: psllw    $4, %xmm1
50 ; SSE41-NEXT: por      %xmm0, %xmm1
51 ; SSE41-NEXT: movdqa   %xmm1, %xmm3
52 ; SSE41-NEXT: paddw    %xmm3, %xmm3
53 ; SSE41-NEXT: movdqa   %xmm2, %xmm4
54 ; SSE41-NEXT: psllw    $8, %xmm4
55 ; SSE41-NEXT: movdqa   %xmm1, %xmm0
56 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
57 ; SSE41-NEXT: movdqa   %xmm2, %xmm1
58 ; SSE41-NEXT: psllw    $4, %xmm1
59 ; SSE41-NEXT: movdqa   %xmm3, %xmm0
60 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
61 ; SSE41-NEXT: movdqa   %xmm2, %xmm1
62 ; SSE41-NEXT: psllw    $2, %xmm1
63 ; SSE41-NEXT: paddw    %xmm3, %xmm3
64 ; SSE41-NEXT: movdqa   %xmm3, %xmm0
65 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
66 ; SSE41-NEXT: movdqa   %xmm2, %xmm1
67 ; SSE41-NEXT: psllw    $1, %xmm1
68 ; SSE41-NEXT: paddw    %xmm3, %xmm3
69 ; SSE41-NEXT: movdqa   %xmm3, %xmm0
70 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
71 ; SSE41-NEXT: movdqa   %xmm2, %xmm0
72 ; SSE41-NEXT: retq
73 ;
74 ; AVX:        vpsllw    $12, %xmm1, %xmm2
75 ; AVX-NEXT:   vpsllw    $4, %xmm1, %xmm1
76 ; AVX-NEXT:   vpor      %xmm2, %xmm1, %xmm1
77 ; AVX-NEXT:   vpaddw    %xmm1, %xmm1, %xmm2
78 ; AVX-NEXT:   vpsllw    $8, %xmm0, %xmm3
79 ; AVX-NEXT:   vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
80 ; AVX-NEXT:   vpsllw    $4, %xmm0, %xmm1
81 ; AVX-NEXT:   vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
82 ; AVX-NEXT:   vpsllw    $2, %xmm0, %xmm1
83 ; AVX-NEXT:   vpaddw    %xmm2, %xmm2, %xmm2
84 ; AVX-NEXT:   vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
85 ; AVX-NEXT:   vpsllw    $1, %xmm0, %xmm1
86 ; AVX-NEXT:   vpaddw    %xmm2, %xmm2, %xmm2
87 ; AVX-NEXT:   vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
88 ; AVX-NEXT:   retq
89   %shl = shl <8 x i16> %r, %a
90   %tmp2 = bitcast <8 x i16> %shl to <2 x i64>
91   ret <2 x i64> %tmp2
92 }
93
94 define <2 x i64> @shl_16i8(<16 x i8> %r, <16 x i8> %a) nounwind readnone ssp {
95 entry:
96 ; SSE2:       psllw   $5, %xmm1
97 ; SSE2-NEXT:  pxor    %xmm2, %xmm2
98 ; SSE2-NEXT:  pxor    %xmm3, %xmm3
99 ; SSE2-NEXT:  pcmpgtb %xmm1, %xmm3
100 ; SSE2-NEXT:  movdqa  %xmm3, %xmm4
101 ; SSE2-NEXT:  pandn   %xmm0, %xmm4
102 ; SSE2-NEXT:  psllw   $4, %xmm0
103 ; SSE2-NEXT:  pand    {{.*}}(%rip), %xmm0
104 ; SSE2-NEXT:  pand    %xmm3, %xmm0
105 ; SSE2-NEXT:  por     %xmm4, %xmm0
106 ; SSE2-NEXT:  paddb   %xmm1, %xmm1
107 ; SSE2-NEXT:  pxor    %xmm3, %xmm3
108 ; SSE2-NEXT:  pcmpgtb %xmm1, %xmm3
109 ; SSE2-NEXT:  movdqa  %xmm3, %xmm4
110 ; SSE2-NEXT:  pandn   %xmm0, %xmm4
111 ; SSE2-NEXT:  psllw   $2, %xmm0
112 ; SSE2-NEXT:  pand    {{.*}}(%rip), %xmm0
113 ; SSE2-NEXT:  pand    %xmm3, %xmm0
114 ; SSE2-NEXT:  por     %xmm4, %xmm0
115 ; SSE2-NEXT:  paddb   %xmm1, %xmm1
116 ; SSE2-NEXT:  pcmpgtb %xmm1, %xmm2
117 ; SSE2-NEXT:  movdqa  %xmm2, %xmm1
118 ; SSE2-NEXT:  pandn   %xmm0, %xmm1
119 ; SSE2-NEXT:  paddb   %xmm0, %xmm0
120 ; SSE2-NEXT:  pand    %xmm2, %xmm0
121 ; SSE2-NEXT:  por     %xmm1, %xmm0
122 ; SSE2-NEXT:  retq
123 ;
124 ; SSE41:      movdqa   %xmm0, %xmm2
125 ; SSE41-NEXT: psllw    $5, %xmm1
126 ; SSE41-NEXT: movdqa   %xmm2, %xmm3
127 ; SSE41-NEXT: psllw    $4, %xmm3
128 ; SSE41-NEXT: pand     {{.*}}(%rip), %xmm3
129 ; SSE41-NEXT: movdqa   %xmm1, %xmm0
130 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
131 ; SSE41-NEXT: movdqa   %xmm2, %xmm3
132 ; SSE41-NEXT: psllw    $2, %xmm3
133 ; SSE41-NEXT: pand     {{.*}}(%rip), %xmm3
134 ; SSE41-NEXT: paddb    %xmm1, %xmm1
135 ; SSE41-NEXT: movdqa   %xmm1, %xmm0
136 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
137 ; SSE41-NEXT: movdqa   %xmm2, %xmm3
138 ; SSE41-NEXT: paddb    %xmm3, %xmm3
139 ; SSE41-NEXT: paddb    %xmm1, %xmm1
140 ; SSE41-NEXT: movdqa   %xmm1, %xmm0
141 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
142 ; SSE41-NEXT: movdqa   %xmm2, %xmm0
143 ; SSE41-NEXT: retq
144 ;
145 ; AVX:        vpsllw    $5, %xmm1, %xmm1
146 ; AVX-NEXT:   vpsllw    $4, %xmm0, %xmm2
147 ; AVX-NEXT:   vpand     {{.*}}(%rip), %xmm2, %xmm2
148 ; AVX-NEXT:   vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
149 ; AVX-NEXT:   vpsllw    $2, %xmm0, %xmm2
150 ; AVX-NEXT:   vpand     {{.*}}(%rip), %xmm2, %xmm2
151 ; AVX-NEXT:   vpaddb    %xmm1, %xmm1, %xmm1
152 ; AVX-NEXT:   vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
153 ; AVX-NEXT:   vpaddb    %xmm0, %xmm0, %xmm2
154 ; AVX-NEXT:   vpaddb    %xmm1, %xmm1, %xmm1
155 ; AVX-NEXT:   vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
156 ; AVX-NEXT:   retq
157   %shl = shl <16 x i8> %r, %a
158   %tmp2 = bitcast <16 x i8> %shl to <2 x i64>
159   ret <2 x i64> %tmp2
160 }
161
162 define <2 x i64> @ashr_8i16(<8 x i16> %r, <8 x i16> %a) nounwind readnone ssp {
163 entry:
164 ; ALL-NOT: sarw
165 ;
166 ; SSE2:       psllw   $12, %xmm1
167 ; SSE2-NEXT:  movdqa  %xmm1, %xmm2
168 ; SSE2-NEXT:  psraw   $15, %xmm2
169 ; SSE2-NEXT:  movdqa  %xmm2, %xmm3
170 ; SSE2-NEXT:  pandn   %xmm0, %xmm3
171 ; SSE2-NEXT:  psraw   $8, %xmm0
172 ; SSE2-NEXT:  pand    %xmm2, %xmm0
173 ; SSE2-NEXT:  por     %xmm3, %xmm0
174 ; SSE2-NEXT:  paddw   %xmm1, %xmm1
175 ; SSE2-NEXT:  movdqa  %xmm1, %xmm2
176 ; SSE2-NEXT:  psraw   $15, %xmm2
177 ; SSE2-NEXT:  movdqa  %xmm2, %xmm3
178 ; SSE2-NEXT:  pandn   %xmm0, %xmm3
179 ; SSE2-NEXT:  psraw   $4, %xmm0
180 ; SSE2-NEXT:  pand    %xmm2, %xmm0
181 ; SSE2-NEXT:  por     %xmm3, %xmm0
182 ; SSE2-NEXT:  paddw   %xmm1, %xmm1
183 ; SSE2-NEXT:  movdqa  %xmm1, %xmm2
184 ; SSE2-NEXT:  psraw   $15, %xmm2
185 ; SSE2-NEXT:  movdqa  %xmm2, %xmm3
186 ; SSE2-NEXT:  pandn   %xmm0, %xmm3
187 ; SSE2-NEXT:  psraw   $2, %xmm0
188 ; SSE2-NEXT:  pand    %xmm2, %xmm0
189 ; SSE2-NEXT:  por     %xmm3, %xmm0
190 ; SSE2-NEXT:  paddw   %xmm1, %xmm1
191 ; SSE2-NEXT:  psraw   $15, %xmm1
192 ; SSE2-NEXT:  movdqa  %xmm1, %xmm2
193 ; SSE2-NEXT:  pandn   %xmm0, %xmm2
194 ; SSE2-NEXT:  psraw   $1, %xmm0
195 ; SSE2-NEXT:  pand    %xmm1, %xmm0
196 ; SSE2-NEXT:  por     %xmm2, %xmm0
197 ; SSE2-NEXT:  retq
198 ;
199 ; SSE41:      movdqa    %xmm0, %xmm2
200 ; SSE41-NEXT: movdqa    %xmm1, %xmm0
201 ; SSE41-NEXT: psllw     $12, %xmm0
202 ; SSE41-NEXT: psllw     $4, %xmm1
203 ; SSE41-NEXT: por       %xmm0, %xmm1
204 ; SSE41-NEXT: movdqa    %xmm1, %xmm3
205 ; SSE41-NEXT: paddw     %xmm3, %xmm3
206 ; SSE41-NEXT: movdqa    %xmm2, %xmm4
207 ; SSE41-NEXT: psraw     $8, %xmm4
208 ; SSE41-NEXT: movdqa    %xmm1, %xmm0
209 ; SSE41-NEXT: pblendvb  %xmm4, %xmm2
210 ; SSE41-NEXT: movdqa    %xmm2, %xmm1
211 ; SSE41-NEXT: psraw     $4, %xmm1
212 ; SSE41-NEXT: movdqa    %xmm3, %xmm0
213 ; SSE41-NEXT: pblendvb  %xmm1, %xmm2
214 ; SSE41-NEXT: movdqa    %xmm2, %xmm1
215 ; SSE41-NEXT: psraw     $2, %xmm1
216 ; SSE41-NEXT: paddw     %xmm3, %xmm3
217 ; SSE41-NEXT: movdqa    %xmm3, %xmm0
218 ; SSE41-NEXT: pblendvb  %xmm1, %xmm2
219 ; SSE41-NEXT: movdqa    %xmm2, %xmm1
220 ; SSE41-NEXT: psraw     $1, %xmm1
221 ; SSE41-NEXT: paddw     %xmm3, %xmm3
222 ; SSE41-NEXT: movdqa    %xmm3, %xmm0
223 ; SSE41-NEXT: pblendvb  %xmm1, %xmm2
224 ; SSE41-NEXT: movdqa    %xmm2, %xmm0
225 ; SSE41-NEXT: retq
226 ;
227 ; AVX:        vpsllw    $12, %xmm1, %xmm2
228 ; AVX-NEXT:   vpsllw    $4, %xmm1, %xmm1
229 ; AVX-NEXT:   vpor      %xmm2, %xmm1, %xmm1
230 ; AVX-NEXT:   vpaddw    %xmm1, %xmm1, %xmm2
231 ; AVX-NEXT:   vpsraw    $8, %xmm0, %xmm3
232 ; AVX-NEXT:   vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
233 ; AVX-NEXT:   vpsraw    $4, %xmm0, %xmm1
234 ; AVX-NEXT:   vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
235 ; AVX-NEXT:   vpsraw    $2, %xmm0, %xmm1
236 ; AVX-NEXT:   vpaddw    %xmm2, %xmm2, %xmm2
237 ; AVX-NEXT:   vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
238 ; AVX-NEXT:   vpsraw    $1, %xmm0, %xmm1
239 ; AVX-NEXT:   vpaddw    %xmm2, %xmm2, %xmm2
240 ; AVX-NEXT:   vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
241 ; AVX-NEXT:   retq
242   %ashr = ashr <8 x i16> %r, %a
243   %tmp2 = bitcast <8 x i16> %ashr to <2 x i64>
244   ret <2 x i64> %tmp2
245 }
246
247 define <2 x i64> @ashr_16i8(<16 x i8> %r, <16 x i8> %a) nounwind readnone ssp {
248 entry:
249 ; ALL-NOT: sarb
250 ;
251 ; SSE2:       punpckhbw {{.*#}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
252 ; SSE2-NEXT:  psllw     $5, %xmm1
253 ; SSE2-NEXT:  punpckhbw {{.*#}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]
254 ; SSE2-NEXT:  pxor      %xmm3, %xmm3
255 ; SSE2-NEXT:  pxor      %xmm5, %xmm5
256 ; SSE2-NEXT:  pcmpgtw   %xmm4, %xmm5
257 ; SSE2-NEXT:  movdqa    %xmm5, %xmm6
258 ; SSE2-NEXT:  pandn     %xmm2, %xmm6
259 ; SSE2-NEXT:  psraw     $4, %xmm2
260 ; SSE2-NEXT:  pand      %xmm5, %xmm2
261 ; SSE2-NEXT:  por       %xmm6, %xmm2
262 ; SSE2-NEXT:  paddw     %xmm4, %xmm4
263 ; SSE2-NEXT:  pxor      %xmm5, %xmm5
264 ; SSE2-NEXT:  pcmpgtw   %xmm4, %xmm5
265 ; SSE2-NEXT:  movdqa    %xmm5, %xmm6
266 ; SSE2-NEXT:  pandn     %xmm2, %xmm6
267 ; SSE2-NEXT:  psraw     $2, %xmm2
268 ; SSE2-NEXT:  pand      %xmm5, %xmm2
269 ; SSE2-NEXT:  por       %xmm6, %xmm2
270 ; SSE2-NEXT:  paddw     %xmm4, %xmm4
271 ; SSE2-NEXT:  pxor      %xmm5, %xmm5
272 ; SSE2-NEXT:  pcmpgtw   %xmm4, %xmm5
273 ; SSE2-NEXT:  movdqa    %xmm5, %xmm4
274 ; SSE2-NEXT:  pandn     %xmm2, %xmm4
275 ; SSE2-NEXT:  psraw     $1, %xmm2
276 ; SSE2-NEXT:  pand      %xmm5, %xmm2
277 ; SSE2-NEXT:  por       %xmm4, %xmm2
278 ; SSE2-NEXT:  psrlw     $8, %xmm2
279 ; SSE2-NEXT:  punpcklbw {{.*#}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
280 ; SSE2-NEXT:  punpcklbw {{.*#}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
281 ; SSE2-NEXT:  pxor      %xmm4, %xmm4
282 ; SSE2-NEXT:  pcmpgtw   %xmm1, %xmm4
283 ; SSE2-NEXT:  movdqa    %xmm4, %xmm5
284 ; SSE2-NEXT:  pandn     %xmm0, %xmm5
285 ; SSE2-NEXT:  psraw     $4, %xmm0
286 ; SSE2-NEXT:  pand      %xmm4, %xmm0
287 ; SSE2-NEXT:  por       %xmm5, %xmm0
288 ; SSE2-NEXT:  paddw     %xmm1, %xmm1
289 ; SSE2-NEXT:  pxor      %xmm4, %xmm4
290 ; SSE2-NEXT:  pcmpgtw   %xmm1, %xmm4
291 ; SSE2-NEXT:  movdqa    %xmm4, %xmm5
292 ; SSE2-NEXT:  pandn     %xmm0, %xmm5
293 ; SSE2-NEXT:  psraw     $2, %xmm0
294 ; SSE2-NEXT:  pand      %xmm4, %xmm0
295 ; SSE2-NEXT:  por       %xmm5, %xmm0
296 ; SSE2-NEXT:  paddw     %xmm1, %xmm1
297 ; SSE2-NEXT:  pcmpgtw   %xmm1, %xmm3
298 ; SSE2-NEXT:  movdqa    %xmm3, %xmm1
299 ; SSE2-NEXT:  pandn     %xmm0, %xmm1
300 ; SSE2-NEXT:  psraw     $1, %xmm0
301 ; SSE2-NEXT:  pand      %xmm3, %xmm0
302 ; SSE2-NEXT:  por       %xmm1, %xmm0
303 ; SSE2-NEXT:  psrlw     $8, %xmm0
304 ; SSE2-NEXT:  packuswb  %xmm2, %xmm0
305 ; SSE2-NEXT:  retq
306 ;
307 ; SSE41:      movdqa    %xmm0, %xmm2
308 ; SSE41-NEXT: psllw     $5, %xmm1
309 ; SSE41-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]
310 ; SSE41-NEXT: punpckhbw {{.*#}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]
311 ; SSE41-NEXT: movdqa    %xmm3, %xmm4
312 ; SSE41-NEXT: psraw     $4, %xmm4
313 ; SSE41-NEXT: pblendvb  %xmm4, %xmm3
314 ; SSE41-NEXT: movdqa    %xmm3, %xmm4
315 ; SSE41-NEXT: psraw     $2, %xmm4
316 ; SSE41-NEXT: paddw     %xmm0, %xmm0
317 ; SSE41-NEXT: pblendvb  %xmm4, %xmm3
318 ; SSE41-NEXT: movdqa    %xmm3, %xmm4
319 ; SSE41-NEXT: psraw     $1, %xmm4
320 ; SSE41-NEXT: paddw     %xmm0, %xmm0
321 ; SSE41-NEXT: pblendvb  %xmm4, %xmm3
322 ; SSE41-NEXT: psrlw     $8, %xmm3
323 ; SSE41-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]
324 ; SSE41-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]
325 ; SSE41-NEXT: movdqa    %xmm1, %xmm2
326 ; SSE41-NEXT: psraw     $4, %xmm2
327 ; SSE41-NEXT: pblendvb  %xmm2, %xmm1
328 ; SSE41-NEXT: movdqa    %xmm1, %xmm2
329 ; SSE41-NEXT: psraw     $2, %xmm2
330 ; SSE41-NEXT: paddw     %xmm0, %xmm0
331 ; SSE41-NEXT: pblendvb  %xmm2, %xmm1
332 ; SSE41-NEXT: movdqa    %xmm1, %xmm2
333 ; SSE41-NEXT: psraw     $1, %xmm2
334 ; SSE41-NEXT: paddw     %xmm0, %xmm0
335 ; SSE41-NEXT: pblendvb  %xmm2, %xmm1
336 ; SSE41-NEXT: psrlw     $8, %xmm1
337 ; SSE41-NEXT: packuswb  %xmm3, %xmm1
338 ; SSE41-NEXT: movdqa    %xmm1, %xmm0
339 ; SSE41-NEXT: retq
340 ;
341 ; AVX:        vpsllw     $5, %xmm1, %xmm1
342 ; AVX-NEXT:   vpunpckhbw {{.*#}} xmm2 = 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]
343 ; AVX-NEXT:   vpunpckhbw {{.*#}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
344 ; AVX-NEXT:   vpsraw     $4, %xmm3, %xmm4
345 ; AVX-NEXT:   vpblendvb  %xmm2, %xmm4, %xmm3, %xmm3
346 ; AVX-NEXT:   vpsraw     $2, %xmm3, %xmm4
347 ; AVX-NEXT:   vpaddw     %xmm2, %xmm2, %xmm2
348 ; AVX-NEXT:   vpblendvb  %xmm2, %xmm4, %xmm3, %xmm3
349 ; AVX-NEXT:   vpsraw     $1, %xmm3, %xmm4
350 ; AVX-NEXT:   vpaddw     %xmm2, %xmm2, %xmm2
351 ; AVX-NEXT:   vpblendvb  %xmm2, %xmm4, %xmm3, %xmm2
352 ; AVX-NEXT:   vpsrlw     $8, %xmm2, %xmm2
353 ; AVX-NEXT:   vpunpcklbw {{.*#}} xmm1 = 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]
354 ; AVX-NEXT:   vpunpcklbw {{.*#}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
355 ; AVX-NEXT:   vpsraw     $4, %xmm0, %xmm3
356 ; AVX-NEXT:   vpblendvb  %xmm1, %xmm3, %xmm0, %xmm0
357 ; AVX-NEXT:   vpsraw     $2, %xmm0, %xmm3
358 ; AVX-NEXT:   vpaddw     %xmm1, %xmm1, %xmm1
359 ; AVX-NEXT:   vpblendvb  %xmm1, %xmm3, %xmm0, %xmm0
360 ; AVX-NEXT:   vpsraw     $1, %xmm0, %xmm3
361 ; AVX-NEXT:   vpaddw     %xmm1, %xmm1, %xmm1
362 ; AVX-NEXT:   vpblendvb  %xmm1, %xmm3, %xmm0, %xmm0
363 ; AVX-NEXT:   vpsrlw     $8, %xmm0, %xmm0
364 ; AVX-NEXT:   vpackuswb  %xmm2, %xmm0, %xmm0
365 ; AVX-NEXT:   retq
366   %ashr = ashr <16 x i8> %r, %a
367   %tmp2 = bitcast <16 x i8> %ashr to <2 x i64>
368   ret <2 x i64> %tmp2
369 }
370
371 define <2 x i64> @lshr_8i16(<8 x i16> %r, <8 x i16> %a) nounwind readnone ssp {
372 entry:
373 ; ALL-NOT: shrl
374 ;
375 ; SSE2:       psllw   $12, %xmm1
376 ; SSE2-NEXT:  movdqa  %xmm1, %xmm2
377 ; SSE2-NEXT:  psraw   $15, %xmm2
378 ; SSE2-NEXT:  movdqa  %xmm2, %xmm3
379 ; SSE2-NEXT:  pandn   %xmm0, %xmm3
380 ; SSE2-NEXT:  psrlw   $8, %xmm0
381 ; SSE2-NEXT:  pand    %xmm2, %xmm0
382 ; SSE2-NEXT:  por     %xmm3, %xmm0
383 ; SSE2-NEXT:  paddw   %xmm1, %xmm1
384 ; SSE2-NEXT:  movdqa  %xmm1, %xmm2
385 ; SSE2-NEXT:  psraw   $15, %xmm2
386 ; SSE2-NEXT:  movdqa  %xmm2, %xmm3
387 ; SSE2-NEXT:  pandn   %xmm0, %xmm3
388 ; SSE2-NEXT:  psrlw   $4, %xmm0
389 ; SSE2-NEXT:  pand    %xmm2, %xmm0
390 ; SSE2-NEXT:  por     %xmm3, %xmm0
391 ; SSE2-NEXT:  paddw   %xmm1, %xmm1
392 ; SSE2-NEXT:  movdqa  %xmm1, %xmm2
393 ; SSE2-NEXT:  psraw   $15, %xmm2
394 ; SSE2-NEXT:  movdqa  %xmm2, %xmm3
395 ; SSE2-NEXT:  pandn   %xmm0, %xmm3
396 ; SSE2-NEXT:  psrlw   $2, %xmm0
397 ; SSE2-NEXT:  pand    %xmm2, %xmm0
398 ; SSE2-NEXT:  por     %xmm3, %xmm0
399 ; SSE2-NEXT:  paddw   %xmm1, %xmm1
400 ; SSE2-NEXT:  psraw   $15, %xmm1
401 ; SSE2-NEXT:  movdqa  %xmm1, %xmm2
402 ; SSE2-NEXT:  pandn   %xmm0, %xmm2
403 ; SSE2-NEXT:  psrlw   $1, %xmm0
404 ; SSE2-NEXT:  pand    %xmm1, %xmm0
405 ; SSE2-NEXT:  por     %xmm2, %xmm0
406 ; SSE2-NEXT:  retq
407 ;
408 ; SSE41:      movdqa    %xmm0, %xmm2
409 ; SSE41-NEXT: movdqa    %xmm1, %xmm0
410 ; SSE41-NEXT: psllw     $12, %xmm0
411 ; SSE41-NEXT: psllw     $4, %xmm1
412 ; SSE41-NEXT: por       %xmm0, %xmm1
413 ; SSE41-NEXT: movdqa    %xmm1, %xmm3
414 ; SSE41-NEXT: paddw     %xmm3, %xmm3
415 ; SSE41-NEXT: movdqa    %xmm2, %xmm4
416 ; SSE41-NEXT: psrlw     $8, %xmm4
417 ; SSE41-NEXT: movdqa    %xmm1, %xmm0
418 ; SSE41-NEXT: pblendvb  %xmm4, %xmm2
419 ; SSE41-NEXT: movdqa    %xmm2, %xmm1
420 ; SSE41-NEXT: psrlw     $4, %xmm1
421 ; SSE41-NEXT: movdqa    %xmm3, %xmm0
422 ; SSE41-NEXT: pblendvb  %xmm1, %xmm2
423 ; SSE41-NEXT: movdqa    %xmm2, %xmm1
424 ; SSE41-NEXT: psrlw     $2, %xmm1
425 ; SSE41-NEXT: paddw     %xmm3, %xmm3
426 ; SSE41-NEXT: movdqa    %xmm3, %xmm0
427 ; SSE41-NEXT: pblendvb  %xmm1, %xmm2
428 ; SSE41-NEXT: movdqa    %xmm2, %xmm1
429 ; SSE41-NEXT: psrlw     $1, %xmm1
430 ; SSE41-NEXT: paddw     %xmm3, %xmm3
431 ; SSE41-NEXT: movdqa    %xmm3, %xmm0
432 ; SSE41-NEXT: pblendvb  %xmm1, %xmm2
433 ; SSE41-NEXT: movdqa    %xmm2, %xmm0
434 ; SSE41-NEXT: retq
435 ;
436 ; AVX:        vpsllw    $12, %xmm1, %xmm2
437 ; AVX-NEXT:   vpsllw    $4, %xmm1, %xmm1
438 ; AVX-NEXT:   vpor      %xmm2, %xmm1, %xmm1
439 ; AVX-NEXT:   vpaddw    %xmm1, %xmm1, %xmm2
440 ; AVX-NEXT:   vpsrlw    $8, %xmm0, %xmm3
441 ; AVX-NEXT:   vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
442 ; AVX-NEXT:   vpsrlw    $4, %xmm0, %xmm1
443 ; AVX-NEXT:   vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
444 ; AVX-NEXT:   vpsrlw    $2, %xmm0, %xmm1
445 ; AVX-NEXT:   vpaddw    %xmm2, %xmm2, %xmm2
446 ; AVX-NEXT:   vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
447 ; AVX-NEXT:   vpsrlw    $1, %xmm0, %xmm1
448 ; AVX-NEXT:   vpaddw    %xmm2, %xmm2, %xmm2
449 ; AVX-NEXT:   vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
450 ; AVX-NEXT:   retq
451   %lshr = lshr <8 x i16> %r, %a
452   %tmp2 = bitcast <8 x i16> %lshr to <2 x i64>
453   ret <2 x i64> %tmp2
454 }
455
456 define <2 x i64> @lshr_16i8(<16 x i8> %r, <16 x i8> %a) nounwind readnone ssp {
457 entry:
458 ; ALL-NOT: shrb
459 ;
460 ; SSE2:       psllw   $5, %xmm1
461 ; SSE2-NEXT:  pxor    %xmm2, %xmm2
462 ; SSE2-NEXT:  pxor    %xmm3, %xmm3
463 ; SSE2-NEXT:  pcmpgtb %xmm1, %xmm3
464 ; SSE2-NEXT:  movdqa  %xmm3, %xmm4
465 ; SSE2-NEXT:  pandn   %xmm0, %xmm4
466 ; SSE2-NEXT:  psrlw   $4, %xmm0
467 ; SSE2-NEXT:  pand    {{.*}}(%rip), %xmm0
468 ; SSE2-NEXT:  pand    %xmm3, %xmm0
469 ; SSE2-NEXT:  por     %xmm4, %xmm0
470 ; SSE2-NEXT:  paddb   %xmm1, %xmm1
471 ; SSE2-NEXT:  pxor    %xmm3, %xmm3
472 ; SSE2-NEXT:  pcmpgtb %xmm1, %xmm3
473 ; SSE2-NEXT:  movdqa  %xmm3, %xmm4
474 ; SSE2-NEXT:  pandn   %xmm0, %xmm4
475 ; SSE2-NEXT:  psrlw   $2, %xmm0
476 ; SSE2-NEXT:  pand    {{.*}}(%rip), %xmm0
477 ; SSE2-NEXT:  pand    %xmm3, %xmm0
478 ; SSE2-NEXT:  por     %xmm4, %xmm0
479 ; SSE2-NEXT:  paddb   %xmm1, %xmm1
480 ; SSE2-NEXT:  pcmpgtb %xmm1, %xmm2
481 ; SSE2-NEXT:  movdqa  %xmm2, %xmm1
482 ; SSE2-NEXT:  pandn   %xmm0, %xmm1
483 ; SSE2-NEXT:  psrlw   $1, %xmm0
484 ; SSE2-NEXT:  pand    {{.*}}(%rip), %xmm0
485 ; SSE2-NEXT:  pand    %xmm2, %xmm0
486 ; SSE2-NEXT:  por     %xmm1, %xmm0
487 ; SSE2-NEXT:  retq
488 ;
489 ; SSE41:      movdqa   %xmm0, %xmm2
490 ; SSE41-NEXT: psllw    $5, %xmm1
491 ; SSE41-NEXT: movdqa   %xmm2, %xmm3
492 ; SSE41-NEXT: psrlw    $4, %xmm3
493 ; SSE41-NEXT: pand     {{.*}}(%rip), %xmm3
494 ; SSE41-NEXT: movdqa   %xmm1, %xmm0
495 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
496 ; SSE41-NEXT: movdqa   %xmm2, %xmm3
497 ; SSE41-NEXT: psrlw    $2, %xmm3
498 ; SSE41-NEXT: pand     {{.*}}(%rip), %xmm3
499 ; SSE41-NEXT: paddb    %xmm1, %xmm1
500 ; SSE41-NEXT: movdqa   %xmm1, %xmm0
501 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
502 ; SSE41-NEXT: movdqa   %xmm2, %xmm3
503 ; SSE41-NEXT: psrlw    $1, %xmm3
504 ; SSE41-NEXT: pand     {{.*}}(%rip), %xmm3
505 ; SSE41-NEXT: paddb    %xmm1, %xmm1
506 ; SSE41-NEXT: movdqa   %xmm1, %xmm0
507 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
508 ; SSE41-NEXT: movdqa   %xmm2, %xmm0
509 ; SSE41-NEXT: retq
510 ;
511 ; AVX:        vpsllw    $5, %xmm1, %xmm1
512 ; AVX-NEXT:   vpsrlw    $4, %xmm0, %xmm2
513 ; AVX-NEXT:   vpand     {{.*}}(%rip), %xmm2, %xmm2
514 ; AVX-NEXT:   vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
515 ; AVX-NEXT:   vpsrlw    $2, %xmm0, %xmm2
516 ; AVX-NEXT:   vpand     {{.*}}(%rip), %xmm2, %xmm2
517 ; AVX-NEXT:   vpaddb    %xmm1, %xmm1, %xmm1
518 ; AVX-NEXT:   vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
519 ; AVX-NEXT:   vpsrlw    $1, %xmm0, %xmm2
520 ; AVX-NEXT:   vpand     {{.*}}(%rip), %xmm2, %xmm2
521 ; AVX-NEXT:   vpaddb    %xmm1, %xmm1, %xmm1
522 ; AVX-NEXT:   vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
523 ; AVX-NEXT:   retq
524   %lshr = lshr <16 x i8> %r, %a
525   %tmp2 = bitcast <16 x i8> %lshr to <2 x i64>
526   ret <2 x i64> %tmp2
527 }