Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / mve-intrinsics / vmlldav.ll
blob9a215b3693356e2fce00ad2389c278cc37df34d5
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
4 declare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32)
5 declare <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32)
7 declare { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32, i32, i32, i32, i32, <8 x i16>, <8 x i16>)
8 declare { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>)
9 declare { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>)
11 declare { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32, i32, i32, i32, i32, <8 x i16>, <8 x i16>, <8 x i1>)
12 declare { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>, <4 x i1>)
13 declare { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>, <4 x i1>)
15 define 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
20 entry:
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
34 define 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
39 entry:
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
53 define 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
58 entry:
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
72 define 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
77 entry:
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
91 define 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
96 entry:
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
110 define 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
115 entry:
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
129 define 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
134 entry:
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
148 define 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
153 entry:
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
167 define 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
172 entry:
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
186 define 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
191 entry:
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
205 define 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
210 entry:
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
224 define 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
229 entry:
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
243 define 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
248 entry:
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
262 define 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
267 entry:
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
281 define 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
286 entry:
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
300 define 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
307 entry:
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
323 define 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
330 entry:
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
346 define 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
353 entry:
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
369 define 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
376 entry:
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
392 define 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
399 entry:
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
415 define 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
422 entry:
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
438 define 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
445 entry:
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
461 define 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
468 entry:
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
484 define 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
491 entry:
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
507 define 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
514 entry:
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
530 define 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
537 entry:
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
553 define 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
560 entry:
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
576 define 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
583 entry:
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
599 define 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
606 entry:
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
622 define 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
629 entry:
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
645 define 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
650 entry:
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
661 define 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
666 entry:
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
677 define 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
682 entry:
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
693 define 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
698 entry:
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
709 define 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
714 entry:
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
725 define 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
730 entry:
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
741 define 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
746 entry:
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
757 define 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
762 entry:
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
773 define 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
778 entry:
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
789 define 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
794 entry:
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
805 define 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
810 entry:
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
821 define 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
826 entry:
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
837 define 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
842 entry:
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
853 define 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
858 entry:
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
869 define 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
874 entry:
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
885 define 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
892 entry:
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
905 define 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
912 entry:
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
925 define 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
932 entry:
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
945 define 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
952 entry:
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
965 define 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
972 entry:
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
985 define 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
992 entry:
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
1005 define 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
1012 entry:
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
1025 define 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
1032 entry:
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
1045 define 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
1052 entry:
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
1065 define 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
1072 entry:
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
1085 define 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
1092 entry:
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
1105 define 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
1112 entry:
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
1125 define 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
1132 entry:
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
1145 define 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
1152 entry:
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
1165 define 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
1172 entry:
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