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=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
13 define <4 x i64> @var_rotate_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
14 ; AVX1-LABEL: var_rotate_v4i64:
16 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [64,64]
17 ; AVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm3
18 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
19 ; AVX1-NEXT: vpsubq %xmm4, %xmm2, %xmm2
20 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
21 ; AVX1-NEXT: vpsllq %xmm4, %xmm5, %xmm6
22 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[2,3,0,1]
23 ; AVX1-NEXT: vpsllq %xmm4, %xmm5, %xmm4
24 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm6[0,1,2,3],xmm4[4,5,6,7]
25 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm6
26 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
27 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm1
28 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm6[0,1,2,3],xmm1[4,5,6,7]
29 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1
30 ; AVX1-NEXT: vpsrlq %xmm2, %xmm5, %xmm4
31 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
32 ; AVX1-NEXT: vpsrlq %xmm2, %xmm5, %xmm2
33 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
34 ; AVX1-NEXT: vpsrlq %xmm3, %xmm0, %xmm4
35 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
36 ; AVX1-NEXT: vpsrlq %xmm3, %xmm0, %xmm0
37 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm4[0,1,2,3],xmm0[4,5,6,7]
38 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
39 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
42 ; AVX2-LABEL: var_rotate_v4i64:
44 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [64,64,64,64]
45 ; AVX2-NEXT: vpsubq %ymm1, %ymm2, %ymm2
46 ; AVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm1
47 ; AVX2-NEXT: vpsrlvq %ymm2, %ymm0, %ymm0
48 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
51 ; AVX512BW-LABEL: var_rotate_v4i64:
53 ; AVX512BW-NEXT: # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
54 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
55 ; AVX512BW-NEXT: vprolvq %zmm1, %zmm0, %zmm0
56 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
59 ; AVX512VL-LABEL: var_rotate_v4i64:
61 ; AVX512VL-NEXT: vprolvq %ymm1, %ymm0, %ymm0
64 ; XOPAVX1-LABEL: var_rotate_v4i64:
66 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
67 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
68 ; XOPAVX1-NEXT: vprotq %xmm2, %xmm3, %xmm2
69 ; XOPAVX1-NEXT: vprotq %xmm1, %xmm0, %xmm0
70 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
73 ; XOPAVX2-LABEL: var_rotate_v4i64:
75 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
76 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
77 ; XOPAVX2-NEXT: vprotq %xmm2, %xmm3, %xmm2
78 ; XOPAVX2-NEXT: vprotq %xmm1, %xmm0, %xmm0
79 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
81 %b64 = sub <4 x i64> <i64 64, i64 64, i64 64, i64 64>, %b
82 %shl = shl <4 x i64> %a, %b
83 %lshr = lshr <4 x i64> %a, %b64
84 %or = or <4 x i64> %shl, %lshr
88 define <8 x i32> @var_rotate_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
89 ; AVX1-LABEL: var_rotate_v8i32:
91 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [32,32,32,32]
92 ; AVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm2
93 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
94 ; AVX1-NEXT: vpsubd %xmm4, %xmm3, %xmm3
95 ; AVX1-NEXT: vpslld $23, %xmm4, %xmm4
96 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]
97 ; AVX1-NEXT: vpaddd %xmm5, %xmm4, %xmm4
98 ; AVX1-NEXT: vcvttps2dq %xmm4, %xmm4
99 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
100 ; AVX1-NEXT: vpmulld %xmm6, %xmm4, %xmm4
101 ; AVX1-NEXT: vpslld $23, %xmm1, %xmm1
102 ; AVX1-NEXT: vpaddd %xmm5, %xmm1, %xmm1
103 ; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1
104 ; AVX1-NEXT: vpmulld %xmm0, %xmm1, %xmm1
105 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1
106 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
107 ; AVX1-NEXT: vpsrld %xmm4, %xmm6, %xmm4
108 ; AVX1-NEXT: vpsrlq $32, %xmm3, %xmm5
109 ; AVX1-NEXT: vpsrld %xmm5, %xmm6, %xmm5
110 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
111 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
112 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm7 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
113 ; AVX1-NEXT: vpsrld %xmm7, %xmm6, %xmm7
114 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
115 ; AVX1-NEXT: vpsrld %xmm3, %xmm6, %xmm3
116 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm7[4,5,6,7]
117 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]
118 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm4 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
119 ; AVX1-NEXT: vpsrld %xmm4, %xmm0, %xmm4
120 ; AVX1-NEXT: vpsrlq $32, %xmm2, %xmm6
121 ; AVX1-NEXT: vpsrld %xmm6, %xmm0, %xmm6
122 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm6[0,1,2,3],xmm4[4,5,6,7]
123 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm5 = xmm2[2],xmm5[2],xmm2[3],xmm5[3]
124 ; AVX1-NEXT: vpsrld %xmm5, %xmm0, %xmm5
125 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
126 ; AVX1-NEXT: vpsrld %xmm2, %xmm0, %xmm0
127 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm5[4,5,6,7]
128 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3],xmm0[4,5],xmm4[6,7]
129 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
130 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
133 ; AVX2-LABEL: var_rotate_v8i32:
135 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [32,32,32,32,32,32,32,32]
136 ; AVX2-NEXT: vpsubd %ymm1, %ymm2, %ymm2
137 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm1
138 ; AVX2-NEXT: vpsrlvd %ymm2, %ymm0, %ymm0
139 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
142 ; AVX512BW-LABEL: var_rotate_v8i32:
144 ; AVX512BW-NEXT: # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
145 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
146 ; AVX512BW-NEXT: vprolvd %zmm1, %zmm0, %zmm0
147 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
148 ; AVX512BW-NEXT: retq
150 ; AVX512VL-LABEL: var_rotate_v8i32:
152 ; AVX512VL-NEXT: vprolvd %ymm1, %ymm0, %ymm0
153 ; AVX512VL-NEXT: retq
155 ; XOPAVX1-LABEL: var_rotate_v8i32:
157 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
158 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
159 ; XOPAVX1-NEXT: vprotd %xmm2, %xmm3, %xmm2
160 ; XOPAVX1-NEXT: vprotd %xmm1, %xmm0, %xmm0
161 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
164 ; XOPAVX2-LABEL: var_rotate_v8i32:
166 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
167 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
168 ; XOPAVX2-NEXT: vprotd %xmm2, %xmm3, %xmm2
169 ; XOPAVX2-NEXT: vprotd %xmm1, %xmm0, %xmm0
170 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
172 %b32 = sub <8 x i32> <i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32>, %b
173 %shl = shl <8 x i32> %a, %b
174 %lshr = lshr <8 x i32> %a, %b32
175 %or = or <8 x i32> %shl, %lshr
179 define <16 x i16> @var_rotate_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
180 ; AVX1-LABEL: var_rotate_v16i16:
182 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
183 ; AVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm2
184 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
185 ; AVX1-NEXT: vpsubw %xmm4, %xmm3, %xmm3
186 ; AVX1-NEXT: vpsllw $12, %xmm4, %xmm5
187 ; AVX1-NEXT: vpsllw $4, %xmm4, %xmm4
188 ; AVX1-NEXT: vpor %xmm5, %xmm4, %xmm5
189 ; AVX1-NEXT: vpaddw %xmm5, %xmm5, %xmm6
190 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
191 ; AVX1-NEXT: vpsllw $8, %xmm4, %xmm7
192 ; AVX1-NEXT: vpblendvb %xmm5, %xmm7, %xmm4, %xmm5
193 ; AVX1-NEXT: vpsllw $4, %xmm5, %xmm7
194 ; AVX1-NEXT: vpblendvb %xmm6, %xmm7, %xmm5, %xmm5
195 ; AVX1-NEXT: vpsllw $2, %xmm5, %xmm7
196 ; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm6
197 ; AVX1-NEXT: vpblendvb %xmm6, %xmm7, %xmm5, %xmm5
198 ; AVX1-NEXT: vpsllw $1, %xmm5, %xmm7
199 ; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm6
200 ; AVX1-NEXT: vpblendvb %xmm6, %xmm7, %xmm5, %xmm5
201 ; AVX1-NEXT: vpsllw $12, %xmm1, %xmm6
202 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1
203 ; AVX1-NEXT: vpor %xmm6, %xmm1, %xmm1
204 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm6
205 ; AVX1-NEXT: vpsllw $8, %xmm0, %xmm7
206 ; AVX1-NEXT: vpblendvb %xmm1, %xmm7, %xmm0, %xmm1
207 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm7
208 ; AVX1-NEXT: vpblendvb %xmm6, %xmm7, %xmm1, %xmm1
209 ; AVX1-NEXT: vpsllw $2, %xmm1, %xmm7
210 ; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm6
211 ; AVX1-NEXT: vpblendvb %xmm6, %xmm7, %xmm1, %xmm1
212 ; AVX1-NEXT: vpsllw $1, %xmm1, %xmm7
213 ; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm6
214 ; AVX1-NEXT: vpblendvb %xmm6, %xmm7, %xmm1, %xmm1
215 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1
216 ; AVX1-NEXT: vpsllw $12, %xmm3, %xmm5
217 ; AVX1-NEXT: vpsllw $4, %xmm3, %xmm3
218 ; AVX1-NEXT: vpor %xmm5, %xmm3, %xmm3
219 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm5
220 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm6
221 ; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm4, %xmm3
222 ; AVX1-NEXT: vpsrlw $4, %xmm3, %xmm4
223 ; AVX1-NEXT: vpblendvb %xmm5, %xmm4, %xmm3, %xmm3
224 ; AVX1-NEXT: vpsrlw $2, %xmm3, %xmm4
225 ; AVX1-NEXT: vpaddw %xmm5, %xmm5, %xmm5
226 ; AVX1-NEXT: vpblendvb %xmm5, %xmm4, %xmm3, %xmm3
227 ; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm4
228 ; AVX1-NEXT: vpaddw %xmm5, %xmm5, %xmm5
229 ; AVX1-NEXT: vpblendvb %xmm5, %xmm4, %xmm3, %xmm3
230 ; AVX1-NEXT: vpsllw $12, %xmm2, %xmm4
231 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm2
232 ; AVX1-NEXT: vpor %xmm4, %xmm2, %xmm2
233 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm4
234 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm5
235 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm0, %xmm0
236 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm2
237 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
238 ; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm2
239 ; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm4
240 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
241 ; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm2
242 ; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm4
243 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
244 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
245 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
248 ; AVX2-LABEL: var_rotate_v16i16:
250 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
251 ; AVX2-NEXT: vpsubw %ymm1, %ymm2, %ymm2
252 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
253 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm1[4],ymm3[4],ymm1[5],ymm3[5],ymm1[6],ymm3[6],ymm1[7],ymm3[7],ymm1[12],ymm3[12],ymm1[13],ymm3[13],ymm1[14],ymm3[14],ymm1[15],ymm3[15]
254 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm3[4],ymm0[4],ymm3[5],ymm0[5],ymm3[6],ymm0[6],ymm3[7],ymm0[7],ymm3[12],ymm0[12],ymm3[13],ymm0[13],ymm3[14],ymm0[14],ymm3[15],ymm0[15]
255 ; AVX2-NEXT: vpsllvd %ymm4, %ymm5, %ymm4
256 ; AVX2-NEXT: vpsrld $16, %ymm4, %ymm4
257 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm3[0],ymm1[1],ymm3[1],ymm1[2],ymm3[2],ymm1[3],ymm3[3],ymm1[8],ymm3[8],ymm1[9],ymm3[9],ymm1[10],ymm3[10],ymm1[11],ymm3[11]
258 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm3[0],ymm0[0],ymm3[1],ymm0[1],ymm3[2],ymm0[2],ymm3[3],ymm0[3],ymm3[8],ymm0[8],ymm3[9],ymm0[9],ymm3[10],ymm0[10],ymm3[11],ymm0[11]
259 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm1
260 ; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1
261 ; AVX2-NEXT: vpackusdw %ymm4, %ymm1, %ymm1
262 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm3[4],ymm2[5],ymm3[5],ymm2[6],ymm3[6],ymm2[7],ymm3[7],ymm2[12],ymm3[12],ymm2[13],ymm3[13],ymm2[14],ymm3[14],ymm2[15],ymm3[15]
263 ; AVX2-NEXT: vpsrlvd %ymm4, %ymm5, %ymm4
264 ; AVX2-NEXT: vpsrld $16, %ymm4, %ymm4
265 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm3[0],ymm2[1],ymm3[1],ymm2[2],ymm3[2],ymm2[3],ymm3[3],ymm2[8],ymm3[8],ymm2[9],ymm3[9],ymm2[10],ymm3[10],ymm2[11],ymm3[11]
266 ; AVX2-NEXT: vpsrlvd %ymm2, %ymm0, %ymm0
267 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
268 ; AVX2-NEXT: vpackusdw %ymm4, %ymm0, %ymm0
269 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
272 ; AVX512BW-LABEL: var_rotate_v16i16:
274 ; AVX512BW-NEXT: # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
275 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
276 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm2 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
277 ; AVX512BW-NEXT: vpsubw %ymm1, %ymm2, %ymm2
278 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm1
279 ; AVX512BW-NEXT: vpsrlvw %zmm2, %zmm0, %zmm0
280 ; AVX512BW-NEXT: vpor %ymm0, %ymm1, %ymm0
281 ; AVX512BW-NEXT: retq
283 ; AVX512VL-LABEL: var_rotate_v16i16:
285 ; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm2 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
286 ; AVX512VL-NEXT: vpsubw %ymm1, %ymm2, %ymm2
287 ; AVX512VL-NEXT: vpsllvw %ymm1, %ymm0, %ymm1
288 ; AVX512VL-NEXT: vpsrlvw %ymm2, %ymm0, %ymm0
289 ; AVX512VL-NEXT: vpor %ymm0, %ymm1, %ymm0
290 ; AVX512VL-NEXT: retq
292 ; XOPAVX1-LABEL: var_rotate_v16i16:
294 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
295 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
296 ; XOPAVX1-NEXT: vprotw %xmm2, %xmm3, %xmm2
297 ; XOPAVX1-NEXT: vprotw %xmm1, %xmm0, %xmm0
298 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
301 ; XOPAVX2-LABEL: var_rotate_v16i16:
303 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
304 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
305 ; XOPAVX2-NEXT: vprotw %xmm2, %xmm3, %xmm2
306 ; XOPAVX2-NEXT: vprotw %xmm1, %xmm0, %xmm0
307 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
309 %b16 = sub <16 x i16> <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>, %b
310 %shl = shl <16 x i16> %a, %b
311 %lshr = lshr <16 x i16> %a, %b16
312 %or = or <16 x i16> %shl, %lshr
316 define <32 x i8> @var_rotate_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
317 ; AVX1-LABEL: var_rotate_v32i8:
319 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
320 ; AVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm8
321 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
322 ; AVX1-NEXT: vpsubb %xmm4, %xmm3, %xmm9
323 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
324 ; AVX1-NEXT: vpsllw $4, %xmm5, %xmm6
325 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
326 ; AVX1-NEXT: vpand %xmm7, %xmm6, %xmm6
327 ; AVX1-NEXT: vpsllw $5, %xmm4, %xmm4
328 ; AVX1-NEXT: vpblendvb %xmm4, %xmm6, %xmm5, %xmm6
329 ; AVX1-NEXT: vpsllw $2, %xmm6, %xmm2
330 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
331 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
332 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm4
333 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm6, %xmm2
334 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm6
335 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm4
336 ; AVX1-NEXT: vpblendvb %xmm4, %xmm6, %xmm2, %xmm2
337 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm4
338 ; AVX1-NEXT: vpand %xmm7, %xmm4, %xmm4
339 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
340 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm4
341 ; AVX1-NEXT: vpsllw $2, %xmm4, %xmm6
342 ; AVX1-NEXT: vpand %xmm3, %xmm6, %xmm3
343 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
344 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm4, %xmm3
345 ; AVX1-NEXT: vpaddb %xmm3, %xmm3, %xmm4
346 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
347 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm3, %xmm1
348 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
349 ; AVX1-NEXT: vpsrlw $4, %xmm5, %xmm2
350 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
351 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
352 ; AVX1-NEXT: vpsllw $5, %xmm9, %xmm4
353 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm5, %xmm2
354 ; AVX1-NEXT: vpsrlw $2, %xmm2, %xmm5
355 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
356 ; AVX1-NEXT: vpand %xmm6, %xmm5, %xmm5
357 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm4
358 ; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm2, %xmm2
359 ; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm5
360 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
361 ; AVX1-NEXT: vpand %xmm7, %xmm5, %xmm5
362 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm4
363 ; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm2, %xmm2
364 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm4
365 ; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm3
366 ; AVX1-NEXT: vpsllw $5, %xmm8, %xmm4
367 ; AVX1-NEXT: vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
368 ; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm3
369 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
370 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm4
371 ; AVX1-NEXT: vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
372 ; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm3
373 ; AVX1-NEXT: vpand %xmm7, %xmm3, %xmm3
374 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm4
375 ; AVX1-NEXT: vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
376 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
377 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
380 ; AVX2-LABEL: var_rotate_v32i8:
382 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
383 ; AVX2-NEXT: vpsubb %ymm1, %ymm2, %ymm2
384 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
385 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm3
386 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
387 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm3
388 ; AVX2-NEXT: vpsllw $2, %ymm3, %ymm4
389 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm4, %ymm4
390 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
391 ; AVX2-NEXT: vpblendvb %ymm1, %ymm4, %ymm3, %ymm3
392 ; AVX2-NEXT: vpaddb %ymm3, %ymm3, %ymm4
393 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
394 ; AVX2-NEXT: vpblendvb %ymm1, %ymm4, %ymm3, %ymm1
395 ; AVX2-NEXT: vpsllw $5, %ymm2, %ymm2
396 ; AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm3
397 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm4
398 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm4, %ymm4
399 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm0, %ymm0
400 ; AVX2-NEXT: vpsrlw $2, %ymm0, %ymm2
401 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
402 ; AVX2-NEXT: vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
403 ; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm2
404 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
405 ; AVX2-NEXT: vpaddb %ymm3, %ymm3, %ymm3
406 ; AVX2-NEXT: vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
407 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
410 ; AVX512-LABEL: var_rotate_v32i8:
412 ; AVX512-NEXT: vmovdqa {{.*#+}} ymm2 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
413 ; AVX512-NEXT: vpsubb %ymm1, %ymm2, %ymm2
414 ; AVX512-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
415 ; AVX512-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
416 ; AVX512-NEXT: vpsllvw %zmm1, %zmm0, %zmm1
417 ; AVX512-NEXT: vpmovwb %zmm1, %ymm1
418 ; AVX512-NEXT: vpmovzxbw {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero,ymm2[16],zero,ymm2[17],zero,ymm2[18],zero,ymm2[19],zero,ymm2[20],zero,ymm2[21],zero,ymm2[22],zero,ymm2[23],zero,ymm2[24],zero,ymm2[25],zero,ymm2[26],zero,ymm2[27],zero,ymm2[28],zero,ymm2[29],zero,ymm2[30],zero,ymm2[31],zero
419 ; AVX512-NEXT: vpsrlvw %zmm2, %zmm0, %zmm0
420 ; AVX512-NEXT: vpmovwb %zmm0, %ymm0
421 ; AVX512-NEXT: vpor %ymm0, %ymm1, %ymm0
424 ; XOPAVX1-LABEL: var_rotate_v32i8:
426 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
427 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
428 ; XOPAVX1-NEXT: vprotb %xmm2, %xmm3, %xmm2
429 ; XOPAVX1-NEXT: vprotb %xmm1, %xmm0, %xmm0
430 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
433 ; XOPAVX2-LABEL: var_rotate_v32i8:
435 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
436 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
437 ; XOPAVX2-NEXT: vprotb %xmm2, %xmm3, %xmm2
438 ; XOPAVX2-NEXT: vprotb %xmm1, %xmm0, %xmm0
439 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
441 %b8 = sub <32 x i8> <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>, %b
442 %shl = shl <32 x i8> %a, %b
443 %lshr = lshr <32 x i8> %a, %b8
444 %or = or <32 x i8> %shl, %lshr
452 define <4 x i64> @constant_rotate_v4i64(<4 x i64> %a) nounwind {
453 ; AVX1-LABEL: constant_rotate_v4i64:
455 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
456 ; AVX1-NEXT: vpsllq $60, %xmm1, %xmm2
457 ; AVX1-NEXT: vpsllq $50, %xmm1, %xmm3
458 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
459 ; AVX1-NEXT: vpsllq $14, %xmm0, %xmm3
460 ; AVX1-NEXT: vpsllq $4, %xmm0, %xmm4
461 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
462 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
463 ; AVX1-NEXT: vpsrlq $4, %xmm1, %xmm3
464 ; AVX1-NEXT: vpsrlq $14, %xmm1, %xmm1
465 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]
466 ; AVX1-NEXT: vpsrlq $50, %xmm0, %xmm3
467 ; AVX1-NEXT: vpsrlq $60, %xmm0, %xmm0
468 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
469 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
470 ; AVX1-NEXT: vorps %ymm0, %ymm2, %ymm0
473 ; AVX2-LABEL: constant_rotate_v4i64:
475 ; AVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm1
476 ; AVX2-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
477 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
480 ; AVX512BW-LABEL: constant_rotate_v4i64:
482 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
483 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [4,14,50,60]
484 ; AVX512BW-NEXT: vprolvq %zmm1, %zmm0, %zmm0
485 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
486 ; AVX512BW-NEXT: retq
488 ; AVX512VL-LABEL: constant_rotate_v4i64:
490 ; AVX512VL-NEXT: vprolvq {{.*}}(%rip), %ymm0, %ymm0
491 ; AVX512VL-NEXT: retq
493 ; XOPAVX1-LABEL: constant_rotate_v4i64:
495 ; XOPAVX1-NEXT: vprotq {{.*}}(%rip), %xmm0, %xmm1
496 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
497 ; XOPAVX1-NEXT: vprotq {{.*}}(%rip), %xmm0, %xmm0
498 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
501 ; XOPAVX2-LABEL: constant_rotate_v4i64:
503 ; XOPAVX2-NEXT: vprotq {{.*}}(%rip), %xmm0, %xmm1
504 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
505 ; XOPAVX2-NEXT: vprotq {{.*}}(%rip), %xmm0, %xmm0
506 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
508 %shl = shl <4 x i64> %a, <i64 4, i64 14, i64 50, i64 60>
509 %lshr = lshr <4 x i64> %a, <i64 60, i64 50, i64 14, i64 4>
510 %or = or <4 x i64> %shl, %lshr
514 define <8 x i32> @constant_rotate_v8i32(<8 x i32> %a) nounwind {
515 ; AVX1-LABEL: constant_rotate_v8i32:
517 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm1
518 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
519 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm2, %xmm3
520 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
521 ; AVX1-NEXT: vpsrld $21, %xmm2, %xmm3
522 ; AVX1-NEXT: vpsrld $23, %xmm2, %xmm4
523 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
524 ; AVX1-NEXT: vpsrld $22, %xmm2, %xmm4
525 ; AVX1-NEXT: vpsrld $24, %xmm2, %xmm2
526 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm4[4,5,6,7]
527 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
528 ; AVX1-NEXT: vpsrld $25, %xmm0, %xmm3
529 ; AVX1-NEXT: vpsrld $27, %xmm0, %xmm4
530 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
531 ; AVX1-NEXT: vpsrld $26, %xmm0, %xmm4
532 ; AVX1-NEXT: vpsrld $28, %xmm0, %xmm0
533 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
534 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
535 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
536 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
539 ; AVX2-LABEL: constant_rotate_v8i32:
541 ; AVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm1
542 ; AVX2-NEXT: vpsrlvd {{.*}}(%rip), %ymm0, %ymm0
543 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
546 ; AVX512BW-LABEL: constant_rotate_v8i32:
548 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
549 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [4,5,6,7,8,9,10,11]
550 ; AVX512BW-NEXT: vprolvd %zmm1, %zmm0, %zmm0
551 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
552 ; AVX512BW-NEXT: retq
554 ; AVX512VL-LABEL: constant_rotate_v8i32:
556 ; AVX512VL-NEXT: vprolvd {{.*}}(%rip), %ymm0, %ymm0
557 ; AVX512VL-NEXT: retq
559 ; XOPAVX1-LABEL: constant_rotate_v8i32:
561 ; XOPAVX1-NEXT: vprotd {{.*}}(%rip), %xmm0, %xmm1
562 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
563 ; XOPAVX1-NEXT: vprotd {{.*}}(%rip), %xmm0, %xmm0
564 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
567 ; XOPAVX2-LABEL: constant_rotate_v8i32:
569 ; XOPAVX2-NEXT: vprotd {{.*}}(%rip), %xmm0, %xmm1
570 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
571 ; XOPAVX2-NEXT: vprotd {{.*}}(%rip), %xmm0, %xmm0
572 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
574 %shl = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>
575 %lshr = lshr <8 x i32> %a, <i32 28, i32 27, i32 26, i32 25, i32 24, i32 23, i32 22, i32 21>
576 %or = or <8 x i32> %shl, %lshr
580 define <16 x i16> @constant_rotate_v16i16(<16 x i16> %a) nounwind {
581 ; AVX1-LABEL: constant_rotate_v16i16:
583 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm1
584 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
585 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm2, %xmm3
586 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
587 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm3
588 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3,4,5,6,7]
589 ; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm3
590 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3,4],xmm2[5,6,7]
591 ; AVX1-NEXT: vpsrlw $2, %xmm2, %xmm3
592 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2],xmm2[3,4],xmm3[5,6],xmm2[7]
593 ; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm3
594 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1],xmm2[2],xmm3[3],xmm2[4],xmm3[5],xmm2[6],xmm3[7]
595 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm3
596 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3,4,5,6,7]
597 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm3
598 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3,4],xmm0[5,6,7]
599 ; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm3
600 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2],xmm0[3,4],xmm3[5,6],xmm0[7]
601 ; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm3
602 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1],xmm0[2],xmm3[3],xmm0[4],xmm3[5],xmm0[6],xmm3[7]
603 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
604 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
607 ; AVX2-LABEL: constant_rotate_v16i16:
609 ; AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm1
610 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
611 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
612 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm3[4],ymm2[4],ymm3[5],ymm2[5],ymm3[6],ymm2[6],ymm3[7],ymm2[7],ymm3[12],ymm2[12],ymm3[13],ymm2[13],ymm3[14],ymm2[14],ymm3[15],ymm2[15]
613 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
614 ; AVX2-NEXT: vpsrlvd %ymm4, %ymm5, %ymm4
615 ; AVX2-NEXT: vpsrld $16, %ymm4, %ymm4
616 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm2[0],ymm3[1],ymm2[1],ymm3[2],ymm2[2],ymm3[3],ymm2[3],ymm3[8],ymm2[8],ymm3[9],ymm2[9],ymm3[10],ymm2[10],ymm3[11],ymm2[11]
617 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
618 ; AVX2-NEXT: vpsrlvd %ymm3, %ymm0, %ymm0
619 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
620 ; AVX2-NEXT: vpackusdw %ymm4, %ymm0, %ymm0
621 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
624 ; AVX512BW-LABEL: constant_rotate_v16i16:
626 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
627 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
628 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm1
629 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm2 = [16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
630 ; AVX512BW-NEXT: vpsrlvw %zmm2, %zmm0, %zmm0
631 ; AVX512BW-NEXT: vpor %ymm0, %ymm1, %ymm0
632 ; AVX512BW-NEXT: retq
634 ; AVX512VL-LABEL: constant_rotate_v16i16:
636 ; AVX512VL-NEXT: vpsllvw {{.*}}(%rip), %ymm0, %ymm1
637 ; AVX512VL-NEXT: vpsrlvw {{.*}}(%rip), %ymm0, %ymm0
638 ; AVX512VL-NEXT: vpor %ymm0, %ymm1, %ymm0
639 ; AVX512VL-NEXT: retq
641 ; XOPAVX1-LABEL: constant_rotate_v16i16:
643 ; XOPAVX1-NEXT: vprotw {{.*}}(%rip), %xmm0, %xmm1
644 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
645 ; XOPAVX1-NEXT: vprotw {{.*}}(%rip), %xmm0, %xmm0
646 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
649 ; XOPAVX2-LABEL: constant_rotate_v16i16:
651 ; XOPAVX2-NEXT: vprotw {{.*}}(%rip), %xmm0, %xmm1
652 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
653 ; XOPAVX2-NEXT: vprotw {{.*}}(%rip), %xmm0, %xmm0
654 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
656 %shl = shl <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>
657 %lshr = lshr <16 x i16> %a, <i16 16, i16 15, i16 14, i16 13, i16 12, i16 11, i16 10, i16 9, i16 8, i16 7, i16 6, i16 5, i16 4, i16 3, i16 2, i16 1>
658 %or = or <16 x i16> %shl, %lshr
662 define <32 x i8> @constant_rotate_v32i8(<32 x i8> %a) nounwind {
663 ; AVX1-LABEL: constant_rotate_v32i8:
665 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
666 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm2
667 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
668 ; AVX1-NEXT: vpand %xmm8, %xmm2, %xmm2
669 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [8192,24640,41088,57536,57600,41152,24704,8256]
670 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm1, %xmm2
671 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm5
672 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
673 ; AVX1-NEXT: vpand %xmm6, %xmm5, %xmm5
674 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm7
675 ; AVX1-NEXT: vpblendvb %xmm7, %xmm5, %xmm2, %xmm2
676 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm5
677 ; AVX1-NEXT: vpaddb %xmm7, %xmm7, %xmm3
678 ; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm2, %xmm2
679 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm5
680 ; AVX1-NEXT: vpand %xmm8, %xmm5, %xmm5
681 ; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm0, %xmm4
682 ; AVX1-NEXT: vpsllw $2, %xmm4, %xmm5
683 ; AVX1-NEXT: vpand %xmm6, %xmm5, %xmm5
684 ; AVX1-NEXT: vpblendvb %xmm7, %xmm5, %xmm4, %xmm4
685 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm5
686 ; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm3
687 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm9
688 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm3
689 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
690 ; AVX1-NEXT: vpand %xmm8, %xmm3, %xmm3
691 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [57600,41152,24704,8256,8192,24640,41088,57536]
692 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm1, %xmm1
693 ; AVX1-NEXT: vpsrlw $2, %xmm1, %xmm3
694 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
695 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
696 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm7
697 ; AVX1-NEXT: vpblendvb %xmm7, %xmm3, %xmm1, %xmm1
698 ; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm3
699 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
700 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
701 ; AVX1-NEXT: vpaddb %xmm7, %xmm7, %xmm2
702 ; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm1, %xmm1
703 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm3
704 ; AVX1-NEXT: vpand %xmm8, %xmm3, %xmm3
705 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm0, %xmm0
706 ; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm3
707 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
708 ; AVX1-NEXT: vpblendvb %xmm7, %xmm3, %xmm0, %xmm0
709 ; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm3
710 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
711 ; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm0, %xmm0
712 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
713 ; AVX1-NEXT: vorps %ymm0, %ymm9, %ymm0
716 ; AVX2-LABEL: constant_rotate_v32i8:
718 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm1
719 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
720 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [8192,24640,41088,57536,57600,41152,24704,8256,8192,24640,41088,57536,57600,41152,24704,8256]
721 ; AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm1
722 ; AVX2-NEXT: vpsllw $2, %ymm1, %ymm3
723 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
724 ; AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm2
725 ; AVX2-NEXT: vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
726 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm3
727 ; AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm2
728 ; AVX2-NEXT: vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
729 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm2
730 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
731 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [57600,41152,24704,8256,8192,24640,41088,57536,57600,41152,24704,8256,8192,24640,41088,57536]
732 ; AVX2-NEXT: vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
733 ; AVX2-NEXT: vpsrlw $2, %ymm0, %ymm2
734 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
735 ; AVX2-NEXT: vpaddb %ymm3, %ymm3, %ymm3
736 ; AVX2-NEXT: vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
737 ; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm2
738 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
739 ; AVX2-NEXT: vpaddb %ymm3, %ymm3, %ymm3
740 ; AVX2-NEXT: vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
741 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
744 ; AVX512-LABEL: constant_rotate_v32i8:
746 ; AVX512-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
747 ; AVX512-NEXT: vpsllvw {{.*}}(%rip), %zmm0, %zmm1
748 ; AVX512-NEXT: vpmovwb %zmm1, %ymm1
749 ; AVX512-NEXT: vpsrlvw {{.*}}(%rip), %zmm0, %zmm0
750 ; AVX512-NEXT: vpmovwb %zmm0, %ymm0
751 ; AVX512-NEXT: vpor %ymm0, %ymm1, %ymm0
754 ; XOPAVX1-LABEL: constant_rotate_v32i8:
756 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
757 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
758 ; XOPAVX1-NEXT: vprotb %xmm2, %xmm1, %xmm1
759 ; XOPAVX1-NEXT: vprotb %xmm2, %xmm0, %xmm0
760 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
763 ; XOPAVX2-LABEL: constant_rotate_v32i8:
765 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
766 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
767 ; XOPAVX2-NEXT: vprotb %xmm2, %xmm1, %xmm1
768 ; XOPAVX2-NEXT: vprotb %xmm2, %xmm0, %xmm0
769 ; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
771 %shl = shl <32 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>
772 %lshr = lshr <32 x i8> %a, <i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7>
773 %or = or <32 x i8> %shl, %lshr
778 ; Uniform Constant Rotates
781 define <4 x i64> @splatconstant_rotate_v4i64(<4 x i64> %a) nounwind {
782 ; AVX1-LABEL: splatconstant_rotate_v4i64:
784 ; AVX1-NEXT: vpsllq $14, %xmm0, %xmm1
785 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
786 ; AVX1-NEXT: vpsllq $14, %xmm2, %xmm3
787 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
788 ; AVX1-NEXT: vpsrlq $50, %xmm0, %xmm0
789 ; AVX1-NEXT: vpsrlq $50, %xmm2, %xmm2
790 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
791 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
794 ; AVX2-LABEL: splatconstant_rotate_v4i64:
796 ; AVX2-NEXT: vpsllq $14, %ymm0, %ymm1
797 ; AVX2-NEXT: vpsrlq $50, %ymm0, %ymm0
798 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
801 ; AVX512BW-LABEL: splatconstant_rotate_v4i64:
803 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
804 ; AVX512BW-NEXT: vprolq $14, %zmm0, %zmm0
805 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
806 ; AVX512BW-NEXT: retq
808 ; AVX512VL-LABEL: splatconstant_rotate_v4i64:
810 ; AVX512VL-NEXT: vprolq $14, %ymm0, %ymm0
811 ; AVX512VL-NEXT: retq
813 ; XOPAVX1-LABEL: splatconstant_rotate_v4i64:
815 ; XOPAVX1-NEXT: vprotq $14, %xmm0, %xmm1
816 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
817 ; XOPAVX1-NEXT: vprotq $14, %xmm0, %xmm0
818 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
821 ; XOPAVX2-LABEL: splatconstant_rotate_v4i64:
823 ; XOPAVX2-NEXT: vprotq $14, %xmm0, %xmm1
824 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
825 ; XOPAVX2-NEXT: vprotq $14, %xmm0, %xmm0
826 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
828 %shl = shl <4 x i64> %a, <i64 14, i64 14, i64 14, i64 14>
829 %lshr = lshr <4 x i64> %a, <i64 50, i64 50, i64 50, i64 50>
830 %or = or <4 x i64> %shl, %lshr
834 define <8 x i32> @splatconstant_rotate_v8i32(<8 x i32> %a) nounwind {
835 ; AVX1-LABEL: splatconstant_rotate_v8i32:
837 ; AVX1-NEXT: vpslld $4, %xmm0, %xmm1
838 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
839 ; AVX1-NEXT: vpslld $4, %xmm2, %xmm3
840 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
841 ; AVX1-NEXT: vpsrld $28, %xmm0, %xmm0
842 ; AVX1-NEXT: vpsrld $28, %xmm2, %xmm2
843 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
844 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
847 ; AVX2-LABEL: splatconstant_rotate_v8i32:
849 ; AVX2-NEXT: vpslld $4, %ymm0, %ymm1
850 ; AVX2-NEXT: vpsrld $28, %ymm0, %ymm0
851 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
854 ; AVX512BW-LABEL: splatconstant_rotate_v8i32:
856 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
857 ; AVX512BW-NEXT: vprold $4, %zmm0, %zmm0
858 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<kill>
859 ; AVX512BW-NEXT: retq
861 ; AVX512VL-LABEL: splatconstant_rotate_v8i32:
863 ; AVX512VL-NEXT: vprold $4, %ymm0, %ymm0
864 ; AVX512VL-NEXT: retq
866 ; XOPAVX1-LABEL: splatconstant_rotate_v8i32:
868 ; XOPAVX1-NEXT: vprotd $4, %xmm0, %xmm1
869 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
870 ; XOPAVX1-NEXT: vprotd $4, %xmm0, %xmm0
871 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
874 ; XOPAVX2-LABEL: splatconstant_rotate_v8i32:
876 ; XOPAVX2-NEXT: vprotd $4, %xmm0, %xmm1
877 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
878 ; XOPAVX2-NEXT: vprotd $4, %xmm0, %xmm0
879 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
881 %shl = shl <8 x i32> %a, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
882 %lshr = lshr <8 x i32> %a, <i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28>
883 %or = or <8 x i32> %shl, %lshr
887 define <16 x i16> @splatconstant_rotate_v16i16(<16 x i16> %a) nounwind {
888 ; AVX1-LABEL: splatconstant_rotate_v16i16:
890 ; AVX1-NEXT: vpsllw $7, %xmm0, %xmm1
891 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
892 ; AVX1-NEXT: vpsllw $7, %xmm2, %xmm3
893 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
894 ; AVX1-NEXT: vpsrlw $9, %xmm0, %xmm0
895 ; AVX1-NEXT: vpsrlw $9, %xmm2, %xmm2
896 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
897 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
900 ; AVX2-LABEL: splatconstant_rotate_v16i16:
902 ; AVX2-NEXT: vpsllw $7, %ymm0, %ymm1
903 ; AVX2-NEXT: vpsrlw $9, %ymm0, %ymm0
904 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
907 ; AVX512-LABEL: splatconstant_rotate_v16i16:
909 ; AVX512-NEXT: vpsllw $7, %ymm0, %ymm1
910 ; AVX512-NEXT: vpsrlw $9, %ymm0, %ymm0
911 ; AVX512-NEXT: vpor %ymm0, %ymm1, %ymm0
914 ; XOPAVX1-LABEL: splatconstant_rotate_v16i16:
916 ; XOPAVX1-NEXT: vprotw $7, %xmm0, %xmm1
917 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
918 ; XOPAVX1-NEXT: vprotw $7, %xmm0, %xmm0
919 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
922 ; XOPAVX2-LABEL: splatconstant_rotate_v16i16:
924 ; XOPAVX2-NEXT: vprotw $7, %xmm0, %xmm1
925 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
926 ; XOPAVX2-NEXT: vprotw $7, %xmm0, %xmm0
927 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
929 %shl = shl <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
930 %lshr = lshr <16 x i16> %a, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9>
931 %or = or <16 x i16> %shl, %lshr
935 define <32 x i8> @splatconstant_rotate_v32i8(<32 x i8> %a) nounwind {
936 ; AVX1-LABEL: splatconstant_rotate_v32i8:
938 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
939 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm2
940 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
941 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
942 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm4
943 ; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm3
944 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
945 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
946 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
947 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
948 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
949 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
950 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
951 ; AVX1-NEXT: vorps %ymm0, %ymm2, %ymm0
954 ; AVX2-LABEL: splatconstant_rotate_v32i8:
956 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm1
957 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
958 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
959 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
960 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
963 ; AVX512-LABEL: splatconstant_rotate_v32i8:
965 ; AVX512-NEXT: vpsllw $4, %ymm0, %ymm1
966 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
967 ; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm0
968 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
969 ; AVX512-NEXT: vpor %ymm0, %ymm1, %ymm0
972 ; XOPAVX1-LABEL: splatconstant_rotate_v32i8:
974 ; XOPAVX1-NEXT: vprotb $4, %xmm0, %xmm1
975 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
976 ; XOPAVX1-NEXT: vprotb $4, %xmm0, %xmm0
977 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
980 ; XOPAVX2-LABEL: splatconstant_rotate_v32i8:
982 ; XOPAVX2-NEXT: vprotb $4, %xmm0, %xmm1
983 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
984 ; XOPAVX2-NEXT: vprotb $4, %xmm0, %xmm0
985 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
987 %shl = shl <32 x i8> %a, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
988 %lshr = lshr <32 x i8> %a, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
989 %or = or <32 x i8> %shl, %lshr
994 ; Masked Uniform Constant Rotates
997 define <4 x i64> @splatconstant_rotate_mask_v4i64(<4 x i64> %a) nounwind {
998 ; AVX1-LABEL: splatconstant_rotate_mask_v4i64:
1000 ; AVX1-NEXT: vpsrlq $49, %xmm0, %xmm1
1001 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1002 ; AVX1-NEXT: vpsrlq $49, %xmm0, %xmm0
1003 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1004 ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
1007 ; AVX2-LABEL: splatconstant_rotate_mask_v4i64:
1009 ; AVX2-NEXT: vpsrlq $49, %ymm0, %ymm0
1010 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1013 ; AVX512BW-LABEL: splatconstant_rotate_mask_v4i64:
1015 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
1016 ; AVX512BW-NEXT: vprolq $15, %zmm0, %zmm0
1017 ; AVX512BW-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1018 ; AVX512BW-NEXT: retq
1020 ; AVX512VL-LABEL: splatconstant_rotate_mask_v4i64:
1022 ; AVX512VL-NEXT: vprolq $15, %ymm0, %ymm0
1023 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1024 ; AVX512VL-NEXT: retq
1026 ; XOPAVX1-LABEL: splatconstant_rotate_mask_v4i64:
1028 ; XOPAVX1-NEXT: vprotq $15, %xmm0, %xmm1
1029 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1030 ; XOPAVX1-NEXT: vprotq $15, %xmm0, %xmm0
1031 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1032 ; XOPAVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
1033 ; XOPAVX1-NEXT: retq
1035 ; XOPAVX2-LABEL: splatconstant_rotate_mask_v4i64:
1037 ; XOPAVX2-NEXT: vprotq $15, %xmm0, %xmm1
1038 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
1039 ; XOPAVX2-NEXT: vprotq $15, %xmm0, %xmm0
1040 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
1041 ; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1042 ; XOPAVX2-NEXT: retq
1043 %shl = shl <4 x i64> %a, <i64 15, i64 15, i64 15, i64 15>
1044 %lshr = lshr <4 x i64> %a, <i64 49, i64 49, i64 49, i64 49>
1045 %rmask = and <4 x i64> %lshr, <i64 255, i64 127, i64 127, i64 255>
1046 %lmask = and <4 x i64> %shl, <i64 33, i64 65, i64 129, i64 257>
1047 %or = or <4 x i64> %lmask, %rmask
1051 define <8 x i32> @splatconstant_rotate_mask_v8i32(<8 x i32> %a) nounwind {
1052 ; AVX1-LABEL: splatconstant_rotate_mask_v8i32:
1054 ; AVX1-NEXT: vpslld $4, %xmm0, %xmm1
1055 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1056 ; AVX1-NEXT: vpslld $4, %xmm2, %xmm3
1057 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
1058 ; AVX1-NEXT: vpsrld $28, %xmm0, %xmm0
1059 ; AVX1-NEXT: vpsrld $28, %xmm2, %xmm2
1060 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1061 ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
1062 ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm1, %ymm1
1063 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
1066 ; AVX2-LABEL: splatconstant_rotate_mask_v8i32:
1068 ; AVX2-NEXT: vpslld $4, %ymm0, %ymm1
1069 ; AVX2-NEXT: vpsrld $28, %ymm0, %ymm0
1070 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1071 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1072 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
1075 ; AVX512BW-LABEL: splatconstant_rotate_mask_v8i32:
1077 ; AVX512BW-NEXT: # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
1078 ; AVX512BW-NEXT: vprold $4, %zmm0, %zmm0
1079 ; AVX512BW-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1080 ; AVX512BW-NEXT: retq
1082 ; AVX512VL-LABEL: splatconstant_rotate_mask_v8i32:
1084 ; AVX512VL-NEXT: vprold $4, %ymm0, %ymm0
1085 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1086 ; AVX512VL-NEXT: retq
1088 ; XOPAVX1-LABEL: splatconstant_rotate_mask_v8i32:
1090 ; XOPAVX1-NEXT: vprotd $4, %xmm0, %xmm1
1091 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1092 ; XOPAVX1-NEXT: vprotd $4, %xmm0, %xmm0
1093 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1094 ; XOPAVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
1095 ; XOPAVX1-NEXT: retq
1097 ; XOPAVX2-LABEL: splatconstant_rotate_mask_v8i32:
1099 ; XOPAVX2-NEXT: vprotd $4, %xmm0, %xmm1
1100 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
1101 ; XOPAVX2-NEXT: vprotd $4, %xmm0, %xmm0
1102 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
1103 ; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1104 ; XOPAVX2-NEXT: retq
1105 %shl = shl <8 x i32> %a, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
1106 %lshr = lshr <8 x i32> %a, <i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28>
1107 %rmask = and <8 x i32> %lshr, <i32 3, i32 7, i32 15, i32 31, i32 63, i32 127, i32 255, i32 511>
1108 %lmask = and <8 x i32> %shl, <i32 511, i32 255, i32 127, i32 63, i32 31, i32 15, i32 7, i32 3>
1109 %or = or <8 x i32> %lmask, %rmask
1113 define <16 x i16> @splatconstant_rotate_mask_v16i16(<16 x i16> %a) nounwind {
1114 ; AVX1-LABEL: splatconstant_rotate_mask_v16i16:
1116 ; AVX1-NEXT: vpsllw $5, %xmm0, %xmm1
1117 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1118 ; AVX1-NEXT: vpsllw $5, %xmm2, %xmm3
1119 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
1120 ; AVX1-NEXT: vpsrlw $11, %xmm0, %xmm0
1121 ; AVX1-NEXT: vpsrlw $11, %xmm2, %xmm2
1122 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1123 ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
1124 ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm1, %ymm1
1125 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
1128 ; AVX2-LABEL: splatconstant_rotate_mask_v16i16:
1130 ; AVX2-NEXT: vpsllw $5, %ymm0, %ymm1
1131 ; AVX2-NEXT: vpsrlw $11, %ymm0, %ymm0
1132 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1133 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1134 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
1137 ; AVX512-LABEL: splatconstant_rotate_mask_v16i16:
1139 ; AVX512-NEXT: vpsllw $5, %ymm0, %ymm1
1140 ; AVX512-NEXT: vpsrlw $11, %ymm0, %ymm0
1141 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1142 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1143 ; AVX512-NEXT: vpor %ymm0, %ymm1, %ymm0
1146 ; XOPAVX1-LABEL: splatconstant_rotate_mask_v16i16:
1148 ; XOPAVX1-NEXT: vprotw $5, %xmm0, %xmm1
1149 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1150 ; XOPAVX1-NEXT: vprotw $5, %xmm0, %xmm0
1151 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1152 ; XOPAVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
1153 ; XOPAVX1-NEXT: retq
1155 ; XOPAVX2-LABEL: splatconstant_rotate_mask_v16i16:
1157 ; XOPAVX2-NEXT: vprotw $5, %xmm0, %xmm1
1158 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
1159 ; XOPAVX2-NEXT: vprotw $5, %xmm0, %xmm0
1160 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
1161 ; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1162 ; XOPAVX2-NEXT: retq
1163 %shl = shl <16 x i16> %a, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
1164 %lshr = lshr <16 x i16> %a, <i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11>
1165 %rmask = and <16 x i16> %lshr, <i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55>
1166 %lmask = and <16 x i16> %shl, <i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33>
1167 %or = or <16 x i16> %lmask, %rmask
1171 define <32 x i8> @splatconstant_rotate_mask_v32i8(<32 x i8> %a) nounwind {
1172 ; AVX1-LABEL: splatconstant_rotate_mask_v32i8:
1174 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1175 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm2
1176 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1177 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
1178 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm4
1179 ; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm3
1180 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
1181 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
1182 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1183 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
1184 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
1185 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
1186 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1187 ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
1188 ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm2, %ymm1
1189 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
1192 ; AVX2-LABEL: splatconstant_rotate_mask_v32i8:
1194 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm1
1195 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1196 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
1197 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1198 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1199 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1200 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
1203 ; AVX512-LABEL: splatconstant_rotate_mask_v32i8:
1205 ; AVX512-NEXT: vpsllw $4, %ymm0, %ymm1
1206 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1207 ; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm0
1208 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1209 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1210 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1211 ; AVX512-NEXT: vpor %ymm0, %ymm1, %ymm0
1214 ; XOPAVX1-LABEL: splatconstant_rotate_mask_v32i8:
1216 ; XOPAVX1-NEXT: vprotb $4, %xmm0, %xmm1
1217 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1218 ; XOPAVX1-NEXT: vprotb $4, %xmm0, %xmm0
1219 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1220 ; XOPAVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
1221 ; XOPAVX1-NEXT: retq
1223 ; XOPAVX2-LABEL: splatconstant_rotate_mask_v32i8:
1225 ; XOPAVX2-NEXT: vprotb $4, %xmm0, %xmm1
1226 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
1227 ; XOPAVX2-NEXT: vprotb $4, %xmm0, %xmm0
1228 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
1229 ; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1230 ; XOPAVX2-NEXT: retq
1231 %shl = shl <32 x i8> %a, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
1232 %lshr = lshr <32 x i8> %a, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
1233 %rmask = and <32 x i8> %lshr, <i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55>
1234 %lmask = and <32 x i8> %shl, <i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33>
1235 %or = or <32 x i8> %lmask, %rmask