[Driver][FreeBSD] Remove FreeBSD/loongarch32 support (#122515)
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / mve-intrinsics / vcaddq.ll
blob322086829953ddddb161bec919aabc0d0ec19de1
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 <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32)
5 declare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32)
6 declare <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32)
8 declare <16 x i8> @llvm.arm.mve.vcaddq.v16i8(i32, i32, <16 x i8>, <16 x i8>)
9 declare <4 x i32> @llvm.arm.mve.vcaddq.v4i32(i32, i32, <4 x i32>, <4 x i32>)
10 declare <8 x i16> @llvm.arm.mve.vcaddq.v8i16(i32, i32, <8 x i16>, <8 x i16>)
11 declare <8 x half> @llvm.arm.mve.vcaddq.v8f16(i32, i32, <8 x half>, <8 x half>)
12 declare <4 x float> @llvm.arm.mve.vcaddq.v4f32(i32, i32, <4 x float>, <4 x float>)
14 declare <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32, i32, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i1>)
15 declare <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32, i32, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i1>)
16 declare <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32, i32, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i1>)
17 declare <8 x half> @llvm.arm.mve.vcaddq.predicated.v8f16.v8i1(i32, i32, <8 x half>, <8 x half>, <8 x half>, <8 x i1>)
18 declare <4 x float> @llvm.arm.mve.vcaddq.predicated.v4f32.v4i1(i32, i32, <4 x float>, <4 x float>, <4 x float>, <4 x i1>)
20 define arm_aapcs_vfpcc <16 x i8> @test_vcaddq_rot90_u8(<16 x i8> %a, <16 x i8> %b) {
21 ; CHECK-LABEL: test_vcaddq_rot90_u8:
22 ; CHECK:       @ %bb.0: @ %entry
23 ; CHECK-NEXT:    vcadd.i8 q0, q0, q1, #90
24 ; CHECK-NEXT:    bx lr
25 entry:
26   %0 = call <16 x i8> @llvm.arm.mve.vcaddq.v16i8(i32 1, i32 0, <16 x i8> %a, <16 x i8> %b)
27   ret <16 x i8> %0
30 define arm_aapcs_vfpcc <8 x i16> @test_vcaddq_rot90_u16(<8 x i16> %a, <8 x i16> %b) {
31 ; CHECK-LABEL: test_vcaddq_rot90_u16:
32 ; CHECK:       @ %bb.0: @ %entry
33 ; CHECK-NEXT:    vcadd.i16 q0, q0, q1, #90
34 ; CHECK-NEXT:    bx lr
35 entry:
36   %0 = call <8 x i16> @llvm.arm.mve.vcaddq.v8i16(i32 1, i32 0, <8 x i16> %a, <8 x i16> %b)
37   ret <8 x i16> %0
40 define arm_aapcs_vfpcc <4 x i32> @test_vcaddq_rot90_u32(<4 x i32> %a, <4 x i32> %b) {
41 ; CHECK-LABEL: test_vcaddq_rot90_u32:
42 ; CHECK:       @ %bb.0: @ %entry
43 ; CHECK-NEXT:    vcadd.i32 q2, q0, q1, #90
44 ; CHECK-NEXT:    vmov q0, q2
45 ; CHECK-NEXT:    bx lr
46 entry:
47   %0 = call <4 x i32> @llvm.arm.mve.vcaddq.v4i32(i32 1, i32 0, <4 x i32> %a, <4 x i32> %b)
48   ret <4 x i32> %0
51 define arm_aapcs_vfpcc <16 x i8> @test_vcaddq_rot90_s8(<16 x i8> %a, <16 x i8> %b) {
52 ; CHECK-LABEL: test_vcaddq_rot90_s8:
53 ; CHECK:       @ %bb.0: @ %entry
54 ; CHECK-NEXT:    vcadd.i8 q0, q0, q1, #90
55 ; CHECK-NEXT:    bx lr
56 entry:
57   %0 = call <16 x i8> @llvm.arm.mve.vcaddq.v16i8(i32 1, i32 0, <16 x i8> %a, <16 x i8> %b)
58   ret <16 x i8> %0
61 define arm_aapcs_vfpcc <8 x i16> @test_vcaddq_rot90_s16(<8 x i16> %a, <8 x i16> %b) {
62 ; CHECK-LABEL: test_vcaddq_rot90_s16:
63 ; CHECK:       @ %bb.0: @ %entry
64 ; CHECK-NEXT:    vcadd.i16 q0, q0, q1, #90
65 ; CHECK-NEXT:    bx lr
66 entry:
67   %0 = call <8 x i16> @llvm.arm.mve.vcaddq.v8i16(i32 1, i32 0, <8 x i16> %a, <8 x i16> %b)
68   ret <8 x i16> %0
71 define arm_aapcs_vfpcc <4 x i32> @test_vcaddq_rot90_s32(<4 x i32> %a, <4 x i32> %b) {
72 ; CHECK-LABEL: test_vcaddq_rot90_s32:
73 ; CHECK:       @ %bb.0: @ %entry
74 ; CHECK-NEXT:    vcadd.i32 q2, q0, q1, #90
75 ; CHECK-NEXT:    vmov q0, q2
76 ; CHECK-NEXT:    bx lr
77 entry:
78   %0 = call <4 x i32> @llvm.arm.mve.vcaddq.v4i32(i32 1, i32 0, <4 x i32> %a, <4 x i32> %b)
79   ret <4 x i32> %0
82 define arm_aapcs_vfpcc <8 x half> @test_vcaddq_rot90_f16(<8 x half> %a, <8 x half> %b) {
83 ; CHECK-LABEL: test_vcaddq_rot90_f16:
84 ; CHECK:       @ %bb.0: @ %entry
85 ; CHECK-NEXT:    vcadd.f16 q0, q0, q1, #90
86 ; CHECK-NEXT:    bx lr
87 entry:
88   %0 = call <8 x half> @llvm.arm.mve.vcaddq.v8f16(i32 1, i32 0, <8 x half> %a, <8 x half> %b)
89   ret <8 x half> %0
92 define arm_aapcs_vfpcc <4 x float> @test_vcaddq_rot90_f32(<4 x float> %a, <4 x float> %b) {
93 ; CHECK-LABEL: test_vcaddq_rot90_f32:
94 ; CHECK:       @ %bb.0: @ %entry
95 ; CHECK-NEXT:    vcadd.f32 q2, q0, q1, #90
96 ; CHECK-NEXT:    vmov q0, q2
97 ; CHECK-NEXT:    bx lr
98 entry:
99   %0 = call <4 x float> @llvm.arm.mve.vcaddq.v4f32(i32 1, i32 0, <4 x float> %a, <4 x float> %b)
100   ret <4 x float> %0
103 define arm_aapcs_vfpcc <16 x i8> @test_vcaddq_rot270_u8(<16 x i8> %a, <16 x i8> %b) {
104 ; CHECK-LABEL: test_vcaddq_rot270_u8:
105 ; CHECK:       @ %bb.0: @ %entry
106 ; CHECK-NEXT:    vcadd.i8 q0, q0, q1, #270
107 ; CHECK-NEXT:    bx lr
108 entry:
109   %0 = call <16 x i8> @llvm.arm.mve.vcaddq.v16i8(i32 1, i32 1, <16 x i8> %a, <16 x i8> %b)
110   ret <16 x i8> %0
113 define arm_aapcs_vfpcc <8 x i16> @test_vcaddq_rot270_u16(<8 x i16> %a, <8 x i16> %b) {
114 ; CHECK-LABEL: test_vcaddq_rot270_u16:
115 ; CHECK:       @ %bb.0: @ %entry
116 ; CHECK-NEXT:    vcadd.i16 q0, q0, q1, #270
117 ; CHECK-NEXT:    bx lr
118 entry:
119   %0 = call <8 x i16> @llvm.arm.mve.vcaddq.v8i16(i32 1, i32 1, <8 x i16> %a, <8 x i16> %b)
120   ret <8 x i16> %0
123 define arm_aapcs_vfpcc <4 x i32> @test_vcaddq_rot270_u32(<4 x i32> %a, <4 x i32> %b) {
124 ; CHECK-LABEL: test_vcaddq_rot270_u32:
125 ; CHECK:       @ %bb.0: @ %entry
126 ; CHECK-NEXT:    vcadd.i32 q2, q0, q1, #270
127 ; CHECK-NEXT:    vmov q0, q2
128 ; CHECK-NEXT:    bx lr
129 entry:
130   %0 = call <4 x i32> @llvm.arm.mve.vcaddq.v4i32(i32 1, i32 1, <4 x i32> %a, <4 x i32> %b)
131   ret <4 x i32> %0
134 define arm_aapcs_vfpcc <16 x i8> @test_vcaddq_rot270_s8(<16 x i8> %a, <16 x i8> %b) {
135 ; CHECK-LABEL: test_vcaddq_rot270_s8:
136 ; CHECK:       @ %bb.0: @ %entry
137 ; CHECK-NEXT:    vcadd.i8 q0, q0, q1, #270
138 ; CHECK-NEXT:    bx lr
139 entry:
140   %0 = call <16 x i8> @llvm.arm.mve.vcaddq.v16i8(i32 1, i32 1, <16 x i8> %a, <16 x i8> %b)
141   ret <16 x i8> %0
144 define arm_aapcs_vfpcc <8 x i16> @test_vcaddq_rot270_s16(<8 x i16> %a, <8 x i16> %b) {
145 ; CHECK-LABEL: test_vcaddq_rot270_s16:
146 ; CHECK:       @ %bb.0: @ %entry
147 ; CHECK-NEXT:    vcadd.i16 q0, q0, q1, #270
148 ; CHECK-NEXT:    bx lr
149 entry:
150   %0 = call <8 x i16> @llvm.arm.mve.vcaddq.v8i16(i32 1, i32 1, <8 x i16> %a, <8 x i16> %b)
151   ret <8 x i16> %0
154 define arm_aapcs_vfpcc <4 x i32> @test_vcaddq_rot270_s32(<4 x i32> %a, <4 x i32> %b) {
155 ; CHECK-LABEL: test_vcaddq_rot270_s32:
156 ; CHECK:       @ %bb.0: @ %entry
157 ; CHECK-NEXT:    vcadd.i32 q2, q0, q1, #270
158 ; CHECK-NEXT:    vmov q0, q2
159 ; CHECK-NEXT:    bx lr
160 entry:
161   %0 = call <4 x i32> @llvm.arm.mve.vcaddq.v4i32(i32 1, i32 1, <4 x i32> %a, <4 x i32> %b)
162   ret <4 x i32> %0
165 define arm_aapcs_vfpcc <8 x half> @test_vcaddq_rot270_f16(<8 x half> %a, <8 x half> %b) {
166 ; CHECK-LABEL: test_vcaddq_rot270_f16:
167 ; CHECK:       @ %bb.0: @ %entry
168 ; CHECK-NEXT:    vcadd.f16 q0, q0, q1, #270
169 ; CHECK-NEXT:    bx lr
170 entry:
171   %0 = call <8 x half> @llvm.arm.mve.vcaddq.v8f16(i32 1, i32 1, <8 x half> %a, <8 x half> %b)
172   ret <8 x half> %0
175 define arm_aapcs_vfpcc <4 x float> @test_vcaddq_rot270_f32(<4 x float> %a, <4 x float> %b) {
176 ; CHECK-LABEL: test_vcaddq_rot270_f32:
177 ; CHECK:       @ %bb.0: @ %entry
178 ; CHECK-NEXT:    vcadd.f32 q2, q0, q1, #270
179 ; CHECK-NEXT:    vmov q0, q2
180 ; CHECK-NEXT:    bx lr
181 entry:
182   %0 = call <4 x float> @llvm.arm.mve.vcaddq.v4f32(i32 1, i32 1, <4 x float> %a, <4 x float> %b)
183   ret <4 x float> %0
186 define arm_aapcs_vfpcc <16 x i8> @test_vcaddq_rot90_m_u8(<16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, i16 zeroext %p) {
187 ; CHECK-LABEL: test_vcaddq_rot90_m_u8:
188 ; CHECK:       @ %bb.0: @ %entry
189 ; CHECK-NEXT:    vmsr p0, r0
190 ; CHECK-NEXT:    vpst
191 ; CHECK-NEXT:    vcaddt.i8 q0, q1, q2, #90
192 ; CHECK-NEXT:    bx lr
193 entry:
194   %0 = zext i16 %p to i32
195   %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
196   %2 = call <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32 1, i32 0, <16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, <16 x i1> %1)
197   ret <16 x i8> %2
200 define arm_aapcs_vfpcc <8 x i16> @test_vcaddq_rot90_m_u16(<8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
201 ; CHECK-LABEL: test_vcaddq_rot90_m_u16:
202 ; CHECK:       @ %bb.0: @ %entry
203 ; CHECK-NEXT:    vmsr p0, r0
204 ; CHECK-NEXT:    vpst
205 ; CHECK-NEXT:    vcaddt.i16 q0, q1, q2, #90
206 ; CHECK-NEXT:    bx lr
207 entry:
208   %0 = zext i16 %p to i32
209   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
210   %2 = call <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32 1, i32 0, <8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
211   ret <8 x i16> %2
214 define arm_aapcs_vfpcc <4 x i32> @test_vcaddq_rot90_m_u32(<4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
215 ; CHECK-LABEL: test_vcaddq_rot90_m_u32:
216 ; CHECK:       @ %bb.0: @ %entry
217 ; CHECK-NEXT:    vmsr p0, r0
218 ; CHECK-NEXT:    vpst
219 ; CHECK-NEXT:    vcaddt.i32 q0, q1, q2, #90
220 ; CHECK-NEXT:    bx lr
221 entry:
222   %0 = zext i16 %p to i32
223   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
224   %2 = call <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32 1, i32 0, <4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
225   ret <4 x i32> %2
228 define arm_aapcs_vfpcc <16 x i8> @test_vcaddq_rot90_m_s8(<16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, i16 zeroext %p) {
229 ; CHECK-LABEL: test_vcaddq_rot90_m_s8:
230 ; CHECK:       @ %bb.0: @ %entry
231 ; CHECK-NEXT:    vmsr p0, r0
232 ; CHECK-NEXT:    vpst
233 ; CHECK-NEXT:    vcaddt.i8 q0, q1, q2, #90
234 ; CHECK-NEXT:    bx lr
235 entry:
236   %0 = zext i16 %p to i32
237   %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
238   %2 = call <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32 1, i32 0, <16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, <16 x i1> %1)
239   ret <16 x i8> %2
242 define arm_aapcs_vfpcc <8 x i16> @test_vcaddq_rot90_m_s16(<8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
243 ; CHECK-LABEL: test_vcaddq_rot90_m_s16:
244 ; CHECK:       @ %bb.0: @ %entry
245 ; CHECK-NEXT:    vmsr p0, r0
246 ; CHECK-NEXT:    vpst
247 ; CHECK-NEXT:    vcaddt.i16 q0, q1, q2, #90
248 ; CHECK-NEXT:    bx lr
249 entry:
250   %0 = zext i16 %p to i32
251   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
252   %2 = call <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32 1, i32 0, <8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
253   ret <8 x i16> %2
256 define arm_aapcs_vfpcc <4 x i32> @test_vcaddq_rot90_m_s32(<4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
257 ; CHECK-LABEL: test_vcaddq_rot90_m_s32:
258 ; CHECK:       @ %bb.0: @ %entry
259 ; CHECK-NEXT:    vmsr p0, r0
260 ; CHECK-NEXT:    vpst
261 ; CHECK-NEXT:    vcaddt.i32 q0, q1, q2, #90
262 ; CHECK-NEXT:    bx lr
263 entry:
264   %0 = zext i16 %p to i32
265   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
266   %2 = call <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32 1, i32 0, <4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
267   ret <4 x i32> %2
270 define arm_aapcs_vfpcc <8 x half> @test_vcaddq_rot90_m_f16(<8 x half> %inactive, <8 x half> %a, <8 x half> %b, i16 zeroext %p) {
271 ; CHECK-LABEL: test_vcaddq_rot90_m_f16:
272 ; CHECK:       @ %bb.0: @ %entry
273 ; CHECK-NEXT:    vmsr p0, r0
274 ; CHECK-NEXT:    vpst
275 ; CHECK-NEXT:    vcaddt.f16 q0, q1, q2, #90
276 ; CHECK-NEXT:    bx lr
277 entry:
278   %0 = zext i16 %p to i32
279   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
280   %2 = call <8 x half> @llvm.arm.mve.vcaddq.predicated.v8f16.v8i1(i32 1, i32 0, <8 x half> %inactive, <8 x half> %a, <8 x half> %b, <8 x i1> %1)
281   ret <8 x half> %2
284 define arm_aapcs_vfpcc <4 x float> @test_vcaddq_rot90_m_f32(<4 x float> %inactive, <4 x float> %a, <4 x float> %b, i16 zeroext %p) {
285 ; CHECK-LABEL: test_vcaddq_rot90_m_f32:
286 ; CHECK:       @ %bb.0: @ %entry
287 ; CHECK-NEXT:    vmsr p0, r0
288 ; CHECK-NEXT:    vpst
289 ; CHECK-NEXT:    vcaddt.f32 q0, q1, q2, #90
290 ; CHECK-NEXT:    bx lr
291 entry:
292   %0 = zext i16 %p to i32
293   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
294   %2 = call <4 x float> @llvm.arm.mve.vcaddq.predicated.v4f32.v4i1(i32 1, i32 0, <4 x float> %inactive, <4 x float> %a, <4 x float> %b, <4 x i1> %1)
295   ret <4 x float> %2
298 define arm_aapcs_vfpcc <16 x i8> @test_vcaddq_rot270_m_u8(<16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, i16 zeroext %p) {
299 ; CHECK-LABEL: test_vcaddq_rot270_m_u8:
300 ; CHECK:       @ %bb.0: @ %entry
301 ; CHECK-NEXT:    vmsr p0, r0
302 ; CHECK-NEXT:    vpst
303 ; CHECK-NEXT:    vcaddt.i8 q0, q1, q2, #270
304 ; CHECK-NEXT:    bx lr
305 entry:
306   %0 = zext i16 %p to i32
307   %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
308   %2 = call <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32 1, i32 1, <16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, <16 x i1> %1)
309   ret <16 x i8> %2
312 define arm_aapcs_vfpcc <8 x i16> @test_vcaddq_rot270_m_u16(<8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
313 ; CHECK-LABEL: test_vcaddq_rot270_m_u16:
314 ; CHECK:       @ %bb.0: @ %entry
315 ; CHECK-NEXT:    vmsr p0, r0
316 ; CHECK-NEXT:    vpst
317 ; CHECK-NEXT:    vcaddt.i16 q0, q1, q2, #270
318 ; CHECK-NEXT:    bx lr
319 entry:
320   %0 = zext i16 %p to i32
321   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
322   %2 = call <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32 1, i32 1, <8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
323   ret <8 x i16> %2
326 define arm_aapcs_vfpcc <4 x i32> @test_vcaddq_rot270_m_u32(<4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
327 ; CHECK-LABEL: test_vcaddq_rot270_m_u32:
328 ; CHECK:       @ %bb.0: @ %entry
329 ; CHECK-NEXT:    vmsr p0, r0
330 ; CHECK-NEXT:    vpst
331 ; CHECK-NEXT:    vcaddt.i32 q0, q1, q2, #270
332 ; CHECK-NEXT:    bx lr
333 entry:
334   %0 = zext i16 %p to i32
335   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
336   %2 = call <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32 1, i32 1, <4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
337   ret <4 x i32> %2
340 define arm_aapcs_vfpcc <16 x i8> @test_vcaddq_rot270_m_s8(<16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, i16 zeroext %p) {
341 ; CHECK-LABEL: test_vcaddq_rot270_m_s8:
342 ; CHECK:       @ %bb.0: @ %entry
343 ; CHECK-NEXT:    vmsr p0, r0
344 ; CHECK-NEXT:    vpst
345 ; CHECK-NEXT:    vcaddt.i8 q0, q1, q2, #270
346 ; CHECK-NEXT:    bx lr
347 entry:
348   %0 = zext i16 %p to i32
349   %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
350   %2 = call <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32 1, i32 1, <16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, <16 x i1> %1)
351   ret <16 x i8> %2
354 define arm_aapcs_vfpcc <8 x i16> @test_vcaddq_rot270_m_s16(<8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
355 ; CHECK-LABEL: test_vcaddq_rot270_m_s16:
356 ; CHECK:       @ %bb.0: @ %entry
357 ; CHECK-NEXT:    vmsr p0, r0
358 ; CHECK-NEXT:    vpst
359 ; CHECK-NEXT:    vcaddt.i16 q0, q1, q2, #270
360 ; CHECK-NEXT:    bx lr
361 entry:
362   %0 = zext i16 %p to i32
363   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
364   %2 = call <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32 1, i32 1, <8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
365   ret <8 x i16> %2
368 define arm_aapcs_vfpcc <4 x i32> @test_vcaddq_rot270_m_s32(<4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
369 ; CHECK-LABEL: test_vcaddq_rot270_m_s32:
370 ; CHECK:       @ %bb.0: @ %entry
371 ; CHECK-NEXT:    vmsr p0, r0
372 ; CHECK-NEXT:    vpst
373 ; CHECK-NEXT:    vcaddt.i32 q0, q1, q2, #270
374 ; CHECK-NEXT:    bx lr
375 entry:
376   %0 = zext i16 %p to i32
377   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
378   %2 = call <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32 1, i32 1, <4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
379   ret <4 x i32> %2
382 define arm_aapcs_vfpcc <8 x half> @test_vcaddq_rot270_m_f16(<8 x half> %inactive, <8 x half> %a, <8 x half> %b, i16 zeroext %p) {
383 ; CHECK-LABEL: test_vcaddq_rot270_m_f16:
384 ; CHECK:       @ %bb.0: @ %entry
385 ; CHECK-NEXT:    vmsr p0, r0
386 ; CHECK-NEXT:    vpst
387 ; CHECK-NEXT:    vcaddt.f16 q0, q1, q2, #270
388 ; CHECK-NEXT:    bx lr
389 entry:
390   %0 = zext i16 %p to i32
391   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
392   %2 = call <8 x half> @llvm.arm.mve.vcaddq.predicated.v8f16.v8i1(i32 1, i32 1, <8 x half> %inactive, <8 x half> %a, <8 x half> %b, <8 x i1> %1)
393   ret <8 x half> %2
396 define arm_aapcs_vfpcc <4 x float> @test_vcaddq_rot270_m_f32(<4 x float> %inactive, <4 x float> %a, <4 x float> %b, i16 zeroext %p) {
397 ; CHECK-LABEL: test_vcaddq_rot270_m_f32:
398 ; CHECK:       @ %bb.0: @ %entry
399 ; CHECK-NEXT:    vmsr p0, r0
400 ; CHECK-NEXT:    vpst
401 ; CHECK-NEXT:    vcaddt.f32 q0, q1, q2, #270
402 ; CHECK-NEXT:    bx lr
403 entry:
404   %0 = zext i16 %p to i32
405   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
406   %2 = call <4 x float> @llvm.arm.mve.vcaddq.predicated.v4f32.v4i1(i32 1, i32 1, <4 x float> %inactive, <4 x float> %a, <4 x float> %b, <4 x i1> %1)
407   ret <4 x float> %2
410 define arm_aapcs_vfpcc <16 x i8> @test_vcaddq_rot90_x_u8(<16 x i8> %a, <16 x i8> %b, i16 zeroext %p) {
411 ; CHECK-LABEL: test_vcaddq_rot90_x_u8:
412 ; CHECK:       @ %bb.0: @ %entry
413 ; CHECK-NEXT:    vmsr p0, r0
414 ; CHECK-NEXT:    vpst
415 ; CHECK-NEXT:    vcaddt.i8 q0, q0, q1, #90
416 ; CHECK-NEXT:    bx lr
417 entry:
418   %0 = zext i16 %p to i32
419   %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
420   %2 = call <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32 1, i32 0, <16 x i8> undef, <16 x i8> %a, <16 x i8> %b, <16 x i1> %1)
421   ret <16 x i8> %2
424 define arm_aapcs_vfpcc <8 x i16> @test_vcaddq_rot90_x_u16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
425 ; CHECK-LABEL: test_vcaddq_rot90_x_u16:
426 ; CHECK:       @ %bb.0: @ %entry
427 ; CHECK-NEXT:    vmsr p0, r0
428 ; CHECK-NEXT:    vpst
429 ; CHECK-NEXT:    vcaddt.i16 q0, q0, q1, #90
430 ; CHECK-NEXT:    bx lr
431 entry:
432   %0 = zext i16 %p to i32
433   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
434   %2 = call <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32 1, i32 0, <8 x i16> undef, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
435   ret <8 x i16> %2
438 define arm_aapcs_vfpcc <4 x i32> @test_vcaddq_rot90_x_u32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
439 ; CHECK-LABEL: test_vcaddq_rot90_x_u32:
440 ; CHECK:       @ %bb.0: @ %entry
441 ; CHECK-NEXT:    vmsr p0, r0
442 ; CHECK-NEXT:    vpst
443 ; CHECK-NEXT:    vcaddt.i32 q2, q0, q1, #90
444 ; CHECK-NEXT:    vmov q0, q2
445 ; CHECK-NEXT:    bx lr
446 entry:
447   %0 = zext i16 %p to i32
448   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
449   %2 = call <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32 1, i32 0, <4 x i32> undef, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
450   ret <4 x i32> %2
453 define arm_aapcs_vfpcc <16 x i8> @test_vcaddq_rot90_x_s8(<16 x i8> %a, <16 x i8> %b, i16 zeroext %p) {
454 ; CHECK-LABEL: test_vcaddq_rot90_x_s8:
455 ; CHECK:       @ %bb.0: @ %entry
456 ; CHECK-NEXT:    vmsr p0, r0
457 ; CHECK-NEXT:    vpst
458 ; CHECK-NEXT:    vcaddt.i8 q0, q0, q1, #90
459 ; CHECK-NEXT:    bx lr
460 entry:
461   %0 = zext i16 %p to i32
462   %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
463   %2 = call <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32 1, i32 0, <16 x i8> undef, <16 x i8> %a, <16 x i8> %b, <16 x i1> %1)
464   ret <16 x i8> %2
467 define arm_aapcs_vfpcc <8 x i16> @test_vcaddq_rot90_x_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
468 ; CHECK-LABEL: test_vcaddq_rot90_x_s16:
469 ; CHECK:       @ %bb.0: @ %entry
470 ; CHECK-NEXT:    vmsr p0, r0
471 ; CHECK-NEXT:    vpst
472 ; CHECK-NEXT:    vcaddt.i16 q0, q0, q1, #90
473 ; CHECK-NEXT:    bx lr
474 entry:
475   %0 = zext i16 %p to i32
476   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
477   %2 = call <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32 1, i32 0, <8 x i16> undef, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
478   ret <8 x i16> %2
481 define arm_aapcs_vfpcc <4 x i32> @test_vcaddq_rot90_x_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
482 ; CHECK-LABEL: test_vcaddq_rot90_x_s32:
483 ; CHECK:       @ %bb.0: @ %entry
484 ; CHECK-NEXT:    vmsr p0, r0
485 ; CHECK-NEXT:    vpst
486 ; CHECK-NEXT:    vcaddt.i32 q2, q0, q1, #90
487 ; CHECK-NEXT:    vmov q0, q2
488 ; CHECK-NEXT:    bx lr
489 entry:
490   %0 = zext i16 %p to i32
491   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
492   %2 = call <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32 1, i32 0, <4 x i32> undef, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
493   ret <4 x i32> %2
496 define arm_aapcs_vfpcc <8 x half> @test_vcaddq_rot90_x_f16(<8 x half> %a, <8 x half> %b, i16 zeroext %p) {
497 ; CHECK-LABEL: test_vcaddq_rot90_x_f16:
498 ; CHECK:       @ %bb.0: @ %entry
499 ; CHECK-NEXT:    vmsr p0, r0
500 ; CHECK-NEXT:    vpst
501 ; CHECK-NEXT:    vcaddt.f16 q0, q0, q1, #90
502 ; CHECK-NEXT:    bx lr
503 entry:
504   %0 = zext i16 %p to i32
505   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
506   %2 = call <8 x half> @llvm.arm.mve.vcaddq.predicated.v8f16.v8i1(i32 1, i32 0, <8 x half> undef, <8 x half> %a, <8 x half> %b, <8 x i1> %1)
507   ret <8 x half> %2
510 define arm_aapcs_vfpcc <4 x float> @test_vcaddq_rot90_x_f32(<4 x float> %a, <4 x float> %b, i16 zeroext %p) {
511 ; CHECK-LABEL: test_vcaddq_rot90_x_f32:
512 ; CHECK:       @ %bb.0: @ %entry
513 ; CHECK-NEXT:    vmsr p0, r0
514 ; CHECK-NEXT:    vpst
515 ; CHECK-NEXT:    vcaddt.f32 q2, q0, q1, #90
516 ; CHECK-NEXT:    vmov q0, q2
517 ; CHECK-NEXT:    bx lr
518 entry:
519   %0 = zext i16 %p to i32
520   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
521   %2 = call <4 x float> @llvm.arm.mve.vcaddq.predicated.v4f32.v4i1(i32 1, i32 0, <4 x float> undef, <4 x float> %a, <4 x float> %b, <4 x i1> %1)
522   ret <4 x float> %2
525 define arm_aapcs_vfpcc <16 x i8> @test_vcaddq_rot270_x_u8(<16 x i8> %a, <16 x i8> %b, i16 zeroext %p) {
526 ; CHECK-LABEL: test_vcaddq_rot270_x_u8:
527 ; CHECK:       @ %bb.0: @ %entry
528 ; CHECK-NEXT:    vmsr p0, r0
529 ; CHECK-NEXT:    vpst
530 ; CHECK-NEXT:    vcaddt.i8 q0, q0, q1, #270
531 ; CHECK-NEXT:    bx lr
532 entry:
533   %0 = zext i16 %p to i32
534   %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
535   %2 = call <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32 1, i32 1, <16 x i8> undef, <16 x i8> %a, <16 x i8> %b, <16 x i1> %1)
536   ret <16 x i8> %2
539 define arm_aapcs_vfpcc <8 x i16> @test_vcaddq_rot270_x_u16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
540 ; CHECK-LABEL: test_vcaddq_rot270_x_u16:
541 ; CHECK:       @ %bb.0: @ %entry
542 ; CHECK-NEXT:    vmsr p0, r0
543 ; CHECK-NEXT:    vpst
544 ; CHECK-NEXT:    vcaddt.i16 q0, q0, q1, #270
545 ; CHECK-NEXT:    bx lr
546 entry:
547   %0 = zext i16 %p to i32
548   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
549   %2 = call <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32 1, i32 1, <8 x i16> undef, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
550   ret <8 x i16> %2
553 define arm_aapcs_vfpcc <4 x i32> @test_vcaddq_rot270_x_u32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
554 ; CHECK-LABEL: test_vcaddq_rot270_x_u32:
555 ; CHECK:       @ %bb.0: @ %entry
556 ; CHECK-NEXT:    vmsr p0, r0
557 ; CHECK-NEXT:    vpst
558 ; CHECK-NEXT:    vcaddt.i32 q2, q0, q1, #270
559 ; CHECK-NEXT:    vmov q0, q2
560 ; CHECK-NEXT:    bx lr
561 entry:
562   %0 = zext i16 %p to i32
563   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
564   %2 = call <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32 1, i32 1, <4 x i32> undef, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
565   ret <4 x i32> %2
568 define arm_aapcs_vfpcc <16 x i8> @test_vcaddq_rot270_x_s8(<16 x i8> %a, <16 x i8> %b, i16 zeroext %p) {
569 ; CHECK-LABEL: test_vcaddq_rot270_x_s8:
570 ; CHECK:       @ %bb.0: @ %entry
571 ; CHECK-NEXT:    vmsr p0, r0
572 ; CHECK-NEXT:    vpst
573 ; CHECK-NEXT:    vcaddt.i8 q0, q0, q1, #270
574 ; CHECK-NEXT:    bx lr
575 entry:
576   %0 = zext i16 %p to i32
577   %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
578   %2 = call <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32 1, i32 1, <16 x i8> undef, <16 x i8> %a, <16 x i8> %b, <16 x i1> %1)
579   ret <16 x i8> %2
582 define arm_aapcs_vfpcc <8 x i16> @test_vcaddq_rot270_x_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
583 ; CHECK-LABEL: test_vcaddq_rot270_x_s16:
584 ; CHECK:       @ %bb.0: @ %entry
585 ; CHECK-NEXT:    vmsr p0, r0
586 ; CHECK-NEXT:    vpst
587 ; CHECK-NEXT:    vcaddt.i16 q0, q0, q1, #270
588 ; CHECK-NEXT:    bx lr
589 entry:
590   %0 = zext i16 %p to i32
591   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
592   %2 = call <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32 1, i32 1, <8 x i16> undef, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
593   ret <8 x i16> %2
596 define arm_aapcs_vfpcc <4 x i32> @test_vcaddq_rot270_x_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
597 ; CHECK-LABEL: test_vcaddq_rot270_x_s32:
598 ; CHECK:       @ %bb.0: @ %entry
599 ; CHECK-NEXT:    vmsr p0, r0
600 ; CHECK-NEXT:    vpst
601 ; CHECK-NEXT:    vcaddt.i32 q2, q0, q1, #270
602 ; CHECK-NEXT:    vmov q0, q2
603 ; CHECK-NEXT:    bx lr
604 entry:
605   %0 = zext i16 %p to i32
606   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
607   %2 = call <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32 1, i32 1, <4 x i32> undef, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
608   ret <4 x i32> %2
611 define arm_aapcs_vfpcc <8 x half> @test_vcaddq_rot270_x_f16(<8 x half> %a, <8 x half> %b, i16 zeroext %p) {
612 ; CHECK-LABEL: test_vcaddq_rot270_x_f16:
613 ; CHECK:       @ %bb.0: @ %entry
614 ; CHECK-NEXT:    vmsr p0, r0
615 ; CHECK-NEXT:    vpst
616 ; CHECK-NEXT:    vcaddt.f16 q0, q0, q1, #270
617 ; CHECK-NEXT:    bx lr
618 entry:
619   %0 = zext i16 %p to i32
620   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
621   %2 = call <8 x half> @llvm.arm.mve.vcaddq.predicated.v8f16.v8i1(i32 1, i32 1, <8 x half> undef, <8 x half> %a, <8 x half> %b, <8 x i1> %1)
622   ret <8 x half> %2
625 define arm_aapcs_vfpcc <4 x float> @test_vcaddq_rot270_x_f32(<4 x float> %a, <4 x float> %b, i16 zeroext %p) {
626 ; CHECK-LABEL: test_vcaddq_rot270_x_f32:
627 ; CHECK:       @ %bb.0: @ %entry
628 ; CHECK-NEXT:    vmsr p0, r0
629 ; CHECK-NEXT:    vpst
630 ; CHECK-NEXT:    vcaddt.f32 q2, q0, q1, #270
631 ; CHECK-NEXT:    vmov q0, q2
632 ; CHECK-NEXT:    bx lr
633 entry:
634   %0 = zext i16 %p to i32
635   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
636   %2 = call <4 x float> @llvm.arm.mve.vcaddq.predicated.v4f32.v4i1(i32 1, i32 1, <4 x float> undef, <4 x float> %a, <4 x float> %b, <4 x i1> %1)
637   ret <4 x float> %2
640 define arm_aapcs_vfpcc <16 x i8> @test_vhcaddq_rot90_s8(<16 x i8> %a, <16 x i8> %b) {
641 ; CHECK-LABEL: test_vhcaddq_rot90_s8:
642 ; CHECK:       @ %bb.0: @ %entry
643 ; CHECK-NEXT:    vhcadd.s8 q0, q0, q1, #90
644 ; CHECK-NEXT:    bx lr
645 entry:
646   %0 = call <16 x i8> @llvm.arm.mve.vcaddq.v16i8(i32 0, i32 0, <16 x i8> %a, <16 x i8> %b)
647   ret <16 x i8> %0
650 define arm_aapcs_vfpcc <8 x i16> @test_vhcaddq_rot90_s16(<8 x i16> %a, <8 x i16> %b) {
651 ; CHECK-LABEL: test_vhcaddq_rot90_s16:
652 ; CHECK:       @ %bb.0: @ %entry
653 ; CHECK-NEXT:    vhcadd.s16 q0, q0, q1, #90
654 ; CHECK-NEXT:    bx lr
655 entry:
656   %0 = call <8 x i16> @llvm.arm.mve.vcaddq.v8i16(i32 0, i32 0, <8 x i16> %a, <8 x i16> %b)
657   ret <8 x i16> %0
660 define arm_aapcs_vfpcc <4 x i32> @test_vhcaddq_rot90_s32(<4 x i32> %a, <4 x i32> %b) {
661 ; CHECK-LABEL: test_vhcaddq_rot90_s32:
662 ; CHECK:       @ %bb.0: @ %entry
663 ; CHECK-NEXT:    vhcadd.s32 q2, q0, q1, #90
664 ; CHECK-NEXT:    vmov q0, q2
665 ; CHECK-NEXT:    bx lr
666 entry:
667   %0 = call <4 x i32> @llvm.arm.mve.vcaddq.v4i32(i32 0, i32 0, <4 x i32> %a, <4 x i32> %b)
668   ret <4 x i32> %0
671 define arm_aapcs_vfpcc <16 x i8> @test_vhcaddq_rot270_s8(<16 x i8> %a, <16 x i8> %b) {
672 ; CHECK-LABEL: test_vhcaddq_rot270_s8:
673 ; CHECK:       @ %bb.0: @ %entry
674 ; CHECK-NEXT:    vhcadd.s8 q0, q0, q1, #270
675 ; CHECK-NEXT:    bx lr
676 entry:
677   %0 = call <16 x i8> @llvm.arm.mve.vcaddq.v16i8(i32 0, i32 1, <16 x i8> %a, <16 x i8> %b)
678   ret <16 x i8> %0
681 define arm_aapcs_vfpcc <8 x i16> @test_vhcaddq_rot270_s16(<8 x i16> %a, <8 x i16> %b) {
682 ; CHECK-LABEL: test_vhcaddq_rot270_s16:
683 ; CHECK:       @ %bb.0: @ %entry
684 ; CHECK-NEXT:    vhcadd.s16 q0, q0, q1, #270
685 ; CHECK-NEXT:    bx lr
686 entry:
687   %0 = call <8 x i16> @llvm.arm.mve.vcaddq.v8i16(i32 0, i32 1, <8 x i16> %a, <8 x i16> %b)
688   ret <8 x i16> %0
691 define arm_aapcs_vfpcc <4 x i32> @test_vhcaddq_rot270_s32(<4 x i32> %a, <4 x i32> %b) {
692 ; CHECK-LABEL: test_vhcaddq_rot270_s32:
693 ; CHECK:       @ %bb.0: @ %entry
694 ; CHECK-NEXT:    vhcadd.s32 q2, q0, q1, #270
695 ; CHECK-NEXT:    vmov q0, q2
696 ; CHECK-NEXT:    bx lr
697 entry:
698   %0 = call <4 x i32> @llvm.arm.mve.vcaddq.v4i32(i32 0, i32 1, <4 x i32> %a, <4 x i32> %b)
699   ret <4 x i32> %0
702 define arm_aapcs_vfpcc <4 x i32> @test_vhcaddq_rot270_s32_undef() {
703 ; CHECK-LABEL: test_vhcaddq_rot270_s32_undef:
704 ; CHECK:       @ %bb.0: @ %entry
705 ; CHECK-NEXT: vhcadd.s32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}, #270
706 ; CHECK-NOT:  vhcadd.s32 q[[REG:[0-9]+]], q{{[0-9]+}}, q[[REG]], #270
707 ; CHECK-NEXT:    bx lr
708 entry:
709   %0 = tail call <4 x i32> @llvm.arm.mve.vcaddq.v4i32(i32 0, i32 1, <4 x i32> undef, <4 x i32> undef)
710   ret <4 x i32> %0
713 define arm_aapcs_vfpcc <4 x i32> @test_vhcaddq_rot270_s32_undef_inline_asm() {
714 ; CHECK-LABEL: test_vhcaddq_rot270_s32_undef_inline_asm:
715 ; CHECK:       @ %bb.0: @ %entry
716 ; CHECK-NEXT: @APP
717 ; CHECK-NEXT: vhcadd.s32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}, #270
718 ; CHECK-NOT:  vhcadd.s32 q[[REG:[0-9]+]], q{{[0-9]+}}, q[[REG]], #270
719 ; CHECK-NEXT: @NO_APP
720 ; CHECK-NEXT:    bx lr
721 entry:
722   %0 = call <4 x i32> asm sideeffect "vhcadd.s32 ${0}, ${1}, ${2}, #270", "=&w,w,w,~{memory}"(<4 x i32> undef, <4 x i32> undef)
723   ret <4 x i32> %0
726 define arm_aapcs_vfpcc <16 x i8> @test_vhcaddq_rot90_x_s8(<16 x i8> %a, <16 x i8> %b, i16 zeroext %p) {
727 ; CHECK-LABEL: test_vhcaddq_rot90_x_s8:
728 ; CHECK:       @ %bb.0: @ %entry
729 ; CHECK-NEXT:    vmsr p0, r0
730 ; CHECK-NEXT:    vpst
731 ; CHECK-NEXT:    vhcaddt.s8 q0, q0, q1, #90
732 ; CHECK-NEXT:    bx lr
733 entry:
734   %0 = zext i16 %p to i32
735   %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
736   %2 = call <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32 0, i32 0, <16 x i8> undef, <16 x i8> %a, <16 x i8> %b, <16 x i1> %1)
737   ret <16 x i8> %2
740 define arm_aapcs_vfpcc <8 x i16> @test_vhcaddq_rot90_x_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
741 ; CHECK-LABEL: test_vhcaddq_rot90_x_s16:
742 ; CHECK:       @ %bb.0: @ %entry
743 ; CHECK-NEXT:    vmsr p0, r0
744 ; CHECK-NEXT:    vpst
745 ; CHECK-NEXT:    vhcaddt.s16 q0, q0, q1, #90
746 ; CHECK-NEXT:    bx lr
747 entry:
748   %0 = zext i16 %p to i32
749   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
750   %2 = call <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32 0, i32 0, <8 x i16> undef, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
751   ret <8 x i16> %2
754 define arm_aapcs_vfpcc <4 x i32> @test_vhcaddq_rot90_x_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
755 ; CHECK-LABEL: test_vhcaddq_rot90_x_s32:
756 ; CHECK:       @ %bb.0: @ %entry
757 ; CHECK-NEXT:    vmsr p0, r0
758 ; CHECK-NEXT:    vpst
759 ; CHECK-NEXT:    vhcaddt.s32 q2, q0, q1, #90
760 ; CHECK-NEXT:    vmov q0, q2
761 ; CHECK-NEXT:    bx lr
762 entry:
763   %0 = zext i16 %p to i32
764   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
765   %2 = call <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32 0, i32 0, <4 x i32> undef, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
766   ret <4 x i32> %2
769 define arm_aapcs_vfpcc <16 x i8> @test_vhcaddq_rot270_x_s8(<16 x i8> %a, <16 x i8> %b, i16 zeroext %p) {
770 ; CHECK-LABEL: test_vhcaddq_rot270_x_s8:
771 ; CHECK:       @ %bb.0: @ %entry
772 ; CHECK-NEXT:    vmsr p0, r0
773 ; CHECK-NEXT:    vpst
774 ; CHECK-NEXT:    vhcaddt.s8 q0, q0, q1, #270
775 ; CHECK-NEXT:    bx lr
776 entry:
777   %0 = zext i16 %p to i32
778   %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
779   %2 = call <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32 0, i32 1, <16 x i8> undef, <16 x i8> %a, <16 x i8> %b, <16 x i1> %1)
780   ret <16 x i8> %2
783 define arm_aapcs_vfpcc <8 x i16> @test_vhcaddq_rot270_x_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
784 ; CHECK-LABEL: test_vhcaddq_rot270_x_s16:
785 ; CHECK:       @ %bb.0: @ %entry
786 ; CHECK-NEXT:    vmsr p0, r0
787 ; CHECK-NEXT:    vpst
788 ; CHECK-NEXT:    vhcaddt.s16 q0, q0, q1, #270
789 ; CHECK-NEXT:    bx lr
790 entry:
791   %0 = zext i16 %p to i32
792   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
793   %2 = call <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32 0, i32 1, <8 x i16> undef, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
794   ret <8 x i16> %2
797 define arm_aapcs_vfpcc <4 x i32> @test_vhcaddq_rot270_x_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
798 ; CHECK-LABEL: test_vhcaddq_rot270_x_s32:
799 ; CHECK:       @ %bb.0: @ %entry
800 ; CHECK-NEXT:    vmsr p0, r0
801 ; CHECK-NEXT:    vpst
802 ; CHECK-NEXT:    vhcaddt.s32 q2, q0, q1, #270
803 ; CHECK-NEXT:    vmov q0, q2
804 ; CHECK-NEXT:    bx lr
805 entry:
806   %0 = zext i16 %p to i32
807   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
808   %2 = call <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32 0, i32 1, <4 x i32> undef, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
809   ret <4 x i32> %2
812 define arm_aapcs_vfpcc <16 x i8> @test_vhcaddq_rot90_m_s8(<16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, i16 zeroext %p) {
813 ; CHECK-LABEL: test_vhcaddq_rot90_m_s8:
814 ; CHECK:       @ %bb.0: @ %entry
815 ; CHECK-NEXT:    vmsr p0, r0
816 ; CHECK-NEXT:    vpst
817 ; CHECK-NEXT:    vhcaddt.s8 q0, q1, q2, #90
818 ; CHECK-NEXT:    bx lr
819 entry:
820   %0 = zext i16 %p to i32
821   %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
822   %2 = call <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32 0, i32 0, <16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, <16 x i1> %1)
823   ret <16 x i8> %2
826 define arm_aapcs_vfpcc <8 x i16> @test_vhcaddq_rot90_m_s16(<8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
827 ; CHECK-LABEL: test_vhcaddq_rot90_m_s16:
828 ; CHECK:       @ %bb.0: @ %entry
829 ; CHECK-NEXT:    vmsr p0, r0
830 ; CHECK-NEXT:    vpst
831 ; CHECK-NEXT:    vhcaddt.s16 q0, q1, q2, #90
832 ; CHECK-NEXT:    bx lr
833 entry:
834   %0 = zext i16 %p to i32
835   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
836   %2 = call <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32 0, i32 0, <8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
837   ret <8 x i16> %2
840 define arm_aapcs_vfpcc <4 x i32> @test_vhcaddq_rot90_m_s32(<4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
841 ; CHECK-LABEL: test_vhcaddq_rot90_m_s32:
842 ; CHECK:       @ %bb.0: @ %entry
843 ; CHECK-NEXT:    vmsr p0, r0
844 ; CHECK-NEXT:    vpst
845 ; CHECK-NEXT:    vhcaddt.s32 q0, q1, q2, #90
846 ; CHECK-NEXT:    bx lr
847 entry:
848   %0 = zext i16 %p to i32
849   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
850   %2 = call <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32 0, i32 0, <4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
851   ret <4 x i32> %2
854 define arm_aapcs_vfpcc <16 x i8> @test_vhcaddq_rot270_m_s8(<16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, i16 zeroext %p) {
855 ; CHECK-LABEL: test_vhcaddq_rot270_m_s8:
856 ; CHECK:       @ %bb.0: @ %entry
857 ; CHECK-NEXT:    vmsr p0, r0
858 ; CHECK-NEXT:    vpst
859 ; CHECK-NEXT:    vhcaddt.s8 q0, q1, q2, #270
860 ; CHECK-NEXT:    bx lr
861 entry:
862   %0 = zext i16 %p to i32
863   %1 = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
864   %2 = call <16 x i8> @llvm.arm.mve.vcaddq.predicated.v16i8.v16i1(i32 0, i32 1, <16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, <16 x i1> %1)
865   ret <16 x i8> %2
868 define arm_aapcs_vfpcc <8 x i16> @test_vhcaddq_rot270_m_s16(<8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, i16 zeroext %p) {
869 ; CHECK-LABEL: test_vhcaddq_rot270_m_s16:
870 ; CHECK:       @ %bb.0: @ %entry
871 ; CHECK-NEXT:    vmsr p0, r0
872 ; CHECK-NEXT:    vpst
873 ; CHECK-NEXT:    vhcaddt.s16 q0, q1, q2, #270
874 ; CHECK-NEXT:    bx lr
875 entry:
876   %0 = zext i16 %p to i32
877   %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
878   %2 = call <8 x i16> @llvm.arm.mve.vcaddq.predicated.v8i16.v8i1(i32 0, i32 1, <8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1)
879   ret <8 x i16> %2
882 define arm_aapcs_vfpcc <4 x i32> @test_vhcaddq_rot270_m_s32(<4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, i16 zeroext %p) {
883 ; CHECK-LABEL: test_vhcaddq_rot270_m_s32:
884 ; CHECK:       @ %bb.0: @ %entry
885 ; CHECK-NEXT:    vmsr p0, r0
886 ; CHECK-NEXT:    vpst
887 ; CHECK-NEXT:    vhcaddt.s32 q0, q1, q2, #270
888 ; CHECK-NEXT:    bx lr
889 entry:
890   %0 = zext i16 %p to i32
891   %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
892   %2 = call <4 x i32> @llvm.arm.mve.vcaddq.predicated.v4i32.v4i1(i32 0, i32 1, <4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1)
893   ret <4 x i32> %2