xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/avx2-shift.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=core-avx2 -mattr=+avx2 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; CHECK: variable_shl0
4*9880d681SAndroid Build Coastguard Worker; CHECK: psllvd
5*9880d681SAndroid Build Coastguard Worker; CHECK: ret
6*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @variable_shl0(<4 x i32> %x, <4 x i32> %y) {
7*9880d681SAndroid Build Coastguard Worker  %k = shl <4 x i32> %x, %y
8*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %k
9*9880d681SAndroid Build Coastguard Worker}
10*9880d681SAndroid Build Coastguard Worker; CHECK: variable_shl1
11*9880d681SAndroid Build Coastguard Worker; CHECK: psllvd
12*9880d681SAndroid Build Coastguard Worker; CHECK: ret
13*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @variable_shl1(<8 x i32> %x, <8 x i32> %y) {
14*9880d681SAndroid Build Coastguard Worker  %k = shl <8 x i32> %x, %y
15*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %k
16*9880d681SAndroid Build Coastguard Worker}
17*9880d681SAndroid Build Coastguard Worker; CHECK: variable_shl2
18*9880d681SAndroid Build Coastguard Worker; CHECK: psllvq
19*9880d681SAndroid Build Coastguard Worker; CHECK: ret
20*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @variable_shl2(<2 x i64> %x, <2 x i64> %y) {
21*9880d681SAndroid Build Coastguard Worker  %k = shl <2 x i64> %x, %y
22*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %k
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker; CHECK: variable_shl3
25*9880d681SAndroid Build Coastguard Worker; CHECK: psllvq
26*9880d681SAndroid Build Coastguard Worker; CHECK: ret
27*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @variable_shl3(<4 x i64> %x, <4 x i64> %y) {
28*9880d681SAndroid Build Coastguard Worker  %k = shl <4 x i64> %x, %y
29*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %k
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker; CHECK: variable_srl0
32*9880d681SAndroid Build Coastguard Worker; CHECK: psrlvd
33*9880d681SAndroid Build Coastguard Worker; CHECK: ret
34*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @variable_srl0(<4 x i32> %x, <4 x i32> %y) {
35*9880d681SAndroid Build Coastguard Worker  %k = lshr <4 x i32> %x, %y
36*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %k
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker; CHECK: variable_srl1
39*9880d681SAndroid Build Coastguard Worker; CHECK: psrlvd
40*9880d681SAndroid Build Coastguard Worker; CHECK: ret
41*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @variable_srl1(<8 x i32> %x, <8 x i32> %y) {
42*9880d681SAndroid Build Coastguard Worker  %k = lshr <8 x i32> %x, %y
43*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %k
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker; CHECK: variable_srl2
46*9880d681SAndroid Build Coastguard Worker; CHECK: psrlvq
47*9880d681SAndroid Build Coastguard Worker; CHECK: ret
48*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @variable_srl2(<2 x i64> %x, <2 x i64> %y) {
49*9880d681SAndroid Build Coastguard Worker  %k = lshr <2 x i64> %x, %y
50*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %k
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker; CHECK: variable_srl3
53*9880d681SAndroid Build Coastguard Worker; CHECK: psrlvq
54*9880d681SAndroid Build Coastguard Worker; CHECK: ret
55*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @variable_srl3(<4 x i64> %x, <4 x i64> %y) {
56*9880d681SAndroid Build Coastguard Worker  %k = lshr <4 x i64> %x, %y
57*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %k
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; CHECK: variable_sra0
61*9880d681SAndroid Build Coastguard Worker; CHECK: vpsravd
62*9880d681SAndroid Build Coastguard Worker; CHECK: ret
63*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @variable_sra0(<4 x i32> %x, <4 x i32> %y) {
64*9880d681SAndroid Build Coastguard Worker  %k = ashr <4 x i32> %x, %y
65*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %k
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker; CHECK: variable_sra1
68*9880d681SAndroid Build Coastguard Worker; CHECK: vpsravd
69*9880d681SAndroid Build Coastguard Worker; CHECK: ret
70*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @variable_sra1(<8 x i32> %x, <8 x i32> %y) {
71*9880d681SAndroid Build Coastguard Worker  %k = ashr <8 x i32> %x, %y
72*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %k
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker;;; Shift left
76*9880d681SAndroid Build Coastguard Worker; CHECK: vpslld
77*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @vshift00(<8 x i32> %a) nounwind readnone {
78*9880d681SAndroid Build Coastguard Worker  %s = shl <8 x i32> %a, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32
79*9880d681SAndroid Build Coastguard Worker2>
80*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %s
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllw
84*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @vshift01(<16 x i16> %a) nounwind readnone {
85*9880d681SAndroid Build Coastguard Worker  %s = shl <16 x i16> %a, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
86*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %s
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllq
90*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @vshift02(<4 x i64> %a) nounwind readnone {
91*9880d681SAndroid Build Coastguard Worker  %s = shl <4 x i64> %a, <i64 2, i64 2, i64 2, i64 2>
92*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %s
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker;;; Logical Shift right
96*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrld
97*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @vshift03(<8 x i32> %a) nounwind readnone {
98*9880d681SAndroid Build Coastguard Worker  %s = lshr <8 x i32> %a, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32
99*9880d681SAndroid Build Coastguard Worker2>
100*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %s
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlw
104*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @vshift04(<16 x i16> %a) nounwind readnone {
105*9880d681SAndroid Build Coastguard Worker  %s = lshr <16 x i16> %a, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
106*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %s
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlq
110*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @vshift05(<4 x i64> %a) nounwind readnone {
111*9880d681SAndroid Build Coastguard Worker  %s = lshr <4 x i64> %a, <i64 2, i64 2, i64 2, i64 2>
112*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %s
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker;;; Arithmetic Shift right
116*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrad
117*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @vshift06(<8 x i32> %a) nounwind readnone {
118*9880d681SAndroid Build Coastguard Worker  %s = ashr <8 x i32> %a, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32
119*9880d681SAndroid Build Coastguard Worker2>
120*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %s
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; CHECK: vpsraw
124*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @vshift07(<16 x i16> %a) nounwind readnone {
125*9880d681SAndroid Build Coastguard Worker  %s = ashr <16 x i16> %a, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
126*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %s
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker; CHECK: variable_sra0_load
130*9880d681SAndroid Build Coastguard Worker; CHECK: vpsravd (%
131*9880d681SAndroid Build Coastguard Worker; CHECK: ret
132*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @variable_sra0_load(<4 x i32> %x, <4 x i32>* %y) {
133*9880d681SAndroid Build Coastguard Worker  %y1 = load <4 x i32>, <4 x i32>* %y
134*9880d681SAndroid Build Coastguard Worker  %k = ashr <4 x i32> %x, %y1
135*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %k
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker; CHECK: variable_sra1_load
139*9880d681SAndroid Build Coastguard Worker; CHECK: vpsravd (%
140*9880d681SAndroid Build Coastguard Worker; CHECK: ret
141*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @variable_sra1_load(<8 x i32> %x, <8 x i32>* %y) {
142*9880d681SAndroid Build Coastguard Worker  %y1 = load <8 x i32>, <8 x i32>* %y
143*9880d681SAndroid Build Coastguard Worker  %k = ashr <8 x i32> %x, %y1
144*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %k
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; CHECK: variable_shl0_load
148*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllvd (%
149*9880d681SAndroid Build Coastguard Worker; CHECK: ret
150*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @variable_shl0_load(<4 x i32> %x, <4 x i32>* %y) {
151*9880d681SAndroid Build Coastguard Worker  %y1 = load <4 x i32>, <4 x i32>* %y
152*9880d681SAndroid Build Coastguard Worker  %k = shl <4 x i32> %x, %y1
153*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %k
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker; CHECK: variable_shl1_load
156*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllvd (%
157*9880d681SAndroid Build Coastguard Worker; CHECK: ret
158*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @variable_shl1_load(<8 x i32> %x, <8 x i32>* %y) {
159*9880d681SAndroid Build Coastguard Worker  %y1 = load <8 x i32>, <8 x i32>* %y
160*9880d681SAndroid Build Coastguard Worker  %k = shl <8 x i32> %x, %y1
161*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %k
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker; CHECK: variable_shl2_load
164*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllvq (%
165*9880d681SAndroid Build Coastguard Worker; CHECK: ret
166*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @variable_shl2_load(<2 x i64> %x, <2 x i64>* %y) {
167*9880d681SAndroid Build Coastguard Worker  %y1 = load <2 x i64>, <2 x i64>* %y
168*9880d681SAndroid Build Coastguard Worker  %k = shl <2 x i64> %x, %y1
169*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %k
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker; CHECK: variable_shl3_load
172*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllvq (%
173*9880d681SAndroid Build Coastguard Worker; CHECK: ret
174*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @variable_shl3_load(<4 x i64> %x, <4 x i64>* %y) {
175*9880d681SAndroid Build Coastguard Worker  %y1 = load <4 x i64>, <4 x i64>* %y
176*9880d681SAndroid Build Coastguard Worker  %k = shl <4 x i64> %x, %y1
177*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %k
178*9880d681SAndroid Build Coastguard Worker}
179*9880d681SAndroid Build Coastguard Worker; CHECK: variable_srl0_load
180*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlvd (%
181*9880d681SAndroid Build Coastguard Worker; CHECK: ret
182*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @variable_srl0_load(<4 x i32> %x, <4 x i32>* %y) {
183*9880d681SAndroid Build Coastguard Worker  %y1 = load <4 x i32>, <4 x i32>* %y
184*9880d681SAndroid Build Coastguard Worker  %k = lshr <4 x i32> %x, %y1
185*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %k
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker; CHECK: variable_srl1_load
188*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlvd (%
189*9880d681SAndroid Build Coastguard Worker; CHECK: ret
190*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @variable_srl1_load(<8 x i32> %x, <8 x i32>* %y) {
191*9880d681SAndroid Build Coastguard Worker  %y1 = load <8 x i32>, <8 x i32>* %y
192*9880d681SAndroid Build Coastguard Worker  %k = lshr <8 x i32> %x, %y1
193*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %k
194*9880d681SAndroid Build Coastguard Worker}
195*9880d681SAndroid Build Coastguard Worker; CHECK: variable_srl2_load
196*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlvq (%
197*9880d681SAndroid Build Coastguard Worker; CHECK: ret
198*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @variable_srl2_load(<2 x i64> %x, <2 x i64>* %y) {
199*9880d681SAndroid Build Coastguard Worker  %y1 = load <2 x i64>, <2 x i64>* %y
200*9880d681SAndroid Build Coastguard Worker  %k = lshr <2 x i64> %x, %y1
201*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %k
202*9880d681SAndroid Build Coastguard Worker}
203*9880d681SAndroid Build Coastguard Worker; CHECK: variable_srl3_load
204*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlvq (%
205*9880d681SAndroid Build Coastguard Worker; CHECK: ret
206*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @variable_srl3_load(<4 x i64> %x, <4 x i64>* %y) {
207*9880d681SAndroid Build Coastguard Worker  %y1 = load <4 x i64>, <4 x i64>* %y
208*9880d681SAndroid Build Coastguard Worker  %k = lshr <4 x i64> %x, %y1
209*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %k
210*9880d681SAndroid Build Coastguard Worker}
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @shl9(<32 x i8> %A) nounwind {
213*9880d681SAndroid Build Coastguard Worker  %B = shl <32 x i8> %A, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
214*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %B
215*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shl9:
216*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllw $3
217*9880d681SAndroid Build Coastguard Worker; CHECK: vpand
218*9880d681SAndroid Build Coastguard Worker; CHECK: ret
219*9880d681SAndroid Build Coastguard Worker}
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @shr9(<32 x i8> %A) nounwind {
222*9880d681SAndroid Build Coastguard Worker  %B = lshr <32 x i8> %A, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
223*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %B
224*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shr9:
225*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlw $3
226*9880d681SAndroid Build Coastguard Worker; CHECK: vpand
227*9880d681SAndroid Build Coastguard Worker; CHECK: ret
228*9880d681SAndroid Build Coastguard Worker}
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @sra_v32i8_7(<32 x i8> %A) nounwind {
231*9880d681SAndroid Build Coastguard Worker  %B = ashr <32 x i8> %A, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
232*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %B
233*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sra_v32i8_7:
234*9880d681SAndroid Build Coastguard Worker; CHECK: vpxor
235*9880d681SAndroid Build Coastguard Worker; CHECK: vpcmpgtb
236*9880d681SAndroid Build Coastguard Worker; CHECK: ret
237*9880d681SAndroid Build Coastguard Worker}
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @sra_v32i8(<32 x i8> %A) nounwind {
240*9880d681SAndroid Build Coastguard Worker  %B = ashr <32 x i8> %A, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
241*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %B
242*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sra_v32i8:
243*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlw $3
244*9880d681SAndroid Build Coastguard Worker; CHECK: vpand
245*9880d681SAndroid Build Coastguard Worker; CHECK: vpxor
246*9880d681SAndroid Build Coastguard Worker; CHECK: vpsubb
247*9880d681SAndroid Build Coastguard Worker; CHECK: ret
248*9880d681SAndroid Build Coastguard Worker}
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker; CHECK: _sext_v16i16
251*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllw
252*9880d681SAndroid Build Coastguard Worker; CHECK: vpsraw
253*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vinsertf128
254*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @sext_v16i16(<16 x i16> %a) nounwind {
255*9880d681SAndroid Build Coastguard Worker  %b = trunc <16 x i16> %a to <16 x i8>
256*9880d681SAndroid Build Coastguard Worker  %c = sext <16 x i8> %b to <16 x i16>
257*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %c
258*9880d681SAndroid Build Coastguard Worker}
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker; CHECK: _sext_v8i32
261*9880d681SAndroid Build Coastguard Worker; CHECK: vpslld
262*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrad
263*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vinsertf128
264*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @sext_v8i32(<8 x i32> %a) nounwind {
265*9880d681SAndroid Build Coastguard Worker  %b = trunc <8 x i32> %a to <8 x i16>
266*9880d681SAndroid Build Coastguard Worker  %c = sext <8 x i16> %b to <8 x i32>
267*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %c
268*9880d681SAndroid Build Coastguard Worker}
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @variable_shl16(<8 x i16> %lhs, <8  x i16> %rhs) {
271*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_shl16:
272*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpmovzxwd %xmm1, [[AMT:%ymm[0-9]+]]
273*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpmovzxwd %xmm0, [[LHS:%ymm[0-9]+]]
274*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllvd [[AMT]], [[LHS]], {{%ymm[0-9]+}}
275*9880d681SAndroid Build Coastguard Worker; CHECK: vpshufb
276*9880d681SAndroid Build Coastguard Worker; CHECK: vpermq
277*9880d681SAndroid Build Coastguard Worker  %res = shl <8 x i16> %lhs, %rhs
278*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %res
279*9880d681SAndroid Build Coastguard Worker}
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @variable_ashr16(<8 x i16> %lhs, <8  x i16> %rhs) {
282*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_ashr16:
283*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpmovzxwd %xmm1, [[AMT:%ymm[0-9]+]]
284*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpmovsxwd %xmm0, [[LHS:%ymm[0-9]+]]
285*9880d681SAndroid Build Coastguard Worker; CHECK: vpsravd [[AMT]], [[LHS]], {{%ymm[0-9]+}}
286*9880d681SAndroid Build Coastguard Worker; CHECK: vpshufb
287*9880d681SAndroid Build Coastguard Worker; CHECK: vpermq
288*9880d681SAndroid Build Coastguard Worker  %res = ashr <8 x i16> %lhs, %rhs
289*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %res
290*9880d681SAndroid Build Coastguard Worker}
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @variable_lshr16(<8 x i16> %lhs, <8  x i16> %rhs) {
293*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_lshr16:
294*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpmovzxwd %xmm1, [[AMT:%ymm[0-9]+]]
295*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpmovzxwd %xmm0, [[LHS:%ymm[0-9]+]]
296*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlvd [[AMT]], [[LHS]], {{%ymm[0-9]+}}
297*9880d681SAndroid Build Coastguard Worker; CHECK: vpshufb
298*9880d681SAndroid Build Coastguard Worker; CHECK: vpermq
299*9880d681SAndroid Build Coastguard Worker  %res = lshr <8 x i16> %lhs, %rhs
300*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %res
301*9880d681SAndroid Build Coastguard Worker}