533 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve2 -force-streaming-compatible < %s | FileCheck %s3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE5 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, vl414; CHECK-NEXT: ldp q2, q3, [x0]15; CHECK-NEXT: fcmne p1.s, p0/z, z0.s, #0.016; CHECK-NEXT: fcmne p2.s, p0/z, z1.s, #0.017; CHECK-NEXT: fcmne p3.s, p0/z, z3.s, #0.018; CHECK-NEXT: fcmne p0.s, p0/z, z2.s, #0.019; CHECK-NEXT: mov z0.s, p1/z, #-1 // =0xffffffffffffffff20; CHECK-NEXT: mov z1.s, p2/z, #-1 // =0xffffffffffffffff21; CHECK-NEXT: mov z2.s, p3/z, #-1 // =0xffffffffffffffff22; CHECK-NEXT: mov z3.s, p0/z, #-1 // =0xffffffffffffffff23; CHECK-NEXT: uzp1 z5.h, z0.h, z0.h24; CHECK-NEXT: ptrue p0.h, vl425; CHECK-NEXT: uzp1 z4.h, z1.h, z1.h26; CHECK-NEXT: uzp1 z1.h, z2.h, z2.h27; CHECK-NEXT: uzp1 z0.h, z3.h, z3.h28; 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, vl831; CHECK-NEXT: uzp1 z2.b, z2.b, z2.b32; CHECK-NEXT: uzp1 z1.b, z0.b, z0.b33; CHECK-NEXT: splice z0.b, p0, { z1.b, z2.b }34; CHECK-NEXT: ptrue p0.b, vl1635; CHECK-NEXT: umaxv b0, p0, z0.b36; CHECK-NEXT: fmov w8, s037; CHECK-NEXT: and w0, w8, #0x138; CHECK-NEXT: ret39;40; NONEON-NOSVE-LABEL: ptest_v16i1:41; NONEON-NOSVE: // %bb.0:42; NONEON-NOSVE-NEXT: sub sp, sp, #6443; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 6444; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]45; NONEON-NOSVE-NEXT: mov w8, #255 // =0xff46; 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.051; NONEON-NOSVE-NEXT: csel w9, w8, wzr, ne52; NONEON-NOSVE-NEXT: fcmp s1, #0.053; NONEON-NOSVE-NEXT: ldp s1, s0, [sp]54; NONEON-NOSVE-NEXT: csetm w10, ne55; NONEON-NOSVE-NEXT: fcmp s0, #0.056; NONEON-NOSVE-NEXT: csetm w11, ne57; NONEON-NOSVE-NEXT: fcmp s1, #0.058; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8]59; NONEON-NOSVE-NEXT: csinv w11, w11, wzr, eq60; NONEON-NOSVE-NEXT: fcmp s0, #0.061; NONEON-NOSVE-NEXT: csinv w11, w11, wzr, eq62; NONEON-NOSVE-NEXT: fcmp s1, #0.063; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #32]64; NONEON-NOSVE-NEXT: csinv w11, w11, wzr, eq65; NONEON-NOSVE-NEXT: fcmp s0, #0.066; NONEON-NOSVE-NEXT: csinv w11, w11, wzr, eq67; NONEON-NOSVE-NEXT: fcmp s1, #0.068; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #48]69; NONEON-NOSVE-NEXT: csinv w11, w11, wzr, eq70; NONEON-NOSVE-NEXT: cmp w11, w1071; NONEON-NOSVE-NEXT: csel w10, w11, w10, hi72; NONEON-NOSVE-NEXT: and w10, w10, #0xff73; NONEON-NOSVE-NEXT: cmp w10, w974; NONEON-NOSVE-NEXT: csel w9, w10, w9, hi75; NONEON-NOSVE-NEXT: fcmp s0, #0.076; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne77; NONEON-NOSVE-NEXT: cmp w9, w1078; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi79; NONEON-NOSVE-NEXT: fcmp s1, #0.080; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #56]81; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne82; NONEON-NOSVE-NEXT: cmp w9, w1083; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi84; NONEON-NOSVE-NEXT: fcmp s0, #0.085; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne86; NONEON-NOSVE-NEXT: cmp w9, w1087; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi88; NONEON-NOSVE-NEXT: fcmp s1, #0.089; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #16]90; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne91; NONEON-NOSVE-NEXT: cmp w9, w1092; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi93; NONEON-NOSVE-NEXT: fcmp s0, #0.094; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne95; NONEON-NOSVE-NEXT: cmp w9, w1096; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi97; NONEON-NOSVE-NEXT: fcmp s1, #0.098; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #24]99; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne100; NONEON-NOSVE-NEXT: cmp w9, w10101; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi102; NONEON-NOSVE-NEXT: fcmp s0, #0.0103; NONEON-NOSVE-NEXT: csel w10, w8, wzr, ne104; NONEON-NOSVE-NEXT: cmp w9, w10105; NONEON-NOSVE-NEXT: csel w9, w9, w10, hi106; NONEON-NOSVE-NEXT: fcmp s1, #0.0107; NONEON-NOSVE-NEXT: csel w8, w8, wzr, ne108; NONEON-NOSVE-NEXT: cmp w9, w8109; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi110; NONEON-NOSVE-NEXT: and w0, w8, #0x1111; NONEON-NOSVE-NEXT: add sp, sp, #64112; NONEON-NOSVE-NEXT: ret113 %v0 = bitcast ptr %a to ptr114 %v1 = load <16 x float>, ptr %v0, align 4115 %v2 = fcmp une <16 x float> %v1, zeroinitializer116 %v3 = call i1 @llvm.vector.reduce.or.i1.v16i1 (<16 x i1> %v2)117 ret i1 %v3118}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, vl4125; CHECK-NEXT: ldp q4, q5, [x1, #32]126; CHECK-NEXT: ldp q2, q3, [x0]127; CHECK-NEXT: fcmne p1.s, p0/z, z1.s, #0.0128; CHECK-NEXT: fcmne p2.s, p0/z, z0.s, #0.0129; CHECK-NEXT: ldp q0, q1, [x1]130; CHECK-NEXT: fcmne p5.s, p0/z, z5.s, #0.0131; CHECK-NEXT: fcmne p3.s, p0/z, z3.s, #0.0132; CHECK-NEXT: fcmne p6.s, p0/z, z4.s, #0.0133; CHECK-NEXT: fcmne p7.s, p0/z, z1.s, #0.0134; CHECK-NEXT: mov z1.s, p2/z, #-1 // =0xffffffffffffffff135; CHECK-NEXT: fcmne p4.s, p0/z, z2.s, #0.0136; CHECK-NEXT: mov z2.s, p5/z, #-1 // =0xffffffffffffffff137; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, #0.0138; CHECK-NEXT: mov z0.s, p1/z, #-1 // =0xffffffffffffffff139; CHECK-NEXT: mov z3.s, p3/z, #-1 // =0xffffffffffffffff140; CHECK-NEXT: mov z4.s, p6/z, #-1 // =0xffffffffffffffff141; CHECK-NEXT: mov z5.s, p7/z, #-1 // =0xffffffffffffffff142; CHECK-NEXT: uzp1 z7.h, z0.h, z0.h143; CHECK-NEXT: mov z0.s, p4/z, #-1 // =0xffffffffffffffff144; CHECK-NEXT: uzp1 z18.h, z3.h, z3.h145; CHECK-NEXT: mov z16.s, p0/z, #-1 // =0xffffffffffffffff146; CHECK-NEXT: uzp1 z6.h, z1.h, z1.h147; CHECK-NEXT: uzp1 z2.h, z2.h, z2.h148; CHECK-NEXT: uzp1 z1.h, z4.h, z4.h149; CHECK-NEXT: uzp1 z4.h, z5.h, z5.h150; CHECK-NEXT: ptrue p0.h, vl4151; CHECK-NEXT: uzp1 z17.h, z0.h, z0.h152; CHECK-NEXT: uzp1 z3.h, z16.h, z16.h153; CHECK-NEXT: splice z0.h, p0, { z6.h, z7.h }154; CHECK-NEXT: splice z1.h, p0, { z1.h, z2.h }155; CHECK-NEXT: splice z2.h, p0, { z17.h, z18.h }156; CHECK-NEXT: splice z3.h, p0, { z3.h, z4.h }157; CHECK-NEXT: ptrue p0.b, vl8158; CHECK-NEXT: uzp1 z5.b, z0.b, z0.b159; CHECK-NEXT: uzp1 z1.b, z1.b, z1.b160; CHECK-NEXT: uzp1 z4.b, z2.b, z2.b161; CHECK-NEXT: uzp1 z0.b, z3.b, z3.b162; CHECK-NEXT: splice z2.b, p0, { z4.b, z5.b }163; CHECK-NEXT: splice z0.b, p0, { z0.b, z1.b }164; CHECK-NEXT: ptrue p0.b, vl16165; CHECK-NEXT: orr z0.d, z2.d, z0.d166; CHECK-NEXT: umaxv b0, p0, z0.b167; CHECK-NEXT: fmov w8, s0168; CHECK-NEXT: and w0, w8, #0x1169; CHECK-NEXT: ret170;171; NONEON-NOSVE-LABEL: ptest_or_v16i1:172; NONEON-NOSVE: // %bb.0:173; NONEON-NOSVE-NEXT: sub sp, sp, #128174; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128175; 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.0185; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]186; NONEON-NOSVE-NEXT: csetm w8, ne187; NONEON-NOSVE-NEXT: fcmp s1, #0.0188; NONEON-NOSVE-NEXT: ldr q1, [x1]189; NONEON-NOSVE-NEXT: str q1, [sp, #16]190; NONEON-NOSVE-NEXT: csinv w8, w8, wzr, eq191; NONEON-NOSVE-NEXT: fcmp s2, #0.0192; NONEON-NOSVE-NEXT: ldr s2, [sp, #12]193; NONEON-NOSVE-NEXT: csetm w9, ne194; NONEON-NOSVE-NEXT: fcmp s0, #0.0195; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #24]196; NONEON-NOSVE-NEXT: csinv w9, w9, wzr, eq197; NONEON-NOSVE-NEXT: fcmp s0, #0.0198; NONEON-NOSVE-NEXT: ldr s0, [sp, #8]199; NONEON-NOSVE-NEXT: csetm w10, ne200; NONEON-NOSVE-NEXT: fcmp s2, #0.0201; NONEON-NOSVE-NEXT: csinv w10, w10, wzr, eq202; NONEON-NOSVE-NEXT: fcmp s1, #0.0203; NONEON-NOSVE-NEXT: csetm w11, ne204; NONEON-NOSVE-NEXT: fcmp s0, #0.0205; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #16]206; NONEON-NOSVE-NEXT: csinv w11, w11, wzr, eq207; NONEON-NOSVE-NEXT: fcmp s0, #0.0208; NONEON-NOSVE-NEXT: ldp s2, s0, [sp]209; NONEON-NOSVE-NEXT: orr w10, w11, w10210; NONEON-NOSVE-NEXT: csetm w12, ne211; NONEON-NOSVE-NEXT: fcmp s0, #0.0212; NONEON-NOSVE-NEXT: csinv w12, w12, wzr, eq213; NONEON-NOSVE-NEXT: fcmp s1, #0.0214; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #104]215; NONEON-NOSVE-NEXT: csetm w13, ne216; NONEON-NOSVE-NEXT: fcmp s2, #0.0217; NONEON-NOSVE-NEXT: csinv w14, w13, wzr, eq218; NONEON-NOSVE-NEXT: fcmp s0, #0.0219; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #56]220; NONEON-NOSVE-NEXT: orr w12, w14, w12221; NONEON-NOSVE-NEXT: orr w10, w12, w10222; NONEON-NOSVE-NEXT: csetm w13, ne223; NONEON-NOSVE-NEXT: orr w9, w10, w9224; NONEON-NOSVE-NEXT: fcmp s0, #0.0225; NONEON-NOSVE-NEXT: ldr q0, [x1, #32]226; NONEON-NOSVE-NEXT: str q0, [sp, #112]227; NONEON-NOSVE-NEXT: csinv w13, w13, wzr, eq228; NONEON-NOSVE-NEXT: fcmp s1, #0.0229; NONEON-NOSVE-NEXT: ldr s1, [sp, #64]230; NONEON-NOSVE-NEXT: csetm w15, ne231; NONEON-NOSVE-NEXT: fcmp s2, #0.0232; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #112]233; NONEON-NOSVE-NEXT: csinv w15, w15, wzr, eq234; NONEON-NOSVE-NEXT: fcmp s0, #0.0235; NONEON-NOSVE-NEXT: and w11, w15, #0xff236; NONEON-NOSVE-NEXT: csetm w16, ne237; NONEON-NOSVE-NEXT: fcmp s1, #0.0238; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #68]239; NONEON-NOSVE-NEXT: csinv w16, w16, wzr, eq240; NONEON-NOSVE-NEXT: fcmp s2, #0.0241; NONEON-NOSVE-NEXT: csetm w17, ne242; NONEON-NOSVE-NEXT: fcmp s0, #0.0243; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #120]244; NONEON-NOSVE-NEXT: csinv w17, w17, wzr, eq245; NONEON-NOSVE-NEXT: fcmp s0, #0.0246; NONEON-NOSVE-NEXT: ldr s0, [sp, #76]247; NONEON-NOSVE-NEXT: csetm w18, ne248; NONEON-NOSVE-NEXT: fcmp s1, #0.0249; NONEON-NOSVE-NEXT: ldr q1, [x1, #48]250; NONEON-NOSVE-NEXT: str q1, [sp, #80]251; NONEON-NOSVE-NEXT: csinv w18, w18, wzr, eq252; NONEON-NOSVE-NEXT: fcmp s2, #0.0253; NONEON-NOSVE-NEXT: ldr s2, [sp, #32]254; NONEON-NOSVE-NEXT: csetm w0, ne255; NONEON-NOSVE-NEXT: fcmp s0, #0.0256; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #80]257; NONEON-NOSVE-NEXT: csinv w0, w0, wzr, eq258; NONEON-NOSVE-NEXT: fcmp s0, #0.0259; NONEON-NOSVE-NEXT: csetm w1, ne260; NONEON-NOSVE-NEXT: fcmp s2, #0.0261; NONEON-NOSVE-NEXT: csinv w1, w1, wzr, eq262; NONEON-NOSVE-NEXT: fcmp s1, #0.0263; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #36]264; NONEON-NOSVE-NEXT: csetm w2, ne265; NONEON-NOSVE-NEXT: fcmp s0, #0.0266; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #88]267; NONEON-NOSVE-NEXT: csinv w2, w2, wzr, eq268; NONEON-NOSVE-NEXT: fcmp s0, #0.0269; NONEON-NOSVE-NEXT: ldr s0, [sp, #44]270; NONEON-NOSVE-NEXT: csetm w3, ne271; NONEON-NOSVE-NEXT: fcmp s1, #0.0272; NONEON-NOSVE-NEXT: csinv w3, w3, wzr, eq273; NONEON-NOSVE-NEXT: fcmp s2, #0.0274; NONEON-NOSVE-NEXT: csetm w4, ne275; NONEON-NOSVE-NEXT: fcmp s0, #0.0276; NONEON-NOSVE-NEXT: csinv w10, w4, wzr, eq277; NONEON-NOSVE-NEXT: cmp w9, w8278; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi279; NONEON-NOSVE-NEXT: and w9, w13, #0xff280; NONEON-NOSVE-NEXT: and w10, w10, #0xff281; NONEON-NOSVE-NEXT: and w8, w8, #0xff282; NONEON-NOSVE-NEXT: cmp w8, w9283; NONEON-NOSVE-NEXT: csel w8, w8, w9, hi284; NONEON-NOSVE-NEXT: and w9, w16, #0xff285; NONEON-NOSVE-NEXT: cmp w8, w11286; NONEON-NOSVE-NEXT: csel w8, w8, w11, hi287; NONEON-NOSVE-NEXT: and w11, w17, #0xff288; NONEON-NOSVE-NEXT: cmp w8, w9289; NONEON-NOSVE-NEXT: csel w8, w8, w9, hi290; NONEON-NOSVE-NEXT: and w9, w18, #0xff291; NONEON-NOSVE-NEXT: cmp w8, w11292; NONEON-NOSVE-NEXT: csel w8, w8, w11, hi293; NONEON-NOSVE-NEXT: and w11, w0, #0xff294; NONEON-NOSVE-NEXT: cmp w8, w9295; NONEON-NOSVE-NEXT: csel w8, w8, w9, hi296; NONEON-NOSVE-NEXT: and w9, w1, #0xff297; NONEON-NOSVE-NEXT: cmp w8, w11298; NONEON-NOSVE-NEXT: csel w8, w8, w11, hi299; NONEON-NOSVE-NEXT: and w11, w2, #0xff300; NONEON-NOSVE-NEXT: cmp w8, w9301; NONEON-NOSVE-NEXT: csel w8, w8, w9, hi302; NONEON-NOSVE-NEXT: and w9, w3, #0xff303; NONEON-NOSVE-NEXT: cmp w8, w11304; NONEON-NOSVE-NEXT: csel w8, w8, w11, hi305; NONEON-NOSVE-NEXT: cmp w8, w9306; NONEON-NOSVE-NEXT: csel w8, w8, w9, hi307; NONEON-NOSVE-NEXT: cmp w8, w10308; NONEON-NOSVE-NEXT: csel w8, w8, w10, hi309; NONEON-NOSVE-NEXT: and w0, w8, #0x1310; NONEON-NOSVE-NEXT: add sp, sp, #128311; NONEON-NOSVE-NEXT: ret312 %v0 = bitcast ptr %a to ptr313 %v1 = load <16 x float>, ptr %v0, align 4314 %v2 = fcmp une <16 x float> %v1, zeroinitializer315 %v3 = bitcast ptr %b to ptr316 %v4 = load <16 x float>, ptr %v3, align 4317 %v5 = fcmp une <16 x float> %v4, zeroinitializer318 %v6 = or <16 x i1> %v2, %v5319 %v7 = call i1 @llvm.vector.reduce.or.i1.v16i1 (<16 x i1> %v6)320 ret i1 %v7321}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, vl4334; CHECK-NEXT: ldp q4, q5, [x1, #32]335; CHECK-NEXT: ldp q2, q3, [x0]336; CHECK-NEXT: fcmne p1.s, p0/z, z1.s, #0.0337; CHECK-NEXT: fcmne p2.s, p0/z, z0.s, #0.0338; CHECK-NEXT: ldp q0, q1, [x1]339; CHECK-NEXT: fcmne p5.s, p0/z, z5.s, #0.0340; CHECK-NEXT: fcmne p3.s, p0/z, z3.s, #0.0341; CHECK-NEXT: fcmne p6.s, p0/z, z4.s, #0.0342; CHECK-NEXT: fcmne p7.s, p0/z, z1.s, #0.0343; CHECK-NEXT: mov z1.s, p2/z, #-1 // =0xffffffffffffffff344; CHECK-NEXT: fcmne p4.s, p0/z, z2.s, #0.0345; CHECK-NEXT: mov z2.s, p5/z, #-1 // =0xffffffffffffffff346; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, #0.0347; CHECK-NEXT: mov z0.s, p1/z, #-1 // =0xffffffffffffffff348; CHECK-NEXT: mov z3.s, p3/z, #-1 // =0xffffffffffffffff349; CHECK-NEXT: mov z4.s, p6/z, #-1 // =0xffffffffffffffff350; CHECK-NEXT: mov z5.s, p7/z, #-1 // =0xffffffffffffffff351; CHECK-NEXT: uzp1 z7.h, z0.h, z0.h352; CHECK-NEXT: mov z0.s, p4/z, #-1 // =0xffffffffffffffff353; CHECK-NEXT: uzp1 z18.h, z3.h, z3.h354; CHECK-NEXT: mov z16.s, p0/z, #-1 // =0xffffffffffffffff355; CHECK-NEXT: uzp1 z6.h, z1.h, z1.h356; CHECK-NEXT: uzp1 z2.h, z2.h, z2.h357; CHECK-NEXT: uzp1 z1.h, z4.h, z4.h358; CHECK-NEXT: uzp1 z4.h, z5.h, z5.h359; CHECK-NEXT: ptrue p0.h, vl4360; CHECK-NEXT: uzp1 z17.h, z0.h, z0.h361; CHECK-NEXT: uzp1 z3.h, z16.h, z16.h362; CHECK-NEXT: splice z0.h, p0, { z6.h, z7.h }363; CHECK-NEXT: splice z1.h, p0, { z1.h, z2.h }364; CHECK-NEXT: splice z2.h, p0, { z17.h, z18.h }365; CHECK-NEXT: splice z3.h, p0, { z3.h, z4.h }366; CHECK-NEXT: ptrue p0.b, vl8367; CHECK-NEXT: uzp1 z5.b, z0.b, z0.b368; CHECK-NEXT: uzp1 z1.b, z1.b, z1.b369; CHECK-NEXT: uzp1 z4.b, z2.b, z2.b370; CHECK-NEXT: uzp1 z0.b, z3.b, z3.b371; CHECK-NEXT: splice z2.b, p0, { z4.b, z5.b }372; CHECK-NEXT: splice z0.b, p0, { z0.b, z1.b }373; CHECK-NEXT: ptrue p0.b, vl16374; CHECK-NEXT: and z0.d, z2.d, z0.d375; CHECK-NEXT: uminv b0, p0, z0.b376; CHECK-NEXT: fmov w8, s0377; CHECK-NEXT: and w0, w8, #0x1378; CHECK-NEXT: ret379;380; NONEON-NOSVE-LABEL: ptest_and_v16i1:381; NONEON-NOSVE: // %bb.0:382; NONEON-NOSVE-NEXT: sub sp, sp, #128383; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128384; 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.0394; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]395; NONEON-NOSVE-NEXT: csetm w8, ne396; NONEON-NOSVE-NEXT: fcmp s1, #0.0397; NONEON-NOSVE-NEXT: ldr q1, [x1]398; NONEON-NOSVE-NEXT: str q1, [sp, #16]399; NONEON-NOSVE-NEXT: csel w8, w8, wzr, ne400; NONEON-NOSVE-NEXT: fcmp s2, #0.0401; NONEON-NOSVE-NEXT: ldr s2, [sp, #12]402; NONEON-NOSVE-NEXT: csetm w9, ne403; NONEON-NOSVE-NEXT: fcmp s0, #0.0404; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #24]405; NONEON-NOSVE-NEXT: csel w9, w9, wzr, ne406; NONEON-NOSVE-NEXT: fcmp s0, #0.0407; NONEON-NOSVE-NEXT: ldr s0, [sp, #8]408; NONEON-NOSVE-NEXT: csetm w10, ne409; NONEON-NOSVE-NEXT: fcmp s2, #0.0410; NONEON-NOSVE-NEXT: csel w10, w10, wzr, ne411; NONEON-NOSVE-NEXT: fcmp s1, #0.0412; NONEON-NOSVE-NEXT: csetm w11, ne413; NONEON-NOSVE-NEXT: fcmp s0, #0.0414; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #16]415; NONEON-NOSVE-NEXT: csel w11, w11, wzr, ne416; NONEON-NOSVE-NEXT: fcmp s0, #0.0417; NONEON-NOSVE-NEXT: ldp s2, s0, [sp]418; NONEON-NOSVE-NEXT: and w10, w11, w10419; NONEON-NOSVE-NEXT: csetm w12, ne420; NONEON-NOSVE-NEXT: fcmp s0, #0.0421; NONEON-NOSVE-NEXT: csel w12, w12, wzr, ne422; NONEON-NOSVE-NEXT: fcmp s1, #0.0423; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #104]424; NONEON-NOSVE-NEXT: csetm w13, ne425; NONEON-NOSVE-NEXT: fcmp s2, #0.0426; NONEON-NOSVE-NEXT: csel w14, w13, wzr, ne427; NONEON-NOSVE-NEXT: fcmp s0, #0.0428; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #56]429; NONEON-NOSVE-NEXT: and w12, w14, w12430; NONEON-NOSVE-NEXT: and w10, w12, w10431; NONEON-NOSVE-NEXT: csetm w13, ne432; NONEON-NOSVE-NEXT: and w9, w10, w9433; NONEON-NOSVE-NEXT: fcmp s0, #0.0434; NONEON-NOSVE-NEXT: ldr q0, [x1, #32]435; NONEON-NOSVE-NEXT: str q0, [sp, #112]436; NONEON-NOSVE-NEXT: csel w13, w13, wzr, ne437; NONEON-NOSVE-NEXT: fcmp s1, #0.0438; NONEON-NOSVE-NEXT: ldr s1, [sp, #64]439; NONEON-NOSVE-NEXT: csetm w15, ne440; NONEON-NOSVE-NEXT: fcmp s2, #0.0441; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #112]442; NONEON-NOSVE-NEXT: csel w15, w15, wzr, ne443; NONEON-NOSVE-NEXT: fcmp s0, #0.0444; NONEON-NOSVE-NEXT: and w11, w15, #0xff445; NONEON-NOSVE-NEXT: csetm w16, ne446; NONEON-NOSVE-NEXT: fcmp s1, #0.0447; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #68]448; NONEON-NOSVE-NEXT: csel w16, w16, wzr, ne449; NONEON-NOSVE-NEXT: fcmp s2, #0.0450; NONEON-NOSVE-NEXT: csetm w17, ne451; NONEON-NOSVE-NEXT: fcmp s0, #0.0452; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #120]453; NONEON-NOSVE-NEXT: csel w17, w17, wzr, ne454; NONEON-NOSVE-NEXT: fcmp s0, #0.0455; NONEON-NOSVE-NEXT: ldr s0, [sp, #76]456; NONEON-NOSVE-NEXT: csetm w18, ne457; NONEON-NOSVE-NEXT: fcmp s1, #0.0458; NONEON-NOSVE-NEXT: ldr q1, [x1, #48]459; NONEON-NOSVE-NEXT: str q1, [sp, #80]460; NONEON-NOSVE-NEXT: csel w18, w18, wzr, ne461; NONEON-NOSVE-NEXT: fcmp s2, #0.0462; NONEON-NOSVE-NEXT: ldr s2, [sp, #32]463; NONEON-NOSVE-NEXT: csetm w0, ne464; NONEON-NOSVE-NEXT: fcmp s0, #0.0465; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #80]466; NONEON-NOSVE-NEXT: csel w0, w0, wzr, ne467; NONEON-NOSVE-NEXT: fcmp s0, #0.0468; NONEON-NOSVE-NEXT: csetm w1, ne469; NONEON-NOSVE-NEXT: fcmp s2, #0.0470; NONEON-NOSVE-NEXT: csel w1, w1, wzr, ne471; NONEON-NOSVE-NEXT: fcmp s1, #0.0472; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #36]473; NONEON-NOSVE-NEXT: csetm w2, ne474; NONEON-NOSVE-NEXT: fcmp s0, #0.0475; NONEON-NOSVE-NEXT: ldp s0, s2, [sp, #88]476; NONEON-NOSVE-NEXT: csel w2, w2, wzr, ne477; NONEON-NOSVE-NEXT: fcmp s0, #0.0478; NONEON-NOSVE-NEXT: ldr s0, [sp, #44]479; NONEON-NOSVE-NEXT: csetm w3, ne480; NONEON-NOSVE-NEXT: fcmp s1, #0.0481; NONEON-NOSVE-NEXT: csel w3, w3, wzr, ne482; NONEON-NOSVE-NEXT: fcmp s2, #0.0483; NONEON-NOSVE-NEXT: csetm w4, ne484; NONEON-NOSVE-NEXT: fcmp s0, #0.0485; NONEON-NOSVE-NEXT: csel w10, w4, wzr, ne486; NONEON-NOSVE-NEXT: cmp w9, w8487; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo488; NONEON-NOSVE-NEXT: and w9, w13, #0xff489; NONEON-NOSVE-NEXT: and w10, w10, #0xff490; NONEON-NOSVE-NEXT: and w8, w8, #0xff491; NONEON-NOSVE-NEXT: cmp w8, w9492; NONEON-NOSVE-NEXT: csel w8, w8, w9, lo493; NONEON-NOSVE-NEXT: and w9, w16, #0xff494; NONEON-NOSVE-NEXT: cmp w8, w11495; NONEON-NOSVE-NEXT: csel w8, w8, w11, lo496; NONEON-NOSVE-NEXT: and w11, w17, #0xff497; NONEON-NOSVE-NEXT: cmp w8, w9498; NONEON-NOSVE-NEXT: csel w8, w8, w9, lo499; NONEON-NOSVE-NEXT: and w9, w18, #0xff500; NONEON-NOSVE-NEXT: cmp w8, w11501; NONEON-NOSVE-NEXT: csel w8, w8, w11, lo502; NONEON-NOSVE-NEXT: and w11, w0, #0xff503; NONEON-NOSVE-NEXT: cmp w8, w9504; NONEON-NOSVE-NEXT: csel w8, w8, w9, lo505; NONEON-NOSVE-NEXT: and w9, w1, #0xff506; NONEON-NOSVE-NEXT: cmp w8, w11507; NONEON-NOSVE-NEXT: csel w8, w8, w11, lo508; NONEON-NOSVE-NEXT: and w11, w2, #0xff509; NONEON-NOSVE-NEXT: cmp w8, w9510; NONEON-NOSVE-NEXT: csel w8, w8, w9, lo511; NONEON-NOSVE-NEXT: and w9, w3, #0xff512; NONEON-NOSVE-NEXT: cmp w8, w11513; NONEON-NOSVE-NEXT: csel w8, w8, w11, lo514; NONEON-NOSVE-NEXT: cmp w8, w9515; NONEON-NOSVE-NEXT: csel w8, w8, w9, lo516; NONEON-NOSVE-NEXT: cmp w8, w10517; NONEON-NOSVE-NEXT: csel w8, w8, w10, lo518; NONEON-NOSVE-NEXT: and w0, w8, #0x1519; NONEON-NOSVE-NEXT: add sp, sp, #128520; NONEON-NOSVE-NEXT: ret521 %v0 = bitcast ptr %a to ptr522 %v1 = load <16 x float>, ptr %v0, align 4523 %v2 = fcmp une <16 x float> %v1, zeroinitializer524 %v3 = bitcast ptr %b to ptr525 %v4 = load <16 x float>, ptr %v3, align 4526 %v5 = fcmp une <16 x float> %v4, zeroinitializer527 %v6 = and <16 x i1> %v2, %v5528 %v7 = call i1 @llvm.vector.reduce.and.i1.v16i1 (<16 x i1> %v6)529 ret i1 %v7530}531 532declare i1 @llvm.vector.reduce.and.i1.v16i1(<16 x i1>)533