1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BWVL 9 10; 11; vXi64 12; 13 14define i1 @test_v2i64(<2 x i64> %a0) { 15; SSE2-LABEL: test_v2i64: 16; SSE2: # %bb.0: 17; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 18; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 19; SSE2-NEXT: movmskps %xmm1, %eax 20; SSE2-NEXT: xorl $15, %eax 21; SSE2-NEXT: sete %al 22; SSE2-NEXT: retq 23; 24; SSE41-LABEL: test_v2i64: 25; SSE41: # %bb.0: 26; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 27; SSE41-NEXT: ptest %xmm1, %xmm0 28; SSE41-NEXT: setb %al 29; SSE41-NEXT: retq 30; 31; AVX-LABEL: test_v2i64: 32; AVX: # %bb.0: 33; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 34; AVX-NEXT: vptest %xmm1, %xmm0 35; AVX-NEXT: setb %al 36; AVX-NEXT: retq 37 %1 = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %a0) 38 %2 = icmp eq i64 %1, -1 39 ret i1 %2 40} 41 42define i1 @test_v4i64(<4 x i64> %a0) { 43; SSE2-LABEL: test_v4i64: 44; SSE2: # %bb.0: 45; SSE2-NEXT: pand %xmm1, %xmm0 46; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 47; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 48; SSE2-NEXT: movmskps %xmm1, %eax 49; SSE2-NEXT: xorl $15, %eax 50; SSE2-NEXT: setne %al 51; SSE2-NEXT: retq 52; 53; SSE41-LABEL: test_v4i64: 54; SSE41: # %bb.0: 55; SSE41-NEXT: pand %xmm1, %xmm0 56; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 57; SSE41-NEXT: ptest %xmm1, %xmm0 58; SSE41-NEXT: setae %al 59; SSE41-NEXT: retq 60; 61; AVX1-LABEL: test_v4i64: 62; AVX1: # %bb.0: 63; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 64; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 65; AVX1-NEXT: vptest %ymm1, %ymm0 66; AVX1-NEXT: setae %al 67; AVX1-NEXT: vzeroupper 68; AVX1-NEXT: retq 69; 70; AVX2-LABEL: test_v4i64: 71; AVX2: # %bb.0: 72; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 73; AVX2-NEXT: vptest %ymm1, %ymm0 74; AVX2-NEXT: setae %al 75; AVX2-NEXT: vzeroupper 76; AVX2-NEXT: retq 77; 78; AVX512-LABEL: test_v4i64: 79; AVX512: # %bb.0: 80; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 81; AVX512-NEXT: vptest %ymm1, %ymm0 82; AVX512-NEXT: setae %al 83; AVX512-NEXT: vzeroupper 84; AVX512-NEXT: retq 85 %1 = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %a0) 86 %2 = icmp ne i64 %1, -1 87 ret i1 %2 88} 89 90define i1 @test_v8i64(<8 x i64> %a0) { 91; SSE2-LABEL: test_v8i64: 92; SSE2: # %bb.0: 93; SSE2-NEXT: pand %xmm3, %xmm1 94; SSE2-NEXT: pand %xmm2, %xmm0 95; SSE2-NEXT: pand %xmm1, %xmm0 96; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 97; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 98; SSE2-NEXT: movmskps %xmm1, %eax 99; SSE2-NEXT: xorl $15, %eax 100; SSE2-NEXT: sete %al 101; SSE2-NEXT: retq 102; 103; SSE41-LABEL: test_v8i64: 104; SSE41: # %bb.0: 105; SSE41-NEXT: pand %xmm3, %xmm1 106; SSE41-NEXT: pand %xmm2, %xmm0 107; SSE41-NEXT: pand %xmm1, %xmm0 108; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 109; SSE41-NEXT: ptest %xmm1, %xmm0 110; SSE41-NEXT: setb %al 111; SSE41-NEXT: retq 112; 113; AVX1-LABEL: test_v8i64: 114; AVX1: # %bb.0: 115; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 116; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 117; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 118; AVX1-NEXT: vptest %ymm1, %ymm0 119; AVX1-NEXT: setb %al 120; AVX1-NEXT: vzeroupper 121; AVX1-NEXT: retq 122; 123; AVX2-LABEL: test_v8i64: 124; AVX2: # %bb.0: 125; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 126; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 127; AVX2-NEXT: vptest %ymm1, %ymm0 128; AVX2-NEXT: setb %al 129; AVX2-NEXT: vzeroupper 130; AVX2-NEXT: retq 131; 132; AVX512-LABEL: test_v8i64: 133; AVX512: # %bb.0: 134; AVX512-NEXT: vpternlogd {{.*#+}} zmm1 = -1 135; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 136; AVX512-NEXT: kortestw %k0, %k0 137; AVX512-NEXT: sete %al 138; AVX512-NEXT: vzeroupper 139; AVX512-NEXT: retq 140 %1 = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %a0) 141 %2 = icmp eq i64 %1, -1 142 ret i1 %2 143} 144 145define i1 @test_v16i64(<16 x i64> %a0) { 146; SSE2-LABEL: test_v16i64: 147; SSE2: # %bb.0: 148; SSE2-NEXT: pand %xmm7, %xmm3 149; SSE2-NEXT: pand %xmm5, %xmm1 150; SSE2-NEXT: pand %xmm3, %xmm1 151; SSE2-NEXT: pand %xmm6, %xmm2 152; SSE2-NEXT: pand %xmm4, %xmm0 153; SSE2-NEXT: pand %xmm2, %xmm0 154; SSE2-NEXT: pand %xmm1, %xmm0 155; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 156; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 157; SSE2-NEXT: movmskps %xmm1, %eax 158; SSE2-NEXT: xorl $15, %eax 159; SSE2-NEXT: setne %al 160; SSE2-NEXT: retq 161; 162; SSE41-LABEL: test_v16i64: 163; SSE41: # %bb.0: 164; SSE41-NEXT: pand %xmm7, %xmm3 165; SSE41-NEXT: pand %xmm5, %xmm1 166; SSE41-NEXT: pand %xmm3, %xmm1 167; SSE41-NEXT: pand %xmm6, %xmm2 168; SSE41-NEXT: pand %xmm4, %xmm0 169; SSE41-NEXT: pand %xmm2, %xmm0 170; SSE41-NEXT: pand %xmm1, %xmm0 171; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 172; SSE41-NEXT: ptest %xmm1, %xmm0 173; SSE41-NEXT: setae %al 174; SSE41-NEXT: retq 175; 176; AVX1-LABEL: test_v16i64: 177; AVX1: # %bb.0: 178; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1 179; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 180; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 181; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 182; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 183; AVX1-NEXT: vptest %ymm1, %ymm0 184; AVX1-NEXT: setae %al 185; AVX1-NEXT: vzeroupper 186; AVX1-NEXT: retq 187; 188; AVX2-LABEL: test_v16i64: 189; AVX2: # %bb.0: 190; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 191; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 192; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 193; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 194; AVX2-NEXT: vptest %ymm1, %ymm0 195; AVX2-NEXT: setae %al 196; AVX2-NEXT: vzeroupper 197; AVX2-NEXT: retq 198; 199; AVX512-LABEL: test_v16i64: 200; AVX512: # %bb.0: 201; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm0 202; AVX512-NEXT: vpternlogd {{.*#+}} zmm1 = -1 203; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 204; AVX512-NEXT: kortestw %k0, %k0 205; AVX512-NEXT: setne %al 206; AVX512-NEXT: vzeroupper 207; AVX512-NEXT: retq 208 %1 = call i64 @llvm.vector.reduce.and.v16i64(<16 x i64> %a0) 209 %2 = icmp ne i64 %1, -1 210 ret i1 %2 211} 212 213; 214; vXi32 215; 216 217define i1 @test_v2i32(<2 x i32> %a0) { 218; SSE-LABEL: test_v2i32: 219; SSE: # %bb.0: 220; SSE-NEXT: movq %xmm0, %rax 221; SSE-NEXT: cmpq $-1, %rax 222; SSE-NEXT: sete %al 223; SSE-NEXT: retq 224; 225; AVX-LABEL: test_v2i32: 226; AVX: # %bb.0: 227; AVX-NEXT: vmovq %xmm0, %rax 228; AVX-NEXT: cmpq $-1, %rax 229; AVX-NEXT: sete %al 230; AVX-NEXT: retq 231 %1 = call i32 @llvm.vector.reduce.and.v2i32(<2 x i32> %a0) 232 %2 = icmp eq i32 %1, -1 233 ret i1 %2 234} 235 236define i1 @test_v4i32(<4 x i32> %a0) { 237; SSE2-LABEL: test_v4i32: 238; SSE2: # %bb.0: 239; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 240; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 241; SSE2-NEXT: movmskps %xmm1, %eax 242; SSE2-NEXT: xorl $15, %eax 243; SSE2-NEXT: setne %al 244; SSE2-NEXT: retq 245; 246; SSE41-LABEL: test_v4i32: 247; SSE41: # %bb.0: 248; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 249; SSE41-NEXT: ptest %xmm1, %xmm0 250; SSE41-NEXT: setae %al 251; SSE41-NEXT: retq 252; 253; AVX-LABEL: test_v4i32: 254; AVX: # %bb.0: 255; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 256; AVX-NEXT: vptest %xmm1, %xmm0 257; AVX-NEXT: setae %al 258; AVX-NEXT: retq 259 %1 = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %a0) 260 %2 = icmp ne i32 %1, -1 261 ret i1 %2 262} 263 264define i1 @test_v8i32(<8 x i32> %a0) { 265; SSE2-LABEL: test_v8i32: 266; SSE2: # %bb.0: 267; SSE2-NEXT: pand %xmm1, %xmm0 268; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 269; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 270; SSE2-NEXT: movmskps %xmm1, %eax 271; SSE2-NEXT: xorl $15, %eax 272; SSE2-NEXT: sete %al 273; SSE2-NEXT: retq 274; 275; SSE41-LABEL: test_v8i32: 276; SSE41: # %bb.0: 277; SSE41-NEXT: pand %xmm1, %xmm0 278; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 279; SSE41-NEXT: ptest %xmm1, %xmm0 280; SSE41-NEXT: setb %al 281; SSE41-NEXT: retq 282; 283; AVX1-LABEL: test_v8i32: 284; AVX1: # %bb.0: 285; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 286; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 287; AVX1-NEXT: vptest %ymm1, %ymm0 288; AVX1-NEXT: setb %al 289; AVX1-NEXT: vzeroupper 290; AVX1-NEXT: retq 291; 292; AVX2-LABEL: test_v8i32: 293; AVX2: # %bb.0: 294; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 295; AVX2-NEXT: vptest %ymm1, %ymm0 296; AVX2-NEXT: setb %al 297; AVX2-NEXT: vzeroupper 298; AVX2-NEXT: retq 299; 300; AVX512-LABEL: test_v8i32: 301; AVX512: # %bb.0: 302; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 303; AVX512-NEXT: vptest %ymm1, %ymm0 304; AVX512-NEXT: setb %al 305; AVX512-NEXT: vzeroupper 306; AVX512-NEXT: retq 307 %1 = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %a0) 308 %2 = icmp eq i32 %1, -1 309 ret i1 %2 310} 311 312define i1 @test_v16i32(<16 x i32> %a0) { 313; SSE2-LABEL: test_v16i32: 314; SSE2: # %bb.0: 315; SSE2-NEXT: pand %xmm3, %xmm1 316; SSE2-NEXT: pand %xmm2, %xmm0 317; SSE2-NEXT: pand %xmm1, %xmm0 318; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 319; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 320; SSE2-NEXT: movmskps %xmm1, %eax 321; SSE2-NEXT: xorl $15, %eax 322; SSE2-NEXT: setne %al 323; SSE2-NEXT: retq 324; 325; SSE41-LABEL: test_v16i32: 326; SSE41: # %bb.0: 327; SSE41-NEXT: pand %xmm3, %xmm1 328; SSE41-NEXT: pand %xmm2, %xmm0 329; SSE41-NEXT: pand %xmm1, %xmm0 330; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 331; SSE41-NEXT: ptest %xmm1, %xmm0 332; SSE41-NEXT: setae %al 333; SSE41-NEXT: retq 334; 335; AVX1-LABEL: test_v16i32: 336; AVX1: # %bb.0: 337; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 338; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 339; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 340; AVX1-NEXT: vptest %ymm1, %ymm0 341; AVX1-NEXT: setae %al 342; AVX1-NEXT: vzeroupper 343; AVX1-NEXT: retq 344; 345; AVX2-LABEL: test_v16i32: 346; AVX2: # %bb.0: 347; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 348; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 349; AVX2-NEXT: vptest %ymm1, %ymm0 350; AVX2-NEXT: setae %al 351; AVX2-NEXT: vzeroupper 352; AVX2-NEXT: retq 353; 354; AVX512-LABEL: test_v16i32: 355; AVX512: # %bb.0: 356; AVX512-NEXT: vpternlogd {{.*#+}} zmm1 = -1 357; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 358; AVX512-NEXT: kortestw %k0, %k0 359; AVX512-NEXT: setne %al 360; AVX512-NEXT: vzeroupper 361; AVX512-NEXT: retq 362 %1 = call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %a0) 363 %2 = icmp ne i32 %1, -1 364 ret i1 %2 365} 366 367define i1 @test_v32i32(<32 x i32> %a0) { 368; SSE2-LABEL: test_v32i32: 369; SSE2: # %bb.0: 370; SSE2-NEXT: pand %xmm7, %xmm3 371; SSE2-NEXT: pand %xmm5, %xmm1 372; SSE2-NEXT: pand %xmm3, %xmm1 373; SSE2-NEXT: pand %xmm6, %xmm2 374; SSE2-NEXT: pand %xmm4, %xmm0 375; SSE2-NEXT: pand %xmm2, %xmm0 376; SSE2-NEXT: pand %xmm1, %xmm0 377; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 378; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 379; SSE2-NEXT: movmskps %xmm1, %eax 380; SSE2-NEXT: xorl $15, %eax 381; SSE2-NEXT: sete %al 382; SSE2-NEXT: retq 383; 384; SSE41-LABEL: test_v32i32: 385; SSE41: # %bb.0: 386; SSE41-NEXT: pand %xmm7, %xmm3 387; SSE41-NEXT: pand %xmm5, %xmm1 388; SSE41-NEXT: pand %xmm3, %xmm1 389; SSE41-NEXT: pand %xmm6, %xmm2 390; SSE41-NEXT: pand %xmm4, %xmm0 391; SSE41-NEXT: pand %xmm2, %xmm0 392; SSE41-NEXT: pand %xmm1, %xmm0 393; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 394; SSE41-NEXT: ptest %xmm1, %xmm0 395; SSE41-NEXT: setb %al 396; SSE41-NEXT: retq 397; 398; AVX1-LABEL: test_v32i32: 399; AVX1: # %bb.0: 400; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1 401; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 402; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 403; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 404; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 405; AVX1-NEXT: vptest %ymm1, %ymm0 406; AVX1-NEXT: setb %al 407; AVX1-NEXT: vzeroupper 408; AVX1-NEXT: retq 409; 410; AVX2-LABEL: test_v32i32: 411; AVX2: # %bb.0: 412; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 413; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 414; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 415; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 416; AVX2-NEXT: vptest %ymm1, %ymm0 417; AVX2-NEXT: setb %al 418; AVX2-NEXT: vzeroupper 419; AVX2-NEXT: retq 420; 421; AVX512-LABEL: test_v32i32: 422; AVX512: # %bb.0: 423; AVX512-NEXT: vpandd %zmm1, %zmm0, %zmm0 424; AVX512-NEXT: vpternlogd {{.*#+}} zmm1 = -1 425; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 426; AVX512-NEXT: kortestw %k0, %k0 427; AVX512-NEXT: sete %al 428; AVX512-NEXT: vzeroupper 429; AVX512-NEXT: retq 430 %1 = call i32 @llvm.vector.reduce.and.v32i32(<32 x i32> %a0) 431 %2 = icmp eq i32 %1, -1 432 ret i1 %2 433} 434 435; 436; vXi16 437; 438 439define i1 @test_v2i16(<2 x i16> %a0) { 440; SSE-LABEL: test_v2i16: 441; SSE: # %bb.0: 442; SSE-NEXT: movd %xmm0, %eax 443; SSE-NEXT: cmpl $-1, %eax 444; SSE-NEXT: sete %al 445; SSE-NEXT: retq 446; 447; AVX-LABEL: test_v2i16: 448; AVX: # %bb.0: 449; AVX-NEXT: vmovd %xmm0, %eax 450; AVX-NEXT: cmpl $-1, %eax 451; AVX-NEXT: sete %al 452; AVX-NEXT: retq 453 %1 = call i16 @llvm.vector.reduce.and.v2i16(<2 x i16> %a0) 454 %2 = icmp eq i16 %1, -1 455 ret i1 %2 456} 457 458define i1 @test_v4i16(<4 x i16> %a0) { 459; SSE-LABEL: test_v4i16: 460; SSE: # %bb.0: 461; SSE-NEXT: movq %xmm0, %rax 462; SSE-NEXT: cmpq $-1, %rax 463; SSE-NEXT: setne %al 464; SSE-NEXT: retq 465; 466; AVX-LABEL: test_v4i16: 467; AVX: # %bb.0: 468; AVX-NEXT: vmovq %xmm0, %rax 469; AVX-NEXT: cmpq $-1, %rax 470; AVX-NEXT: setne %al 471; AVX-NEXT: retq 472 %1 = call i16 @llvm.vector.reduce.and.v4i16(<4 x i16> %a0) 473 %2 = icmp ne i16 %1, -1 474 ret i1 %2 475} 476 477define i1 @test_v8i16(<8 x i16> %a0) { 478; SSE2-LABEL: test_v8i16: 479; SSE2: # %bb.0: 480; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 481; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 482; SSE2-NEXT: pmovmskb %xmm1, %eax 483; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 484; SSE2-NEXT: sete %al 485; SSE2-NEXT: retq 486; 487; SSE41-LABEL: test_v8i16: 488; SSE41: # %bb.0: 489; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 490; SSE41-NEXT: ptest %xmm1, %xmm0 491; SSE41-NEXT: setb %al 492; SSE41-NEXT: retq 493; 494; AVX-LABEL: test_v8i16: 495; AVX: # %bb.0: 496; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 497; AVX-NEXT: vptest %xmm1, %xmm0 498; AVX-NEXT: setb %al 499; AVX-NEXT: retq 500 %1 = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %a0) 501 %2 = icmp eq i16 %1, -1 502 ret i1 %2 503} 504 505define i1 @test_v16i16(<16 x i16> %a0) { 506; SSE2-LABEL: test_v16i16: 507; SSE2: # %bb.0: 508; SSE2-NEXT: pand %xmm1, %xmm0 509; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 510; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 511; SSE2-NEXT: pmovmskb %xmm1, %eax 512; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 513; SSE2-NEXT: setne %al 514; SSE2-NEXT: retq 515; 516; SSE41-LABEL: test_v16i16: 517; SSE41: # %bb.0: 518; SSE41-NEXT: pand %xmm1, %xmm0 519; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 520; SSE41-NEXT: ptest %xmm1, %xmm0 521; SSE41-NEXT: setae %al 522; SSE41-NEXT: retq 523; 524; AVX1-LABEL: test_v16i16: 525; AVX1: # %bb.0: 526; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 527; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 528; AVX1-NEXT: vptest %ymm1, %ymm0 529; AVX1-NEXT: setae %al 530; AVX1-NEXT: vzeroupper 531; AVX1-NEXT: retq 532; 533; AVX2-LABEL: test_v16i16: 534; AVX2: # %bb.0: 535; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 536; AVX2-NEXT: vptest %ymm1, %ymm0 537; AVX2-NEXT: setae %al 538; AVX2-NEXT: vzeroupper 539; AVX2-NEXT: retq 540; 541; AVX512-LABEL: test_v16i16: 542; AVX512: # %bb.0: 543; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 544; AVX512-NEXT: vptest %ymm1, %ymm0 545; AVX512-NEXT: setae %al 546; AVX512-NEXT: vzeroupper 547; AVX512-NEXT: retq 548 %1 = call i16 @llvm.vector.reduce.and.v16i16(<16 x i16> %a0) 549 %2 = icmp ne i16 %1, -1 550 ret i1 %2 551} 552 553define i1 @test_v32i16(<32 x i16> %a0) { 554; SSE2-LABEL: test_v32i16: 555; SSE2: # %bb.0: 556; SSE2-NEXT: pand %xmm3, %xmm1 557; SSE2-NEXT: pand %xmm2, %xmm0 558; SSE2-NEXT: pand %xmm1, %xmm0 559; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 560; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 561; SSE2-NEXT: pmovmskb %xmm1, %eax 562; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 563; SSE2-NEXT: sete %al 564; SSE2-NEXT: retq 565; 566; SSE41-LABEL: test_v32i16: 567; SSE41: # %bb.0: 568; SSE41-NEXT: pand %xmm3, %xmm1 569; SSE41-NEXT: pand %xmm2, %xmm0 570; SSE41-NEXT: pand %xmm1, %xmm0 571; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 572; SSE41-NEXT: ptest %xmm1, %xmm0 573; SSE41-NEXT: setb %al 574; SSE41-NEXT: retq 575; 576; AVX1-LABEL: test_v32i16: 577; AVX1: # %bb.0: 578; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 579; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 580; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 581; AVX1-NEXT: vptest %ymm1, %ymm0 582; AVX1-NEXT: setb %al 583; AVX1-NEXT: vzeroupper 584; AVX1-NEXT: retq 585; 586; AVX2-LABEL: test_v32i16: 587; AVX2: # %bb.0: 588; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 589; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 590; AVX2-NEXT: vptest %ymm1, %ymm0 591; AVX2-NEXT: setb %al 592; AVX2-NEXT: vzeroupper 593; AVX2-NEXT: retq 594; 595; AVX512-LABEL: test_v32i16: 596; AVX512: # %bb.0: 597; AVX512-NEXT: vpternlogd {{.*#+}} zmm1 = -1 598; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 599; AVX512-NEXT: kortestw %k0, %k0 600; AVX512-NEXT: sete %al 601; AVX512-NEXT: vzeroupper 602; AVX512-NEXT: retq 603 %1 = call i16 @llvm.vector.reduce.and.v32i16(<32 x i16> %a0) 604 %2 = icmp eq i16 %1, -1 605 ret i1 %2 606} 607 608define i1 @test_v64i16(<64 x i16> %a0) { 609; SSE2-LABEL: test_v64i16: 610; SSE2: # %bb.0: 611; SSE2-NEXT: pand %xmm7, %xmm3 612; SSE2-NEXT: pand %xmm5, %xmm1 613; SSE2-NEXT: pand %xmm3, %xmm1 614; SSE2-NEXT: pand %xmm6, %xmm2 615; SSE2-NEXT: pand %xmm4, %xmm0 616; SSE2-NEXT: pand %xmm2, %xmm0 617; SSE2-NEXT: pand %xmm1, %xmm0 618; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 619; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 620; SSE2-NEXT: pmovmskb %xmm1, %eax 621; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 622; SSE2-NEXT: setne %al 623; SSE2-NEXT: retq 624; 625; SSE41-LABEL: test_v64i16: 626; SSE41: # %bb.0: 627; SSE41-NEXT: pand %xmm7, %xmm3 628; SSE41-NEXT: pand %xmm5, %xmm1 629; SSE41-NEXT: pand %xmm3, %xmm1 630; SSE41-NEXT: pand %xmm6, %xmm2 631; SSE41-NEXT: pand %xmm4, %xmm0 632; SSE41-NEXT: pand %xmm2, %xmm0 633; SSE41-NEXT: pand %xmm1, %xmm0 634; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 635; SSE41-NEXT: ptest %xmm1, %xmm0 636; SSE41-NEXT: setae %al 637; SSE41-NEXT: retq 638; 639; AVX1-LABEL: test_v64i16: 640; AVX1: # %bb.0: 641; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1 642; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 643; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 644; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 645; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 646; AVX1-NEXT: vptest %ymm1, %ymm0 647; AVX1-NEXT: setae %al 648; AVX1-NEXT: vzeroupper 649; AVX1-NEXT: retq 650; 651; AVX2-LABEL: test_v64i16: 652; AVX2: # %bb.0: 653; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 654; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 655; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 656; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 657; AVX2-NEXT: vptest %ymm1, %ymm0 658; AVX2-NEXT: setae %al 659; AVX2-NEXT: vzeroupper 660; AVX2-NEXT: retq 661; 662; AVX512-LABEL: test_v64i16: 663; AVX512: # %bb.0: 664; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm0 665; AVX512-NEXT: vpternlogd {{.*#+}} zmm1 = -1 666; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 667; AVX512-NEXT: kortestw %k0, %k0 668; AVX512-NEXT: setne %al 669; AVX512-NEXT: vzeroupper 670; AVX512-NEXT: retq 671 %1 = call i16 @llvm.vector.reduce.and.v64i16(<64 x i16> %a0) 672 %2 = icmp ne i16 %1, -1 673 ret i1 %2 674} 675 676; 677; vXi8 678; 679 680define i1 @test_v2i8(<2 x i8> %a0) { 681; SSE-LABEL: test_v2i8: 682; SSE: # %bb.0: 683; SSE-NEXT: movd %xmm0, %eax 684; SSE-NEXT: cmpw $-1, %ax 685; SSE-NEXT: sete %al 686; SSE-NEXT: retq 687; 688; AVX-LABEL: test_v2i8: 689; AVX: # %bb.0: 690; AVX-NEXT: vmovd %xmm0, %eax 691; AVX-NEXT: cmpw $-1, %ax 692; AVX-NEXT: sete %al 693; AVX-NEXT: retq 694 %1 = call i8 @llvm.vector.reduce.and.v2i8(<2 x i8> %a0) 695 %2 = icmp eq i8 %1, -1 696 ret i1 %2 697} 698 699define i1 @test_v4i8(<4 x i8> %a0) { 700; SSE-LABEL: test_v4i8: 701; SSE: # %bb.0: 702; SSE-NEXT: movd %xmm0, %eax 703; SSE-NEXT: cmpl $-1, %eax 704; SSE-NEXT: setne %al 705; SSE-NEXT: retq 706; 707; AVX-LABEL: test_v4i8: 708; AVX: # %bb.0: 709; AVX-NEXT: vmovd %xmm0, %eax 710; AVX-NEXT: cmpl $-1, %eax 711; AVX-NEXT: setne %al 712; AVX-NEXT: retq 713 %1 = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> %a0) 714 %2 = icmp ne i8 %1, -1 715 ret i1 %2 716} 717 718define i1 @test_v8i8(<8 x i8> %a0) { 719; SSE-LABEL: test_v8i8: 720; SSE: # %bb.0: 721; SSE-NEXT: movq %xmm0, %rax 722; SSE-NEXT: cmpq $-1, %rax 723; SSE-NEXT: sete %al 724; SSE-NEXT: retq 725; 726; AVX-LABEL: test_v8i8: 727; AVX: # %bb.0: 728; AVX-NEXT: vmovq %xmm0, %rax 729; AVX-NEXT: cmpq $-1, %rax 730; AVX-NEXT: sete %al 731; AVX-NEXT: retq 732 %1 = call i8 @llvm.vector.reduce.and.v8i8(<8 x i8> %a0) 733 %2 = icmp eq i8 %1, -1 734 ret i1 %2 735} 736 737define i1 @test_v16i8(<16 x i8> %a0) { 738; SSE2-LABEL: test_v16i8: 739; SSE2: # %bb.0: 740; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 741; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 742; SSE2-NEXT: pmovmskb %xmm1, %eax 743; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 744; SSE2-NEXT: setne %al 745; SSE2-NEXT: retq 746; 747; SSE41-LABEL: test_v16i8: 748; SSE41: # %bb.0: 749; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 750; SSE41-NEXT: ptest %xmm1, %xmm0 751; SSE41-NEXT: setae %al 752; SSE41-NEXT: retq 753; 754; AVX-LABEL: test_v16i8: 755; AVX: # %bb.0: 756; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 757; AVX-NEXT: vptest %xmm1, %xmm0 758; AVX-NEXT: setae %al 759; AVX-NEXT: retq 760 %1 = call i8 @llvm.vector.reduce.and.v16i8(<16 x i8> %a0) 761 %2 = icmp ne i8 %1, -1 762 ret i1 %2 763} 764 765define i1 @test_v32i8(<32 x i8> %a0) { 766; SSE2-LABEL: test_v32i8: 767; SSE2: # %bb.0: 768; SSE2-NEXT: pand %xmm1, %xmm0 769; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 770; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 771; SSE2-NEXT: pmovmskb %xmm1, %eax 772; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 773; SSE2-NEXT: sete %al 774; SSE2-NEXT: retq 775; 776; SSE41-LABEL: test_v32i8: 777; SSE41: # %bb.0: 778; SSE41-NEXT: pand %xmm1, %xmm0 779; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 780; SSE41-NEXT: ptest %xmm1, %xmm0 781; SSE41-NEXT: setb %al 782; SSE41-NEXT: retq 783; 784; AVX1-LABEL: test_v32i8: 785; AVX1: # %bb.0: 786; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 787; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 788; AVX1-NEXT: vptest %ymm1, %ymm0 789; AVX1-NEXT: setb %al 790; AVX1-NEXT: vzeroupper 791; AVX1-NEXT: retq 792; 793; AVX2-LABEL: test_v32i8: 794; AVX2: # %bb.0: 795; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 796; AVX2-NEXT: vptest %ymm1, %ymm0 797; AVX2-NEXT: setb %al 798; AVX2-NEXT: vzeroupper 799; AVX2-NEXT: retq 800; 801; AVX512-LABEL: test_v32i8: 802; AVX512: # %bb.0: 803; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 804; AVX512-NEXT: vptest %ymm1, %ymm0 805; AVX512-NEXT: setb %al 806; AVX512-NEXT: vzeroupper 807; AVX512-NEXT: retq 808 %1 = call i8 @llvm.vector.reduce.and.v32i8(<32 x i8> %a0) 809 %2 = icmp eq i8 %1, -1 810 ret i1 %2 811} 812 813define i1 @test_v64i8(<64 x i8> %a0) { 814; SSE2-LABEL: test_v64i8: 815; SSE2: # %bb.0: 816; SSE2-NEXT: pand %xmm3, %xmm1 817; SSE2-NEXT: pand %xmm2, %xmm0 818; SSE2-NEXT: pand %xmm1, %xmm0 819; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 820; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 821; SSE2-NEXT: pmovmskb %xmm1, %eax 822; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 823; SSE2-NEXT: setne %al 824; SSE2-NEXT: retq 825; 826; SSE41-LABEL: test_v64i8: 827; SSE41: # %bb.0: 828; SSE41-NEXT: pand %xmm3, %xmm1 829; SSE41-NEXT: pand %xmm2, %xmm0 830; SSE41-NEXT: pand %xmm1, %xmm0 831; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 832; SSE41-NEXT: ptest %xmm1, %xmm0 833; SSE41-NEXT: setae %al 834; SSE41-NEXT: retq 835; 836; AVX1-LABEL: test_v64i8: 837; AVX1: # %bb.0: 838; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 839; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 840; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 841; AVX1-NEXT: vptest %ymm1, %ymm0 842; AVX1-NEXT: setae %al 843; AVX1-NEXT: vzeroupper 844; AVX1-NEXT: retq 845; 846; AVX2-LABEL: test_v64i8: 847; AVX2: # %bb.0: 848; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 849; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 850; AVX2-NEXT: vptest %ymm1, %ymm0 851; AVX2-NEXT: setae %al 852; AVX2-NEXT: vzeroupper 853; AVX2-NEXT: retq 854; 855; AVX512-LABEL: test_v64i8: 856; AVX512: # %bb.0: 857; AVX512-NEXT: vpternlogd {{.*#+}} zmm1 = -1 858; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 859; AVX512-NEXT: kortestw %k0, %k0 860; AVX512-NEXT: setne %al 861; AVX512-NEXT: vzeroupper 862; AVX512-NEXT: retq 863 %1 = call i8 @llvm.vector.reduce.and.v64i8(<64 x i8> %a0) 864 %2 = icmp ne i8 %1, -1 865 ret i1 %2 866} 867 868define i1 @test_v128i8(<128 x i8> %a0) { 869; SSE2-LABEL: test_v128i8: 870; SSE2: # %bb.0: 871; SSE2-NEXT: pand %xmm7, %xmm3 872; SSE2-NEXT: pand %xmm5, %xmm1 873; SSE2-NEXT: pand %xmm3, %xmm1 874; SSE2-NEXT: pand %xmm6, %xmm2 875; SSE2-NEXT: pand %xmm4, %xmm0 876; SSE2-NEXT: pand %xmm2, %xmm0 877; SSE2-NEXT: pand %xmm1, %xmm0 878; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 879; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 880; SSE2-NEXT: pmovmskb %xmm1, %eax 881; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 882; SSE2-NEXT: sete %al 883; SSE2-NEXT: retq 884; 885; SSE41-LABEL: test_v128i8: 886; SSE41: # %bb.0: 887; SSE41-NEXT: pand %xmm7, %xmm3 888; SSE41-NEXT: pand %xmm5, %xmm1 889; SSE41-NEXT: pand %xmm3, %xmm1 890; SSE41-NEXT: pand %xmm6, %xmm2 891; SSE41-NEXT: pand %xmm4, %xmm0 892; SSE41-NEXT: pand %xmm2, %xmm0 893; SSE41-NEXT: pand %xmm1, %xmm0 894; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 895; SSE41-NEXT: ptest %xmm1, %xmm0 896; SSE41-NEXT: setb %al 897; SSE41-NEXT: retq 898; 899; AVX1-LABEL: test_v128i8: 900; AVX1: # %bb.0: 901; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1 902; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 903; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 904; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 905; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1 906; AVX1-NEXT: vptest %ymm1, %ymm0 907; AVX1-NEXT: setb %al 908; AVX1-NEXT: vzeroupper 909; AVX1-NEXT: retq 910; 911; AVX2-LABEL: test_v128i8: 912; AVX2: # %bb.0: 913; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 914; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 915; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 916; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 917; AVX2-NEXT: vptest %ymm1, %ymm0 918; AVX2-NEXT: setb %al 919; AVX2-NEXT: vzeroupper 920; AVX2-NEXT: retq 921; 922; AVX512-LABEL: test_v128i8: 923; AVX512: # %bb.0: 924; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm0 925; AVX512-NEXT: vpternlogd {{.*#+}} zmm1 = -1 926; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 927; AVX512-NEXT: kortestw %k0, %k0 928; AVX512-NEXT: sete %al 929; AVX512-NEXT: vzeroupper 930; AVX512-NEXT: retq 931 %1 = call i8 @llvm.vector.reduce.and.v128i8(<128 x i8> %a0) 932 %2 = icmp eq i8 %1, -1 933 ret i1 %2 934} 935 936declare i64 @llvm.vector.reduce.and.v2i64(<2 x i64>) 937declare i64 @llvm.vector.reduce.and.v4i64(<4 x i64>) 938declare i64 @llvm.vector.reduce.and.v8i64(<8 x i64>) 939declare i64 @llvm.vector.reduce.and.v16i64(<16 x i64>) 940 941declare i32 @llvm.vector.reduce.and.v2i32(<2 x i32>) 942declare i32 @llvm.vector.reduce.and.v4i32(<4 x i32>) 943declare i32 @llvm.vector.reduce.and.v8i32(<8 x i32>) 944declare i32 @llvm.vector.reduce.and.v16i32(<16 x i32>) 945declare i32 @llvm.vector.reduce.and.v32i32(<32 x i32>) 946 947declare i16 @llvm.vector.reduce.and.v2i16(<2 x i16>) 948declare i16 @llvm.vector.reduce.and.v4i16(<4 x i16>) 949declare i16 @llvm.vector.reduce.and.v8i16(<8 x i16>) 950declare i16 @llvm.vector.reduce.and.v16i16(<16 x i16>) 951declare i16 @llvm.vector.reduce.and.v32i16(<32 x i16>) 952declare i16 @llvm.vector.reduce.and.v64i16(<64 x i16>) 953 954declare i8 @llvm.vector.reduce.and.v2i8(<2 x i8>) 955declare i8 @llvm.vector.reduce.and.v4i8(<4 x i8>) 956declare i8 @llvm.vector.reduce.and.v8i8(<8 x i8>) 957declare i8 @llvm.vector.reduce.and.v16i8(<16 x i8>) 958declare i8 @llvm.vector.reduce.and.v32i8(<32 x i8>) 959declare i8 @llvm.vector.reduce.and.v64i8(<64 x i8>) 960declare i8 @llvm.vector.reduce.and.v128i8(<128 x i8>) 961;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 962; AVX1OR2: {{.*}} 963; AVX512BW: {{.*}} 964; AVX512BWVL: {{.*}} 965; AVX512F: {{.*}} 966