xref: /llvm-project/llvm/test/CodeGen/Thumb2/mve-intrinsics/scalar-shifts.ll (revision 254b4f250007ef9f2d2377eb912963beafa39754)
1ceeff95cSSimon Tatham; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*254b4f25SSimon Tatham; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve -verify-machineinstrs -o - %s | FileCheck %s
3ceeff95cSSimon Tatham
4*254b4f25SSimon Tathamdefine i64 @test_asrl(i64 %value, i32 %shift) {
5*254b4f25SSimon Tatham; CHECK-LABEL: test_asrl:
6*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
7*254b4f25SSimon Tatham; CHECK-NEXT:    asrl r0, r1, r2
8*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
9*254b4f25SSimon Tathamentry:
10*254b4f25SSimon Tatham  %0 = lshr i64 %value, 32
11*254b4f25SSimon Tatham  %1 = trunc i64 %0 to i32
12*254b4f25SSimon Tatham  %2 = trunc i64 %value to i32
13*254b4f25SSimon Tatham  %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 %shift)
14*254b4f25SSimon Tatham  %4 = extractvalue { i32, i32 } %3, 1
15*254b4f25SSimon Tatham  %5 = zext i32 %4 to i64
16*254b4f25SSimon Tatham  %6 = shl i64 %5, 32
17*254b4f25SSimon Tatham  %7 = extractvalue { i32, i32 } %3, 0
18*254b4f25SSimon Tatham  %8 = zext i32 %7 to i64
19*254b4f25SSimon Tatham  %9 = or i64 %6, %8
20*254b4f25SSimon Tatham  ret i64 %9
21*254b4f25SSimon Tatham}
22*254b4f25SSimon Tatham
23*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.asrl(i32, i32, i32)
24*254b4f25SSimon Tatham
25*254b4f25SSimon Tathamdefine i64 @test_lsll(i64 %value, i32 %shift) {
26*254b4f25SSimon Tatham; CHECK-LABEL: test_lsll:
27*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
28*254b4f25SSimon Tatham; CHECK-NEXT:    lsll r0, r1, r2
29*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
30*254b4f25SSimon Tathamentry:
31*254b4f25SSimon Tatham  %0 = lshr i64 %value, 32
32*254b4f25SSimon Tatham  %1 = trunc i64 %0 to i32
33*254b4f25SSimon Tatham  %2 = trunc i64 %value to i32
34*254b4f25SSimon Tatham  %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 %shift)
35*254b4f25SSimon Tatham  %4 = extractvalue { i32, i32 } %3, 1
36*254b4f25SSimon Tatham  %5 = zext i32 %4 to i64
37*254b4f25SSimon Tatham  %6 = shl i64 %5, 32
38*254b4f25SSimon Tatham  %7 = extractvalue { i32, i32 } %3, 0
39*254b4f25SSimon Tatham  %8 = zext i32 %7 to i64
40*254b4f25SSimon Tatham  %9 = or i64 %6, %8
41*254b4f25SSimon Tatham  ret i64 %9
42*254b4f25SSimon Tatham}
43*254b4f25SSimon Tatham
44*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.lsll(i32, i32, i32)
45*254b4f25SSimon Tatham
46*254b4f25SSimon Tathamdefine i32 @test_sqrshr(i32 %value, i32 %shift) {
47*254b4f25SSimon Tatham; CHECK-LABEL: test_sqrshr:
48*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
49*254b4f25SSimon Tatham; CHECK-NEXT:    sqrshr r0, r1
50*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
51*254b4f25SSimon Tathamentry:
52*254b4f25SSimon Tatham  %0 = call i32 @llvm.arm.mve.sqrshr(i32 %value, i32 %shift)
53*254b4f25SSimon Tatham  ret i32 %0
54*254b4f25SSimon Tatham}
55*254b4f25SSimon Tatham
56*254b4f25SSimon Tathamdeclare i32 @llvm.arm.mve.sqrshr(i32, i32)
57*254b4f25SSimon Tatham
58*254b4f25SSimon Tathamdefine i64 @test_sqrshrl(i64 %value, i32 %shift) {
59*254b4f25SSimon Tatham; CHECK-LABEL: test_sqrshrl:
60*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
61*254b4f25SSimon Tatham; CHECK-NEXT:    sqrshrl r0, r1, #64, r2
62*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
63*254b4f25SSimon Tathamentry:
64*254b4f25SSimon Tatham  %0 = lshr i64 %value, 32
65*254b4f25SSimon Tatham  %1 = trunc i64 %0 to i32
66*254b4f25SSimon Tatham  %2 = trunc i64 %value to i32
67*254b4f25SSimon Tatham  %3 = call { i32, i32 } @llvm.arm.mve.sqrshrl(i32 %2, i32 %1, i32 %shift, i32 64)
68*254b4f25SSimon Tatham  %4 = extractvalue { i32, i32 } %3, 1
69*254b4f25SSimon Tatham  %5 = zext i32 %4 to i64
70*254b4f25SSimon Tatham  %6 = shl i64 %5, 32
71*254b4f25SSimon Tatham  %7 = extractvalue { i32, i32 } %3, 0
72*254b4f25SSimon Tatham  %8 = zext i32 %7 to i64
73*254b4f25SSimon Tatham  %9 = or i64 %6, %8
74*254b4f25SSimon Tatham  ret i64 %9
75*254b4f25SSimon Tatham}
76*254b4f25SSimon Tatham
77*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.sqrshrl(i32, i32, i32, i32)
78*254b4f25SSimon Tatham
79*254b4f25SSimon Tathamdefine i64 @test_sqrshrl_sat48(i64 %value, i32 %shift) {
80*254b4f25SSimon Tatham; CHECK-LABEL: test_sqrshrl_sat48:
81*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
82*254b4f25SSimon Tatham; CHECK-NEXT:    sqrshrl r0, r1, #48, r2
83*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
84*254b4f25SSimon Tathamentry:
85*254b4f25SSimon Tatham  %0 = lshr i64 %value, 32
86*254b4f25SSimon Tatham  %1 = trunc i64 %0 to i32
87*254b4f25SSimon Tatham  %2 = trunc i64 %value to i32
88*254b4f25SSimon Tatham  %3 = call { i32, i32 } @llvm.arm.mve.sqrshrl(i32 %2, i32 %1, i32 %shift, i32 48)
89*254b4f25SSimon Tatham  %4 = extractvalue { i32, i32 } %3, 1
90*254b4f25SSimon Tatham  %5 = zext i32 %4 to i64
91*254b4f25SSimon Tatham  %6 = shl i64 %5, 32
92*254b4f25SSimon Tatham  %7 = extractvalue { i32, i32 } %3, 0
93*254b4f25SSimon Tatham  %8 = zext i32 %7 to i64
94*254b4f25SSimon Tatham  %9 = or i64 %6, %8
95*254b4f25SSimon Tatham  ret i64 %9
96*254b4f25SSimon Tatham}
97*254b4f25SSimon Tatham
98*254b4f25SSimon Tathamdefine i32 @test_sqshl(i32 %value) {
99*254b4f25SSimon Tatham; CHECK-LABEL: test_sqshl:
100*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
101*254b4f25SSimon Tatham; CHECK-NEXT:    sqshl r0, #2
102*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
103*254b4f25SSimon Tathamentry:
104*254b4f25SSimon Tatham  %0 = call i32 @llvm.arm.mve.sqshl(i32 %value, i32 2)
105*254b4f25SSimon Tatham  ret i32 %0
106*254b4f25SSimon Tatham}
107*254b4f25SSimon Tatham
108*254b4f25SSimon Tathamdeclare i32 @llvm.arm.mve.sqshl(i32, i32)
109*254b4f25SSimon Tatham
110*254b4f25SSimon Tathamdefine i64 @test_sqshll(i64 %value) {
111*254b4f25SSimon Tatham; CHECK-LABEL: test_sqshll:
112*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
113*254b4f25SSimon Tatham; CHECK-NEXT:    sqshll r0, r1, #17
114*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
115*254b4f25SSimon Tathamentry:
116*254b4f25SSimon Tatham  %0 = lshr i64 %value, 32
117*254b4f25SSimon Tatham  %1 = trunc i64 %0 to i32
118*254b4f25SSimon Tatham  %2 = trunc i64 %value to i32
119*254b4f25SSimon Tatham  %3 = call { i32, i32 } @llvm.arm.mve.sqshll(i32 %2, i32 %1, i32 17)
120*254b4f25SSimon Tatham  %4 = extractvalue { i32, i32 } %3, 1
121*254b4f25SSimon Tatham  %5 = zext i32 %4 to i64
122*254b4f25SSimon Tatham  %6 = shl i64 %5, 32
123*254b4f25SSimon Tatham  %7 = extractvalue { i32, i32 } %3, 0
124*254b4f25SSimon Tatham  %8 = zext i32 %7 to i64
125*254b4f25SSimon Tatham  %9 = or i64 %6, %8
126*254b4f25SSimon Tatham  ret i64 %9
127*254b4f25SSimon Tatham}
128*254b4f25SSimon Tatham
129*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.sqshll(i32, i32, i32)
130*254b4f25SSimon Tatham
131*254b4f25SSimon Tathamdefine i32 @test_srshr(i32 %value) {
132*254b4f25SSimon Tatham; CHECK-LABEL: test_srshr:
133*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
134*254b4f25SSimon Tatham; CHECK-NEXT:    srshr r0, #6
135*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
136*254b4f25SSimon Tathamentry:
137*254b4f25SSimon Tatham  %0 = call i32 @llvm.arm.mve.srshr(i32 %value, i32 6)
138*254b4f25SSimon Tatham  ret i32 %0
139*254b4f25SSimon Tatham}
140*254b4f25SSimon Tatham
141*254b4f25SSimon Tathamdeclare i32 @llvm.arm.mve.srshr(i32, i32)
142*254b4f25SSimon Tatham
143*254b4f25SSimon Tathamdefine i64 @test_srshrl(i64 %value) {
144*254b4f25SSimon Tatham; CHECK-LABEL: test_srshrl:
145*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
146*254b4f25SSimon Tatham; CHECK-NEXT:    srshrl r0, r1, #26
147*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
148*254b4f25SSimon Tathamentry:
149*254b4f25SSimon Tatham  %0 = lshr i64 %value, 32
150*254b4f25SSimon Tatham  %1 = trunc i64 %0 to i32
151*254b4f25SSimon Tatham  %2 = trunc i64 %value to i32
152*254b4f25SSimon Tatham  %3 = call { i32, i32 } @llvm.arm.mve.srshrl(i32 %2, i32 %1, i32 26)
153*254b4f25SSimon Tatham  %4 = extractvalue { i32, i32 } %3, 1
154*254b4f25SSimon Tatham  %5 = zext i32 %4 to i64
155*254b4f25SSimon Tatham  %6 = shl i64 %5, 32
156*254b4f25SSimon Tatham  %7 = extractvalue { i32, i32 } %3, 0
157*254b4f25SSimon Tatham  %8 = zext i32 %7 to i64
158*254b4f25SSimon Tatham  %9 = or i64 %6, %8
159*254b4f25SSimon Tatham  ret i64 %9
160*254b4f25SSimon Tatham}
161*254b4f25SSimon Tatham
162*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.srshrl(i32, i32, i32)
163*254b4f25SSimon Tatham
164*254b4f25SSimon Tathamdefine i32 @test_uqrshl(i32 %value, i32 %shift) {
165*254b4f25SSimon Tatham; CHECK-LABEL: test_uqrshl:
166*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
167*254b4f25SSimon Tatham; CHECK-NEXT:    uqrshl r0, r1
168*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
169*254b4f25SSimon Tathamentry:
170*254b4f25SSimon Tatham  %0 = call i32 @llvm.arm.mve.uqrshl(i32 %value, i32 %shift)
171*254b4f25SSimon Tatham  ret i32 %0
172*254b4f25SSimon Tatham}
173*254b4f25SSimon Tatham
174*254b4f25SSimon Tathamdeclare i32 @llvm.arm.mve.uqrshl(i32, i32)
175*254b4f25SSimon Tatham
176*254b4f25SSimon Tathamdefine i64 @test_uqrshll(i64 %value, i32 %shift) {
177*254b4f25SSimon Tatham; CHECK-LABEL: test_uqrshll:
178*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
179*254b4f25SSimon Tatham; CHECK-NEXT:    uqrshll r0, r1, #64, r2
180*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
181*254b4f25SSimon Tathamentry:
182*254b4f25SSimon Tatham  %0 = lshr i64 %value, 32
183*254b4f25SSimon Tatham  %1 = trunc i64 %0 to i32
184*254b4f25SSimon Tatham  %2 = trunc i64 %value to i32
185*254b4f25SSimon Tatham  %3 = call { i32, i32 } @llvm.arm.mve.uqrshll(i32 %2, i32 %1, i32 %shift, i32 64)
186*254b4f25SSimon Tatham  %4 = extractvalue { i32, i32 } %3, 1
187*254b4f25SSimon Tatham  %5 = zext i32 %4 to i64
188*254b4f25SSimon Tatham  %6 = shl i64 %5, 32
189*254b4f25SSimon Tatham  %7 = extractvalue { i32, i32 } %3, 0
190*254b4f25SSimon Tatham  %8 = zext i32 %7 to i64
191*254b4f25SSimon Tatham  %9 = or i64 %6, %8
192*254b4f25SSimon Tatham  ret i64 %9
193*254b4f25SSimon Tatham}
194*254b4f25SSimon Tatham
195*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.uqrshll(i32, i32, i32, i32)
196*254b4f25SSimon Tatham
197*254b4f25SSimon Tathamdefine i64 @test_uqrshll_sat48(i64 %value, i32 %shift) {
198*254b4f25SSimon Tatham; CHECK-LABEL: test_uqrshll_sat48:
199*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
200*254b4f25SSimon Tatham; CHECK-NEXT:    uqrshll r0, r1, #48, r2
201*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
202*254b4f25SSimon Tathamentry:
203*254b4f25SSimon Tatham  %0 = lshr i64 %value, 32
204*254b4f25SSimon Tatham  %1 = trunc i64 %0 to i32
205*254b4f25SSimon Tatham  %2 = trunc i64 %value to i32
206*254b4f25SSimon Tatham  %3 = call { i32, i32 } @llvm.arm.mve.uqrshll(i32 %2, i32 %1, i32 %shift, i32 48)
207*254b4f25SSimon Tatham  %4 = extractvalue { i32, i32 } %3, 1
208*254b4f25SSimon Tatham  %5 = zext i32 %4 to i64
209*254b4f25SSimon Tatham  %6 = shl i64 %5, 32
210*254b4f25SSimon Tatham  %7 = extractvalue { i32, i32 } %3, 0
211*254b4f25SSimon Tatham  %8 = zext i32 %7 to i64
212*254b4f25SSimon Tatham  %9 = or i64 %6, %8
213*254b4f25SSimon Tatham  ret i64 %9
214*254b4f25SSimon Tatham}
215*254b4f25SSimon Tatham
216*254b4f25SSimon Tathamdefine i32 @test_uqshl(i32 %value) {
217*254b4f25SSimon Tatham; CHECK-LABEL: test_uqshl:
218*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
219*254b4f25SSimon Tatham; CHECK-NEXT:    uqshl r0, #21
220*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
221*254b4f25SSimon Tathamentry:
222*254b4f25SSimon Tatham  %0 = call i32 @llvm.arm.mve.uqshl(i32 %value, i32 21)
223*254b4f25SSimon Tatham  ret i32 %0
224*254b4f25SSimon Tatham}
225*254b4f25SSimon Tatham
226*254b4f25SSimon Tathamdeclare i32 @llvm.arm.mve.uqshl(i32, i32)
227*254b4f25SSimon Tatham
228*254b4f25SSimon Tathamdefine i64 @test_uqshll(i64 %value) {
229*254b4f25SSimon Tatham; CHECK-LABEL: test_uqshll:
230*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
231*254b4f25SSimon Tatham; CHECK-NEXT:    uqshll r0, r1, #16
232*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
233*254b4f25SSimon Tathamentry:
234*254b4f25SSimon Tatham  %0 = lshr i64 %value, 32
235*254b4f25SSimon Tatham  %1 = trunc i64 %0 to i32
236*254b4f25SSimon Tatham  %2 = trunc i64 %value to i32
237*254b4f25SSimon Tatham  %3 = call { i32, i32 } @llvm.arm.mve.uqshll(i32 %2, i32 %1, i32 16)
238*254b4f25SSimon Tatham  %4 = extractvalue { i32, i32 } %3, 1
239*254b4f25SSimon Tatham  %5 = zext i32 %4 to i64
240*254b4f25SSimon Tatham  %6 = shl i64 %5, 32
241*254b4f25SSimon Tatham  %7 = extractvalue { i32, i32 } %3, 0
242*254b4f25SSimon Tatham  %8 = zext i32 %7 to i64
243*254b4f25SSimon Tatham  %9 = or i64 %6, %8
244*254b4f25SSimon Tatham  ret i64 %9
245*254b4f25SSimon Tatham}
246*254b4f25SSimon Tatham
247*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.uqshll(i32, i32, i32)
248*254b4f25SSimon Tatham
249*254b4f25SSimon Tathamdefine i32 @test_urshr(i32 %value) {
250*254b4f25SSimon Tatham; CHECK-LABEL: test_urshr:
251*254b4f25SSimon Tatham; CHECK:       @ %bb.0: @ %entry
252*254b4f25SSimon Tatham; CHECK-NEXT:    urshr r0, #22
253*254b4f25SSimon Tatham; CHECK-NEXT:    bx lr
254*254b4f25SSimon Tathamentry:
255*254b4f25SSimon Tatham  %0 = call i32 @llvm.arm.mve.urshr(i32 %value, i32 22)
256*254b4f25SSimon Tatham  ret i32 %0
257*254b4f25SSimon Tatham}
258*254b4f25SSimon Tatham
259*254b4f25SSimon Tathamdeclare i32 @llvm.arm.mve.urshr(i32, i32)
260*254b4f25SSimon Tatham
261*254b4f25SSimon Tathamdefine i64 @test_urshrl(i64 %value) {
262ceeff95cSSimon Tatham; CHECK-LABEL: test_urshrl:
263ceeff95cSSimon Tatham; CHECK:       @ %bb.0: @ %entry
264ceeff95cSSimon Tatham; CHECK-NEXT:    urshrl r0, r1, #6
265ceeff95cSSimon Tatham; CHECK-NEXT:    bx lr
266ceeff95cSSimon Tathamentry:
267ceeff95cSSimon Tatham  %0 = lshr i64 %value, 32
268ceeff95cSSimon Tatham  %1 = trunc i64 %0 to i32
269ceeff95cSSimon Tatham  %2 = trunc i64 %value to i32
270*254b4f25SSimon Tatham  %3 = call { i32, i32 } @llvm.arm.mve.urshrl(i32 %2, i32 %1, i32 6)
271ceeff95cSSimon Tatham  %4 = extractvalue { i32, i32 } %3, 1
272ceeff95cSSimon Tatham  %5 = zext i32 %4 to i64
273*254b4f25SSimon Tatham  %6 = shl i64 %5, 32
274ceeff95cSSimon Tatham  %7 = extractvalue { i32, i32 } %3, 0
275ceeff95cSSimon Tatham  %8 = zext i32 %7 to i64
276ceeff95cSSimon Tatham  %9 = or i64 %6, %8
277ceeff95cSSimon Tatham  ret i64 %9
278ceeff95cSSimon Tatham}
279ceeff95cSSimon Tatham
280ceeff95cSSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.urshrl(i32, i32, i32)
281