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