Make utils/update_llc_test_checks.py note that the assertions are
[oota-llvm.git] / test / CodeGen / X86 / vector-rotate-256.ll
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
6
7 ;
8 ; Variable Rotates
9 ;
10
11 define <4 x i64> @var_rotate_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
12 ; AVX1-LABEL: var_rotate_v4i64:
13 ; AVX1:       # BB#0:
14 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [64,64]
15 ; AVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm3
16 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
17 ; AVX1-NEXT:    vpsubq %xmm4, %xmm2, %xmm2
18 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
19 ; AVX1-NEXT:    vpsllq %xmm4, %xmm5, %xmm6
20 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[2,3,0,1]
21 ; AVX1-NEXT:    vpsllq %xmm4, %xmm5, %xmm4
22 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm6[0,1,2,3],xmm4[4,5,6,7]
23 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm6
24 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
25 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm1
26 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm6[0,1,2,3],xmm1[4,5,6,7]
27 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
28 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm5, %xmm4
29 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
30 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm5, %xmm2
31 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
32 ; AVX1-NEXT:    vpsrlq %xmm3, %xmm0, %xmm4
33 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
34 ; AVX1-NEXT:    vpsrlq %xmm3, %xmm0, %xmm0
35 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm4[0,1,2,3],xmm0[4,5,6,7]
36 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
37 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
38 ; AVX1-NEXT:    retq
39 ;
40 ; AVX2-LABEL: var_rotate_v4i64:
41 ; AVX2:       # BB#0:
42 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm2
43 ; AVX2-NEXT:    vpsubq %ymm1, %ymm2, %ymm2
44 ; AVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm1
45 ; AVX2-NEXT:    vpsrlvq %ymm2, %ymm0, %ymm0
46 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
47 ; AVX2-NEXT:    retq
48 ;
49 ; XOPAVX1-LABEL: var_rotate_v4i64:
50 ; XOPAVX1:       # BB#0:
51 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
52 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
53 ; XOPAVX1-NEXT:    vprotq %xmm2, %xmm3, %xmm2
54 ; XOPAVX1-NEXT:    vprotq %xmm1, %xmm0, %xmm0
55 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
56 ; XOPAVX1-NEXT:    retq
57 ;
58 ; XOPAVX2-LABEL: var_rotate_v4i64:
59 ; XOPAVX2:       # BB#0:
60 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
61 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
62 ; XOPAVX2-NEXT:    vprotq %xmm2, %xmm3, %xmm2
63 ; XOPAVX2-NEXT:    vprotq %xmm1, %xmm0, %xmm0
64 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
65 ; XOPAVX2-NEXT:    retq
66   %b64 = sub <4 x i64> <i64 64, i64 64, i64 64, i64 64>, %b
67   %shl = shl <4 x i64> %a, %b
68   %lshr = lshr <4 x i64> %a, %b64
69   %or = or <4 x i64> %shl, %lshr
70   ret <4 x i64> %or
71 }
72
73 define <8 x i32> @var_rotate_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
74 ; AVX1-LABEL: var_rotate_v8i32:
75 ; AVX1:       # BB#0:
76 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [32,32,32,32]
77 ; AVX1-NEXT:    vpsubd %xmm1, %xmm3, %xmm2
78 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
79 ; AVX1-NEXT:    vpsubd %xmm4, %xmm3, %xmm3
80 ; AVX1-NEXT:    vpslld $23, %xmm4, %xmm4
81 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]
82 ; AVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm4
83 ; AVX1-NEXT:    vcvttps2dq %xmm4, %xmm4
84 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
85 ; AVX1-NEXT:    vpmulld %xmm6, %xmm4, %xmm4
86 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
87 ; AVX1-NEXT:    vpaddd %xmm5, %xmm1, %xmm1
88 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
89 ; AVX1-NEXT:    vpmulld %xmm0, %xmm1, %xmm1
90 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
91 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
92 ; AVX1-NEXT:    vpsrld %xmm4, %xmm6, %xmm4
93 ; AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm5
94 ; AVX1-NEXT:    vpsrld %xmm5, %xmm6, %xmm5
95 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
96 ; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
97 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm7 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
98 ; AVX1-NEXT:    vpsrld %xmm7, %xmm6, %xmm7
99 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
100 ; AVX1-NEXT:    vpsrld %xmm3, %xmm6, %xmm3
101 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm7[4,5,6,7]
102 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]
103 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm4 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
104 ; AVX1-NEXT:    vpsrld %xmm4, %xmm0, %xmm4
105 ; AVX1-NEXT:    vpsrlq $32, %xmm2, %xmm6
106 ; AVX1-NEXT:    vpsrld %xmm6, %xmm0, %xmm6
107 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm6[0,1,2,3],xmm4[4,5,6,7]
108 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm5 = xmm2[2],xmm5[2],xmm2[3],xmm5[3]
109 ; AVX1-NEXT:    vpsrld %xmm5, %xmm0, %xmm5
110 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
111 ; AVX1-NEXT:    vpsrld %xmm2, %xmm0, %xmm0
112 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm5[4,5,6,7]
113 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3],xmm0[4,5],xmm4[6,7]
114 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
115 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
116 ; AVX1-NEXT:    retq
117 ;
118 ; AVX2-LABEL: var_rotate_v8i32:
119 ; AVX2:       # BB#0:
120 ; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm2
121 ; AVX2-NEXT:    vpsubd %ymm1, %ymm2, %ymm2
122 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm1
123 ; AVX2-NEXT:    vpsrlvd %ymm2, %ymm0, %ymm0
124 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
125 ; AVX2-NEXT:    retq
126 ;
127 ; XOPAVX1-LABEL: var_rotate_v8i32:
128 ; XOPAVX1:       # BB#0:
129 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
130 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
131 ; XOPAVX1-NEXT:    vprotd %xmm2, %xmm3, %xmm2
132 ; XOPAVX1-NEXT:    vprotd %xmm1, %xmm0, %xmm0
133 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
134 ; XOPAVX1-NEXT:    retq
135 ;
136 ; XOPAVX2-LABEL: var_rotate_v8i32:
137 ; XOPAVX2:       # BB#0:
138 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
139 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
140 ; XOPAVX2-NEXT:    vprotd %xmm2, %xmm3, %xmm2
141 ; XOPAVX2-NEXT:    vprotd %xmm1, %xmm0, %xmm0
142 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
143 ; XOPAVX2-NEXT:    retq
144   %b32 = sub <8 x i32> <i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32>, %b
145   %shl = shl <8 x i32> %a, %b
146   %lshr = lshr <8 x i32> %a, %b32
147   %or = or <8 x i32> %shl, %lshr
148   ret <8 x i32> %or
149 }
150
151 define <16 x i16> @var_rotate_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
152 ; AVX1-LABEL: var_rotate_v16i16:
153 ; AVX1:       # BB#0:
154 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
155 ; AVX1-NEXT:    vpsubw %xmm1, %xmm3, %xmm2
156 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
157 ; AVX1-NEXT:    vpsubw %xmm4, %xmm3, %xmm3
158 ; AVX1-NEXT:    vpsllw $12, %xmm4, %xmm5
159 ; AVX1-NEXT:    vpsllw $4, %xmm4, %xmm4
160 ; AVX1-NEXT:    vpor %xmm5, %xmm4, %xmm5
161 ; AVX1-NEXT:    vpaddw %xmm5, %xmm5, %xmm6
162 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
163 ; AVX1-NEXT:    vpsllw $8, %xmm4, %xmm7
164 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm7, %xmm4, %xmm5
165 ; AVX1-NEXT:    vpsllw $4, %xmm5, %xmm7
166 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm7, %xmm5, %xmm5
167 ; AVX1-NEXT:    vpsllw $2, %xmm5, %xmm7
168 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm6
169 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm7, %xmm5, %xmm5
170 ; AVX1-NEXT:    vpsllw $1, %xmm5, %xmm7
171 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm6
172 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm7, %xmm5, %xmm5
173 ; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm6
174 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
175 ; AVX1-NEXT:    vpor %xmm6, %xmm1, %xmm1
176 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm6
177 ; AVX1-NEXT:    vpsllw $8, %xmm0, %xmm7
178 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm7, %xmm0, %xmm1
179 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm7
180 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm7, %xmm1, %xmm1
181 ; AVX1-NEXT:    vpsllw $2, %xmm1, %xmm7
182 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm6
183 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm7, %xmm1, %xmm1
184 ; AVX1-NEXT:    vpsllw $1, %xmm1, %xmm7
185 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm6
186 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm7, %xmm1, %xmm1
187 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
188 ; AVX1-NEXT:    vpsllw $12, %xmm3, %xmm5
189 ; AVX1-NEXT:    vpsllw $4, %xmm3, %xmm3
190 ; AVX1-NEXT:    vpor %xmm5, %xmm3, %xmm3
191 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm5
192 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm6
193 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm4, %xmm3
194 ; AVX1-NEXT:    vpsrlw $4, %xmm3, %xmm4
195 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm4, %xmm3, %xmm3
196 ; AVX1-NEXT:    vpsrlw $2, %xmm3, %xmm4
197 ; AVX1-NEXT:    vpaddw %xmm5, %xmm5, %xmm5
198 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm4, %xmm3, %xmm3
199 ; AVX1-NEXT:    vpsrlw $1, %xmm3, %xmm4
200 ; AVX1-NEXT:    vpaddw %xmm5, %xmm5, %xmm5
201 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm4, %xmm3, %xmm3
202 ; AVX1-NEXT:    vpsllw $12, %xmm2, %xmm4
203 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
204 ; AVX1-NEXT:    vpor %xmm4, %xmm2, %xmm2
205 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm4
206 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm5
207 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm0, %xmm0
208 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
209 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
210 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm2
211 ; AVX1-NEXT:    vpaddw %xmm4, %xmm4, %xmm4
212 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
213 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm2
214 ; AVX1-NEXT:    vpaddw %xmm4, %xmm4, %xmm4
215 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
216 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
217 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
218 ; AVX1-NEXT:    retq
219 ;
220 ; AVX2-LABEL: var_rotate_v16i16:
221 ; AVX2:       # BB#0:
222 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
223 ; AVX2-NEXT:    vpsubw %ymm1, %ymm2, %ymm2
224 ; AVX2-NEXT:    vpxor %ymm3, %ymm3, %ymm3
225 ; 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]
226 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
227 ; AVX2-NEXT:    vpsllvd %ymm4, %ymm5, %ymm4
228 ; AVX2-NEXT:    vpsrld $16, %ymm4, %ymm4
229 ; 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]
230 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
231 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm1
232 ; AVX2-NEXT:    vpsrld $16, %ymm1, %ymm1
233 ; AVX2-NEXT:    vpackusdw %ymm4, %ymm1, %ymm1
234 ; 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]
235 ; AVX2-NEXT:    vpsrlvd %ymm4, %ymm5, %ymm4
236 ; AVX2-NEXT:    vpsrld $16, %ymm4, %ymm4
237 ; 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]
238 ; AVX2-NEXT:    vpsrlvd %ymm2, %ymm0, %ymm0
239 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
240 ; AVX2-NEXT:    vpackusdw %ymm4, %ymm0, %ymm0
241 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
242 ; AVX2-NEXT:    retq
243 ;
244 ; XOPAVX1-LABEL: var_rotate_v16i16:
245 ; XOPAVX1:       # BB#0:
246 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
247 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
248 ; XOPAVX1-NEXT:    vprotw %xmm2, %xmm3, %xmm2
249 ; XOPAVX1-NEXT:    vprotw %xmm1, %xmm0, %xmm0
250 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
251 ; XOPAVX1-NEXT:    retq
252 ;
253 ; XOPAVX2-LABEL: var_rotate_v16i16:
254 ; XOPAVX2:       # BB#0:
255 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
256 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
257 ; XOPAVX2-NEXT:    vprotw %xmm2, %xmm3, %xmm2
258 ; XOPAVX2-NEXT:    vprotw %xmm1, %xmm0, %xmm0
259 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
260 ; XOPAVX2-NEXT:    retq
261   %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
262   %shl = shl <16 x i16> %a, %b
263   %lshr = lshr <16 x i16> %a, %b16
264   %or = or <16 x i16> %shl, %lshr
265   ret <16 x i16> %or
266 }
267
268 define <32 x i8> @var_rotate_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
269 ; AVX1-LABEL: var_rotate_v32i8:
270 ; AVX1:       # BB#0:
271 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
272 ; AVX1-NEXT:    vpsubb %xmm1, %xmm3, %xmm8
273 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
274 ; AVX1-NEXT:    vpsubb %xmm4, %xmm3, %xmm9
275 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
276 ; AVX1-NEXT:    vpsllw $4, %xmm5, %xmm6
277 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
278 ; AVX1-NEXT:    vpand %xmm7, %xmm6, %xmm6
279 ; AVX1-NEXT:    vpsllw $5, %xmm4, %xmm4
280 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm6, %xmm5, %xmm6
281 ; AVX1-NEXT:    vpsllw $2, %xmm6, %xmm2
282 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
283 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
284 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm4
285 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm6, %xmm2
286 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm6
287 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm4
288 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm6, %xmm2, %xmm2
289 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm4
290 ; AVX1-NEXT:    vpand %xmm7, %xmm4, %xmm4
291 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
292 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm4
293 ; AVX1-NEXT:    vpsllw $2, %xmm4, %xmm6
294 ; AVX1-NEXT:    vpand %xmm3, %xmm6, %xmm3
295 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
296 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm4, %xmm3
297 ; AVX1-NEXT:    vpaddb %xmm3, %xmm3, %xmm4
298 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
299 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm3, %xmm1
300 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
301 ; AVX1-NEXT:    vpsrlw $4, %xmm5, %xmm2
302 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
303 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
304 ; AVX1-NEXT:    vpsllw $5, %xmm9, %xmm4
305 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm5, %xmm2
306 ; AVX1-NEXT:    vpsrlw $2, %xmm2, %xmm5
307 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
308 ; AVX1-NEXT:    vpand %xmm6, %xmm5, %xmm5
309 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm4
310 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm5, %xmm2, %xmm2
311 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm5
312 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
313 ; AVX1-NEXT:    vpand %xmm7, %xmm5, %xmm5
314 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm4
315 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm5, %xmm2, %xmm2
316 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm4
317 ; AVX1-NEXT:    vpand %xmm3, %xmm4, %xmm3
318 ; AVX1-NEXT:    vpsllw $5, %xmm8, %xmm4
319 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
320 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm3
321 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
322 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm4
323 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
324 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm3
325 ; AVX1-NEXT:    vpand %xmm7, %xmm3, %xmm3
326 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm4
327 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
328 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
329 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
330 ; AVX1-NEXT:    retq
331 ;
332 ; AVX2-LABEL: var_rotate_v32i8:
333 ; AVX2:       # BB#0:
334 ; 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]
335 ; AVX2-NEXT:    vpsubb %ymm1, %ymm2, %ymm2
336 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
337 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm3
338 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
339 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm3
340 ; AVX2-NEXT:    vpsllw $2, %ymm3, %ymm4
341 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
342 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
343 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm4, %ymm3, %ymm3
344 ; AVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm4
345 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
346 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm4, %ymm3, %ymm1
347 ; AVX2-NEXT:    vpsllw $5, %ymm2, %ymm2
348 ; AVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm3
349 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm4
350 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
351 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm0, %ymm0
352 ; AVX2-NEXT:    vpsrlw $2, %ymm0, %ymm2
353 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
354 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
355 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm2
356 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
357 ; AVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
358 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
359 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
360 ; AVX2-NEXT:    retq
361 ;
362 ; XOPAVX1-LABEL: var_rotate_v32i8:
363 ; XOPAVX1:       # BB#0:
364 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
365 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
366 ; XOPAVX1-NEXT:    vprotb %xmm2, %xmm3, %xmm2
367 ; XOPAVX1-NEXT:    vprotb %xmm1, %xmm0, %xmm0
368 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
369 ; XOPAVX1-NEXT:    retq
370 ;
371 ; XOPAVX2-LABEL: var_rotate_v32i8:
372 ; XOPAVX2:       # BB#0:
373 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
374 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
375 ; XOPAVX2-NEXT:    vprotb %xmm2, %xmm3, %xmm2
376 ; XOPAVX2-NEXT:    vprotb %xmm1, %xmm0, %xmm0
377 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
378 ; XOPAVX2-NEXT:    retq
379   %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
380   %shl = shl <32 x i8> %a, %b
381   %lshr = lshr <32 x i8> %a, %b8
382   %or = or <32 x i8> %shl, %lshr
383   ret <32 x i8> %or
384 }
385
386 ;
387 ; Constant Rotates
388 ;
389
390 define <4 x i64> @constant_rotate_v4i64(<4 x i64> %a) nounwind {
391 ; AVX1-LABEL: constant_rotate_v4i64:
392 ; AVX1:       # BB#0:
393 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
394 ; AVX1-NEXT:    vpsllq $60, %xmm1, %xmm2
395 ; AVX1-NEXT:    vpsllq $50, %xmm1, %xmm3
396 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
397 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm3
398 ; AVX1-NEXT:    vpsllq $4, %xmm0, %xmm4
399 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
400 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
401 ; AVX1-NEXT:    vpsrlq $2, %xmm1, %xmm3
402 ; AVX1-NEXT:    vpsrlq $14, %xmm1, %xmm1
403 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]
404 ; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm3
405 ; AVX1-NEXT:    vpsrlq $60, %xmm0, %xmm0
406 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
407 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
408 ; AVX1-NEXT:    vorps %ymm0, %ymm2, %ymm0
409 ; AVX1-NEXT:    retq
410 ;
411 ; AVX2-LABEL: constant_rotate_v4i64:
412 ; AVX2:       # BB#0:
413 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm1
414 ; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
415 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
416 ; AVX2-NEXT:    retq
417 ;
418 ; XOPAVX1-LABEL: constant_rotate_v4i64:
419 ; XOPAVX1:       # BB#0:
420 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm1
421 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
422 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm2, %xmm3
423 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
424 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
425 ; XOPAVX1-NEXT:    vpsubq {{.*}}(%rip), %xmm3, %xmm4
426 ; XOPAVX1-NEXT:    vpshlq %xmm4, %xmm2, %xmm2
427 ; XOPAVX1-NEXT:    vpsubq {{.*}}(%rip), %xmm3, %xmm3
428 ; XOPAVX1-NEXT:    vpshlq %xmm3, %xmm0, %xmm0
429 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
430 ; XOPAVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
431 ; XOPAVX1-NEXT:    retq
432 ;
433 ; XOPAVX2-LABEL: constant_rotate_v4i64:
434 ; XOPAVX2:       # BB#0:
435 ; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm1
436 ; XOPAVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
437 ; XOPAVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
438 ; XOPAVX2-NEXT:    retq
439   %shl = shl <4 x i64> %a, <i64 4, i64 14, i64 50, i64 60>
440   %lshr = lshr <4 x i64> %a, <i64 60, i64 50, i64 14, i64 2>
441   %or = or <4 x i64> %shl, %lshr
442   ret <4 x i64> %or
443 }
444
445 define <8 x i32> @constant_rotate_v8i32(<8 x i32> %a) nounwind {
446 ; AVX1-LABEL: constant_rotate_v8i32:
447 ; AVX1:       # BB#0:
448 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm1
449 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
450 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm2, %xmm3
451 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
452 ; AVX1-NEXT:    vpsrld $21, %xmm2, %xmm3
453 ; AVX1-NEXT:    vpsrld $23, %xmm2, %xmm4
454 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
455 ; AVX1-NEXT:    vpsrld $22, %xmm2, %xmm4
456 ; AVX1-NEXT:    vpsrld $24, %xmm2, %xmm2
457 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm4[4,5,6,7]
458 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
459 ; AVX1-NEXT:    vpsrld $25, %xmm0, %xmm3
460 ; AVX1-NEXT:    vpsrld $27, %xmm0, %xmm4
461 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
462 ; AVX1-NEXT:    vpsrld $26, %xmm0, %xmm4
463 ; AVX1-NEXT:    vpsrld $28, %xmm0, %xmm0
464 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
465 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
466 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
467 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
468 ; AVX1-NEXT:    retq
469 ;
470 ; AVX2-LABEL: constant_rotate_v8i32:
471 ; AVX2:       # BB#0:
472 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm1
473 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm0, %ymm0
474 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
475 ; AVX2-NEXT:    retq
476 ;
477 ; XOPAVX1-LABEL: constant_rotate_v8i32:
478 ; XOPAVX1:       # BB#0:
479 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm1
480 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
481 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm2, %xmm3
482 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
483 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
484 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm2, %xmm2
485 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
486 ; XOPAVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
487 ; XOPAVX1-NEXT:    retq
488 ;
489 ; XOPAVX2-LABEL: constant_rotate_v8i32:
490 ; XOPAVX2:       # BB#0:
491 ; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm1
492 ; XOPAVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm0, %ymm0
493 ; XOPAVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
494 ; XOPAVX2-NEXT:    retq
495   %shl = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>
496   %lshr = lshr <8 x i32> %a, <i32 28, i32 27, i32 26, i32 25, i32 24, i32 23, i32 22, i32 21>
497   %or = or <8 x i32> %shl, %lshr
498   ret <8 x i32> %or
499 }
500
501 define <16 x i16> @constant_rotate_v8i16(<16 x i16> %a) nounwind {
502 ; AVX1-LABEL: constant_rotate_v8i16:
503 ; AVX1:       # BB#0:
504 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm1
505 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
506 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm2, %xmm3
507 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
508 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm3
509 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [32896,28784,24672,20560,16448,12336,8224,4112]
510 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm2, %xmm2
511 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm3
512 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [256,57568,49344,41120,32896,24672,16448,8224]
513 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm2, %xmm2
514 ; AVX1-NEXT:    vpsrlw $2, %xmm2, %xmm3
515 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [512,49600,33152,16704,256,49344,32896,16448]
516 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm2, %xmm2
517 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm3
518 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [1024,33664,768,33408,512,33152,256,32896]
519 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm2, %xmm2
520 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm3
521 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [256,61680,57568,53456,49344,45232,41120,37008]
522 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
523 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3
524 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [512,57824,49600,41376,33152,24928,16704,8480]
525 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
526 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm3
527 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [1024,50112,33664,17216,768,49856,33408,16960]
528 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
529 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm3
530 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [2048,34688,1792,34432,1536,34176,1280,33920]
531 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
532 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
533 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
534 ; AVX1-NEXT:    retq
535 ;
536 ; AVX2-LABEL: constant_rotate_v8i16:
537 ; AVX2:       # BB#0:
538 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm1
539 ; AVX2-NEXT:    vpxor %ymm2, %ymm2, %ymm2
540 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
541 ; 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]
542 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
543 ; AVX2-NEXT:    vpsrlvd %ymm4, %ymm5, %ymm4
544 ; AVX2-NEXT:    vpsrld $16, %ymm4, %ymm4
545 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm2 = 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]
546 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
547 ; AVX2-NEXT:    vpsrlvd %ymm2, %ymm0, %ymm0
548 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
549 ; AVX2-NEXT:    vpackusdw %ymm4, %ymm0, %ymm0
550 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
551 ; AVX2-NEXT:    retq
552 ;
553 ; XOPAVX1-LABEL: constant_rotate_v8i16:
554 ; XOPAVX1:       # BB#0:
555 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm1
556 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
557 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm2, %xmm3
558 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
559 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
560 ; XOPAVX1-NEXT:    vpsubw {{.*}}(%rip), %xmm3, %xmm4
561 ; XOPAVX1-NEXT:    vpshlw %xmm4, %xmm2, %xmm2
562 ; XOPAVX1-NEXT:    vpsubw {{.*}}(%rip), %xmm3, %xmm3
563 ; XOPAVX1-NEXT:    vpshlw %xmm3, %xmm0, %xmm0
564 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
565 ; XOPAVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
566 ; XOPAVX1-NEXT:    retq
567 ;
568 ; XOPAVX2-LABEL: constant_rotate_v8i16:
569 ; XOPAVX2:       # BB#0:
570 ; XOPAVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm1
571 ; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
572 ; XOPAVX2-NEXT:    vpsubw {{.*}}(%rip), %xmm2, %xmm3
573 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
574 ; XOPAVX2-NEXT:    vpshlw %xmm3, %xmm4, %xmm3
575 ; XOPAVX2-NEXT:    vpsubw {{.*}}(%rip), %xmm2, %xmm2
576 ; XOPAVX2-NEXT:    vpshlw %xmm2, %xmm0, %xmm0
577 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm3, %ymm0, %ymm0
578 ; XOPAVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
579 ; XOPAVX2-NEXT:    retq
580   %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>
581   %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>
582   %or = or <16 x i16> %shl, %lshr
583   ret <16 x i16> %or
584 }
585
586 define <32 x i8> @constant_rotate_v32i8(<32 x i8> %a) nounwind {
587 ; AVX1-LABEL: constant_rotate_v32i8:
588 ; AVX1:       # BB#0:
589 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
590 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm2
591 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
592 ; AVX1-NEXT:    vpand %xmm8, %xmm2, %xmm2
593 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
594 ; AVX1-NEXT:    vpsllw $5, %xmm4, %xmm4
595 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm1, %xmm2
596 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm5
597 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
598 ; AVX1-NEXT:    vpand %xmm6, %xmm5, %xmm5
599 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm7
600 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm5, %xmm2, %xmm2
601 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm5
602 ; AVX1-NEXT:    vpaddb %xmm7, %xmm7, %xmm3
603 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm2, %xmm2
604 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm5
605 ; AVX1-NEXT:    vpand %xmm8, %xmm5, %xmm5
606 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm5, %xmm0, %xmm4
607 ; AVX1-NEXT:    vpsllw $2, %xmm4, %xmm5
608 ; AVX1-NEXT:    vpand %xmm6, %xmm5, %xmm5
609 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm5, %xmm4, %xmm4
610 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm5
611 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm3
612 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm9
613 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm3
614 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
615 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
616 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
617 ; AVX1-NEXT:    vpsllw $5, %xmm5, %xmm5
618 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm1, %xmm1
619 ; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm3
620 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
621 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
622 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm7
623 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm3, %xmm1, %xmm1
624 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm3
625 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
626 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
627 ; AVX1-NEXT:    vpaddb %xmm7, %xmm7, %xmm2
628 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm3, %xmm1, %xmm1
629 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3
630 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
631 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm0, %xmm0
632 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm3
633 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
634 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm3, %xmm0, %xmm0
635 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm3
636 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
637 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm3, %xmm0, %xmm0
638 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
639 ; AVX1-NEXT:    vorps %ymm0, %ymm9, %ymm0
640 ; AVX1-NEXT:    retq
641 ;
642 ; AVX2-LABEL: constant_rotate_v32i8:
643 ; AVX2:       # BB#0:
644 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
645 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
646 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
647 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
648 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm2
649 ; AVX2-NEXT:    vpsllw $2, %ymm2, %ymm3
650 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
651 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
652 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm2, %ymm2
653 ; AVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm3
654 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
655 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm2, %ymm1
656 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
657 ; AVX2-NEXT:    vpsllw $5, %ymm2, %ymm2
658 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm3
659 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
660 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm3, %ymm0, %ymm0
661 ; AVX2-NEXT:    vpsrlw $2, %ymm0, %ymm3
662 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
663 ; AVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
664 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm3, %ymm0, %ymm0
665 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm3
666 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
667 ; AVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
668 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm3, %ymm0, %ymm0
669 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
670 ; AVX2-NEXT:    retq
671 ;
672 ; XOPAVX1-LABEL: constant_rotate_v32i8:
673 ; XOPAVX1:       # BB#0:
674 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
675 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
676 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm2, %xmm3
677 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm1
678 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
679 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
680 ; XOPAVX1-NEXT:    vpsubb {{.*}}(%rip), %xmm3, %xmm3
681 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
682 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm0, %xmm0
683 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
684 ; XOPAVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
685 ; XOPAVX1-NEXT:    retq
686 ;
687 ; XOPAVX2-LABEL: constant_rotate_v32i8:
688 ; XOPAVX2:       # BB#0:
689 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
690 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
691 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm2, %xmm3
692 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm1
693 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm3, %ymm1, %ymm1
694 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
695 ; XOPAVX2-NEXT:    vpsubb {{.*}}(%rip), %xmm3, %xmm3
696 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
697 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm0, %xmm0
698 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
699 ; XOPAVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
700 ; XOPAVX2-NEXT:    retq
701   %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>
702   %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>
703   %or = or <32 x i8> %shl, %lshr
704   ret <32 x i8> %or
705 }
706
707 ;
708 ; Uniform Constant Rotates
709 ;
710
711 define <4 x i64> @splatconstant_rotate_v4i64(<4 x i64> %a) nounwind {
712 ; AVX1-LABEL: splatconstant_rotate_v4i64:
713 ; AVX1:       # BB#0:
714 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm1
715 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
716 ; AVX1-NEXT:    vpsllq $14, %xmm2, %xmm3
717 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
718 ; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm0
719 ; AVX1-NEXT:    vpsrlq $50, %xmm2, %xmm2
720 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
721 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
722 ; AVX1-NEXT:    retq
723 ;
724 ; AVX2-LABEL: splatconstant_rotate_v4i64:
725 ; AVX2:       # BB#0:
726 ; AVX2-NEXT:    vpsllq $14, %ymm0, %ymm1
727 ; AVX2-NEXT:    vpsrlq $50, %ymm0, %ymm0
728 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
729 ; AVX2-NEXT:    retq
730 ;
731 ; XOPAVX1-LABEL: splatconstant_rotate_v4i64:
732 ; XOPAVX1:       # BB#0:
733 ; XOPAVX1-NEXT:    vprotq $14, %xmm0, %xmm1
734 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
735 ; XOPAVX1-NEXT:    vprotq $14, %xmm0, %xmm0
736 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
737 ; XOPAVX1-NEXT:    retq
738 ;
739 ; XOPAVX2-LABEL: splatconstant_rotate_v4i64:
740 ; XOPAVX2:       # BB#0:
741 ; XOPAVX2-NEXT:    vprotq $14, %xmm0, %xmm1
742 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
743 ; XOPAVX2-NEXT:    vprotq $14, %xmm0, %xmm0
744 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
745 ; XOPAVX2-NEXT:    retq
746   %shl = shl <4 x i64> %a, <i64 14, i64 14, i64 14, i64 14>
747   %lshr = lshr <4 x i64> %a, <i64 50, i64 50, i64 50, i64 50>
748   %or = or <4 x i64> %shl, %lshr
749   ret <4 x i64> %or
750 }
751
752 define <8 x i32> @splatconstant_rotate_v8i32(<8 x i32> %a) nounwind {
753 ; AVX1-LABEL: splatconstant_rotate_v8i32:
754 ; AVX1:       # BB#0:
755 ; AVX1-NEXT:    vpslld $4, %xmm0, %xmm1
756 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
757 ; AVX1-NEXT:    vpslld $4, %xmm2, %xmm3
758 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
759 ; AVX1-NEXT:    vpsrld $28, %xmm0, %xmm0
760 ; AVX1-NEXT:    vpsrld $28, %xmm2, %xmm2
761 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
762 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
763 ; AVX1-NEXT:    retq
764 ;
765 ; AVX2-LABEL: splatconstant_rotate_v8i32:
766 ; AVX2:       # BB#0:
767 ; AVX2-NEXT:    vpslld $4, %ymm0, %ymm1
768 ; AVX2-NEXT:    vpsrld $28, %ymm0, %ymm0
769 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
770 ; AVX2-NEXT:    retq
771 ;
772 ; XOPAVX1-LABEL: splatconstant_rotate_v8i32:
773 ; XOPAVX1:       # BB#0:
774 ; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm1
775 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
776 ; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm0
777 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
778 ; XOPAVX1-NEXT:    retq
779 ;
780 ; XOPAVX2-LABEL: splatconstant_rotate_v8i32:
781 ; XOPAVX2:       # BB#0:
782 ; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm1
783 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
784 ; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm0
785 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
786 ; XOPAVX2-NEXT:    retq
787   %shl = shl <8 x i32> %a, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
788   %lshr = lshr <8 x i32> %a, <i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28>
789   %or = or <8 x i32> %shl, %lshr
790   ret <8 x i32> %or
791 }
792
793 define <16 x i16> @splatconstant_rotate_v16i16(<16 x i16> %a) nounwind {
794 ; AVX1-LABEL: splatconstant_rotate_v16i16:
795 ; AVX1:       # BB#0:
796 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm1
797 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
798 ; AVX1-NEXT:    vpsllw $7, %xmm2, %xmm3
799 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
800 ; AVX1-NEXT:    vpsrlw $9, %xmm0, %xmm0
801 ; AVX1-NEXT:    vpsrlw $9, %xmm2, %xmm2
802 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
803 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
804 ; AVX1-NEXT:    retq
805 ;
806 ; AVX2-LABEL: splatconstant_rotate_v16i16:
807 ; AVX2:       # BB#0:
808 ; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm1
809 ; AVX2-NEXT:    vpsrlw $9, %ymm0, %ymm0
810 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
811 ; AVX2-NEXT:    retq
812 ;
813 ; XOPAVX1-LABEL: splatconstant_rotate_v16i16:
814 ; XOPAVX1:       # BB#0:
815 ; XOPAVX1-NEXT:    vprotw $7, %xmm0, %xmm1
816 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
817 ; XOPAVX1-NEXT:    vprotw $7, %xmm0, %xmm0
818 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
819 ; XOPAVX1-NEXT:    retq
820 ;
821 ; XOPAVX2-LABEL: splatconstant_rotate_v16i16:
822 ; XOPAVX2:       # BB#0:
823 ; XOPAVX2-NEXT:    vprotw $7, %xmm0, %xmm1
824 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
825 ; XOPAVX2-NEXT:    vprotw $7, %xmm0, %xmm0
826 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
827 ; XOPAVX2-NEXT:    retq
828   %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>
829   %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>
830   %or = or <16 x i16> %shl, %lshr
831   ret <16 x i16> %or
832 }
833
834 define <32 x i8> @splatconstant_rotate_v32i8(<32 x i8> %a) nounwind {
835 ; AVX1-LABEL: splatconstant_rotate_v32i8:
836 ; AVX1:       # BB#0:
837 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
838 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm2
839 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
840 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
841 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm4
842 ; AVX1-NEXT:    vpand %xmm3, %xmm4, %xmm3
843 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
844 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
845 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
846 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
847 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
848 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
849 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
850 ; AVX1-NEXT:    vorps %ymm0, %ymm2, %ymm0
851 ; AVX1-NEXT:    retq
852 ;
853 ; AVX2-LABEL: splatconstant_rotate_v32i8:
854 ; AVX2:       # BB#0:
855 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm1
856 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
857 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
858 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
859 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
860 ; AVX2-NEXT:    retq
861 ;
862 ; XOPAVX1-LABEL: splatconstant_rotate_v32i8:
863 ; XOPAVX1:       # BB#0:
864 ; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm1
865 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
866 ; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm0
867 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
868 ; XOPAVX1-NEXT:    retq
869 ;
870 ; XOPAVX2-LABEL: splatconstant_rotate_v32i8:
871 ; XOPAVX2:       # BB#0:
872 ; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm1
873 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
874 ; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm0
875 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
876 ; XOPAVX2-NEXT:    retq
877   %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>
878   %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>
879   %or = or <32 x i8> %shl, %lshr
880   ret <32 x i8> %or
881 }
882
883 ;
884 ; Masked Uniform Constant Rotates
885 ;
886
887 define <4 x i64> @splatconstant_rotate_mask_v4i64(<4 x i64> %a) nounwind {
888 ; AVX1-LABEL: splatconstant_rotate_mask_v4i64:
889 ; AVX1:       # BB#0:
890 ; AVX1-NEXT:    vpsllq $15, %xmm0, %xmm1
891 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
892 ; AVX1-NEXT:    vpsllq $15, %xmm2, %xmm3
893 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
894 ; AVX1-NEXT:    vpsrlq $49, %xmm0, %xmm0
895 ; AVX1-NEXT:    vpsrlq $49, %xmm2, %xmm2
896 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
897 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
898 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
899 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
900 ; AVX1-NEXT:    retq
901 ;
902 ; AVX2-LABEL: splatconstant_rotate_mask_v4i64:
903 ; AVX2:       # BB#0:
904 ; AVX2-NEXT:    vpsllq $15, %ymm0, %ymm1
905 ; AVX2-NEXT:    vpsrlq $49, %ymm0, %ymm0
906 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
907 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
908 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
909 ; AVX2-NEXT:    retq
910 ;
911 ; XOPAVX1-LABEL: splatconstant_rotate_mask_v4i64:
912 ; XOPAVX1:       # BB#0:
913 ; XOPAVX1-NEXT:    vprotq $15, %xmm0, %xmm1
914 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
915 ; XOPAVX1-NEXT:    vprotq $15, %xmm0, %xmm0
916 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
917 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
918 ; XOPAVX1-NEXT:    retq
919 ;
920 ; XOPAVX2-LABEL: splatconstant_rotate_mask_v4i64:
921 ; XOPAVX2:       # BB#0:
922 ; XOPAVX2-NEXT:    vprotq $15, %xmm0, %xmm1
923 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
924 ; XOPAVX2-NEXT:    vprotq $15, %xmm0, %xmm0
925 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
926 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
927 ; XOPAVX2-NEXT:    retq
928   %shl = shl <4 x i64> %a, <i64 15, i64 15, i64 15, i64 15>
929   %lshr = lshr <4 x i64> %a, <i64 49, i64 49, i64 49, i64 49>
930   %rmask = and <4 x i64> %lshr, <i64 255, i64 127, i64 127, i64 255>
931   %lmask = and <4 x i64> %shl, <i64 33, i64 65, i64 129, i64 257>
932   %or = or <4 x i64> %lmask, %rmask
933   ret <4 x i64> %or
934 }
935
936 define <8 x i32> @splatconstant_rotate_mask_v8i32(<8 x i32> %a) nounwind {
937 ; AVX1-LABEL: splatconstant_rotate_mask_v8i32:
938 ; AVX1:       # BB#0:
939 ; AVX1-NEXT:    vpslld $4, %xmm0, %xmm1
940 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
941 ; AVX1-NEXT:    vpslld $4, %xmm2, %xmm3
942 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
943 ; AVX1-NEXT:    vpsrld $28, %xmm0, %xmm0
944 ; AVX1-NEXT:    vpsrld $28, %xmm2, %xmm2
945 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
946 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
947 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
948 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
949 ; AVX1-NEXT:    retq
950 ;
951 ; AVX2-LABEL: splatconstant_rotate_mask_v8i32:
952 ; AVX2:       # BB#0:
953 ; AVX2-NEXT:    vpslld $4, %ymm0, %ymm1
954 ; AVX2-NEXT:    vpsrld $28, %ymm0, %ymm0
955 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
956 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
957 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
958 ; AVX2-NEXT:    retq
959 ;
960 ; XOPAVX1-LABEL: splatconstant_rotate_mask_v8i32:
961 ; XOPAVX1:       # BB#0:
962 ; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm1
963 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
964 ; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm0
965 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
966 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
967 ; XOPAVX1-NEXT:    retq
968 ;
969 ; XOPAVX2-LABEL: splatconstant_rotate_mask_v8i32:
970 ; XOPAVX2:       # BB#0:
971 ; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm1
972 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
973 ; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm0
974 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
975 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
976 ; XOPAVX2-NEXT:    retq
977   %shl = shl <8 x i32> %a, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
978   %lshr = lshr <8 x i32> %a, <i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28>
979   %rmask = and <8 x i32> %lshr, <i32 3, i32 7, i32 15, i32 31, i32 63, i32 127, i32 255, i32 511>
980   %lmask = and <8 x i32> %shl, <i32 511, i32 255, i32 127, i32 63, i32 31, i32 15, i32 7, i32 3>
981   %or = or <8 x i32> %lmask, %rmask
982   ret <8 x i32> %or
983 }
984
985 define <16 x i16> @splatconstant_rotate_mask_v16i16(<16 x i16> %a) nounwind {
986 ; AVX1-LABEL: splatconstant_rotate_mask_v16i16:
987 ; AVX1:       # BB#0:
988 ; AVX1-NEXT:    vpsllw $5, %xmm0, %xmm1
989 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
990 ; AVX1-NEXT:    vpsllw $5, %xmm2, %xmm3
991 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
992 ; AVX1-NEXT:    vpsrlw $11, %xmm0, %xmm0
993 ; AVX1-NEXT:    vpsrlw $11, %xmm2, %xmm2
994 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
995 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
996 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
997 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
998 ; AVX1-NEXT:    retq
999 ;
1000 ; AVX2-LABEL: splatconstant_rotate_mask_v16i16:
1001 ; AVX2:       # BB#0:
1002 ; AVX2-NEXT:    vpsllw $5, %ymm0, %ymm1
1003 ; AVX2-NEXT:    vpsrlw $11, %ymm0, %ymm0
1004 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1005 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
1006 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
1007 ; AVX2-NEXT:    retq
1008 ;
1009 ; XOPAVX1-LABEL: splatconstant_rotate_mask_v16i16:
1010 ; XOPAVX1:       # BB#0:
1011 ; XOPAVX1-NEXT:    vprotw $5, %xmm0, %xmm1
1012 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1013 ; XOPAVX1-NEXT:    vprotw $5, %xmm0, %xmm0
1014 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1015 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1016 ; XOPAVX1-NEXT:    retq
1017 ;
1018 ; XOPAVX2-LABEL: splatconstant_rotate_mask_v16i16:
1019 ; XOPAVX2:       # BB#0:
1020 ; XOPAVX2-NEXT:    vprotw $5, %xmm0, %xmm1
1021 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1022 ; XOPAVX2-NEXT:    vprotw $5, %xmm0, %xmm0
1023 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1024 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1025 ; XOPAVX2-NEXT:    retq
1026   %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>
1027   %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>
1028   %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>
1029   %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>
1030   %or = or <16 x i16> %lmask, %rmask
1031   ret <16 x i16> %or
1032 }
1033
1034 define <32 x i8> @splatconstant_rotate_mask_v32i8(<32 x i8> %a) nounwind {
1035 ; AVX1-LABEL: splatconstant_rotate_mask_v32i8:
1036 ; AVX1:       # BB#0:
1037 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1038 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm2
1039 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1040 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1041 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm4
1042 ; AVX1-NEXT:    vpand %xmm3, %xmm4, %xmm3
1043 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1044 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
1045 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1046 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
1047 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
1048 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1049 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1050 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1051 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm1
1052 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
1053 ; AVX1-NEXT:    retq
1054 ;
1055 ; AVX2-LABEL: splatconstant_rotate_mask_v32i8:
1056 ; AVX2:       # BB#0:
1057 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm1
1058 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
1059 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1060 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1061 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1062 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
1063 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
1064 ; AVX2-NEXT:    retq
1065 ;
1066 ; XOPAVX1-LABEL: splatconstant_rotate_mask_v32i8:
1067 ; XOPAVX1:       # BB#0:
1068 ; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm1
1069 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1070 ; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm0
1071 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1072 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1073 ; XOPAVX1-NEXT:    retq
1074 ;
1075 ; XOPAVX2-LABEL: splatconstant_rotate_mask_v32i8:
1076 ; XOPAVX2:       # BB#0:
1077 ; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm1
1078 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1079 ; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm0
1080 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1081 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1082 ; XOPAVX2-NEXT:    retq
1083   %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>
1084   %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>
1085   %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>
1086   %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>
1087   %or = or <32 x i8> %lmask, %rmask
1088   ret <32 x i8> %or
1089 }