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