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