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