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