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