Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-shift-ashr-256.ll
blob5a70e5d4a2b560d8793cde1b0caa8f54cdb881c5
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=AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=XOPAVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=XOPAVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=AVX512,AVX512DQ
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX512VL,AVX512DQVL
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512VL,AVX512BWVL
11 ; 32-bit runs to make sure we do reasonable things for i64 shifts.
12 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx  | FileCheck %s --check-prefix=X86-AVX1
13 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X86-AVX2
16 ; Variable Shifts
19 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
20 ; AVX1-LABEL: var_shift_v4i64:
21 ; AVX1:       # %bb.0:
22 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
23 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
24 ; AVX1-NEXT:    # xmm3 = mem[0,0]
25 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm3, %xmm4
26 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[2,3,2,3]
27 ; AVX1-NEXT:    vpsrlq %xmm5, %xmm3, %xmm6
28 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm6[4,5,6,7]
29 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
30 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm6, %xmm2
31 ; AVX1-NEXT:    vpsrlq %xmm5, %xmm6, %xmm5
32 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm5[4,5,6,7]
33 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
34 ; AVX1-NEXT:    vpsubq %xmm4, %xmm2, %xmm2
35 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm4
36 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm1[2,3,2,3]
37 ; AVX1-NEXT:    vpsrlq %xmm5, %xmm3, %xmm3
38 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
39 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm1
40 ; AVX1-NEXT:    vpsrlq %xmm5, %xmm0, %xmm0
41 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
42 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
43 ; AVX1-NEXT:    vpsubq %xmm3, %xmm0, %xmm0
44 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
45 ; AVX1-NEXT:    retq
47 ; AVX2-LABEL: var_shift_v4i64:
48 ; AVX2:       # %bb.0:
49 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
50 ; AVX2-NEXT:    vpsrlvq %ymm1, %ymm2, %ymm2
51 ; AVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0
52 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
53 ; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
54 ; AVX2-NEXT:    retq
56 ; XOPAVX1-LABEL: var_shift_v4i64:
57 ; XOPAVX1:       # %bb.0:
58 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
59 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
60 ; XOPAVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm2
61 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
62 ; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm4, %xmm2
63 ; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm3, %xmm1
64 ; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm0, %xmm0
65 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
66 ; XOPAVX1-NEXT:    retq
68 ; XOPAVX2-LABEL: var_shift_v4i64:
69 ; XOPAVX2:       # %bb.0:
70 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
71 ; XOPAVX2-NEXT:    vpsrlvq %ymm1, %ymm2, %ymm2
72 ; XOPAVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0
73 ; XOPAVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
74 ; XOPAVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
75 ; XOPAVX2-NEXT:    retq
77 ; AVX512-LABEL: var_shift_v4i64:
78 ; AVX512:       # %bb.0:
79 ; AVX512-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
80 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
81 ; AVX512-NEXT:    vpsravq %zmm1, %zmm0, %zmm0
82 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
83 ; AVX512-NEXT:    retq
85 ; AVX512VL-LABEL: var_shift_v4i64:
86 ; AVX512VL:       # %bb.0:
87 ; AVX512VL-NEXT:    vpsravq %ymm1, %ymm0, %ymm0
88 ; AVX512VL-NEXT:    retq
90 ; X86-AVX1-LABEL: var_shift_v4i64:
91 ; X86-AVX1:       # %bb.0:
92 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
93 ; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
94 ; X86-AVX1-NEXT:    # xmm3 = mem[0,0]
95 ; X86-AVX1-NEXT:    vpsrlq %xmm2, %xmm3, %xmm4
96 ; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[2,3,2,3]
97 ; X86-AVX1-NEXT:    vpsrlq %xmm5, %xmm3, %xmm6
98 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm6[4,5,6,7]
99 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
100 ; X86-AVX1-NEXT:    vpsrlq %xmm2, %xmm6, %xmm2
101 ; X86-AVX1-NEXT:    vpsrlq %xmm5, %xmm6, %xmm5
102 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm5[4,5,6,7]
103 ; X86-AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
104 ; X86-AVX1-NEXT:    vpsubq %xmm4, %xmm2, %xmm2
105 ; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm4
106 ; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm1[2,3,2,3]
107 ; X86-AVX1-NEXT:    vpsrlq %xmm5, %xmm3, %xmm3
108 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
109 ; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm1
110 ; X86-AVX1-NEXT:    vpsrlq %xmm5, %xmm0, %xmm0
111 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
112 ; X86-AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
113 ; X86-AVX1-NEXT:    vpsubq %xmm3, %xmm0, %xmm0
114 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
115 ; X86-AVX1-NEXT:    retl
117 ; X86-AVX2-LABEL: var_shift_v4i64:
118 ; X86-AVX2:       # %bb.0:
119 ; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
120 ; X86-AVX2-NEXT:    vpsrlvq %ymm1, %ymm2, %ymm2
121 ; X86-AVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0
122 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
123 ; X86-AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
124 ; X86-AVX2-NEXT:    retl
125   %shift = ashr <4 x i64> %a, %b
126   ret <4 x i64> %shift
129 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
130 ; AVX1-LABEL: var_shift_v8i32:
131 ; AVX1:       # %bb.0:
132 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
133 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
134 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
135 ; AVX1-NEXT:    vpsrad %xmm4, %xmm2, %xmm4
136 ; AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm5
137 ; AVX1-NEXT:    vpsrad %xmm5, %xmm2, %xmm5
138 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
139 ; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
140 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
141 ; AVX1-NEXT:    vpsrad %xmm6, %xmm2, %xmm6
142 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
143 ; AVX1-NEXT:    vpsrad %xmm3, %xmm2, %xmm2
144 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
145 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
146 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
147 ; AVX1-NEXT:    vpsrad %xmm3, %xmm0, %xmm3
148 ; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm4
149 ; AVX1-NEXT:    vpsrad %xmm4, %xmm0, %xmm4
150 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
151 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]
152 ; AVX1-NEXT:    vpsrad %xmm4, %xmm0, %xmm4
153 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
154 ; AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
155 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
156 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
157 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
158 ; AVX1-NEXT:    retq
160 ; AVX2-LABEL: var_shift_v8i32:
161 ; AVX2:       # %bb.0:
162 ; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
163 ; AVX2-NEXT:    retq
165 ; XOPAVX1-LABEL: var_shift_v8i32:
166 ; XOPAVX1:       # %bb.0:
167 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
168 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
169 ; XOPAVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2
170 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
171 ; XOPAVX1-NEXT:    vpshad %xmm2, %xmm4, %xmm2
172 ; XOPAVX1-NEXT:    vpsubd %xmm1, %xmm3, %xmm1
173 ; XOPAVX1-NEXT:    vpshad %xmm1, %xmm0, %xmm0
174 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
175 ; XOPAVX1-NEXT:    retq
177 ; XOPAVX2-LABEL: var_shift_v8i32:
178 ; XOPAVX2:       # %bb.0:
179 ; XOPAVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
180 ; XOPAVX2-NEXT:    retq
182 ; AVX512-LABEL: var_shift_v8i32:
183 ; AVX512:       # %bb.0:
184 ; AVX512-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
185 ; AVX512-NEXT:    retq
187 ; AVX512VL-LABEL: var_shift_v8i32:
188 ; AVX512VL:       # %bb.0:
189 ; AVX512VL-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
190 ; AVX512VL-NEXT:    retq
192 ; X86-AVX1-LABEL: var_shift_v8i32:
193 ; X86-AVX1:       # %bb.0:
194 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
195 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
196 ; X86-AVX1-NEXT:    vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
197 ; X86-AVX1-NEXT:    vpsrad %xmm4, %xmm2, %xmm4
198 ; X86-AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm5
199 ; X86-AVX1-NEXT:    vpsrad %xmm5, %xmm2, %xmm5
200 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
201 ; X86-AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
202 ; X86-AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
203 ; X86-AVX1-NEXT:    vpsrad %xmm6, %xmm2, %xmm6
204 ; X86-AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
205 ; X86-AVX1-NEXT:    vpsrad %xmm3, %xmm2, %xmm2
206 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
207 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
208 ; X86-AVX1-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
209 ; X86-AVX1-NEXT:    vpsrad %xmm3, %xmm0, %xmm3
210 ; X86-AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm4
211 ; X86-AVX1-NEXT:    vpsrad %xmm4, %xmm0, %xmm4
212 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
213 ; X86-AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]
214 ; X86-AVX1-NEXT:    vpsrad %xmm4, %xmm0, %xmm4
215 ; X86-AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
216 ; X86-AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
217 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
218 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
219 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
220 ; X86-AVX1-NEXT:    retl
222 ; X86-AVX2-LABEL: var_shift_v8i32:
223 ; X86-AVX2:       # %bb.0:
224 ; X86-AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
225 ; X86-AVX2-NEXT:    retl
226   %shift = ashr <8 x i32> %a, %b
227   ret <8 x i32> %shift
230 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
231 ; AVX1-LABEL: var_shift_v16i16:
232 ; AVX1:       # %bb.0:
233 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
234 ; AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3
235 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
236 ; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
237 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3
238 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
239 ; AVX1-NEXT:    vpsraw $8, %xmm4, %xmm5
240 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
241 ; AVX1-NEXT:    vpsraw $4, %xmm2, %xmm4
242 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
243 ; AVX1-NEXT:    vpsraw $2, %xmm2, %xmm4
244 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
245 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
246 ; AVX1-NEXT:    vpsraw $1, %xmm2, %xmm4
247 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
248 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
249 ; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3
250 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
251 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
252 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3
253 ; AVX1-NEXT:    vpsraw $8, %xmm0, %xmm4
254 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
255 ; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm1
256 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
257 ; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm1
258 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
259 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
260 ; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm1
261 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
262 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
263 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
264 ; AVX1-NEXT:    retq
266 ; AVX2-LABEL: var_shift_v16i16:
267 ; AVX2:       # %bb.0:
268 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
269 ; 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]
270 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
271 ; AVX2-NEXT:    vpsravd %ymm3, %ymm4, %ymm3
272 ; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
273 ; 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]
274 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
275 ; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
276 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
277 ; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
278 ; AVX2-NEXT:    retq
280 ; XOPAVX1-LABEL: var_shift_v16i16:
281 ; XOPAVX1:       # %bb.0:
282 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
283 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
284 ; XOPAVX1-NEXT:    vpsubw %xmm2, %xmm3, %xmm2
285 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
286 ; XOPAVX1-NEXT:    vpshaw %xmm2, %xmm4, %xmm2
287 ; XOPAVX1-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
288 ; XOPAVX1-NEXT:    vpshaw %xmm1, %xmm0, %xmm0
289 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
290 ; XOPAVX1-NEXT:    retq
292 ; XOPAVX2-LABEL: var_shift_v16i16:
293 ; XOPAVX2:       # %bb.0:
294 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
295 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
296 ; XOPAVX2-NEXT:    vpsubw %xmm2, %xmm3, %xmm2
297 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
298 ; XOPAVX2-NEXT:    vpshaw %xmm2, %xmm4, %xmm2
299 ; XOPAVX2-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
300 ; XOPAVX2-NEXT:    vpshaw %xmm1, %xmm0, %xmm0
301 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
302 ; XOPAVX2-NEXT:    retq
304 ; AVX512DQ-LABEL: var_shift_v16i16:
305 ; AVX512DQ:       # %bb.0:
306 ; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
307 ; AVX512DQ-NEXT:    vpmovsxwd %ymm0, %zmm0
308 ; AVX512DQ-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
309 ; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
310 ; AVX512DQ-NEXT:    retq
312 ; AVX512BW-LABEL: var_shift_v16i16:
313 ; AVX512BW:       # %bb.0:
314 ; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
315 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
316 ; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
317 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
318 ; AVX512BW-NEXT:    retq
320 ; AVX512DQVL-LABEL: var_shift_v16i16:
321 ; AVX512DQVL:       # %bb.0:
322 ; AVX512DQVL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
323 ; AVX512DQVL-NEXT:    vpmovsxwd %ymm0, %zmm0
324 ; AVX512DQVL-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
325 ; AVX512DQVL-NEXT:    vpmovdw %zmm0, %ymm0
326 ; AVX512DQVL-NEXT:    retq
328 ; AVX512BWVL-LABEL: var_shift_v16i16:
329 ; AVX512BWVL:       # %bb.0:
330 ; AVX512BWVL-NEXT:    vpsravw %ymm1, %ymm0, %ymm0
331 ; AVX512BWVL-NEXT:    retq
333 ; X86-AVX1-LABEL: var_shift_v16i16:
334 ; X86-AVX1:       # %bb.0:
335 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
336 ; X86-AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3
337 ; X86-AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
338 ; X86-AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
339 ; X86-AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3
340 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
341 ; X86-AVX1-NEXT:    vpsraw $8, %xmm4, %xmm5
342 ; X86-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
343 ; X86-AVX1-NEXT:    vpsraw $4, %xmm2, %xmm4
344 ; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
345 ; X86-AVX1-NEXT:    vpsraw $2, %xmm2, %xmm4
346 ; X86-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
347 ; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
348 ; X86-AVX1-NEXT:    vpsraw $1, %xmm2, %xmm4
349 ; X86-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
350 ; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
351 ; X86-AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3
352 ; X86-AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
353 ; X86-AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
354 ; X86-AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3
355 ; X86-AVX1-NEXT:    vpsraw $8, %xmm0, %xmm4
356 ; X86-AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
357 ; X86-AVX1-NEXT:    vpsraw $4, %xmm0, %xmm1
358 ; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
359 ; X86-AVX1-NEXT:    vpsraw $2, %xmm0, %xmm1
360 ; X86-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
361 ; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
362 ; X86-AVX1-NEXT:    vpsraw $1, %xmm0, %xmm1
363 ; X86-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
364 ; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
365 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
366 ; X86-AVX1-NEXT:    retl
368 ; X86-AVX2-LABEL: var_shift_v16i16:
369 ; X86-AVX2:       # %bb.0:
370 ; X86-AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
371 ; X86-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]
372 ; X86-AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
373 ; X86-AVX2-NEXT:    vpsravd %ymm3, %ymm4, %ymm3
374 ; X86-AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
375 ; X86-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]
376 ; X86-AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
377 ; X86-AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
378 ; X86-AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
379 ; X86-AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
380 ; X86-AVX2-NEXT:    retl
381   %shift = ashr <16 x i16> %a, %b
382   ret <16 x i16> %shift
385 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
386 ; AVX1-LABEL: var_shift_v32i8:
387 ; AVX1:       # %bb.0:
388 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
389 ; AVX1-NEXT:    vpsllw $5, %xmm2, %xmm2
390 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
391 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
392 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
393 ; AVX1-NEXT:    vpsraw $4, %xmm5, %xmm6
394 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
395 ; AVX1-NEXT:    vpsraw $2, %xmm5, %xmm6
396 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
397 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
398 ; AVX1-NEXT:    vpsraw $1, %xmm5, %xmm6
399 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
400 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm3
401 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
402 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
403 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
404 ; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
405 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
406 ; AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
407 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
408 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
409 ; AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
410 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
411 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
412 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
413 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
414 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
415 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
416 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
417 ; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
418 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
419 ; AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
420 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
421 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
422 ; AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
423 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
424 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm3
425 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
426 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
427 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
428 ; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm4
429 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
430 ; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm4
431 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
432 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
433 ; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm4
434 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
435 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
436 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
437 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
438 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
439 ; AVX1-NEXT:    retq
441 ; AVX2-LABEL: var_shift_v32i8:
442 ; AVX2:       # %bb.0:
443 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
444 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[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]
445 ; 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]
446 ; AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4
447 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
448 ; AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4
449 ; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
450 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
451 ; AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4
452 ; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
453 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
454 ; AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
455 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]
456 ; 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]
457 ; AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3
458 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
459 ; AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3
460 ; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
461 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
462 ; AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3
463 ; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
464 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
465 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
466 ; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
467 ; AVX2-NEXT:    retq
469 ; XOPAVX1-LABEL: var_shift_v32i8:
470 ; XOPAVX1:       # %bb.0:
471 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
472 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
473 ; XOPAVX1-NEXT:    vpsubb %xmm2, %xmm3, %xmm2
474 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
475 ; XOPAVX1-NEXT:    vpshab %xmm2, %xmm4, %xmm2
476 ; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
477 ; XOPAVX1-NEXT:    vpshab %xmm1, %xmm0, %xmm0
478 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
479 ; XOPAVX1-NEXT:    retq
481 ; XOPAVX2-LABEL: var_shift_v32i8:
482 ; XOPAVX2:       # %bb.0:
483 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
484 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
485 ; XOPAVX2-NEXT:    vpsubb %xmm2, %xmm3, %xmm2
486 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
487 ; XOPAVX2-NEXT:    vpshab %xmm2, %xmm4, %xmm2
488 ; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
489 ; XOPAVX2-NEXT:    vpshab %xmm1, %xmm0, %xmm0
490 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
491 ; XOPAVX2-NEXT:    retq
493 ; AVX512DQ-LABEL: var_shift_v32i8:
494 ; AVX512DQ:       # %bb.0:
495 ; AVX512DQ-NEXT:    vpsllw $5, %ymm1, %ymm1
496 ; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[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]
497 ; AVX512DQ-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]
498 ; AVX512DQ-NEXT:    vpsraw $4, %ymm3, %ymm4
499 ; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
500 ; AVX512DQ-NEXT:    vpsraw $2, %ymm3, %ymm4
501 ; AVX512DQ-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
502 ; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
503 ; AVX512DQ-NEXT:    vpsraw $1, %ymm3, %ymm4
504 ; AVX512DQ-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
505 ; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
506 ; AVX512DQ-NEXT:    vpsrlw $8, %ymm2, %ymm2
507 ; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]
508 ; AVX512DQ-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]
509 ; AVX512DQ-NEXT:    vpsraw $4, %ymm0, %ymm3
510 ; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
511 ; AVX512DQ-NEXT:    vpsraw $2, %ymm0, %ymm3
512 ; AVX512DQ-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
513 ; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
514 ; AVX512DQ-NEXT:    vpsraw $1, %ymm0, %ymm3
515 ; AVX512DQ-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
516 ; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
517 ; AVX512DQ-NEXT:    vpsrlw $8, %ymm0, %ymm0
518 ; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
519 ; AVX512DQ-NEXT:    retq
521 ; AVX512BW-LABEL: var_shift_v32i8:
522 ; AVX512BW:       # %bb.0:
523 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
524 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
525 ; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
526 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
527 ; AVX512BW-NEXT:    retq
529 ; AVX512DQVL-LABEL: var_shift_v32i8:
530 ; AVX512DQVL:       # %bb.0:
531 ; AVX512DQVL-NEXT:    vpsllw $5, %ymm1, %ymm1
532 ; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[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]
533 ; AVX512DQVL-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]
534 ; AVX512DQVL-NEXT:    vpsraw $4, %ymm3, %ymm4
535 ; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
536 ; AVX512DQVL-NEXT:    vpsraw $2, %ymm3, %ymm4
537 ; AVX512DQVL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
538 ; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
539 ; AVX512DQVL-NEXT:    vpsraw $1, %ymm3, %ymm4
540 ; AVX512DQVL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
541 ; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
542 ; AVX512DQVL-NEXT:    vpsrlw $8, %ymm2, %ymm2
543 ; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]
544 ; AVX512DQVL-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]
545 ; AVX512DQVL-NEXT:    vpsraw $4, %ymm0, %ymm3
546 ; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
547 ; AVX512DQVL-NEXT:    vpsraw $2, %ymm0, %ymm3
548 ; AVX512DQVL-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
549 ; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
550 ; AVX512DQVL-NEXT:    vpsraw $1, %ymm0, %ymm3
551 ; AVX512DQVL-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
552 ; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
553 ; AVX512DQVL-NEXT:    vpsrlw $8, %ymm0, %ymm0
554 ; AVX512DQVL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
555 ; AVX512DQVL-NEXT:    retq
557 ; AVX512BWVL-LABEL: var_shift_v32i8:
558 ; AVX512BWVL:       # %bb.0:
559 ; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
560 ; AVX512BWVL-NEXT:    vpmovsxbw %ymm0, %zmm0
561 ; AVX512BWVL-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
562 ; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm0
563 ; AVX512BWVL-NEXT:    retq
565 ; X86-AVX1-LABEL: var_shift_v32i8:
566 ; X86-AVX1:       # %bb.0:
567 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
568 ; X86-AVX1-NEXT:    vpsllw $5, %xmm2, %xmm2
569 ; X86-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
570 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
571 ; X86-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
572 ; X86-AVX1-NEXT:    vpsraw $4, %xmm5, %xmm6
573 ; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
574 ; X86-AVX1-NEXT:    vpsraw $2, %xmm5, %xmm6
575 ; X86-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
576 ; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
577 ; X86-AVX1-NEXT:    vpsraw $1, %xmm5, %xmm6
578 ; X86-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
579 ; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm3
580 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
581 ; X86-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
582 ; X86-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
583 ; X86-AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
584 ; X86-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
585 ; X86-AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
586 ; X86-AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
587 ; X86-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
588 ; X86-AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
589 ; X86-AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
590 ; X86-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
591 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
592 ; X86-AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
593 ; X86-AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
594 ; X86-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
595 ; X86-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
596 ; X86-AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
597 ; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
598 ; X86-AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
599 ; X86-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
600 ; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
601 ; X86-AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
602 ; X86-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
603 ; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm3
604 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
605 ; X86-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
606 ; X86-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
607 ; X86-AVX1-NEXT:    vpsraw $4, %xmm0, %xmm4
608 ; X86-AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
609 ; X86-AVX1-NEXT:    vpsraw $2, %xmm0, %xmm4
610 ; X86-AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
611 ; X86-AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
612 ; X86-AVX1-NEXT:    vpsraw $1, %xmm0, %xmm4
613 ; X86-AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
614 ; X86-AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
615 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
616 ; X86-AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
617 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
618 ; X86-AVX1-NEXT:    retl
620 ; X86-AVX2-LABEL: var_shift_v32i8:
621 ; X86-AVX2:       # %bb.0:
622 ; X86-AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
623 ; X86-AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[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]
624 ; X86-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]
625 ; X86-AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4
626 ; X86-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
627 ; X86-AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4
628 ; X86-AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
629 ; X86-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
630 ; X86-AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4
631 ; X86-AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
632 ; X86-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
633 ; X86-AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
634 ; X86-AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]
635 ; X86-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]
636 ; X86-AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3
637 ; X86-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
638 ; X86-AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3
639 ; X86-AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
640 ; X86-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
641 ; X86-AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3
642 ; X86-AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
643 ; X86-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
644 ; X86-AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
645 ; X86-AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
646 ; X86-AVX2-NEXT:    retl
647   %shift = ashr <32 x i8> %a, %b
648   ret <32 x i8> %shift
652 ; Uniform Variable Shifts
655 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
656 ; AVX1-LABEL: splatvar_shift_v4i64:
657 ; AVX1:       # %bb.0:
658 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
659 ; AVX1-NEXT:    # xmm2 = mem[0,0]
660 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
661 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
662 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm3
663 ; AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm3
664 ; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm3
665 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
666 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
667 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
668 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
669 ; AVX1-NEXT:    retq
671 ; AVX2-LABEL: splatvar_shift_v4i64:
672 ; AVX2:       # %bb.0:
673 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
674 ; AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2
675 ; AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
676 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
677 ; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
678 ; AVX2-NEXT:    retq
680 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
681 ; XOPAVX1:       # %bb.0:
682 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
683 ; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm1
684 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
685 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
686 ; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm2, %xmm2
687 ; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm0, %xmm0
688 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
689 ; XOPAVX1-NEXT:    retq
691 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
692 ; XOPAVX2:       # %bb.0:
693 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
694 ; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2
695 ; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
696 ; XOPAVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
697 ; XOPAVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
698 ; XOPAVX2-NEXT:    retq
700 ; AVX512-LABEL: splatvar_shift_v4i64:
701 ; AVX512:       # %bb.0:
702 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
703 ; AVX512-NEXT:    vpsraq %xmm1, %zmm0, %zmm0
704 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
705 ; AVX512-NEXT:    retq
707 ; AVX512VL-LABEL: splatvar_shift_v4i64:
708 ; AVX512VL:       # %bb.0:
709 ; AVX512VL-NEXT:    vpsraq %xmm1, %ymm0, %ymm0
710 ; AVX512VL-NEXT:    retq
712 ; X86-AVX1-LABEL: splatvar_shift_v4i64:
713 ; X86-AVX1:       # %bb.0:
714 ; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
715 ; X86-AVX1-NEXT:    # xmm2 = mem[0,0]
716 ; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
717 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
718 ; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm3
719 ; X86-AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm3
720 ; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm3
721 ; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
722 ; X86-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
723 ; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
724 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
725 ; X86-AVX1-NEXT:    retl
727 ; X86-AVX2-LABEL: splatvar_shift_v4i64:
728 ; X86-AVX2:       # %bb.0:
729 ; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
730 ; X86-AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2
731 ; X86-AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
732 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
733 ; X86-AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
734 ; X86-AVX2-NEXT:    retl
735   %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
736   %shift = ashr <4 x i64> %a, %splat
737   ret <4 x i64> %shift
740 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
741 ; AVX1-LABEL: splatvar_shift_v8i32:
742 ; AVX1:       # %bb.0:
743 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
744 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
745 ; AVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2
746 ; AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
747 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
748 ; AVX1-NEXT:    retq
750 ; AVX2-LABEL: splatvar_shift_v8i32:
751 ; AVX2:       # %bb.0:
752 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
753 ; AVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
754 ; AVX2-NEXT:    retq
756 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
757 ; XOPAVX1:       # %bb.0:
758 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
759 ; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
760 ; XOPAVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2
761 ; XOPAVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
762 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
763 ; XOPAVX1-NEXT:    retq
765 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
766 ; XOPAVX2:       # %bb.0:
767 ; XOPAVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
768 ; XOPAVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
769 ; XOPAVX2-NEXT:    retq
771 ; AVX512-LABEL: splatvar_shift_v8i32:
772 ; AVX512:       # %bb.0:
773 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
774 ; AVX512-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
775 ; AVX512-NEXT:    retq
777 ; AVX512VL-LABEL: splatvar_shift_v8i32:
778 ; AVX512VL:       # %bb.0:
779 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
780 ; AVX512VL-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
781 ; AVX512VL-NEXT:    retq
783 ; X86-AVX1-LABEL: splatvar_shift_v8i32:
784 ; X86-AVX1:       # %bb.0:
785 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
786 ; X86-AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
787 ; X86-AVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2
788 ; X86-AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
789 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
790 ; X86-AVX1-NEXT:    retl
792 ; X86-AVX2-LABEL: splatvar_shift_v8i32:
793 ; X86-AVX2:       # %bb.0:
794 ; X86-AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
795 ; X86-AVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
796 ; X86-AVX2-NEXT:    retl
797   %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
798   %shift = ashr <8 x i32> %a, %splat
799   ret <8 x i32> %shift
802 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
803 ; AVX1-LABEL: splatvar_shift_v16i16:
804 ; AVX1:       # %bb.0:
805 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
806 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
807 ; AVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2
808 ; AVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
809 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
810 ; AVX1-NEXT:    retq
812 ; AVX2-LABEL: splatvar_shift_v16i16:
813 ; AVX2:       # %bb.0:
814 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
815 ; AVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
816 ; AVX2-NEXT:    retq
818 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
819 ; XOPAVX1:       # %bb.0:
820 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
821 ; XOPAVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
822 ; XOPAVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2
823 ; XOPAVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
824 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
825 ; XOPAVX1-NEXT:    retq
827 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
828 ; XOPAVX2:       # %bb.0:
829 ; XOPAVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
830 ; XOPAVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
831 ; XOPAVX2-NEXT:    retq
833 ; AVX512-LABEL: splatvar_shift_v16i16:
834 ; AVX512:       # %bb.0:
835 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
836 ; AVX512-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
837 ; AVX512-NEXT:    retq
839 ; AVX512VL-LABEL: splatvar_shift_v16i16:
840 ; AVX512VL:       # %bb.0:
841 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
842 ; AVX512VL-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
843 ; AVX512VL-NEXT:    retq
845 ; X86-AVX1-LABEL: splatvar_shift_v16i16:
846 ; X86-AVX1:       # %bb.0:
847 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
848 ; X86-AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
849 ; X86-AVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2
850 ; X86-AVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
851 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
852 ; X86-AVX1-NEXT:    retl
854 ; X86-AVX2-LABEL: splatvar_shift_v16i16:
855 ; X86-AVX2:       # %bb.0:
856 ; X86-AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
857 ; X86-AVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
858 ; X86-AVX2-NEXT:    retl
859   %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
860   %shift = ashr <16 x i16> %a, %splat
861   ret <16 x i16> %shift
864 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
865 ; AVX1-LABEL: splatvar_shift_v32i8:
866 ; AVX1:       # %bb.0:
867 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
868 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
869 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
870 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
871 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm3, %xmm3
872 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
873 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
874 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [32896,32896,32896,32896,32896,32896,32896,32896]
875 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm4, %xmm4
876 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
877 ; AVX1-NEXT:    vpsubb %xmm4, %xmm2, %xmm2
878 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
879 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
880 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
881 ; AVX1-NEXT:    vpsubb %xmm4, %xmm0, %xmm0
882 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
883 ; AVX1-NEXT:    retq
885 ; AVX2-LABEL: splatvar_shift_v32i8:
886 ; AVX2:       # %bb.0:
887 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
888 ; AVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
889 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
890 ; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
891 ; AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm2
892 ; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
893 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
894 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
895 ; AVX2-NEXT:    vpsrlw %xmm1, %ymm2, %ymm1
896 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
897 ; AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
898 ; AVX2-NEXT:    retq
900 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
901 ; XOPAVX1:       # %bb.0:
902 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
903 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
904 ; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
905 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
906 ; XOPAVX1-NEXT:    vpshab %xmm1, %xmm2, %xmm2
907 ; XOPAVX1-NEXT:    vpshab %xmm1, %xmm0, %xmm0
908 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
909 ; XOPAVX1-NEXT:    retq
911 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
912 ; XOPAVX2:       # %bb.0:
913 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
914 ; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
915 ; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
916 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
917 ; XOPAVX2-NEXT:    vpshab %xmm1, %xmm2, %xmm2
918 ; XOPAVX2-NEXT:    vpshab %xmm1, %xmm0, %xmm0
919 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
920 ; XOPAVX2-NEXT:    retq
922 ; AVX512DQ-LABEL: splatvar_shift_v32i8:
923 ; AVX512DQ:       # %bb.0:
924 ; AVX512DQ-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
925 ; AVX512DQ-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
926 ; AVX512DQ-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
927 ; AVX512DQ-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
928 ; AVX512DQ-NEXT:    vpsrlw $8, %xmm2, %xmm2
929 ; AVX512DQ-NEXT:    vpbroadcastb %xmm2, %ymm2
930 ; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm0
931 ; AVX512DQ-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
932 ; AVX512DQ-NEXT:    vpsrlw %xmm1, %ymm2, %ymm1
933 ; AVX512DQ-NEXT:    vpxor %ymm1, %ymm0, %ymm0
934 ; AVX512DQ-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
935 ; AVX512DQ-NEXT:    retq
937 ; AVX512BW-LABEL: splatvar_shift_v32i8:
938 ; AVX512BW:       # %bb.0:
939 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
940 ; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
941 ; AVX512BW-NEXT:    vpsraw %xmm1, %zmm0, %zmm0
942 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
943 ; AVX512BW-NEXT:    retq
945 ; AVX512DQVL-LABEL: splatvar_shift_v32i8:
946 ; AVX512DQVL:       # %bb.0:
947 ; AVX512DQVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
948 ; AVX512DQVL-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
949 ; AVX512DQVL-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896]
950 ; AVX512DQVL-NEXT:    vpsrlw %xmm1, %ymm2, %ymm2
951 ; AVX512DQVL-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
952 ; AVX512DQVL-NEXT:    vpsrlw %xmm1, %xmm3, %xmm1
953 ; AVX512DQVL-NEXT:    vpsrlw $8, %xmm1, %xmm1
954 ; AVX512DQVL-NEXT:    vpbroadcastb %xmm1, %ymm1
955 ; AVX512DQVL-NEXT:    vpternlogq $108, %ymm0, %ymm2, %ymm1
956 ; AVX512DQVL-NEXT:    vpsubb %ymm2, %ymm1, %ymm0
957 ; AVX512DQVL-NEXT:    retq
959 ; AVX512BWVL-LABEL: splatvar_shift_v32i8:
960 ; AVX512BWVL:       # %bb.0:
961 ; AVX512BWVL-NEXT:    vpmovsxbw %ymm0, %zmm0
962 ; AVX512BWVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
963 ; AVX512BWVL-NEXT:    vpsraw %xmm1, %zmm0, %zmm0
964 ; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm0
965 ; AVX512BWVL-NEXT:    retq
967 ; X86-AVX1-LABEL: splatvar_shift_v32i8:
968 ; X86-AVX1:       # %bb.0:
969 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
970 ; X86-AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
971 ; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
972 ; X86-AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
973 ; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm3, %xmm3
974 ; X86-AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
975 ; X86-AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
976 ; X86-AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [32896,32896,32896,32896,32896,32896,32896,32896]
977 ; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm4, %xmm4
978 ; X86-AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
979 ; X86-AVX1-NEXT:    vpsubb %xmm4, %xmm2, %xmm2
980 ; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
981 ; X86-AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
982 ; X86-AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
983 ; X86-AVX1-NEXT:    vpsubb %xmm4, %xmm0, %xmm0
984 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
985 ; X86-AVX1-NEXT:    retl
987 ; X86-AVX2-LABEL: splatvar_shift_v32i8:
988 ; X86-AVX2:       # %bb.0:
989 ; X86-AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
990 ; X86-AVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
991 ; X86-AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
992 ; X86-AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
993 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm2
994 ; X86-AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
995 ; X86-AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
996 ; X86-AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
997 ; X86-AVX2-NEXT:    vpsrlw %xmm1, %ymm2, %ymm1
998 ; X86-AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
999 ; X86-AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
1000 ; X86-AVX2-NEXT:    retl
1001   %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
1002   %shift = ashr <32 x i8> %a, %splat
1003   ret <32 x i8> %shift
1007 ; Uniform Variable Modulo Shifts
1010 define <4 x i64> @splatvar_modulo_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
1011 ; AVX1-LABEL: splatvar_modulo_shift_v4i64:
1012 ; AVX1:       # %bb.0:
1013 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1014 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1015 ; AVX1-NEXT:    # xmm2 = mem[0,0]
1016 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
1017 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1018 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm3
1019 ; AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm3
1020 ; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm3
1021 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
1022 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1023 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1024 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1025 ; AVX1-NEXT:    retq
1027 ; AVX2-LABEL: splatvar_modulo_shift_v4i64:
1028 ; AVX2:       # %bb.0:
1029 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1030 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1031 ; AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2
1032 ; AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
1033 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
1034 ; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
1035 ; AVX2-NEXT:    retq
1037 ; XOPAVX1-LABEL: splatvar_modulo_shift_v4i64:
1038 ; XOPAVX1:       # %bb.0:
1039 ; XOPAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1040 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1041 ; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm1
1042 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
1043 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1044 ; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm2, %xmm2
1045 ; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm0, %xmm0
1046 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1047 ; XOPAVX1-NEXT:    retq
1049 ; XOPAVX2-LABEL: splatvar_modulo_shift_v4i64:
1050 ; XOPAVX2:       # %bb.0:
1051 ; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1052 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1053 ; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2
1054 ; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
1055 ; XOPAVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
1056 ; XOPAVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
1057 ; XOPAVX2-NEXT:    retq
1059 ; AVX512-LABEL: splatvar_modulo_shift_v4i64:
1060 ; AVX512:       # %bb.0:
1061 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1062 ; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1063 ; AVX512-NEXT:    vpsraq %xmm1, %zmm0, %zmm0
1064 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1065 ; AVX512-NEXT:    retq
1067 ; AVX512VL-LABEL: splatvar_modulo_shift_v4i64:
1068 ; AVX512VL:       # %bb.0:
1069 ; AVX512VL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm1
1070 ; AVX512VL-NEXT:    vpsraq %xmm1, %ymm0, %ymm0
1071 ; AVX512VL-NEXT:    retq
1073 ; X86-AVX1-LABEL: splatvar_modulo_shift_v4i64:
1074 ; X86-AVX1:       # %bb.0:
1075 ; X86-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
1076 ; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
1077 ; X86-AVX1-NEXT:    # xmm2 = mem[0,0]
1078 ; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
1079 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1080 ; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm3
1081 ; X86-AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm3
1082 ; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm3
1083 ; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
1084 ; X86-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1085 ; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1086 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1087 ; X86-AVX1-NEXT:    retl
1089 ; X86-AVX2-LABEL: splatvar_modulo_shift_v4i64:
1090 ; X86-AVX2:       # %bb.0:
1091 ; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
1092 ; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
1093 ; X86-AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2
1094 ; X86-AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
1095 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
1096 ; X86-AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
1097 ; X86-AVX2-NEXT:    retl
1098   %mod = and <4 x i64> %b, <i64 63, i64 63, i64 63, i64 63>
1099   %splat = shufflevector <4 x i64> %mod, <4 x i64> undef, <4 x i32> zeroinitializer
1100   %shift = ashr <4 x i64> %a, %splat
1101   ret <4 x i64> %shift
1104 define <8 x i32> @splatvar_modulo_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
1105 ; AVX1-LABEL: splatvar_modulo_shift_v8i32:
1106 ; AVX1:       # %bb.0:
1107 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1108 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1109 ; AVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2
1110 ; AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
1111 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1112 ; AVX1-NEXT:    retq
1114 ; AVX2-LABEL: splatvar_modulo_shift_v8i32:
1115 ; AVX2:       # %bb.0:
1116 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1117 ; AVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
1118 ; AVX2-NEXT:    retq
1120 ; XOPAVX1-LABEL: splatvar_modulo_shift_v8i32:
1121 ; XOPAVX1:       # %bb.0:
1122 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1123 ; XOPAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1124 ; XOPAVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2
1125 ; XOPAVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
1126 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1127 ; XOPAVX1-NEXT:    retq
1129 ; XOPAVX2-LABEL: splatvar_modulo_shift_v8i32:
1130 ; XOPAVX2:       # %bb.0:
1131 ; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1132 ; XOPAVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
1133 ; XOPAVX2-NEXT:    retq
1135 ; AVX512-LABEL: splatvar_modulo_shift_v8i32:
1136 ; AVX512:       # %bb.0:
1137 ; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1138 ; AVX512-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
1139 ; AVX512-NEXT:    retq
1141 ; AVX512VL-LABEL: splatvar_modulo_shift_v8i32:
1142 ; AVX512VL:       # %bb.0:
1143 ; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1144 ; AVX512VL-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
1145 ; AVX512VL-NEXT:    retq
1147 ; X86-AVX1-LABEL: splatvar_modulo_shift_v8i32:
1148 ; X86-AVX1:       # %bb.0:
1149 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1150 ; X86-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
1151 ; X86-AVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2
1152 ; X86-AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
1153 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1154 ; X86-AVX1-NEXT:    retl
1156 ; X86-AVX2-LABEL: splatvar_modulo_shift_v8i32:
1157 ; X86-AVX2:       # %bb.0:
1158 ; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
1159 ; X86-AVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
1160 ; X86-AVX2-NEXT:    retl
1161   %mod = and <8 x i32> %b, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
1162   %splat = shufflevector <8 x i32> %mod, <8 x i32> undef, <8 x i32> zeroinitializer
1163   %shift = ashr <8 x i32> %a, %splat
1164   ret <8 x i32> %shift
1167 define <16 x i16> @splatvar_modulo_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
1168 ; AVX1-LABEL: splatvar_modulo_shift_v16i16:
1169 ; AVX1:       # %bb.0:
1170 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1171 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1172 ; AVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2
1173 ; AVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
1174 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1175 ; AVX1-NEXT:    retq
1177 ; AVX2-LABEL: splatvar_modulo_shift_v16i16:
1178 ; AVX2:       # %bb.0:
1179 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1180 ; AVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
1181 ; AVX2-NEXT:    retq
1183 ; XOPAVX1-LABEL: splatvar_modulo_shift_v16i16:
1184 ; XOPAVX1:       # %bb.0:
1185 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1186 ; XOPAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1187 ; XOPAVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2
1188 ; XOPAVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
1189 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1190 ; XOPAVX1-NEXT:    retq
1192 ; XOPAVX2-LABEL: splatvar_modulo_shift_v16i16:
1193 ; XOPAVX2:       # %bb.0:
1194 ; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1195 ; XOPAVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
1196 ; XOPAVX2-NEXT:    retq
1198 ; AVX512-LABEL: splatvar_modulo_shift_v16i16:
1199 ; AVX512:       # %bb.0:
1200 ; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1201 ; AVX512-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
1202 ; AVX512-NEXT:    retq
1204 ; AVX512VL-LABEL: splatvar_modulo_shift_v16i16:
1205 ; AVX512VL:       # %bb.0:
1206 ; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1207 ; AVX512VL-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
1208 ; AVX512VL-NEXT:    retq
1210 ; X86-AVX1-LABEL: splatvar_modulo_shift_v16i16:
1211 ; X86-AVX1:       # %bb.0:
1212 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1213 ; X86-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
1214 ; X86-AVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2
1215 ; X86-AVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
1216 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1217 ; X86-AVX1-NEXT:    retl
1219 ; X86-AVX2-LABEL: splatvar_modulo_shift_v16i16:
1220 ; X86-AVX2:       # %bb.0:
1221 ; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
1222 ; X86-AVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
1223 ; X86-AVX2-NEXT:    retl
1224   %mod = and <16 x i16> %b, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
1225   %splat = shufflevector <16 x i16> %mod, <16 x i16> undef, <16 x i32> zeroinitializer
1226   %shift = ashr <16 x i16> %a, %splat
1227   ret <16 x i16> %shift
1230 define <32 x i8> @splatvar_modulo_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
1231 ; AVX1-LABEL: splatvar_modulo_shift_v32i8:
1232 ; AVX1:       # %bb.0:
1233 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1234 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1235 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
1236 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
1237 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm3, %xmm3
1238 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1239 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1240 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [32896,32896,32896,32896,32896,32896,32896,32896]
1241 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm4, %xmm4
1242 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1243 ; AVX1-NEXT:    vpsubb %xmm4, %xmm2, %xmm2
1244 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
1245 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1246 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1247 ; AVX1-NEXT:    vpsubb %xmm4, %xmm0, %xmm0
1248 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1249 ; AVX1-NEXT:    retq
1251 ; AVX2-LABEL: splatvar_modulo_shift_v32i8:
1252 ; AVX2:       # %bb.0:
1253 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1254 ; AVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
1255 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1256 ; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
1257 ; AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm2
1258 ; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
1259 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
1260 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1261 ; AVX2-NEXT:    vpsrlw %xmm1, %ymm2, %ymm1
1262 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1263 ; AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
1264 ; AVX2-NEXT:    retq
1266 ; XOPAVX1-LABEL: splatvar_modulo_shift_v32i8:
1267 ; XOPAVX1:       # %bb.0:
1268 ; XOPAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1269 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1270 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1271 ; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
1272 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1273 ; XOPAVX1-NEXT:    vpshab %xmm1, %xmm2, %xmm2
1274 ; XOPAVX1-NEXT:    vpshab %xmm1, %xmm0, %xmm0
1275 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1276 ; XOPAVX1-NEXT:    retq
1278 ; XOPAVX2-LABEL: splatvar_modulo_shift_v32i8:
1279 ; XOPAVX2:       # %bb.0:
1280 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
1281 ; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1282 ; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1283 ; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
1284 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
1285 ; XOPAVX2-NEXT:    vpshab %xmm1, %xmm2, %xmm2
1286 ; XOPAVX2-NEXT:    vpshab %xmm1, %xmm0, %xmm0
1287 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1288 ; XOPAVX2-NEXT:    retq
1290 ; AVX512DQ-LABEL: splatvar_modulo_shift_v32i8:
1291 ; AVX512DQ:       # %bb.0:
1292 ; AVX512DQ-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1293 ; AVX512DQ-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
1294 ; AVX512DQ-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1295 ; AVX512DQ-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
1296 ; AVX512DQ-NEXT:    vpsrlw $8, %xmm2, %xmm2
1297 ; AVX512DQ-NEXT:    vpbroadcastb %xmm2, %ymm2
1298 ; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm0
1299 ; AVX512DQ-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1300 ; AVX512DQ-NEXT:    vpsrlw %xmm1, %ymm2, %ymm1
1301 ; AVX512DQ-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1302 ; AVX512DQ-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
1303 ; AVX512DQ-NEXT:    retq
1305 ; AVX512BW-LABEL: splatvar_modulo_shift_v32i8:
1306 ; AVX512BW:       # %bb.0:
1307 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
1308 ; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1309 ; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1310 ; AVX512BW-NEXT:    vpsraw %xmm1, %zmm0, %zmm0
1311 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1312 ; AVX512BW-NEXT:    retq
1314 ; AVX512DQVL-LABEL: splatvar_modulo_shift_v32i8:
1315 ; AVX512DQVL:       # %bb.0:
1316 ; AVX512DQVL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1317 ; AVX512DQVL-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
1318 ; AVX512DQVL-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896]
1319 ; AVX512DQVL-NEXT:    vpsrlw %xmm1, %ymm2, %ymm2
1320 ; AVX512DQVL-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
1321 ; AVX512DQVL-NEXT:    vpsrlw %xmm1, %xmm3, %xmm1
1322 ; AVX512DQVL-NEXT:    vpsrlw $8, %xmm1, %xmm1
1323 ; AVX512DQVL-NEXT:    vpbroadcastb %xmm1, %ymm1
1324 ; AVX512DQVL-NEXT:    vpternlogq $108, %ymm0, %ymm2, %ymm1
1325 ; AVX512DQVL-NEXT:    vpsubb %ymm2, %ymm1, %ymm0
1326 ; AVX512DQVL-NEXT:    retq
1328 ; AVX512BWVL-LABEL: splatvar_modulo_shift_v32i8:
1329 ; AVX512BWVL:       # %bb.0:
1330 ; AVX512BWVL-NEXT:    vpmovsxbw %ymm0, %zmm0
1331 ; AVX512BWVL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1
1332 ; AVX512BWVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1333 ; AVX512BWVL-NEXT:    vpsraw %xmm1, %zmm0, %zmm0
1334 ; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm0
1335 ; AVX512BWVL-NEXT:    retq
1337 ; X86-AVX1-LABEL: splatvar_modulo_shift_v32i8:
1338 ; X86-AVX1:       # %bb.0:
1339 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1340 ; X86-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
1341 ; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
1342 ; X86-AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
1343 ; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm3, %xmm3
1344 ; X86-AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1345 ; X86-AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1346 ; X86-AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [32896,32896,32896,32896,32896,32896,32896,32896]
1347 ; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm4, %xmm4
1348 ; X86-AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1349 ; X86-AVX1-NEXT:    vpsubb %xmm4, %xmm2, %xmm2
1350 ; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
1351 ; X86-AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1352 ; X86-AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1353 ; X86-AVX1-NEXT:    vpsubb %xmm4, %xmm0, %xmm0
1354 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1355 ; X86-AVX1-NEXT:    retl
1357 ; X86-AVX2-LABEL: splatvar_modulo_shift_v32i8:
1358 ; X86-AVX2:       # %bb.0:
1359 ; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
1360 ; X86-AVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
1361 ; X86-AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1362 ; X86-AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
1363 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm2
1364 ; X86-AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
1365 ; X86-AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
1366 ; X86-AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1367 ; X86-AVX2-NEXT:    vpsrlw %xmm1, %ymm2, %ymm1
1368 ; X86-AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1369 ; X86-AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
1370 ; X86-AVX2-NEXT:    retl
1371   %mod = and <32 x i8> %b, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
1372   %splat = shufflevector <32 x i8> %mod, <32 x i8> undef, <32 x i32> zeroinitializer
1373   %shift = ashr <32 x i8> %a, %splat
1374   ret <32 x i8> %shift
1378 ; Constant Shifts
1381 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
1382 ; AVX1-LABEL: constant_shift_v4i64:
1383 ; AVX1:       # %bb.0:
1384 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1385 ; AVX1-NEXT:    vpsrlq $62, %xmm1, %xmm2
1386 ; AVX1-NEXT:    vpsrlq $31, %xmm1, %xmm1
1387 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
1388 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [4294967296,2]
1389 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
1390 ; AVX1-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1391 ; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm2
1392 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
1393 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
1394 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [4611686018427387904,72057594037927936]
1395 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1396 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1397 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1398 ; AVX1-NEXT:    retq
1400 ; AVX2-LABEL: constant_shift_v4i64:
1401 ; AVX2:       # %bb.0:
1402 ; AVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1403 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2]
1404 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1405 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
1406 ; AVX2-NEXT:    retq
1408 ; XOPAVX1-LABEL: constant_shift_v4i64:
1409 ; XOPAVX1:       # %bb.0:
1410 ; XOPAVX1-NEXT:    vpshaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1411 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1412 ; XOPAVX1-NEXT:    vpshaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1413 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1414 ; XOPAVX1-NEXT:    retq
1416 ; XOPAVX2-LABEL: constant_shift_v4i64:
1417 ; XOPAVX2:       # %bb.0:
1418 ; XOPAVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1419 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2]
1420 ; XOPAVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1421 ; XOPAVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
1422 ; XOPAVX2-NEXT:    retq
1424 ; AVX512-LABEL: constant_shift_v4i64:
1425 ; AVX512:       # %bb.0:
1426 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1427 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,7,31,62]
1428 ; AVX512-NEXT:    vpsravq %zmm1, %zmm0, %zmm0
1429 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1430 ; AVX512-NEXT:    retq
1432 ; AVX512VL-LABEL: constant_shift_v4i64:
1433 ; AVX512VL:       # %bb.0:
1434 ; AVX512VL-NEXT:    vpsravq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1435 ; AVX512VL-NEXT:    retq
1437 ; X86-AVX1-LABEL: constant_shift_v4i64:
1438 ; X86-AVX1:       # %bb.0:
1439 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1440 ; X86-AVX1-NEXT:    vpsrlq $62, %xmm1, %xmm2
1441 ; X86-AVX1-NEXT:    vpsrlq $31, %xmm1, %xmm1
1442 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
1443 ; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,0]
1444 ; X86-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
1445 ; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1446 ; X86-AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm2
1447 ; X86-AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
1448 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
1449 ; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1073741824,0,16777216]
1450 ; X86-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1451 ; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1452 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1453 ; X86-AVX1-NEXT:    retl
1455 ; X86-AVX2-LABEL: constant_shift_v4i64:
1456 ; X86-AVX2:       # %bb.0:
1457 ; X86-AVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0
1458 ; X86-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1073741824,0,16777216,0,1,2,0]
1459 ; X86-AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1460 ; X86-AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
1461 ; X86-AVX2-NEXT:    retl
1462   %shift = ashr <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
1463   ret <4 x i64> %shift
1466 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
1467 ; AVX1-LABEL: constant_shift_v8i32:
1468 ; AVX1:       # %bb.0:
1469 ; AVX1-NEXT:    vpsrad $7, %xmm0, %xmm1
1470 ; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm2
1471 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
1472 ; AVX1-NEXT:    vpsrad $6, %xmm0, %xmm2
1473 ; AVX1-NEXT:    vpsrad $4, %xmm0, %xmm3
1474 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
1475 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
1476 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1477 ; AVX1-NEXT:    vpsrad $7, %xmm0, %xmm2
1478 ; AVX1-NEXT:    vpsrad $9, %xmm0, %xmm3
1479 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
1480 ; AVX1-NEXT:    vpsrad $8, %xmm0, %xmm0
1481 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1482 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1483 ; AVX1-NEXT:    retq
1485 ; AVX2-LABEL: constant_shift_v8i32:
1486 ; AVX2:       # %bb.0:
1487 ; AVX2-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1488 ; AVX2-NEXT:    retq
1490 ; XOPAVX1-LABEL: constant_shift_v8i32:
1491 ; XOPAVX1:       # %bb.0:
1492 ; XOPAVX1-NEXT:    vpshad {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1493 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1494 ; XOPAVX1-NEXT:    vpshad {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1495 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1496 ; XOPAVX1-NEXT:    retq
1498 ; XOPAVX2-LABEL: constant_shift_v8i32:
1499 ; XOPAVX2:       # %bb.0:
1500 ; XOPAVX2-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1501 ; XOPAVX2-NEXT:    retq
1503 ; AVX512-LABEL: constant_shift_v8i32:
1504 ; AVX512:       # %bb.0:
1505 ; AVX512-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1506 ; AVX512-NEXT:    retq
1508 ; AVX512VL-LABEL: constant_shift_v8i32:
1509 ; AVX512VL:       # %bb.0:
1510 ; AVX512VL-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1511 ; AVX512VL-NEXT:    retq
1513 ; X86-AVX1-LABEL: constant_shift_v8i32:
1514 ; X86-AVX1:       # %bb.0:
1515 ; X86-AVX1-NEXT:    vpsrad $7, %xmm0, %xmm1
1516 ; X86-AVX1-NEXT:    vpsrad $5, %xmm0, %xmm2
1517 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
1518 ; X86-AVX1-NEXT:    vpsrad $6, %xmm0, %xmm2
1519 ; X86-AVX1-NEXT:    vpsrad $4, %xmm0, %xmm3
1520 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
1521 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
1522 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1523 ; X86-AVX1-NEXT:    vpsrad $7, %xmm0, %xmm2
1524 ; X86-AVX1-NEXT:    vpsrad $9, %xmm0, %xmm3
1525 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
1526 ; X86-AVX1-NEXT:    vpsrad $8, %xmm0, %xmm0
1527 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1528 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1529 ; X86-AVX1-NEXT:    retl
1531 ; X86-AVX2-LABEL: constant_shift_v8i32:
1532 ; X86-AVX2:       # %bb.0:
1533 ; X86-AVX2-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0
1534 ; X86-AVX2-NEXT:    retl
1535   %shift = ashr <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
1536   ret <8 x i32> %shift
1539 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
1540 ; AVX1-LABEL: constant_shift_v16i16:
1541 ; AVX1:       # %bb.0:
1542 ; AVX1-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1543 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]
1544 ; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm2
1545 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2,3,4,5,6,7]
1546 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1547 ; AVX1-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1548 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1549 ; AVX1-NEXT:    retq
1551 ; AVX2-LABEL: constant_shift_v16i16:
1552 ; AVX2:       # %bb.0:
1553 ; AVX2-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
1554 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1,2,3,4,5,6,7]
1555 ; AVX2-NEXT:    vpsraw $1, %xmm0, %xmm0
1556 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2,3,4,5,6,7]
1557 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1558 ; AVX2-NEXT:    retq
1560 ; XOPAVX1-LABEL: constant_shift_v16i16:
1561 ; XOPAVX1:       # %bb.0:
1562 ; XOPAVX1-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1563 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1564 ; XOPAVX1-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1565 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1566 ; XOPAVX1-NEXT:    retq
1568 ; XOPAVX2-LABEL: constant_shift_v16i16:
1569 ; XOPAVX2:       # %bb.0:
1570 ; XOPAVX2-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1571 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1572 ; XOPAVX2-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1573 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1574 ; XOPAVX2-NEXT:    retq
1576 ; AVX512DQ-LABEL: constant_shift_v16i16:
1577 ; AVX512DQ:       # %bb.0:
1578 ; AVX512DQ-NEXT:    vpmovsxwd %ymm0, %zmm0
1579 ; AVX512DQ-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1580 ; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
1581 ; AVX512DQ-NEXT:    retq
1583 ; AVX512BW-LABEL: constant_shift_v16i16:
1584 ; AVX512BW:       # %bb.0:
1585 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1586 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1587 ; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
1588 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1589 ; AVX512BW-NEXT:    retq
1591 ; AVX512DQVL-LABEL: constant_shift_v16i16:
1592 ; AVX512DQVL:       # %bb.0:
1593 ; AVX512DQVL-NEXT:    vpmovsxwd %ymm0, %zmm0
1594 ; AVX512DQVL-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1595 ; AVX512DQVL-NEXT:    vpmovdw %zmm0, %ymm0
1596 ; AVX512DQVL-NEXT:    retq
1598 ; AVX512BWVL-LABEL: constant_shift_v16i16:
1599 ; AVX512BWVL:       # %bb.0:
1600 ; AVX512BWVL-NEXT:    vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1601 ; AVX512BWVL-NEXT:    retq
1603 ; X86-AVX1-LABEL: constant_shift_v16i16:
1604 ; X86-AVX1:       # %bb.0:
1605 ; X86-AVX1-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1
1606 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]
1607 ; X86-AVX1-NEXT:    vpsraw $1, %xmm0, %xmm2
1608 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2,3,4,5,6,7]
1609 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1610 ; X86-AVX1-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
1611 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1612 ; X86-AVX1-NEXT:    retl
1614 ; X86-AVX2-LABEL: constant_shift_v16i16:
1615 ; X86-AVX2:       # %bb.0:
1616 ; X86-AVX2-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm1
1617 ; X86-AVX2-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1,2,3,4,5,6,7]
1618 ; X86-AVX2-NEXT:    vpsraw $1, %xmm0, %xmm0
1619 ; X86-AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2,3,4,5,6,7]
1620 ; X86-AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1621 ; X86-AVX2-NEXT:    retl
1622   %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>
1623   ret <16 x i16> %shift
1626 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
1627 ; AVX1-LABEL: constant_shift_v32i8:
1628 ; AVX1:       # %bb.0:
1629 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1630 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1631 ; AVX1-NEXT:    vpsraw $8, %xmm2, %xmm2
1632 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [2,4,8,16,32,64,128,256]
1633 ; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
1634 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1635 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1636 ; AVX1-NEXT:    vpsraw $8, %xmm1, %xmm1
1637 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [256,128,64,32,16,8,4,2]
1638 ; AVX1-NEXT:    vpmullw %xmm4, %xmm1, %xmm1
1639 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
1640 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
1641 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1642 ; AVX1-NEXT:    vpsraw $8, %xmm2, %xmm2
1643 ; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
1644 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1645 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1646 ; AVX1-NEXT:    vpsraw $8, %xmm0, %xmm0
1647 ; AVX1-NEXT:    vpmullw %xmm4, %xmm0, %xmm0
1648 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1649 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1650 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1651 ; AVX1-NEXT:    retq
1653 ; AVX2-LABEL: constant_shift_v32i8:
1654 ; AVX2:       # %bb.0:
1655 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
1656 ; AVX2-NEXT:    vpsraw $8, %ymm1, %ymm1
1657 ; AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1658 ; AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
1659 ; 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]
1660 ; AVX2-NEXT:    vpsraw $8, %ymm0, %ymm0
1661 ; AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1662 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1663 ; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
1664 ; AVX2-NEXT:    retq
1666 ; XOPAVX1-LABEL: constant_shift_v32i8:
1667 ; XOPAVX1:       # %bb.0:
1668 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1669 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,255,254,253,252,251,250,249,249,250,251,252,253,254,255,0]
1670 ; XOPAVX1-NEXT:    vpshab %xmm2, %xmm1, %xmm1
1671 ; XOPAVX1-NEXT:    vpshab %xmm2, %xmm0, %xmm0
1672 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1673 ; XOPAVX1-NEXT:    retq
1675 ; XOPAVX2-LABEL: constant_shift_v32i8:
1676 ; XOPAVX2:       # %bb.0:
1677 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1678 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,255,254,253,252,251,250,249,249,250,251,252,253,254,255,0]
1679 ; XOPAVX2-NEXT:    vpshab %xmm2, %xmm1, %xmm1
1680 ; XOPAVX2-NEXT:    vpshab %xmm2, %xmm0, %xmm0
1681 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1682 ; XOPAVX2-NEXT:    retq
1684 ; AVX512DQ-LABEL: constant_shift_v32i8:
1685 ; AVX512DQ:       # %bb.0:
1686 ; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
1687 ; AVX512DQ-NEXT:    vpsraw $8, %ymm1, %ymm1
1688 ; AVX512DQ-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1689 ; AVX512DQ-NEXT:    vpsrlw $8, %ymm1, %ymm1
1690 ; AVX512DQ-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]
1691 ; AVX512DQ-NEXT:    vpsraw $8, %ymm0, %ymm0
1692 ; AVX512DQ-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1693 ; AVX512DQ-NEXT:    vpsrlw $8, %ymm0, %ymm0
1694 ; AVX512DQ-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
1695 ; AVX512DQ-NEXT:    retq
1697 ; AVX512BW-LABEL: constant_shift_v32i8:
1698 ; AVX512BW:       # %bb.0:
1699 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
1700 ; AVX512BW-NEXT:    vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1701 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1702 ; AVX512BW-NEXT:    retq
1704 ; AVX512DQVL-LABEL: constant_shift_v32i8:
1705 ; AVX512DQVL:       # %bb.0:
1706 ; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
1707 ; AVX512DQVL-NEXT:    vpsraw $8, %ymm1, %ymm1
1708 ; AVX512DQVL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1709 ; AVX512DQVL-NEXT:    vpsrlw $8, %ymm1, %ymm1
1710 ; AVX512DQVL-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]
1711 ; AVX512DQVL-NEXT:    vpsraw $8, %ymm0, %ymm0
1712 ; AVX512DQVL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1713 ; AVX512DQVL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1714 ; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
1715 ; AVX512DQVL-NEXT:    retq
1717 ; AVX512BWVL-LABEL: constant_shift_v32i8:
1718 ; AVX512BWVL:       # %bb.0:
1719 ; AVX512BWVL-NEXT:    vpmovsxbw %ymm0, %zmm0
1720 ; AVX512BWVL-NEXT:    vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1721 ; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm0
1722 ; AVX512BWVL-NEXT:    retq
1724 ; X86-AVX1-LABEL: constant_shift_v32i8:
1725 ; X86-AVX1:       # %bb.0:
1726 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1727 ; X86-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1728 ; X86-AVX1-NEXT:    vpsraw $8, %xmm2, %xmm2
1729 ; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [2,4,8,16,32,64,128,256]
1730 ; X86-AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
1731 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1732 ; X86-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1733 ; X86-AVX1-NEXT:    vpsraw $8, %xmm1, %xmm1
1734 ; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [256,128,64,32,16,8,4,2]
1735 ; X86-AVX1-NEXT:    vpmullw %xmm4, %xmm1, %xmm1
1736 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
1737 ; X86-AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
1738 ; X86-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1739 ; X86-AVX1-NEXT:    vpsraw $8, %xmm2, %xmm2
1740 ; X86-AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
1741 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1742 ; X86-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1743 ; X86-AVX1-NEXT:    vpsraw $8, %xmm0, %xmm0
1744 ; X86-AVX1-NEXT:    vpmullw %xmm4, %xmm0, %xmm0
1745 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1746 ; X86-AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1747 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1748 ; X86-AVX1-NEXT:    retl
1750 ; X86-AVX2-LABEL: constant_shift_v32i8:
1751 ; X86-AVX2:       # %bb.0:
1752 ; X86-AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
1753 ; X86-AVX2-NEXT:    vpsraw $8, %ymm1, %ymm1
1754 ; X86-AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}, %ymm1, %ymm1
1755 ; X86-AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
1756 ; X86-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]
1757 ; X86-AVX2-NEXT:    vpsraw $8, %ymm0, %ymm0
1758 ; X86-AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0
1759 ; X86-AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1760 ; X86-AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
1761 ; X86-AVX2-NEXT:    retl
1762   %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>
1763   ret <32 x i8> %shift
1767 ; Uniform Constant Shifts
1770 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
1771 ; AVX1-LABEL: splatconstant_shift_v4i64:
1772 ; AVX1:       # %bb.0:
1773 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1774 ; AVX1-NEXT:    vpsrad $7, %xmm1, %xmm2
1775 ; AVX1-NEXT:    vpsrlq $7, %xmm1, %xmm1
1776 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1777 ; AVX1-NEXT:    vpsrad $7, %xmm0, %xmm2
1778 ; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm0
1779 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1780 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1781 ; AVX1-NEXT:    retq
1783 ; AVX2-LABEL: splatconstant_shift_v4i64:
1784 ; AVX2:       # %bb.0:
1785 ; AVX2-NEXT:    vpsrad $7, %ymm0, %ymm1
1786 ; AVX2-NEXT:    vpsrlq $7, %ymm0, %ymm0
1787 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
1788 ; AVX2-NEXT:    retq
1790 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
1791 ; XOPAVX1:       # %bb.0:
1792 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1793 ; XOPAVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [18446744073709551609,18446744073709551609]
1794 ; XOPAVX1-NEXT:    # xmm2 = mem[0,0]
1795 ; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm1, %xmm1
1796 ; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm0, %xmm0
1797 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1798 ; XOPAVX1-NEXT:    retq
1800 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
1801 ; XOPAVX2:       # %bb.0:
1802 ; XOPAVX2-NEXT:    vpsrad $7, %ymm0, %ymm1
1803 ; XOPAVX2-NEXT:    vpsrlq $7, %ymm0, %ymm0
1804 ; XOPAVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
1805 ; XOPAVX2-NEXT:    retq
1807 ; AVX512-LABEL: splatconstant_shift_v4i64:
1808 ; AVX512:       # %bb.0:
1809 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1810 ; AVX512-NEXT:    vpsraq $7, %zmm0, %zmm0
1811 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1812 ; AVX512-NEXT:    retq
1814 ; AVX512VL-LABEL: splatconstant_shift_v4i64:
1815 ; AVX512VL:       # %bb.0:
1816 ; AVX512VL-NEXT:    vpsraq $7, %ymm0, %ymm0
1817 ; AVX512VL-NEXT:    retq
1819 ; X86-AVX1-LABEL: splatconstant_shift_v4i64:
1820 ; X86-AVX1:       # %bb.0:
1821 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1822 ; X86-AVX1-NEXT:    vpsrad $7, %xmm1, %xmm2
1823 ; X86-AVX1-NEXT:    vpsrlq $7, %xmm1, %xmm1
1824 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1825 ; X86-AVX1-NEXT:    vpsrad $7, %xmm0, %xmm2
1826 ; X86-AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm0
1827 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1828 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1829 ; X86-AVX1-NEXT:    retl
1831 ; X86-AVX2-LABEL: splatconstant_shift_v4i64:
1832 ; X86-AVX2:       # %bb.0:
1833 ; X86-AVX2-NEXT:    vpsrad $7, %ymm0, %ymm1
1834 ; X86-AVX2-NEXT:    vpsrlq $7, %ymm0, %ymm0
1835 ; X86-AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
1836 ; X86-AVX2-NEXT:    retl
1837   %shift = ashr <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
1838   ret <4 x i64> %shift
1841 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
1842 ; AVX1-LABEL: splatconstant_shift_v8i32:
1843 ; AVX1:       # %bb.0:
1844 ; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm1
1845 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1846 ; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm0
1847 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1848 ; AVX1-NEXT:    retq
1850 ; AVX2-LABEL: splatconstant_shift_v8i32:
1851 ; AVX2:       # %bb.0:
1852 ; AVX2-NEXT:    vpsrad $5, %ymm0, %ymm0
1853 ; AVX2-NEXT:    retq
1855 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
1856 ; XOPAVX1:       # %bb.0:
1857 ; XOPAVX1-NEXT:    vpsrad $5, %xmm0, %xmm1
1858 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1859 ; XOPAVX1-NEXT:    vpsrad $5, %xmm0, %xmm0
1860 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1861 ; XOPAVX1-NEXT:    retq
1863 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
1864 ; XOPAVX2:       # %bb.0:
1865 ; XOPAVX2-NEXT:    vpsrad $5, %ymm0, %ymm0
1866 ; XOPAVX2-NEXT:    retq
1868 ; AVX512-LABEL: splatconstant_shift_v8i32:
1869 ; AVX512:       # %bb.0:
1870 ; AVX512-NEXT:    vpsrad $5, %ymm0, %ymm0
1871 ; AVX512-NEXT:    retq
1873 ; AVX512VL-LABEL: splatconstant_shift_v8i32:
1874 ; AVX512VL:       # %bb.0:
1875 ; AVX512VL-NEXT:    vpsrad $5, %ymm0, %ymm0
1876 ; AVX512VL-NEXT:    retq
1878 ; X86-AVX1-LABEL: splatconstant_shift_v8i32:
1879 ; X86-AVX1:       # %bb.0:
1880 ; X86-AVX1-NEXT:    vpsrad $5, %xmm0, %xmm1
1881 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1882 ; X86-AVX1-NEXT:    vpsrad $5, %xmm0, %xmm0
1883 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1884 ; X86-AVX1-NEXT:    retl
1886 ; X86-AVX2-LABEL: splatconstant_shift_v8i32:
1887 ; X86-AVX2:       # %bb.0:
1888 ; X86-AVX2-NEXT:    vpsrad $5, %ymm0, %ymm0
1889 ; X86-AVX2-NEXT:    retl
1890   %shift = ashr <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
1891   ret <8 x i32> %shift
1894 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
1895 ; AVX1-LABEL: splatconstant_shift_v16i16:
1896 ; AVX1:       # %bb.0:
1897 ; AVX1-NEXT:    vpsraw $3, %xmm0, %xmm1
1898 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1899 ; AVX1-NEXT:    vpsraw $3, %xmm0, %xmm0
1900 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1901 ; AVX1-NEXT:    retq
1903 ; AVX2-LABEL: splatconstant_shift_v16i16:
1904 ; AVX2:       # %bb.0:
1905 ; AVX2-NEXT:    vpsraw $3, %ymm0, %ymm0
1906 ; AVX2-NEXT:    retq
1908 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
1909 ; XOPAVX1:       # %bb.0:
1910 ; XOPAVX1-NEXT:    vpsraw $3, %xmm0, %xmm1
1911 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1912 ; XOPAVX1-NEXT:    vpsraw $3, %xmm0, %xmm0
1913 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1914 ; XOPAVX1-NEXT:    retq
1916 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
1917 ; XOPAVX2:       # %bb.0:
1918 ; XOPAVX2-NEXT:    vpsraw $3, %ymm0, %ymm0
1919 ; XOPAVX2-NEXT:    retq
1921 ; AVX512-LABEL: splatconstant_shift_v16i16:
1922 ; AVX512:       # %bb.0:
1923 ; AVX512-NEXT:    vpsraw $3, %ymm0, %ymm0
1924 ; AVX512-NEXT:    retq
1926 ; AVX512VL-LABEL: splatconstant_shift_v16i16:
1927 ; AVX512VL:       # %bb.0:
1928 ; AVX512VL-NEXT:    vpsraw $3, %ymm0, %ymm0
1929 ; AVX512VL-NEXT:    retq
1931 ; X86-AVX1-LABEL: splatconstant_shift_v16i16:
1932 ; X86-AVX1:       # %bb.0:
1933 ; X86-AVX1-NEXT:    vpsraw $3, %xmm0, %xmm1
1934 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1935 ; X86-AVX1-NEXT:    vpsraw $3, %xmm0, %xmm0
1936 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1937 ; X86-AVX1-NEXT:    retl
1939 ; X86-AVX2-LABEL: splatconstant_shift_v16i16:
1940 ; X86-AVX2:       # %bb.0:
1941 ; X86-AVX2-NEXT:    vpsraw $3, %ymm0, %ymm0
1942 ; X86-AVX2-NEXT:    retl
1943   %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>
1944   ret <16 x i16> %shift
1947 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
1948 ; AVX1-LABEL: splatconstant_shift_v32i8:
1949 ; AVX1:       # %bb.0:
1950 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1951 ; AVX1-NEXT:    vpsrlw $3, %xmm1, %xmm1
1952 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]
1953 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
1954 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1955 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
1956 ; AVX1-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
1957 ; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm0
1958 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
1959 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
1960 ; AVX1-NEXT:    vpsubb %xmm3, %xmm0, %xmm0
1961 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1962 ; AVX1-NEXT:    retq
1964 ; AVX2-LABEL: splatconstant_shift_v32i8:
1965 ; AVX2:       # %bb.0:
1966 ; AVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
1967 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1968 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} 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]
1969 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1970 ; AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
1971 ; AVX2-NEXT:    retq
1973 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
1974 ; XOPAVX1:       # %bb.0:
1975 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1976 ; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253]
1977 ; XOPAVX1-NEXT:    vpshab %xmm2, %xmm1, %xmm1
1978 ; XOPAVX1-NEXT:    vpshab %xmm2, %xmm0, %xmm0
1979 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1980 ; XOPAVX1-NEXT:    retq
1982 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
1983 ; XOPAVX2:       # %bb.0:
1984 ; XOPAVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
1985 ; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1986 ; XOPAVX2-NEXT:    vpbroadcastb {{.*#+}} 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]
1987 ; XOPAVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1988 ; XOPAVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
1989 ; XOPAVX2-NEXT:    retq
1991 ; AVX512-LABEL: splatconstant_shift_v32i8:
1992 ; AVX512:       # %bb.0:
1993 ; AVX512-NEXT:    vpsrlw $3, %ymm0, %ymm0
1994 ; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1995 ; AVX512-NEXT:    vpbroadcastb {{.*#+}} 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]
1996 ; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1997 ; AVX512-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
1998 ; AVX512-NEXT:    retq
2000 ; AVX512DQVL-LABEL: splatconstant_shift_v32i8:
2001 ; AVX512DQVL:       # %bb.0:
2002 ; AVX512DQVL-NEXT:    vpsrlw $3, %ymm0, %ymm0
2003 ; AVX512DQVL-NEXT:    vpbroadcastd {{.*#+}} 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]
2004 ; AVX512DQVL-NEXT:    vpternlogd $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm0
2005 ; AVX512DQVL-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
2006 ; AVX512DQVL-NEXT:    retq
2008 ; AVX512BWVL-LABEL: splatconstant_shift_v32i8:
2009 ; AVX512BWVL:       # %bb.0:
2010 ; AVX512BWVL-NEXT:    vpsrlw $3, %ymm0, %ymm0
2011 ; AVX512BWVL-NEXT:    vpbroadcastb {{.*#+}} 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]
2012 ; AVX512BWVL-NEXT:    vpternlogd $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm0
2013 ; AVX512BWVL-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
2014 ; AVX512BWVL-NEXT:    retq
2016 ; X86-AVX1-LABEL: splatconstant_shift_v32i8:
2017 ; X86-AVX1:       # %bb.0:
2018 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2019 ; X86-AVX1-NEXT:    vpsrlw $3, %xmm1, %xmm1
2020 ; X86-AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]
2021 ; X86-AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
2022 ; X86-AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
2023 ; X86-AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
2024 ; X86-AVX1-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
2025 ; X86-AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm0
2026 ; X86-AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
2027 ; X86-AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
2028 ; X86-AVX1-NEXT:    vpsubb %xmm3, %xmm0, %xmm0
2029 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2030 ; X86-AVX1-NEXT:    retl
2032 ; X86-AVX2-LABEL: splatconstant_shift_v32i8:
2033 ; X86-AVX2:       # %bb.0:
2034 ; X86-AVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
2035 ; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0
2036 ; X86-AVX2-NEXT:    vpbroadcastb {{.*#+}} 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]
2037 ; X86-AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
2038 ; X86-AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
2039 ; X86-AVX2-NEXT:    retl
2040   %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>
2041   ret <32 x i8> %shift
2045 ; Special Cases
2048 define <4 x i64> @shift32_v4i64(<4 x i64> %a) nounwind {
2049 ; AVX1-LABEL: shift32_v4i64:
2050 ; AVX1:       # %bb.0:
2051 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2052 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
2053 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2054 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
2055 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm2
2056 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2057 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
2058 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2059 ; AVX1-NEXT:    retq
2061 ; AVX2-LABEL: shift32_v4i64:
2062 ; AVX2:       # %bb.0:
2063 ; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm1
2064 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[1,1,3,3,5,5,7,7]
2065 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
2066 ; AVX2-NEXT:    retq
2068 ; XOPAVX1-LABEL: shift32_v4i64:
2069 ; XOPAVX1:       # %bb.0:
2070 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2071 ; XOPAVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [18446744073709551584,18446744073709551584]
2072 ; XOPAVX1-NEXT:    # xmm2 = mem[0,0]
2073 ; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm1, %xmm1
2074 ; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm0, %xmm0
2075 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2076 ; XOPAVX1-NEXT:    retq
2078 ; XOPAVX2-LABEL: shift32_v4i64:
2079 ; XOPAVX2:       # %bb.0:
2080 ; XOPAVX2-NEXT:    vpsrad $31, %ymm0, %ymm1
2081 ; XOPAVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[1,1,3,3,5,5,7,7]
2082 ; XOPAVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
2083 ; XOPAVX2-NEXT:    retq
2085 ; AVX512-LABEL: shift32_v4i64:
2086 ; AVX512:       # %bb.0:
2087 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2088 ; AVX512-NEXT:    vpsraq $32, %zmm0, %zmm0
2089 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2090 ; AVX512-NEXT:    retq
2092 ; AVX512VL-LABEL: shift32_v4i64:
2093 ; AVX512VL:       # %bb.0:
2094 ; AVX512VL-NEXT:    vpsraq $32, %ymm0, %ymm0
2095 ; AVX512VL-NEXT:    retq
2097 ; X86-AVX1-LABEL: shift32_v4i64:
2098 ; X86-AVX1:       # %bb.0:
2099 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2100 ; X86-AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
2101 ; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2102 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
2103 ; X86-AVX1-NEXT:    vpsrad $31, %xmm0, %xmm2
2104 ; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2105 ; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
2106 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2107 ; X86-AVX1-NEXT:    retl
2109 ; X86-AVX2-LABEL: shift32_v4i64:
2110 ; X86-AVX2:       # %bb.0:
2111 ; X86-AVX2-NEXT:    vpsrad $31, %ymm0, %ymm1
2112 ; X86-AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[1,1,3,3,5,5,7,7]
2113 ; X86-AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
2114 ; X86-AVX2-NEXT:    retl
2115   %shift = ashr <4 x i64> %a, <i64 32, i64 32, i64 32, i64 32>
2116   ret <4 x i64> %shift
2119 define <4 x i64> @PR52719(<4 x i64> %a0, i32 %a1) {
2120 ; AVX1-LABEL: PR52719:
2121 ; AVX1:       # %bb.0:
2122 ; AVX1-NEXT:    vmovd %edi, %xmm1
2123 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
2124 ; AVX1-NEXT:    # xmm2 = mem[0,0]
2125 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
2126 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2127 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm3
2128 ; AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm3
2129 ; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm3
2130 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
2131 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
2132 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
2133 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
2134 ; AVX1-NEXT:    retq
2136 ; AVX2-LABEL: PR52719:
2137 ; AVX2:       # %bb.0:
2138 ; AVX2-NEXT:    vmovd %edi, %xmm1
2139 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2140 ; AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2
2141 ; AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
2142 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
2143 ; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
2144 ; AVX2-NEXT:    retq
2146 ; XOPAVX1-LABEL: PR52719:
2147 ; XOPAVX1:       # %bb.0:
2148 ; XOPAVX1-NEXT:    vmovd %edi, %xmm1
2149 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
2150 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2151 ; XOPAVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
2152 ; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
2153 ; XOPAVX1-NEXT:    vpsubq %xmm3, %xmm2, %xmm3
2154 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
2155 ; XOPAVX1-NEXT:    vpshaq %xmm3, %xmm4, %xmm3
2156 ; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm1
2157 ; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm0, %xmm0
2158 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
2159 ; XOPAVX1-NEXT:    retq
2161 ; XOPAVX2-LABEL: PR52719:
2162 ; XOPAVX2:       # %bb.0:
2163 ; XOPAVX2-NEXT:    vmovd %edi, %xmm1
2164 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2165 ; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2
2166 ; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
2167 ; XOPAVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
2168 ; XOPAVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
2169 ; XOPAVX2-NEXT:    retq
2171 ; AVX512-LABEL: PR52719:
2172 ; AVX512:       # %bb.0:
2173 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2174 ; AVX512-NEXT:    vmovd %edi, %xmm1
2175 ; AVX512-NEXT:    vpsraq %xmm1, %zmm0, %zmm0
2176 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2177 ; AVX512-NEXT:    retq
2179 ; AVX512VL-LABEL: PR52719:
2180 ; AVX512VL:       # %bb.0:
2181 ; AVX512VL-NEXT:    vmovd %edi, %xmm1
2182 ; AVX512VL-NEXT:    vpsraq %xmm1, %ymm0, %ymm0
2183 ; AVX512VL-NEXT:    retq
2185 ; X86-AVX1-LABEL: PR52719:
2186 ; X86-AVX1:       # %bb.0:
2187 ; X86-AVX1-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2188 ; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
2189 ; X86-AVX1-NEXT:    # xmm2 = mem[0,0]
2190 ; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
2191 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2192 ; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm3
2193 ; X86-AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm3
2194 ; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm3
2195 ; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
2196 ; X86-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
2197 ; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
2198 ; X86-AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
2199 ; X86-AVX1-NEXT:    retl
2201 ; X86-AVX2-LABEL: PR52719:
2202 ; X86-AVX2:       # %bb.0:
2203 ; X86-AVX2-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2204 ; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
2205 ; X86-AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2
2206 ; X86-AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
2207 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
2208 ; X86-AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
2209 ; X86-AVX2-NEXT:    retl
2210   %vec = insertelement <4 x i32> poison, i32 %a1, i64 0
2211   %splat = shufflevector <4 x i32> %vec, <4 x i32> poison, <4 x i32> zeroinitializer
2212   %zext = zext <4 x i32> %splat to <4 x i64>
2213   %ashr = ashr <4 x i64> %a0, %zext
2214   ret <4 x i64> %ashr