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