1; 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}
1184