xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/vector-rotate-128.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=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
4*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
5*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
6*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
7*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
8*9880d681SAndroid Build Coastguard Worker;
9*9880d681SAndroid Build Coastguard Worker; Just one 32-bit run to make sure we do reasonable things for i64 rotates.
10*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=X32-SSE --check-prefix=X32-SSE2
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker;
13*9880d681SAndroid Build Coastguard Worker; Variable Rotates
14*9880d681SAndroid Build Coastguard Worker;
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @var_rotate_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
17*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: var_rotate_v2i64:
18*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
19*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [64,64]
20*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psubq %xmm1, %xmm2
21*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
22*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm4
23*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllq %xmm3, %xmm4
24*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm3
25*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllq %xmm1, %xmm3
26*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm4 = xmm3[0],xmm4[1]
27*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,0,1]
28*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm1
29*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlq %xmm3, %xmm1
30*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlq %xmm2, %xmm0
31*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
32*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    orpd %xmm4, %xmm1
33*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm1, %xmm0
34*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
35*9880d681SAndroid Build Coastguard Worker;
36*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: var_rotate_v2i64:
37*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
38*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [64,64]
39*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psubq %xmm1, %xmm2
40*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm3
41*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllq %xmm1, %xmm3
42*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
43*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm4
44*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllq %xmm1, %xmm4
45*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm3[0,1,2,3],xmm4[4,5,6,7]
46*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm1
47*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlq %xmm2, %xmm1
48*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
49*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlq %xmm2, %xmm0
50*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
51*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm4, %xmm0
52*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
53*9880d681SAndroid Build Coastguard Worker;
54*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: var_rotate_v2i64:
55*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
56*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [64,64]
57*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm2
58*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm3
59*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
60*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm1
61*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm3[0,1,2,3],xmm1[4,5,6,7]
62*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlq %xmm2, %xmm0, %xmm3
63*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
64*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlq %xmm2, %xmm0, %xmm0
65*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
66*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
67*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
68*9880d681SAndroid Build Coastguard Worker;
69*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: var_rotate_v2i64:
70*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
71*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [64,64]
72*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsubq %xmm1, %xmm2, %xmm2
73*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsllvq %xmm1, %xmm0, %xmm1
74*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsrlvq %xmm2, %xmm0, %xmm0
75*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
76*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
77*9880d681SAndroid Build Coastguard Worker;
78*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: var_rotate_v2i64:
79*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
80*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vprotq %xmm1, %xmm0, %xmm0
81*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
82*9880d681SAndroid Build Coastguard Worker;
83*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: var_rotate_v2i64:
84*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
85*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [64,0,64,0]
86*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psubq %xmm1, %xmm2
87*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
88*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
89*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllq %xmm3, %xmm4
90*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movq {{.*#+}} xmm1 = xmm1[0],zero
91*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
92*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllq %xmm1, %xmm3
93*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movsd {{.*#+}} xmm4 = xmm3[0],xmm4[1]
94*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,0,1]
95*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
96*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlq %xmm3, %xmm1
97*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movq {{.*#+}} xmm2 = xmm2[0],zero
98*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlq %xmm2, %xmm0
99*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
100*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    orpd %xmm4, %xmm1
101*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movapd %xmm1, %xmm0
102*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
103*9880d681SAndroid Build Coastguard Worker  %b64 = sub <2 x i64> <i64 64, i64 64>, %b
104*9880d681SAndroid Build Coastguard Worker  %shl = shl <2 x i64> %a, %b
105*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <2 x i64> %a, %b64
106*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %shl, %lshr
107*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @var_rotate_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
111*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: var_rotate_v4i32:
112*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
113*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32,32,32,32]
114*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psubd %xmm1, %xmm2
115*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pslld $23, %xmm1
116*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddd {{.*}}(%rip), %xmm1
117*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    cvttps2dq %xmm1, %xmm1
118*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
119*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pmuludq %xmm0, %xmm1
120*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
121*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
122*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pmuludq %xmm3, %xmm4
123*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3]
124*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
125*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm2, %xmm3
126*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
127*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm4
128*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrld %xmm3, %xmm4
129*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm2, %xmm3
130*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlq $32, %xmm3
131*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm5
132*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrld %xmm3, %xmm5
133*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm4 = xmm5[0],xmm4[1]
134*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,3,2,3]
135*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm4, %xmm4
136*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm2, %xmm5
137*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckhdq {{.*#+}} xmm5 = xmm5[2],xmm4[2],xmm5[3],xmm4[3]
138*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm6
139*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrld %xmm5, %xmm6
140*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
141*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrld %xmm2, %xmm0
142*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm6 = xmm0[0],xmm6[1]
143*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
144*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
145*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm1, %xmm0
146*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
147*9880d681SAndroid Build Coastguard Worker;
148*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: var_rotate_v4i32:
149*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
150*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [32,32,32,32]
151*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psubd %xmm1, %xmm2
152*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pslld $23, %xmm1
153*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddd {{.*}}(%rip), %xmm1
154*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    cvttps2dq %xmm1, %xmm1
155*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pmulld %xmm0, %xmm1
156*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm3
157*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
158*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm4
159*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrld %xmm3, %xmm4
160*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm3
161*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlq $32, %xmm3
162*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm5
163*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrld %xmm3, %xmm5
164*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm4[4,5,6,7]
165*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm3, %xmm3
166*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero
167*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm3[2],xmm2[3],xmm3[3]
168*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm3
169*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrld %xmm2, %xmm3
170*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrld %xmm4, %xmm0
171*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
172*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm5[2,3],xmm0[4,5],xmm5[6,7]
173*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm1, %xmm0
174*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
175*9880d681SAndroid Build Coastguard Worker;
176*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: var_rotate_v4i32:
177*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
178*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [32,32,32,32]
179*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm2
180*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
181*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpaddd {{.*}}(%rip), %xmm1, %xmm1
182*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
183*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpmulld %xmm0, %xmm1, %xmm1
184*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
185*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrld %xmm3, %xmm0, %xmm3
186*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlq $32, %xmm2, %xmm4
187*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrld %xmm4, %xmm0, %xmm4
188*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
189*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
190*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm4 = xmm2[2],xmm4[2],xmm2[3],xmm4[3]
191*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrld %xmm4, %xmm0, %xmm4
192*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
193*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrld %xmm2, %xmm0, %xmm0
194*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
195*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
196*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
197*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
198*9880d681SAndroid Build Coastguard Worker;
199*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: var_rotate_v4i32:
200*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
201*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm2
202*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsubd %xmm1, %xmm2, %xmm2
203*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsllvd %xmm1, %xmm0, %xmm1
204*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsrlvd %xmm2, %xmm0, %xmm0
205*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
206*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
207*9880d681SAndroid Build Coastguard Worker;
208*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: var_rotate_v4i32:
209*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
210*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vprotd %xmm1, %xmm0, %xmm0
211*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
212*9880d681SAndroid Build Coastguard Worker;
213*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: var_rotate_v4i32:
214*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
215*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [32,32,32,32]
216*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psubd %xmm1, %xmm2
217*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pslld $23, %xmm1
218*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddd {{\.LCPI.*}}, %xmm1
219*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    cvttps2dq %xmm1, %xmm1
220*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
221*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pmuludq %xmm0, %xmm1
222*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
223*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
224*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pmuludq %xmm3, %xmm4
225*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3]
226*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
227*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
228*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
229*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
230*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrld %xmm3, %xmm4
231*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
232*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlq $32, %xmm3
233*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm5
234*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrld %xmm3, %xmm5
235*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movsd {{.*#+}} xmm4 = xmm5[0],xmm4[1]
236*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,3,2,3]
237*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm4, %xmm4
238*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm2, %xmm5
239*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    punpckhdq {{.*#+}} xmm5 = xmm5[2],xmm4[2],xmm5[3],xmm4[3]
240*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm6
241*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrld %xmm5, %xmm6
242*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
243*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrld %xmm2, %xmm0
244*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movsd {{.*#+}} xmm6 = xmm0[0],xmm6[1]
245*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
246*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
247*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm1, %xmm0
248*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
249*9880d681SAndroid Build Coastguard Worker  %b32 = sub <4 x i32> <i32 32, i32 32, i32 32, i32 32>, %b
250*9880d681SAndroid Build Coastguard Worker  %shl = shl <4 x i32> %a, %b
251*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <4 x i32> %a, %b32
252*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shl, %lshr
253*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
254*9880d681SAndroid Build Coastguard Worker}
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @var_rotate_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
257*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: var_rotate_v8i16:
258*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
259*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
260*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psubw %xmm1, %xmm3
261*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $12, %xmm1
262*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm1, %xmm2
263*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psraw $15, %xmm2
264*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm4
265*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $8, %xmm4
266*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm2, %xmm4
267*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm2
268*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm4, %xmm2
269*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddw %xmm1, %xmm1
270*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm1, %xmm4
271*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psraw $15, %xmm4
272*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm4, %xmm5
273*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm2, %xmm5
274*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $4, %xmm2
275*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm4, %xmm2
276*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm5, %xmm2
277*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddw %xmm1, %xmm1
278*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm1, %xmm4
279*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psraw $15, %xmm4
280*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm4, %xmm5
281*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm2, %xmm5
282*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $2, %xmm2
283*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm4, %xmm2
284*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm5, %xmm2
285*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddw %xmm1, %xmm1
286*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psraw $15, %xmm1
287*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm1, %xmm4
288*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm2, %xmm4
289*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $1, %xmm2
290*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm2
291*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $12, %xmm3
292*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm3, %xmm1
293*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psraw $15, %xmm1
294*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm1, %xmm5
295*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm5
296*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $8, %xmm0
297*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm0
298*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm5, %xmm0
299*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddw %xmm3, %xmm3
300*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm3, %xmm1
301*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psraw $15, %xmm1
302*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm1, %xmm5
303*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm5
304*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $4, %xmm0
305*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm0
306*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm5, %xmm0
307*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddw %xmm3, %xmm3
308*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm3, %xmm1
309*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psraw $15, %xmm1
310*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm1, %xmm5
311*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm5
312*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $2, %xmm0
313*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm0
314*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm5, %xmm0
315*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddw %xmm3, %xmm3
316*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psraw $15, %xmm3
317*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm3, %xmm1
318*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm1
319*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $1, %xmm0
320*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm3, %xmm0
321*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm1, %xmm0
322*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm4, %xmm0
323*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm2, %xmm0
324*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
325*9880d681SAndroid Build Coastguard Worker;
326*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: var_rotate_v8i16:
327*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
328*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm3
329*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16]
330*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psubw %xmm1, %xmm2
331*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm0
332*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $12, %xmm0
333*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $4, %xmm1
334*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm0, %xmm1
335*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm4
336*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddw %xmm4, %xmm4
337*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm6
338*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $8, %xmm6
339*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm5
340*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm0
341*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm6, %xmm5
342*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm5, %xmm1
343*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $4, %xmm1
344*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm4, %xmm0
345*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm1, %xmm5
346*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm5, %xmm1
347*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $2, %xmm1
348*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddw %xmm4, %xmm4
349*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm4, %xmm0
350*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm1, %xmm5
351*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm5, %xmm1
352*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $1, %xmm1
353*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddw %xmm4, %xmm4
354*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm4, %xmm0
355*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm1, %xmm5
356*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm0
357*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $12, %xmm0
358*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $4, %xmm2
359*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm0, %xmm2
360*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm1
361*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddw %xmm1, %xmm1
362*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm4
363*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $8, %xmm4
364*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm0
365*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm4, %xmm3
366*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm2
367*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $4, %xmm2
368*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm0
369*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm2, %xmm3
370*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm2
371*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $2, %xmm2
372*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddw %xmm1, %xmm1
373*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm0
374*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm2, %xmm3
375*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm2
376*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $1, %xmm2
377*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddw %xmm1, %xmm1
378*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm0
379*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm2, %xmm3
380*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm5, %xmm3
381*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm0
382*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
383*9880d681SAndroid Build Coastguard Worker;
384*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: var_rotate_v8i16:
385*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
386*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16]
387*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsubw %xmm1, %xmm2, %xmm2
388*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3
389*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
390*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
391*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3
392*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsllw $8, %xmm0, %xmm4
393*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm1
394*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm4
395*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm1, %xmm1
396*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsllw $2, %xmm1, %xmm4
397*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
398*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm1, %xmm1
399*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsllw $1, %xmm1, %xmm4
400*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
401*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm1, %xmm1
402*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3
403*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
404*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
405*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3
406*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm4
407*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendvb %xmm2, %xmm4, %xmm0, %xmm0
408*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
409*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
410*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm2
411*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
412*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
413*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm2
414*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
415*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
416*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
417*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
418*9880d681SAndroid Build Coastguard Worker;
419*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: var_rotate_v8i16:
420*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
421*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16]
422*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsubw %xmm1, %xmm2, %xmm2
423*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
424*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
425*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm1
426*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,128,128,128,128,128,128,128,128,0,1,4,5,8,9,12,13,128,128,128,128,128,128,128,128]
427*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufb %ymm3, %ymm1, %ymm1
428*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
429*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
430*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsrlvd %ymm2, %ymm0, %ymm0
431*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
432*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
433*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
434*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vzeroupper
435*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
436*9880d681SAndroid Build Coastguard Worker;
437*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: var_rotate_v8i16:
438*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
439*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vprotw %xmm1, %xmm0, %xmm0
440*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
441*9880d681SAndroid Build Coastguard Worker;
442*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: var_rotate_v8i16:
443*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
444*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
445*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psubw %xmm1, %xmm3
446*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $12, %xmm1
447*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
448*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psraw $15, %xmm2
449*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
450*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $8, %xmm4
451*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm2, %xmm4
452*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm2
453*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm4, %xmm2
454*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddw %xmm1, %xmm1
455*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm4
456*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psraw $15, %xmm4
457*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm4, %xmm5
458*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm2, %xmm5
459*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $4, %xmm2
460*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm4, %xmm2
461*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm5, %xmm2
462*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddw %xmm1, %xmm1
463*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm4
464*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psraw $15, %xmm4
465*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm4, %xmm5
466*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm2, %xmm5
467*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $2, %xmm2
468*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm4, %xmm2
469*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm5, %xmm2
470*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddw %xmm1, %xmm1
471*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psraw $15, %xmm1
472*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm4
473*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm2, %xmm4
474*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $1, %xmm2
475*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm1, %xmm2
476*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $12, %xmm3
477*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm3, %xmm1
478*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psraw $15, %xmm1
479*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm5
480*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm5
481*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $8, %xmm0
482*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm1, %xmm0
483*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm5, %xmm0
484*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddw %xmm3, %xmm3
485*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm3, %xmm1
486*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psraw $15, %xmm1
487*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm5
488*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm5
489*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $4, %xmm0
490*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm1, %xmm0
491*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm5, %xmm0
492*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddw %xmm3, %xmm3
493*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm3, %xmm1
494*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psraw $15, %xmm1
495*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm5
496*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm5
497*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $2, %xmm0
498*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm1, %xmm0
499*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm5, %xmm0
500*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddw %xmm3, %xmm3
501*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psraw $15, %xmm3
502*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm3, %xmm1
503*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm1
504*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $1, %xmm0
505*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm3, %xmm0
506*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm1, %xmm0
507*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm4, %xmm0
508*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm2, %xmm0
509*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
510*9880d681SAndroid Build Coastguard Worker  %b16 = sub <8 x i16> <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>, %b
511*9880d681SAndroid Build Coastguard Worker  %shl = shl <8 x i16> %a, %b
512*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <8 x i16> %a, %b16
513*9880d681SAndroid Build Coastguard Worker  %or = or <8 x i16> %shl, %lshr
514*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %or
515*9880d681SAndroid Build Coastguard Worker}
516*9880d681SAndroid Build Coastguard Worker
517*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @var_rotate_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
518*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: var_rotate_v16i8:
519*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
520*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
521*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psubb %xmm1, %xmm4
522*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $5, %xmm1
523*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm3, %xmm3
524*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm2, %xmm2
525*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
526*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm5
527*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $4, %xmm5
528*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand {{.*}}(%rip), %xmm5
529*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm2, %xmm5
530*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm2
531*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm5, %xmm2
532*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddb %xmm1, %xmm1
533*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm5, %xmm5
534*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pcmpgtb %xmm1, %xmm5
535*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm5, %xmm6
536*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm2, %xmm6
537*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $2, %xmm2
538*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
539*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm5, %xmm2
540*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm6, %xmm2
541*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddb %xmm1, %xmm1
542*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm5, %xmm5
543*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pcmpgtb %xmm1, %xmm5
544*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm5, %xmm1
545*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm2, %xmm1
546*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddb %xmm2, %xmm2
547*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm5, %xmm2
548*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $5, %xmm4
549*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm5, %xmm5
550*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pcmpgtb %xmm4, %xmm5
551*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm5, %xmm6
552*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm6
553*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $4, %xmm0
554*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
555*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm5, %xmm0
556*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm6, %xmm0
557*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddb %xmm4, %xmm4
558*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm5, %xmm5
559*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pcmpgtb %xmm4, %xmm5
560*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm5, %xmm6
561*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm6
562*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $2, %xmm0
563*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
564*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm5, %xmm0
565*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm6, %xmm0
566*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddb %xmm4, %xmm4
567*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pcmpgtb %xmm4, %xmm3
568*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm3, %xmm4
569*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm4
570*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $1, %xmm0
571*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
572*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm3, %xmm0
573*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm4, %xmm0
574*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm1, %xmm0
575*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm2, %xmm0
576*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
577*9880d681SAndroid Build Coastguard Worker;
578*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: var_rotate_v16i8:
579*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
580*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm3
581*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm1
582*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
583*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psubb %xmm3, %xmm2
584*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $5, %xmm3
585*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm5
586*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $4, %xmm5
587*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand {{.*}}(%rip), %xmm5
588*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm4
589*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm0
590*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm5, %xmm4
591*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm4, %xmm5
592*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $2, %xmm5
593*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand {{.*}}(%rip), %xmm5
594*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddb %xmm3, %xmm3
595*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm0
596*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm5, %xmm4
597*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm4, %xmm5
598*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddb %xmm5, %xmm5
599*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddb %xmm3, %xmm3
600*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm0
601*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm5, %xmm4
602*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $5, %xmm2
603*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm3
604*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddb %xmm3, %xmm3
605*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm5
606*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $4, %xmm5
607*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand {{.*}}(%rip), %xmm5
608*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm0
609*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm5, %xmm1
610*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm2
611*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $2, %xmm2
612*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
613*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm0
614*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm2, %xmm1
615*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm2
616*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $1, %xmm2
617*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
618*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddb %xmm3, %xmm3
619*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm0
620*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm2, %xmm1
621*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm4, %xmm1
622*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm0
623*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
624*9880d681SAndroid Build Coastguard Worker;
625*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: var_rotate_v16i8:
626*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
627*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
628*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsubb %xmm1, %xmm2, %xmm2
629*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
630*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllw $4, %xmm0, %xmm3
631*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
632*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm3
633*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllw $2, %xmm3, %xmm4
634*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm4, %xmm4
635*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
636*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm1, %xmm4, %xmm3, %xmm3
637*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpaddb %xmm3, %xmm3, %xmm4
638*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
639*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm1, %xmm4, %xmm3, %xmm1
640*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllw $5, %xmm2, %xmm2
641*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm3
642*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm4
643*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm4, %xmm4
644*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm0, %xmm0
645*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm2
646*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
647*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
648*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm2
649*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
650*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpaddb %xmm3, %xmm3, %xmm3
651*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
652*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
653*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
654*9880d681SAndroid Build Coastguard Worker;
655*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: var_rotate_v16i8:
656*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
657*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vprotb %xmm1, %xmm0, %xmm0
658*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
659*9880d681SAndroid Build Coastguard Worker;
660*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: var_rotate_v16i8:
661*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
662*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
663*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psubb %xmm1, %xmm4
664*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $5, %xmm1
665*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm3, %xmm3
666*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm2, %xmm2
667*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm2
668*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm5
669*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $4, %xmm5
670*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm5
671*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm2, %xmm5
672*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm2
673*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm5, %xmm2
674*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddb %xmm1, %xmm1
675*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm5, %xmm5
676*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm5
677*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
678*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm2, %xmm6
679*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $2, %xmm2
680*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm2
681*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm5, %xmm2
682*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm6, %xmm2
683*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddb %xmm1, %xmm1
684*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm5, %xmm5
685*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm5
686*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm5, %xmm1
687*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm2, %xmm1
688*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddb %xmm2, %xmm2
689*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm5, %xmm2
690*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $5, %xmm4
691*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm5, %xmm5
692*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pcmpgtb %xmm4, %xmm5
693*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
694*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm6
695*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $4, %xmm0
696*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
697*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm5, %xmm0
698*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm6, %xmm0
699*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddb %xmm4, %xmm4
700*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm5, %xmm5
701*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pcmpgtb %xmm4, %xmm5
702*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
703*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm6
704*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $2, %xmm0
705*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
706*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm5, %xmm0
707*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm6, %xmm0
708*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddb %xmm4, %xmm4
709*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pcmpgtb %xmm4, %xmm3
710*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
711*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm4
712*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $1, %xmm0
713*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
714*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm3, %xmm0
715*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm4, %xmm0
716*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm1, %xmm0
717*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm2, %xmm0
718*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
719*9880d681SAndroid Build Coastguard Worker  %b8 = sub <16 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>, %b
720*9880d681SAndroid Build Coastguard Worker  %shl = shl <16 x i8> %a, %b
721*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <16 x i8> %a, %b8
722*9880d681SAndroid Build Coastguard Worker  %or = or <16 x i8> %shl, %lshr
723*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %or
724*9880d681SAndroid Build Coastguard Worker}
725*9880d681SAndroid Build Coastguard Worker
726*9880d681SAndroid Build Coastguard Worker;
727*9880d681SAndroid Build Coastguard Worker; Constant Rotates
728*9880d681SAndroid Build Coastguard Worker;
729*9880d681SAndroid Build Coastguard Worker
730*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @constant_rotate_v2i64(<2 x i64> %a) nounwind {
731*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: constant_rotate_v2i64:
732*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
733*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm2
734*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllq $14, %xmm2
735*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm1
736*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllq $4, %xmm1
737*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
738*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm1
739*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlq $50, %xmm1
740*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlq $60, %xmm0
741*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
742*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    orpd %xmm2, %xmm1
743*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm1, %xmm0
744*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
745*9880d681SAndroid Build Coastguard Worker;
746*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: constant_rotate_v2i64:
747*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
748*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm1
749*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllq $14, %xmm1
750*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm2
751*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllq $4, %xmm2
752*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
753*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm1
754*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlq $50, %xmm1
755*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlq $60, %xmm0
756*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
757*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm2, %xmm0
758*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
759*9880d681SAndroid Build Coastguard Worker;
760*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: constant_rotate_v2i64:
761*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
762*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm1
763*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsllq $4, %xmm0, %xmm2
764*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
765*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm2
766*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlq $60, %xmm0, %xmm0
767*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
768*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
769*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
770*9880d681SAndroid Build Coastguard Worker;
771*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: constant_rotate_v2i64:
772*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
773*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %xmm0, %xmm1
774*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
775*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
776*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
777*9880d681SAndroid Build Coastguard Worker;
778*9880d681SAndroid Build Coastguard Worker; XOPAVX1-LABEL: constant_rotate_v2i64:
779*9880d681SAndroid Build Coastguard Worker; XOPAVX1:       # BB#0:
780*9880d681SAndroid Build Coastguard Worker; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm1
781*9880d681SAndroid Build Coastguard Worker; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
782*9880d681SAndroid Build Coastguard Worker; XOPAVX1-NEXT:    vpsubq {{.*}}(%rip), %xmm2, %xmm2
783*9880d681SAndroid Build Coastguard Worker; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm0, %xmm0
784*9880d681SAndroid Build Coastguard Worker; XOPAVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
785*9880d681SAndroid Build Coastguard Worker; XOPAVX1-NEXT:    retq
786*9880d681SAndroid Build Coastguard Worker;
787*9880d681SAndroid Build Coastguard Worker; XOPAVX2-LABEL: constant_rotate_v2i64:
788*9880d681SAndroid Build Coastguard Worker; XOPAVX2:       # BB#0:
789*9880d681SAndroid Build Coastguard Worker; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %xmm0, %xmm1
790*9880d681SAndroid Build Coastguard Worker; XOPAVX2-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
791*9880d681SAndroid Build Coastguard Worker; XOPAVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
792*9880d681SAndroid Build Coastguard Worker; XOPAVX2-NEXT:    retq
793*9880d681SAndroid Build Coastguard Worker;
794*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: constant_rotate_v2i64:
795*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
796*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
797*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllq $14, %xmm2
798*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
799*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllq $4, %xmm1
800*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
801*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
802*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlq $50, %xmm1
803*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlq $60, %xmm0
804*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
805*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    orpd %xmm2, %xmm1
806*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movapd %xmm1, %xmm0
807*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
808*9880d681SAndroid Build Coastguard Worker  %shl = shl <2 x i64> %a, <i64 4, i64 14>
809*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <2 x i64> %a, <i64 60, i64 50>
810*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %shl, %lshr
811*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
812*9880d681SAndroid Build Coastguard Worker}
813*9880d681SAndroid Build Coastguard Worker
814*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @constant_rotate_v4i32(<4 x i32> %a) nounwind {
815*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: constant_rotate_v4i32:
816*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
817*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
818*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm2
819*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pmuludq %xmm1, %xmm2
820*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
821*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
822*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
823*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pmuludq %xmm1, %xmm3
824*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
825*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
826*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm1
827*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrld $25, %xmm1
828*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm3
829*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrld $27, %xmm3
830*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm3[0],xmm1[1]
831*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
832*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm3
833*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrld $26, %xmm3
834*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrld $28, %xmm0
835*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm3 = xmm0[0],xmm3[1]
836*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
837*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
838*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm2, %xmm0
839*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
840*9880d681SAndroid Build Coastguard Worker;
841*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: constant_rotate_v4i32:
842*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
843*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
844*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pmulld %xmm0, %xmm1
845*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm2
846*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrld $25, %xmm2
847*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm3
848*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrld $27, %xmm3
849*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm2[4,5,6,7]
850*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm2
851*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrld $26, %xmm2
852*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrld $28, %xmm0
853*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
854*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
855*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm1, %xmm0
856*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
857*9880d681SAndroid Build Coastguard Worker;
858*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: constant_rotate_v4i32:
859*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
860*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm1
861*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrld $25, %xmm0, %xmm2
862*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrld $27, %xmm0, %xmm3
863*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
864*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrld $26, %xmm0, %xmm3
865*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrld $28, %xmm0, %xmm0
866*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
867*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
868*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
869*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
870*9880d681SAndroid Build Coastguard Worker;
871*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: constant_rotate_v4i32:
872*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
873*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %xmm0, %xmm1
874*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
875*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
876*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
877*9880d681SAndroid Build Coastguard Worker;
878*9880d681SAndroid Build Coastguard Worker; XOPAVX1-LABEL: constant_rotate_v4i32:
879*9880d681SAndroid Build Coastguard Worker; XOPAVX1:       # BB#0:
880*9880d681SAndroid Build Coastguard Worker; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm1
881*9880d681SAndroid Build Coastguard Worker; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
882*9880d681SAndroid Build Coastguard Worker; XOPAVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
883*9880d681SAndroid Build Coastguard Worker; XOPAVX1-NEXT:    retq
884*9880d681SAndroid Build Coastguard Worker;
885*9880d681SAndroid Build Coastguard Worker; XOPAVX2-LABEL: constant_rotate_v4i32:
886*9880d681SAndroid Build Coastguard Worker; XOPAVX2:       # BB#0:
887*9880d681SAndroid Build Coastguard Worker; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %xmm0, %xmm1
888*9880d681SAndroid Build Coastguard Worker; XOPAVX2-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
889*9880d681SAndroid Build Coastguard Worker; XOPAVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
890*9880d681SAndroid Build Coastguard Worker; XOPAVX2-NEXT:    retq
891*9880d681SAndroid Build Coastguard Worker;
892*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: constant_rotate_v4i32:
893*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
894*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
895*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
896*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pmuludq %xmm1, %xmm2
897*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
898*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
899*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
900*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pmuludq %xmm1, %xmm3
901*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
902*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
903*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
904*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrld $25, %xmm1
905*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
906*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrld $27, %xmm3
907*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm3[0],xmm1[1]
908*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
909*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
910*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrld $26, %xmm3
911*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrld $28, %xmm0
912*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movsd {{.*#+}} xmm3 = xmm0[0],xmm3[1]
913*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
914*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
915*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm2, %xmm0
916*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
917*9880d681SAndroid Build Coastguard Worker  %shl = shl <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>
918*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <4 x i32> %a, <i32 28, i32 27, i32 26, i32 25>
919*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shl, %lshr
920*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
921*9880d681SAndroid Build Coastguard Worker}
922*9880d681SAndroid Build Coastguard Worker
923*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @constant_rotate_v8i16(<8 x i16> %a) nounwind {
924*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: constant_rotate_v8i16:
925*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
926*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
927*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pmullw %xmm0, %xmm2
928*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,65535,65535,65535]
929*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm1, %xmm3
930*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm3
931*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $8, %xmm0
932*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm0
933*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm3, %xmm0
934*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,0,0,0]
935*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm1, %xmm3
936*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm3
937*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $4, %xmm0
938*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm0
939*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm3, %xmm0
940*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,0,0,65535,65535,0]
941*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm1, %xmm3
942*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm3
943*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $2, %xmm0
944*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm0
945*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm3, %xmm0
946*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [65535,0,65535,0,65535,0,65535,0]
947*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm1
948*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm3, %xmm1
949*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $1, %xmm0
950*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm3
951*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm2, %xmm3
952*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm3, %xmm1
953*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm1, %xmm0
954*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
955*9880d681SAndroid Build Coastguard Worker;
956*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: constant_rotate_v8i16:
957*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
958*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
959*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pmullw %xmm0, %xmm1
960*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm2
961*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $8, %xmm2
962*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3,4,5,6,7]
963*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm0
964*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $4, %xmm0
965*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3,4],xmm2[5,6,7]
966*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm2
967*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $2, %xmm2
968*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm0[0],xmm2[1,2],xmm0[3,4],xmm2[5,6],xmm0[7]
969*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm0
970*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $1, %xmm0
971*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3],xmm2[4],xmm0[5],xmm2[6],xmm0[7]
972*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm1, %xmm0
973*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
974*9880d681SAndroid Build Coastguard Worker;
975*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: constant_rotate_v8i16:
976*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
977*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm1
978*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm2
979*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3,4,5,6,7]
980*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
981*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3,4],xmm0[5,6,7]
982*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm2
983*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2],xmm0[3,4],xmm2[5,6],xmm0[7]
984*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm2
985*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
986*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
987*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
988*9880d681SAndroid Build Coastguard Worker;
989*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: constant_rotate_v8i16:
990*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
991*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm1
992*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
993*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm0, %ymm0
994*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero,ymm0[16,17,20,21,24,25,28,29],zero,zero,zero,zero,zero,zero,zero,zero
995*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
996*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
997*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vzeroupper
998*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
999*9880d681SAndroid Build Coastguard Worker;
1000*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: constant_rotate_v8i16:
1001*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
1002*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm1
1003*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1004*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpsubw {{.*}}(%rip), %xmm2, %xmm2
1005*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpshlw %xmm2, %xmm0, %xmm0
1006*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpor %xmm0, %xmm1, %xmm0
1007*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
1008*9880d681SAndroid Build Coastguard Worker;
1009*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: constant_rotate_v8i16:
1010*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
1011*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
1012*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pmullw %xmm0, %xmm2
1013*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,65535,65535,65535]
1014*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm3
1015*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm3
1016*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $8, %xmm0
1017*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm1, %xmm0
1018*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm3, %xmm0
1019*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,0,0,0]
1020*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm3
1021*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm3
1022*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $4, %xmm0
1023*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm1, %xmm0
1024*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm3, %xmm0
1025*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,0,0,65535,65535,0]
1026*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm3
1027*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm3
1028*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $2, %xmm0
1029*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm1, %xmm0
1030*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm3, %xmm0
1031*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa {{.*#+}} xmm3 = [65535,0,65535,0,65535,0,65535,0]
1032*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1033*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm3, %xmm1
1034*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $1, %xmm0
1035*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm3
1036*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm2, %xmm3
1037*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm3, %xmm1
1038*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
1039*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
1040*9880d681SAndroid Build Coastguard Worker  %shl = shl <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
1041*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <8 x i16> %a, <i16 16, i16 15, i16 14, i16 13, i16 12, i16 11, i16 10, i16 9>
1042*9880d681SAndroid Build Coastguard Worker  %or = or <8 x i16> %shl, %lshr
1043*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %or
1044*9880d681SAndroid Build Coastguard Worker}
1045*9880d681SAndroid Build Coastguard Worker
1046*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @constant_rotate_v16i8(<16 x i8> %a) nounwind {
1047*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: constant_rotate_v16i8:
1048*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1049*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
1050*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $5, %xmm3
1051*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm2, %xmm2
1052*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm1, %xmm1
1053*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pcmpgtb %xmm3, %xmm1
1054*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm0, %xmm4
1055*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $4, %xmm4
1056*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand {{.*}}(%rip), %xmm4
1057*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm4
1058*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm1
1059*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm4, %xmm1
1060*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddb %xmm3, %xmm3
1061*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm4, %xmm4
1062*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pcmpgtb %xmm3, %xmm4
1063*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm4, %xmm5
1064*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm1, %xmm5
1065*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $2, %xmm1
1066*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
1067*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm4, %xmm1
1068*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm5, %xmm1
1069*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddb %xmm3, %xmm3
1070*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm4, %xmm4
1071*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pcmpgtb %xmm3, %xmm4
1072*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm4, %xmm3
1073*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm1, %xmm3
1074*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddb %xmm1, %xmm1
1075*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm4, %xmm1
1076*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
1077*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psllw $5, %xmm4
1078*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm5, %xmm5
1079*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pcmpgtb %xmm4, %xmm5
1080*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm5, %xmm6
1081*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm6
1082*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $4, %xmm0
1083*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1084*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm5, %xmm0
1085*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm6, %xmm0
1086*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddb %xmm4, %xmm4
1087*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm5, %xmm5
1088*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pcmpgtb %xmm4, %xmm5
1089*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm5, %xmm6
1090*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm6
1091*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $2, %xmm0
1092*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1093*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm5, %xmm0
1094*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm6, %xmm0
1095*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    paddb %xmm4, %xmm4
1096*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pcmpgtb %xmm4, %xmm2
1097*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm2, %xmm4
1098*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm0, %xmm4
1099*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrlw $1, %xmm0
1100*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1101*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm2, %xmm0
1102*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm4, %xmm0
1103*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm3, %xmm0
1104*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm1, %xmm0
1105*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1106*9880d681SAndroid Build Coastguard Worker;
1107*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: constant_rotate_v16i8:
1108*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1109*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm1
1110*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
1111*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $5, %xmm0
1112*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm3
1113*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $4, %xmm3
1114*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
1115*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm2
1116*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm3, %xmm2
1117*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm3
1118*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $2, %xmm3
1119*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
1120*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddb %xmm0, %xmm0
1121*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm3, %xmm2
1122*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm3
1123*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddb %xmm3, %xmm3
1124*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddb %xmm0, %xmm0
1125*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm3, %xmm2
1126*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
1127*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psllw $5, %xmm0
1128*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm3
1129*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $4, %xmm3
1130*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
1131*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm3, %xmm1
1132*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm3
1133*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $2, %xmm3
1134*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
1135*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddb %xmm0, %xmm0
1136*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm3, %xmm1
1137*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm3
1138*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrlw $1, %xmm3
1139*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
1140*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    paddb %xmm0, %xmm0
1141*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm3, %xmm1
1142*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm2, %xmm1
1143*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm0
1144*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1145*9880d681SAndroid Build Coastguard Worker;
1146*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: constant_rotate_v16i8:
1147*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1148*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
1149*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
1150*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllw $4, %xmm0, %xmm2
1151*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
1152*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm2
1153*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllw $2, %xmm2, %xmm3
1154*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
1155*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
1156*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm2, %xmm2
1157*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm3
1158*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
1159*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm2, %xmm1
1160*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
1161*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllw $5, %xmm2, %xmm2
1162*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm3
1163*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
1164*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm2, %xmm3, %xmm0, %xmm0
1165*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm3
1166*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
1167*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm2
1168*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm2, %xmm3, %xmm0, %xmm0
1169*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm3
1170*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
1171*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm2
1172*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm2, %xmm3, %xmm0, %xmm0
1173*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
1174*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1175*9880d681SAndroid Build Coastguard Worker;
1176*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: constant_rotate_v16i8:
1177*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
1178*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpshlb {{.*}}(%rip), %xmm0, %xmm1
1179*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1180*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpsubb {{.*}}(%rip), %xmm2, %xmm2
1181*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
1182*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpor %xmm0, %xmm1, %xmm0
1183*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
1184*9880d681SAndroid Build Coastguard Worker;
1185*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: constant_rotate_v16i8:
1186*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
1187*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
1188*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $5, %xmm3
1189*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm2, %xmm2
1190*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm1, %xmm1
1191*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pcmpgtb %xmm3, %xmm1
1192*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
1193*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $4, %xmm4
1194*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm4
1195*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm1, %xmm4
1196*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm1
1197*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm4, %xmm1
1198*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddb %xmm3, %xmm3
1199*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm4, %xmm4
1200*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pcmpgtb %xmm3, %xmm4
1201*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm4, %xmm5
1202*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm1, %xmm5
1203*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $2, %xmm1
1204*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
1205*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm4, %xmm1
1206*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm5, %xmm1
1207*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddb %xmm3, %xmm3
1208*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm4, %xmm4
1209*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pcmpgtb %xmm3, %xmm4
1210*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm4, %xmm3
1211*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm1, %xmm3
1212*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddb %xmm1, %xmm1
1213*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm4, %xmm1
1214*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa {{.*#+}} xmm4 = [8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
1215*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $5, %xmm4
1216*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm5, %xmm5
1217*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pcmpgtb %xmm4, %xmm5
1218*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
1219*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm6
1220*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $4, %xmm0
1221*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
1222*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm5, %xmm0
1223*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm6, %xmm0
1224*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddb %xmm4, %xmm4
1225*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pxor %xmm5, %xmm5
1226*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pcmpgtb %xmm4, %xmm5
1227*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
1228*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm6
1229*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $2, %xmm0
1230*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
1231*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm5, %xmm0
1232*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm6, %xmm0
1233*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    paddb %xmm4, %xmm4
1234*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pcmpgtb %xmm4, %xmm2
1235*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm2, %xmm4
1236*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pandn %xmm0, %xmm4
1237*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $1, %xmm0
1238*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
1239*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand %xmm2, %xmm0
1240*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm4, %xmm0
1241*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm3, %xmm0
1242*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm1, %xmm0
1243*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
1244*9880d681SAndroid Build Coastguard Worker  %shl = shl <16 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>
1245*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <16 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>
1246*9880d681SAndroid Build Coastguard Worker  %or = or <16 x i8> %shl, %lshr
1247*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %or
1248*9880d681SAndroid Build Coastguard Worker}
1249*9880d681SAndroid Build Coastguard Worker
1250*9880d681SAndroid Build Coastguard Worker;
1251*9880d681SAndroid Build Coastguard Worker; Uniform Constant Rotates
1252*9880d681SAndroid Build Coastguard Worker;
1253*9880d681SAndroid Build Coastguard Worker
1254*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @splatconstant_rotate_v2i64(<2 x i64> %a) nounwind {
1255*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: splatconstant_rotate_v2i64:
1256*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1257*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm0, %xmm1
1258*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psllq $14, %xmm1
1259*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psrlq $50, %xmm0
1260*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    por %xmm1, %xmm0
1261*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1262*9880d681SAndroid Build Coastguard Worker;
1263*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: splatconstant_rotate_v2i64:
1264*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1265*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllq $14, %xmm0, %xmm1
1266*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrlq $50, %xmm0, %xmm0
1267*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
1268*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1269*9880d681SAndroid Build Coastguard Worker;
1270*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: splatconstant_rotate_v2i64:
1271*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
1272*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vprotq $14, %xmm0, %xmm0
1273*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
1274*9880d681SAndroid Build Coastguard Worker;
1275*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: splatconstant_rotate_v2i64:
1276*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
1277*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1278*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllq $14, %xmm1
1279*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlq $50, %xmm0
1280*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm1, %xmm0
1281*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
1282*9880d681SAndroid Build Coastguard Worker  %shl = shl <2 x i64> %a, <i64 14, i64 14>
1283*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <2 x i64> %a, <i64 50, i64 50>
1284*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %shl, %lshr
1285*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
1286*9880d681SAndroid Build Coastguard Worker}
1287*9880d681SAndroid Build Coastguard Worker
1288*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @splatconstant_rotate_v4i32(<4 x i32> %a) nounwind {
1289*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: splatconstant_rotate_v4i32:
1290*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1291*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm0, %xmm1
1292*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pslld $4, %xmm1
1293*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psrld $28, %xmm0
1294*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    por %xmm1, %xmm0
1295*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1296*9880d681SAndroid Build Coastguard Worker;
1297*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: splatconstant_rotate_v4i32:
1298*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1299*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpslld $4, %xmm0, %xmm1
1300*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrld $28, %xmm0, %xmm0
1301*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
1302*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1303*9880d681SAndroid Build Coastguard Worker;
1304*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: splatconstant_rotate_v4i32:
1305*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
1306*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vprotd $4, %xmm0, %xmm0
1307*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
1308*9880d681SAndroid Build Coastguard Worker;
1309*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: splatconstant_rotate_v4i32:
1310*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
1311*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1312*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pslld $4, %xmm1
1313*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrld $28, %xmm0
1314*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm1, %xmm0
1315*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
1316*9880d681SAndroid Build Coastguard Worker  %shl = shl <4 x i32> %a, <i32 4, i32 4, i32 4, i32 4>
1317*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <4 x i32> %a, <i32 28, i32 28, i32 28, i32 28>
1318*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shl, %lshr
1319*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
1320*9880d681SAndroid Build Coastguard Worker}
1321*9880d681SAndroid Build Coastguard Worker
1322*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @splatconstant_rotate_v8i16(<8 x i16> %a) nounwind {
1323*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: splatconstant_rotate_v8i16:
1324*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1325*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm0, %xmm1
1326*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psllw $7, %xmm1
1327*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psrlw $9, %xmm0
1328*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    por %xmm1, %xmm0
1329*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1330*9880d681SAndroid Build Coastguard Worker;
1331*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: splatconstant_rotate_v8i16:
1332*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1333*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllw $7, %xmm0, %xmm1
1334*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrlw $9, %xmm0, %xmm0
1335*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
1336*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1337*9880d681SAndroid Build Coastguard Worker;
1338*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: splatconstant_rotate_v8i16:
1339*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
1340*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vprotw $7, %xmm0, %xmm0
1341*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
1342*9880d681SAndroid Build Coastguard Worker;
1343*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: splatconstant_rotate_v8i16:
1344*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
1345*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1346*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $7, %xmm1
1347*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $9, %xmm0
1348*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm1, %xmm0
1349*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
1350*9880d681SAndroid Build Coastguard Worker  %shl = shl <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
1351*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <8 x i16> %a, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9>
1352*9880d681SAndroid Build Coastguard Worker  %or = or <8 x i16> %shl, %lshr
1353*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %or
1354*9880d681SAndroid Build Coastguard Worker}
1355*9880d681SAndroid Build Coastguard Worker
1356*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @splatconstant_rotate_v16i8(<16 x i8> %a) nounwind {
1357*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: splatconstant_rotate_v16i8:
1358*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1359*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm0, %xmm1
1360*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psllw $4, %xmm1
1361*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
1362*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psrlw $4, %xmm0
1363*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
1364*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    por %xmm1, %xmm0
1365*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1366*9880d681SAndroid Build Coastguard Worker;
1367*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: splatconstant_rotate_v16i8:
1368*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1369*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllw $4, %xmm0, %xmm1
1370*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1371*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
1372*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1373*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
1374*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1375*9880d681SAndroid Build Coastguard Worker;
1376*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: splatconstant_rotate_v16i8:
1377*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
1378*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vprotb $4, %xmm0, %xmm0
1379*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
1380*9880d681SAndroid Build Coastguard Worker;
1381*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: splatconstant_rotate_v16i8:
1382*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
1383*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1384*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $4, %xmm1
1385*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
1386*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $4, %xmm0
1387*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
1388*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm1, %xmm0
1389*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
1390*9880d681SAndroid Build Coastguard Worker  %shl = shl <16 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>
1391*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <16 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>
1392*9880d681SAndroid Build Coastguard Worker  %or = or <16 x i8> %shl, %lshr
1393*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %or
1394*9880d681SAndroid Build Coastguard Worker}
1395*9880d681SAndroid Build Coastguard Worker
1396*9880d681SAndroid Build Coastguard Worker;
1397*9880d681SAndroid Build Coastguard Worker; Masked Uniform Constant Rotates
1398*9880d681SAndroid Build Coastguard Worker;
1399*9880d681SAndroid Build Coastguard Worker
1400*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @splatconstant_rotate_mask_v2i64(<2 x i64> %a) nounwind {
1401*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: splatconstant_rotate_mask_v2i64:
1402*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1403*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm0, %xmm1
1404*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psllq $15, %xmm1
1405*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psrlq $49, %xmm0
1406*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
1407*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
1408*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    por %xmm0, %xmm1
1409*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm1, %xmm0
1410*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1411*9880d681SAndroid Build Coastguard Worker;
1412*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: splatconstant_rotate_mask_v2i64:
1413*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1414*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllq $15, %xmm0, %xmm1
1415*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrlq $49, %xmm0, %xmm0
1416*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1417*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1418*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
1419*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1420*9880d681SAndroid Build Coastguard Worker;
1421*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: splatconstant_rotate_mask_v2i64:
1422*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
1423*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vprotq $15, %xmm0, %xmm0
1424*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1425*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
1426*9880d681SAndroid Build Coastguard Worker;
1427*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: splatconstant_rotate_mask_v2i64:
1428*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
1429*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1430*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllq $15, %xmm1
1431*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlq $49, %xmm0
1432*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
1433*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
1434*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm0, %xmm1
1435*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
1436*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
1437*9880d681SAndroid Build Coastguard Worker  %shl = shl <2 x i64> %a, <i64 15, i64 15>
1438*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <2 x i64> %a, <i64 49, i64 49>
1439*9880d681SAndroid Build Coastguard Worker  %rmask = and <2 x i64> %lshr, <i64 255, i64 127>
1440*9880d681SAndroid Build Coastguard Worker  %lmask = and <2 x i64> %shl, <i64 65, i64 33>
1441*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %lmask, %rmask
1442*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
1443*9880d681SAndroid Build Coastguard Worker}
1444*9880d681SAndroid Build Coastguard Worker
1445*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @splatconstant_rotate_mask_v4i32(<4 x i32> %a) nounwind {
1446*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: splatconstant_rotate_mask_v4i32:
1447*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1448*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm0, %xmm1
1449*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pslld $4, %xmm1
1450*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psrld $28, %xmm0
1451*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
1452*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
1453*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    por %xmm0, %xmm1
1454*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm1, %xmm0
1455*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1456*9880d681SAndroid Build Coastguard Worker;
1457*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: splatconstant_rotate_mask_v4i32:
1458*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1459*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpslld $4, %xmm0, %xmm1
1460*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrld $28, %xmm0, %xmm0
1461*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1462*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1463*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
1464*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1465*9880d681SAndroid Build Coastguard Worker;
1466*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: splatconstant_rotate_mask_v4i32:
1467*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
1468*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vprotd $4, %xmm0, %xmm0
1469*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1470*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
1471*9880d681SAndroid Build Coastguard Worker;
1472*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: splatconstant_rotate_mask_v4i32:
1473*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
1474*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1475*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pslld $4, %xmm1
1476*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrld $28, %xmm0
1477*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
1478*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
1479*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm0, %xmm1
1480*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
1481*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
1482*9880d681SAndroid Build Coastguard Worker  %shl = shl <4 x i32> %a, <i32 4, i32 4, i32 4, i32 4>
1483*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <4 x i32> %a, <i32 28, i32 28, i32 28, i32 28>
1484*9880d681SAndroid Build Coastguard Worker  %rmask = and <4 x i32> %lshr, <i32 127, i32 255, i32 511, i32 1023>
1485*9880d681SAndroid Build Coastguard Worker  %lmask = and <4 x i32> %shl, <i32 1023, i32 511, i32 255, i32 127>
1486*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %lmask, %rmask
1487*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
1488*9880d681SAndroid Build Coastguard Worker}
1489*9880d681SAndroid Build Coastguard Worker
1490*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @splatconstant_rotate_mask_v8i16(<8 x i16> %a) nounwind {
1491*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: splatconstant_rotate_mask_v8i16:
1492*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1493*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm0, %xmm1
1494*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psllw $5, %xmm1
1495*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psrlw $11, %xmm0
1496*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
1497*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
1498*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    por %xmm0, %xmm1
1499*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm1, %xmm0
1500*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1501*9880d681SAndroid Build Coastguard Worker;
1502*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: splatconstant_rotate_mask_v8i16:
1503*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1504*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllw $5, %xmm0, %xmm1
1505*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrlw $11, %xmm0, %xmm0
1506*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1507*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1508*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
1509*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1510*9880d681SAndroid Build Coastguard Worker;
1511*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: splatconstant_rotate_mask_v8i16:
1512*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
1513*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vprotw $5, %xmm0, %xmm0
1514*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1515*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
1516*9880d681SAndroid Build Coastguard Worker;
1517*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: splatconstant_rotate_mask_v8i16:
1518*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
1519*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1520*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $5, %xmm1
1521*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $11, %xmm0
1522*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
1523*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
1524*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm0, %xmm1
1525*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
1526*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
1527*9880d681SAndroid Build Coastguard Worker  %shl = shl <8 x i16> %a, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
1528*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <8 x i16> %a, <i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11>
1529*9880d681SAndroid Build Coastguard Worker  %rmask = and <8 x i16> %lshr, <i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55>
1530*9880d681SAndroid Build Coastguard Worker  %lmask = and <8 x i16> %shl, <i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33>
1531*9880d681SAndroid Build Coastguard Worker  %or = or <8 x i16> %lmask, %rmask
1532*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %or
1533*9880d681SAndroid Build Coastguard Worker}
1534*9880d681SAndroid Build Coastguard Worker
1535*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @splatconstant_rotate_mask_v16i8(<16 x i8> %a) nounwind {
1536*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: splatconstant_rotate_mask_v16i8:
1537*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1538*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm0, %xmm1
1539*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psllw $4, %xmm1
1540*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
1541*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    psrlw $4, %xmm0
1542*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
1543*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
1544*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
1545*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    por %xmm0, %xmm1
1546*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm1, %xmm0
1547*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1548*9880d681SAndroid Build Coastguard Worker;
1549*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: splatconstant_rotate_mask_v16i8:
1550*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1551*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsllw $4, %xmm0, %xmm1
1552*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1553*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
1554*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1555*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1556*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1557*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
1558*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1559*9880d681SAndroid Build Coastguard Worker;
1560*9880d681SAndroid Build Coastguard Worker; XOP-LABEL: splatconstant_rotate_mask_v16i8:
1561*9880d681SAndroid Build Coastguard Worker; XOP:       # BB#0:
1562*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vprotb $4, %xmm0, %xmm0
1563*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1564*9880d681SAndroid Build Coastguard Worker; XOP-NEXT:    retq
1565*9880d681SAndroid Build Coastguard Worker;
1566*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: splatconstant_rotate_mask_v16i8:
1567*9880d681SAndroid Build Coastguard Worker; X32-SSE:       # BB#0:
1568*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1569*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psllw $4, %xmm1
1570*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
1571*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    psrlw $4, %xmm0
1572*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
1573*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
1574*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
1575*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    por %xmm0, %xmm1
1576*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
1577*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT:    retl
1578*9880d681SAndroid Build Coastguard Worker  %shl = shl <16 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>
1579*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <16 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>
1580*9880d681SAndroid Build Coastguard Worker  %rmask = and <16 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>
1581*9880d681SAndroid Build Coastguard Worker  %lmask = and <16 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>
1582*9880d681SAndroid Build Coastguard Worker  %or = or <16 x i8> %lmask, %rmask
1583*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %or
1584*9880d681SAndroid Build Coastguard Worker}
1585