[X86][AVX] Added full set of 256-bit vector shift tests.
[oota-llvm.git] / test / CodeGen / X86 / vector-shift-ashr-256.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
3
4 ;
5 ; Variable Shifts
6 ;
7
8 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) {
9 ; AVX1-LABEL: var_shift_v4i64:
10 ; AVX1:       # BB#0:
11 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
12 ; AVX1-NEXT:    vpextrq $1, %xmm2, %rax
13 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
14 ; AVX1-NEXT:    vpextrq $1, %xmm3, %rcx
15 ; AVX1-NEXT:    sarq %cl, %rax
16 ; AVX1-NEXT:    vmovq %rax, %xmm4
17 ; AVX1-NEXT:    vmovq %xmm2, %rax
18 ; AVX1-NEXT:    vmovq %xmm3, %rcx
19 ; AVX1-NEXT:    sarq %cl, %rax
20 ; AVX1-NEXT:    vmovq %rax, %xmm2
21 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm4[0]
22 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
23 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rcx
24 ; AVX1-NEXT:    sarq %cl, %rax
25 ; AVX1-NEXT:    vmovq %rax, %xmm3
26 ; AVX1-NEXT:    vmovq %xmm0, %rax
27 ; AVX1-NEXT:    vmovq %xmm1, %rcx
28 ; AVX1-NEXT:    sarq %cl, %rax
29 ; AVX1-NEXT:    vmovq %rax, %xmm0
30 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
31 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
32 ; AVX1-NEXT:    retq
33 ;
34 ; AVX2-LABEL: var_shift_v4i64:
35 ; AVX2:       # BB#0:
36 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
37 ; AVX2-NEXT:    vpextrq $1, %xmm2, %rax
38 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
39 ; AVX2-NEXT:    vpextrq $1, %xmm3, %rcx
40 ; AVX2-NEXT:    sarq %cl, %rax
41 ; AVX2-NEXT:    vmovq %rax, %xmm4
42 ; AVX2-NEXT:    vmovq %xmm2, %rax
43 ; AVX2-NEXT:    vmovq %xmm3, %rcx
44 ; AVX2-NEXT:    sarq %cl, %rax
45 ; AVX2-NEXT:    vmovq %rax, %xmm2
46 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm4[0]
47 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
48 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rcx
49 ; AVX2-NEXT:    sarq %cl, %rax
50 ; AVX2-NEXT:    vmovq %rax, %xmm3
51 ; AVX2-NEXT:    vmovq %xmm0, %rax
52 ; AVX2-NEXT:    vmovq %xmm1, %rcx
53 ; AVX2-NEXT:    sarq %cl, %rax
54 ; AVX2-NEXT:    vmovq %rax, %xmm0
55 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
56 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
57 ; AVX2-NEXT:    retq
58   %shift = ashr <4 x i64> %a, %b
59   ret <4 x i64> %shift
60 }
61
62 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) {
63 ; AVX1-LABEL: var_shift_v8i32:
64 ; AVX1:       # BB#0:
65 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
66 ; AVX1-NEXT:    vpextrd $1, %xmm2, %eax
67 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
68 ; AVX1-NEXT:    vpextrd $1, %xmm3, %ecx
69 ; AVX1-NEXT:    sarl %cl, %eax
70 ; AVX1-NEXT:    vmovd %xmm2, %edx
71 ; AVX1-NEXT:    vmovd %xmm3, %ecx
72 ; AVX1-NEXT:    sarl %cl, %edx
73 ; AVX1-NEXT:    vmovd %edx, %xmm4
74 ; AVX1-NEXT:    vpinsrd $1, %eax, %xmm4, %xmm4
75 ; AVX1-NEXT:    vpextrd $2, %xmm2, %eax
76 ; AVX1-NEXT:    vpextrd $2, %xmm3, %ecx
77 ; AVX1-NEXT:    sarl %cl, %eax
78 ; AVX1-NEXT:    vpinsrd $2, %eax, %xmm4, %xmm4
79 ; AVX1-NEXT:    vpextrd $3, %xmm2, %eax
80 ; AVX1-NEXT:    vpextrd $3, %xmm3, %ecx
81 ; AVX1-NEXT:    sarl %cl, %eax
82 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm4, %xmm2
83 ; AVX1-NEXT:    vpextrd $1, %xmm0, %eax
84 ; AVX1-NEXT:    vpextrd $1, %xmm1, %ecx
85 ; AVX1-NEXT:    sarl %cl, %eax
86 ; AVX1-NEXT:    vmovd %xmm0, %edx
87 ; AVX1-NEXT:    vmovd %xmm1, %ecx
88 ; AVX1-NEXT:    sarl %cl, %edx
89 ; AVX1-NEXT:    vmovd %edx, %xmm3
90 ; AVX1-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
91 ; AVX1-NEXT:    vpextrd $2, %xmm0, %eax
92 ; AVX1-NEXT:    vpextrd $2, %xmm1, %ecx
93 ; AVX1-NEXT:    sarl %cl, %eax
94 ; AVX1-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
95 ; AVX1-NEXT:    vpextrd $3, %xmm0, %eax
96 ; AVX1-NEXT:    vpextrd $3, %xmm1, %ecx
97 ; AVX1-NEXT:    sarl %cl, %eax
98 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm0
99 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
100 ; AVX1-NEXT:    retq
101 ;
102 ; AVX2-LABEL: var_shift_v8i32:
103 ; AVX2:       # BB#0:
104 ; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
105 ; AVX2-NEXT:    retq
106   %shift = ashr <8 x i32> %a, %b
107   ret <8 x i32> %shift
108 }
109
110 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) {
111 ; AVX1-LABEL: var_shift_v16i16:
112 ; AVX1:       # BB#0:
113 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
114 ; AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3
115 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
116 ; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
117 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3
118 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
119 ; AVX1-NEXT:    vpsraw $8, %xmm4, %xmm5
120 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
121 ; AVX1-NEXT:    vpsraw $4, %xmm2, %xmm4
122 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
123 ; AVX1-NEXT:    vpsraw $2, %xmm2, %xmm4
124 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
125 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
126 ; AVX1-NEXT:    vpsraw $1, %xmm2, %xmm4
127 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
128 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
129 ; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3
130 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
131 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
132 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3
133 ; AVX1-NEXT:    vpsraw $8, %xmm0, %xmm4
134 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
135 ; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm1
136 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
137 ; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm1
138 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
139 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
140 ; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm1
141 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
142 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
143 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
144 ; AVX1-NEXT:    retq
145 ;
146 ; AVX2-LABEL: var_shift_v16i16:
147 ; AVX2:       # BB#0:
148 ; AVX2-NEXT:    vpxor %ymm2, %ymm2, %ymm2
149 ; 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]
150 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
151 ; AVX2-NEXT:    vpsravd %ymm3, %ymm4, %ymm3
152 ; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
153 ; 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]
154 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
155 ; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
156 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
157 ; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
158 ; AVX2-NEXT:    retq
159   %shift = ashr <16 x i16> %a, %b
160   ret <16 x i16> %shift
161 }
162
163 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) {
164 ; AVX1-LABEL: var_shift_v32i8:
165 ; AVX1:       # BB#0:
166 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
167 ; AVX1-NEXT:    vpsllw $5, %xmm2, %xmm2
168 ; 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]
169 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
170 ; 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]
171 ; AVX1-NEXT:    vpsraw $4, %xmm5, %xmm6
172 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
173 ; AVX1-NEXT:    vpsraw $2, %xmm5, %xmm6
174 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
175 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
176 ; AVX1-NEXT:    vpsraw $1, %xmm5, %xmm6
177 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
178 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm3
179 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
180 ; 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]
181 ; 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]
182 ; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
183 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
184 ; AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
185 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
186 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
187 ; AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
188 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
189 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
190 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
191 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
192 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
193 ; 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]
194 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
195 ; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
196 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
197 ; AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
198 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
199 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
200 ; AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
201 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
202 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm3
203 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
204 ; 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]
205 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
206 ; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm4
207 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
208 ; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm4
209 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
210 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
211 ; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm4
212 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
213 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
214 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
215 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
216 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
217 ; AVX1-NEXT:    retq
218 ;
219 ; AVX2-LABEL: var_shift_v32i8:
220 ; AVX2:       # BB#0:
221 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
222 ; 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]
223 ; 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]
224 ; AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4
225 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
226 ; AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4
227 ; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
228 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
229 ; AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4
230 ; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
231 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
232 ; AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
233 ; 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]
234 ; 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]
235 ; AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3
236 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
237 ; AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3
238 ; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
239 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
240 ; AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3
241 ; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
242 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
243 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
244 ; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
245 ; AVX2-NEXT:    retq
246   %shift = ashr <32 x i8> %a, %b
247   ret <32 x i8> %shift
248 }
249
250 ;
251 ; Uniform Variable Shifts
252 ;
253
254 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) {
255 ; AVX1-LABEL: splatvar_shift_v4i64:
256 ; AVX1:       # BB#0:
257 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = xmm1[0,0]
258 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
259 ; AVX1-NEXT:    vpextrq $1, %xmm2, %rdx
260 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
261 ; AVX1-NEXT:    movb %al, %cl
262 ; AVX1-NEXT:    sarq %cl, %rdx
263 ; AVX1-NEXT:    vmovq %rdx, %xmm3
264 ; AVX1-NEXT:    vmovq %xmm2, %rsi
265 ; AVX1-NEXT:    vmovq %xmm1, %rdx
266 ; AVX1-NEXT:    movb %dl, %cl
267 ; AVX1-NEXT:    sarq %cl, %rsi
268 ; AVX1-NEXT:    vmovq %rsi, %xmm1
269 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
270 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rsi
271 ; AVX1-NEXT:    movb %al, %cl
272 ; AVX1-NEXT:    sarq %cl, %rsi
273 ; AVX1-NEXT:    vmovq %rsi, %xmm2
274 ; AVX1-NEXT:    vmovq %xmm0, %rax
275 ; AVX1-NEXT:    movb %dl, %cl
276 ; AVX1-NEXT:    sarq %cl, %rax
277 ; AVX1-NEXT:    vmovq %rax, %xmm0
278 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
279 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
280 ; AVX1-NEXT:    retq
281 ;
282 ; AVX2-LABEL: splatvar_shift_v4i64:
283 ; AVX2:       # BB#0:
284 ; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
285 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
286 ; AVX2-NEXT:    vpextrq $1, %xmm2, %rax
287 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
288 ; AVX2-NEXT:    vpextrq $1, %xmm3, %rcx
289 ; AVX2-NEXT:    sarq %cl, %rax
290 ; AVX2-NEXT:    vmovq %rax, %xmm4
291 ; AVX2-NEXT:    vmovq %xmm2, %rax
292 ; AVX2-NEXT:    vmovq %xmm3, %rcx
293 ; AVX2-NEXT:    sarq %cl, %rax
294 ; AVX2-NEXT:    vmovq %rax, %xmm2
295 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm4[0]
296 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
297 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rcx
298 ; AVX2-NEXT:    sarq %cl, %rax
299 ; AVX2-NEXT:    vmovq %rax, %xmm3
300 ; AVX2-NEXT:    vmovq %xmm0, %rax
301 ; AVX2-NEXT:    vmovq %xmm1, %rcx
302 ; AVX2-NEXT:    sarq %cl, %rax
303 ; AVX2-NEXT:    vmovq %rax, %xmm0
304 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
305 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
306 ; AVX2-NEXT:    retq
307   %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
308   %shift = ashr <4 x i64> %a, %splat
309   ret <4 x i64> %shift
310 }
311
312 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) {
313 ; AVX1-LABEL: splatvar_shift_v8i32:
314 ; AVX1:       # BB#0:
315 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
316 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
317 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
318 ; AVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2
319 ; AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
320 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
321 ; AVX1-NEXT:    retq
322 ;
323 ; AVX2-LABEL: splatvar_shift_v8i32:
324 ; AVX2:       # BB#0:
325 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
326 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
327 ; AVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
328 ; AVX2-NEXT:    retq
329   %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
330   %shift = ashr <8 x i32> %a, %splat
331   ret <8 x i32> %shift
332 }
333
334 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) {
335 ; AVX1-LABEL: splatvar_shift_v16i16:
336 ; AVX1:       # BB#0:
337 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
338 ; AVX1-NEXT:    vmovd %xmm1, %eax
339 ; AVX1-NEXT:    movzwl %ax, %eax
340 ; AVX1-NEXT:    vmovd %eax, %xmm1
341 ; AVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2
342 ; AVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
343 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
344 ; AVX1-NEXT:    retq
345 ;
346 ; AVX2-LABEL: splatvar_shift_v16i16:
347 ; AVX2:       # BB#0:
348 ; AVX2-NEXT:    vmovd %xmm1, %eax
349 ; AVX2-NEXT:    movzwl %ax, %eax
350 ; AVX2-NEXT:    vmovd %eax, %xmm1
351 ; AVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
352 ; AVX2-NEXT:    retq
353   %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
354   %shift = ashr <16 x i16> %a, %splat
355   ret <16 x i16> %shift
356 }
357
358 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) {
359 ; AVX1-LABEL: splatvar_shift_v32i8:
360 ; AVX1:       # BB#0:
361 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
362 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
363 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
364 ; 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]
365 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
366 ; 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]
367 ; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
368 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
369 ; AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
370 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm6
371 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
372 ; AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
373 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm9
374 ; AVX1-NEXT:    vpblendvb %xmm9, %xmm5, %xmm4, %xmm4
375 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm8
376 ; 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]
377 ; 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]
378 ; AVX1-NEXT:    vpsraw $4, %xmm3, %xmm5
379 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
380 ; AVX1-NEXT:    vpsraw $2, %xmm3, %xmm5
381 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm4
382 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm5, %xmm3, %xmm3
383 ; AVX1-NEXT:    vpsraw $1, %xmm3, %xmm5
384 ; AVX1-NEXT:    vpaddw %xmm4, %xmm4, %xmm7
385 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm5, %xmm3, %xmm3
386 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
387 ; AVX1-NEXT:    vpackuswb %xmm8, %xmm3, %xmm8
388 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
389 ; AVX1-NEXT:    vpsraw $4, %xmm5, %xmm3
390 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm3, %xmm5, %xmm2
391 ; AVX1-NEXT:    vpsraw $2, %xmm2, %xmm3
392 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
393 ; AVX1-NEXT:    vpsraw $1, %xmm2, %xmm3
394 ; AVX1-NEXT:    vpblendvb %xmm9, %xmm3, %xmm2, %xmm2
395 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
396 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
397 ; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm3
398 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
399 ; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm1
400 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm1, %xmm0, %xmm0
401 ; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm1
402 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
403 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
404 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
405 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm0, %ymm0
406 ; AVX1-NEXT:    retq
407 ;
408 ; AVX2-LABEL: splatvar_shift_v32i8:
409 ; AVX2:       # BB#0:
410 ; AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
411 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
412 ; 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]
413 ; 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]
414 ; AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4
415 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
416 ; AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4
417 ; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
418 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
419 ; AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4
420 ; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
421 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
422 ; AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
423 ; 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]
424 ; 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]
425 ; AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3
426 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
427 ; AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3
428 ; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
429 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
430 ; AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3
431 ; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
432 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
433 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
434 ; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
435 ; AVX2-NEXT:    retq
436   %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
437   %shift = ashr <32 x i8> %a, %splat
438   ret <32 x i8> %shift
439 }
440
441 ;
442 ; Constant Shifts
443 ;
444
445 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) {
446 ; AVX1-LABEL: constant_shift_v4i64:
447 ; AVX1:       # BB#0:
448 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
449 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
450 ; AVX1-NEXT:    sarq $62, %rax
451 ; AVX1-NEXT:    vmovq %rax, %xmm2
452 ; AVX1-NEXT:    vmovq %xmm1, %rax
453 ; AVX1-NEXT:    sarq $31, %rax
454 ; AVX1-NEXT:    vmovq %rax, %xmm1
455 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
456 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
457 ; AVX1-NEXT:    sarq $7, %rax
458 ; AVX1-NEXT:    vmovq %rax, %xmm2
459 ; AVX1-NEXT:    vmovq %xmm0, %rax
460 ; AVX1-NEXT:    sarq %rax
461 ; AVX1-NEXT:    vmovq %rax, %xmm0
462 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
463 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
464 ; AVX1-NEXT:    retq
465 ;
466 ; AVX2-LABEL: constant_shift_v4i64:
467 ; AVX2:       # BB#0:
468 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
469 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
470 ; AVX2-NEXT:    sarq $62, %rax
471 ; AVX2-NEXT:    vmovq %rax, %xmm2
472 ; AVX2-NEXT:    vmovq %xmm1, %rax
473 ; AVX2-NEXT:    sarq $31, %rax
474 ; AVX2-NEXT:    vmovq %rax, %xmm1
475 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
476 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
477 ; AVX2-NEXT:    sarq $7, %rax
478 ; AVX2-NEXT:    vmovq %rax, %xmm2
479 ; AVX2-NEXT:    vmovq %xmm0, %rax
480 ; AVX2-NEXT:    sarq %rax
481 ; AVX2-NEXT:    vmovq %rax, %xmm0
482 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
483 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
484 ; AVX2-NEXT:    retq
485   %shift = ashr <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
486   ret <4 x i64> %shift
487 }
488
489 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) {
490 ; AVX1-LABEL: constant_shift_v8i32:
491 ; AVX1:       # BB#0:
492 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
493 ; AVX1-NEXT:    vpextrd $1, %xmm1, %eax
494 ; AVX1-NEXT:    sarl $9, %eax
495 ; AVX1-NEXT:    vmovd %xmm1, %ecx
496 ; AVX1-NEXT:    sarl $8, %ecx
497 ; AVX1-NEXT:    vmovd %ecx, %xmm2
498 ; AVX1-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
499 ; AVX1-NEXT:    vpextrd $2, %xmm1, %eax
500 ; AVX1-NEXT:    sarl $8, %eax
501 ; AVX1-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
502 ; AVX1-NEXT:    vpextrd $3, %xmm1, %eax
503 ; AVX1-NEXT:    sarl $7, %eax
504 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
505 ; AVX1-NEXT:    vpextrd $1, %xmm0, %eax
506 ; AVX1-NEXT:    sarl $5, %eax
507 ; AVX1-NEXT:    vmovd %xmm0, %ecx
508 ; AVX1-NEXT:    sarl $4, %ecx
509 ; AVX1-NEXT:    vmovd %ecx, %xmm2
510 ; AVX1-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
511 ; AVX1-NEXT:    vpextrd $2, %xmm0, %eax
512 ; AVX1-NEXT:    sarl $6, %eax
513 ; AVX1-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
514 ; AVX1-NEXT:    vpextrd $3, %xmm0, %eax
515 ; AVX1-NEXT:    sarl $7, %eax
516 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm0
517 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
518 ; AVX1-NEXT:    retq
519 ;
520 ; AVX2-LABEL: constant_shift_v8i32:
521 ; AVX2:       # BB#0:
522 ; AVX2-NEXT:    vpsravd {{.*}}(%rip), %ymm0, %ymm0
523 ; AVX2-NEXT:    retq
524   %shift = ashr <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
525   ret <8 x i32> %shift
526 }
527
528 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) {
529 ; AVX1-LABEL: constant_shift_v16i16:
530 ; AVX1:       # BB#0:
531 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
532 ; AVX1-NEXT:    vpsraw $8, %xmm1, %xmm2
533 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [32896,37008,41120,45232,49344,53456,57568,61680]
534 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
535 ; AVX1-NEXT:    vpsraw $4, %xmm1, %xmm2
536 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [256,8480,16704,24928,33152,41376,49600,57824]
537 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
538 ; AVX1-NEXT:    vpsraw $2, %xmm1, %xmm2
539 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [512,16960,33408,49856,768,17216,33664,50112]
540 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
541 ; AVX1-NEXT:    vpsraw $1, %xmm1, %xmm2
542 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1024,33920,1280,34176,1536,34432,1792,34688]
543 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
544 ; AVX1-NEXT:    vpsraw $8, %xmm0, %xmm2
545 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,4112,8224,12336,16448,20560,24672,28784]
546 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
547 ; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm2
548 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,8224,16448,24672,32896,41120,49344,57568]
549 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
550 ; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm2
551 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,16448,32896,49344,256,16704,33152,49600]
552 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
553 ; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm2
554 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,32896,256,33152,512,33408,768,33664]
555 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
556 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
557 ; AVX1-NEXT:    retq
558 ;
559 ; AVX2-LABEL: constant_shift_v16i16:
560 ; AVX2:       # BB#0:
561 ; AVX2-NEXT:    vpxor %ymm1, %ymm1, %ymm1
562 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
563 ; 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]
564 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
565 ; AVX2-NEXT:    vpsravd %ymm3, %ymm4, %ymm3
566 ; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
567 ; 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]
568 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
569 ; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
570 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
571 ; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
572 ; AVX2-NEXT:    retq
573   %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>
574   ret <16 x i16> %shift
575 }
576
577 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) {
578 ; AVX1-LABEL: constant_shift_v32i8:
579 ; AVX1:       # BB#0:
580 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
581 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
582 ; 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]
583 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
584 ; 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]
585 ; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
586 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
587 ; AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
588 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm6
589 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
590 ; AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
591 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm9
592 ; AVX1-NEXT:    vpblendvb %xmm9, %xmm5, %xmm4, %xmm4
593 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm8
594 ; 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]
595 ; 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]
596 ; AVX1-NEXT:    vpsraw $4, %xmm3, %xmm5
597 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
598 ; AVX1-NEXT:    vpsraw $2, %xmm3, %xmm5
599 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm4
600 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm5, %xmm3, %xmm3
601 ; AVX1-NEXT:    vpsraw $1, %xmm3, %xmm5
602 ; AVX1-NEXT:    vpaddw %xmm4, %xmm4, %xmm7
603 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm5, %xmm3, %xmm3
604 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
605 ; AVX1-NEXT:    vpackuswb %xmm8, %xmm3, %xmm8
606 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
607 ; AVX1-NEXT:    vpsraw $4, %xmm5, %xmm3
608 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm3, %xmm5, %xmm2
609 ; AVX1-NEXT:    vpsraw $2, %xmm2, %xmm3
610 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
611 ; AVX1-NEXT:    vpsraw $1, %xmm2, %xmm3
612 ; AVX1-NEXT:    vpblendvb %xmm9, %xmm3, %xmm2, %xmm2
613 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
614 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
615 ; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm3
616 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
617 ; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm1
618 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm1, %xmm0, %xmm0
619 ; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm1
620 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
621 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
622 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
623 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm0, %ymm0
624 ; AVX1-NEXT:    retq
625 ;
626 ; AVX2-LABEL: constant_shift_v32i8:
627 ; AVX2:       # BB#0:
628 ; 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]
629 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
630 ; 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]
631 ; 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]
632 ; AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4
633 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
634 ; AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4
635 ; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
636 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
637 ; AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4
638 ; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
639 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
640 ; AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
641 ; 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]
642 ; 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]
643 ; AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3
644 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
645 ; AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3
646 ; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
647 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
648 ; AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3
649 ; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
650 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
651 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
652 ; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
653 ; AVX2-NEXT:    retq
654   %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>
655   ret <32 x i8> %shift
656 }
657
658 ;
659 ; Uniform Constant Shifts
660 ;
661
662 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) {
663 ; AVX1-LABEL: splatconstant_shift_v4i64:
664 ; AVX1:       # BB#0:
665 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
666 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
667 ; AVX1-NEXT:    sarq $7, %rax
668 ; AVX1-NEXT:    vmovq %rax, %xmm2
669 ; AVX1-NEXT:    vmovq %xmm1, %rax
670 ; AVX1-NEXT:    sarq $7, %rax
671 ; AVX1-NEXT:    vmovq %rax, %xmm1
672 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
673 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
674 ; AVX1-NEXT:    sarq $7, %rax
675 ; AVX1-NEXT:    vmovq %rax, %xmm2
676 ; AVX1-NEXT:    vmovq %xmm0, %rax
677 ; AVX1-NEXT:    sarq $7, %rax
678 ; AVX1-NEXT:    vmovq %rax, %xmm0
679 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
680 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
681 ; AVX1-NEXT:    retq
682 ;
683 ; AVX2-LABEL: splatconstant_shift_v4i64:
684 ; AVX2:       # BB#0:
685 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
686 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
687 ; AVX2-NEXT:    sarq $7, %rax
688 ; AVX2-NEXT:    vmovq %rax, %xmm2
689 ; AVX2-NEXT:    vmovq %xmm1, %rax
690 ; AVX2-NEXT:    sarq $7, %rax
691 ; AVX2-NEXT:    vmovq %rax, %xmm1
692 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
693 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
694 ; AVX2-NEXT:    sarq $7, %rax
695 ; AVX2-NEXT:    vmovq %rax, %xmm2
696 ; AVX2-NEXT:    vmovq %xmm0, %rax
697 ; AVX2-NEXT:    sarq $7, %rax
698 ; AVX2-NEXT:    vmovq %rax, %xmm0
699 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
700 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
701 ; AVX2-NEXT:    retq
702   %shift = ashr <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
703   ret <4 x i64> %shift
704 }
705
706 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) {
707 ; AVX1-LABEL: splatconstant_shift_v8i32:
708 ; AVX1:       # BB#0:
709 ; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm1
710 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
711 ; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm0
712 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
713 ; AVX1-NEXT:    retq
714 ;
715 ; AVX2-LABEL: splatconstant_shift_v8i32:
716 ; AVX2:       # BB#0:
717 ; AVX2-NEXT:    vpsrad $5, %ymm0, %ymm0
718 ; AVX2-NEXT:    retq
719   %shift = ashr <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
720   ret <8 x i32> %shift
721 }
722
723 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) {
724 ; AVX1-LABEL: splatconstant_shift_v16i16:
725 ; AVX1:       # BB#0:
726 ; AVX1-NEXT:    vpsraw $3, %xmm0, %xmm1
727 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
728 ; AVX1-NEXT:    vpsraw $3, %xmm0, %xmm0
729 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
730 ; AVX1-NEXT:    retq
731 ;
732 ; AVX2-LABEL: splatconstant_shift_v16i16:
733 ; AVX2:       # BB#0:
734 ; AVX2-NEXT:    vpsraw $3, %ymm0, %ymm0
735 ; AVX2-NEXT:    retq
736   %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>
737   ret <16 x i16> %shift
738 }
739
740 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) {
741 ; AVX1-LABEL: splatconstant_shift_v32i8:
742 ; AVX1:       # BB#0:
743 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
744 ; AVX1-NEXT:    vpsrlw $3, %xmm1, %xmm1
745 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]
746 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
747 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
748 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
749 ; AVX1-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
750 ; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm0
751 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
752 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
753 ; AVX1-NEXT:    vpsubb %xmm3, %xmm0, %xmm0
754 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
755 ; AVX1-NEXT:    retq
756 ;
757 ; AVX2-LABEL: splatconstant_shift_v32i8:
758 ; AVX2:       # BB#0:
759 ; AVX2-NEXT:    vpsrlw  $3, %ymm0, %ymm0
760 ; AVX2-NEXT:    vpand   {{.*}}(%rip), %ymm0, %ymm0
761 ; 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]
762 ; AVX2-NEXT:    vpxor   %ymm1, %ymm0, %ymm0
763 ; AVX2-NEXT:    vpsubb  %ymm1, %ymm0, %ymm0
764 ; AVX2-NEXT:    retq
765   %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>
766   ret <32 x i8> %shift
767 }