[llvm-objdump] - Remove one overload of reportError. NFCI.
[llvm-complete.git] / test / CodeGen / Thumb2 / mve-simple-arith.ll
blobecad0c1c5dfd0e7fc5157463aed452ffaeda61de
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+mve,+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-MVE
3 ; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+mve.fp -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-MVEFP
5 define arm_aapcs_vfpcc <16 x i8> @add_int8_t(<16 x i8> %src1, <16 x i8> %src2) {
6 ; CHECK-LABEL: add_int8_t:
7 ; CHECK:       @ %bb.0: @ %entry
8 ; CHECK-NEXT:    vadd.i8 q0, q0, q1
9 ; CHECK-NEXT:    bx lr
10 entry:
11   %0 = add <16 x i8> %src1, %src2
12   ret <16 x i8> %0
15 define arm_aapcs_vfpcc <8 x i16> @add_int16_t(<8 x i16> %src1, <8 x i16> %src2) {
16 ; CHECK-LABEL: add_int16_t:
17 ; CHECK:       @ %bb.0: @ %entry
18 ; CHECK-NEXT:    vadd.i16 q0, q0, q1
19 ; CHECK-NEXT:    bx lr
20 entry:
21   %0 = add <8 x i16> %src1, %src2
22   ret <8 x i16> %0
25 define arm_aapcs_vfpcc <4 x i32> @add_int32_t(<4 x i32> %src1, <4 x i32> %src2) {
26 ; CHECK-LABEL: add_int32_t:
27 ; CHECK:       @ %bb.0: @ %entry
28 ; CHECK-NEXT:    vadd.i32 q0, q0, q1
29 ; CHECK-NEXT:    bx lr
30 entry:
31   %0 = add nsw <4 x i32> %src1, %src2
32   ret <4 x i32> %0
35 define arm_aapcs_vfpcc <2 x i64> @add_int64_t(<2 x i64> %src1, <2 x i64> %src2) {
36 ; CHECK-LABEL: add_int64_t:
37 ; CHECK:       @ %bb.0: @ %entry
38 ; CHECK-NEXT:    .save {r7, lr}
39 ; CHECK-NEXT:    push {r7, lr}
40 ; CHECK-NEXT:    vmov r2, s6
41 ; CHECK-NEXT:    vmov r3, s2
42 ; CHECK-NEXT:    vmov r0, s7
43 ; CHECK-NEXT:    vmov r1, s3
44 ; CHECK-NEXT:    adds.w lr, r3, r2
45 ; CHECK-NEXT:    vmov r2, s0
46 ; CHECK-NEXT:    vmov r3, s1
47 ; CHECK-NEXT:    adc.w r12, r1, r0
48 ; CHECK-NEXT:    vmov r0, s4
49 ; CHECK-NEXT:    vmov r1, s5
50 ; CHECK-NEXT:    adds r0, r0, r2
51 ; CHECK-NEXT:    adcs r1, r3
52 ; CHECK-NEXT:    vmov.32 q0[0], r0
53 ; CHECK-NEXT:    vmov.32 q0[1], r1
54 ; CHECK-NEXT:    vmov.32 q0[2], lr
55 ; CHECK-NEXT:    vmov.32 q0[3], r12
56 ; CHECK-NEXT:    pop {r7, pc}
57 entry:
58   %0 = add nsw <2 x i64> %src1, %src2
59   ret <2 x i64> %0
62 define arm_aapcs_vfpcc <4 x float> @add_float32_t(<4 x float> %src1, <4 x float> %src2) {
63 ; CHECK-MVE-LABEL: add_float32_t:
64 ; CHECK-MVE:       @ %bb.0: @ %entry
65 ; CHECK-MVE-NEXT:    vadd.f32 s11, s7, s3
66 ; CHECK-MVE-NEXT:    vadd.f32 s10, s6, s2
67 ; CHECK-MVE-NEXT:    vadd.f32 s9, s5, s1
68 ; CHECK-MVE-NEXT:    vadd.f32 s8, s4, s0
69 ; CHECK-MVE-NEXT:    vmov q0, q2
70 ; CHECK-MVE-NEXT:    bx lr
72 ; CHECK-MVEFP-LABEL: add_float32_t:
73 ; CHECK-MVEFP:       @ %bb.0: @ %entry
74 ; CHECK-MVEFP-NEXT:    vadd.f32 q0, q1, q0
75 ; CHECK-MVEFP-NEXT:    bx lr
76 entry:
77   %0 = fadd nnan ninf nsz <4 x float> %src2, %src1
78   ret <4 x float> %0
81 define arm_aapcs_vfpcc <8 x half> @add_float16_t(<8 x half> %src1, <8 x half> %src2) {
82 ; CHECK-MVE-LABEL: add_float16_t:
83 ; CHECK-MVE:       @ %bb.0: @ %entry
84 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[0]
85 ; CHECK-MVE-NEXT:    vmov.u16 r1, q0[1]
86 ; CHECK-MVE-NEXT:    vmov s8, r0
87 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[0]
88 ; CHECK-MVE-NEXT:    vmov s10, r0
89 ; CHECK-MVE-NEXT:    vmov.u16 r2, q1[1]
90 ; CHECK-MVE-NEXT:    vadd.f16 s8, s10, s8
91 ; CHECK-MVE-NEXT:    vmov s10, r2
92 ; CHECK-MVE-NEXT:    vmov r0, s8
93 ; CHECK-MVE-NEXT:    vmov s8, r1
94 ; CHECK-MVE-NEXT:    vadd.f16 s8, s10, s8
95 ; CHECK-MVE-NEXT:    vmov r1, s8
96 ; CHECK-MVE-NEXT:    vmov.16 q2[0], r0
97 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[2]
98 ; CHECK-MVE-NEXT:    vmov.16 q2[1], r1
99 ; CHECK-MVE-NEXT:    vmov s12, r0
100 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[2]
101 ; CHECK-MVE-NEXT:    vmov s14, r0
102 ; CHECK-MVE-NEXT:    vadd.f16 s12, s14, s12
103 ; CHECK-MVE-NEXT:    vmov r0, s12
104 ; CHECK-MVE-NEXT:    vmov.16 q2[2], r0
105 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[3]
106 ; CHECK-MVE-NEXT:    vmov s12, r0
107 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[3]
108 ; CHECK-MVE-NEXT:    vmov s14, r0
109 ; CHECK-MVE-NEXT:    vadd.f16 s12, s14, s12
110 ; CHECK-MVE-NEXT:    vmov r0, s12
111 ; CHECK-MVE-NEXT:    vmov.16 q2[3], r0
112 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[4]
113 ; CHECK-MVE-NEXT:    vmov s12, r0
114 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[4]
115 ; CHECK-MVE-NEXT:    vmov s14, r0
116 ; CHECK-MVE-NEXT:    vadd.f16 s12, s14, s12
117 ; CHECK-MVE-NEXT:    vmov r0, s12
118 ; CHECK-MVE-NEXT:    vmov.16 q2[4], r0
119 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[5]
120 ; CHECK-MVE-NEXT:    vmov s12, r0
121 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[5]
122 ; CHECK-MVE-NEXT:    vmov s14, r0
123 ; CHECK-MVE-NEXT:    vadd.f16 s12, s14, s12
124 ; CHECK-MVE-NEXT:    vmov r0, s12
125 ; CHECK-MVE-NEXT:    vmov.16 q2[5], r0
126 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[6]
127 ; CHECK-MVE-NEXT:    vmov s12, r0
128 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[6]
129 ; CHECK-MVE-NEXT:    vmov s14, r0
130 ; CHECK-MVE-NEXT:    vadd.f16 s12, s14, s12
131 ; CHECK-MVE-NEXT:    vmov r0, s12
132 ; CHECK-MVE-NEXT:    vmov.16 q2[6], r0
133 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[7]
134 ; CHECK-MVE-NEXT:    vmov s0, r0
135 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[7]
136 ; CHECK-MVE-NEXT:    vmov s2, r0
137 ; CHECK-MVE-NEXT:    vadd.f16 s0, s2, s0
138 ; CHECK-MVE-NEXT:    vmov r0, s0
139 ; CHECK-MVE-NEXT:    vmov.16 q2[7], r0
140 ; CHECK-MVE-NEXT:    vmov q0, q2
141 ; CHECK-MVE-NEXT:    bx lr
143 ; CHECK-MVEFP-LABEL: add_float16_t:
144 ; CHECK-MVEFP:       @ %bb.0: @ %entry
145 ; CHECK-MVEFP-NEXT:    vadd.f16 q0, q1, q0
146 ; CHECK-MVEFP-NEXT:    bx lr
147 entry:
148   %0 = fadd nnan ninf nsz <8 x half> %src2, %src1
149   ret <8 x half> %0
152 define arm_aapcs_vfpcc <2 x double> @add_float64_t(<2 x double> %src1, <2 x double> %src2) {
153 ; CHECK-LABEL: add_float64_t:
154 ; CHECK:       @ %bb.0: @ %entry
155 ; CHECK-NEXT:    .save {r7, lr}
156 ; CHECK-NEXT:    push {r7, lr}
157 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
158 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
159 ; CHECK-NEXT:    vmov q4, q1
160 ; CHECK-NEXT:    vmov q5, q0
161 ; CHECK-NEXT:    vmov r0, r1, d9
162 ; CHECK-NEXT:    vmov r2, r3, d11
163 ; CHECK-NEXT:    bl __aeabi_dadd
164 ; CHECK-NEXT:    vmov lr, r12, d8
165 ; CHECK-NEXT:    vmov r2, r3, d10
166 ; CHECK-NEXT:    vmov d9, r0, r1
167 ; CHECK-NEXT:    mov r0, lr
168 ; CHECK-NEXT:    mov r1, r12
169 ; CHECK-NEXT:    bl __aeabi_dadd
170 ; CHECK-NEXT:    vmov d8, r0, r1
171 ; CHECK-NEXT:    vmov q0, q4
172 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
173 ; CHECK-NEXT:    pop {r7, pc}
174 entry:
175   %0 = fadd nnan ninf nsz <2 x double> %src2, %src1
176   ret <2 x double> %0
180 define arm_aapcs_vfpcc <16 x i8> @sub_int8_t(<16 x i8> %src1, <16 x i8> %src2) {
181 ; CHECK-LABEL: sub_int8_t:
182 ; CHECK:       @ %bb.0: @ %entry
183 ; CHECK-NEXT:    vsub.i8 q0, q1, q0
184 ; CHECK-NEXT:    bx lr
185 entry:
186   %0 = sub <16 x i8> %src2, %src1
187   ret <16 x i8> %0
190 define arm_aapcs_vfpcc <8 x i16> @sub_int16_t(<8 x i16> %src1, <8 x i16> %src2) {
191 ; CHECK-LABEL: sub_int16_t:
192 ; CHECK:       @ %bb.0: @ %entry
193 ; CHECK-NEXT:    vsub.i16 q0, q1, q0
194 ; CHECK-NEXT:    bx lr
195 entry:
196   %0 = sub <8 x i16> %src2, %src1
197   ret <8 x i16> %0
200 define arm_aapcs_vfpcc <4 x i32> @sub_int32_t(<4 x i32> %src1, <4 x i32> %src2) {
201 ; CHECK-LABEL: sub_int32_t:
202 ; CHECK:       @ %bb.0: @ %entry
203 ; CHECK-NEXT:    vsub.i32 q0, q1, q0
204 ; CHECK-NEXT:    bx lr
205 entry:
206   %0 = sub nsw <4 x i32> %src2, %src1
207   ret <4 x i32> %0
210 define arm_aapcs_vfpcc <2 x i64> @sub_int64_t(<2 x i64> %src1, <2 x i64> %src2) {
211 ; CHECK-LABEL: sub_int64_t:
212 ; CHECK:       @ %bb.0: @ %entry
213 ; CHECK-NEXT:    .save {r7, lr}
214 ; CHECK-NEXT:    push {r7, lr}
215 ; CHECK-NEXT:    vmov r2, s2
216 ; CHECK-NEXT:    vmov r3, s6
217 ; CHECK-NEXT:    vmov r0, s3
218 ; CHECK-NEXT:    vmov r1, s7
219 ; CHECK-NEXT:    subs.w lr, r3, r2
220 ; CHECK-NEXT:    vmov r2, s4
221 ; CHECK-NEXT:    vmov r3, s5
222 ; CHECK-NEXT:    sbc.w r12, r1, r0
223 ; CHECK-NEXT:    vmov r0, s0
224 ; CHECK-NEXT:    vmov r1, s1
225 ; CHECK-NEXT:    subs r0, r2, r0
226 ; CHECK-NEXT:    sbc.w r1, r3, r1
227 ; CHECK-NEXT:    vmov.32 q0[0], r0
228 ; CHECK-NEXT:    vmov.32 q0[1], r1
229 ; CHECK-NEXT:    vmov.32 q0[2], lr
230 ; CHECK-NEXT:    vmov.32 q0[3], r12
231 ; CHECK-NEXT:    pop {r7, pc}
232 entry:
233   %0 = sub nsw <2 x i64> %src2, %src1
234   ret <2 x i64> %0
237 define arm_aapcs_vfpcc <4 x float> @sub_float32_t(<4 x float> %src1, <4 x float> %src2) {
238 ; CHECK-MVE-LABEL: sub_float32_t:
239 ; CHECK-MVE:       @ %bb.0: @ %entry
240 ; CHECK-MVE-NEXT:    vsub.f32 s11, s7, s3
241 ; CHECK-MVE-NEXT:    vsub.f32 s10, s6, s2
242 ; CHECK-MVE-NEXT:    vsub.f32 s9, s5, s1
243 ; CHECK-MVE-NEXT:    vsub.f32 s8, s4, s0
244 ; CHECK-MVE-NEXT:    vmov q0, q2
245 ; CHECK-MVE-NEXT:    bx lr
247 ; CHECK-MVEFP-LABEL: sub_float32_t:
248 ; CHECK-MVEFP:       @ %bb.0: @ %entry
249 ; CHECK-MVEFP-NEXT:    vsub.f32 q0, q1, q0
250 ; CHECK-MVEFP-NEXT:    bx lr
251 entry:
252   %0 = fsub nnan ninf nsz <4 x float> %src2, %src1
253   ret <4 x float> %0
256 define arm_aapcs_vfpcc <8 x half> @sub_float16_t(<8 x half> %src1, <8 x half> %src2) {
257 ; CHECK-MVE-LABEL: sub_float16_t:
258 ; CHECK-MVE:       @ %bb.0: @ %entry
259 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[0]
260 ; CHECK-MVE-NEXT:    vmov.u16 r1, q0[1]
261 ; CHECK-MVE-NEXT:    vmov s8, r0
262 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[0]
263 ; CHECK-MVE-NEXT:    vmov s10, r0
264 ; CHECK-MVE-NEXT:    vmov.u16 r2, q1[1]
265 ; CHECK-MVE-NEXT:    vsub.f16 s8, s10, s8
266 ; CHECK-MVE-NEXT:    vmov s10, r2
267 ; CHECK-MVE-NEXT:    vmov r0, s8
268 ; CHECK-MVE-NEXT:    vmov s8, r1
269 ; CHECK-MVE-NEXT:    vsub.f16 s8, s10, s8
270 ; CHECK-MVE-NEXT:    vmov r1, s8
271 ; CHECK-MVE-NEXT:    vmov.16 q2[0], r0
272 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[2]
273 ; CHECK-MVE-NEXT:    vmov.16 q2[1], r1
274 ; CHECK-MVE-NEXT:    vmov s12, r0
275 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[2]
276 ; CHECK-MVE-NEXT:    vmov s14, r0
277 ; CHECK-MVE-NEXT:    vsub.f16 s12, s14, s12
278 ; CHECK-MVE-NEXT:    vmov r0, s12
279 ; CHECK-MVE-NEXT:    vmov.16 q2[2], r0
280 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[3]
281 ; CHECK-MVE-NEXT:    vmov s12, r0
282 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[3]
283 ; CHECK-MVE-NEXT:    vmov s14, r0
284 ; CHECK-MVE-NEXT:    vsub.f16 s12, s14, s12
285 ; CHECK-MVE-NEXT:    vmov r0, s12
286 ; CHECK-MVE-NEXT:    vmov.16 q2[3], r0
287 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[4]
288 ; CHECK-MVE-NEXT:    vmov s12, r0
289 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[4]
290 ; CHECK-MVE-NEXT:    vmov s14, r0
291 ; CHECK-MVE-NEXT:    vsub.f16 s12, s14, s12
292 ; CHECK-MVE-NEXT:    vmov r0, s12
293 ; CHECK-MVE-NEXT:    vmov.16 q2[4], r0
294 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[5]
295 ; CHECK-MVE-NEXT:    vmov s12, r0
296 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[5]
297 ; CHECK-MVE-NEXT:    vmov s14, r0
298 ; CHECK-MVE-NEXT:    vsub.f16 s12, s14, s12
299 ; CHECK-MVE-NEXT:    vmov r0, s12
300 ; CHECK-MVE-NEXT:    vmov.16 q2[5], r0
301 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[6]
302 ; CHECK-MVE-NEXT:    vmov s12, r0
303 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[6]
304 ; CHECK-MVE-NEXT:    vmov s14, r0
305 ; CHECK-MVE-NEXT:    vsub.f16 s12, s14, s12
306 ; CHECK-MVE-NEXT:    vmov r0, s12
307 ; CHECK-MVE-NEXT:    vmov.16 q2[6], r0
308 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[7]
309 ; CHECK-MVE-NEXT:    vmov s0, r0
310 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[7]
311 ; CHECK-MVE-NEXT:    vmov s2, r0
312 ; CHECK-MVE-NEXT:    vsub.f16 s0, s2, s0
313 ; CHECK-MVE-NEXT:    vmov r0, s0
314 ; CHECK-MVE-NEXT:    vmov.16 q2[7], r0
315 ; CHECK-MVE-NEXT:    vmov q0, q2
316 ; CHECK-MVE-NEXT:    bx lr
318 ; CHECK-MVEFP-LABEL: sub_float16_t:
319 ; CHECK-MVEFP:       @ %bb.0: @ %entry
320 ; CHECK-MVEFP-NEXT:    vsub.f16 q0, q1, q0
321 ; CHECK-MVEFP-NEXT:    bx lr
322 entry:
323   %0 = fsub nnan ninf nsz <8 x half> %src2, %src1
324   ret <8 x half> %0
327 define arm_aapcs_vfpcc <2 x double> @sub_float64_t(<2 x double> %src1, <2 x double> %src2) {
328 ; CHECK-LABEL: sub_float64_t:
329 ; CHECK:       @ %bb.0: @ %entry
330 ; CHECK-NEXT:    .save {r7, lr}
331 ; CHECK-NEXT:    push {r7, lr}
332 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
333 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
334 ; CHECK-NEXT:    vmov q4, q1
335 ; CHECK-NEXT:    vmov q5, q0
336 ; CHECK-NEXT:    vmov r0, r1, d9
337 ; CHECK-NEXT:    vmov r2, r3, d11
338 ; CHECK-NEXT:    bl __aeabi_dsub
339 ; CHECK-NEXT:    vmov lr, r12, d8
340 ; CHECK-NEXT:    vmov r2, r3, d10
341 ; CHECK-NEXT:    vmov d9, r0, r1
342 ; CHECK-NEXT:    mov r0, lr
343 ; CHECK-NEXT:    mov r1, r12
344 ; CHECK-NEXT:    bl __aeabi_dsub
345 ; CHECK-NEXT:    vmov d8, r0, r1
346 ; CHECK-NEXT:    vmov q0, q4
347 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
348 ; CHECK-NEXT:    pop {r7, pc}
349 entry:
350   %0 = fsub nnan ninf nsz <2 x double> %src2, %src1
351   ret <2 x double> %0
355 define arm_aapcs_vfpcc <16 x i8> @mul_int8_t(<16 x i8> %src1, <16 x i8> %src2) {
356 ; CHECK-LABEL: mul_int8_t:
357 ; CHECK:       @ %bb.0: @ %entry
358 ; CHECK-NEXT:    vmul.i8 q0, q0, q1
359 ; CHECK-NEXT:    bx lr
360 entry:
361   %0 = mul <16 x i8> %src1, %src2
362   ret <16 x i8> %0
365 define arm_aapcs_vfpcc <8 x i16> @mul_int16_t(<8 x i16> %src1, <8 x i16> %src2) {
366 ; CHECK-LABEL: mul_int16_t:
367 ; CHECK:       @ %bb.0: @ %entry
368 ; CHECK-NEXT:    vmul.i16 q0, q0, q1
369 ; CHECK-NEXT:    bx lr
370 entry:
371   %0 = mul <8 x i16> %src1, %src2
372   ret <8 x i16> %0
375 define arm_aapcs_vfpcc <4 x i32> @mul_int32_t(<4 x i32> %src1, <4 x i32> %src2) {
376 ; CHECK-LABEL: mul_int32_t:
377 ; CHECK:       @ %bb.0: @ %entry
378 ; CHECK-NEXT:    vmul.i32 q0, q0, q1
379 ; CHECK-NEXT:    bx lr
380 entry:
381   %0 = mul nsw <4 x i32> %src1, %src2
382   ret <4 x i32> %0
385 define arm_aapcs_vfpcc <2 x i64> @mul_int64_t(<2 x i64> %src1, <2 x i64> %src2) {
386 ; CHECK-LABEL: mul_int64_t:
387 ; CHECK:       @ %bb.0: @ %entry
388 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
389 ; CHECK-NEXT:    push {r4, r5, r7, lr}
390 ; CHECK-NEXT:    vmov r0, s4
391 ; CHECK-NEXT:    vmov r1, s0
392 ; CHECK-NEXT:    vmov r2, s5
393 ; CHECK-NEXT:    umull r12, r3, r1, r0
394 ; CHECK-NEXT:    mla lr, r1, r2, r3
395 ; CHECK-NEXT:    vmov r3, s6
396 ; CHECK-NEXT:    vmov r1, s2
397 ; CHECK-NEXT:    vmov r2, s7
398 ; CHECK-NEXT:    umull r4, r5, r1, r3
399 ; CHECK-NEXT:    mla r1, r1, r2, r5
400 ; CHECK-NEXT:    vmov r2, s1
401 ; CHECK-NEXT:    mla r0, r2, r0, lr
402 ; CHECK-NEXT:    vmov r2, s3
403 ; CHECK-NEXT:    vmov.32 q0[0], r12
404 ; CHECK-NEXT:    vmov.32 q0[1], r0
405 ; CHECK-NEXT:    vmov.32 q0[2], r4
406 ; CHECK-NEXT:    mla r1, r2, r3, r1
407 ; CHECK-NEXT:    vmov.32 q0[3], r1
408 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
409 entry:
410   %0 = mul nsw <2 x i64> %src1, %src2
411   ret <2 x i64> %0
414 define arm_aapcs_vfpcc <8 x half> @mul_float16_t(<8 x half> %src1, <8 x half> %src2) {
415 ; CHECK-MVE-LABEL: mul_float16_t:
416 ; CHECK-MVE:       @ %bb.0: @ %entry
417 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[0]
418 ; CHECK-MVE-NEXT:    vmov.u16 r1, q0[1]
419 ; CHECK-MVE-NEXT:    vmov s8, r0
420 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[0]
421 ; CHECK-MVE-NEXT:    vmov s10, r0
422 ; CHECK-MVE-NEXT:    vmov.u16 r2, q1[1]
423 ; CHECK-MVE-NEXT:    vmul.f16 s8, s10, s8
424 ; CHECK-MVE-NEXT:    vmov s10, r2
425 ; CHECK-MVE-NEXT:    vmov r0, s8
426 ; CHECK-MVE-NEXT:    vmov s8, r1
427 ; CHECK-MVE-NEXT:    vmul.f16 s8, s10, s8
428 ; CHECK-MVE-NEXT:    vmov r1, s8
429 ; CHECK-MVE-NEXT:    vmov.16 q2[0], r0
430 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[2]
431 ; CHECK-MVE-NEXT:    vmov.16 q2[1], r1
432 ; CHECK-MVE-NEXT:    vmov s12, r0
433 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[2]
434 ; CHECK-MVE-NEXT:    vmov s14, r0
435 ; CHECK-MVE-NEXT:    vmul.f16 s12, s14, s12
436 ; CHECK-MVE-NEXT:    vmov r0, s12
437 ; CHECK-MVE-NEXT:    vmov.16 q2[2], r0
438 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[3]
439 ; CHECK-MVE-NEXT:    vmov s12, r0
440 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[3]
441 ; CHECK-MVE-NEXT:    vmov s14, r0
442 ; CHECK-MVE-NEXT:    vmul.f16 s12, s14, s12
443 ; CHECK-MVE-NEXT:    vmov r0, s12
444 ; CHECK-MVE-NEXT:    vmov.16 q2[3], r0
445 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[4]
446 ; CHECK-MVE-NEXT:    vmov s12, r0
447 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[4]
448 ; CHECK-MVE-NEXT:    vmov s14, r0
449 ; CHECK-MVE-NEXT:    vmul.f16 s12, s14, s12
450 ; CHECK-MVE-NEXT:    vmov r0, s12
451 ; CHECK-MVE-NEXT:    vmov.16 q2[4], r0
452 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[5]
453 ; CHECK-MVE-NEXT:    vmov s12, r0
454 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[5]
455 ; CHECK-MVE-NEXT:    vmov s14, r0
456 ; CHECK-MVE-NEXT:    vmul.f16 s12, s14, s12
457 ; CHECK-MVE-NEXT:    vmov r0, s12
458 ; CHECK-MVE-NEXT:    vmov.16 q2[5], r0
459 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[6]
460 ; CHECK-MVE-NEXT:    vmov s12, r0
461 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[6]
462 ; CHECK-MVE-NEXT:    vmov s14, r0
463 ; CHECK-MVE-NEXT:    vmul.f16 s12, s14, s12
464 ; CHECK-MVE-NEXT:    vmov r0, s12
465 ; CHECK-MVE-NEXT:    vmov.16 q2[6], r0
466 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[7]
467 ; CHECK-MVE-NEXT:    vmov s0, r0
468 ; CHECK-MVE-NEXT:    vmov.u16 r0, q1[7]
469 ; CHECK-MVE-NEXT:    vmov s2, r0
470 ; CHECK-MVE-NEXT:    vmul.f16 s0, s2, s0
471 ; CHECK-MVE-NEXT:    vmov r0, s0
472 ; CHECK-MVE-NEXT:    vmov.16 q2[7], r0
473 ; CHECK-MVE-NEXT:    vmov q0, q2
474 ; CHECK-MVE-NEXT:    bx lr
476 ; CHECK-MVEFP-LABEL: mul_float16_t:
477 ; CHECK-MVEFP:       @ %bb.0: @ %entry
478 ; CHECK-MVEFP-NEXT:    vmul.f16 q0, q1, q0
479 ; CHECK-MVEFP-NEXT:    bx lr
480 entry:
481   %0 = fmul nnan ninf nsz <8 x half> %src2, %src1
482   ret <8 x half> %0
485 define arm_aapcs_vfpcc <4 x float> @mul_float32_t(<4 x float> %src1, <4 x float> %src2) {
486 ; CHECK-MVE-LABEL: mul_float32_t:
487 ; CHECK-MVE:       @ %bb.0: @ %entry
488 ; CHECK-MVE-NEXT:    vmul.f32 s11, s7, s3
489 ; CHECK-MVE-NEXT:    vmul.f32 s10, s6, s2
490 ; CHECK-MVE-NEXT:    vmul.f32 s9, s5, s1
491 ; CHECK-MVE-NEXT:    vmul.f32 s8, s4, s0
492 ; CHECK-MVE-NEXT:    vmov q0, q2
493 ; CHECK-MVE-NEXT:    bx lr
495 ; CHECK-MVEFP-LABEL: mul_float32_t:
496 ; CHECK-MVEFP:       @ %bb.0: @ %entry
497 ; CHECK-MVEFP-NEXT:    vmul.f32 q0, q1, q0
498 ; CHECK-MVEFP-NEXT:    bx lr
499 entry:
500   %0 = fmul nnan ninf nsz <4 x float> %src2, %src1
501   ret <4 x float> %0
504 define arm_aapcs_vfpcc <2 x double> @mul_float64_t(<2 x double> %src1, <2 x double> %src2) {
505 ; CHECK-LABEL: mul_float64_t:
506 ; CHECK:       @ %bb.0: @ %entry
507 ; CHECK-NEXT:    .save {r7, lr}
508 ; CHECK-NEXT:    push {r7, lr}
509 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
510 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
511 ; CHECK-NEXT:    vmov q4, q1
512 ; CHECK-NEXT:    vmov q5, q0
513 ; CHECK-NEXT:    vmov r0, r1, d9
514 ; CHECK-NEXT:    vmov r2, r3, d11
515 ; CHECK-NEXT:    bl __aeabi_dmul
516 ; CHECK-NEXT:    vmov lr, r12, d8
517 ; CHECK-NEXT:    vmov r2, r3, d10
518 ; CHECK-NEXT:    vmov d9, r0, r1
519 ; CHECK-NEXT:    mov r0, lr
520 ; CHECK-NEXT:    mov r1, r12
521 ; CHECK-NEXT:    bl __aeabi_dmul
522 ; CHECK-NEXT:    vmov d8, r0, r1
523 ; CHECK-NEXT:    vmov q0, q4
524 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
525 ; CHECK-NEXT:    pop {r7, pc}
526 entry:
527   %0 = fmul nnan ninf nsz <2 x double> %src2, %src1
528   ret <2 x double> %0