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 {{.*}}(%rip), %xmm0 836; SSE41-NEXT: sete %al 837; SSE41-NEXT: retq 838; 839; AVX-LABEL: trunc_v2i64: 840; AVX: # %bb.0: 841; AVX-NEXT: vptest {{.*}}(%rip), %xmm0 842; AVX-NEXT: sete %al 843; AVX-NEXT: retq 844 %1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0) 845 %2 = trunc i64 %1 to i16 846 %3 = icmp eq i16 %2, 0 847 ret i1 %3 848} 849 850define i1 @mask_v8i32(<8 x i32> %a0) { 851; SSE2-LABEL: mask_v8i32: 852; SSE2: # %bb.0: 853; SSE2-NEXT: por %xmm1, %xmm0 854; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 855; SSE2-NEXT: pxor %xmm1, %xmm1 856; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 857; SSE2-NEXT: pmovmskb %xmm1, %eax 858; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 859; SSE2-NEXT: sete %al 860; SSE2-NEXT: retq 861; 862; SSE41-LABEL: mask_v8i32: 863; SSE41: # %bb.0: 864; SSE41-NEXT: por %xmm1, %xmm0 865; SSE41-NEXT: ptest {{.*}}(%rip), %xmm0 866; SSE41-NEXT: sete %al 867; SSE41-NEXT: retq 868; 869; AVX1-LABEL: mask_v8i32: 870; AVX1: # %bb.0: 871; AVX1-NEXT: vptest {{.*}}(%rip), %ymm0 872; AVX1-NEXT: sete %al 873; AVX1-NEXT: vzeroupper 874; AVX1-NEXT: retq 875; 876; AVX2-LABEL: mask_v8i32: 877; AVX2: # %bb.0: 878; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372039002259456,9223372039002259456,9223372039002259456,9223372039002259456] 879; AVX2-NEXT: vptest %ymm1, %ymm0 880; AVX2-NEXT: sete %al 881; AVX2-NEXT: vzeroupper 882; AVX2-NEXT: retq 883; 884; AVX512-LABEL: mask_v8i32: 885; AVX512: # %bb.0: 886; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372039002259456,9223372039002259456,9223372039002259456,9223372039002259456] 887; AVX512-NEXT: vptest %ymm1, %ymm0 888; AVX512-NEXT: sete %al 889; AVX512-NEXT: vzeroupper 890; AVX512-NEXT: retq 891 %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0) 892 %2 = and i32 %1, 2147483648 893 %3 = icmp eq i32 %2, 0 894 ret i1 %3 895} 896 897define i1 @trunc_v16i16(<16 x i16> %a0) { 898; SSE2-LABEL: trunc_v16i16: 899; SSE2: # %bb.0: 900; SSE2-NEXT: por %xmm1, %xmm0 901; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 902; SSE2-NEXT: pxor %xmm1, %xmm1 903; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 904; SSE2-NEXT: pmovmskb %xmm1, %eax 905; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 906; SSE2-NEXT: setne %al 907; SSE2-NEXT: retq 908; 909; SSE41-LABEL: trunc_v16i16: 910; SSE41: # %bb.0: 911; SSE41-NEXT: por %xmm1, %xmm0 912; SSE41-NEXT: ptest {{.*}}(%rip), %xmm0 913; SSE41-NEXT: setne %al 914; SSE41-NEXT: retq 915; 916; AVX1-LABEL: trunc_v16i16: 917; AVX1: # %bb.0: 918; AVX1-NEXT: vptest {{.*}}(%rip), %ymm0 919; AVX1-NEXT: setne %al 920; AVX1-NEXT: vzeroupper 921; AVX1-NEXT: retq 922; 923; AVX2-LABEL: trunc_v16i16: 924; AVX2: # %bb.0: 925; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [71777214294589695,71777214294589695,71777214294589695,71777214294589695] 926; AVX2-NEXT: vptest %ymm1, %ymm0 927; AVX2-NEXT: setne %al 928; AVX2-NEXT: vzeroupper 929; AVX2-NEXT: retq 930; 931; AVX512-LABEL: trunc_v16i16: 932; AVX512: # %bb.0: 933; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [71777214294589695,71777214294589695,71777214294589695,71777214294589695] 934; AVX512-NEXT: vptest %ymm1, %ymm0 935; AVX512-NEXT: setne %al 936; AVX512-NEXT: vzeroupper 937; AVX512-NEXT: retq 938 %1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0) 939 %2 = trunc i16 %1 to i8 940 %3 = icmp ne i8 %2, 0 941 ret i1 %3 942} 943 944define i1 @mask_v128i8(<128 x i8> %a0) { 945; SSE2-LABEL: mask_v128i8: 946; SSE2: # %bb.0: 947; SSE2-NEXT: por %xmm7, %xmm3 948; SSE2-NEXT: por %xmm5, %xmm3 949; SSE2-NEXT: por %xmm1, %xmm3 950; SSE2-NEXT: por %xmm6, %xmm2 951; SSE2-NEXT: por %xmm4, %xmm2 952; SSE2-NEXT: por %xmm3, %xmm2 953; SSE2-NEXT: por %xmm0, %xmm2 954; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 955; SSE2-NEXT: pxor %xmm0, %xmm0 956; SSE2-NEXT: pcmpeqb %xmm2, %xmm0 957; SSE2-NEXT: pmovmskb %xmm0, %eax 958; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 959; SSE2-NEXT: sete %al 960; SSE2-NEXT: retq 961; 962; SSE41-LABEL: mask_v128i8: 963; SSE41: # %bb.0: 964; SSE41-NEXT: por %xmm7, %xmm3 965; SSE41-NEXT: por %xmm5, %xmm3 966; SSE41-NEXT: por %xmm1, %xmm3 967; SSE41-NEXT: por %xmm6, %xmm2 968; SSE41-NEXT: por %xmm4, %xmm2 969; SSE41-NEXT: por %xmm3, %xmm2 970; SSE41-NEXT: por %xmm0, %xmm2 971; SSE41-NEXT: ptest {{.*}}(%rip), %xmm2 972; SSE41-NEXT: sete %al 973; SSE41-NEXT: retq 974; 975; AVX1-LABEL: mask_v128i8: 976; AVX1: # %bb.0: 977; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1 978; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm1 979; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 980; AVX1-NEXT: vptest {{.*}}(%rip), %ymm0 981; AVX1-NEXT: sete %al 982; AVX1-NEXT: vzeroupper 983; AVX1-NEXT: retq 984; 985; AVX2-LABEL: mask_v128i8: 986; AVX2: # %bb.0: 987; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1 988; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1 989; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 990; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673] 991; AVX2-NEXT: vptest %ymm1, %ymm0 992; AVX2-NEXT: sete %al 993; AVX2-NEXT: vzeroupper 994; AVX2-NEXT: retq 995; 996; AVX512-LABEL: mask_v128i8: 997; AVX512: # %bb.0: 998; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0 999; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1000; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 1001; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673] 1002; AVX512-NEXT: vptest %ymm1, %ymm0 1003; AVX512-NEXT: sete %al 1004; AVX512-NEXT: vzeroupper 1005; AVX512-NEXT: retq 1006 %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0) 1007 %2 = and i8 %1, 1 1008 %3 = icmp eq i8 %2, 0 1009 ret i1 %3 1010} 1011 1012%struct.Box = type { i32, i32, i32, i32 } 1013define zeroext i1 @PR44781(%struct.Box* %0) { 1014; SSE2-LABEL: PR44781: 1015; SSE2: # %bb.0: 1016; SSE2-NEXT: movdqu (%rdi), %xmm0 1017; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1018; SSE2-NEXT: pxor %xmm1, %xmm1 1019; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 1020; SSE2-NEXT: pmovmskb %xmm1, %eax 1021; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1022; SSE2-NEXT: sete %al 1023; SSE2-NEXT: retq 1024; 1025; SSE41-LABEL: PR44781: 1026; SSE41: # %bb.0: 1027; SSE41-NEXT: movdqu (%rdi), %xmm0 1028; SSE41-NEXT: ptest {{.*}}(%rip), %xmm0 1029; SSE41-NEXT: sete %al 1030; SSE41-NEXT: retq 1031; 1032; AVX-LABEL: PR44781: 1033; AVX: # %bb.0: 1034; AVX-NEXT: vmovdqu (%rdi), %xmm0 1035; AVX-NEXT: vptest {{.*}}(%rip), %xmm0 1036; AVX-NEXT: sete %al 1037; AVX-NEXT: retq 1038 %2 = bitcast %struct.Box* %0 to <4 x i32>* 1039 %3 = load <4 x i32>, <4 x i32>* %2, align 4 1040 %4 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %3) 1041 %5 = and i32 %4, 15 1042 %6 = icmp eq i32 %5, 0 1043 ret i1 %6 1044} 1045 1046define i32 @mask_v3i1(<3 x i32> %a, <3 x i32> %b) { 1047; SSE2-LABEL: mask_v3i1: 1048; SSE2: # %bb.0: 1049; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 1050; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 1051; SSE2-NEXT: pxor %xmm0, %xmm1 1052; SSE2-NEXT: movd %xmm1, %eax 1053; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1] 1054; SSE2-NEXT: movd %xmm0, %ecx 1055; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3] 1056; SSE2-NEXT: movd %xmm0, %edx 1057; SSE2-NEXT: orl %ecx, %edx 1058; SSE2-NEXT: orl %eax, %edx 1059; SSE2-NEXT: testb $1, %dl 1060; SSE2-NEXT: je .LBB27_2 1061; SSE2-NEXT: # %bb.1: 1062; SSE2-NEXT: xorl %eax, %eax 1063; SSE2-NEXT: retq 1064; SSE2-NEXT: .LBB27_2: 1065; SSE2-NEXT: movl $1, %eax 1066; SSE2-NEXT: retq 1067; 1068; SSE41-LABEL: mask_v3i1: 1069; SSE41: # %bb.0: 1070; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 1071; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 1072; SSE41-NEXT: pxor %xmm0, %xmm1 1073; SSE41-NEXT: pextrd $1, %xmm1, %eax 1074; SSE41-NEXT: movd %xmm1, %ecx 1075; SSE41-NEXT: pextrd $2, %xmm1, %edx 1076; SSE41-NEXT: orl %eax, %edx 1077; SSE41-NEXT: orl %ecx, %edx 1078; SSE41-NEXT: testb $1, %dl 1079; SSE41-NEXT: je .LBB27_2 1080; SSE41-NEXT: # %bb.1: 1081; SSE41-NEXT: xorl %eax, %eax 1082; SSE41-NEXT: retq 1083; SSE41-NEXT: .LBB27_2: 1084; SSE41-NEXT: movl $1, %eax 1085; SSE41-NEXT: retq 1086; 1087; AVX1-LABEL: mask_v3i1: 1088; AVX1: # %bb.0: 1089; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 1090; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 1091; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 1092; AVX1-NEXT: vpextrd $1, %xmm0, %eax 1093; AVX1-NEXT: vmovd %xmm0, %ecx 1094; AVX1-NEXT: vpextrd $2, %xmm0, %edx 1095; AVX1-NEXT: orl %eax, %edx 1096; AVX1-NEXT: orl %ecx, %edx 1097; AVX1-NEXT: testb $1, %dl 1098; AVX1-NEXT: je .LBB27_2 1099; AVX1-NEXT: # %bb.1: 1100; AVX1-NEXT: xorl %eax, %eax 1101; AVX1-NEXT: retq 1102; AVX1-NEXT: .LBB27_2: 1103; AVX1-NEXT: movl $1, %eax 1104; AVX1-NEXT: retq 1105; 1106; AVX2-LABEL: mask_v3i1: 1107; AVX2: # %bb.0: 1108; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 1109; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 1110; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 1111; AVX2-NEXT: vpextrd $1, %xmm0, %eax 1112; AVX2-NEXT: vmovd %xmm0, %ecx 1113; AVX2-NEXT: vpextrd $2, %xmm0, %edx 1114; AVX2-NEXT: orl %eax, %edx 1115; AVX2-NEXT: orl %ecx, %edx 1116; AVX2-NEXT: testb $1, %dl 1117; AVX2-NEXT: je .LBB27_2 1118; AVX2-NEXT: # %bb.1: 1119; AVX2-NEXT: xorl %eax, %eax 1120; AVX2-NEXT: retq 1121; AVX2-NEXT: .LBB27_2: 1122; AVX2-NEXT: movl $1, %eax 1123; AVX2-NEXT: retq 1124; 1125; AVX512BW-LABEL: mask_v3i1: 1126; AVX512BW: # %bb.0: 1127; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1128; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1129; AVX512BW-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 1130; AVX512BW-NEXT: kshiftrw $2, %k0, %k1 1131; AVX512BW-NEXT: korw %k1, %k0, %k1 1132; AVX512BW-NEXT: kshiftrw $1, %k0, %k0 1133; AVX512BW-NEXT: korw %k0, %k1, %k0 1134; AVX512BW-NEXT: kmovd %k0, %eax 1135; AVX512BW-NEXT: testb $1, %al 1136; AVX512BW-NEXT: je .LBB27_2 1137; AVX512BW-NEXT: # %bb.1: 1138; AVX512BW-NEXT: xorl %eax, %eax 1139; AVX512BW-NEXT: vzeroupper 1140; AVX512BW-NEXT: retq 1141; AVX512BW-NEXT: .LBB27_2: 1142; AVX512BW-NEXT: movl $1, %eax 1143; AVX512BW-NEXT: vzeroupper 1144; AVX512BW-NEXT: retq 1145; 1146; AVX512BWVL-LABEL: mask_v3i1: 1147; AVX512BWVL: # %bb.0: 1148; AVX512BWVL-NEXT: vpcmpneqd %xmm1, %xmm0, %k0 1149; AVX512BWVL-NEXT: kshiftrw $2, %k0, %k1 1150; AVX512BWVL-NEXT: korw %k1, %k0, %k1 1151; AVX512BWVL-NEXT: kshiftrw $1, %k0, %k0 1152; AVX512BWVL-NEXT: korw %k0, %k1, %k0 1153; AVX512BWVL-NEXT: kmovd %k0, %eax 1154; AVX512BWVL-NEXT: testb $1, %al 1155; AVX512BWVL-NEXT: je .LBB27_2 1156; AVX512BWVL-NEXT: # %bb.1: 1157; AVX512BWVL-NEXT: xorl %eax, %eax 1158; AVX512BWVL-NEXT: retq 1159; AVX512BWVL-NEXT: .LBB27_2: 1160; AVX512BWVL-NEXT: movl $1, %eax 1161; AVX512BWVL-NEXT: retq 1162 %1 = icmp ne <3 x i32> %a, %b 1163 %2 = call i1 @llvm.vector.reduce.or.v3i1(<3 x i1> %1) 1164 br i1 %2, label %3, label %4 11653: 1166 ret i32 0 11674: 1168 ret i32 1 1169} 1170 1171declare i64 @llvm.vector.reduce.or.v2i64(<2 x i64>) 1172declare i64 @llvm.vector.reduce.or.v4i64(<4 x i64>) 1173declare i64 @llvm.vector.reduce.or.v8i64(<8 x i64>) 1174declare i64 @llvm.vector.reduce.or.v16i64(<16 x i64>) 1175 1176declare i32 @llvm.vector.reduce.or.v2i32(<2 x i32>) 1177declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>) 1178declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>) 1179declare i32 @llvm.vector.reduce.or.v16i32(<16 x i32>) 1180declare i32 @llvm.vector.reduce.or.v32i32(<32 x i32>) 1181 1182declare i16 @llvm.vector.reduce.or.v2i16(<2 x i16>) 1183declare i16 @llvm.vector.reduce.or.v4i16(<4 x i16>) 1184declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>) 1185declare i16 @llvm.vector.reduce.or.v16i16(<16 x i16>) 1186declare i16 @llvm.vector.reduce.or.v32i16(<32 x i16>) 1187declare i16 @llvm.vector.reduce.or.v64i16(<64 x i16>) 1188 1189declare i8 @llvm.vector.reduce.or.v2i8(<2 x i8>) 1190declare i8 @llvm.vector.reduce.or.v4i8(<4 x i8>) 1191declare i8 @llvm.vector.reduce.or.v8i8(<8 x i8>) 1192declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>) 1193declare i8 @llvm.vector.reduce.or.v32i8(<32 x i8>) 1194declare i8 @llvm.vector.reduce.or.v64i8(<64 x i8>) 1195declare i8 @llvm.vector.reduce.or.v128i8(<128 x i8>) 1196 1197declare i1 @llvm.vector.reduce.or.v3i1(<3 x i1>) 1198