Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-shift-shl-512.ll
blob8eca56d099feb38588d3bdc54b651f14399812c7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=ALL,AVX512DQ
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=ALL,AVX512BW
6 ; Variable Shifts
9 define <8 x i64> @var_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind {
10 ; ALL-LABEL: var_shift_v8i64:
11 ; ALL:       # %bb.0:
12 ; ALL-NEXT:    vpsllvq %zmm1, %zmm0, %zmm0
13 ; ALL-NEXT:    retq
14   %shift = shl <8 x i64> %a, %b
15   ret <8 x i64> %shift
18 define <16 x i32> @var_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind {
19 ; ALL-LABEL: var_shift_v16i32:
20 ; ALL:       # %bb.0:
21 ; ALL-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
22 ; ALL-NEXT:    retq
23   %shift = shl <16 x i32> %a, %b
24   ret <16 x i32> %shift
27 define <32 x i16> @var_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
28 ; AVX512DQ-LABEL: var_shift_v32i16:
29 ; AVX512DQ:       # %bb.0:
30 ; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm2 = 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
31 ; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm3 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
32 ; AVX512DQ-NEXT:    vpsllvd %zmm2, %zmm3, %zmm2
33 ; AVX512DQ-NEXT:    vpmovdw %zmm2, %ymm2
34 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
35 ; 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
36 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm0
37 ; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
38 ; AVX512DQ-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
39 ; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
40 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm0, %zmm2, %zmm0
41 ; AVX512DQ-NEXT:    retq
43 ; AVX512BW-LABEL: var_shift_v32i16:
44 ; AVX512BW:       # %bb.0:
45 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
46 ; AVX512BW-NEXT:    retq
47   %shift = shl <32 x i16> %a, %b
48   ret <32 x i16> %shift
51 define <64 x i8> @var_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
52 ; AVX512DQ-LABEL: var_shift_v64i8:
53 ; AVX512DQ:       # %bb.0:
54 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
55 ; AVX512DQ-NEXT:    vpsllw $4, %ymm2, %ymm3
56 ; AVX512DQ-NEXT:    vpbroadcastb {{.*#+}} ymm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
57 ; AVX512DQ-NEXT:    vpand %ymm4, %ymm3, %ymm3
58 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm5
59 ; AVX512DQ-NEXT:    vpsllw $5, %ymm5, %ymm5
60 ; AVX512DQ-NEXT:    vpblendvb %ymm5, %ymm3, %ymm2, %ymm2
61 ; AVX512DQ-NEXT:    vpsllw $2, %ymm2, %ymm3
62 ; AVX512DQ-NEXT:    vpbroadcastb {{.*#+}} ymm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
63 ; AVX512DQ-NEXT:    vpand %ymm6, %ymm3, %ymm3
64 ; AVX512DQ-NEXT:    vpaddb %ymm5, %ymm5, %ymm5
65 ; AVX512DQ-NEXT:    vpblendvb %ymm5, %ymm3, %ymm2, %ymm2
66 ; AVX512DQ-NEXT:    vpaddb %ymm2, %ymm2, %ymm3
67 ; AVX512DQ-NEXT:    vpaddb %ymm5, %ymm5, %ymm5
68 ; AVX512DQ-NEXT:    vpblendvb %ymm5, %ymm3, %ymm2, %ymm2
69 ; AVX512DQ-NEXT:    vpsllw $4, %ymm0, %ymm3
70 ; AVX512DQ-NEXT:    vpand %ymm4, %ymm3, %ymm3
71 ; AVX512DQ-NEXT:    vpsllw $5, %ymm1, %ymm1
72 ; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
73 ; AVX512DQ-NEXT:    vpsllw $2, %ymm0, %ymm3
74 ; AVX512DQ-NEXT:    vpand %ymm6, %ymm3, %ymm3
75 ; AVX512DQ-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
76 ; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
77 ; AVX512DQ-NEXT:    vpaddb %ymm0, %ymm0, %ymm3
78 ; AVX512DQ-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
79 ; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
80 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
81 ; AVX512DQ-NEXT:    retq
83 ; AVX512BW-LABEL: var_shift_v64i8:
84 ; AVX512BW:       # %bb.0:
85 ; AVX512BW-NEXT:    vpsllw $4, %zmm0, %zmm2
86 ; AVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm2, %zmm2
87 ; AVX512BW-NEXT:    vpsllw $5, %zmm1, %zmm1
88 ; AVX512BW-NEXT:    vpmovb2m %zmm1, %k1
89 ; AVX512BW-NEXT:    vmovdqu8 %zmm2, %zmm0 {%k1}
90 ; AVX512BW-NEXT:    vpsllw $2, %zmm0, %zmm2
91 ; AVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm2, %zmm2
92 ; AVX512BW-NEXT:    vpaddb %zmm1, %zmm1, %zmm1
93 ; AVX512BW-NEXT:    vpmovb2m %zmm1, %k1
94 ; AVX512BW-NEXT:    vmovdqu8 %zmm2, %zmm0 {%k1}
95 ; AVX512BW-NEXT:    vpaddb %zmm1, %zmm1, %zmm1
96 ; AVX512BW-NEXT:    vpmovb2m %zmm1, %k1
97 ; AVX512BW-NEXT:    vpaddb %zmm0, %zmm0, %zmm0 {%k1}
98 ; AVX512BW-NEXT:    retq
99   %shift = shl <64 x i8> %a, %b
100   ret <64 x i8> %shift
104 ; Uniform Variable Shifts
107 define <8 x i64> @splatvar_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind {
108 ; ALL-LABEL: splatvar_shift_v8i64:
109 ; ALL:       # %bb.0:
110 ; ALL-NEXT:    vpsllq %xmm1, %zmm0, %zmm0
111 ; ALL-NEXT:    retq
112   %splat = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer
113   %shift = shl <8 x i64> %a, %splat
114   ret <8 x i64> %shift
117 define <16 x i32> @splatvar_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind {
118 ; ALL-LABEL: splatvar_shift_v16i32:
119 ; ALL:       # %bb.0:
120 ; ALL-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
121 ; ALL-NEXT:    vpslld %xmm1, %zmm0, %zmm0
122 ; ALL-NEXT:    retq
123   %splat = shufflevector <16 x i32> %b, <16 x i32> undef, <16 x i32> zeroinitializer
124   %shift = shl <16 x i32> %a, %splat
125   ret <16 x i32> %shift
128 define <32 x i16> @splatvar_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
129 ; AVX512DQ-LABEL: splatvar_shift_v32i16:
130 ; AVX512DQ:       # %bb.0:
131 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
132 ; AVX512DQ-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
133 ; AVX512DQ-NEXT:    vpsllw %xmm1, %ymm2, %ymm2
134 ; AVX512DQ-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
135 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
136 ; AVX512DQ-NEXT:    retq
138 ; AVX512BW-LABEL: splatvar_shift_v32i16:
139 ; AVX512BW:       # %bb.0:
140 ; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
141 ; AVX512BW-NEXT:    vpsllw %xmm1, %zmm0, %zmm0
142 ; AVX512BW-NEXT:    retq
143   %splat = shufflevector <32 x i16> %b, <32 x i16> undef, <32 x i32> zeroinitializer
144   %shift = shl <32 x i16> %a, %splat
145   ret <32 x i16> %shift
148 define <64 x i8> @splatvar_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
149 ; AVX512DQ-LABEL: splatvar_shift_v64i8:
150 ; AVX512DQ:       # %bb.0:
151 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
152 ; AVX512DQ-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
153 ; AVX512DQ-NEXT:    vpsllw %xmm1, %ymm2, %ymm2
154 ; AVX512DQ-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
155 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
156 ; AVX512DQ-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
157 ; AVX512DQ-NEXT:    vpsllw %xmm1, %xmm2, %xmm1
158 ; AVX512DQ-NEXT:    vpbroadcastb %xmm1, %ymm1
159 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm1, %zmm1
160 ; AVX512DQ-NEXT:    vpandq %zmm1, %zmm0, %zmm0
161 ; AVX512DQ-NEXT:    retq
163 ; AVX512BW-LABEL: splatvar_shift_v64i8:
164 ; AVX512BW:       # %bb.0:
165 ; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
166 ; AVX512BW-NEXT:    vpsllw %xmm1, %zmm0, %zmm0
167 ; AVX512BW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
168 ; AVX512BW-NEXT:    vpsllw %xmm1, %xmm2, %xmm1
169 ; AVX512BW-NEXT:    vpbroadcastb %xmm1, %zmm1
170 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
171 ; AVX512BW-NEXT:    retq
172   %splat = shufflevector <64 x i8> %b, <64 x i8> undef, <64 x i32> zeroinitializer
173   %shift = shl <64 x i8> %a, %splat
174   ret <64 x i8> %shift
178 ; Uniform Variable Modulo Shifts
181 define <8 x i64> @splatvar_modulo_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind {
182 ; ALL-LABEL: splatvar_modulo_shift_v8i64:
183 ; ALL:       # %bb.0:
184 ; ALL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
185 ; ALL-NEXT:    vpsllq %xmm1, %zmm0, %zmm0
186 ; ALL-NEXT:    retq
187   %mod = and <8 x i64> %b, <i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63>
188   %splat = shufflevector <8 x i64> %mod, <8 x i64> undef, <8 x i32> zeroinitializer
189   %shift = shl <8 x i64> %a, %splat
190   ret <8 x i64> %shift
193 define <16 x i32> @splatvar_modulo_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind {
194 ; ALL-LABEL: splatvar_modulo_shift_v16i32:
195 ; ALL:       # %bb.0:
196 ; ALL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
197 ; ALL-NEXT:    vpslld %xmm1, %zmm0, %zmm0
198 ; ALL-NEXT:    retq
199   %mod = and <16 x i32> %b, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
200   %splat = shufflevector <16 x i32> %mod, <16 x i32> undef, <16 x i32> zeroinitializer
201   %shift = shl <16 x i32> %a, %splat
202   ret <16 x i32> %shift
205 define <32 x i16> @splatvar_modulo_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
206 ; AVX512DQ-LABEL: splatvar_modulo_shift_v32i16:
207 ; AVX512DQ:       # %bb.0:
208 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
209 ; AVX512DQ-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
210 ; AVX512DQ-NEXT:    vpsllw %xmm1, %ymm2, %ymm2
211 ; AVX512DQ-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
212 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
213 ; AVX512DQ-NEXT:    retq
215 ; AVX512BW-LABEL: splatvar_modulo_shift_v32i16:
216 ; AVX512BW:       # %bb.0:
217 ; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
218 ; AVX512BW-NEXT:    vpsllw %xmm1, %zmm0, %zmm0
219 ; AVX512BW-NEXT:    retq
220   %mod = and <32 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, 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>
221   %splat = shufflevector <32 x i16> %mod, <32 x i16> undef, <32 x i32> zeroinitializer
222   %shift = shl <32 x i16> %a, %splat
223   ret <32 x i16> %shift
226 define <64 x i8> @splatvar_modulo_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
227 ; AVX512DQ-LABEL: splatvar_modulo_shift_v64i8:
228 ; AVX512DQ:       # %bb.0:
229 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
230 ; AVX512DQ-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
231 ; AVX512DQ-NEXT:    vpsllw %xmm1, %ymm2, %ymm2
232 ; AVX512DQ-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
233 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
234 ; AVX512DQ-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
235 ; AVX512DQ-NEXT:    vpsllw %xmm1, %xmm2, %xmm1
236 ; AVX512DQ-NEXT:    vpbroadcastb %xmm1, %ymm1
237 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm1, %zmm1
238 ; AVX512DQ-NEXT:    vpandq %zmm1, %zmm0, %zmm0
239 ; AVX512DQ-NEXT:    retq
241 ; AVX512BW-LABEL: splatvar_modulo_shift_v64i8:
242 ; AVX512BW:       # %bb.0:
243 ; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
244 ; AVX512BW-NEXT:    vpsllw %xmm1, %zmm0, %zmm0
245 ; AVX512BW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
246 ; AVX512BW-NEXT:    vpsllw %xmm1, %xmm2, %xmm1
247 ; AVX512BW-NEXT:    vpbroadcastb %xmm1, %zmm1
248 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
249 ; AVX512BW-NEXT:    retq
250   %mod = and <64 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, 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>
251   %splat = shufflevector <64 x i8> %mod, <64 x i8> undef, <64 x i32> zeroinitializer
252   %shift = shl <64 x i8> %a, %splat
253   ret <64 x i8> %shift
257 ; Constant Shifts
260 define <8 x i64> @constant_shift_v8i64(<8 x i64> %a) nounwind {
261 ; ALL-LABEL: constant_shift_v8i64:
262 ; ALL:       # %bb.0:
263 ; ALL-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
264 ; ALL-NEXT:    retq
265   %shift = shl <8 x i64> %a, <i64 1, i64 7, i64 31, i64 62, i64 1, i64 7, i64 31, i64 62>
266   ret <8 x i64> %shift
269 define <16 x i32> @constant_shift_v16i32(<16 x i32> %a) nounwind {
270 ; ALL-LABEL: constant_shift_v16i32:
271 ; ALL:       # %bb.0:
272 ; ALL-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
273 ; ALL-NEXT:    retq
274   %shift = shl <16 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
275   ret <16 x i32> %shift
278 define <32 x i16> @constant_shift_v32i16(<32 x i16> %a) nounwind {
279 ; AVX512DQ-LABEL: constant_shift_v32i16:
280 ; AVX512DQ:       # %bb.0:
281 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
282 ; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
283 ; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
284 ; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
285 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
286 ; AVX512DQ-NEXT:    retq
288 ; AVX512BW-LABEL: constant_shift_v32i16:
289 ; AVX512BW:       # %bb.0:
290 ; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
291 ; AVX512BW-NEXT:    retq
292   %shift = shl <32 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, 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>
293   ret <32 x i16> %shift
296 define <64 x i8> @constant_shift_v64i8(<64 x i8> %a) nounwind {
297 ; AVX512DQ-LABEL: constant_shift_v64i8:
298 ; AVX512DQ:       # %bb.0:
299 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
300 ; 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]
301 ; AVX512DQ-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1]
302 ; AVX512DQ-NEXT:    # ymm3 = mem[0,1,0,1]
303 ; AVX512DQ-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
304 ; AVX512DQ-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
305 ; AVX512DQ-NEXT:    vpand %ymm4, %ymm2, %ymm2
306 ; 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]
307 ; AVX512DQ-NEXT:    vbroadcasti128 {{.*#+}} ymm5 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
308 ; AVX512DQ-NEXT:    # ymm5 = mem[0,1,0,1]
309 ; AVX512DQ-NEXT:    vpmullw %ymm5, %ymm1, %ymm1
310 ; AVX512DQ-NEXT:    vpand %ymm4, %ymm1, %ymm1
311 ; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
312 ; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm2 = 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]
313 ; AVX512DQ-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
314 ; AVX512DQ-NEXT:    vpand %ymm4, %ymm2, %ymm2
315 ; 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]
316 ; AVX512DQ-NEXT:    vpmullw %ymm5, %ymm0, %ymm0
317 ; AVX512DQ-NEXT:    vpand %ymm4, %ymm0, %ymm0
318 ; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
319 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
320 ; AVX512DQ-NEXT:    retq
322 ; AVX512BW-LABEL: constant_shift_v64i8:
323 ; AVX512BW:       # %bb.0:
324 ; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm1 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
325 ; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
326 ; AVX512BW-NEXT:    vpbroadcastw {{.*#+}} zmm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
327 ; AVX512BW-NEXT:    vpandq %zmm2, %zmm1, %zmm1
328 ; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
329 ; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
330 ; AVX512BW-NEXT:    vpandq %zmm2, %zmm0, %zmm0
331 ; AVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
332 ; AVX512BW-NEXT:    retq
333   %shift = shl <64 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, 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>
334   ret <64 x i8> %shift
338 ; Uniform Constant Shifts
341 define <8 x i64> @splatconstant_shift_v8i64(<8 x i64> %a) nounwind {
342 ; ALL-LABEL: splatconstant_shift_v8i64:
343 ; ALL:       # %bb.0:
344 ; ALL-NEXT:    vpsllq $7, %zmm0, %zmm0
345 ; ALL-NEXT:    retq
346   %shift = shl <8 x i64> %a, <i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7>
347   ret <8 x i64> %shift
350 define <16 x i32> @splatconstant_shift_v16i32(<16 x i32> %a) nounwind {
351 ; ALL-LABEL: splatconstant_shift_v16i32:
352 ; ALL:       # %bb.0:
353 ; ALL-NEXT:    vpslld $5, %zmm0, %zmm0
354 ; ALL-NEXT:    retq
355   %shift = shl <16 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
356   ret <16 x i32> %shift
359 define <32 x i16> @splatconstant_shift_v32i16(<32 x i16> %a) nounwind {
360 ; AVX512DQ-LABEL: splatconstant_shift_v32i16:
361 ; AVX512DQ:       # %bb.0:
362 ; AVX512DQ-NEXT:    vpsllw $3, %ymm0, %ymm1
363 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm0
364 ; AVX512DQ-NEXT:    vpsllw $3, %ymm0, %ymm0
365 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
366 ; AVX512DQ-NEXT:    retq
368 ; AVX512BW-LABEL: splatconstant_shift_v32i16:
369 ; AVX512BW:       # %bb.0:
370 ; AVX512BW-NEXT:    vpsllw $3, %zmm0, %zmm0
371 ; AVX512BW-NEXT:    retq
372   %shift = shl <32 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, 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>
373   ret <32 x i16> %shift
376 define <64 x i8> @splatconstant_shift_v64i8(<64 x i8> %a) nounwind {
377 ; AVX512DQ-LABEL: splatconstant_shift_v64i8:
378 ; AVX512DQ:       # %bb.0:
379 ; AVX512DQ-NEXT:    vpsllw $3, %ymm0, %ymm1
380 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm0
381 ; AVX512DQ-NEXT:    vpsllw $3, %ymm0, %ymm0
382 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
383 ; AVX512DQ-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
384 ; AVX512DQ-NEXT:    retq
386 ; AVX512BW-LABEL: splatconstant_shift_v64i8:
387 ; AVX512BW:       # %bb.0:
388 ; AVX512BW-NEXT:    vpsllw $3, %zmm0, %zmm0
389 ; AVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
390 ; AVX512BW-NEXT:    retq
391   %shift = shl <64 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, 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>
392   ret <64 x i8> %shift