1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve2 -force-streaming-compatible < %s | FileCheck %s
3 ; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s
4 ; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
7 target triple = "aarch64-unknown-linux-gnu"
9 define i1 @ptest_v16i1(ptr %a, ptr %b) {
10 ; CHECK-LABEL: ptest_v16i1:
12 ; CHECK-NEXT: ldp q1, q0, [x0, #32]
13 ; CHECK-NEXT: ptrue p0.s, vl4
14 ; CHECK-NEXT: ldp q3, q2, [x0]
15 ; CHECK-NEXT: fcmne p1.s, p0/z, z0.s, #0.0
16 ; CHECK-NEXT: fcmne p2.s, p0/z, z1.s, #0.0
17 ; CHECK-NEXT: fcmne p3.s, p0/z, z2.s, #0.0
18 ; CHECK-NEXT: fcmne p0.s, p0/z, z3.s, #0.0
19 ; CHECK-NEXT: mov z0.s, p1/z, #-1 // =0xffffffffffffffff
20 ; CHECK-NEXT: mov z1.s, p2/z, #-1 // =0xffffffffffffffff
21 ; CHECK-NEXT: mov z2.s, p3/z, #-1 // =0xffffffffffffffff
22 ; CHECK-NEXT: mov z3.s, p0/z, #-1 // =0xffffffffffffffff
23 ; CHECK-NEXT: ptrue p0.h, vl4
24 ; CHECK-NEXT: uzp1 z5.h, z0.h, z0.h
25 ; CHECK-NEXT: uzp1 z4.h, z1.h, z1.h
26 ; CHECK-NEXT: uzp1 z1.h, z2.h, z2.h
27 ; CHECK-NEXT: uzp1 z0.h, z3.h, z3.h
28 ; CHECK-NEXT: splice z2.h, p0, { z4.h, z5.h }
29 ; CHECK-NEXT: splice z0.h, p0, { z0.h, z1.h }
30 ; CHECK-NEXT: ptrue p0.b, vl8
31 ; CHECK-NEXT: uzp1 z2.b, z2.b, z2.b
32 ; CHECK-NEXT: uzp1 z1.b, z0.b, z0.b
33 ; CHECK-NEXT: splice z0.b, p0, { z1.b, z2.b }
34 ; CHECK-NEXT: ptrue p0.b, vl16
35 ; CHECK-NEXT: umaxv b0, p0, z0.b
36 ; CHECK-NEXT: fmov w8, s0
37 ; CHECK-NEXT: and w0, w8, #0x1
40 ; NONEON-NOSVE-LABEL: ptest_v16i1:
41 ; NONEON-NOSVE: // %bb.0:
42 ; NONEON-NOSVE-NEXT: sub sp, sp, #64
43 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64
44 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]
45 ; NONEON-NOSVE-NEXT: mov w8, #255 // =0xff
46 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #32]
47 ; NONEON-NOSVE-NEXT: stp q1, q2, [sp]
48 ; NONEON-NOSVE-NEXT: stp q0, q3, [sp, #32]
49 ; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #40]
50 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
51 ; NONEON-NOSVE-NEXT: csel w9, w8, wzr, ne
52 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
53 ; NONEON-NOSVE-NEXT: ldp s1, s0, [sp]
54 ; NONEON-NOSVE-NEXT: csetm w10, ne
55 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
56 ; NONEON-NOSVE-NEXT: csetm w11, ne
57 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
58 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8]
59 ; NONEON-NOSVE-NEXT: csinv w11, w11, wzr, eq
60 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
61 ; NONEON-NOSVE-NEXT: csinv w11, w11, wzr, eq
62 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
63 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #32]
64 ; NONEON-NOSVE-NEXT: csinv w11, w11, wzr, eq
65 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
66 ; NONEON-NOSVE-NEXT: csinv w11, w11, wzr, eq
67 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
68 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #48]
69 ; NONEON-NOSVE-NEXT: csinv w11, w11, wzr, eq
70 ; NONEON-NOSVE-NEXT: cmp w11, w10
71 ; NONEON-NOSVE-NEXT: csel w10, w11, w10, hi
72 ; NONEON-NOSVE-NEXT: and w10, w10, #0xff
73 ; NONEON-NOSVE-NEXT: cmp w10, w9
74 ; NONEON-NOSVE-NEXT: csel w9, w10, w9, hi
75 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
76 ; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne
77 ; NONEON-NOSVE-NEXT: cmp w9, w10
78 ; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi
79 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
80 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #56]
81 ; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne
82 ; NONEON-NOSVE-NEXT: cmp w9, w10
83 ; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi
84 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
85 ; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne
86 ; NONEON-NOSVE-NEXT: cmp w9, w10
87 ; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi
88 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
89 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #16]
90 ; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne
91 ; NONEON-NOSVE-NEXT: cmp w9, w10
92 ; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi
93 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
94 ; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne
95 ; NONEON-NOSVE-NEXT: cmp w9, w10
96 ; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi
97 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
98 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #24]
99 ; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne
100 ; NONEON-NOSVE-NEXT: cmp w9, w10
101 ; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi
102 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
103 ; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne
104 ; NONEON-NOSVE-NEXT: cmp w9, w10
105 ; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi
106 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
107 ; NONEON-NOSVE-NEXT: csel w8, w8, wzr, ne
108 ; NONEON-NOSVE-NEXT: cmp w9, w8
109 ; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi
110 ; NONEON-NOSVE-NEXT: and w0, w8, #0x1
111 ; NONEON-NOSVE-NEXT: add sp, sp, #64
112 ; NONEON-NOSVE-NEXT: ret
113 %v0 = bitcast ptr %a to ptr
114 %v1 = load <16 x float>, ptr %v0, align 4
115 %v2 = fcmp une <16 x float> %v1, zeroinitializer
116 %v3 = call i1 @llvm.vector.reduce.or.i1.v16i1 (<16 x i1> %v2)
120 define i1 @ptest_or_v16i1(ptr %a, ptr %b) {
121 ; CHECK-LABEL: ptest_or_v16i1:
123 ; CHECK-NEXT: ldp q0, q1, [x0, #32]
124 ; CHECK-NEXT: ptrue p0.s, vl4
125 ; CHECK-NEXT: ldp q2, q3, [x1, #32]
126 ; CHECK-NEXT: ldp q4, q5, [x0]
127 ; CHECK-NEXT: fcmne p1.s, p0/z, z1.s, #0.0
128 ; CHECK-NEXT: ldp q1, q6, [x1]
129 ; CHECK-NEXT: fcmne p3.s, p0/z, z3.s, #0.0
130 ; CHECK-NEXT: fcmne p2.s, p0/z, z0.s, #0.0
131 ; CHECK-NEXT: fcmne p5.s, p0/z, z2.s, #0.0
132 ; CHECK-NEXT: fcmne p4.s, p0/z, z5.s, #0.0
133 ; CHECK-NEXT: fcmne p7.s, p0/z, z4.s, #0.0
134 ; CHECK-NEXT: fcmne p6.s, p0/z, z6.s, #0.0
135 ; CHECK-NEXT: fcmne p0.s, p0/z, z1.s, #0.0
136 ; CHECK-NEXT: mov z0.s, p1/z, #-1 // =0xffffffffffffffff
137 ; CHECK-NEXT: mov z2.s, p3/z, #-1 // =0xffffffffffffffff
138 ; CHECK-NEXT: mov z1.s, p2/z, #-1 // =0xffffffffffffffff
139 ; CHECK-NEXT: mov z4.s, p5/z, #-1 // =0xffffffffffffffff
140 ; CHECK-NEXT: mov z3.s, p4/z, #-1 // =0xffffffffffffffff
141 ; CHECK-NEXT: mov z6.s, p7/z, #-1 // =0xffffffffffffffff
142 ; CHECK-NEXT: mov z5.s, p6/z, #-1 // =0xffffffffffffffff
143 ; CHECK-NEXT: mov z7.s, p0/z, #-1 // =0xffffffffffffffff
144 ; CHECK-NEXT: uzp1 z17.h, z0.h, z0.h
145 ; CHECK-NEXT: uzp1 z19.h, z2.h, z2.h
146 ; CHECK-NEXT: uzp1 z16.h, z1.h, z1.h
147 ; CHECK-NEXT: ptrue p0.h, vl4
148 ; CHECK-NEXT: uzp1 z1.h, z3.h, z3.h
149 ; CHECK-NEXT: uzp1 z18.h, z4.h, z4.h
150 ; CHECK-NEXT: uzp1 z3.h, z5.h, z5.h
151 ; CHECK-NEXT: uzp1 z0.h, z6.h, z6.h
152 ; CHECK-NEXT: uzp1 z2.h, z7.h, z7.h
153 ; CHECK-NEXT: splice z4.h, p0, { z16.h, z17.h }
154 ; CHECK-NEXT: splice z5.h, p0, { z18.h, z19.h }
155 ; CHECK-NEXT: splice z0.h, p0, { z0.h, z1.h }
156 ; CHECK-NEXT: splice z1.h, p0, { z2.h, z3.h }
157 ; CHECK-NEXT: ptrue p0.b, vl8
158 ; CHECK-NEXT: uzp1 z3.b, z4.b, z4.b
159 ; CHECK-NEXT: uzp1 z5.b, z5.b, z5.b
160 ; CHECK-NEXT: uzp1 z2.b, z0.b, z0.b
161 ; CHECK-NEXT: uzp1 z4.b, z1.b, z1.b
162 ; CHECK-NEXT: splice z0.b, p0, { z2.b, z3.b }
163 ; CHECK-NEXT: splice z1.b, p0, { z4.b, z5.b }
164 ; CHECK-NEXT: ptrue p0.b, vl16
165 ; CHECK-NEXT: orr z0.d, z0.d, z1.d
166 ; CHECK-NEXT: umaxv b0, p0, z0.b
167 ; CHECK-NEXT: fmov w8, s0
168 ; CHECK-NEXT: and w0, w8, #0x1
171 ; NONEON-NOSVE-LABEL: ptest_or_v16i1:
172 ; NONEON-NOSVE: // %bb.0:
173 ; NONEON-NOSVE-NEXT: sub sp, sp, #128
174 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128
175 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]
176 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #32]
177 ; NONEON-NOSVE-NEXT: str q1, [sp]
178 ; NONEON-NOSVE-NEXT: stp q0, q3, [sp, #48]
179 ; NONEON-NOSVE-NEXT: str q2, [sp, #32]
180 ; NONEON-NOSVE-NEXT: ldr s1, [sp, #52]
181 ; NONEON-NOSVE-NEXT: ldr q0, [x1, #16]
182 ; NONEON-NOSVE-NEXT: str q0, [sp, #96]
183 ; NONEON-NOSVE-NEXT: ldp s2, s0, [sp, #96]
184 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
185 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]
186 ; NONEON-NOSVE-NEXT: csetm w8, ne
187 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
188 ; NONEON-NOSVE-NEXT: ldr q1, [x1]
189 ; NONEON-NOSVE-NEXT: str q1, [sp, #16]
190 ; NONEON-NOSVE-NEXT: csinv w8, w8, wzr, eq
191 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
192 ; NONEON-NOSVE-NEXT: ldr s2, [sp, #12]
193 ; NONEON-NOSVE-NEXT: csetm w9, ne
194 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
195 ; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #24]
196 ; NONEON-NOSVE-NEXT: csinv w9, w9, wzr, eq
197 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
198 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #8]
199 ; NONEON-NOSVE-NEXT: csetm w10, ne
200 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
201 ; NONEON-NOSVE-NEXT: csinv w10, w10, wzr, eq
202 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
203 ; NONEON-NOSVE-NEXT: csetm w11, ne
204 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
205 ; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #16]
206 ; NONEON-NOSVE-NEXT: csinv w11, w11, wzr, eq
207 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
208 ; NONEON-NOSVE-NEXT: ldp s2, s0, [sp]
209 ; NONEON-NOSVE-NEXT: orr w10, w11, w10
210 ; NONEON-NOSVE-NEXT: csetm w12, ne
211 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
212 ; NONEON-NOSVE-NEXT: csinv w12, w12, wzr, eq
213 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
214 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #104]
215 ; NONEON-NOSVE-NEXT: csetm w13, ne
216 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
217 ; NONEON-NOSVE-NEXT: csinv w14, w13, wzr, eq
218 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
219 ; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #56]
220 ; NONEON-NOSVE-NEXT: orr w12, w14, w12
221 ; NONEON-NOSVE-NEXT: orr w10, w12, w10
222 ; NONEON-NOSVE-NEXT: csetm w13, ne
223 ; NONEON-NOSVE-NEXT: orr w9, w10, w9
224 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
225 ; NONEON-NOSVE-NEXT: ldr q0, [x1, #32]
226 ; NONEON-NOSVE-NEXT: str q0, [sp, #112]
227 ; NONEON-NOSVE-NEXT: csinv w13, w13, wzr, eq
228 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
229 ; NONEON-NOSVE-NEXT: ldr s1, [sp, #64]
230 ; NONEON-NOSVE-NEXT: csetm w15, ne
231 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
232 ; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #112]
233 ; NONEON-NOSVE-NEXT: csinv w15, w15, wzr, eq
234 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
235 ; NONEON-NOSVE-NEXT: and w11, w15, #0xff
236 ; NONEON-NOSVE-NEXT: csetm w16, ne
237 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
238 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #68]
239 ; NONEON-NOSVE-NEXT: csinv w16, w16, wzr, eq
240 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
241 ; NONEON-NOSVE-NEXT: csetm w17, ne
242 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
243 ; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #120]
244 ; NONEON-NOSVE-NEXT: csinv w17, w17, wzr, eq
245 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
246 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #76]
247 ; NONEON-NOSVE-NEXT: csetm w18, ne
248 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
249 ; NONEON-NOSVE-NEXT: ldr q1, [x1, #48]
250 ; NONEON-NOSVE-NEXT: str q1, [sp, #80]
251 ; NONEON-NOSVE-NEXT: csinv w18, w18, wzr, eq
252 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
253 ; NONEON-NOSVE-NEXT: ldr s2, [sp, #32]
254 ; NONEON-NOSVE-NEXT: csetm w0, ne
255 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
256 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #80]
257 ; NONEON-NOSVE-NEXT: csinv w0, w0, wzr, eq
258 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
259 ; NONEON-NOSVE-NEXT: csetm w1, ne
260 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
261 ; NONEON-NOSVE-NEXT: csinv w1, w1, wzr, eq
262 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
263 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #36]
264 ; NONEON-NOSVE-NEXT: csetm w2, ne
265 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
266 ; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #88]
267 ; NONEON-NOSVE-NEXT: csinv w2, w2, wzr, eq
268 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
269 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #44]
270 ; NONEON-NOSVE-NEXT: csetm w3, ne
271 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
272 ; NONEON-NOSVE-NEXT: csinv w3, w3, wzr, eq
273 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
274 ; NONEON-NOSVE-NEXT: csetm w4, ne
275 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
276 ; NONEON-NOSVE-NEXT: csinv w10, w4, wzr, eq
277 ; NONEON-NOSVE-NEXT: cmp w9, w8
278 ; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi
279 ; NONEON-NOSVE-NEXT: and w9, w13, #0xff
280 ; NONEON-NOSVE-NEXT: and w10, w10, #0xff
281 ; NONEON-NOSVE-NEXT: and w8, w8, #0xff
282 ; NONEON-NOSVE-NEXT: cmp w8, w9
283 ; NONEON-NOSVE-NEXT: csel w8, w8, w9, hi
284 ; NONEON-NOSVE-NEXT: and w9, w16, #0xff
285 ; NONEON-NOSVE-NEXT: cmp w8, w11
286 ; NONEON-NOSVE-NEXT: csel w8, w8, w11, hi
287 ; NONEON-NOSVE-NEXT: and w11, w17, #0xff
288 ; NONEON-NOSVE-NEXT: cmp w8, w9
289 ; NONEON-NOSVE-NEXT: csel w8, w8, w9, hi
290 ; NONEON-NOSVE-NEXT: and w9, w18, #0xff
291 ; NONEON-NOSVE-NEXT: cmp w8, w11
292 ; NONEON-NOSVE-NEXT: csel w8, w8, w11, hi
293 ; NONEON-NOSVE-NEXT: and w11, w0, #0xff
294 ; NONEON-NOSVE-NEXT: cmp w8, w9
295 ; NONEON-NOSVE-NEXT: csel w8, w8, w9, hi
296 ; NONEON-NOSVE-NEXT: and w9, w1, #0xff
297 ; NONEON-NOSVE-NEXT: cmp w8, w11
298 ; NONEON-NOSVE-NEXT: csel w8, w8, w11, hi
299 ; NONEON-NOSVE-NEXT: and w11, w2, #0xff
300 ; NONEON-NOSVE-NEXT: cmp w8, w9
301 ; NONEON-NOSVE-NEXT: csel w8, w8, w9, hi
302 ; NONEON-NOSVE-NEXT: and w9, w3, #0xff
303 ; NONEON-NOSVE-NEXT: cmp w8, w11
304 ; NONEON-NOSVE-NEXT: csel w8, w8, w11, hi
305 ; NONEON-NOSVE-NEXT: cmp w8, w9
306 ; NONEON-NOSVE-NEXT: csel w8, w8, w9, hi
307 ; NONEON-NOSVE-NEXT: cmp w8, w10
308 ; NONEON-NOSVE-NEXT: csel w8, w8, w10, hi
309 ; NONEON-NOSVE-NEXT: and w0, w8, #0x1
310 ; NONEON-NOSVE-NEXT: add sp, sp, #128
311 ; NONEON-NOSVE-NEXT: ret
312 %v0 = bitcast ptr %a to ptr
313 %v1 = load <16 x float>, ptr %v0, align 4
314 %v2 = fcmp une <16 x float> %v1, zeroinitializer
315 %v3 = bitcast ptr %b to ptr
316 %v4 = load <16 x float>, ptr %v3, align 4
317 %v5 = fcmp une <16 x float> %v4, zeroinitializer
318 %v6 = or <16 x i1> %v2, %v5
319 %v7 = call i1 @llvm.vector.reduce.or.i1.v16i1 (<16 x i1> %v6)
323 declare i1 @llvm.vector.reduce.or.i1.v16i1(<16 x i1>)
329 define i1 @ptest_and_v16i1(ptr %a, ptr %b) {
330 ; CHECK-LABEL: ptest_and_v16i1:
332 ; CHECK-NEXT: ldp q0, q1, [x0, #32]
333 ; CHECK-NEXT: ptrue p0.s, vl4
334 ; CHECK-NEXT: ldp q2, q3, [x1, #32]
335 ; CHECK-NEXT: ldp q4, q5, [x0]
336 ; CHECK-NEXT: fcmne p1.s, p0/z, z1.s, #0.0
337 ; CHECK-NEXT: ldp q1, q6, [x1]
338 ; CHECK-NEXT: fcmne p3.s, p0/z, z3.s, #0.0
339 ; CHECK-NEXT: fcmne p2.s, p0/z, z0.s, #0.0
340 ; CHECK-NEXT: fcmne p5.s, p0/z, z2.s, #0.0
341 ; CHECK-NEXT: fcmne p4.s, p0/z, z5.s, #0.0
342 ; CHECK-NEXT: fcmne p7.s, p0/z, z4.s, #0.0
343 ; CHECK-NEXT: fcmne p6.s, p0/z, z6.s, #0.0
344 ; CHECK-NEXT: fcmne p0.s, p0/z, z1.s, #0.0
345 ; CHECK-NEXT: mov z0.s, p1/z, #-1 // =0xffffffffffffffff
346 ; CHECK-NEXT: mov z2.s, p3/z, #-1 // =0xffffffffffffffff
347 ; CHECK-NEXT: mov z1.s, p2/z, #-1 // =0xffffffffffffffff
348 ; CHECK-NEXT: mov z4.s, p5/z, #-1 // =0xffffffffffffffff
349 ; CHECK-NEXT: mov z3.s, p4/z, #-1 // =0xffffffffffffffff
350 ; CHECK-NEXT: mov z6.s, p7/z, #-1 // =0xffffffffffffffff
351 ; CHECK-NEXT: mov z5.s, p6/z, #-1 // =0xffffffffffffffff
352 ; CHECK-NEXT: mov z7.s, p0/z, #-1 // =0xffffffffffffffff
353 ; CHECK-NEXT: uzp1 z17.h, z0.h, z0.h
354 ; CHECK-NEXT: uzp1 z19.h, z2.h, z2.h
355 ; CHECK-NEXT: uzp1 z16.h, z1.h, z1.h
356 ; CHECK-NEXT: ptrue p0.h, vl4
357 ; CHECK-NEXT: uzp1 z1.h, z3.h, z3.h
358 ; CHECK-NEXT: uzp1 z18.h, z4.h, z4.h
359 ; CHECK-NEXT: uzp1 z3.h, z5.h, z5.h
360 ; CHECK-NEXT: uzp1 z0.h, z6.h, z6.h
361 ; CHECK-NEXT: uzp1 z2.h, z7.h, z7.h
362 ; CHECK-NEXT: splice z4.h, p0, { z16.h, z17.h }
363 ; CHECK-NEXT: splice z5.h, p0, { z18.h, z19.h }
364 ; CHECK-NEXT: splice z0.h, p0, { z0.h, z1.h }
365 ; CHECK-NEXT: splice z1.h, p0, { z2.h, z3.h }
366 ; CHECK-NEXT: ptrue p0.b, vl8
367 ; CHECK-NEXT: uzp1 z3.b, z4.b, z4.b
368 ; CHECK-NEXT: uzp1 z5.b, z5.b, z5.b
369 ; CHECK-NEXT: uzp1 z2.b, z0.b, z0.b
370 ; CHECK-NEXT: uzp1 z4.b, z1.b, z1.b
371 ; CHECK-NEXT: splice z0.b, p0, { z2.b, z3.b }
372 ; CHECK-NEXT: splice z1.b, p0, { z4.b, z5.b }
373 ; CHECK-NEXT: ptrue p0.b, vl16
374 ; CHECK-NEXT: and z0.d, z0.d, z1.d
375 ; CHECK-NEXT: uminv b0, p0, z0.b
376 ; CHECK-NEXT: fmov w8, s0
377 ; CHECK-NEXT: and w0, w8, #0x1
380 ; NONEON-NOSVE-LABEL: ptest_and_v16i1:
381 ; NONEON-NOSVE: // %bb.0:
382 ; NONEON-NOSVE-NEXT: sub sp, sp, #128
383 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128
384 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]
385 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #32]
386 ; NONEON-NOSVE-NEXT: str q1, [sp]
387 ; NONEON-NOSVE-NEXT: stp q0, q3, [sp, #48]
388 ; NONEON-NOSVE-NEXT: str q2, [sp, #32]
389 ; NONEON-NOSVE-NEXT: ldr s1, [sp, #52]
390 ; NONEON-NOSVE-NEXT: ldr q0, [x1, #16]
391 ; NONEON-NOSVE-NEXT: str q0, [sp, #96]
392 ; NONEON-NOSVE-NEXT: ldp s2, s0, [sp, #96]
393 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
394 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]
395 ; NONEON-NOSVE-NEXT: csetm w8, ne
396 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
397 ; NONEON-NOSVE-NEXT: ldr q1, [x1]
398 ; NONEON-NOSVE-NEXT: str q1, [sp, #16]
399 ; NONEON-NOSVE-NEXT: csel w8, w8, wzr, ne
400 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
401 ; NONEON-NOSVE-NEXT: ldr s2, [sp, #12]
402 ; NONEON-NOSVE-NEXT: csetm w9, ne
403 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
404 ; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #24]
405 ; NONEON-NOSVE-NEXT: csel w9, w9, wzr, ne
406 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
407 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #8]
408 ; NONEON-NOSVE-NEXT: csetm w10, ne
409 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
410 ; NONEON-NOSVE-NEXT: csel w10, w10, wzr, ne
411 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
412 ; NONEON-NOSVE-NEXT: csetm w11, ne
413 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
414 ; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #16]
415 ; NONEON-NOSVE-NEXT: csel w11, w11, wzr, ne
416 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
417 ; NONEON-NOSVE-NEXT: ldp s2, s0, [sp]
418 ; NONEON-NOSVE-NEXT: and w10, w11, w10
419 ; NONEON-NOSVE-NEXT: csetm w12, ne
420 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
421 ; NONEON-NOSVE-NEXT: csel w12, w12, wzr, ne
422 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
423 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #104]
424 ; NONEON-NOSVE-NEXT: csetm w13, ne
425 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
426 ; NONEON-NOSVE-NEXT: csel w14, w13, wzr, ne
427 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
428 ; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #56]
429 ; NONEON-NOSVE-NEXT: and w12, w14, w12
430 ; NONEON-NOSVE-NEXT: and w10, w12, w10
431 ; NONEON-NOSVE-NEXT: csetm w13, ne
432 ; NONEON-NOSVE-NEXT: and w9, w10, w9
433 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
434 ; NONEON-NOSVE-NEXT: ldr q0, [x1, #32]
435 ; NONEON-NOSVE-NEXT: str q0, [sp, #112]
436 ; NONEON-NOSVE-NEXT: csel w13, w13, wzr, ne
437 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
438 ; NONEON-NOSVE-NEXT: ldr s1, [sp, #64]
439 ; NONEON-NOSVE-NEXT: csetm w15, ne
440 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
441 ; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #112]
442 ; NONEON-NOSVE-NEXT: csel w15, w15, wzr, ne
443 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
444 ; NONEON-NOSVE-NEXT: and w11, w15, #0xff
445 ; NONEON-NOSVE-NEXT: csetm w16, ne
446 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
447 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #68]
448 ; NONEON-NOSVE-NEXT: csel w16, w16, wzr, ne
449 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
450 ; NONEON-NOSVE-NEXT: csetm w17, ne
451 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
452 ; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #120]
453 ; NONEON-NOSVE-NEXT: csel w17, w17, wzr, ne
454 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
455 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #76]
456 ; NONEON-NOSVE-NEXT: csetm w18, ne
457 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
458 ; NONEON-NOSVE-NEXT: ldr q1, [x1, #48]
459 ; NONEON-NOSVE-NEXT: str q1, [sp, #80]
460 ; NONEON-NOSVE-NEXT: csel w18, w18, wzr, ne
461 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
462 ; NONEON-NOSVE-NEXT: ldr s2, [sp, #32]
463 ; NONEON-NOSVE-NEXT: csetm w0, ne
464 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
465 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #80]
466 ; NONEON-NOSVE-NEXT: csel w0, w0, wzr, ne
467 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
468 ; NONEON-NOSVE-NEXT: csetm w1, ne
469 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
470 ; NONEON-NOSVE-NEXT: csel w1, w1, wzr, ne
471 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
472 ; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #36]
473 ; NONEON-NOSVE-NEXT: csetm w2, ne
474 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
475 ; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #88]
476 ; NONEON-NOSVE-NEXT: csel w2, w2, wzr, ne
477 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
478 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #44]
479 ; NONEON-NOSVE-NEXT: csetm w3, ne
480 ; NONEON-NOSVE-NEXT: fcmp s1, #0.0
481 ; NONEON-NOSVE-NEXT: csel w3, w3, wzr, ne
482 ; NONEON-NOSVE-NEXT: fcmp s2, #0.0
483 ; NONEON-NOSVE-NEXT: csetm w4, ne
484 ; NONEON-NOSVE-NEXT: fcmp s0, #0.0
485 ; NONEON-NOSVE-NEXT: csel w10, w4, wzr, ne
486 ; NONEON-NOSVE-NEXT: cmp w9, w8
487 ; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo
488 ; NONEON-NOSVE-NEXT: and w9, w13, #0xff
489 ; NONEON-NOSVE-NEXT: and w10, w10, #0xff
490 ; NONEON-NOSVE-NEXT: and w8, w8, #0xff
491 ; NONEON-NOSVE-NEXT: cmp w8, w9
492 ; NONEON-NOSVE-NEXT: csel w8, w8, w9, lo
493 ; NONEON-NOSVE-NEXT: and w9, w16, #0xff
494 ; NONEON-NOSVE-NEXT: cmp w8, w11
495 ; NONEON-NOSVE-NEXT: csel w8, w8, w11, lo
496 ; NONEON-NOSVE-NEXT: and w11, w17, #0xff
497 ; NONEON-NOSVE-NEXT: cmp w8, w9
498 ; NONEON-NOSVE-NEXT: csel w8, w8, w9, lo
499 ; NONEON-NOSVE-NEXT: and w9, w18, #0xff
500 ; NONEON-NOSVE-NEXT: cmp w8, w11
501 ; NONEON-NOSVE-NEXT: csel w8, w8, w11, lo
502 ; NONEON-NOSVE-NEXT: and w11, w0, #0xff
503 ; NONEON-NOSVE-NEXT: cmp w8, w9
504 ; NONEON-NOSVE-NEXT: csel w8, w8, w9, lo
505 ; NONEON-NOSVE-NEXT: and w9, w1, #0xff
506 ; NONEON-NOSVE-NEXT: cmp w8, w11
507 ; NONEON-NOSVE-NEXT: csel w8, w8, w11, lo
508 ; NONEON-NOSVE-NEXT: and w11, w2, #0xff
509 ; NONEON-NOSVE-NEXT: cmp w8, w9
510 ; NONEON-NOSVE-NEXT: csel w8, w8, w9, lo
511 ; NONEON-NOSVE-NEXT: and w9, w3, #0xff
512 ; NONEON-NOSVE-NEXT: cmp w8, w11
513 ; NONEON-NOSVE-NEXT: csel w8, w8, w11, lo
514 ; NONEON-NOSVE-NEXT: cmp w8, w9
515 ; NONEON-NOSVE-NEXT: csel w8, w8, w9, lo
516 ; NONEON-NOSVE-NEXT: cmp w8, w10
517 ; NONEON-NOSVE-NEXT: csel w8, w8, w10, lo
518 ; NONEON-NOSVE-NEXT: and w0, w8, #0x1
519 ; NONEON-NOSVE-NEXT: add sp, sp, #128
520 ; NONEON-NOSVE-NEXT: ret
521 %v0 = bitcast ptr %a to ptr
522 %v1 = load <16 x float>, ptr %v0, align 4
523 %v2 = fcmp une <16 x float> %v1, zeroinitializer
524 %v3 = bitcast ptr %b to ptr
525 %v4 = load <16 x float>, ptr %v3, align 4
526 %v5 = fcmp une <16 x float> %v4, zeroinitializer
527 %v6 = and <16 x i1> %v2, %v5
528 %v7 = call i1 @llvm.vector.reduce.and.i1.v16i1 (<16 x i1> %v6)
532 declare i1 @llvm.vector.reduce.and.i1.v16i1(<16 x i1>)