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