36dabe48764c179a06fde209b17afbf680833b7a
[oota-llvm.git] / test / CodeGen / X86 / vector-shift-lshr-256.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
6
7 ;
8 ; Variable Shifts
9 ;
10
11 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
12 ; AVX1-LABEL: var_shift_v4i64:
13 ; AVX1:       # BB#0:
14 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
15 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
16 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm3, %xmm4
17 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
18 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm3, %xmm2
19 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
20 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm3
21 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
22 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
23 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
24 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
25 ; AVX1-NEXT:    retq
26 ;
27 ; AVX2-LABEL: var_shift_v4i64:
28 ; AVX2:       # BB#0:
29 ; AVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0
30 ; AVX2-NEXT:    retq
31 ;
32 ; XOPAVX1-LABEL: var_shift_v4i64:
33 ; XOPAVX1:       # BB#0:
34 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
35 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
36 ; XOPAVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm2
37 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
38 ; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm4, %xmm2
39 ; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm3, %xmm1
40 ; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
41 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
42 ; XOPAVX1-NEXT:    retq
43 ;
44 ; XOPAVX2-LABEL: var_shift_v4i64:
45 ; XOPAVX2:       # BB#0:
46 ; XOPAVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0
47 ; XOPAVX2-NEXT:    retq
48   %shift = lshr <4 x i64> %a, %b
49   ret <4 x i64> %shift
50 }
51
52 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
53 ; AVX1-LABEL: var_shift_v8i32:
54 ; AVX1:       # BB#0:
55 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
56 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
57 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
58 ; AVX1-NEXT:    vpsrld %xmm4, %xmm2, %xmm4
59 ; AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm5
60 ; AVX1-NEXT:    vpsrld %xmm5, %xmm2, %xmm5
61 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
62 ; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
63 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
64 ; AVX1-NEXT:    vpsrld %xmm6, %xmm2, %xmm6
65 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
66 ; AVX1-NEXT:    vpsrld %xmm3, %xmm2, %xmm2
67 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
68 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
69 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
70 ; AVX1-NEXT:    vpsrld %xmm3, %xmm0, %xmm3
71 ; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm4
72 ; AVX1-NEXT:    vpsrld %xmm4, %xmm0, %xmm4
73 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
74 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]
75 ; AVX1-NEXT:    vpsrld %xmm4, %xmm0, %xmm4
76 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
77 ; AVX1-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
78 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
79 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
80 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
81 ; AVX1-NEXT:    retq
82 ;
83 ; AVX2-LABEL: var_shift_v8i32:
84 ; AVX2:       # BB#0:
85 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
86 ; AVX2-NEXT:    retq
87 ;
88 ; XOPAVX1-LABEL: var_shift_v8i32:
89 ; XOPAVX1:       # BB#0:
90 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
91 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
92 ; XOPAVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2
93 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
94 ; XOPAVX1-NEXT:    vpshld %xmm2, %xmm4, %xmm2
95 ; XOPAVX1-NEXT:    vpsubd %xmm1, %xmm3, %xmm1
96 ; XOPAVX1-NEXT:    vpshld %xmm1, %xmm0, %xmm0
97 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
98 ; XOPAVX1-NEXT:    retq
99 ;
100 ; XOPAVX2-LABEL: var_shift_v8i32:
101 ; XOPAVX2:       # BB#0:
102 ; XOPAVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
103 ; XOPAVX2-NEXT:    retq
104   %shift = lshr <8 x i32> %a, %b
105   ret <8 x i32> %shift
106 }
107
108 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
109 ; AVX1-LABEL: var_shift_v16i16:
110 ; AVX1:       # BB#0:
111 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
112 ; AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3
113 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
114 ; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
115 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3
116 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
117 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm5
118 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
119 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm4
120 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
121 ; AVX1-NEXT:    vpsrlw $2, %xmm2, %xmm4
122 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
123 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
124 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm4
125 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
126 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
127 ; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3
128 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
129 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
130 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3
131 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm4
132 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
133 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm1
134 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
135 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm1
136 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
137 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
138 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm1
139 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
140 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
141 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
142 ; AVX1-NEXT:    retq
143 ;
144 ; AVX2-LABEL: var_shift_v16i16:
145 ; AVX2:       # BB#0:
146 ; AVX2-NEXT:    vpxor %ymm2, %ymm2, %ymm2
147 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
148 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
149 ; AVX2-NEXT:    vpsrlvd %ymm3, %ymm4, %ymm3
150 ; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
151 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
152 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
153 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
154 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
155 ; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
156 ; AVX2-NEXT:    retq
157 ;
158 ; XOPAVX1-LABEL: var_shift_v16i16:
159 ; XOPAVX1:       # BB#0:
160 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
161 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
162 ; XOPAVX1-NEXT:    vpsubw %xmm2, %xmm3, %xmm2
163 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
164 ; XOPAVX1-NEXT:    vpshlw %xmm2, %xmm4, %xmm2
165 ; XOPAVX1-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
166 ; XOPAVX1-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
167 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
168 ; XOPAVX1-NEXT:    retq
169 ;
170 ; XOPAVX2-LABEL: var_shift_v16i16:
171 ; XOPAVX2:       # BB#0:
172 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
173 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
174 ; XOPAVX2-NEXT:    vpsubw %xmm2, %xmm3, %xmm2
175 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
176 ; XOPAVX2-NEXT:    vpshlw %xmm2, %xmm4, %xmm2
177 ; XOPAVX2-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
178 ; XOPAVX2-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
179 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
180 ; XOPAVX2-NEXT:    retq
181   %shift = lshr <16 x i16> %a, %b
182   ret <16 x i16> %shift
183 }
184
185 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
186 ; AVX1-LABEL: var_shift_v32i8:
187 ; AVX1:       # BB#0:
188 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
189 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm3
190 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
191 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
192 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
193 ; AVX1-NEXT:    vpsllw $5, %xmm5, %xmm5
194 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
195 ; AVX1-NEXT:    vpsrlw $2, %xmm2, %xmm3
196 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
197 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
198 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
199 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
200 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm3
201 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
202 ; AVX1-NEXT:    vpand %xmm7, %xmm3, %xmm3
203 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
204 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
205 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3
206 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
207 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
208 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
209 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm3
210 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
211 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
212 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
213 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm3
214 ; AVX1-NEXT:    vpand %xmm7, %xmm3, %xmm3
215 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
216 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
217 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
218 ; AVX1-NEXT:    retq
219 ;
220 ; AVX2-LABEL: var_shift_v32i8:
221 ; AVX2:       # BB#0:
222 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
223 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm2
224 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
225 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
226 ; AVX2-NEXT:    vpsrlw $2, %ymm0, %ymm2
227 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
228 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
229 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
230 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm2
231 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
232 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
233 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
234 ; AVX2-NEXT:    retq
235 ;
236 ; XOPAVX1-LABEL: var_shift_v32i8:
237 ; XOPAVX1:       # BB#0:
238 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
239 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
240 ; XOPAVX1-NEXT:    vpsubb %xmm2, %xmm3, %xmm2
241 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
242 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm4, %xmm2
243 ; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
244 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
245 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
246 ; XOPAVX1-NEXT:    retq
247 ;
248 ; XOPAVX2-LABEL: var_shift_v32i8:
249 ; XOPAVX2:       # BB#0:
250 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
251 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
252 ; XOPAVX2-NEXT:    vpsubb %xmm2, %xmm3, %xmm2
253 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
254 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm4, %xmm2
255 ; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
256 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
257 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
258 ; XOPAVX2-NEXT:    retq
259   %shift = lshr <32 x i8> %a, %b
260   ret <32 x i8> %shift
261 }
262
263 ;
264 ; Uniform Variable Shifts
265 ;
266
267 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
268 ; AVX1-LABEL: splatvar_shift_v4i64:
269 ; AVX1:       # BB#0:
270 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
271 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
272 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
273 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
274 ; AVX1-NEXT:    retq
275 ;
276 ; AVX2-LABEL: splatvar_shift_v4i64:
277 ; AVX2:       # BB#0:
278 ; AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
279 ; AVX2-NEXT:    retq
280 ;
281 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
282 ; XOPAVX1:       # BB#0:
283 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
284 ; XOPAVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
285 ; XOPAVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
286 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
287 ; XOPAVX1-NEXT:    retq
288 ;
289 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
290 ; XOPAVX2:       # BB#0:
291 ; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
292 ; XOPAVX2-NEXT:    retq
293   %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
294   %shift = lshr <4 x i64> %a, %splat
295   ret <4 x i64> %shift
296 }
297
298 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
299 ; AVX1-LABEL: splatvar_shift_v8i32:
300 ; AVX1:       # BB#0:
301 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
302 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
303 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
304 ; AVX1-NEXT:    vpsrld %xmm1, %xmm2, %xmm2
305 ; AVX1-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
306 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
307 ; AVX1-NEXT:    retq
308 ;
309 ; AVX2-LABEL: splatvar_shift_v8i32:
310 ; AVX2:       # BB#0:
311 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
312 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
313 ; AVX2-NEXT:    vpsrld %xmm1, %ymm0, %ymm0
314 ; AVX2-NEXT:    retq
315 ;
316 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
317 ; XOPAVX1:       # BB#0:
318 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
319 ; XOPAVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
320 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
321 ; XOPAVX1-NEXT:    vpsrld %xmm1, %xmm2, %xmm2
322 ; XOPAVX1-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
323 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
324 ; XOPAVX1-NEXT:    retq
325 ;
326 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
327 ; XOPAVX2:       # BB#0:
328 ; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
329 ; XOPAVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
330 ; XOPAVX2-NEXT:    vpsrld %xmm1, %ymm0, %ymm0
331 ; XOPAVX2-NEXT:    retq
332   %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
333   %shift = lshr <8 x i32> %a, %splat
334   ret <8 x i32> %shift
335 }
336
337 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
338 ; AVX1-LABEL: splatvar_shift_v16i16:
339 ; AVX1:       # BB#0:
340 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
341 ; AVX1-NEXT:    vmovd %xmm1, %eax
342 ; AVX1-NEXT:    movzwl %ax, %eax
343 ; AVX1-NEXT:    vmovd %eax, %xmm1
344 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
345 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
346 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
347 ; AVX1-NEXT:    retq
348 ;
349 ; AVX2-LABEL: splatvar_shift_v16i16:
350 ; AVX2:       # BB#0:
351 ; AVX2-NEXT:    vmovd %xmm1, %eax
352 ; AVX2-NEXT:    movzwl %ax, %eax
353 ; AVX2-NEXT:    vmovd %eax, %xmm1
354 ; AVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
355 ; AVX2-NEXT:    retq
356 ;
357 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
358 ; XOPAVX1:       # BB#0:
359 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
360 ; XOPAVX1-NEXT:    vmovd %xmm1, %eax
361 ; XOPAVX1-NEXT:    movzwl %ax, %eax
362 ; XOPAVX1-NEXT:    vmovd %eax, %xmm1
363 ; XOPAVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
364 ; XOPAVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
365 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
366 ; XOPAVX1-NEXT:    retq
367 ;
368 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
369 ; XOPAVX2:       # BB#0:
370 ; XOPAVX2-NEXT:    vmovd %xmm1, %eax
371 ; XOPAVX2-NEXT:    movzwl %ax, %eax
372 ; XOPAVX2-NEXT:    vmovd %eax, %xmm1
373 ; XOPAVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
374 ; XOPAVX2-NEXT:    retq
375   %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
376   %shift = lshr <16 x i16> %a, %splat
377   ret <16 x i16> %shift
378 }
379
380 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
381 ; AVX1-LABEL: splatvar_shift_v32i8:
382 ; AVX1:       # BB#0:
383 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
384 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
385 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
386 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm3
387 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
388 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
389 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
390 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm2, %xmm2
391 ; AVX1-NEXT:    vpsrlw $2, %xmm2, %xmm3
392 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
393 ; AVX1-NEXT:    vpand %xmm5, %xmm3, %xmm3
394 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm6
395 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
396 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm3
397 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
398 ; AVX1-NEXT:    vpand %xmm7, %xmm3, %xmm3
399 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm4
400 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm2, %xmm2
401 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3
402 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
403 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
404 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm1
405 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
406 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm1, %xmm0, %xmm0
407 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm1
408 ; AVX1-NEXT:    vpand %xmm7, %xmm1, %xmm1
409 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm1, %xmm0, %xmm0
410 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
411 ; AVX1-NEXT:    retq
412 ;
413 ; AVX2-LABEL: splatvar_shift_v32i8:
414 ; AVX2:       # BB#0:
415 ; AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
416 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm2
417 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
418 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
419 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
420 ; AVX2-NEXT:    vpsrlw $2, %ymm0, %ymm2
421 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
422 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
423 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
424 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm2
425 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
426 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
427 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
428 ; AVX2-NEXT:    retq
429 ;
430 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
431 ; XOPAVX1:       # BB#0:
432 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
433 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
434 ; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
435 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
436 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm2, %xmm2
437 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
438 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
439 ; XOPAVX1-NEXT:    retq
440 ;
441 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
442 ; XOPAVX2:       # BB#0:
443 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
444 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
445 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
446 ; XOPAVX2-NEXT:    vpsubb %xmm2, %xmm3, %xmm2
447 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
448 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm4, %xmm2
449 ; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
450 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
451 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
452 ; XOPAVX2-NEXT:    retq
453   %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
454   %shift = lshr <32 x i8> %a, %splat
455   ret <32 x i8> %shift
456 }
457
458 ;
459 ; Constant Shifts
460 ;
461
462 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
463 ; AVX1-LABEL: constant_shift_v4i64:
464 ; AVX1:       # BB#0:
465 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
466 ; AVX1-NEXT:    vpsrlq $62, %xmm1, %xmm2
467 ; AVX1-NEXT:    vpsrlq $31, %xmm1, %xmm1
468 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
469 ; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm2
470 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
471 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
472 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
473 ; AVX1-NEXT:    retq
474 ;
475 ; AVX2-LABEL: constant_shift_v4i64:
476 ; AVX2:       # BB#0:
477 ; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
478 ; AVX2-NEXT:    retq
479 ;
480 ; XOPAVX1-LABEL: constant_shift_v4i64:
481 ; XOPAVX1:       # BB#0:
482 ; XOPAVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
483 ; XOPAVX1-NEXT:    vpsubq {{.*}}(%rip), %xmm1, %xmm2
484 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
485 ; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm3, %xmm2
486 ; XOPAVX1-NEXT:    vpsubq {{.*}}(%rip), %xmm1, %xmm1
487 ; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
488 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
489 ; XOPAVX1-NEXT:    retq
490 ;
491 ; XOPAVX2-LABEL: constant_shift_v4i64:
492 ; XOPAVX2:       # BB#0:
493 ; XOPAVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
494 ; XOPAVX2-NEXT:    retq
495   %shift = lshr <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
496   ret <4 x i64> %shift
497 }
498
499 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
500 ; AVX1-LABEL: constant_shift_v8i32:
501 ; AVX1:       # BB#0:
502 ; AVX1-NEXT:    vpsrld $7, %xmm0, %xmm1
503 ; AVX1-NEXT:    vpsrld $5, %xmm0, %xmm2
504 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
505 ; AVX1-NEXT:    vpsrld $6, %xmm0, %xmm2
506 ; AVX1-NEXT:    vpsrld $4, %xmm0, %xmm3
507 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
508 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
509 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
510 ; AVX1-NEXT:    vpsrld $7, %xmm0, %xmm2
511 ; AVX1-NEXT:    vpsrld $9, %xmm0, %xmm3
512 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
513 ; AVX1-NEXT:    vpsrld $8, %xmm0, %xmm0
514 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
515 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
516 ; AVX1-NEXT:    retq
517 ;
518 ; AVX2-LABEL: constant_shift_v8i32:
519 ; AVX2:       # BB#0:
520 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm0, %ymm0
521 ; AVX2-NEXT:    retq
522 ;
523 ; XOPAVX1-LABEL: constant_shift_v8i32:
524 ; XOPAVX1:       # BB#0:
525 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm1
526 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
527 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
528 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
529 ; XOPAVX1-NEXT:    retq
530 ;
531 ; XOPAVX2-LABEL: constant_shift_v8i32:
532 ; XOPAVX2:       # BB#0:
533 ; XOPAVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm0, %ymm0
534 ; XOPAVX2-NEXT:    retq
535   %shift = lshr <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
536   ret <8 x i32> %shift
537 }
538
539 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
540 ; AVX1-LABEL: constant_shift_v16i16:
541 ; AVX1:       # BB#0:
542 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
543 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm2
544 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [32896,37008,41120,45232,49344,53456,57568,61680]
545 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
546 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm2
547 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [256,8480,16704,24928,33152,41376,49600,57824]
548 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
549 ; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm2
550 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [512,16960,33408,49856,768,17216,33664,50112]
551 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
552 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm2
553 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1024,33920,1280,34176,1536,34432,1792,34688]
554 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
555 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm2
556 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,4112,8224,12336,16448,20560,24672,28784]
557 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
558 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
559 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,8224,16448,24672,32896,41120,49344,57568]
560 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
561 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm2
562 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,16448,32896,49344,256,16704,33152,49600]
563 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
564 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm2
565 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,32896,256,33152,512,33408,768,33664]
566 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
567 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
568 ; AVX1-NEXT:    retq
569 ;
570 ; AVX2-LABEL: constant_shift_v16i16:
571 ; AVX2:       # BB#0:
572 ; AVX2-NEXT:    vpxor %ymm1, %ymm1, %ymm1
573 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
574 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15]
575 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
576 ; AVX2-NEXT:    vpsrlvd %ymm3, %ymm4, %ymm3
577 ; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
578 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11]
579 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
580 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
581 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
582 ; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
583 ; AVX2-NEXT:    retq
584 ;
585 ; XOPAVX1-LABEL: constant_shift_v16i16:
586 ; XOPAVX1:       # BB#0:
587 ; XOPAVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
588 ; XOPAVX1-NEXT:    vpsubw {{.*}}(%rip), %xmm1, %xmm2
589 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
590 ; XOPAVX1-NEXT:    vpshlw %xmm2, %xmm3, %xmm2
591 ; XOPAVX1-NEXT:    vpsubw {{.*}}(%rip), %xmm1, %xmm1
592 ; XOPAVX1-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
593 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
594 ; XOPAVX1-NEXT:    retq
595 ;
596 ; XOPAVX2-LABEL: constant_shift_v16i16:
597 ; XOPAVX2:       # BB#0:
598 ; XOPAVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
599 ; XOPAVX2-NEXT:    vpsubw {{.*}}(%rip), %xmm1, %xmm2
600 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
601 ; XOPAVX2-NEXT:    vpshlw %xmm2, %xmm3, %xmm2
602 ; XOPAVX2-NEXT:    vpsubw {{.*}}(%rip), %xmm1, %xmm1
603 ; XOPAVX2-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
604 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
605 ; XOPAVX2-NEXT:    retq
606   %shift = lshr <16 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
607   ret <16 x i16> %shift
608 }
609
610 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
611 ; AVX1-LABEL: constant_shift_v32i8:
612 ; AVX1:       # BB#0:
613 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
614 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm2
615 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
616 ; AVX1-NEXT:    vpand %xmm8, %xmm2, %xmm2
617 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
618 ; AVX1-NEXT:    vpsllw $5, %xmm4, %xmm4
619 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm1, %xmm1
620 ; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm2
621 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
622 ; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
623 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm6
624 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm2, %xmm1, %xmm1
625 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm2
626 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
627 ; AVX1-NEXT:    vpand %xmm7, %xmm2, %xmm2
628 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm3
629 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
630 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
631 ; AVX1-NEXT:    vpand %xmm8, %xmm2, %xmm2
632 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
633 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm2
634 ; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
635 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm2, %xmm0, %xmm0
636 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm2
637 ; AVX1-NEXT:    vpand %xmm7, %xmm2, %xmm2
638 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
639 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
640 ; AVX1-NEXT:    retq
641 ;
642 ; AVX2-LABEL: constant_shift_v32i8:
643 ; AVX2:       # BB#0:
644 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
645 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
646 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm2
647 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
648 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
649 ; AVX2-NEXT:    vpsrlw $2, %ymm0, %ymm2
650 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
651 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
652 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
653 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm2
654 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
655 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
656 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
657 ; AVX2-NEXT:    retq
658 ;
659 ; XOPAVX1-LABEL: constant_shift_v32i8:
660 ; XOPAVX1:       # BB#0:
661 ; XOPAVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
662 ; XOPAVX1-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
663 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
664 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm2, %xmm2
665 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
666 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
667 ; XOPAVX1-NEXT:    retq
668 ;
669 ; XOPAVX2-LABEL: constant_shift_v32i8:
670 ; XOPAVX2:       # BB#0:
671 ; XOPAVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
672 ; XOPAVX2-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
673 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
674 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm2, %xmm2
675 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
676 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
677 ; XOPAVX2-NEXT:    retq
678   %shift = lshr <32 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>
679   ret <32 x i8> %shift
680 }
681
682 ;
683 ; Uniform Constant Shifts
684 ;
685
686 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
687 ; AVX1-LABEL: splatconstant_shift_v4i64:
688 ; AVX1:       # BB#0:
689 ; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm1
690 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
691 ; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm0
692 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
693 ; AVX1-NEXT:    retq
694 ;
695 ; AVX2-LABEL: splatconstant_shift_v4i64:
696 ; AVX2:       # BB#0:
697 ; AVX2-NEXT:    vpsrlq $7, %ymm0, %ymm0
698 ; AVX2-NEXT:    retq
699 ;
700 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
701 ; XOPAVX1:       # BB#0:
702 ; XOPAVX1-NEXT:    vpsrlq $7, %xmm0, %xmm1
703 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
704 ; XOPAVX1-NEXT:    vpsrlq $7, %xmm0, %xmm0
705 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
706 ; XOPAVX1-NEXT:    retq
707 ;
708 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
709 ; XOPAVX2:       # BB#0:
710 ; XOPAVX2-NEXT:    vpsrlq $7, %ymm0, %ymm0
711 ; XOPAVX2-NEXT:    retq
712   %shift = lshr <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
713   ret <4 x i64> %shift
714 }
715
716 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
717 ; AVX1-LABEL: splatconstant_shift_v8i32:
718 ; AVX1:       # BB#0:
719 ; AVX1-NEXT:    vpsrld $5, %xmm0, %xmm1
720 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
721 ; AVX1-NEXT:    vpsrld $5, %xmm0, %xmm0
722 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
723 ; AVX1-NEXT:    retq
724 ;
725 ; AVX2-LABEL: splatconstant_shift_v8i32:
726 ; AVX2:       # BB#0:
727 ; AVX2-NEXT:    vpsrld $5, %ymm0, %ymm0
728 ; AVX2-NEXT:    retq
729 ;
730 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
731 ; XOPAVX1:       # BB#0:
732 ; XOPAVX1-NEXT:    vpsrld $5, %xmm0, %xmm1
733 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
734 ; XOPAVX1-NEXT:    vpsrld $5, %xmm0, %xmm0
735 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
736 ; XOPAVX1-NEXT:    retq
737 ;
738 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
739 ; XOPAVX2:       # BB#0:
740 ; XOPAVX2-NEXT:    vpsrld $5, %ymm0, %ymm0
741 ; XOPAVX2-NEXT:    retq
742   %shift = lshr <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
743   ret <8 x i32> %shift
744 }
745
746 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
747 ; AVX1-LABEL: splatconstant_shift_v16i16:
748 ; AVX1:       # BB#0:
749 ; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm1
750 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
751 ; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm0
752 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
753 ; AVX1-NEXT:    retq
754 ;
755 ; AVX2-LABEL: splatconstant_shift_v16i16:
756 ; AVX2:       # BB#0:
757 ; AVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
758 ; AVX2-NEXT:    retq
759 ;
760 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
761 ; XOPAVX1:       # BB#0:
762 ; XOPAVX1-NEXT:    vpsrlw $3, %xmm0, %xmm1
763 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
764 ; XOPAVX1-NEXT:    vpsrlw $3, %xmm0, %xmm0
765 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
766 ; XOPAVX1-NEXT:    retq
767 ;
768 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
769 ; XOPAVX2:       # BB#0:
770 ; XOPAVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
771 ; XOPAVX2-NEXT:    retq
772   %shift = lshr <16 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
773   ret <16 x i16> %shift
774 }
775
776 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
777 ; AVX1-LABEL: splatconstant_shift_v32i8:
778 ; AVX1:       # BB#0:
779 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
780 ; AVX1-NEXT:    vpsrlw $3, %xmm1, %xmm1
781 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]
782 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
783 ; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm0
784 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
785 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
786 ; AVX1-NEXT:    retq
787 ;
788 ; AVX2-LABEL: splatconstant_shift_v32i8:
789 ; AVX2:       # BB#0:
790 ; AVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
791 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
792 ; AVX2-NEXT:    retq
793 ;
794 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
795 ; XOPAVX1:       # BB#0:
796 ; XOPAVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
797 ; XOPAVX1-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
798 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
799 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm2, %xmm2
800 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
801 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
802 ; XOPAVX1-NEXT:    retq
803 ;
804 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
805 ; XOPAVX2:       # BB#0:
806 ; XOPAVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
807 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
808 ; XOPAVX2-NEXT:    retq
809   %shift = lshr <32 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
810   ret <32 x i8> %shift
811 }