xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/avx2-vector-shifts.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-linux-gnu -mattr=+avx2 | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; AVX2 Logical Shift Left
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_sllw_1(<16 x i16> %InVec) {
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sllw_1:
8*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
10*9880d681SAndroid Build Coastguard Workerentry:
11*9880d681SAndroid Build Coastguard Worker  %shl = shl <16 x i16> %InVec, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
12*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %shl
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_sllw_2(<16 x i16> %InVec) {
16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sllw_2:
17*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpaddw %ymm0, %ymm0, %ymm0
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
20*9880d681SAndroid Build Coastguard Workerentry:
21*9880d681SAndroid Build Coastguard Worker  %shl = shl <16 x i16> %InVec, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
22*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %shl
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_sllw_3(<16 x i16> %InVec) {
26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sllw_3:
27*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsllw $15, %ymm0, %ymm0
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
30*9880d681SAndroid Build Coastguard Workerentry:
31*9880d681SAndroid Build Coastguard Worker  %shl = shl <16 x i16> %InVec, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
32*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %shl
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_slld_1(<8 x i32> %InVec) {
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_slld_1:
37*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
39*9880d681SAndroid Build Coastguard Workerentry:
40*9880d681SAndroid Build Coastguard Worker  %shl = shl <8 x i32> %InVec, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
41*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %shl
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_slld_2(<8 x i32> %InVec) {
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_slld_2:
46*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpaddd %ymm0, %ymm0, %ymm0
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
49*9880d681SAndroid Build Coastguard Workerentry:
50*9880d681SAndroid Build Coastguard Worker  %shl = shl <8 x i32> %InVec, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
51*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %shl
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_vpslld_var(i32 %shift) {
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vpslld_var:
56*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovd %edi, %xmm0
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovdqa {{.*#+}} ymm1 = [192,193,194,195,196,197,198,199]
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpslld %xmm0, %ymm1, %ymm0
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
61*9880d681SAndroid Build Coastguard Worker  %amt = insertelement <8 x i32> undef, i32 %shift, i32 0
62*9880d681SAndroid Build Coastguard Worker  %tmp = shl <8 x i32> <i32 192, i32 193, i32 194, i32 195, i32 196, i32 197, i32 198, i32 199>, %amt
63*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %tmp
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_slld_3(<8 x i32> %InVec) {
67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_slld_3:
68*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpslld $31, %ymm0, %ymm0
70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
71*9880d681SAndroid Build Coastguard Workerentry:
72*9880d681SAndroid Build Coastguard Worker  %shl = shl <8 x i32> %InVec, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
73*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %shl
74*9880d681SAndroid Build Coastguard Worker}
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @test_sllq_1(<4 x i64> %InVec) {
77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sllq_1:
78*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
80*9880d681SAndroid Build Coastguard Workerentry:
81*9880d681SAndroid Build Coastguard Worker  %shl = shl <4 x i64> %InVec, <i64 0, i64 0, i64 0, i64 0>
82*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %shl
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @test_sllq_2(<4 x i64> %InVec) {
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sllq_2:
87*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpaddq %ymm0, %ymm0, %ymm0
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
90*9880d681SAndroid Build Coastguard Workerentry:
91*9880d681SAndroid Build Coastguard Worker  %shl = shl <4 x i64> %InVec, <i64 1, i64 1, i64 1, i64 1>
92*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %shl
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @test_sllq_3(<4 x i64> %InVec) {
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sllq_3:
97*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsllq $63, %ymm0, %ymm0
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
100*9880d681SAndroid Build Coastguard Workerentry:
101*9880d681SAndroid Build Coastguard Worker  %shl = shl <4 x i64> %InVec, <i64 63, i64 63, i64 63, i64 63>
102*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %shl
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker; AVX2 Arithmetic Shift
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_sraw_1(<16 x i16> %InVec) {
108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sraw_1:
109*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
111*9880d681SAndroid Build Coastguard Workerentry:
112*9880d681SAndroid Build Coastguard Worker  %shl = ashr <16 x i16> %InVec, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
113*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %shl
114*9880d681SAndroid Build Coastguard Worker}
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_sraw_2(<16 x i16> %InVec) {
117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sraw_2:
118*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsraw $1, %ymm0, %ymm0
120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
121*9880d681SAndroid Build Coastguard Workerentry:
122*9880d681SAndroid Build Coastguard Worker  %shl = ashr <16 x i16> %InVec, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
123*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %shl
124*9880d681SAndroid Build Coastguard Worker}
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_sraw_3(<16 x i16> %InVec) {
127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sraw_3:
128*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsraw $15, %ymm0, %ymm0
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
131*9880d681SAndroid Build Coastguard Workerentry:
132*9880d681SAndroid Build Coastguard Worker  %shl = ashr <16 x i16> %InVec, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
133*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %shl
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_srad_1(<8 x i32> %InVec) {
137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_srad_1:
138*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
140*9880d681SAndroid Build Coastguard Workerentry:
141*9880d681SAndroid Build Coastguard Worker  %shl = ashr <8 x i32> %InVec, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
142*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %shl
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_srad_2(<8 x i32> %InVec) {
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_srad_2:
147*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrad $1, %ymm0, %ymm0
149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
150*9880d681SAndroid Build Coastguard Workerentry:
151*9880d681SAndroid Build Coastguard Worker  %shl = ashr <8 x i32> %InVec, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
152*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %shl
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_srad_3(<8 x i32> %InVec) {
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_srad_3:
157*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrad $31, %ymm0, %ymm0
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
160*9880d681SAndroid Build Coastguard Workerentry:
161*9880d681SAndroid Build Coastguard Worker  %shl = ashr <8 x i32> %InVec, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
162*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %shl
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker; SSE Logical Shift Right
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_srlw_1(<16 x i16> %InVec) {
168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_srlw_1:
169*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
171*9880d681SAndroid Build Coastguard Workerentry:
172*9880d681SAndroid Build Coastguard Worker  %shl = lshr <16 x i16> %InVec, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
173*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %shl
174*9880d681SAndroid Build Coastguard Worker}
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_srlw_2(<16 x i16> %InVec) {
177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_srlw_2:
178*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlw $1, %ymm0, %ymm0
180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
181*9880d681SAndroid Build Coastguard Workerentry:
182*9880d681SAndroid Build Coastguard Worker  %shl = lshr <16 x i16> %InVec, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
183*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %shl
184*9880d681SAndroid Build Coastguard Worker}
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_srlw_3(<16 x i16> %InVec) {
187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_srlw_3:
188*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlw $15, %ymm0, %ymm0
190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
191*9880d681SAndroid Build Coastguard Workerentry:
192*9880d681SAndroid Build Coastguard Worker  %shl = lshr <16 x i16> %InVec, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
193*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %shl
194*9880d681SAndroid Build Coastguard Worker}
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_srld_1(<8 x i32> %InVec) {
197*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_srld_1:
198*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
200*9880d681SAndroid Build Coastguard Workerentry:
201*9880d681SAndroid Build Coastguard Worker  %shl = lshr <8 x i32> %InVec, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
202*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %shl
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_srld_2(<8 x i32> %InVec) {
206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_srld_2:
207*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrld $1, %ymm0, %ymm0
209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
210*9880d681SAndroid Build Coastguard Workerentry:
211*9880d681SAndroid Build Coastguard Worker  %shl = lshr <8 x i32> %InVec, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
212*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %shl
213*9880d681SAndroid Build Coastguard Worker}
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_srld_3(<8 x i32> %InVec) {
216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_srld_3:
217*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrld $31, %ymm0, %ymm0
219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
220*9880d681SAndroid Build Coastguard Workerentry:
221*9880d681SAndroid Build Coastguard Worker  %shl = lshr <8 x i32> %InVec, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
222*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %shl
223*9880d681SAndroid Build Coastguard Worker}
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @test_srlq_1(<4 x i64> %InVec) {
226*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_srlq_1:
227*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
229*9880d681SAndroid Build Coastguard Workerentry:
230*9880d681SAndroid Build Coastguard Worker  %shl = lshr <4 x i64> %InVec, <i64 0, i64 0, i64 0, i64 0>
231*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %shl
232*9880d681SAndroid Build Coastguard Worker}
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @test_srlq_2(<4 x i64> %InVec) {
235*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_srlq_2:
236*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlq $1, %ymm0, %ymm0
238*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
239*9880d681SAndroid Build Coastguard Workerentry:
240*9880d681SAndroid Build Coastguard Worker  %shl = lshr <4 x i64> %InVec, <i64 1, i64 1, i64 1, i64 1>
241*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %shl
242*9880d681SAndroid Build Coastguard Worker}
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @test_srlq_3(<4 x i64> %InVec) {
245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_srlq_3:
246*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0: # %entry
247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlq $63, %ymm0, %ymm0
248*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
249*9880d681SAndroid Build Coastguard Workerentry:
250*9880d681SAndroid Build Coastguard Worker  %shl = lshr <4 x i64> %InVec, <i64 63, i64 63, i64 63, i64 63>
251*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %shl
252*9880d681SAndroid Build Coastguard Worker}
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @srl_trunc_and_v4i64(<4 x i32> %x, <4 x i64> %y) nounwind {
255*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: srl_trunc_and_v4i64:
256*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[0,2,0,2,4,6,4,6]
258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,3,2,3]
259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm2
260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpand %xmm2, %xmm1, %xmm1
261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0
262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vzeroupper
263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
264*9880d681SAndroid Build Coastguard Worker  %and = and <4 x i64> %y, <i64 8, i64 8, i64 8, i64 8>
265*9880d681SAndroid Build Coastguard Worker  %trunc = trunc <4 x i64> %and to <4 x i32>
266*9880d681SAndroid Build Coastguard Worker  %sra = lshr <4 x i32> %x, %trunc
267*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sra
268*9880d681SAndroid Build Coastguard Worker}
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker;
271*9880d681SAndroid Build Coastguard Worker; Vectorized byte shifts
272*9880d681SAndroid Build Coastguard Worker;
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @shl_8i16(<8 x i16> %r, <8 x i16> %a) nounwind {
275*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shl_8i16:
276*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
277*9880d681SAndroid Build Coastguard Worker; CHECK-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
278*9880d681SAndroid Build Coastguard Worker; CHECK-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
279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
280*9880d681SAndroid Build Coastguard Worker; CHECK-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
281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
282*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
283*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vzeroupper
284*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
285*9880d681SAndroid Build Coastguard Worker  %shl = shl <8 x i16> %r, %a
286*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %shl
287*9880d681SAndroid Build Coastguard Worker}
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @shl_16i16(<16 x i16> %r, <16 x i16> %a) nounwind {
290*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shl_16i16:
291*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpxor %ymm2, %ymm2, %ymm2
293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
294*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
295*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsllvd %ymm3, %ymm4, %ymm3
296*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrld $16, %ymm3, %ymm3
297*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
298*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
299*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
300*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrld $16, %ymm0, %ymm0
301*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
302*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
303*9880d681SAndroid Build Coastguard Worker  %shl = shl <16 x i16> %r, %a
304*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %shl
305*9880d681SAndroid Build Coastguard Worker}
306*9880d681SAndroid Build Coastguard Worker
307*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @shl_32i8(<32 x i8> %r, <32 x i8> %a) nounwind {
308*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shl_32i8:
309*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsllw $5, %ymm1, %ymm1
311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsllw $4, %ymm0, %ymm2
312*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
313*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
314*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsllw $2, %ymm0, %ymm2
315*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
316*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
317*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
318*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
320*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
321*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
322*9880d681SAndroid Build Coastguard Worker  %shl = shl <32 x i8> %r, %a
323*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %shl
324*9880d681SAndroid Build Coastguard Worker}
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @ashr_8i16(<8 x i16> %r, <8 x i16> %a) nounwind {
327*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ashr_8i16:
328*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
329*9880d681SAndroid Build Coastguard Worker; CHECK-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
330*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpmovsxwd %xmm0, %ymm0
331*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
332*9880d681SAndroid Build Coastguard Worker; CHECK-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
333*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
334*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
335*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vzeroupper
336*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
337*9880d681SAndroid Build Coastguard Worker  %ashr = ashr <8 x i16> %r, %a
338*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %ashr
339*9880d681SAndroid Build Coastguard Worker}
340*9880d681SAndroid Build Coastguard Worker
341*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @ashr_16i16(<16 x i16> %r, <16 x i16> %a) nounwind {
342*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ashr_16i16:
343*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
344*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpxor %ymm2, %ymm2, %ymm2
345*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
346*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
347*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsravd %ymm3, %ymm4, %ymm3
348*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrld $16, %ymm3, %ymm3
349*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
350*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
351*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
352*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrld $16, %ymm0, %ymm0
353*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
354*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
355*9880d681SAndroid Build Coastguard Worker  %ashr = ashr <16 x i16> %r, %a
356*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %ashr
357*9880d681SAndroid Build Coastguard Worker}
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @ashr_32i8(<32 x i8> %r, <32 x i8> %a) nounwind {
360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ashr_32i8:
361*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
362*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsllw $5, %ymm1, %ymm1
363*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
364*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
365*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsraw $4, %ymm3, %ymm4
366*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
367*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsraw $2, %ymm3, %ymm4
368*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
369*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
370*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsraw $1, %ymm3, %ymm4
371*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
372*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
373*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlw $8, %ymm2, %ymm2
374*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
375*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
376*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsraw $4, %ymm0, %ymm3
377*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
378*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsraw $2, %ymm0, %ymm3
379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
380*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsraw $1, %ymm0, %ymm3
382*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
383*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
384*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlw $8, %ymm0, %ymm0
385*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
386*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
387*9880d681SAndroid Build Coastguard Worker  %ashr = ashr <32 x i8> %r, %a
388*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %ashr
389*9880d681SAndroid Build Coastguard Worker}
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @lshr_8i16(<8 x i16> %r, <8 x i16> %a) nounwind {
392*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: lshr_8i16:
393*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
394*9880d681SAndroid Build Coastguard Worker; CHECK-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
395*9880d681SAndroid Build Coastguard Worker; CHECK-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
396*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
397*9880d681SAndroid Build Coastguard Worker; CHECK-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
398*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
399*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
400*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vzeroupper
401*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
402*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <8 x i16> %r, %a
403*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %lshr
404*9880d681SAndroid Build Coastguard Worker}
405*9880d681SAndroid Build Coastguard Worker
406*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @lshr_16i16(<16 x i16> %r, <16 x i16> %a) nounwind {
407*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: lshr_16i16:
408*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
409*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpxor %ymm2, %ymm2, %ymm2
410*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
411*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
412*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlvd %ymm3, %ymm4, %ymm3
413*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrld $16, %ymm3, %ymm3
414*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
415*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
416*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
417*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrld $16, %ymm0, %ymm0
418*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
419*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
420*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <16 x i16> %r, %a
421*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %lshr
422*9880d681SAndroid Build Coastguard Worker}
423*9880d681SAndroid Build Coastguard Worker
424*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @lshr_32i8(<32 x i8> %r, <32 x i8> %a) nounwind {
425*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: lshr_32i8:
426*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
427*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsllw $5, %ymm1, %ymm1
428*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlw $4, %ymm0, %ymm2
429*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
430*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
431*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlw $2, %ymm0, %ymm2
432*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
433*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
434*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
435*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpsrlw $1, %ymm0, %ymm2
436*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
437*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
438*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
439*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
440*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <32 x i8> %r, %a
441*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %lshr
442*9880d681SAndroid Build Coastguard Worker}
443