1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
11 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
12 ; AVX1-LABEL: var_shift_v4i64:
14 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
15 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
16 ; AVX1-NEXT: vpsrlq %xmm2, %xmm3, %xmm4
17 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm2[2,3,0,1]
18 ; AVX1-NEXT: vpsrlq %xmm5, %xmm3, %xmm6
19 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm6[4,5,6,7]
20 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
21 ; AVX1-NEXT: vpsrlq %xmm2, %xmm6, %xmm2
22 ; AVX1-NEXT: vpsrlq %xmm5, %xmm6, %xmm5
23 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm5[4,5,6,7]
24 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
25 ; AVX1-NEXT: vpsubq %xmm4, %xmm2, %xmm2
26 ; AVX1-NEXT: vpsrlq %xmm1, %xmm3, %xmm4
27 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[2,3,0,1]
28 ; AVX1-NEXT: vpsrlq %xmm5, %xmm3, %xmm3
29 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
30 ; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm1
31 ; AVX1-NEXT: vpsrlq %xmm5, %xmm0, %xmm0
32 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
33 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0
34 ; AVX1-NEXT: vpsubq %xmm3, %xmm0, %xmm0
35 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
38 ; AVX2-LABEL: var_shift_v4i64:
40 ; AVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
41 ; AVX2-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3
42 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
43 ; AVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0
44 ; AVX2-NEXT: vpsubq %ymm3, %ymm0, %ymm0
47 ; XOPAVX1-LABEL: var_shift_v4i64:
49 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
50 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
51 ; XOPAVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm2
52 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
53 ; XOPAVX1-NEXT: vpshaq %xmm2, %xmm4, %xmm2
54 ; XOPAVX1-NEXT: vpsubq %xmm1, %xmm3, %xmm1
55 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0
56 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
59 ; XOPAVX2-LABEL: var_shift_v4i64:
61 ; XOPAVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
62 ; XOPAVX2-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3
63 ; XOPAVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
64 ; XOPAVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0
65 ; XOPAVX2-NEXT: vpsubq %ymm3, %ymm0, %ymm0
67 %shift = ashr <4 x i64> %a, %b
71 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
72 ; AVX1-LABEL: var_shift_v8i32:
74 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
75 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
76 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
77 ; AVX1-NEXT: vpsrad %xmm4, %xmm2, %xmm4
78 ; AVX1-NEXT: vpsrlq $32, %xmm3, %xmm5
79 ; AVX1-NEXT: vpsrad %xmm5, %xmm2, %xmm5
80 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
81 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
82 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
83 ; AVX1-NEXT: vpsrad %xmm6, %xmm2, %xmm6
84 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
85 ; AVX1-NEXT: vpsrad %xmm3, %xmm2, %xmm2
86 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
87 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
88 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
89 ; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3
90 ; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm4
91 ; AVX1-NEXT: vpsrad %xmm4, %xmm0, %xmm4
92 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
93 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]
94 ; AVX1-NEXT: vpsrad %xmm4, %xmm0, %xmm4
95 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
96 ; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0
97 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
98 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
99 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
102 ; AVX2-LABEL: var_shift_v8i32:
104 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
107 ; XOPAVX1-LABEL: var_shift_v8i32:
109 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
110 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
111 ; XOPAVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2
112 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
113 ; XOPAVX1-NEXT: vpshad %xmm2, %xmm4, %xmm2
114 ; XOPAVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1
115 ; XOPAVX1-NEXT: vpshad %xmm1, %xmm0, %xmm0
116 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
119 ; XOPAVX2-LABEL: var_shift_v8i32:
121 ; XOPAVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
123 %shift = ashr <8 x i32> %a, %b
127 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
128 ; AVX1-LABEL: var_shift_v16i16:
130 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
131 ; AVX1-NEXT: vpsllw $12, %xmm2, %xmm3
132 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm2
133 ; AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2
134 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3
135 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
136 ; AVX1-NEXT: vpsraw $8, %xmm4, %xmm5
137 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
138 ; AVX1-NEXT: vpsraw $4, %xmm2, %xmm4
139 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
140 ; AVX1-NEXT: vpsraw $2, %xmm2, %xmm4
141 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
142 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
143 ; AVX1-NEXT: vpsraw $1, %xmm2, %xmm4
144 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
145 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
146 ; AVX1-NEXT: vpsllw $12, %xmm1, %xmm3
147 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1
148 ; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1
149 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm3
150 ; AVX1-NEXT: vpsraw $8, %xmm0, %xmm4
151 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
152 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm1
153 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
154 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1
155 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
156 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
157 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1
158 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
159 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
160 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
163 ; AVX2-LABEL: var_shift_v16i16:
165 ; AVX2-NEXT: vpxor %ymm2, %ymm2, %ymm2
166 ; 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]
167 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
168 ; AVX2-NEXT: vpsravd %ymm3, %ymm4, %ymm3
169 ; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3
170 ; 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]
171 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
172 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
173 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
174 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
177 ; XOPAVX1-LABEL: var_shift_v16i16:
179 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
180 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
181 ; XOPAVX1-NEXT: vpsubw %xmm2, %xmm3, %xmm2
182 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
183 ; XOPAVX1-NEXT: vpshaw %xmm2, %xmm4, %xmm2
184 ; XOPAVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm1
185 ; XOPAVX1-NEXT: vpshaw %xmm1, %xmm0, %xmm0
186 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
189 ; XOPAVX2-LABEL: var_shift_v16i16:
191 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
192 ; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
193 ; XOPAVX2-NEXT: vpsubw %xmm2, %xmm3, %xmm2
194 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
195 ; XOPAVX2-NEXT: vpshaw %xmm2, %xmm4, %xmm2
196 ; XOPAVX2-NEXT: vpsubw %xmm1, %xmm3, %xmm1
197 ; XOPAVX2-NEXT: vpshaw %xmm1, %xmm0, %xmm0
198 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
200 %shift = ashr <16 x i16> %a, %b
201 ret <16 x i16> %shift
204 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
205 ; AVX1-LABEL: var_shift_v32i8:
207 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
208 ; AVX1-NEXT: vpsllw $5, %xmm2, %xmm2
209 ; 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]
210 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
211 ; 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]
212 ; AVX1-NEXT: vpsraw $4, %xmm5, %xmm6
213 ; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
214 ; AVX1-NEXT: vpsraw $2, %xmm5, %xmm6
215 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
216 ; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
217 ; AVX1-NEXT: vpsraw $1, %xmm5, %xmm6
218 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
219 ; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm3
220 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
221 ; 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]
222 ; 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]
223 ; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5
224 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
225 ; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5
226 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
227 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
228 ; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5
229 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
230 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
231 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
232 ; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2
233 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
234 ; 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]
235 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
236 ; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5
237 ; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
238 ; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5
239 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
240 ; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
241 ; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5
242 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
243 ; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm3
244 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
245 ; 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]
246 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
247 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm4
248 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
249 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm4
250 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1
251 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
252 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm4
253 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1
254 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
255 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
256 ; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0
257 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
260 ; AVX2-LABEL: var_shift_v32i8:
262 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
263 ; 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]
264 ; 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]
265 ; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4
266 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
267 ; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4
268 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2
269 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
270 ; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4
271 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2
272 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
273 ; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2
274 ; 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]
275 ; 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]
276 ; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3
277 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
278 ; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3
279 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1
280 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
281 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3
282 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1
283 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
284 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
285 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
288 ; XOPAVX1-LABEL: var_shift_v32i8:
290 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
291 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
292 ; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2
293 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
294 ; XOPAVX1-NEXT: vpshab %xmm2, %xmm4, %xmm2
295 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1
296 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0
297 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
300 ; XOPAVX2-LABEL: var_shift_v32i8:
302 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
303 ; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
304 ; XOPAVX2-NEXT: vpsubb %xmm2, %xmm3, %xmm2
305 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
306 ; XOPAVX2-NEXT: vpshab %xmm2, %xmm4, %xmm2
307 ; XOPAVX2-NEXT: vpsubb %xmm1, %xmm3, %xmm1
308 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0
309 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
311 %shift = ashr <32 x i8> %a, %b
316 ; Uniform Variable Shifts
319 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
320 ; AVX1-LABEL: splatvar_shift_v4i64:
322 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
323 ; AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2
324 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
325 ; AVX1-NEXT: vpsrlq %xmm1, %xmm3, %xmm3
326 ; AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm3
327 ; AVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm3
328 ; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0
329 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
330 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0
331 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
334 ; AVX2-LABEL: splatvar_shift_v4i64:
336 ; AVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
337 ; AVX2-NEXT: vpsrlq %xmm1, %ymm2, %ymm2
338 ; AVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0
339 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
340 ; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0
343 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
345 ; XOPAVX1-NEXT: vmovddup {{.*#+}} xmm1 = xmm1[0,0]
346 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
347 ; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1
348 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
349 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm2, %xmm2
350 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0
351 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
354 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
356 ; XOPAVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
357 ; XOPAVX2-NEXT: vpsrlq %xmm1, %ymm2, %ymm2
358 ; XOPAVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0
359 ; XOPAVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
360 ; XOPAVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0
362 %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
363 %shift = ashr <4 x i64> %a, %splat
367 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
368 ; AVX1-LABEL: splatvar_shift_v8i32:
370 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
371 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
372 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
373 ; AVX1-NEXT: vpsrad %xmm1, %xmm2, %xmm2
374 ; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0
375 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
378 ; AVX2-LABEL: splatvar_shift_v8i32:
380 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
381 ; AVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
382 ; AVX2-NEXT: vpsrad %xmm1, %ymm0, %ymm0
385 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
387 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
388 ; XOPAVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
389 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
390 ; XOPAVX1-NEXT: vpsrad %xmm1, %xmm2, %xmm2
391 ; XOPAVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0
392 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
395 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
397 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
398 ; XOPAVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
399 ; XOPAVX2-NEXT: vpsrad %xmm1, %ymm0, %ymm0
401 %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
402 %shift = ashr <8 x i32> %a, %splat
406 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
407 ; AVX1-LABEL: splatvar_shift_v16i16:
409 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
410 ; AVX1-NEXT: vmovd %xmm1, %eax
411 ; AVX1-NEXT: movzwl %ax, %eax
412 ; AVX1-NEXT: vmovd %eax, %xmm1
413 ; AVX1-NEXT: vpsraw %xmm1, %xmm2, %xmm2
414 ; AVX1-NEXT: vpsraw %xmm1, %xmm0, %xmm0
415 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
418 ; AVX2-LABEL: splatvar_shift_v16i16:
420 ; AVX2-NEXT: vmovd %xmm1, %eax
421 ; AVX2-NEXT: movzwl %ax, %eax
422 ; AVX2-NEXT: vmovd %eax, %xmm1
423 ; AVX2-NEXT: vpsraw %xmm1, %ymm0, %ymm0
426 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
428 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
429 ; XOPAVX1-NEXT: vmovd %xmm1, %eax
430 ; XOPAVX1-NEXT: movzwl %ax, %eax
431 ; XOPAVX1-NEXT: vmovd %eax, %xmm1
432 ; XOPAVX1-NEXT: vpsraw %xmm1, %xmm2, %xmm2
433 ; XOPAVX1-NEXT: vpsraw %xmm1, %xmm0, %xmm0
434 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
437 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
439 ; XOPAVX2-NEXT: vmovd %xmm1, %eax
440 ; XOPAVX2-NEXT: movzwl %ax, %eax
441 ; XOPAVX2-NEXT: vmovd %eax, %xmm1
442 ; XOPAVX2-NEXT: vpsraw %xmm1, %ymm0, %ymm0
444 %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
445 %shift = ashr <16 x i16> %a, %splat
446 ret <16 x i16> %shift
449 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
450 ; AVX1-LABEL: splatvar_shift_v32i8:
452 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
453 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
454 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
455 ; 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]
456 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
457 ; 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]
458 ; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5
459 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
460 ; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5
461 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm6
462 ; AVX1-NEXT: vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
463 ; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5
464 ; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm9
465 ; AVX1-NEXT: vpblendvb %xmm9, %xmm5, %xmm4, %xmm4
466 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm8
467 ; 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]
468 ; 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]
469 ; AVX1-NEXT: vpsraw $4, %xmm3, %xmm5
470 ; AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
471 ; AVX1-NEXT: vpsraw $2, %xmm3, %xmm5
472 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm4
473 ; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm3, %xmm3
474 ; AVX1-NEXT: vpsraw $1, %xmm3, %xmm5
475 ; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm7
476 ; AVX1-NEXT: vpblendvb %xmm7, %xmm5, %xmm3, %xmm3
477 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
478 ; AVX1-NEXT: vpackuswb %xmm8, %xmm3, %xmm8
479 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
480 ; AVX1-NEXT: vpsraw $4, %xmm5, %xmm3
481 ; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm5, %xmm2
482 ; AVX1-NEXT: vpsraw $2, %xmm2, %xmm3
483 ; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
484 ; AVX1-NEXT: vpsraw $1, %xmm2, %xmm3
485 ; AVX1-NEXT: vpblendvb %xmm9, %xmm3, %xmm2, %xmm2
486 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
487 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
488 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3
489 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
490 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1
491 ; AVX1-NEXT: vpblendvb %xmm4, %xmm1, %xmm0, %xmm0
492 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1
493 ; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
494 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
495 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
496 ; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm0, %ymm0
499 ; AVX2-LABEL: splatvar_shift_v32i8:
501 ; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1
502 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
503 ; 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]
504 ; 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]
505 ; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4
506 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
507 ; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4
508 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2
509 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
510 ; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4
511 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2
512 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
513 ; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2
514 ; 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]
515 ; 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]
516 ; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3
517 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
518 ; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3
519 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1
520 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
521 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3
522 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1
523 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
524 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
525 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
528 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
530 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
531 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
532 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1
533 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
534 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2
535 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0
536 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
539 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
541 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %ymm1
542 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
543 ; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
544 ; XOPAVX2-NEXT: vpsubb %xmm2, %xmm3, %xmm2
545 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
546 ; XOPAVX2-NEXT: vpshab %xmm2, %xmm4, %xmm2
547 ; XOPAVX2-NEXT: vpsubb %xmm1, %xmm3, %xmm1
548 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0
549 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
551 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
552 %shift = ashr <32 x i8> %a, %splat
560 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
561 ; AVX1-LABEL: constant_shift_v4i64:
563 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
564 ; AVX1-NEXT: vpsrlq $62, %xmm1, %xmm2
565 ; AVX1-NEXT: vpsrlq $31, %xmm1, %xmm1
566 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
567 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [4294967296,2]
568 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
569 ; AVX1-NEXT: vpsubq %xmm2, %xmm1, %xmm1
570 ; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm2
571 ; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0
572 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
573 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [4611686018427387904,72057594037927936]
574 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
575 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0
576 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
579 ; AVX2-LABEL: constant_shift_v4i64:
581 ; AVX2-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
582 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2]
583 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
584 ; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0
587 ; XOPAVX1-LABEL: constant_shift_v4i64:
589 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
590 ; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm2
591 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
592 ; XOPAVX1-NEXT: vpshaq %xmm2, %xmm3, %xmm2
593 ; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1
594 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0
595 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
598 ; XOPAVX2-LABEL: constant_shift_v4i64:
600 ; XOPAVX2-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
601 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2]
602 ; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
603 ; XOPAVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0
605 %shift = ashr <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
609 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
610 ; AVX1-LABEL: constant_shift_v8i32:
612 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm1
613 ; AVX1-NEXT: vpsrad $5, %xmm0, %xmm2
614 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
615 ; AVX1-NEXT: vpsrad $6, %xmm0, %xmm2
616 ; AVX1-NEXT: vpsrad $4, %xmm0, %xmm3
617 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
618 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
619 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
620 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm2
621 ; AVX1-NEXT: vpsrad $9, %xmm0, %xmm3
622 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
623 ; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0
624 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
625 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
628 ; AVX2-LABEL: constant_shift_v8i32:
630 ; AVX2-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0
633 ; XOPAVX1-LABEL: constant_shift_v8i32:
635 ; XOPAVX1-NEXT: vpshad {{.*}}(%rip), %xmm0, %xmm1
636 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
637 ; XOPAVX1-NEXT: vpshad {{.*}}(%rip), %xmm0, %xmm0
638 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
641 ; XOPAVX2-LABEL: constant_shift_v8i32:
643 ; XOPAVX2-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0
645 %shift = ashr <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
649 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
650 ; AVX1-LABEL: constant_shift_v16i16:
652 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
653 ; AVX1-NEXT: vpsraw $8, %xmm1, %xmm2
654 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [32896,37008,41120,45232,49344,53456,57568,61680]
655 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
656 ; AVX1-NEXT: vpsraw $4, %xmm1, %xmm2
657 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [256,8480,16704,24928,33152,41376,49600,57824]
658 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
659 ; AVX1-NEXT: vpsraw $2, %xmm1, %xmm2
660 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [512,16960,33408,49856,768,17216,33664,50112]
661 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
662 ; AVX1-NEXT: vpsraw $1, %xmm1, %xmm2
663 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1024,33920,1280,34176,1536,34432,1792,34688]
664 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
665 ; AVX1-NEXT: vpsraw $8, %xmm0, %xmm2
666 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,4112,8224,12336,16448,20560,24672,28784]
667 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
668 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm2
669 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,8224,16448,24672,32896,41120,49344,57568]
670 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
671 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm2
672 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,16448,32896,49344,256,16704,33152,49600]
673 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
674 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm2
675 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,32896,256,33152,512,33408,768,33664]
676 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
677 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
680 ; AVX2-LABEL: constant_shift_v16i16:
682 ; AVX2-NEXT: vpxor %ymm1, %ymm1, %ymm1
683 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
684 ; 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]
685 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
686 ; AVX2-NEXT: vpsravd %ymm3, %ymm4, %ymm3
687 ; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3
688 ; 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]
689 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
690 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
691 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
692 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
695 ; XOPAVX1-LABEL: constant_shift_v16i16:
697 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
698 ; XOPAVX1-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm2
699 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
700 ; XOPAVX1-NEXT: vpshaw %xmm2, %xmm3, %xmm2
701 ; XOPAVX1-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm1
702 ; XOPAVX1-NEXT: vpshaw %xmm1, %xmm0, %xmm0
703 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
706 ; XOPAVX2-LABEL: constant_shift_v16i16:
708 ; XOPAVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
709 ; XOPAVX2-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm2
710 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
711 ; XOPAVX2-NEXT: vpshaw %xmm2, %xmm3, %xmm2
712 ; XOPAVX2-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm1
713 ; XOPAVX2-NEXT: vpshaw %xmm1, %xmm0, %xmm0
714 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
716 %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>
717 ret <16 x i16> %shift
720 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
721 ; AVX1-LABEL: constant_shift_v32i8:
723 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
724 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
725 ; 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]
726 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
727 ; 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]
728 ; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5
729 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
730 ; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5
731 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm6
732 ; AVX1-NEXT: vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
733 ; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5
734 ; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm9
735 ; AVX1-NEXT: vpblendvb %xmm9, %xmm5, %xmm4, %xmm4
736 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm8
737 ; 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]
738 ; 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]
739 ; AVX1-NEXT: vpsraw $4, %xmm3, %xmm5
740 ; AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
741 ; AVX1-NEXT: vpsraw $2, %xmm3, %xmm5
742 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm4
743 ; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm3, %xmm3
744 ; AVX1-NEXT: vpsraw $1, %xmm3, %xmm5
745 ; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm7
746 ; AVX1-NEXT: vpblendvb %xmm7, %xmm5, %xmm3, %xmm3
747 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
748 ; AVX1-NEXT: vpackuswb %xmm8, %xmm3, %xmm8
749 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
750 ; AVX1-NEXT: vpsraw $4, %xmm5, %xmm3
751 ; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm5, %xmm2
752 ; AVX1-NEXT: vpsraw $2, %xmm2, %xmm3
753 ; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
754 ; AVX1-NEXT: vpsraw $1, %xmm2, %xmm3
755 ; AVX1-NEXT: vpblendvb %xmm9, %xmm3, %xmm2, %xmm2
756 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
757 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
758 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3
759 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
760 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1
761 ; AVX1-NEXT: vpblendvb %xmm4, %xmm1, %xmm0, %xmm0
762 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1
763 ; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
764 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
765 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
766 ; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm0, %ymm0
769 ; AVX2-LABEL: constant_shift_v32i8:
771 ; 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]
772 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
773 ; 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]
774 ; 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]
775 ; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4
776 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
777 ; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4
778 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2
779 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
780 ; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4
781 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2
782 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
783 ; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2
784 ; 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]
785 ; 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]
786 ; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3
787 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
788 ; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3
789 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1
790 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
791 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3
792 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1
793 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
794 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
795 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
798 ; XOPAVX1-LABEL: constant_shift_v32i8:
800 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
801 ; XOPAVX1-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1
802 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
803 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2
804 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0
805 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
808 ; XOPAVX2-LABEL: constant_shift_v32i8:
810 ; XOPAVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
811 ; XOPAVX2-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1
812 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
813 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm2, %xmm2
814 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0
815 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
817 %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>
822 ; Uniform Constant Shifts
825 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
826 ; AVX1-LABEL: splatconstant_shift_v4i64:
828 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
829 ; AVX1-NEXT: vpsrad $7, %xmm1, %xmm2
830 ; AVX1-NEXT: vpsrlq $7, %xmm1, %xmm1
831 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
832 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm2
833 ; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm0
834 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
835 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
838 ; AVX2-LABEL: splatconstant_shift_v4i64:
840 ; AVX2-NEXT: vpsrad $7, %ymm0, %ymm1
841 ; AVX2-NEXT: vpsrlq $7, %ymm0, %ymm0
842 ; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
845 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
847 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
848 ; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1
849 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
850 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm2, %xmm2
851 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0
852 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
855 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
857 ; XOPAVX2-NEXT: vpsrlq $7, %ymm0, %ymm0
858 ; XOPAVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm1
859 ; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
860 ; XOPAVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0
862 %shift = ashr <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
866 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
867 ; AVX1-LABEL: splatconstant_shift_v8i32:
869 ; AVX1-NEXT: vpsrad $5, %xmm0, %xmm1
870 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
871 ; AVX1-NEXT: vpsrad $5, %xmm0, %xmm0
872 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
875 ; AVX2-LABEL: splatconstant_shift_v8i32:
877 ; AVX2-NEXT: vpsrad $5, %ymm0, %ymm0
880 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
882 ; XOPAVX1-NEXT: vpsrad $5, %xmm0, %xmm1
883 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
884 ; XOPAVX1-NEXT: vpsrad $5, %xmm0, %xmm0
885 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
888 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
890 ; XOPAVX2-NEXT: vpsrad $5, %ymm0, %ymm0
892 %shift = ashr <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
896 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
897 ; AVX1-LABEL: splatconstant_shift_v16i16:
899 ; AVX1-NEXT: vpsraw $3, %xmm0, %xmm1
900 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
901 ; AVX1-NEXT: vpsraw $3, %xmm0, %xmm0
902 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
905 ; AVX2-LABEL: splatconstant_shift_v16i16:
907 ; AVX2-NEXT: vpsraw $3, %ymm0, %ymm0
910 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
912 ; XOPAVX1-NEXT: vpsraw $3, %xmm0, %xmm1
913 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
914 ; XOPAVX1-NEXT: vpsraw $3, %xmm0, %xmm0
915 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
918 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
920 ; XOPAVX2-NEXT: vpsraw $3, %ymm0, %ymm0
922 %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>
923 ret <16 x i16> %shift
926 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
927 ; AVX1-LABEL: splatconstant_shift_v32i8:
929 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
930 ; AVX1-NEXT: vpsrlw $3, %xmm1, %xmm1
931 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]
932 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
933 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
934 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1
935 ; AVX1-NEXT: vpsubb %xmm3, %xmm1, %xmm1
936 ; AVX1-NEXT: vpsrlw $3, %xmm0, %xmm0
937 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
938 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0
939 ; AVX1-NEXT: vpsubb %xmm3, %xmm0, %xmm0
940 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
943 ; AVX2-LABEL: splatconstant_shift_v32i8:
945 ; AVX2-NEXT: vpsrlw $3, %ymm0, %ymm0
946 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
947 ; 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]
948 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
949 ; AVX2-NEXT: vpsubb %ymm1, %ymm0, %ymm0
952 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
954 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
955 ; XOPAVX1-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1
956 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
957 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2
958 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0
959 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
962 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
964 ; XOPAVX2-NEXT: vpsrlw $3, %ymm0, %ymm0
965 ; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
966 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
967 ; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
968 ; XOPAVX2-NEXT: vpsubb %ymm1, %ymm0, %ymm0
970 %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>