Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / mve-intrinsics / longshift-const.ll
blob1fbf4e6734ffa7f60439846e2f3a16ef98abde61
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) {
8 ; CHECK-LABEL: asrl_0:
9 ; CHECK:       @ %bb.0: @ %entry
10 ; CHECK-NEXT:    bx lr
11 entry:
12   %0 = lshr i64 %X, 32
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
21   %9 = or i64 %6, %8
22   ret i64 %9
25 define i64 @asrl_23(i64 %X) {
26 ; CHECK-LABEL: asrl_23:
27 ; CHECK:       @ %bb.0: @ %entry
28 ; CHECK-NEXT:    asrl r0, r1, #23
29 ; CHECK-NEXT:    bx lr
30 entry:
31   %0 = lshr i64 %X, 32
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
40   %9 = or i64 %6, %8
41   ret i64 %9
44 define i64 @asrl_32(i64 %X) {
45 ; CHECK-LABEL: asrl_32:
46 ; CHECK:       @ %bb.0: @ %entry
47 ; CHECK-NEXT:    asrl r0, r1, #32
48 ; CHECK-NEXT:    bx lr
49 entry:
50   %0 = lshr i64 %X, 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
59   %9 = or i64 %6, %8
60   ret i64 %9
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
68 ; CHECK-NEXT:    bx lr
69 entry:
70   %0 = lshr i64 %X, 32
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
79   %9 = or i64 %6, %8
80   ret i64 %9
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
88 ; CHECK-NEXT:    bx lr
89 entry:
90   %0 = lshr i64 %X, 32
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
99   %9 = or i64 %6, %8
100   ret i64 %9
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
108 ; CHECK-NEXT:    bx lr
109 entry:
110   %0 = lshr i64 %X, 32
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
119   %9 = or i64 %6, %8
120   ret i64 %9
123 define i64 @asrl_m2(i64 %X) {
124 ; CHECK-LABEL: asrl_m2:
125 ; CHECK:       @ %bb.0: @ %entry
126 ; CHECK-NEXT:    lsll r0, r1, #2
127 ; CHECK-NEXT:    bx lr
128 entry:
129   %0 = lshr i64 %X, 32
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
138   %9 = or i64 %6, %8
139   ret i64 %9
142 define i64 @asrl_m32(i64 %X) {
143 ; CHECK-LABEL: asrl_m32:
144 ; CHECK:       @ %bb.0: @ %entry
145 ; CHECK-NEXT:    lsll r0, r1, #32
146 ; CHECK-NEXT:    bx lr
147 entry:
148   %0 = lshr i64 %X, 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
157   %9 = or i64 %6, %8
158   ret i64 %9
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
166 ; CHECK-NEXT:    bx lr
167 entry:
168   %0 = lshr i64 %X, 32
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
177   %9 = or i64 %6, %8
178   ret i64 %9
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
186 ; CHECK-NEXT:    bx lr
187 entry:
188   %0 = lshr i64 %X, 32
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
197   %9 = or i64 %6, %8
198   ret i64 %9
204 define i64 @lsll_0(i64 %X) {
205 ; CHECK-LABEL: lsll_0:
206 ; CHECK:       @ %bb.0: @ %entry
207 ; CHECK-NEXT:    bx lr
208 entry:
209   %0 = lshr i64 %X, 32
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
218   %9 = or i64 %6, %8
219   ret i64 %9
222 define i64 @lsll_23(i64 %X) {
223 ; CHECK-LABEL: lsll_23:
224 ; CHECK:       @ %bb.0: @ %entry
225 ; CHECK-NEXT:    lsll r0, r1, #23
226 ; CHECK-NEXT:    bx lr
227 entry:
228   %0 = lshr i64 %X, 32
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
237   %9 = or i64 %6, %8
238   ret i64 %9
241 define i64 @lsll_32(i64 %X) {
242 ; CHECK-LABEL: lsll_32:
243 ; CHECK:       @ %bb.0: @ %entry
244 ; CHECK-NEXT:    lsll r0, r1, #32
245 ; CHECK-NEXT:    bx lr
246 entry:
247   %0 = lshr i64 %X, 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
256   %9 = or i64 %6, %8
257   ret i64 %9
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
265 ; CHECK-NEXT:    bx lr
266 entry:
267   %0 = lshr i64 %X, 32
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
276   %9 = or i64 %6, %8
277   ret i64 %9
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
285 ; CHECK-NEXT:    bx lr
286 entry:
287   %0 = lshr i64 %X, 32
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
296   %9 = or i64 %6, %8
297   ret i64 %9
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
305 ; CHECK-NEXT:    bx lr
306 entry:
307   %0 = lshr i64 %X, 32
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
316   %9 = or i64 %6, %8
317   ret i64 %9
320 define i64 @lsll_m2(i64 %X) {
321 ; CHECK-LABEL: lsll_m2:
322 ; CHECK:       @ %bb.0: @ %entry
323 ; CHECK-NEXT:    lsrl r0, r1, #2
324 ; CHECK-NEXT:    bx lr
325 entry:
326   %0 = lshr i64 %X, 32
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
335   %9 = or i64 %6, %8
336   ret i64 %9
339 define i64 @lsll_m32(i64 %X) {
340 ; CHECK-LABEL: lsll_m32:
341 ; CHECK:       @ %bb.0: @ %entry
342 ; CHECK-NEXT:    lsrl r0, r1, #32
343 ; CHECK-NEXT:    bx lr
344 entry:
345   %0 = lshr i64 %X, 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
354   %9 = or i64 %6, %8
355   ret i64 %9
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
363 ; CHECK-NEXT:    bx lr
364 entry:
365   %0 = lshr i64 %X, 32
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
374   %9 = or i64 %6, %8
375   ret i64 %9
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
383 ; CHECK-NEXT:    bx lr
384 entry:
385   %0 = lshr i64 %X, 32
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
394   %9 = or i64 %6, %8
395   ret i64 %9