1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s
4 declare {i32, i32} @llvm.arm.mve.asrl(i32, i32, i32)
5 declare {i32, i32} @llvm.arm.mve.lsll(i32, i32, i32)
7 define i64 @asrl_0(i64 %X) {
9 ; CHECK: @ %bb.0: @ %entry
13 %1 = trunc i64 %0 to i32
14 %2 = trunc i64 %X to i32
15 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 0)
16 %4 = extractvalue { i32, i32 } %3, 1
17 %5 = zext i32 %4 to i64
18 %6 = shl nuw i64 %5, 32
19 %7 = extractvalue { i32, i32 } %3, 0
20 %8 = zext i32 %7 to i64
25 define i64 @asrl_23(i64 %X) {
26 ; CHECK-LABEL: asrl_23:
27 ; CHECK: @ %bb.0: @ %entry
28 ; CHECK-NEXT: asrl r0, r1, #23
32 %1 = trunc i64 %0 to i32
33 %2 = trunc i64 %X to i32
34 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 23)
35 %4 = extractvalue { i32, i32 } %3, 1
36 %5 = zext i32 %4 to i64
37 %6 = shl nuw i64 %5, 32
38 %7 = extractvalue { i32, i32 } %3, 0
39 %8 = zext i32 %7 to i64
44 define i64 @asrl_32(i64 %X) {
45 ; CHECK-LABEL: asrl_32:
46 ; CHECK: @ %bb.0: @ %entry
47 ; CHECK-NEXT: asrl r0, r1, #32
51 %1 = trunc i64 %0 to i32
52 %2 = trunc i64 %X to i32
53 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 32)
54 %4 = extractvalue { i32, i32 } %3, 1
55 %5 = zext i32 %4 to i64
56 %6 = shl nuw i64 %5, 32
57 %7 = extractvalue { i32, i32 } %3, 0
58 %8 = zext i32 %7 to i64
63 define i64 @asrl_33(i64 %X) {
64 ; CHECK-LABEL: asrl_33:
65 ; CHECK: @ %bb.0: @ %entry
66 ; CHECK-NEXT: movs r2, #33
67 ; CHECK-NEXT: asrl r0, r1, r2
71 %1 = trunc i64 %0 to i32
72 %2 = trunc i64 %X to i32
73 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 33)
74 %4 = extractvalue { i32, i32 } %3, 1
75 %5 = zext i32 %4 to i64
76 %6 = shl nuw i64 %5, 32
77 %7 = extractvalue { i32, i32 } %3, 0
78 %8 = zext i32 %7 to i64
83 define i64 @asrl_63(i64 %X) {
84 ; CHECK-LABEL: asrl_63:
85 ; CHECK: @ %bb.0: @ %entry
86 ; CHECK-NEXT: movs r2, #63
87 ; CHECK-NEXT: asrl r0, r1, r2
91 %1 = trunc i64 %0 to i32
92 %2 = trunc i64 %X to i32
93 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 63)
94 %4 = extractvalue { i32, i32 } %3, 1
95 %5 = zext i32 %4 to i64
96 %6 = shl nuw i64 %5, 32
97 %7 = extractvalue { i32, i32 } %3, 0
98 %8 = zext i32 %7 to i64
103 define i64 @asrl_64(i64 %X) {
104 ; CHECK-LABEL: asrl_64:
105 ; CHECK: @ %bb.0: @ %entry
106 ; CHECK-NEXT: movs r2, #64
107 ; CHECK-NEXT: asrl r0, r1, r2
111 %1 = trunc i64 %0 to i32
112 %2 = trunc i64 %X to i32
113 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 64)
114 %4 = extractvalue { i32, i32 } %3, 1
115 %5 = zext i32 %4 to i64
116 %6 = shl nuw i64 %5, 32
117 %7 = extractvalue { i32, i32 } %3, 0
118 %8 = zext i32 %7 to i64
123 define i64 @asrl_m2(i64 %X) {
124 ; CHECK-LABEL: asrl_m2:
125 ; CHECK: @ %bb.0: @ %entry
126 ; CHECK-NEXT: lsll r0, r1, #2
130 %1 = trunc i64 %0 to i32
131 %2 = trunc i64 %X to i32
132 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -2)
133 %4 = extractvalue { i32, i32 } %3, 1
134 %5 = zext i32 %4 to i64
135 %6 = shl nuw i64 %5, 32
136 %7 = extractvalue { i32, i32 } %3, 0
137 %8 = zext i32 %7 to i64
142 define i64 @asrl_m32(i64 %X) {
143 ; CHECK-LABEL: asrl_m32:
144 ; CHECK: @ %bb.0: @ %entry
145 ; CHECK-NEXT: lsll r0, r1, #32
149 %1 = trunc i64 %0 to i32
150 %2 = trunc i64 %X to i32
151 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -32)
152 %4 = extractvalue { i32, i32 } %3, 1
153 %5 = zext i32 %4 to i64
154 %6 = shl nuw i64 %5, 32
155 %7 = extractvalue { i32, i32 } %3, 0
156 %8 = zext i32 %7 to i64
161 define i64 @asrl_m33(i64 %X) {
162 ; CHECK-LABEL: asrl_m33:
163 ; CHECK: @ %bb.0: @ %entry
164 ; CHECK-NEXT: mvn r2, #32
165 ; CHECK-NEXT: asrl r0, r1, r2
169 %1 = trunc i64 %0 to i32
170 %2 = trunc i64 %X to i32
171 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -33)
172 %4 = extractvalue { i32, i32 } %3, 1
173 %5 = zext i32 %4 to i64
174 %6 = shl nuw i64 %5, 32
175 %7 = extractvalue { i32, i32 } %3, 0
176 %8 = zext i32 %7 to i64
181 define i64 @asrl_m64(i64 %X) {
182 ; CHECK-LABEL: asrl_m64:
183 ; CHECK: @ %bb.0: @ %entry
184 ; CHECK-NEXT: mvn r2, #63
185 ; CHECK-NEXT: asrl r0, r1, r2
189 %1 = trunc i64 %0 to i32
190 %2 = trunc i64 %X to i32
191 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 -64)
192 %4 = extractvalue { i32, i32 } %3, 1
193 %5 = zext i32 %4 to i64
194 %6 = shl nuw i64 %5, 32
195 %7 = extractvalue { i32, i32 } %3, 0
196 %8 = zext i32 %7 to i64
204 define i64 @lsll_0(i64 %X) {
205 ; CHECK-LABEL: lsll_0:
206 ; CHECK: @ %bb.0: @ %entry
210 %1 = trunc i64 %0 to i32
211 %2 = trunc i64 %X to i32
212 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 0)
213 %4 = extractvalue { i32, i32 } %3, 1
214 %5 = zext i32 %4 to i64
215 %6 = shl nuw i64 %5, 32
216 %7 = extractvalue { i32, i32 } %3, 0
217 %8 = zext i32 %7 to i64
222 define i64 @lsll_23(i64 %X) {
223 ; CHECK-LABEL: lsll_23:
224 ; CHECK: @ %bb.0: @ %entry
225 ; CHECK-NEXT: lsll r0, r1, #23
229 %1 = trunc i64 %0 to i32
230 %2 = trunc i64 %X to i32
231 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 23)
232 %4 = extractvalue { i32, i32 } %3, 1
233 %5 = zext i32 %4 to i64
234 %6 = shl nuw i64 %5, 32
235 %7 = extractvalue { i32, i32 } %3, 0
236 %8 = zext i32 %7 to i64
241 define i64 @lsll_32(i64 %X) {
242 ; CHECK-LABEL: lsll_32:
243 ; CHECK: @ %bb.0: @ %entry
244 ; CHECK-NEXT: lsll r0, r1, #32
248 %1 = trunc i64 %0 to i32
249 %2 = trunc i64 %X to i32
250 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 32)
251 %4 = extractvalue { i32, i32 } %3, 1
252 %5 = zext i32 %4 to i64
253 %6 = shl nuw i64 %5, 32
254 %7 = extractvalue { i32, i32 } %3, 0
255 %8 = zext i32 %7 to i64
260 define i64 @lsll_33(i64 %X) {
261 ; CHECK-LABEL: lsll_33:
262 ; CHECK: @ %bb.0: @ %entry
263 ; CHECK-NEXT: movs r2, #33
264 ; CHECK-NEXT: lsll r0, r1, r2
268 %1 = trunc i64 %0 to i32
269 %2 = trunc i64 %X to i32
270 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 33)
271 %4 = extractvalue { i32, i32 } %3, 1
272 %5 = zext i32 %4 to i64
273 %6 = shl nuw i64 %5, 32
274 %7 = extractvalue { i32, i32 } %3, 0
275 %8 = zext i32 %7 to i64
280 define i64 @lsll_63(i64 %X) {
281 ; CHECK-LABEL: lsll_63:
282 ; CHECK: @ %bb.0: @ %entry
283 ; CHECK-NEXT: movs r2, #63
284 ; CHECK-NEXT: lsll r0, r1, r2
288 %1 = trunc i64 %0 to i32
289 %2 = trunc i64 %X to i32
290 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 63)
291 %4 = extractvalue { i32, i32 } %3, 1
292 %5 = zext i32 %4 to i64
293 %6 = shl nuw i64 %5, 32
294 %7 = extractvalue { i32, i32 } %3, 0
295 %8 = zext i32 %7 to i64
300 define i64 @lsll_64(i64 %X) {
301 ; CHECK-LABEL: lsll_64:
302 ; CHECK: @ %bb.0: @ %entry
303 ; CHECK-NEXT: movs r2, #64
304 ; CHECK-NEXT: lsll r0, r1, r2
308 %1 = trunc i64 %0 to i32
309 %2 = trunc i64 %X to i32
310 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 64)
311 %4 = extractvalue { i32, i32 } %3, 1
312 %5 = zext i32 %4 to i64
313 %6 = shl nuw i64 %5, 32
314 %7 = extractvalue { i32, i32 } %3, 0
315 %8 = zext i32 %7 to i64
320 define i64 @lsll_m2(i64 %X) {
321 ; CHECK-LABEL: lsll_m2:
322 ; CHECK: @ %bb.0: @ %entry
323 ; CHECK-NEXT: lsrl r0, r1, #2
327 %1 = trunc i64 %0 to i32
328 %2 = trunc i64 %X to i32
329 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -2)
330 %4 = extractvalue { i32, i32 } %3, 1
331 %5 = zext i32 %4 to i64
332 %6 = shl nuw i64 %5, 32
333 %7 = extractvalue { i32, i32 } %3, 0
334 %8 = zext i32 %7 to i64
339 define i64 @lsll_m32(i64 %X) {
340 ; CHECK-LABEL: lsll_m32:
341 ; CHECK: @ %bb.0: @ %entry
342 ; CHECK-NEXT: lsrl r0, r1, #32
346 %1 = trunc i64 %0 to i32
347 %2 = trunc i64 %X to i32
348 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -32)
349 %4 = extractvalue { i32, i32 } %3, 1
350 %5 = zext i32 %4 to i64
351 %6 = shl nuw i64 %5, 32
352 %7 = extractvalue { i32, i32 } %3, 0
353 %8 = zext i32 %7 to i64
358 define i64 @lsll_m33(i64 %X) {
359 ; CHECK-LABEL: lsll_m33:
360 ; CHECK: @ %bb.0: @ %entry
361 ; CHECK-NEXT: mvn r2, #32
362 ; CHECK-NEXT: lsll r0, r1, r2
366 %1 = trunc i64 %0 to i32
367 %2 = trunc i64 %X to i32
368 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -33)
369 %4 = extractvalue { i32, i32 } %3, 1
370 %5 = zext i32 %4 to i64
371 %6 = shl nuw i64 %5, 32
372 %7 = extractvalue { i32, i32 } %3, 0
373 %8 = zext i32 %7 to i64
378 define i64 @lsll_m64(i64 %X) {
379 ; CHECK-LABEL: lsll_m64:
380 ; CHECK: @ %bb.0: @ %entry
381 ; CHECK-NEXT: mvn r2, #63
382 ; CHECK-NEXT: lsll r0, r1, r2
386 %1 = trunc i64 %0 to i32
387 %2 = trunc i64 %X to i32
388 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 -64)
389 %4 = extractvalue { i32, i32 } %3, 1
390 %5 = zext i32 %4 to i64
391 %6 = shl nuw i64 %5, 32
392 %7 = extractvalue { i32, i32 } %3, 0
393 %8 = zext i32 %7 to i64