blob: 9a215b3693356e2fce00ad2389c278cc37df34d5 [file] [log] [blame]
Mikhail Maltsev99581fd2019-12-13 13:17:29 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp -verify-machineinstrs -o - %s | FileCheck %s
3
4declare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32)
5declare <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32)
6
7declare { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32, i32, i32, i32, i32, <8 x i16>, <8 x i16>)
8declare { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>)
9declare { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>)
10
11declare { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32, i32, i32, i32, i32, <8 x i16>, <8 x i16>, <8 x i1>)
12declare { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>, <4 x i1>)
13declare { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>, <4 x i1>)
14
15define arm_aapcs_vfpcc i64 @test_vmlaldavaq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) {
16; CHECK-LABEL: test_vmlaldavaq_s16:
17; CHECK: @ %bb.0: @ %entry
18; CHECK-NEXT: vmlalva.s16 r0, r1, q0, q1
19; CHECK-NEXT: bx lr
20entry:
21 %0 = lshr i64 %a, 32
22 %1 = trunc i64 %0 to i32
23 %2 = trunc i64 %a to i32
24 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c)
25 %4 = extractvalue { i32, i32 } %3, 1
26 %5 = zext i32 %4 to i64
27 %6 = shl i64 %5, 32
28 %7 = extractvalue { i32, i32 } %3, 0
29 %8 = zext i32 %7 to i64
30 %9 = or i64 %6, %8
31 ret i64 %9
32}
33
34define arm_aapcs_vfpcc i64 @test_vmlaldavaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {
35; CHECK-LABEL: test_vmlaldavaq_s32:
36; CHECK: @ %bb.0: @ %entry
37; CHECK-NEXT: vmlalva.s32 r0, r1, q0, q1
38; CHECK-NEXT: bx lr
39entry:
40 %0 = lshr i64 %a, 32
41 %1 = trunc i64 %0 to i32
42 %2 = trunc i64 %a to i32
43 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)
44 %4 = extractvalue { i32, i32 } %3, 1
45 %5 = zext i32 %4 to i64
46 %6 = shl i64 %5, 32
47 %7 = extractvalue { i32, i32 } %3, 0
48 %8 = zext i32 %7 to i64
49 %9 = or i64 %6, %8
50 ret i64 %9
51}
52
53define arm_aapcs_vfpcc i64 @test_vmlaldavaq_u16(i64 %a, <8 x i16> %b, <8 x i16> %c) {
54; CHECK-LABEL: test_vmlaldavaq_u16:
55; CHECK: @ %bb.0: @ %entry
56; CHECK-NEXT: vmlalva.u16 r0, r1, q0, q1
57; CHECK-NEXT: bx lr
58entry:
59 %0 = lshr i64 %a, 32
60 %1 = trunc i64 %0 to i32
61 %2 = trunc i64 %a to i32
62 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 1, i32 0, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c)
63 %4 = extractvalue { i32, i32 } %3, 1
64 %5 = zext i32 %4 to i64
65 %6 = shl i64 %5, 32
66 %7 = extractvalue { i32, i32 } %3, 0
67 %8 = zext i32 %7 to i64
68 %9 = or i64 %6, %8
69 ret i64 %9
70}
71
72define arm_aapcs_vfpcc i64 @test_vmlaldavaq_u32(i64 %a, <4 x i32> %b, <4 x i32> %c) {
73; CHECK-LABEL: test_vmlaldavaq_u32:
74; CHECK: @ %bb.0: @ %entry
75; CHECK-NEXT: vmlalva.u32 r0, r1, q0, q1
76; CHECK-NEXT: bx lr
77entry:
78 %0 = lshr i64 %a, 32
79 %1 = trunc i64 %0 to i32
80 %2 = trunc i64 %a to i32
81 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 1, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)
82 %4 = extractvalue { i32, i32 } %3, 1
83 %5 = zext i32 %4 to i64
84 %6 = shl i64 %5, 32
85 %7 = extractvalue { i32, i32 } %3, 0
86 %8 = zext i32 %7 to i64
87 %9 = or i64 %6, %8
88 ret i64 %9
89}
90
91define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) {
92; CHECK-LABEL: test_vmlaldavaxq_s16:
93; CHECK: @ %bb.0: @ %entry
94; CHECK-NEXT: vmlaldavax.s16 r0, r1, q0, q1
95; CHECK-NEXT: bx lr
96entry:
97 %0 = lshr i64 %a, 32
98 %1 = trunc i64 %0 to i32
99 %2 = trunc i64 %a to i32
100 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 1, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c)
101 %4 = extractvalue { i32, i32 } %3, 1
102 %5 = zext i32 %4 to i64
103 %6 = shl i64 %5, 32
104 %7 = extractvalue { i32, i32 } %3, 0
105 %8 = zext i32 %7 to i64
106 %9 = or i64 %6, %8
107 ret i64 %9
108}
109
110define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {
111; CHECK-LABEL: test_vmlaldavaxq_s32:
112; CHECK: @ %bb.0: @ %entry
113; CHECK-NEXT: vmlaldavax.s32 r0, r1, q0, q1
114; CHECK-NEXT: bx lr
115entry:
116 %0 = lshr i64 %a, 32
117 %1 = trunc i64 %0 to i32
118 %2 = trunc i64 %a to i32
119 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 0, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)
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
129define arm_aapcs_vfpcc i64 @test_vmlsldavaq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) {
130; CHECK-LABEL: test_vmlsldavaq_s16:
131; CHECK: @ %bb.0: @ %entry
132; CHECK-NEXT: vmlsldava.s16 r0, r1, q0, q1
133; CHECK-NEXT: bx lr
134entry:
135 %0 = lshr i64 %a, 32
136 %1 = trunc i64 %0 to i32
137 %2 = trunc i64 %a to i32
138 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 1, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c)
139 %4 = extractvalue { i32, i32 } %3, 1
140 %5 = zext i32 %4 to i64
141 %6 = shl i64 %5, 32
142 %7 = extractvalue { i32, i32 } %3, 0
143 %8 = zext i32 %7 to i64
144 %9 = or i64 %6, %8
145 ret i64 %9
146}
147
148define arm_aapcs_vfpcc i64 @test_vmlsldavaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {
149; CHECK-LABEL: test_vmlsldavaq_s32:
150; CHECK: @ %bb.0: @ %entry
151; CHECK-NEXT: vmlsldava.s32 r0, r1, q0, q1
152; CHECK-NEXT: bx lr
153entry:
154 %0 = lshr i64 %a, 32
155 %1 = trunc i64 %0 to i32
156 %2 = trunc i64 %a to i32
157 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 1, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)
158 %4 = extractvalue { i32, i32 } %3, 1
159 %5 = zext i32 %4 to i64
160 %6 = shl i64 %5, 32
161 %7 = extractvalue { i32, i32 } %3, 0
162 %8 = zext i32 %7 to i64
163 %9 = or i64 %6, %8
164 ret i64 %9
165}
166
167define arm_aapcs_vfpcc i64 @test_vmlsldaxvaq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) {
168; CHECK-LABEL: test_vmlsldaxvaq_s16:
169; CHECK: @ %bb.0: @ %entry
170; CHECK-NEXT: vmlsldavax.s16 r0, r1, q0, q1
171; CHECK-NEXT: bx lr
172entry:
173 %0 = lshr i64 %a, 32
174 %1 = trunc i64 %0 to i32
175 %2 = trunc i64 %a to i32
176 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 1, i32 1, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c)
177 %4 = extractvalue { i32, i32 } %3, 1
178 %5 = zext i32 %4 to i64
179 %6 = shl i64 %5, 32
180 %7 = extractvalue { i32, i32 } %3, 0
181 %8 = zext i32 %7 to i64
182 %9 = or i64 %6, %8
183 ret i64 %9
184}
185
186define arm_aapcs_vfpcc i64 @test_vmlsldavaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {
187; CHECK-LABEL: test_vmlsldavaxq_s32:
188; CHECK: @ %bb.0: @ %entry
189; CHECK-NEXT: vmlsldavax.s32 r0, r1, q0, q1
190; CHECK-NEXT: bx lr
191entry:
192 %0 = lshr i64 %a, 32
193 %1 = trunc i64 %0 to i32
194 %2 = trunc i64 %a to i32
195 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 1, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)
196 %4 = extractvalue { i32, i32 } %3, 1
197 %5 = zext i32 %4 to i64
198 %6 = shl i64 %5, 32
199 %7 = extractvalue { i32, i32 } %3, 0
200 %8 = zext i32 %7 to i64
201 %9 = or i64 %6, %8
202 ret i64 %9
203}
204
205define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {
206; CHECK-LABEL: test_vrmlaldavhaq_s32:
207; CHECK: @ %bb.0: @ %entry
208; CHECK-NEXT: vrmlalvha.s32 r0, r1, q0, q1
209; CHECK-NEXT: bx lr
210entry:
211 %0 = lshr i64 %a, 32
212 %1 = trunc i64 %0 to i32
213 %2 = trunc i64 %a to i32
214 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)
215 %4 = extractvalue { i32, i32 } %3, 1
216 %5 = zext i32 %4 to i64
217 %6 = shl i64 %5, 32
218 %7 = extractvalue { i32, i32 } %3, 0
219 %8 = zext i32 %7 to i64
220 %9 = or i64 %6, %8
221 ret i64 %9
222}
223
224define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_u32(i64 %a, <4 x i32> %b, <4 x i32> %c) {
225; CHECK-LABEL: test_vrmlaldavhaq_u32:
226; CHECK: @ %bb.0: @ %entry
227; CHECK-NEXT: vrmlalvha.u32 r0, r1, q0, q1
228; CHECK-NEXT: bx lr
229entry:
230 %0 = lshr i64 %a, 32
231 %1 = trunc i64 %0 to i32
232 %2 = trunc i64 %a to i32
233 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 1, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)
234 %4 = extractvalue { i32, i32 } %3, 1
235 %5 = zext i32 %4 to i64
236 %6 = shl i64 %5, 32
237 %7 = extractvalue { i32, i32 } %3, 0
238 %8 = zext i32 %7 to i64
239 %9 = or i64 %6, %8
240 ret i64 %9
241}
242
243define arm_aapcs_vfpcc i64 @test_vrmlaldavhaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {
244; CHECK-LABEL: test_vrmlaldavhaxq_s32:
245; CHECK: @ %bb.0: @ %entry
246; CHECK-NEXT: vrmlaldavhax.s32 r0, r1, q0, q1
247; CHECK-NEXT: bx lr
248entry:
249 %0 = lshr i64 %a, 32
250 %1 = trunc i64 %0 to i32
251 %2 = trunc i64 %a to i32
252 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 0, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)
253 %4 = extractvalue { i32, i32 } %3, 1
254 %5 = zext i32 %4 to i64
255 %6 = shl i64 %5, 32
256 %7 = extractvalue { i32, i32 } %3, 0
257 %8 = zext i32 %7 to i64
258 %9 = or i64 %6, %8
259 ret i64 %9
260}
261
262define arm_aapcs_vfpcc i64 @test_vrmlsldavhaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {
263; CHECK-LABEL: test_vrmlsldavhaq_s32:
264; CHECK: @ %bb.0: @ %entry
265; CHECK-NEXT: vrmlsldavha.s32 r0, r1, q0, q1
266; CHECK-NEXT: bx lr
267entry:
268 %0 = lshr i64 %a, 32
269 %1 = trunc i64 %0 to i32
270 %2 = trunc i64 %a to i32
271 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 1, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)
272 %4 = extractvalue { i32, i32 } %3, 1
273 %5 = zext i32 %4 to i64
274 %6 = shl i64 %5, 32
275 %7 = extractvalue { i32, i32 } %3, 0
276 %8 = zext i32 %7 to i64
277 %9 = or i64 %6, %8
278 ret i64 %9
279}
280
281define arm_aapcs_vfpcc i64 @test_vrmlsldavhaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) {
282; CHECK-LABEL: test_vrmlsldavhaxq_s32:
283; CHECK: @ %bb.0: @ %entry
284; CHECK-NEXT: vrmlsldavhax.s32 r0, r1, q0, q1
285; CHECK-NEXT: bx lr
286entry:
287 %0 = lshr i64 %a, 32
288 %1 = trunc i64 %0 to i32
289 %2 = trunc i64 %a to i32
290 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 1, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c)
291 %4 = extractvalue { i32, i32 } %3, 1
292 %5 = zext i32 %4 to i64
293 %6 = shl 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
298}
299
300define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) {
301; CHECK-LABEL: test_vmlaldavaq_p_s16:
302; CHECK: @ %bb.0: @ %entry
303; CHECK-NEXT: vmsr p0, r2
304; CHECK-NEXT: vpst
305; CHECK-NEXT: vmlalvat.s16 r0, r1, q0, q1
306; CHECK-NEXT: bx lr
307entry:
308 %0 = lshr i64 %a, 32
309 %1 = trunc i64 %0 to i32
310 %2 = trunc i64 %a to i32
311 %3 = zext i16 %p to i32
312 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3)
313 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 0, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4)
314 %6 = extractvalue { i32, i32 } %5, 1
315 %7 = zext i32 %6 to i64
316 %8 = shl i64 %7, 32
317 %9 = extractvalue { i32, i32 } %5, 0
318 %10 = zext i32 %9 to i64
319 %11 = or i64 %8, %10
320 ret i64 %11
321}
322
323define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {
324; CHECK-LABEL: test_vmlaldavaq_p_s32:
325; CHECK: @ %bb.0: @ %entry
326; CHECK-NEXT: vmsr p0, r2
327; CHECK-NEXT: vpst
328; CHECK-NEXT: vmlalvat.s32 r0, r1, q0, q1
329; CHECK-NEXT: bx lr
330entry:
331 %0 = lshr i64 %a, 32
332 %1 = trunc i64 %0 to i32
333 %2 = trunc i64 %a to i32
334 %3 = zext i16 %p to i32
335 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)
336 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)
337 %6 = extractvalue { i32, i32 } %5, 1
338 %7 = zext i32 %6 to i64
339 %8 = shl i64 %7, 32
340 %9 = extractvalue { i32, i32 } %5, 0
341 %10 = zext i32 %9 to i64
342 %11 = or i64 %8, %10
343 ret i64 %11
344}
345
346define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_u16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) {
347; CHECK-LABEL: test_vmlaldavaq_p_u16:
348; CHECK: @ %bb.0: @ %entry
349; CHECK-NEXT: vmsr p0, r2
350; CHECK-NEXT: vpst
351; CHECK-NEXT: vmlalvat.u16 r0, r1, q0, q1
352; CHECK-NEXT: bx lr
353entry:
354 %0 = lshr i64 %a, 32
355 %1 = trunc i64 %0 to i32
356 %2 = trunc i64 %a to i32
357 %3 = zext i16 %p to i32
358 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3)
359 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 1, i32 0, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4)
360 %6 = extractvalue { i32, i32 } %5, 1
361 %7 = zext i32 %6 to i64
362 %8 = shl i64 %7, 32
363 %9 = extractvalue { i32, i32 } %5, 0
364 %10 = zext i32 %9 to i64
365 %11 = or i64 %8, %10
366 ret i64 %11
367}
368
369define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_u32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {
370; CHECK-LABEL: test_vmlaldavaq_p_u32:
371; CHECK: @ %bb.0: @ %entry
372; CHECK-NEXT: vmsr p0, r2
373; CHECK-NEXT: vpst
374; CHECK-NEXT: vmlalvat.u32 r0, r1, q0, q1
375; CHECK-NEXT: bx lr
376entry:
377 %0 = lshr i64 %a, 32
378 %1 = trunc i64 %0 to i32
379 %2 = trunc i64 %a to i32
380 %3 = zext i16 %p to i32
381 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)
382 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 1, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)
383 %6 = extractvalue { i32, i32 } %5, 1
384 %7 = zext i32 %6 to i64
385 %8 = shl i64 %7, 32
386 %9 = extractvalue { i32, i32 } %5, 0
387 %10 = zext i32 %9 to i64
388 %11 = or i64 %8, %10
389 ret i64 %11
390}
391
392define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) {
393; CHECK-LABEL: test_vmlaldavaxq_p_s16:
394; CHECK: @ %bb.0: @ %entry
395; CHECK-NEXT: vmsr p0, r2
396; CHECK-NEXT: vpst
397; CHECK-NEXT: vmlaldavaxt.s16 r0, r1, q0, q1
398; CHECK-NEXT: bx lr
399entry:
400 %0 = lshr i64 %a, 32
401 %1 = trunc i64 %0 to i32
402 %2 = trunc i64 %a to i32
403 %3 = zext i16 %p to i32
404 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3)
405 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 0, i32 1, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4)
406 %6 = extractvalue { i32, i32 } %5, 1
407 %7 = zext i32 %6 to i64
408 %8 = shl i64 %7, 32
409 %9 = extractvalue { i32, i32 } %5, 0
410 %10 = zext i32 %9 to i64
411 %11 = or i64 %8, %10
412 ret i64 %11
413}
414
415define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {
416; CHECK-LABEL: test_vmlaldavaxq_p_s32:
417; CHECK: @ %bb.0: @ %entry
418; CHECK-NEXT: vmsr p0, r2
419; CHECK-NEXT: vpst
420; CHECK-NEXT: vmlaldavaxt.s32 r0, r1, q0, q1
421; CHECK-NEXT: bx lr
422entry:
423 %0 = lshr i64 %a, 32
424 %1 = trunc i64 %0 to i32
425 %2 = trunc i64 %a to i32
426 %3 = zext i16 %p to i32
427 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)
428 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 0, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)
429 %6 = extractvalue { i32, i32 } %5, 1
430 %7 = zext i32 %6 to i64
431 %8 = shl i64 %7, 32
432 %9 = extractvalue { i32, i32 } %5, 0
433 %10 = zext i32 %9 to i64
434 %11 = or i64 %8, %10
435 ret i64 %11
436}
437
438define arm_aapcs_vfpcc i64 @test_vmlsldavaq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) {
439; CHECK-LABEL: test_vmlsldavaq_p_s16:
440; CHECK: @ %bb.0: @ %entry
441; CHECK-NEXT: vmsr p0, r2
442; CHECK-NEXT: vpst
443; CHECK-NEXT: vmlsldavat.s16 r0, r1, q0, q1
444; CHECK-NEXT: bx lr
445entry:
446 %0 = lshr i64 %a, 32
447 %1 = trunc i64 %0 to i32
448 %2 = trunc i64 %a to i32
449 %3 = zext i16 %p to i32
450 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3)
451 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 1, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4)
452 %6 = extractvalue { i32, i32 } %5, 1
453 %7 = zext i32 %6 to i64
454 %8 = shl i64 %7, 32
455 %9 = extractvalue { i32, i32 } %5, 0
456 %10 = zext i32 %9 to i64
457 %11 = or i64 %8, %10
458 ret i64 %11
459}
460
461define arm_aapcs_vfpcc i64 @test_vmlsldavaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {
462; CHECK-LABEL: test_vmlsldavaq_p_s32:
463; CHECK: @ %bb.0: @ %entry
464; CHECK-NEXT: vmsr p0, r2
465; CHECK-NEXT: vpst
466; CHECK-NEXT: vmlsldavat.s32 r0, r1, q0, q1
467; CHECK-NEXT: bx lr
468entry:
469 %0 = lshr i64 %a, 32
470 %1 = trunc i64 %0 to i32
471 %2 = trunc i64 %a to i32
472 %3 = zext i16 %p to i32
473 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)
474 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 1, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)
475 %6 = extractvalue { i32, i32 } %5, 1
476 %7 = zext i32 %6 to i64
477 %8 = shl i64 %7, 32
478 %9 = extractvalue { i32, i32 } %5, 0
479 %10 = zext i32 %9 to i64
480 %11 = or i64 %8, %10
481 ret i64 %11
482}
483
484define arm_aapcs_vfpcc i64 @test_vmlsldaxvaq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) {
485; CHECK-LABEL: test_vmlsldaxvaq_p_s16:
486; CHECK: @ %bb.0: @ %entry
487; CHECK-NEXT: vmsr p0, r2
488; CHECK-NEXT: vpst
489; CHECK-NEXT: vmlsldavaxt.s16 r0, r1, q0, q1
490; CHECK-NEXT: bx lr
491entry:
492 %0 = lshr i64 %a, 32
493 %1 = trunc i64 %0 to i32
494 %2 = trunc i64 %a to i32
495 %3 = zext i16 %p to i32
496 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3)
497 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 1, i32 1, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4)
498 %6 = extractvalue { i32, i32 } %5, 1
499 %7 = zext i32 %6 to i64
500 %8 = shl i64 %7, 32
501 %9 = extractvalue { i32, i32 } %5, 0
502 %10 = zext i32 %9 to i64
503 %11 = or i64 %8, %10
504 ret i64 %11
505}
506
507define arm_aapcs_vfpcc i64 @test_vmlsldavaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {
508; CHECK-LABEL: test_vmlsldavaxq_p_s32:
509; CHECK: @ %bb.0: @ %entry
510; CHECK-NEXT: vmsr p0, r2
511; CHECK-NEXT: vpst
512; CHECK-NEXT: vmlsldavaxt.s32 r0, r1, q0, q1
513; CHECK-NEXT: bx lr
514entry:
515 %0 = lshr i64 %a, 32
516 %1 = trunc i64 %0 to i32
517 %2 = trunc i64 %a to i32
518 %3 = zext i16 %p to i32
519 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)
520 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 1, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)
521 %6 = extractvalue { i32, i32 } %5, 1
522 %7 = zext i32 %6 to i64
523 %8 = shl i64 %7, 32
524 %9 = extractvalue { i32, i32 } %5, 0
525 %10 = zext i32 %9 to i64
526 %11 = or i64 %8, %10
527 ret i64 %11
528}
529
530define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {
531; CHECK-LABEL: test_vrmlaldavhaq_p_s32:
532; CHECK: @ %bb.0: @ %entry
533; CHECK-NEXT: vmsr p0, r2
534; CHECK-NEXT: vpst
535; CHECK-NEXT: vrmlalvhat.s32 r0, r1, q0, q1
536; CHECK-NEXT: bx lr
537entry:
538 %0 = lshr i64 %a, 32
539 %1 = trunc i64 %0 to i32
540 %2 = trunc i64 %a to i32
541 %3 = zext i16 %p to i32
542 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)
543 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)
544 %6 = extractvalue { i32, i32 } %5, 1
545 %7 = zext i32 %6 to i64
546 %8 = shl i64 %7, 32
547 %9 = extractvalue { i32, i32 } %5, 0
548 %10 = zext i32 %9 to i64
549 %11 = or i64 %8, %10
550 ret i64 %11
551}
552
553define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_p_u32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {
554; CHECK-LABEL: test_vrmlaldavhaq_p_u32:
555; CHECK: @ %bb.0: @ %entry
556; CHECK-NEXT: vmsr p0, r2
557; CHECK-NEXT: vpst
558; CHECK-NEXT: vrmlalvhat.u32 r0, r1, q0, q1
559; CHECK-NEXT: bx lr
560entry:
561 %0 = lshr i64 %a, 32
562 %1 = trunc i64 %0 to i32
563 %2 = trunc i64 %a to i32
564 %3 = zext i16 %p to i32
565 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)
566 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 1, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)
567 %6 = extractvalue { i32, i32 } %5, 1
568 %7 = zext i32 %6 to i64
569 %8 = shl i64 %7, 32
570 %9 = extractvalue { i32, i32 } %5, 0
571 %10 = zext i32 %9 to i64
572 %11 = or i64 %8, %10
573 ret i64 %11
574}
575
576define arm_aapcs_vfpcc i64 @test_vrmlaldavhaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {
577; CHECK-LABEL: test_vrmlaldavhaxq_p_s32:
578; CHECK: @ %bb.0: @ %entry
579; CHECK-NEXT: vmsr p0, r2
580; CHECK-NEXT: vpst
581; CHECK-NEXT: vrmlaldavhaxt.s32 r0, r1, q0, q1
582; CHECK-NEXT: bx lr
583entry:
584 %0 = lshr i64 %a, 32
585 %1 = trunc i64 %0 to i32
586 %2 = trunc i64 %a to i32
587 %3 = zext i16 %p to i32
588 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)
589 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 0, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)
590 %6 = extractvalue { i32, i32 } %5, 1
591 %7 = zext i32 %6 to i64
592 %8 = shl i64 %7, 32
593 %9 = extractvalue { i32, i32 } %5, 0
594 %10 = zext i32 %9 to i64
595 %11 = or i64 %8, %10
596 ret i64 %11
597}
598
599define arm_aapcs_vfpcc i64 @test_vrmlsldavhaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {
600; CHECK-LABEL: test_vrmlsldavhaq_p_s32:
601; CHECK: @ %bb.0: @ %entry
602; CHECK-NEXT: vmsr p0, r2
603; CHECK-NEXT: vpst
604; CHECK-NEXT: vrmlsldavhat.s32 r0, r1, q0, q1
605; CHECK-NEXT: bx lr
606entry:
607 %0 = lshr i64 %a, 32
608 %1 = trunc i64 %0 to i32
609 %2 = trunc i64 %a to i32
610 %3 = zext i16 %p to i32
611 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)
612 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 1, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)
613 %6 = extractvalue { i32, i32 } %5, 1
614 %7 = zext i32 %6 to i64
615 %8 = shl i64 %7, 32
616 %9 = extractvalue { i32, i32 } %5, 0
617 %10 = zext i32 %9 to i64
618 %11 = or i64 %8, %10
619 ret i64 %11
620}
621
622define arm_aapcs_vfpcc i64 @test_vrmlsldavhaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) {
623; CHECK-LABEL: test_vrmlsldavhaxq_p_s32:
624; CHECK: @ %bb.0: @ %entry
625; CHECK-NEXT: vmsr p0, r2
626; CHECK-NEXT: vpst
627; CHECK-NEXT: vrmlsldavhaxt.s32 r0, r1, q0, q1
628; CHECK-NEXT: bx lr
629entry:
630 %0 = lshr i64 %a, 32
631 %1 = trunc i64 %0 to i32
632 %2 = trunc i64 %a to i32
633 %3 = zext i16 %p to i32
634 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3)
635 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 1, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4)
636 %6 = extractvalue { i32, i32 } %5, 1
637 %7 = zext i32 %6 to i64
638 %8 = shl i64 %7, 32
639 %9 = extractvalue { i32, i32 } %5, 0
640 %10 = zext i32 %9 to i64
641 %11 = or i64 %8, %10
642 ret i64 %11
643}
644
645define arm_aapcs_vfpcc i64 @test_vmlaldavq_s16(<8 x i16> %a, <8 x i16> %b) {
646; CHECK-LABEL: test_vmlaldavq_s16:
647; CHECK: @ %bb.0: @ %entry
648; CHECK-NEXT: vmlalv.s16 r0, r1, q0, q1
649; CHECK-NEXT: bx lr
650entry:
651 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b)
652 %1 = extractvalue { i32, i32 } %0, 1
653 %2 = zext i32 %1 to i64
654 %3 = shl i64 %2, 32
655 %4 = extractvalue { i32, i32 } %0, 0
656 %5 = zext i32 %4 to i64
657 %6 = or i64 %3, %5
658 ret i64 %6
659}
660
661define arm_aapcs_vfpcc i64 @test_vmlaldavq_s32(<4 x i32> %a, <4 x i32> %b) {
662; CHECK-LABEL: test_vmlaldavq_s32:
663; CHECK: @ %bb.0: @ %entry
664; CHECK-NEXT: vmlalv.s32 r0, r1, q0, q1
665; CHECK-NEXT: bx lr
666entry:
667 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)
668 %1 = extractvalue { i32, i32 } %0, 1
669 %2 = zext i32 %1 to i64
670 %3 = shl i64 %2, 32
671 %4 = extractvalue { i32, i32 } %0, 0
672 %5 = zext i32 %4 to i64
673 %6 = or i64 %3, %5
674 ret i64 %6
675}
676
677define arm_aapcs_vfpcc i64 @test_vmlaldavq_u16(<8 x i16> %a, <8 x i16> %b) {
678; CHECK-LABEL: test_vmlaldavq_u16:
679; CHECK: @ %bb.0: @ %entry
680; CHECK-NEXT: vmlalv.u16 r0, r1, q0, q1
681; CHECK-NEXT: bx lr
682entry:
683 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 1, i32 0, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b)
684 %1 = extractvalue { i32, i32 } %0, 1
685 %2 = zext i32 %1 to i64
686 %3 = shl i64 %2, 32
687 %4 = extractvalue { i32, i32 } %0, 0
688 %5 = zext i32 %4 to i64
689 %6 = or i64 %3, %5
690 ret i64 %6
691}
692
693define arm_aapcs_vfpcc i64 @test_vmlaldavq_u32(<4 x i32> %a, <4 x i32> %b) {
694; CHECK-LABEL: test_vmlaldavq_u32:
695; CHECK: @ %bb.0: @ %entry
696; CHECK-NEXT: vmlalv.u32 r0, r1, q0, q1
697; CHECK-NEXT: bx lr
698entry:
699 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)
700 %1 = extractvalue { i32, i32 } %0, 1
701 %2 = zext i32 %1 to i64
702 %3 = shl i64 %2, 32
703 %4 = extractvalue { i32, i32 } %0, 0
704 %5 = zext i32 %4 to i64
705 %6 = or i64 %3, %5
706 ret i64 %6
707}
708
709define arm_aapcs_vfpcc i64 @test_vmlaldavxq_s16(<8 x i16> %a, <8 x i16> %b) {
710; CHECK-LABEL: test_vmlaldavxq_s16:
711; CHECK: @ %bb.0: @ %entry
712; CHECK-NEXT: vmlaldavx.s16 r0, r1, q0, q1
713; CHECK-NEXT: bx lr
714entry:
715 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 1, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b)
716 %1 = extractvalue { i32, i32 } %0, 1
717 %2 = zext i32 %1 to i64
718 %3 = shl i64 %2, 32
719 %4 = extractvalue { i32, i32 } %0, 0
720 %5 = zext i32 %4 to i64
721 %6 = or i64 %3, %5
722 ret i64 %6
723}
724
725define arm_aapcs_vfpcc i64 @test_vmlaldavxq_s32(<4 x i32> %a, <4 x i32> %b) {
726; CHECK-LABEL: test_vmlaldavxq_s32:
727; CHECK: @ %bb.0: @ %entry
728; CHECK-NEXT: vmlaldavx.s32 r0, r1, q0, q1
729; CHECK-NEXT: bx lr
730entry:
731 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 0, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)
732 %1 = extractvalue { i32, i32 } %0, 1
733 %2 = zext i32 %1 to i64
734 %3 = shl i64 %2, 32
735 %4 = extractvalue { i32, i32 } %0, 0
736 %5 = zext i32 %4 to i64
737 %6 = or i64 %3, %5
738 ret i64 %6
739}
740
741define arm_aapcs_vfpcc i64 @test_vmlsldavq_s16(<8 x i16> %a, <8 x i16> %b) {
742; CHECK-LABEL: test_vmlsldavq_s16:
743; CHECK: @ %bb.0: @ %entry
744; CHECK-NEXT: vmlsldav.s16 r0, r1, q0, q1
745; CHECK-NEXT: bx lr
746entry:
747 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 1, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b)
748 %1 = extractvalue { i32, i32 } %0, 1
749 %2 = zext i32 %1 to i64
750 %3 = shl i64 %2, 32
751 %4 = extractvalue { i32, i32 } %0, 0
752 %5 = zext i32 %4 to i64
753 %6 = or i64 %3, %5
754 ret i64 %6
755}
756
757define arm_aapcs_vfpcc i64 @test_vmlsldavq_s32(<4 x i32> %a, <4 x i32> %b) {
758; CHECK-LABEL: test_vmlsldavq_s32:
759; CHECK: @ %bb.0: @ %entry
760; CHECK-NEXT: vmlsldav.s32 r0, r1, q0, q1
761; CHECK-NEXT: bx lr
762entry:
763 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)
764 %1 = extractvalue { i32, i32 } %0, 1
765 %2 = zext i32 %1 to i64
766 %3 = shl i64 %2, 32
767 %4 = extractvalue { i32, i32 } %0, 0
768 %5 = zext i32 %4 to i64
769 %6 = or i64 %3, %5
770 ret i64 %6
771}
772
773define arm_aapcs_vfpcc i64 @test_vmlsldavxvq_s16(<8 x i16> %a, <8 x i16> %b) {
774; CHECK-LABEL: test_vmlsldavxvq_s16:
775; CHECK: @ %bb.0: @ %entry
776; CHECK-NEXT: vmlsldavx.s16 r0, r1, q0, q1
777; CHECK-NEXT: bx lr
778entry:
779 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 1, i32 1, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b)
780 %1 = extractvalue { i32, i32 } %0, 1
781 %2 = zext i32 %1 to i64
782 %3 = shl i64 %2, 32
783 %4 = extractvalue { i32, i32 } %0, 0
784 %5 = zext i32 %4 to i64
785 %6 = or i64 %3, %5
786 ret i64 %6
787}
788
789define arm_aapcs_vfpcc i64 @test_vmlsldavxq_s32(<4 x i32> %a, <4 x i32> %b) {
790; CHECK-LABEL: test_vmlsldavxq_s32:
791; CHECK: @ %bb.0: @ %entry
792; CHECK-NEXT: vmlsldavx.s32 r0, r1, q0, q1
793; CHECK-NEXT: bx lr
794entry:
795 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 1, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)
796 %1 = extractvalue { i32, i32 } %0, 1
797 %2 = zext i32 %1 to i64
798 %3 = shl i64 %2, 32
799 %4 = extractvalue { i32, i32 } %0, 0
800 %5 = zext i32 %4 to i64
801 %6 = or i64 %3, %5
802 ret i64 %6
803}
804
805define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_s32(<4 x i32> %a, <4 x i32> %b) {
806; CHECK-LABEL: test_vrmlaldavhq_s32:
807; CHECK: @ %bb.0: @ %entry
808; CHECK-NEXT: vrmlalvh.s32 r0, r1, q0, q1
809; CHECK-NEXT: bx lr
810entry:
811 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)
812 %1 = extractvalue { i32, i32 } %0, 1
813 %2 = zext i32 %1 to i64
814 %3 = shl i64 %2, 32
815 %4 = extractvalue { i32, i32 } %0, 0
816 %5 = zext i32 %4 to i64
817 %6 = or i64 %3, %5
818 ret i64 %6
819}
820
821define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_u32(<4 x i32> %a, <4 x i32> %b) {
822; CHECK-LABEL: test_vrmlaldavhq_u32:
823; CHECK: @ %bb.0: @ %entry
824; CHECK-NEXT: vrmlalvh.u32 r0, r1, q0, q1
825; CHECK-NEXT: bx lr
826entry:
827 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)
828 %1 = extractvalue { i32, i32 } %0, 1
829 %2 = zext i32 %1 to i64
830 %3 = shl i64 %2, 32
831 %4 = extractvalue { i32, i32 } %0, 0
832 %5 = zext i32 %4 to i64
833 %6 = or i64 %3, %5
834 ret i64 %6
835}
836
837define arm_aapcs_vfpcc i64 @test_vrmlaldavhxq_s32(<4 x i32> %a, <4 x i32> %b) {
838; CHECK-LABEL: test_vrmlaldavhxq_s32:
839; CHECK: @ %bb.0: @ %entry
840; CHECK-NEXT: vrmlaldavhx.s32 r0, r1, q0, q1
841; CHECK-NEXT: bx lr
842entry:
843 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 0, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)
844 %1 = extractvalue { i32, i32 } %0, 1
845 %2 = zext i32 %1 to i64
846 %3 = shl i64 %2, 32
847 %4 = extractvalue { i32, i32 } %0, 0
848 %5 = zext i32 %4 to i64
849 %6 = or i64 %3, %5
850 ret i64 %6
851}
852
853define arm_aapcs_vfpcc i64 @test_vrmlsldavhq_s32(<4 x i32> %a, <4 x i32> %b) {
854; CHECK-LABEL: test_vrmlsldavhq_s32:
855; CHECK: @ %bb.0: @ %entry
856; CHECK-NEXT: vrmlsldavh.s32 r0, r1, q0, q1
857; CHECK-NEXT: bx lr
858entry:
859 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)
860 %1 = extractvalue { i32, i32 } %0, 1
861 %2 = zext i32 %1 to i64
862 %3 = shl i64 %2, 32
863 %4 = extractvalue { i32, i32 } %0, 0
864 %5 = zext i32 %4 to i64
865 %6 = or i64 %3, %5
866 ret i64 %6
867}
868
869define arm_aapcs_vfpcc i64 @test_vrmlsldavhxq_s32(<4 x i32> %a, <4 x i32> %b) {
870; CHECK-LABEL: test_vrmlsldavhxq_s32:
871; CHECK: @ %bb.0: @ %entry
872; CHECK-NEXT: vrmlsldavhx.s32 r0, r1, q0, q1
873; CHECK-NEXT: bx lr
874entry:
875 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 1, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)
876 %1 = extractvalue { i32, i32 } %0, 1
877 %2 = zext i32 %1 to i64
878 %3 = shl i64 %2, 32
879 %4 = extractvalue { i32, i32 } %0, 0
880 %5 = zext i32 %4 to i64
881 %6 = or i64 %3, %5
882 ret i64 %6
883}
884
885define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
886; CHECK-LABEL: test_vmlaldavq_p_s16:
887; CHECK: @ %bb.0: @ %entry
888; CHECK-NEXT: vmsr p0, r0
889; CHECK-NEXT: vpst
890; CHECK-NEXT: vmlalvt.s16 r0, r1, q0, q1
891; CHECK-NEXT: bx lr
892entry:
893 %0 = zext i16 %p to i32
894 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
895 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 0, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
896 %3 = extractvalue { i32, i32 } %2, 1
897 %4 = zext i32 %3 to i64
898 %5 = shl i64 %4, 32
899 %6 = extractvalue { i32, i32 } %2, 0
900 %7 = zext i32 %6 to i64
901 %8 = or i64 %5, %7
902 ret i64 %8
903}
904
905define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
906; CHECK-LABEL: test_vmlaldavq_p_s32:
907; CHECK: @ %bb.0: @ %entry
908; CHECK-NEXT: vmsr p0, r0
909; CHECK-NEXT: vpst
910; CHECK-NEXT: vmlalvt.s32 r0, r1, q0, q1
911; CHECK-NEXT: bx lr
912entry:
913 %0 = zext i16 %p to i32
914 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
915 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
916 %3 = extractvalue { i32, i32 } %2, 1
917 %4 = zext i32 %3 to i64
918 %5 = shl i64 %4, 32
919 %6 = extractvalue { i32, i32 } %2, 0
920 %7 = zext i32 %6 to i64
921 %8 = or i64 %5, %7
922 ret i64 %8
923}
924
925define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_u16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
926; CHECK-LABEL: test_vmlaldavq_p_u16:
927; CHECK: @ %bb.0: @ %entry
928; CHECK-NEXT: vmsr p0, r0
929; CHECK-NEXT: vpst
930; CHECK-NEXT: vmlalvt.u16 r0, r1, q0, q1
931; CHECK-NEXT: bx lr
932entry:
933 %0 = zext i16 %p to i32
934 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
935 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 1, i32 0, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
936 %3 = extractvalue { i32, i32 } %2, 1
937 %4 = zext i32 %3 to i64
938 %5 = shl i64 %4, 32
939 %6 = extractvalue { i32, i32 } %2, 0
940 %7 = zext i32 %6 to i64
941 %8 = or i64 %5, %7
942 ret i64 %8
943}
944
945define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_u32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
946; CHECK-LABEL: test_vmlaldavq_p_u32:
947; CHECK: @ %bb.0: @ %entry
948; CHECK-NEXT: vmsr p0, r0
949; CHECK-NEXT: vpst
950; CHECK-NEXT: vmlalvt.u32 r0, r1, q0, q1
951; CHECK-NEXT: bx lr
952entry:
953 %0 = zext i16 %p to i32
954 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
955 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
956 %3 = extractvalue { i32, i32 } %2, 1
957 %4 = zext i32 %3 to i64
958 %5 = shl i64 %4, 32
959 %6 = extractvalue { i32, i32 } %2, 0
960 %7 = zext i32 %6 to i64
961 %8 = or i64 %5, %7
962 ret i64 %8
963}
964
965define arm_aapcs_vfpcc i64 @test_vmlaldavxq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
966; CHECK-LABEL: test_vmlaldavxq_p_s16:
967; CHECK: @ %bb.0: @ %entry
968; CHECK-NEXT: vmsr p0, r0
969; CHECK-NEXT: vpst
970; CHECK-NEXT: vmlaldavxt.s16 r0, r1, q0, q1
971; CHECK-NEXT: bx lr
972entry:
973 %0 = zext i16 %p to i32
974 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
975 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 0, i32 1, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
976 %3 = extractvalue { i32, i32 } %2, 1
977 %4 = zext i32 %3 to i64
978 %5 = shl i64 %4, 32
979 %6 = extractvalue { i32, i32 } %2, 0
980 %7 = zext i32 %6 to i64
981 %8 = or i64 %5, %7
982 ret i64 %8
983}
984
985define arm_aapcs_vfpcc i64 @test_vmlaldavxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
986; CHECK-LABEL: test_vmlaldavxq_p_s32:
987; CHECK: @ %bb.0: @ %entry
988; CHECK-NEXT: vmsr p0, r0
989; CHECK-NEXT: vpst
990; CHECK-NEXT: vmlaldavxt.s32 r0, r1, q0, q1
991; CHECK-NEXT: bx lr
992entry:
993 %0 = zext i16 %p to i32
994 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
995 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 0, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
996 %3 = extractvalue { i32, i32 } %2, 1
997 %4 = zext i32 %3 to i64
998 %5 = shl i64 %4, 32
999 %6 = extractvalue { i32, i32 } %2, 0
1000 %7 = zext i32 %6 to i64
1001 %8 = or i64 %5, %7
1002 ret i64 %8
1003}
1004
1005define arm_aapcs_vfpcc i64 @test_vmlsldavq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
1006; CHECK-LABEL: test_vmlsldavq_p_s16:
1007; CHECK: @ %bb.0: @ %entry
1008; CHECK-NEXT: vmsr p0, r0
1009; CHECK-NEXT: vpst
1010; CHECK-NEXT: vmlsldavt.s16 r0, r1, q0, q1
1011; CHECK-NEXT: bx lr
1012entry:
1013 %0 = zext i16 %p to i32
1014 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
1015 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 1, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
1016 %3 = extractvalue { i32, i32 } %2, 1
1017 %4 = zext i32 %3 to i64
1018 %5 = shl i64 %4, 32
1019 %6 = extractvalue { i32, i32 } %2, 0
1020 %7 = zext i32 %6 to i64
1021 %8 = or i64 %5, %7
1022 ret i64 %8
1023}
1024
1025define arm_aapcs_vfpcc i64 @test_vmlsldavq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
1026; CHECK-LABEL: test_vmlsldavq_p_s32:
1027; CHECK: @ %bb.0: @ %entry
1028; CHECK-NEXT: vmsr p0, r0
1029; CHECK-NEXT: vpst
1030; CHECK-NEXT: vmlsldavt.s32 r0, r1, q0, q1
1031; CHECK-NEXT: bx lr
1032entry:
1033 %0 = zext i16 %p to i32
1034 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
1035 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
1036 %3 = extractvalue { i32, i32 } %2, 1
1037 %4 = zext i32 %3 to i64
1038 %5 = shl i64 %4, 32
1039 %6 = extractvalue { i32, i32 } %2, 0
1040 %7 = zext i32 %6 to i64
1041 %8 = or i64 %5, %7
1042 ret i64 %8
1043}
1044
1045define arm_aapcs_vfpcc i64 @test_vmlsldaxvq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
1046; CHECK-LABEL: test_vmlsldaxvq_p_s16:
1047; CHECK: @ %bb.0: @ %entry
1048; CHECK-NEXT: vmsr p0, r0
1049; CHECK-NEXT: vpst
1050; CHECK-NEXT: vmlsldavxt.s16 r0, r1, q0, q1
1051; CHECK-NEXT: bx lr
1052entry:
1053 %0 = zext i16 %p to i32
1054 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
1055 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 1, i32 1, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
1056 %3 = extractvalue { i32, i32 } %2, 1
1057 %4 = zext i32 %3 to i64
1058 %5 = shl i64 %4, 32
1059 %6 = extractvalue { i32, i32 } %2, 0
1060 %7 = zext i32 %6 to i64
1061 %8 = or i64 %5, %7
1062 ret i64 %8
1063}
1064
1065define arm_aapcs_vfpcc i64 @test_vmlsldavxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
1066; CHECK-LABEL: test_vmlsldavxq_p_s32:
1067; CHECK: @ %bb.0: @ %entry
1068; CHECK-NEXT: vmsr p0, r0
1069; CHECK-NEXT: vpst
1070; CHECK-NEXT: vmlsldavxt.s32 r0, r1, q0, q1
1071; CHECK-NEXT: bx lr
1072entry:
1073 %0 = zext i16 %p to i32
1074 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
1075 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 1, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
1076 %3 = extractvalue { i32, i32 } %2, 1
1077 %4 = zext i32 %3 to i64
1078 %5 = shl i64 %4, 32
1079 %6 = extractvalue { i32, i32 } %2, 0
1080 %7 = zext i32 %6 to i64
1081 %8 = or i64 %5, %7
1082 ret i64 %8
1083}
1084
1085define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
1086; CHECK-LABEL: test_vrmlaldavhq_p_s32:
1087; CHECK: @ %bb.0: @ %entry
1088; CHECK-NEXT: vmsr p0, r0
1089; CHECK-NEXT: vpst
1090; CHECK-NEXT: vrmlalvht.s32 r0, r1, q0, q1
1091; CHECK-NEXT: bx lr
1092entry:
1093 %0 = zext i16 %p to i32
1094 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
1095 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
1096 %3 = extractvalue { i32, i32 } %2, 1
1097 %4 = zext i32 %3 to i64
1098 %5 = shl i64 %4, 32
1099 %6 = extractvalue { i32, i32 } %2, 0
1100 %7 = zext i32 %6 to i64
1101 %8 = or i64 %5, %7
1102 ret i64 %8
1103}
1104
1105define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_p_u32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
1106; CHECK-LABEL: test_vrmlaldavhq_p_u32:
1107; CHECK: @ %bb.0: @ %entry
1108; CHECK-NEXT: vmsr p0, r0
1109; CHECK-NEXT: vpst
1110; CHECK-NEXT: vrmlalvht.u32 r0, r1, q0, q1
1111; CHECK-NEXT: bx lr
1112entry:
1113 %0 = zext i16 %p to i32
1114 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
1115 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
1116 %3 = extractvalue { i32, i32 } %2, 1
1117 %4 = zext i32 %3 to i64
1118 %5 = shl i64 %4, 32
1119 %6 = extractvalue { i32, i32 } %2, 0
1120 %7 = zext i32 %6 to i64
1121 %8 = or i64 %5, %7
1122 ret i64 %8
1123}
1124
1125define arm_aapcs_vfpcc i64 @test_vrmlaldavhxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
1126; CHECK-LABEL: test_vrmlaldavhxq_p_s32:
1127; CHECK: @ %bb.0: @ %entry
1128; CHECK-NEXT: vmsr p0, r0
1129; CHECK-NEXT: vpst
1130; CHECK-NEXT: vrmlaldavhxt.s32 r0, r1, q0, q1
1131; CHECK-NEXT: bx lr
1132entry:
1133 %0 = zext i16 %p to i32
1134 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
1135 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 0, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
1136 %3 = extractvalue { i32, i32 } %2, 1
1137 %4 = zext i32 %3 to i64
1138 %5 = shl i64 %4, 32
1139 %6 = extractvalue { i32, i32 } %2, 0
1140 %7 = zext i32 %6 to i64
1141 %8 = or i64 %5, %7
1142 ret i64 %8
1143}
1144
1145define arm_aapcs_vfpcc i64 @test_vrmlsldavhq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
1146; CHECK-LABEL: test_vrmlsldavhq_p_s32:
1147; CHECK: @ %bb.0: @ %entry
1148; CHECK-NEXT: vmsr p0, r0
1149; CHECK-NEXT: vpst
1150; CHECK-NEXT: vrmlsldavht.s32 r0, r1, q0, q1
1151; CHECK-NEXT: bx lr
1152entry:
1153 %0 = zext i16 %p to i32
1154 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
1155 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
1156 %3 = extractvalue { i32, i32 } %2, 1
1157 %4 = zext i32 %3 to i64
1158 %5 = shl i64 %4, 32
1159 %6 = extractvalue { i32, i32 } %2, 0
1160 %7 = zext i32 %6 to i64
1161 %8 = or i64 %5, %7
1162 ret i64 %8
1163}
1164
1165define arm_aapcs_vfpcc i64 @test_vrmlsldavhxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
1166; CHECK-LABEL: test_vrmlsldavhxq_p_s32:
1167; CHECK: @ %bb.0: @ %entry
1168; CHECK-NEXT: vmsr p0, r0
1169; CHECK-NEXT: vpst
1170; CHECK-NEXT: vrmlsldavhxt.s32 r0, r1, q0, q1
1171; CHECK-NEXT: bx lr
1172entry:
1173 %0 = zext i16 %p to i32
1174 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
1175 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 1, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
1176 %3 = extractvalue { i32, i32 } %2, 1
1177 %4 = zext i32 %3 to i64
1178 %5 = shl i64 %4, 32
1179 %6 = extractvalue { i32, i32 } %2, 0
1180 %7 = zext i32 %6 to i64
1181 %8 = or i64 %5, %7
1182 ret i64 %8
1183}