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: pxor %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: ptest %xmm0, %xmm0 27; SSE41-NEXT: sete %al 28; SSE41-NEXT: retq 29; 30; AVX-LABEL: test_v2i64: 31; AVX: # %bb.0: 32; AVX-NEXT: vptest %xmm0, %xmm0 33; AVX-NEXT: sete %al 34; AVX-NEXT: retq 35 %1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0) 36 %2 = icmp eq i64 %1, 0 37 ret i1 %2 38} 39 40define i1 @test_v4i64(<4 x i64> %a0) { 41; SSE2-LABEL: test_v4i64: 42; SSE2: # %bb.0: 43; SSE2-NEXT: por %xmm1, %xmm0 44; SSE2-NEXT: pxor %xmm1, %xmm1 45; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 46; SSE2-NEXT: movmskps %xmm1, %eax 47; SSE2-NEXT: xorl $15, %eax 48; SSE2-NEXT: setne %al 49; SSE2-NEXT: retq 50; 51; SSE41-LABEL: test_v4i64: 52; SSE41: # %bb.0: 53; SSE41-NEXT: por %xmm1, %xmm0 54; SSE41-NEXT: ptest %xmm0, %xmm0 55; SSE41-NEXT: setne %al 56; SSE41-NEXT: retq 57; 58; AVX-LABEL: test_v4i64: 59; AVX: # %bb.0: 60; AVX-NEXT: vptest %ymm0, %ymm0 61; AVX-NEXT: setne %al 62; AVX-NEXT: vzeroupper 63; AVX-NEXT: retq 64 %1 = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %a0) 65 %2 = icmp ne i64 %1, 0 66 ret i1 %2 67} 68 69define i1 @test_v8i64(<8 x i64> %a0) { 70; SSE2-LABEL: test_v8i64: 71; SSE2: # %bb.0: 72; SSE2-NEXT: por %xmm3, %xmm1 73; SSE2-NEXT: por %xmm2, %xmm0 74; SSE2-NEXT: por %xmm1, %xmm0 75; SSE2-NEXT: pxor %xmm1, %xmm1 76; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 77; SSE2-NEXT: movmskps %xmm1, %eax 78; SSE2-NEXT: xorl $15, %eax 79; SSE2-NEXT: sete %al 80; SSE2-NEXT: retq 81; 82; SSE41-LABEL: test_v8i64: 83; SSE41: # %bb.0: 84; SSE41-NEXT: por %xmm3, %xmm1 85; SSE41-NEXT: por %xmm2, %xmm0 86; SSE41-NEXT: por %xmm1, %xmm0 87; SSE41-NEXT: ptest %xmm0, %xmm0 88; SSE41-NEXT: sete %al 89; SSE41-NEXT: retq 90; 91; AVX1-LABEL: test_v8i64: 92; AVX1: # %bb.0: 93; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 94; AVX1-NEXT: vptest %ymm0, %ymm0 95; AVX1-NEXT: sete %al 96; AVX1-NEXT: vzeroupper 97; AVX1-NEXT: retq 98; 99; AVX2-LABEL: test_v8i64: 100; AVX2: # %bb.0: 101; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 102; AVX2-NEXT: vptest %ymm0, %ymm0 103; AVX2-NEXT: sete %al 104; AVX2-NEXT: vzeroupper 105; AVX2-NEXT: retq 106; 107; AVX512-LABEL: test_v8i64: 108; AVX512: # %bb.0: 109; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0 110; AVX512-NEXT: kortestw %k0, %k0 111; AVX512-NEXT: sete %al 112; AVX512-NEXT: vzeroupper 113; AVX512-NEXT: retq 114 %1 = call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %a0) 115 %2 = icmp eq i64 %1, 0 116 ret i1 %2 117} 118 119define i1 @test_v16i64(<16 x i64> %a0) { 120; SSE2-LABEL: test_v16i64: 121; SSE2: # %bb.0: 122; SSE2-NEXT: por %xmm7, %xmm3 123; SSE2-NEXT: por %xmm5, %xmm1 124; SSE2-NEXT: por %xmm3, %xmm1 125; SSE2-NEXT: por %xmm6, %xmm2 126; SSE2-NEXT: por %xmm4, %xmm0 127; SSE2-NEXT: por %xmm2, %xmm0 128; SSE2-NEXT: por %xmm1, %xmm0 129; SSE2-NEXT: pxor %xmm1, %xmm1 130; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 131; SSE2-NEXT: movmskps %xmm1, %eax 132; SSE2-NEXT: xorl $15, %eax 133; SSE2-NEXT: setne %al 134; SSE2-NEXT: retq 135; 136; SSE41-LABEL: test_v16i64: 137; SSE41: # %bb.0: 138; SSE41-NEXT: por %xmm7, %xmm3 139; SSE41-NEXT: por %xmm5, %xmm1 140; SSE41-NEXT: por %xmm3, %xmm1 141; SSE41-NEXT: por %xmm6, %xmm2 142; SSE41-NEXT: por %xmm4, %xmm0 143; SSE41-NEXT: por %xmm2, %xmm0 144; SSE41-NEXT: por %xmm1, %xmm0 145; SSE41-NEXT: ptest %xmm0, %xmm0 146; SSE41-NEXT: setne %al 147; SSE41-NEXT: retq 148; 149; AVX1-LABEL: test_v16i64: 150; AVX1: # %bb.0: 151; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1 152; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0 153; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 154; AVX1-NEXT: vptest %ymm0, %ymm0 155; AVX1-NEXT: setne %al 156; AVX1-NEXT: vzeroupper 157; AVX1-NEXT: retq 158; 159; AVX2-LABEL: test_v16i64: 160; AVX2: # %bb.0: 161; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1 162; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0 163; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 164; AVX2-NEXT: vptest %ymm0, %ymm0 165; AVX2-NEXT: setne %al 166; AVX2-NEXT: vzeroupper 167; AVX2-NEXT: retq 168; 169; AVX512-LABEL: test_v16i64: 170; AVX512: # %bb.0: 171; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0 172; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0 173; AVX512-NEXT: kortestw %k0, %k0 174; AVX512-NEXT: setne %al 175; AVX512-NEXT: vzeroupper 176; AVX512-NEXT: retq 177 %1 = call i64 @llvm.vector.reduce.or.v16i64(<16 x i64> %a0) 178 %2 = icmp ne i64 %1, 0 179 ret i1 %2 180} 181 182; 183; vXi32 184; 185 186define i1 @test_v2i32(<2 x i32> %a0) { 187; SSE-LABEL: test_v2i32: 188; SSE: # %bb.0: 189; SSE-NEXT: movq %xmm0, %rax 190; SSE-NEXT: testq %rax, %rax 191; SSE-NEXT: sete %al 192; SSE-NEXT: retq 193; 194; AVX-LABEL: test_v2i32: 195; AVX: # %bb.0: 196; AVX-NEXT: vmovq %xmm0, %rax 197; AVX-NEXT: testq %rax, %rax 198; AVX-NEXT: sete %al 199; AVX-NEXT: retq 200 %1 = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %a0) 201 %2 = icmp eq i32 %1, 0 202 ret i1 %2 203} 204 205define i1 @test_v4i32(<4 x i32> %a0) { 206; SSE2-LABEL: test_v4i32: 207; SSE2: # %bb.0: 208; SSE2-NEXT: pxor %xmm1, %xmm1 209; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 210; SSE2-NEXT: movmskps %xmm1, %eax 211; SSE2-NEXT: xorl $15, %eax 212; SSE2-NEXT: setne %al 213; SSE2-NEXT: retq 214; 215; SSE41-LABEL: test_v4i32: 216; SSE41: # %bb.0: 217; SSE41-NEXT: ptest %xmm0, %xmm0 218; SSE41-NEXT: setne %al 219; SSE41-NEXT: retq 220; 221; AVX-LABEL: test_v4i32: 222; AVX: # %bb.0: 223; AVX-NEXT: vptest %xmm0, %xmm0 224; AVX-NEXT: setne %al 225; AVX-NEXT: retq 226 %1 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %a0) 227 %2 = icmp ne i32 %1, 0 228 ret i1 %2 229} 230 231define i1 @test_v8i32(<8 x i32> %a0) { 232; SSE2-LABEL: test_v8i32: 233; SSE2: # %bb.0: 234; SSE2-NEXT: por %xmm1, %xmm0 235; SSE2-NEXT: pxor %xmm1, %xmm1 236; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 237; SSE2-NEXT: movmskps %xmm1, %eax 238; SSE2-NEXT: xorl $15, %eax 239; SSE2-NEXT: sete %al 240; SSE2-NEXT: retq 241; 242; SSE41-LABEL: test_v8i32: 243; SSE41: # %bb.0: 244; SSE41-NEXT: por %xmm1, %xmm0 245; SSE41-NEXT: ptest %xmm0, %xmm0 246; SSE41-NEXT: sete %al 247; SSE41-NEXT: retq 248; 249; AVX-LABEL: test_v8i32: 250; AVX: # %bb.0: 251; AVX-NEXT: vptest %ymm0, %ymm0 252; AVX-NEXT: sete %al 253; AVX-NEXT: vzeroupper 254; AVX-NEXT: retq 255 %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0) 256 %2 = icmp eq i32 %1, 0 257 ret i1 %2 258} 259 260define i1 @test_v16i32(<16 x i32> %a0) { 261; SSE2-LABEL: test_v16i32: 262; SSE2: # %bb.0: 263; SSE2-NEXT: por %xmm3, %xmm1 264; SSE2-NEXT: por %xmm2, %xmm0 265; SSE2-NEXT: por %xmm1, %xmm0 266; SSE2-NEXT: pxor %xmm1, %xmm1 267; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 268; SSE2-NEXT: movmskps %xmm1, %eax 269; SSE2-NEXT: xorl $15, %eax 270; SSE2-NEXT: setne %al 271; SSE2-NEXT: retq 272; 273; SSE41-LABEL: test_v16i32: 274; SSE41: # %bb.0: 275; SSE41-NEXT: por %xmm3, %xmm1 276; SSE41-NEXT: por %xmm2, %xmm0 277; SSE41-NEXT: por %xmm1, %xmm0 278; SSE41-NEXT: ptest %xmm0, %xmm0 279; SSE41-NEXT: setne %al 280; SSE41-NEXT: retq 281; 282; AVX1-LABEL: test_v16i32: 283; AVX1: # %bb.0: 284; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 285; AVX1-NEXT: vptest %ymm0, %ymm0 286; AVX1-NEXT: setne %al 287; AVX1-NEXT: vzeroupper 288; AVX1-NEXT: retq 289; 290; AVX2-LABEL: test_v16i32: 291; AVX2: # %bb.0: 292; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 293; AVX2-NEXT: vptest %ymm0, %ymm0 294; AVX2-NEXT: setne %al 295; AVX2-NEXT: vzeroupper 296; AVX2-NEXT: retq 297; 298; AVX512-LABEL: test_v16i32: 299; AVX512: # %bb.0: 300; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0 301; AVX512-NEXT: kortestw %k0, %k0 302; AVX512-NEXT: setne %al 303; AVX512-NEXT: vzeroupper 304; AVX512-NEXT: retq 305 %1 = call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %a0) 306 %2 = icmp ne i32 %1, 0 307 ret i1 %2 308} 309 310define i1 @test_v32i32(<32 x i32> %a0) { 311; SSE2-LABEL: test_v32i32: 312; SSE2: # %bb.0: 313; SSE2-NEXT: por %xmm7, %xmm3 314; SSE2-NEXT: por %xmm5, %xmm1 315; SSE2-NEXT: por %xmm3, %xmm1 316; SSE2-NEXT: por %xmm6, %xmm2 317; SSE2-NEXT: por %xmm4, %xmm0 318; SSE2-NEXT: por %xmm2, %xmm0 319; SSE2-NEXT: por %xmm1, %xmm0 320; SSE2-NEXT: pxor %xmm1, %xmm1 321; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 322; SSE2-NEXT: movmskps %xmm1, %eax 323; SSE2-NEXT: xorl $15, %eax 324; SSE2-NEXT: sete %al 325; SSE2-NEXT: retq 326; 327; SSE41-LABEL: test_v32i32: 328; SSE41: # %bb.0: 329; SSE41-NEXT: por %xmm7, %xmm3 330; SSE41-NEXT: por %xmm5, %xmm1 331; SSE41-NEXT: por %xmm3, %xmm1 332; SSE41-NEXT: por %xmm6, %xmm2 333; SSE41-NEXT: por %xmm4, %xmm0 334; SSE41-NEXT: por %xmm2, %xmm0 335; SSE41-NEXT: por %xmm1, %xmm0 336; SSE41-NEXT: ptest %xmm0, %xmm0 337; SSE41-NEXT: sete %al 338; SSE41-NEXT: retq 339; 340; AVX1-LABEL: test_v32i32: 341; AVX1: # %bb.0: 342; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1 343; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0 344; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 345; AVX1-NEXT: vptest %ymm0, %ymm0 346; AVX1-NEXT: sete %al 347; AVX1-NEXT: vzeroupper 348; AVX1-NEXT: retq 349; 350; AVX2-LABEL: test_v32i32: 351; AVX2: # %bb.0: 352; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1 353; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0 354; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 355; AVX2-NEXT: vptest %ymm0, %ymm0 356; AVX2-NEXT: sete %al 357; AVX2-NEXT: vzeroupper 358; AVX2-NEXT: retq 359; 360; AVX512-LABEL: test_v32i32: 361; AVX512: # %bb.0: 362; AVX512-NEXT: vpord %zmm1, %zmm0, %zmm0 363; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0 364; AVX512-NEXT: kortestw %k0, %k0 365; AVX512-NEXT: sete %al 366; AVX512-NEXT: vzeroupper 367; AVX512-NEXT: retq 368 %1 = call i32 @llvm.vector.reduce.or.v32i32(<32 x i32> %a0) 369 %2 = icmp eq i32 %1, 0 370 ret i1 %2 371} 372 373; 374; vXi16 375; 376 377define i1 @test_v2i16(<2 x i16> %a0) { 378; SSE-LABEL: test_v2i16: 379; SSE: # %bb.0: 380; SSE-NEXT: movd %xmm0, %eax 381; SSE-NEXT: testl %eax, %eax 382; SSE-NEXT: sete %al 383; SSE-NEXT: retq 384; 385; AVX-LABEL: test_v2i16: 386; AVX: # %bb.0: 387; AVX-NEXT: vmovd %xmm0, %eax 388; AVX-NEXT: testl %eax, %eax 389; AVX-NEXT: sete %al 390; AVX-NEXT: retq 391 %1 = call i16 @llvm.vector.reduce.or.v2i16(<2 x i16> %a0) 392 %2 = icmp eq i16 %1, 0 393 ret i1 %2 394} 395 396define i1 @test_v4i16(<4 x i16> %a0) { 397; SSE-LABEL: test_v4i16: 398; SSE: # %bb.0: 399; SSE-NEXT: movq %xmm0, %rax 400; SSE-NEXT: testq %rax, %rax 401; SSE-NEXT: setne %al 402; SSE-NEXT: retq 403; 404; AVX-LABEL: test_v4i16: 405; AVX: # %bb.0: 406; AVX-NEXT: vmovq %xmm0, %rax 407; AVX-NEXT: testq %rax, %rax 408; AVX-NEXT: setne %al 409; AVX-NEXT: retq 410 %1 = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %a0) 411 %2 = icmp ne i16 %1, 0 412 ret i1 %2 413} 414 415define i1 @test_v8i16(<8 x i16> %a0) { 416; SSE2-LABEL: test_v8i16: 417; SSE2: # %bb.0: 418; SSE2-NEXT: pxor %xmm1, %xmm1 419; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 420; SSE2-NEXT: pmovmskb %xmm1, %eax 421; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 422; SSE2-NEXT: sete %al 423; SSE2-NEXT: retq 424; 425; SSE41-LABEL: test_v8i16: 426; SSE41: # %bb.0: 427; SSE41-NEXT: ptest %xmm0, %xmm0 428; SSE41-NEXT: sete %al 429; SSE41-NEXT: retq 430; 431; AVX-LABEL: test_v8i16: 432; AVX: # %bb.0: 433; AVX-NEXT: vptest %xmm0, %xmm0 434; AVX-NEXT: sete %al 435; AVX-NEXT: retq 436 %1 = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %a0) 437 %2 = icmp eq i16 %1, 0 438 ret i1 %2 439} 440 441define i1 @test_v16i16(<16 x i16> %a0) { 442; SSE2-LABEL: test_v16i16: 443; SSE2: # %bb.0: 444; SSE2-NEXT: por %xmm1, %xmm0 445; SSE2-NEXT: pxor %xmm1, %xmm1 446; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 447; SSE2-NEXT: pmovmskb %xmm1, %eax 448; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 449; SSE2-NEXT: setne %al 450; SSE2-NEXT: retq 451; 452; SSE41-LABEL: test_v16i16: 453; SSE41: # %bb.0: 454; SSE41-NEXT: por %xmm1, %xmm0 455; SSE41-NEXT: ptest %xmm0, %xmm0 456; SSE41-NEXT: setne %al 457; SSE41-NEXT: retq 458; 459; AVX-LABEL: test_v16i16: 460; AVX: # %bb.0: 461; AVX-NEXT: vptest %ymm0, %ymm0 462; AVX-NEXT: setne %al 463; AVX-NEXT: vzeroupper 464; AVX-NEXT: retq 465 %1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0) 466 %2 = icmp ne i16 %1, 0 467 ret i1 %2 468} 469 470define i1 @test_v32i16(<32 x i16> %a0) { 471; SSE2-LABEL: test_v32i16: 472; SSE2: # %bb.0: 473; SSE2-NEXT: por %xmm3, %xmm1 474; SSE2-NEXT: por %xmm2, %xmm0 475; SSE2-NEXT: por %xmm1, %xmm0 476; SSE2-NEXT: pxor %xmm1, %xmm1 477; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 478; SSE2-NEXT: pmovmskb %xmm1, %eax 479; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 480; SSE2-NEXT: sete %al 481; SSE2-NEXT: retq 482; 483; SSE41-LABEL: test_v32i16: 484; SSE41: # %bb.0: 485; SSE41-NEXT: por %xmm3, %xmm1 486; SSE41-NEXT: por %xmm2, %xmm0 487; SSE41-NEXT: por %xmm1, %xmm0 488; SSE41-NEXT: ptest %xmm0, %xmm0 489; SSE41-NEXT: sete %al 490; SSE41-NEXT: retq 491; 492; AVX1-LABEL: test_v32i16: 493; AVX1: # %bb.0: 494; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 495; AVX1-NEXT: vptest %ymm0, %ymm0 496; AVX1-NEXT: sete %al 497; AVX1-NEXT: vzeroupper 498; AVX1-NEXT: retq 499; 500; AVX2-LABEL: test_v32i16: 501; AVX2: # %bb.0: 502; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 503; AVX2-NEXT: vptest %ymm0, %ymm0 504; AVX2-NEXT: sete %al 505; AVX2-NEXT: vzeroupper 506; AVX2-NEXT: retq 507; 508; AVX512-LABEL: test_v32i16: 509; AVX512: # %bb.0: 510; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0 511; AVX512-NEXT: kortestw %k0, %k0 512; AVX512-NEXT: sete %al 513; AVX512-NEXT: vzeroupper 514; AVX512-NEXT: retq 515 %1 = call i16 @llvm.vector.reduce.or.v32i16(<32 x i16> %a0) 516 %2 = icmp eq i16 %1, 0 517 ret i1 %2 518} 519 520define i1 @test_v64i16(<64 x i16> %a0) { 521; SSE2-LABEL: test_v64i16: 522; SSE2: # %bb.0: 523; SSE2-NEXT: por %xmm7, %xmm3 524; SSE2-NEXT: por %xmm5, %xmm1 525; SSE2-NEXT: por %xmm3, %xmm1 526; SSE2-NEXT: por %xmm6, %xmm2 527; SSE2-NEXT: por %xmm4, %xmm0 528; SSE2-NEXT: por %xmm2, %xmm0 529; SSE2-NEXT: por %xmm1, %xmm0 530; SSE2-NEXT: pxor %xmm1, %xmm1 531; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 532; SSE2-NEXT: pmovmskb %xmm1, %eax 533; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 534; SSE2-NEXT: setne %al 535; SSE2-NEXT: retq 536; 537; SSE41-LABEL: test_v64i16: 538; SSE41: # %bb.0: 539; SSE41-NEXT: por %xmm7, %xmm3 540; SSE41-NEXT: por %xmm5, %xmm1 541; SSE41-NEXT: por %xmm3, %xmm1 542; SSE41-NEXT: por %xmm6, %xmm2 543; SSE41-NEXT: por %xmm4, %xmm0 544; SSE41-NEXT: por %xmm2, %xmm0 545; SSE41-NEXT: por %xmm1, %xmm0 546; SSE41-NEXT: ptest %xmm0, %xmm0 547; SSE41-NEXT: setne %al 548; SSE41-NEXT: retq 549; 550; AVX1-LABEL: test_v64i16: 551; AVX1: # %bb.0: 552; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1 553; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0 554; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 555; AVX1-NEXT: vptest %ymm0, %ymm0 556; AVX1-NEXT: setne %al 557; AVX1-NEXT: vzeroupper 558; AVX1-NEXT: retq 559; 560; AVX2-LABEL: test_v64i16: 561; AVX2: # %bb.0: 562; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1 563; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0 564; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 565; AVX2-NEXT: vptest %ymm0, %ymm0 566; AVX2-NEXT: setne %al 567; AVX2-NEXT: vzeroupper 568; AVX2-NEXT: retq 569; 570; AVX512-LABEL: test_v64i16: 571; AVX512: # %bb.0: 572; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0 573; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0 574; AVX512-NEXT: kortestw %k0, %k0 575; AVX512-NEXT: setne %al 576; AVX512-NEXT: vzeroupper 577; AVX512-NEXT: retq 578 %1 = call i16 @llvm.vector.reduce.or.v64i16(<64 x i16> %a0) 579 %2 = icmp ne i16 %1, 0 580 ret i1 %2 581} 582 583; 584; vXi8 585; 586 587define i1 @test_v2i8(<2 x i8> %a0) { 588; SSE-LABEL: test_v2i8: 589; SSE: # %bb.0: 590; SSE-NEXT: movd %xmm0, %eax 591; SSE-NEXT: testw %ax, %ax 592; SSE-NEXT: sete %al 593; SSE-NEXT: retq 594; 595; AVX-LABEL: test_v2i8: 596; AVX: # %bb.0: 597; AVX-NEXT: vmovd %xmm0, %eax 598; AVX-NEXT: testw %ax, %ax 599; AVX-NEXT: sete %al 600; AVX-NEXT: retq 601 %1 = call i8 @llvm.vector.reduce.or.v2i8(<2 x i8> %a0) 602 %2 = icmp eq i8 %1, 0 603 ret i1 %2 604} 605 606define i1 @test_v4i8(<4 x i8> %a0) { 607; SSE-LABEL: test_v4i8: 608; SSE: # %bb.0: 609; SSE-NEXT: movd %xmm0, %eax 610; SSE-NEXT: testl %eax, %eax 611; SSE-NEXT: setne %al 612; SSE-NEXT: retq 613; 614; AVX-LABEL: test_v4i8: 615; AVX: # %bb.0: 616; AVX-NEXT: vmovd %xmm0, %eax 617; AVX-NEXT: testl %eax, %eax 618; AVX-NEXT: setne %al 619; AVX-NEXT: retq 620 %1 = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> %a0) 621 %2 = icmp ne i8 %1, 0 622 ret i1 %2 623} 624 625define i1 @test_v8i8(<8 x i8> %a0) { 626; SSE-LABEL: test_v8i8: 627; SSE: # %bb.0: 628; SSE-NEXT: movq %xmm0, %rax 629; SSE-NEXT: testq %rax, %rax 630; SSE-NEXT: sete %al 631; SSE-NEXT: retq 632; 633; AVX-LABEL: test_v8i8: 634; AVX: # %bb.0: 635; AVX-NEXT: vmovq %xmm0, %rax 636; AVX-NEXT: testq %rax, %rax 637; AVX-NEXT: sete %al 638; AVX-NEXT: retq 639 %1 = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> %a0) 640 %2 = icmp eq i8 %1, 0 641 ret i1 %2 642} 643 644define i1 @test_v16i8(<16 x i8> %a0) { 645; SSE2-LABEL: test_v16i8: 646; SSE2: # %bb.0: 647; SSE2-NEXT: pxor %xmm1, %xmm1 648; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 649; SSE2-NEXT: pmovmskb %xmm1, %eax 650; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 651; SSE2-NEXT: setne %al 652; SSE2-NEXT: retq 653; 654; SSE41-LABEL: test_v16i8: 655; SSE41: # %bb.0: 656; SSE41-NEXT: ptest %xmm0, %xmm0 657; SSE41-NEXT: setne %al 658; SSE41-NEXT: retq 659; 660; AVX-LABEL: test_v16i8: 661; AVX: # %bb.0: 662; AVX-NEXT: vptest %xmm0, %xmm0 663; AVX-NEXT: setne %al 664; AVX-NEXT: retq 665 %1 = call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %a0) 666 %2 = icmp ne i8 %1, 0 667 ret i1 %2 668} 669 670define i1 @test_v32i8(<32 x i8> %a0) { 671; SSE2-LABEL: test_v32i8: 672; SSE2: # %bb.0: 673; SSE2-NEXT: por %xmm1, %xmm0 674; SSE2-NEXT: pxor %xmm1, %xmm1 675; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 676; SSE2-NEXT: pmovmskb %xmm1, %eax 677; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 678; SSE2-NEXT: sete %al 679; SSE2-NEXT: retq 680; 681; SSE41-LABEL: test_v32i8: 682; SSE41: # %bb.0: 683; SSE41-NEXT: por %xmm1, %xmm0 684; SSE41-NEXT: ptest %xmm0, %xmm0 685; SSE41-NEXT: sete %al 686; SSE41-NEXT: retq 687; 688; AVX-LABEL: test_v32i8: 689; AVX: # %bb.0: 690; AVX-NEXT: vptest %ymm0, %ymm0 691; AVX-NEXT: sete %al 692; AVX-NEXT: vzeroupper 693; AVX-NEXT: retq 694 %1 = call i8 @llvm.vector.reduce.or.v32i8(<32 x i8> %a0) 695 %2 = icmp eq i8 %1, 0 696 ret i1 %2 697} 698 699define i1 @test_v64i8(<64 x i8> %a0) { 700; SSE2-LABEL: test_v64i8: 701; SSE2: # %bb.0: 702; SSE2-NEXT: por %xmm3, %xmm1 703; SSE2-NEXT: por %xmm2, %xmm0 704; SSE2-NEXT: por %xmm1, %xmm0 705; SSE2-NEXT: pxor %xmm1, %xmm1 706; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 707; SSE2-NEXT: pmovmskb %xmm1, %eax 708; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 709; SSE2-NEXT: setne %al 710; SSE2-NEXT: retq 711; 712; SSE41-LABEL: test_v64i8: 713; SSE41: # %bb.0: 714; SSE41-NEXT: por %xmm3, %xmm1 715; SSE41-NEXT: por %xmm2, %xmm0 716; SSE41-NEXT: por %xmm1, %xmm0 717; SSE41-NEXT: ptest %xmm0, %xmm0 718; SSE41-NEXT: setne %al 719; SSE41-NEXT: retq 720; 721; AVX1-LABEL: test_v64i8: 722; AVX1: # %bb.0: 723; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 724; AVX1-NEXT: vptest %ymm0, %ymm0 725; AVX1-NEXT: setne %al 726; AVX1-NEXT: vzeroupper 727; AVX1-NEXT: retq 728; 729; AVX2-LABEL: test_v64i8: 730; AVX2: # %bb.0: 731; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 732; AVX2-NEXT: vptest %ymm0, %ymm0 733; AVX2-NEXT: setne %al 734; AVX2-NEXT: vzeroupper 735; AVX2-NEXT: retq 736; 737; AVX512-LABEL: test_v64i8: 738; AVX512: # %bb.0: 739; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0 740; AVX512-NEXT: kortestw %k0, %k0 741; AVX512-NEXT: setne %al 742; AVX512-NEXT: vzeroupper 743; AVX512-NEXT: retq 744 %1 = call i8 @llvm.vector.reduce.or.v64i8(<64 x i8> %a0) 745 %2 = icmp ne i8 %1, 0 746 ret i1 %2 747} 748 749define i1 @test_v128i8(<128 x i8> %a0) { 750; SSE2-LABEL: test_v128i8: 751; SSE2: # %bb.0: 752; SSE2-NEXT: por %xmm7, %xmm3 753; SSE2-NEXT: por %xmm5, %xmm1 754; SSE2-NEXT: por %xmm3, %xmm1 755; SSE2-NEXT: por %xmm6, %xmm2 756; SSE2-NEXT: por %xmm4, %xmm0 757; SSE2-NEXT: por %xmm2, %xmm0 758; SSE2-NEXT: por %xmm1, %xmm0 759; SSE2-NEXT: pxor %xmm1, %xmm1 760; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 761; SSE2-NEXT: pmovmskb %xmm1, %eax 762; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 763; SSE2-NEXT: sete %al 764; SSE2-NEXT: retq 765; 766; SSE41-LABEL: test_v128i8: 767; SSE41: # %bb.0: 768; SSE41-NEXT: por %xmm7, %xmm3 769; SSE41-NEXT: por %xmm5, %xmm1 770; SSE41-NEXT: por %xmm3, %xmm1 771; SSE41-NEXT: por %xmm6, %xmm2 772; SSE41-NEXT: por %xmm4, %xmm0 773; SSE41-NEXT: por %xmm2, %xmm0 774; SSE41-NEXT: por %xmm1, %xmm0 775; SSE41-NEXT: ptest %xmm0, %xmm0 776; SSE41-NEXT: sete %al 777; SSE41-NEXT: retq 778; 779; AVX1-LABEL: test_v128i8: 780; AVX1: # %bb.0: 781; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1 782; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0 783; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 784; AVX1-NEXT: vptest %ymm0, %ymm0 785; AVX1-NEXT: sete %al 786; AVX1-NEXT: vzeroupper 787; AVX1-NEXT: retq 788; 789; AVX2-LABEL: test_v128i8: 790; AVX2: # %bb.0: 791; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1 792; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0 793; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 794; AVX2-NEXT: vptest %ymm0, %ymm0 795; AVX2-NEXT: sete %al 796; AVX2-NEXT: vzeroupper 797; AVX2-NEXT: retq 798; 799; AVX512-LABEL: test_v128i8: 800; AVX512: # %bb.0: 801; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0 802; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0 803; AVX512-NEXT: kortestw %k0, %k0 804; AVX512-NEXT: sete %al 805; AVX512-NEXT: vzeroupper 806; AVX512-NEXT: retq 807 %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0) 808 %2 = icmp eq i8 %1, 0 809 ret i1 %2 810} 811 812; 813; Compare Truncated/Masked OR Reductions 814; 815 816define i1 @trunc_v2i64(<2 x i64> %a0) { 817; SSE2-LABEL: trunc_v2i64: 818; SSE2: # %bb.0: 819; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 820; SSE2-NEXT: por %xmm0, %xmm1 821; SSE2-NEXT: movd %xmm1, %eax 822; SSE2-NEXT: testw %ax, %ax 823; SSE2-NEXT: sete %al 824; SSE2-NEXT: retq 825; 826; SSE41-LABEL: trunc_v2i64: 827; SSE41: # %bb.0: 828; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 829; SSE41-NEXT: sete %al 830; SSE41-NEXT: retq 831; 832; AVX1OR2-LABEL: trunc_v2i64: 833; AVX1OR2: # %bb.0: 834; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 835; AVX1OR2-NEXT: sete %al 836; AVX1OR2-NEXT: retq 837; 838; AVX512F-LABEL: trunc_v2i64: 839; AVX512F: # %bb.0: 840; AVX512F-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 841; AVX512F-NEXT: sete %al 842; AVX512F-NEXT: retq 843; 844; AVX512BW-LABEL: trunc_v2i64: 845; AVX512BW: # %bb.0: 846; AVX512BW-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 847; AVX512BW-NEXT: sete %al 848; AVX512BW-NEXT: retq 849; 850; AVX512BWVL-LABEL: trunc_v2i64: 851; AVX512BWVL: # %bb.0: 852; AVX512BWVL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [65535,65535] 853; AVX512BWVL-NEXT: vptest %xmm1, %xmm0 854; AVX512BWVL-NEXT: sete %al 855; AVX512BWVL-NEXT: retq 856 %1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0) 857 %2 = trunc i64 %1 to i16 858 %3 = icmp eq i16 %2, 0 859 ret i1 %3 860} 861 862define i1 @mask_v8i32(<8 x i32> %a0) { 863; SSE2-LABEL: mask_v8i32: 864; SSE2: # %bb.0: 865; SSE2-NEXT: orps %xmm1, %xmm0 866; SSE2-NEXT: movmskps %xmm0, %eax 867; SSE2-NEXT: testl %eax, %eax 868; SSE2-NEXT: sete %al 869; SSE2-NEXT: retq 870; 871; SSE41-LABEL: mask_v8i32: 872; SSE41: # %bb.0: 873; SSE41-NEXT: por %xmm1, %xmm0 874; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 875; SSE41-NEXT: sete %al 876; SSE41-NEXT: retq 877; 878; AVX1-LABEL: mask_v8i32: 879; AVX1: # %bb.0: 880; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0 881; AVX1-NEXT: sete %al 882; AVX1-NEXT: vzeroupper 883; AVX1-NEXT: retq 884; 885; AVX2-LABEL: mask_v8i32: 886; AVX2: # %bb.0: 887; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372039002259456,9223372039002259456,9223372039002259456,9223372039002259456] 888; AVX2-NEXT: vptest %ymm1, %ymm0 889; AVX2-NEXT: sete %al 890; AVX2-NEXT: vzeroupper 891; AVX2-NEXT: retq 892; 893; AVX512-LABEL: mask_v8i32: 894; AVX512: # %bb.0: 895; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372039002259456,9223372039002259456,9223372039002259456,9223372039002259456] 896; AVX512-NEXT: vptest %ymm1, %ymm0 897; AVX512-NEXT: sete %al 898; AVX512-NEXT: vzeroupper 899; AVX512-NEXT: retq 900 %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0) 901 %2 = and i32 %1, 2147483648 902 %3 = icmp eq i32 %2, 0 903 ret i1 %3 904} 905 906define i1 @trunc_v16i16(<16 x i16> %a0) { 907; SSE2-LABEL: trunc_v16i16: 908; SSE2: # %bb.0: 909; SSE2-NEXT: por %xmm1, %xmm0 910; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 911; SSE2-NEXT: pxor %xmm1, %xmm1 912; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 913; SSE2-NEXT: pmovmskb %xmm1, %eax 914; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 915; SSE2-NEXT: setne %al 916; SSE2-NEXT: retq 917; 918; SSE41-LABEL: trunc_v16i16: 919; SSE41: # %bb.0: 920; SSE41-NEXT: por %xmm1, %xmm0 921; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 922; SSE41-NEXT: setne %al 923; SSE41-NEXT: retq 924; 925; AVX-LABEL: trunc_v16i16: 926; AVX: # %bb.0: 927; AVX-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0 928; AVX-NEXT: setne %al 929; AVX-NEXT: vzeroupper 930; AVX-NEXT: retq 931 %1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0) 932 %2 = trunc i16 %1 to i8 933 %3 = icmp ne i8 %2, 0 934 ret i1 %3 935} 936 937define i1 @mask_v128i8(<128 x i8> %a0) { 938; SSE2-LABEL: mask_v128i8: 939; SSE2: # %bb.0: 940; SSE2-NEXT: por %xmm7, %xmm3 941; SSE2-NEXT: por %xmm5, %xmm1 942; SSE2-NEXT: por %xmm3, %xmm1 943; SSE2-NEXT: por %xmm6, %xmm2 944; SSE2-NEXT: por %xmm4, %xmm0 945; SSE2-NEXT: por %xmm2, %xmm0 946; SSE2-NEXT: por %xmm1, %xmm0 947; SSE2-NEXT: psllw $7, %xmm0 948; SSE2-NEXT: pmovmskb %xmm0, %eax 949; SSE2-NEXT: testl %eax, %eax 950; SSE2-NEXT: sete %al 951; SSE2-NEXT: retq 952; 953; SSE41-LABEL: mask_v128i8: 954; SSE41: # %bb.0: 955; SSE41-NEXT: por %xmm7, %xmm3 956; SSE41-NEXT: por %xmm5, %xmm1 957; SSE41-NEXT: por %xmm3, %xmm1 958; SSE41-NEXT: por %xmm6, %xmm2 959; SSE41-NEXT: por %xmm4, %xmm0 960; SSE41-NEXT: por %xmm2, %xmm0 961; SSE41-NEXT: por %xmm1, %xmm0 962; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 963; SSE41-NEXT: sete %al 964; SSE41-NEXT: retq 965; 966; AVX1-LABEL: mask_v128i8: 967; AVX1: # %bb.0: 968; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1 969; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0 970; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 971; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0 972; AVX1-NEXT: sete %al 973; AVX1-NEXT: vzeroupper 974; AVX1-NEXT: retq 975; 976; AVX2-LABEL: mask_v128i8: 977; AVX2: # %bb.0: 978; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1 979; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0 980; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 981; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673] 982; AVX2-NEXT: vptest %ymm1, %ymm0 983; AVX2-NEXT: sete %al 984; AVX2-NEXT: vzeroupper 985; AVX2-NEXT: retq 986; 987; AVX512-LABEL: mask_v128i8: 988; AVX512: # %bb.0: 989; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0 990; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k0 991; AVX512-NEXT: kortestw %k0, %k0 992; AVX512-NEXT: sete %al 993; AVX512-NEXT: vzeroupper 994; AVX512-NEXT: retq 995 %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0) 996 %2 = and i8 %1, 1 997 %3 = icmp eq i8 %2, 0 998 ret i1 %3 999} 1000 1001%struct.Box = type { i32, i32, i32, i32 } 1002define zeroext i1 @PR44781(ptr %0) { 1003; SSE2-LABEL: PR44781: 1004; SSE2: # %bb.0: 1005; SSE2-NEXT: movdqu (%rdi), %xmm0 1006; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1007; SSE2-NEXT: pxor %xmm1, %xmm1 1008; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 1009; SSE2-NEXT: movmskps %xmm1, %eax 1010; SSE2-NEXT: xorl $15, %eax 1011; SSE2-NEXT: sete %al 1012; SSE2-NEXT: retq 1013; 1014; SSE41-LABEL: PR44781: 1015; SSE41: # %bb.0: 1016; SSE41-NEXT: movdqu (%rdi), %xmm0 1017; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1018; SSE41-NEXT: sete %al 1019; SSE41-NEXT: retq 1020; 1021; AVX1-LABEL: PR44781: 1022; AVX1: # %bb.0: 1023; AVX1-NEXT: vbroadcastss {{.*#+}} xmm0 = [15,15,15,15] 1024; AVX1-NEXT: vptest (%rdi), %xmm0 1025; AVX1-NEXT: sete %al 1026; AVX1-NEXT: retq 1027; 1028; AVX2-LABEL: PR44781: 1029; AVX2: # %bb.0: 1030; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm0 = [15,15,15,15] 1031; AVX2-NEXT: vptest (%rdi), %xmm0 1032; AVX2-NEXT: sete %al 1033; AVX2-NEXT: retq 1034; 1035; AVX512F-LABEL: PR44781: 1036; AVX512F: # %bb.0: 1037; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm0 = [15,15,15,15] 1038; AVX512F-NEXT: vptest (%rdi), %xmm0 1039; AVX512F-NEXT: sete %al 1040; AVX512F-NEXT: retq 1041; 1042; AVX512BW-LABEL: PR44781: 1043; AVX512BW: # %bb.0: 1044; AVX512BW-NEXT: vpbroadcastd {{.*#+}} xmm0 = [15,15,15,15] 1045; AVX512BW-NEXT: vptest (%rdi), %xmm0 1046; AVX512BW-NEXT: sete %al 1047; AVX512BW-NEXT: retq 1048; 1049; AVX512BWVL-LABEL: PR44781: 1050; AVX512BWVL: # %bb.0: 1051; AVX512BWVL-NEXT: vpbroadcastq {{.*#+}} xmm0 = [64424509455,64424509455] 1052; AVX512BWVL-NEXT: vptest (%rdi), %xmm0 1053; AVX512BWVL-NEXT: sete %al 1054; AVX512BWVL-NEXT: retq 1055 %2 = load <4 x i32>, ptr %0, align 4 1056 %3 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %2) 1057 %4 = and i32 %3, 15 1058 %5 = icmp eq i32 %4, 0 1059 ret i1 %5 1060} 1061 1062define i32 @mask_v3i1(<3 x i32> %a, <3 x i32> %b) { 1063; SSE2-LABEL: mask_v3i1: 1064; SSE2: # %bb.0: 1065; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 1066; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 1067; SSE2-NEXT: pxor %xmm0, %xmm1 1068; SSE2-NEXT: movd %xmm1, %eax 1069; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1] 1070; SSE2-NEXT: movd %xmm0, %ecx 1071; SSE2-NEXT: orl %eax, %ecx 1072; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3] 1073; SSE2-NEXT: movd %xmm0, %eax 1074; SSE2-NEXT: orl %ecx, %eax 1075; SSE2-NEXT: testb $1, %al 1076; SSE2-NEXT: je .LBB27_2 1077; SSE2-NEXT: # %bb.1: 1078; SSE2-NEXT: xorl %eax, %eax 1079; SSE2-NEXT: retq 1080; SSE2-NEXT: .LBB27_2: 1081; SSE2-NEXT: movl $1, %eax 1082; SSE2-NEXT: retq 1083; 1084; SSE41-LABEL: mask_v3i1: 1085; SSE41: # %bb.0: 1086; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 1087; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 1088; SSE41-NEXT: pxor %xmm0, %xmm1 1089; SSE41-NEXT: pextrd $1, %xmm1, %eax 1090; SSE41-NEXT: movd %xmm1, %ecx 1091; SSE41-NEXT: orl %eax, %ecx 1092; SSE41-NEXT: pextrd $2, %xmm1, %eax 1093; SSE41-NEXT: orl %ecx, %eax 1094; SSE41-NEXT: testb $1, %al 1095; SSE41-NEXT: je .LBB27_2 1096; SSE41-NEXT: # %bb.1: 1097; SSE41-NEXT: xorl %eax, %eax 1098; SSE41-NEXT: retq 1099; SSE41-NEXT: .LBB27_2: 1100; SSE41-NEXT: movl $1, %eax 1101; SSE41-NEXT: retq 1102; 1103; AVX1OR2-LABEL: mask_v3i1: 1104; AVX1OR2: # %bb.0: 1105; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 1106; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 1107; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm0 1108; AVX1OR2-NEXT: vpextrd $1, %xmm0, %eax 1109; AVX1OR2-NEXT: vmovd %xmm0, %ecx 1110; AVX1OR2-NEXT: orl %eax, %ecx 1111; AVX1OR2-NEXT: vpextrd $2, %xmm0, %eax 1112; AVX1OR2-NEXT: orl %ecx, %eax 1113; AVX1OR2-NEXT: testb $1, %al 1114; AVX1OR2-NEXT: je .LBB27_2 1115; AVX1OR2-NEXT: # %bb.1: 1116; AVX1OR2-NEXT: xorl %eax, %eax 1117; AVX1OR2-NEXT: retq 1118; AVX1OR2-NEXT: .LBB27_2: 1119; AVX1OR2-NEXT: movl $1, %eax 1120; AVX1OR2-NEXT: retq 1121; 1122; AVX512F-LABEL: mask_v3i1: 1123; AVX512F: # %bb.0: 1124; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1125; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1126; AVX512F-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 1127; AVX512F-NEXT: kshiftrw $2, %k0, %k1 1128; AVX512F-NEXT: korw %k1, %k0, %k1 1129; AVX512F-NEXT: kshiftrw $1, %k0, %k0 1130; AVX512F-NEXT: korw %k0, %k1, %k0 1131; AVX512F-NEXT: kmovw %k0, %eax 1132; AVX512F-NEXT: testb $1, %al 1133; AVX512F-NEXT: je .LBB27_2 1134; AVX512F-NEXT: # %bb.1: 1135; AVX512F-NEXT: xorl %eax, %eax 1136; AVX512F-NEXT: vzeroupper 1137; AVX512F-NEXT: retq 1138; AVX512F-NEXT: .LBB27_2: 1139; AVX512F-NEXT: movl $1, %eax 1140; AVX512F-NEXT: vzeroupper 1141; AVX512F-NEXT: retq 1142; 1143; AVX512BW-LABEL: mask_v3i1: 1144; AVX512BW: # %bb.0: 1145; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1146; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1147; AVX512BW-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 1148; AVX512BW-NEXT: kshiftrw $2, %k0, %k1 1149; AVX512BW-NEXT: korw %k1, %k0, %k1 1150; AVX512BW-NEXT: kshiftrw $1, %k0, %k0 1151; AVX512BW-NEXT: korw %k0, %k1, %k0 1152; AVX512BW-NEXT: kmovd %k0, %eax 1153; AVX512BW-NEXT: testb $1, %al 1154; AVX512BW-NEXT: je .LBB27_2 1155; AVX512BW-NEXT: # %bb.1: 1156; AVX512BW-NEXT: xorl %eax, %eax 1157; AVX512BW-NEXT: vzeroupper 1158; AVX512BW-NEXT: retq 1159; AVX512BW-NEXT: .LBB27_2: 1160; AVX512BW-NEXT: movl $1, %eax 1161; AVX512BW-NEXT: vzeroupper 1162; AVX512BW-NEXT: retq 1163; 1164; AVX512BWVL-LABEL: mask_v3i1: 1165; AVX512BWVL: # %bb.0: 1166; AVX512BWVL-NEXT: vpcmpneqd %xmm1, %xmm0, %k0 1167; AVX512BWVL-NEXT: kshiftrw $2, %k0, %k1 1168; AVX512BWVL-NEXT: korw %k1, %k0, %k1 1169; AVX512BWVL-NEXT: kshiftrw $1, %k0, %k0 1170; AVX512BWVL-NEXT: korw %k0, %k1, %k0 1171; AVX512BWVL-NEXT: kmovd %k0, %eax 1172; AVX512BWVL-NEXT: testb $1, %al 1173; AVX512BWVL-NEXT: je .LBB27_2 1174; AVX512BWVL-NEXT: # %bb.1: 1175; AVX512BWVL-NEXT: xorl %eax, %eax 1176; AVX512BWVL-NEXT: retq 1177; AVX512BWVL-NEXT: .LBB27_2: 1178; AVX512BWVL-NEXT: movl $1, %eax 1179; AVX512BWVL-NEXT: retq 1180 %1 = icmp ne <3 x i32> %a, %b 1181 %2 = call i1 @llvm.vector.reduce.or.v3i1(<3 x i1> %1) 1182 br i1 %2, label %3, label %4 11833: 1184 ret i32 0 11854: 1186 ret i32 1 1187} 1188 1189declare i64 @llvm.vector.reduce.or.v2i64(<2 x i64>) 1190declare i64 @llvm.vector.reduce.or.v4i64(<4 x i64>) 1191declare i64 @llvm.vector.reduce.or.v8i64(<8 x i64>) 1192declare i64 @llvm.vector.reduce.or.v16i64(<16 x i64>) 1193 1194declare i32 @llvm.vector.reduce.or.v2i32(<2 x i32>) 1195declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>) 1196declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>) 1197declare i32 @llvm.vector.reduce.or.v16i32(<16 x i32>) 1198declare i32 @llvm.vector.reduce.or.v32i32(<32 x i32>) 1199 1200declare i16 @llvm.vector.reduce.or.v2i16(<2 x i16>) 1201declare i16 @llvm.vector.reduce.or.v4i16(<4 x i16>) 1202declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>) 1203declare i16 @llvm.vector.reduce.or.v16i16(<16 x i16>) 1204declare i16 @llvm.vector.reduce.or.v32i16(<32 x i16>) 1205declare i16 @llvm.vector.reduce.or.v64i16(<64 x i16>) 1206 1207declare i8 @llvm.vector.reduce.or.v2i8(<2 x i8>) 1208declare i8 @llvm.vector.reduce.or.v4i8(<4 x i8>) 1209declare i8 @llvm.vector.reduce.or.v8i8(<8 x i8>) 1210declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>) 1211declare i8 @llvm.vector.reduce.or.v32i8(<32 x i8>) 1212declare i8 @llvm.vector.reduce.or.v64i8(<64 x i8>) 1213declare i8 @llvm.vector.reduce.or.v128i8(<128 x i8>) 1214 1215declare i1 @llvm.vector.reduce.or.v3i1(<3 x i1>) 1216