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