xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-ptest.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
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
5
6
7target triple = "aarch64-unknown-linux-gnu"
8
9define i1 @ptest_v16i1(ptr %a, ptr %b) {
10; CHECK-LABEL: ptest_v16i1:
11; CHECK:       // %bb.0:
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
38; CHECK-NEXT:    ret
39;
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)
117  ret i1 %v3
118}
119
120define i1 @ptest_or_v16i1(ptr %a, ptr %b) {
121; CHECK-LABEL: ptest_or_v16i1:
122; CHECK:       // %bb.0:
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
169; CHECK-NEXT:    ret
170;
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)
320  ret i1 %v7
321}
322
323declare i1 @llvm.vector.reduce.or.i1.v16i1(<16 x i1>)
324
325;
326; AND reduction.
327;
328
329define i1 @ptest_and_v16i1(ptr %a, ptr %b) {
330; CHECK-LABEL: ptest_and_v16i1:
331; CHECK:       // %bb.0:
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
378; CHECK-NEXT:    ret
379;
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)
529  ret i1 %v7
530}
531
532declare i1 @llvm.vector.reduce.and.i1.v16i1(<16 x i1>)
533