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