Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / mve-intrinsics / absneg-predicated.ll
blobceac5e7e7e933b4ad88be35941f599a6587a8a94
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp -verify-machineinstrs -o - %s | FileCheck %s
3 ; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp -verify-machineinstrs -o - %s | FileCheck %s
5 define arm_aapcs_vfpcc <16 x i8> @test_vmvnq_m_s8(<16 x i8> %inactive, <16 x i8> %a, i16 zeroext %p) {
6 ; CHECK-LABEL: test_vmvnq_m_s8:
7 ; CHECK:       @ %bb.0: @ %entry
8 ; CHECK-NEXT:    vmsr p0, r0
9 ; CHECK-NEXT:    vpst
10 ; CHECK-NEXT:    vmvnt q0, q1
11 ; CHECK-NEXT:    bx lr
12 entry:
13   %0 = zext i16 %p to i32
14   %1 = tail call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
15   %2 = tail call <16 x i8> @llvm.arm.mve.mvn.predicated.v16i8.v16i1(<16 x i8> %a, <16 x i1> %1, <16 x i8> %inactive)
16   ret <16 x i8> %2
19 define arm_aapcs_vfpcc <8 x i16> @test_vmvnq_m_s16(<8 x i16> %inactive, <8 x i16> %a, i16 zeroext %p) {
20 ; CHECK-LABEL: test_vmvnq_m_s16:
21 ; CHECK:       @ %bb.0: @ %entry
22 ; CHECK-NEXT:    vmsr p0, r0
23 ; CHECK-NEXT:    vpst
24 ; CHECK-NEXT:    vmvnt q0, q1
25 ; CHECK-NEXT:    bx lr
26 entry:
27   %0 = zext i16 %p to i32
28   %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
29   %2 = tail call <8 x i16> @llvm.arm.mve.mvn.predicated.v8i16.v8i1(<8 x i16> %a, <8 x i1> %1, <8 x i16> %inactive)
30   ret <8 x i16> %2
33 define arm_aapcs_vfpcc <4 x i32> @test_vmvnq_m_s32(<4 x i32> %inactive, <4 x i32> %a, i16 zeroext %p) {
34 ; CHECK-LABEL: test_vmvnq_m_s32:
35 ; CHECK:       @ %bb.0: @ %entry
36 ; CHECK-NEXT:    vmsr p0, r0
37 ; CHECK-NEXT:    vpst
38 ; CHECK-NEXT:    vmvnt q0, q1
39 ; CHECK-NEXT:    bx lr
40 entry:
41   %0 = zext i16 %p to i32
42   %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
43   %2 = tail call <4 x i32> @llvm.arm.mve.mvn.predicated.v4i32.v4i1(<4 x i32> %a, <4 x i1> %1, <4 x i32> %inactive)
44   ret <4 x i32> %2
47 define arm_aapcs_vfpcc <16 x i8> @test_vmvnq_m_u8(<16 x i8> %inactive, <16 x i8> %a, i16 zeroext %p) {
48 ; CHECK-LABEL: test_vmvnq_m_u8:
49 ; CHECK:       @ %bb.0: @ %entry
50 ; CHECK-NEXT:    vmsr p0, r0
51 ; CHECK-NEXT:    vpst
52 ; CHECK-NEXT:    vmvnt q0, q1
53 ; CHECK-NEXT:    bx lr
54 entry:
55   %0 = zext i16 %p to i32
56   %1 = tail call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
57   %2 = tail call <16 x i8> @llvm.arm.mve.mvn.predicated.v16i8.v16i1(<16 x i8> %a, <16 x i1> %1, <16 x i8> %inactive)
58   ret <16 x i8> %2
61 define arm_aapcs_vfpcc <8 x i16> @test_vmvnq_m_u16(<8 x i16> %inactive, <8 x i16> %a, i16 zeroext %p) {
62 ; CHECK-LABEL: test_vmvnq_m_u16:
63 ; CHECK:       @ %bb.0: @ %entry
64 ; CHECK-NEXT:    vmsr p0, r0
65 ; CHECK-NEXT:    vpst
66 ; CHECK-NEXT:    vmvnt q0, q1
67 ; CHECK-NEXT:    bx lr
68 entry:
69   %0 = zext i16 %p to i32
70   %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
71   %2 = tail call <8 x i16> @llvm.arm.mve.mvn.predicated.v8i16.v8i1(<8 x i16> %a, <8 x i1> %1, <8 x i16> %inactive)
72   ret <8 x i16> %2
75 define arm_aapcs_vfpcc <4 x i32> @test_vmvnq_m_u32(<4 x i32> %inactive, <4 x i32> %a, i16 zeroext %p) {
76 ; CHECK-LABEL: test_vmvnq_m_u32:
77 ; CHECK:       @ %bb.0: @ %entry
78 ; CHECK-NEXT:    vmsr p0, r0
79 ; CHECK-NEXT:    vpst
80 ; CHECK-NEXT:    vmvnt q0, q1
81 ; CHECK-NEXT:    bx lr
82 entry:
83   %0 = zext i16 %p to i32
84   %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
85   %2 = tail call <4 x i32> @llvm.arm.mve.mvn.predicated.v4i32.v4i1(<4 x i32> %a, <4 x i1> %1, <4 x i32> %inactive)
86   ret <4 x i32> %2
89 define arm_aapcs_vfpcc <8 x half> @test_vnegq_m_f16(<8 x half> %inactive, <8 x half> %a, i16 zeroext %p) {
90 ; CHECK-LABEL: test_vnegq_m_f16:
91 ; CHECK:       @ %bb.0: @ %entry
92 ; CHECK-NEXT:    vmsr p0, r0
93 ; CHECK-NEXT:    vpst
94 ; CHECK-NEXT:    vnegt.f16 q0, q1
95 ; CHECK-NEXT:    bx lr
96 entry:
97   %0 = zext i16 %p to i32
98   %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
99   %2 = tail call <8 x half> @llvm.arm.mve.neg.predicated.v8f16.v8i1(<8 x half> %a, <8 x i1> %1, <8 x half> %inactive)
100   ret <8 x half> %2
103 define arm_aapcs_vfpcc <4 x float> @test_vnegq_m_f32(<4 x float> %inactive, <4 x float> %a, i16 zeroext %p) {
104 ; CHECK-LABEL: test_vnegq_m_f32:
105 ; CHECK:       @ %bb.0: @ %entry
106 ; CHECK-NEXT:    vmsr p0, r0
107 ; CHECK-NEXT:    vpst
108 ; CHECK-NEXT:    vnegt.f32 q0, q1
109 ; CHECK-NEXT:    bx lr
110 entry:
111   %0 = zext i16 %p to i32
112   %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
113   %2 = tail call <4 x float> @llvm.arm.mve.neg.predicated.v4f32.v4i1(<4 x float> %a, <4 x i1> %1, <4 x float> %inactive)
114   ret <4 x float> %2
117 define arm_aapcs_vfpcc <16 x i8> @test_vnegq_m_s8(<16 x i8> %inactive, <16 x i8> %a, i16 zeroext %p) {
118 ; CHECK-LABEL: test_vnegq_m_s8:
119 ; CHECK:       @ %bb.0: @ %entry
120 ; CHECK-NEXT:    vmsr p0, r0
121 ; CHECK-NEXT:    vpst
122 ; CHECK-NEXT:    vnegt.s8 q0, q1
123 ; CHECK-NEXT:    bx lr
124 entry:
125   %0 = zext i16 %p to i32
126   %1 = tail call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
127   %2 = tail call <16 x i8> @llvm.arm.mve.neg.predicated.v16i8.v16i1(<16 x i8> %a, <16 x i1> %1, <16 x i8> %inactive)
128   ret <16 x i8> %2
131 define arm_aapcs_vfpcc <8 x i16> @test_vnegq_m_s16(<8 x i16> %inactive, <8 x i16> %a, i16 zeroext %p) {
132 ; CHECK-LABEL: test_vnegq_m_s16:
133 ; CHECK:       @ %bb.0: @ %entry
134 ; CHECK-NEXT:    vmsr p0, r0
135 ; CHECK-NEXT:    vpst
136 ; CHECK-NEXT:    vnegt.s16 q0, q1
137 ; CHECK-NEXT:    bx lr
138 entry:
139   %0 = zext i16 %p to i32
140   %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
141   %2 = tail call <8 x i16> @llvm.arm.mve.neg.predicated.v8i16.v8i1(<8 x i16> %a, <8 x i1> %1, <8 x i16> %inactive)
142   ret <8 x i16> %2
145 define arm_aapcs_vfpcc <4 x i32> @test_vnegq_m_s32(<4 x i32> %inactive, <4 x i32> %a, i16 zeroext %p) {
146 ; CHECK-LABEL: test_vnegq_m_s32:
147 ; CHECK:       @ %bb.0: @ %entry
148 ; CHECK-NEXT:    vmsr p0, r0
149 ; CHECK-NEXT:    vpst
150 ; CHECK-NEXT:    vnegt.s32 q0, q1
151 ; CHECK-NEXT:    bx lr
152 entry:
153   %0 = zext i16 %p to i32
154   %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
155   %2 = tail call <4 x i32> @llvm.arm.mve.neg.predicated.v4i32.v4i1(<4 x i32> %a, <4 x i1> %1, <4 x i32> %inactive)
156   ret <4 x i32> %2
159 define arm_aapcs_vfpcc <8 x half> @test_vabsq_m_f16(<8 x half> %inactive, <8 x half> %a, i16 zeroext %p) {
160 ; CHECK-LABEL: test_vabsq_m_f16:
161 ; CHECK:       @ %bb.0: @ %entry
162 ; CHECK-NEXT:    vmsr p0, r0
163 ; CHECK-NEXT:    vpst
164 ; CHECK-NEXT:    vabst.f16 q0, q1
165 ; CHECK-NEXT:    bx lr
166 entry:
167   %0 = zext i16 %p to i32
168   %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
169   %2 = tail call <8 x half> @llvm.arm.mve.abs.predicated.v8f16.v8i1(<8 x half> %a, <8 x i1> %1, <8 x half> %inactive)
170   ret <8 x half> %2
173 define arm_aapcs_vfpcc <4 x float> @test_vabsq_m_f32(<4 x float> %inactive, <4 x float> %a, i16 zeroext %p) {
174 ; CHECK-LABEL: test_vabsq_m_f32:
175 ; CHECK:       @ %bb.0: @ %entry
176 ; CHECK-NEXT:    vmsr p0, r0
177 ; CHECK-NEXT:    vpst
178 ; CHECK-NEXT:    vabst.f32 q0, q1
179 ; CHECK-NEXT:    bx lr
180 entry:
181   %0 = zext i16 %p to i32
182   %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
183   %2 = tail call <4 x float> @llvm.arm.mve.abs.predicated.v4f32.v4i1(<4 x float> %a, <4 x i1> %1, <4 x float> %inactive)
184   ret <4 x float> %2
187 define arm_aapcs_vfpcc <16 x i8> @test_vabsq_m_s8(<16 x i8> %inactive, <16 x i8> %a, i16 zeroext %p) {
188 ; CHECK-LABEL: test_vabsq_m_s8:
189 ; CHECK:       @ %bb.0: @ %entry
190 ; CHECK-NEXT:    vmsr p0, r0
191 ; CHECK-NEXT:    vpst
192 ; CHECK-NEXT:    vabst.s8 q0, q1
193 ; CHECK-NEXT:    bx lr
194 entry:
195   %0 = zext i16 %p to i32
196   %1 = tail call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
197   %2 = tail call <16 x i8> @llvm.arm.mve.abs.predicated.v16i8.v16i1(<16 x i8> %a, <16 x i1> %1, <16 x i8> %inactive)
198   ret <16 x i8> %2
201 define arm_aapcs_vfpcc <8 x i16> @test_vabsq_m_s16(<8 x i16> %inactive, <8 x i16> %a, i16 zeroext %p) {
202 ; CHECK-LABEL: test_vabsq_m_s16:
203 ; CHECK:       @ %bb.0: @ %entry
204 ; CHECK-NEXT:    vmsr p0, r0
205 ; CHECK-NEXT:    vpst
206 ; CHECK-NEXT:    vabst.s16 q0, q1
207 ; CHECK-NEXT:    bx lr
208 entry:
209   %0 = zext i16 %p to i32
210   %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
211   %2 = tail call <8 x i16> @llvm.arm.mve.abs.predicated.v8i16.v8i1(<8 x i16> %a, <8 x i1> %1, <8 x i16> %inactive)
212   ret <8 x i16> %2
215 define arm_aapcs_vfpcc <4 x i32> @test_vabsq_m_s32(<4 x i32> %inactive, <4 x i32> %a, i16 zeroext %p) {
216 ; CHECK-LABEL: test_vabsq_m_s32:
217 ; CHECK:       @ %bb.0: @ %entry
218 ; CHECK-NEXT:    vmsr p0, r0
219 ; CHECK-NEXT:    vpst
220 ; CHECK-NEXT:    vabst.s32 q0, q1
221 ; CHECK-NEXT:    bx lr
222 entry:
223   %0 = zext i16 %p to i32
224   %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
225   %2 = tail call <4 x i32> @llvm.arm.mve.abs.predicated.v4i32.v4i1(<4 x i32> %a, <4 x i1> %1, <4 x i32> %inactive)
226   ret <4 x i32> %2
229 define arm_aapcs_vfpcc <16 x i8> @test_vqnegq_m_s8(<16 x i8> %inactive, <16 x i8> %a, i16 zeroext %p) {
230 ; CHECK-LABEL: test_vqnegq_m_s8:
231 ; CHECK:       @ %bb.0: @ %entry
232 ; CHECK-NEXT:    vmsr p0, r0
233 ; CHECK-NEXT:    vpst
234 ; CHECK-NEXT:    vqnegt.s8 q0, q1
235 ; CHECK-NEXT:    bx lr
236 entry:
237   %0 = zext i16 %p to i32
238   %1 = tail call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
239   %2 = tail call <16 x i8> @llvm.arm.mve.qneg.predicated.v16i8.v16i1(<16 x i8> %a, <16 x i1> %1, <16 x i8> %inactive)
240   ret <16 x i8> %2
243 define arm_aapcs_vfpcc <8 x i16> @test_vqnegq_m_s16(<8 x i16> %inactive, <8 x i16> %a, i16 zeroext %p) {
244 ; CHECK-LABEL: test_vqnegq_m_s16:
245 ; CHECK:       @ %bb.0: @ %entry
246 ; CHECK-NEXT:    vmsr p0, r0
247 ; CHECK-NEXT:    vpst
248 ; CHECK-NEXT:    vqnegt.s16 q0, q1
249 ; CHECK-NEXT:    bx lr
250 entry:
251   %0 = zext i16 %p to i32
252   %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
253   %2 = tail call <8 x i16> @llvm.arm.mve.qneg.predicated.v8i16.v8i1(<8 x i16> %a, <8 x i1> %1, <8 x i16> %inactive)
254   ret <8 x i16> %2
257 define arm_aapcs_vfpcc <4 x i32> @test_vqnegq_m_s32(<4 x i32> %inactive, <4 x i32> %a, i16 zeroext %p) {
258 ; CHECK-LABEL: test_vqnegq_m_s32:
259 ; CHECK:       @ %bb.0: @ %entry
260 ; CHECK-NEXT:    vmsr p0, r0
261 ; CHECK-NEXT:    vpst
262 ; CHECK-NEXT:    vqnegt.s32 q0, q1
263 ; CHECK-NEXT:    bx lr
264 entry:
265   %0 = zext i16 %p to i32
266   %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
267   %2 = tail call <4 x i32> @llvm.arm.mve.qneg.predicated.v4i32.v4i1(<4 x i32> %a, <4 x i1> %1, <4 x i32> %inactive)
268   ret <4 x i32> %2
271 define arm_aapcs_vfpcc <16 x i8> @test_vqabsq_m_s8(<16 x i8> %inactive, <16 x i8> %a, i16 zeroext %p) {
272 ; CHECK-LABEL: test_vqabsq_m_s8:
273 ; CHECK:       @ %bb.0: @ %entry
274 ; CHECK-NEXT:    vmsr p0, r0
275 ; CHECK-NEXT:    vpst
276 ; CHECK-NEXT:    vqabst.s8 q0, q1
277 ; CHECK-NEXT:    bx lr
278 entry:
279   %0 = zext i16 %p to i32
280   %1 = tail call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
281   %2 = tail call <16 x i8> @llvm.arm.mve.qabs.predicated.v16i8.v16i1(<16 x i8> %a, <16 x i1> %1, <16 x i8> %inactive)
282   ret <16 x i8> %2
285 define arm_aapcs_vfpcc <8 x i16> @test_vqabsq_m_s16(<8 x i16> %inactive, <8 x i16> %a, i16 zeroext %p) {
286 ; CHECK-LABEL: test_vqabsq_m_s16:
287 ; CHECK:       @ %bb.0: @ %entry
288 ; CHECK-NEXT:    vmsr p0, r0
289 ; CHECK-NEXT:    vpst
290 ; CHECK-NEXT:    vqabst.s16 q0, q1
291 ; CHECK-NEXT:    bx lr
292 entry:
293   %0 = zext i16 %p to i32
294   %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
295   %2 = tail call <8 x i16> @llvm.arm.mve.qabs.predicated.v8i16.v8i1(<8 x i16> %a, <8 x i1> %1, <8 x i16> %inactive)
296   ret <8 x i16> %2
299 define arm_aapcs_vfpcc <4 x i32> @test_vqabsq_m_s32(<4 x i32> %inactive, <4 x i32> %a, i16 zeroext %p) {
300 ; CHECK-LABEL: test_vqabsq_m_s32:
301 ; CHECK:       @ %bb.0: @ %entry
302 ; CHECK-NEXT:    vmsr p0, r0
303 ; CHECK-NEXT:    vpst
304 ; CHECK-NEXT:    vqabst.s32 q0, q1
305 ; CHECK-NEXT:    bx lr
306 entry:
307   %0 = zext i16 %p to i32
308   %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
309   %2 = tail call <4 x i32> @llvm.arm.mve.qabs.predicated.v4i32.v4i1(<4 x i32> %a, <4 x i1> %1, <4 x i32> %inactive)
310   ret <4 x i32> %2
313 declare <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32)
314 declare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32)
315 declare <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32)
317 declare <16 x i8> @llvm.arm.mve.mvn.predicated.v16i8.v16i1(<16 x i8>, <16 x i1>, <16 x i8>)
318 declare <8 x i16> @llvm.arm.mve.mvn.predicated.v8i16.v8i1(<8 x i16>, <8 x i1>, <8 x i16>)
319 declare <4 x i32> @llvm.arm.mve.mvn.predicated.v4i32.v4i1(<4 x i32>, <4 x i1>, <4 x i32>)
320 declare <8 x half> @llvm.arm.mve.neg.predicated.v8f16.v8i1(<8 x half>, <8 x i1>, <8 x half>)
321 declare <4 x float> @llvm.arm.mve.neg.predicated.v4f32.v4i1(<4 x float>, <4 x i1>, <4 x float>)
322 declare <16 x i8> @llvm.arm.mve.neg.predicated.v16i8.v16i1(<16 x i8>, <16 x i1>, <16 x i8>)
323 declare <8 x i16> @llvm.arm.mve.neg.predicated.v8i16.v8i1(<8 x i16>, <8 x i1>, <8 x i16>)
324 declare <4 x i32> @llvm.arm.mve.neg.predicated.v4i32.v4i1(<4 x i32>, <4 x i1>, <4 x i32>)
325 declare <8 x half> @llvm.arm.mve.abs.predicated.v8f16.v8i1(<8 x half>, <8 x i1>, <8 x half>)
326 declare <4 x float> @llvm.arm.mve.abs.predicated.v4f32.v4i1(<4 x float>, <4 x i1>, <4 x float>)
327 declare <16 x i8> @llvm.arm.mve.abs.predicated.v16i8.v16i1(<16 x i8>, <16 x i1>, <16 x i8>)
328 declare <8 x i16> @llvm.arm.mve.abs.predicated.v8i16.v8i1(<8 x i16>, <8 x i1>, <8 x i16>)
329 declare <4 x i32> @llvm.arm.mve.abs.predicated.v4i32.v4i1(<4 x i32>, <4 x i1>, <4 x i32>)
330 declare <16 x i8> @llvm.arm.mve.qneg.predicated.v16i8.v16i1(<16 x i8>, <16 x i1>, <16 x i8>)
331 declare <8 x i16> @llvm.arm.mve.qneg.predicated.v8i16.v8i1(<8 x i16>, <8 x i1>, <8 x i16>)
332 declare <4 x i32> @llvm.arm.mve.qneg.predicated.v4i32.v4i1(<4 x i32>, <4 x i1>, <4 x i32>)
333 declare <16 x i8> @llvm.arm.mve.qabs.predicated.v16i8.v16i1(<16 x i8>, <16 x i1>, <16 x i8>)
334 declare <8 x i16> @llvm.arm.mve.qabs.predicated.v8i16.v8i1(<8 x i16>, <8 x i1>, <8 x i16>)
335 declare <4 x i32> @llvm.arm.mve.qabs.predicated.v4i32.v4i1(<4 x i32>, <4 x i1>, <4 x i32>)