brintos

brintos / llvm-project-archived public Read only

0
0
Text · 35.9 KiB · 044327d Raw
1302 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BWVL9 10;11; vXi6412;13 14define i1 @test_v2i64(<2 x i64> %a0) {15; SSE2-LABEL: test_v2i64:16; SSE2:       # %bb.0:17; SSE2-NEXT:    pxor %xmm1, %xmm118; SSE2-NEXT:    pcmpeqd %xmm0, %xmm119; SSE2-NEXT:    movmskps %xmm1, %eax20; SSE2-NEXT:    xorl $15, %eax21; SSE2-NEXT:    sete %al22; SSE2-NEXT:    retq23;24; SSE41-LABEL: test_v2i64:25; SSE41:       # %bb.0:26; SSE41-NEXT:    ptest %xmm0, %xmm027; SSE41-NEXT:    sete %al28; SSE41-NEXT:    retq29;30; AVX-LABEL: test_v2i64:31; AVX:       # %bb.0:32; AVX-NEXT:    vptest %xmm0, %xmm033; AVX-NEXT:    sete %al34; AVX-NEXT:    retq35  %1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0)36  %2 = icmp eq i64 %1, 037  ret i1 %238}39 40define i1 @test_v4i64(<4 x i64> %a0) {41; SSE2-LABEL: test_v4i64:42; SSE2:       # %bb.0:43; SSE2-NEXT:    por %xmm1, %xmm044; SSE2-NEXT:    pxor %xmm1, %xmm145; SSE2-NEXT:    pcmpeqd %xmm0, %xmm146; SSE2-NEXT:    movmskps %xmm1, %eax47; SSE2-NEXT:    xorl $15, %eax48; SSE2-NEXT:    setne %al49; SSE2-NEXT:    retq50;51; SSE41-LABEL: test_v4i64:52; SSE41:       # %bb.0:53; SSE41-NEXT:    por %xmm1, %xmm054; SSE41-NEXT:    ptest %xmm0, %xmm055; SSE41-NEXT:    setne %al56; SSE41-NEXT:    retq57;58; AVX-LABEL: test_v4i64:59; AVX:       # %bb.0:60; AVX-NEXT:    vptest %ymm0, %ymm061; AVX-NEXT:    setne %al62; AVX-NEXT:    vzeroupper63; AVX-NEXT:    retq64  %1 = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %a0)65  %2 = icmp ne i64 %1, 066  ret i1 %267}68 69define i1 @test_v8i64(<8 x i64> %a0) {70; SSE2-LABEL: test_v8i64:71; SSE2:       # %bb.0:72; SSE2-NEXT:    por %xmm3, %xmm173; SSE2-NEXT:    por %xmm2, %xmm074; SSE2-NEXT:    por %xmm1, %xmm075; SSE2-NEXT:    pxor %xmm1, %xmm176; SSE2-NEXT:    pcmpeqd %xmm0, %xmm177; SSE2-NEXT:    movmskps %xmm1, %eax78; SSE2-NEXT:    xorl $15, %eax79; SSE2-NEXT:    sete %al80; SSE2-NEXT:    retq81;82; SSE41-LABEL: test_v8i64:83; SSE41:       # %bb.0:84; SSE41-NEXT:    por %xmm3, %xmm185; SSE41-NEXT:    por %xmm2, %xmm086; SSE41-NEXT:    por %xmm1, %xmm087; SSE41-NEXT:    ptest %xmm0, %xmm088; SSE41-NEXT:    sete %al89; SSE41-NEXT:    retq90;91; AVX1-LABEL: test_v8i64:92; AVX1:       # %bb.0:93; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm094; AVX1-NEXT:    vptest %ymm0, %ymm095; AVX1-NEXT:    sete %al96; AVX1-NEXT:    vzeroupper97; AVX1-NEXT:    retq98;99; AVX2-LABEL: test_v8i64:100; AVX2:       # %bb.0:101; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0102; AVX2-NEXT:    vptest %ymm0, %ymm0103; AVX2-NEXT:    sete %al104; AVX2-NEXT:    vzeroupper105; AVX2-NEXT:    retq106;107; AVX512-LABEL: test_v8i64:108; AVX512:       # %bb.0:109; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0110; AVX512-NEXT:    kortestw %k0, %k0111; AVX512-NEXT:    sete %al112; AVX512-NEXT:    vzeroupper113; AVX512-NEXT:    retq114  %1 = call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %a0)115  %2 = icmp eq i64 %1, 0116  ret i1 %2117}118 119define i1 @test_v16i64(<16 x i64> %a0) {120; SSE2-LABEL: test_v16i64:121; SSE2:       # %bb.0:122; SSE2-NEXT:    por %xmm7, %xmm3123; SSE2-NEXT:    por %xmm5, %xmm1124; SSE2-NEXT:    por %xmm3, %xmm1125; SSE2-NEXT:    por %xmm6, %xmm2126; SSE2-NEXT:    por %xmm4, %xmm0127; SSE2-NEXT:    por %xmm2, %xmm0128; SSE2-NEXT:    por %xmm1, %xmm0129; SSE2-NEXT:    pxor %xmm1, %xmm1130; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1131; SSE2-NEXT:    movmskps %xmm1, %eax132; SSE2-NEXT:    xorl $15, %eax133; SSE2-NEXT:    setne %al134; SSE2-NEXT:    retq135;136; SSE41-LABEL: test_v16i64:137; SSE41:       # %bb.0:138; SSE41-NEXT:    por %xmm7, %xmm3139; SSE41-NEXT:    por %xmm5, %xmm1140; SSE41-NEXT:    por %xmm3, %xmm1141; SSE41-NEXT:    por %xmm6, %xmm2142; SSE41-NEXT:    por %xmm4, %xmm0143; SSE41-NEXT:    por %xmm2, %xmm0144; SSE41-NEXT:    por %xmm1, %xmm0145; SSE41-NEXT:    ptest %xmm0, %xmm0146; SSE41-NEXT:    setne %al147; SSE41-NEXT:    retq148;149; AVX1-LABEL: test_v16i64:150; AVX1:       # %bb.0:151; AVX1-NEXT:    vorps %ymm3, %ymm1, %ymm1152; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0153; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0154; AVX1-NEXT:    vptest %ymm0, %ymm0155; AVX1-NEXT:    setne %al156; AVX1-NEXT:    vzeroupper157; AVX1-NEXT:    retq158;159; AVX2-LABEL: test_v16i64:160; AVX2:       # %bb.0:161; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm1162; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0163; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0164; AVX2-NEXT:    vptest %ymm0, %ymm0165; AVX2-NEXT:    setne %al166; AVX2-NEXT:    vzeroupper167; AVX2-NEXT:    retq168;169; AVX512-LABEL: test_v16i64:170; AVX512:       # %bb.0:171; AVX512-NEXT:    vporq %zmm1, %zmm0, %zmm0172; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0173; AVX512-NEXT:    kortestw %k0, %k0174; AVX512-NEXT:    setne %al175; AVX512-NEXT:    vzeroupper176; AVX512-NEXT:    retq177  %1 = call i64 @llvm.vector.reduce.or.v16i64(<16 x i64> %a0)178  %2 = icmp ne i64 %1, 0179  ret i1 %2180}181 182;183; vXi32184;185 186define i1 @test_v2i32(<2 x i32> %a0) {187; SSE-LABEL: test_v2i32:188; SSE:       # %bb.0:189; SSE-NEXT:    movq %xmm0, %rax190; SSE-NEXT:    testq %rax, %rax191; SSE-NEXT:    sete %al192; SSE-NEXT:    retq193;194; AVX-LABEL: test_v2i32:195; AVX:       # %bb.0:196; AVX-NEXT:    vmovq %xmm0, %rax197; AVX-NEXT:    testq %rax, %rax198; AVX-NEXT:    sete %al199; AVX-NEXT:    retq200  %1 = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %a0)201  %2 = icmp eq i32 %1, 0202  ret i1 %2203}204 205define i1 @test_v4i32(<4 x i32> %a0) {206; SSE2-LABEL: test_v4i32:207; SSE2:       # %bb.0:208; SSE2-NEXT:    pxor %xmm1, %xmm1209; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1210; SSE2-NEXT:    movmskps %xmm1, %eax211; SSE2-NEXT:    xorl $15, %eax212; SSE2-NEXT:    setne %al213; SSE2-NEXT:    retq214;215; SSE41-LABEL: test_v4i32:216; SSE41:       # %bb.0:217; SSE41-NEXT:    ptest %xmm0, %xmm0218; SSE41-NEXT:    setne %al219; SSE41-NEXT:    retq220;221; AVX-LABEL: test_v4i32:222; AVX:       # %bb.0:223; AVX-NEXT:    vptest %xmm0, %xmm0224; AVX-NEXT:    setne %al225; AVX-NEXT:    retq226  %1 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %a0)227  %2 = icmp ne i32 %1, 0228  ret i1 %2229}230 231define i1 @test_v8i32(<8 x i32> %a0) {232; SSE2-LABEL: test_v8i32:233; SSE2:       # %bb.0:234; SSE2-NEXT:    por %xmm1, %xmm0235; SSE2-NEXT:    pxor %xmm1, %xmm1236; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1237; SSE2-NEXT:    movmskps %xmm1, %eax238; SSE2-NEXT:    xorl $15, %eax239; SSE2-NEXT:    sete %al240; SSE2-NEXT:    retq241;242; SSE41-LABEL: test_v8i32:243; SSE41:       # %bb.0:244; SSE41-NEXT:    por %xmm1, %xmm0245; SSE41-NEXT:    ptest %xmm0, %xmm0246; SSE41-NEXT:    sete %al247; SSE41-NEXT:    retq248;249; AVX-LABEL: test_v8i32:250; AVX:       # %bb.0:251; AVX-NEXT:    vptest %ymm0, %ymm0252; AVX-NEXT:    sete %al253; AVX-NEXT:    vzeroupper254; AVX-NEXT:    retq255  %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)256  %2 = icmp eq i32 %1, 0257  ret i1 %2258}259 260define i1 @test_v16i32(<16 x i32> %a0) {261; SSE2-LABEL: test_v16i32:262; SSE2:       # %bb.0:263; SSE2-NEXT:    por %xmm3, %xmm1264; SSE2-NEXT:    por %xmm2, %xmm0265; SSE2-NEXT:    por %xmm1, %xmm0266; SSE2-NEXT:    pxor %xmm1, %xmm1267; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1268; SSE2-NEXT:    movmskps %xmm1, %eax269; SSE2-NEXT:    xorl $15, %eax270; SSE2-NEXT:    setne %al271; SSE2-NEXT:    retq272;273; SSE41-LABEL: test_v16i32:274; SSE41:       # %bb.0:275; SSE41-NEXT:    por %xmm3, %xmm1276; SSE41-NEXT:    por %xmm2, %xmm0277; SSE41-NEXT:    por %xmm1, %xmm0278; SSE41-NEXT:    ptest %xmm0, %xmm0279; SSE41-NEXT:    setne %al280; SSE41-NEXT:    retq281;282; AVX1-LABEL: test_v16i32:283; AVX1:       # %bb.0:284; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0285; AVX1-NEXT:    vptest %ymm0, %ymm0286; AVX1-NEXT:    setne %al287; AVX1-NEXT:    vzeroupper288; AVX1-NEXT:    retq289;290; AVX2-LABEL: test_v16i32:291; AVX2:       # %bb.0:292; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0293; AVX2-NEXT:    vptest %ymm0, %ymm0294; AVX2-NEXT:    setne %al295; AVX2-NEXT:    vzeroupper296; AVX2-NEXT:    retq297;298; AVX512-LABEL: test_v16i32:299; AVX512:       # %bb.0:300; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0301; AVX512-NEXT:    kortestw %k0, %k0302; AVX512-NEXT:    setne %al303; AVX512-NEXT:    vzeroupper304; AVX512-NEXT:    retq305  %1 = call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %a0)306  %2 = icmp ne i32 %1, 0307  ret i1 %2308}309 310define i1 @test_v32i32(<32 x i32> %a0) {311; SSE2-LABEL: test_v32i32:312; SSE2:       # %bb.0:313; SSE2-NEXT:    por %xmm7, %xmm3314; SSE2-NEXT:    por %xmm5, %xmm1315; SSE2-NEXT:    por %xmm3, %xmm1316; SSE2-NEXT:    por %xmm6, %xmm2317; SSE2-NEXT:    por %xmm4, %xmm0318; SSE2-NEXT:    por %xmm2, %xmm0319; SSE2-NEXT:    por %xmm1, %xmm0320; SSE2-NEXT:    pxor %xmm1, %xmm1321; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1322; SSE2-NEXT:    movmskps %xmm1, %eax323; SSE2-NEXT:    xorl $15, %eax324; SSE2-NEXT:    sete %al325; SSE2-NEXT:    retq326;327; SSE41-LABEL: test_v32i32:328; SSE41:       # %bb.0:329; SSE41-NEXT:    por %xmm7, %xmm3330; SSE41-NEXT:    por %xmm5, %xmm1331; SSE41-NEXT:    por %xmm3, %xmm1332; SSE41-NEXT:    por %xmm6, %xmm2333; SSE41-NEXT:    por %xmm4, %xmm0334; SSE41-NEXT:    por %xmm2, %xmm0335; SSE41-NEXT:    por %xmm1, %xmm0336; SSE41-NEXT:    ptest %xmm0, %xmm0337; SSE41-NEXT:    sete %al338; SSE41-NEXT:    retq339;340; AVX1-LABEL: test_v32i32:341; AVX1:       # %bb.0:342; AVX1-NEXT:    vorps %ymm3, %ymm1, %ymm1343; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0344; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0345; AVX1-NEXT:    vptest %ymm0, %ymm0346; AVX1-NEXT:    sete %al347; AVX1-NEXT:    vzeroupper348; AVX1-NEXT:    retq349;350; AVX2-LABEL: test_v32i32:351; AVX2:       # %bb.0:352; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm1353; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0354; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0355; AVX2-NEXT:    vptest %ymm0, %ymm0356; AVX2-NEXT:    sete %al357; AVX2-NEXT:    vzeroupper358; AVX2-NEXT:    retq359;360; AVX512-LABEL: test_v32i32:361; AVX512:       # %bb.0:362; AVX512-NEXT:    vpord %zmm1, %zmm0, %zmm0363; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0364; AVX512-NEXT:    kortestw %k0, %k0365; AVX512-NEXT:    sete %al366; AVX512-NEXT:    vzeroupper367; AVX512-NEXT:    retq368  %1 = call i32 @llvm.vector.reduce.or.v32i32(<32 x i32> %a0)369  %2 = icmp eq i32 %1, 0370  ret i1 %2371}372 373;374; vXi16375;376 377define i1 @test_v2i16(<2 x i16> %a0) {378; SSE-LABEL: test_v2i16:379; SSE:       # %bb.0:380; SSE-NEXT:    movd %xmm0, %eax381; SSE-NEXT:    testl %eax, %eax382; SSE-NEXT:    sete %al383; SSE-NEXT:    retq384;385; AVX-LABEL: test_v2i16:386; AVX:       # %bb.0:387; AVX-NEXT:    vmovd %xmm0, %eax388; AVX-NEXT:    testl %eax, %eax389; AVX-NEXT:    sete %al390; AVX-NEXT:    retq391  %1 = call i16 @llvm.vector.reduce.or.v2i16(<2 x i16> %a0)392  %2 = icmp eq i16 %1, 0393  ret i1 %2394}395 396define i1 @test_v4i16(<4 x i16> %a0) {397; SSE-LABEL: test_v4i16:398; SSE:       # %bb.0:399; SSE-NEXT:    movq %xmm0, %rax400; SSE-NEXT:    testq %rax, %rax401; SSE-NEXT:    setne %al402; SSE-NEXT:    retq403;404; AVX-LABEL: test_v4i16:405; AVX:       # %bb.0:406; AVX-NEXT:    vmovq %xmm0, %rax407; AVX-NEXT:    testq %rax, %rax408; AVX-NEXT:    setne %al409; AVX-NEXT:    retq410  %1 = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %a0)411  %2 = icmp ne i16 %1, 0412  ret i1 %2413}414 415define i1 @test_v8i16(<8 x i16> %a0) {416; SSE2-LABEL: test_v8i16:417; SSE2:       # %bb.0:418; SSE2-NEXT:    pxor %xmm1, %xmm1419; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1420; SSE2-NEXT:    pmovmskb %xmm1, %eax421; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF422; SSE2-NEXT:    sete %al423; SSE2-NEXT:    retq424;425; SSE41-LABEL: test_v8i16:426; SSE41:       # %bb.0:427; SSE41-NEXT:    ptest %xmm0, %xmm0428; SSE41-NEXT:    sete %al429; SSE41-NEXT:    retq430;431; AVX-LABEL: test_v8i16:432; AVX:       # %bb.0:433; AVX-NEXT:    vptest %xmm0, %xmm0434; AVX-NEXT:    sete %al435; AVX-NEXT:    retq436  %1 = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %a0)437  %2 = icmp eq i16 %1, 0438  ret i1 %2439}440 441define i1 @test_v16i16(<16 x i16> %a0) {442; SSE2-LABEL: test_v16i16:443; SSE2:       # %bb.0:444; SSE2-NEXT:    por %xmm1, %xmm0445; SSE2-NEXT:    pxor %xmm1, %xmm1446; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1447; SSE2-NEXT:    pmovmskb %xmm1, %eax448; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF449; SSE2-NEXT:    setne %al450; SSE2-NEXT:    retq451;452; SSE41-LABEL: test_v16i16:453; SSE41:       # %bb.0:454; SSE41-NEXT:    por %xmm1, %xmm0455; SSE41-NEXT:    ptest %xmm0, %xmm0456; SSE41-NEXT:    setne %al457; SSE41-NEXT:    retq458;459; AVX-LABEL: test_v16i16:460; AVX:       # %bb.0:461; AVX-NEXT:    vptest %ymm0, %ymm0462; AVX-NEXT:    setne %al463; AVX-NEXT:    vzeroupper464; AVX-NEXT:    retq465  %1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0)466  %2 = icmp ne i16 %1, 0467  ret i1 %2468}469 470define i1 @test_v32i16(<32 x i16> %a0) {471; SSE2-LABEL: test_v32i16:472; SSE2:       # %bb.0:473; SSE2-NEXT:    por %xmm3, %xmm1474; SSE2-NEXT:    por %xmm2, %xmm0475; SSE2-NEXT:    por %xmm1, %xmm0476; SSE2-NEXT:    pxor %xmm1, %xmm1477; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1478; SSE2-NEXT:    pmovmskb %xmm1, %eax479; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF480; SSE2-NEXT:    sete %al481; SSE2-NEXT:    retq482;483; SSE41-LABEL: test_v32i16:484; SSE41:       # %bb.0:485; SSE41-NEXT:    por %xmm3, %xmm1486; SSE41-NEXT:    por %xmm2, %xmm0487; SSE41-NEXT:    por %xmm1, %xmm0488; SSE41-NEXT:    ptest %xmm0, %xmm0489; SSE41-NEXT:    sete %al490; SSE41-NEXT:    retq491;492; AVX1-LABEL: test_v32i16:493; AVX1:       # %bb.0:494; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0495; AVX1-NEXT:    vptest %ymm0, %ymm0496; AVX1-NEXT:    sete %al497; AVX1-NEXT:    vzeroupper498; AVX1-NEXT:    retq499;500; AVX2-LABEL: test_v32i16:501; AVX2:       # %bb.0:502; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0503; AVX2-NEXT:    vptest %ymm0, %ymm0504; AVX2-NEXT:    sete %al505; AVX2-NEXT:    vzeroupper506; AVX2-NEXT:    retq507;508; AVX512-LABEL: test_v32i16:509; AVX512:       # %bb.0:510; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0511; AVX512-NEXT:    kortestw %k0, %k0512; AVX512-NEXT:    sete %al513; AVX512-NEXT:    vzeroupper514; AVX512-NEXT:    retq515  %1 = call i16 @llvm.vector.reduce.or.v32i16(<32 x i16> %a0)516  %2 = icmp eq i16 %1, 0517  ret i1 %2518}519 520define i1 @test_v64i16(<64 x i16> %a0) {521; SSE2-LABEL: test_v64i16:522; SSE2:       # %bb.0:523; SSE2-NEXT:    por %xmm7, %xmm3524; SSE2-NEXT:    por %xmm5, %xmm1525; SSE2-NEXT:    por %xmm3, %xmm1526; SSE2-NEXT:    por %xmm6, %xmm2527; SSE2-NEXT:    por %xmm4, %xmm0528; SSE2-NEXT:    por %xmm2, %xmm0529; SSE2-NEXT:    por %xmm1, %xmm0530; SSE2-NEXT:    pxor %xmm1, %xmm1531; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1532; SSE2-NEXT:    pmovmskb %xmm1, %eax533; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF534; SSE2-NEXT:    setne %al535; SSE2-NEXT:    retq536;537; SSE41-LABEL: test_v64i16:538; SSE41:       # %bb.0:539; SSE41-NEXT:    por %xmm7, %xmm3540; SSE41-NEXT:    por %xmm5, %xmm1541; SSE41-NEXT:    por %xmm3, %xmm1542; SSE41-NEXT:    por %xmm6, %xmm2543; SSE41-NEXT:    por %xmm4, %xmm0544; SSE41-NEXT:    por %xmm2, %xmm0545; SSE41-NEXT:    por %xmm1, %xmm0546; SSE41-NEXT:    ptest %xmm0, %xmm0547; SSE41-NEXT:    setne %al548; SSE41-NEXT:    retq549;550; AVX1-LABEL: test_v64i16:551; AVX1:       # %bb.0:552; AVX1-NEXT:    vorps %ymm3, %ymm1, %ymm1553; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0554; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0555; AVX1-NEXT:    vptest %ymm0, %ymm0556; AVX1-NEXT:    setne %al557; AVX1-NEXT:    vzeroupper558; AVX1-NEXT:    retq559;560; AVX2-LABEL: test_v64i16:561; AVX2:       # %bb.0:562; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm1563; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0564; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0565; AVX2-NEXT:    vptest %ymm0, %ymm0566; AVX2-NEXT:    setne %al567; AVX2-NEXT:    vzeroupper568; AVX2-NEXT:    retq569;570; AVX512-LABEL: test_v64i16:571; AVX512:       # %bb.0:572; AVX512-NEXT:    vporq %zmm1, %zmm0, %zmm0573; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0574; AVX512-NEXT:    kortestw %k0, %k0575; AVX512-NEXT:    setne %al576; AVX512-NEXT:    vzeroupper577; AVX512-NEXT:    retq578  %1 = call i16 @llvm.vector.reduce.or.v64i16(<64 x i16> %a0)579  %2 = icmp ne i16 %1, 0580  ret i1 %2581}582 583;584; vXi8585;586 587define i1 @test_v2i8(<2 x i8> %a0) {588; SSE-LABEL: test_v2i8:589; SSE:       # %bb.0:590; SSE-NEXT:    movd %xmm0, %eax591; SSE-NEXT:    testw %ax, %ax592; SSE-NEXT:    sete %al593; SSE-NEXT:    retq594;595; AVX-LABEL: test_v2i8:596; AVX:       # %bb.0:597; AVX-NEXT:    vmovd %xmm0, %eax598; AVX-NEXT:    testw %ax, %ax599; AVX-NEXT:    sete %al600; AVX-NEXT:    retq601  %1 = call i8 @llvm.vector.reduce.or.v2i8(<2 x i8> %a0)602  %2 = icmp eq i8 %1, 0603  ret i1 %2604}605 606define i1 @test_v4i8(<4 x i8> %a0) {607; SSE-LABEL: test_v4i8:608; SSE:       # %bb.0:609; SSE-NEXT:    movd %xmm0, %eax610; SSE-NEXT:    testl %eax, %eax611; SSE-NEXT:    setne %al612; SSE-NEXT:    retq613;614; AVX-LABEL: test_v4i8:615; AVX:       # %bb.0:616; AVX-NEXT:    vmovd %xmm0, %eax617; AVX-NEXT:    testl %eax, %eax618; AVX-NEXT:    setne %al619; AVX-NEXT:    retq620  %1 = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> %a0)621  %2 = icmp ne i8 %1, 0622  ret i1 %2623}624 625define i1 @test_v8i8(<8 x i8> %a0) {626; SSE-LABEL: test_v8i8:627; SSE:       # %bb.0:628; SSE-NEXT:    movq %xmm0, %rax629; SSE-NEXT:    testq %rax, %rax630; SSE-NEXT:    sete %al631; SSE-NEXT:    retq632;633; AVX-LABEL: test_v8i8:634; AVX:       # %bb.0:635; AVX-NEXT:    vmovq %xmm0, %rax636; AVX-NEXT:    testq %rax, %rax637; AVX-NEXT:    sete %al638; AVX-NEXT:    retq639  %1 = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> %a0)640  %2 = icmp eq i8 %1, 0641  ret i1 %2642}643 644define i1 @test_v16i8(<16 x i8> %a0) {645; SSE2-LABEL: test_v16i8:646; SSE2:       # %bb.0:647; SSE2-NEXT:    pxor %xmm1, %xmm1648; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1649; SSE2-NEXT:    pmovmskb %xmm1, %eax650; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF651; SSE2-NEXT:    setne %al652; SSE2-NEXT:    retq653;654; SSE41-LABEL: test_v16i8:655; SSE41:       # %bb.0:656; SSE41-NEXT:    ptest %xmm0, %xmm0657; SSE41-NEXT:    setne %al658; SSE41-NEXT:    retq659;660; AVX-LABEL: test_v16i8:661; AVX:       # %bb.0:662; AVX-NEXT:    vptest %xmm0, %xmm0663; AVX-NEXT:    setne %al664; AVX-NEXT:    retq665  %1 = call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %a0)666  %2 = icmp ne i8 %1, 0667  ret i1 %2668}669 670define i1 @test_v32i8(<32 x i8> %a0) {671; SSE2-LABEL: test_v32i8:672; SSE2:       # %bb.0:673; SSE2-NEXT:    por %xmm1, %xmm0674; SSE2-NEXT:    pxor %xmm1, %xmm1675; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1676; SSE2-NEXT:    pmovmskb %xmm1, %eax677; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF678; SSE2-NEXT:    sete %al679; SSE2-NEXT:    retq680;681; SSE41-LABEL: test_v32i8:682; SSE41:       # %bb.0:683; SSE41-NEXT:    por %xmm1, %xmm0684; SSE41-NEXT:    ptest %xmm0, %xmm0685; SSE41-NEXT:    sete %al686; SSE41-NEXT:    retq687;688; AVX-LABEL: test_v32i8:689; AVX:       # %bb.0:690; AVX-NEXT:    vptest %ymm0, %ymm0691; AVX-NEXT:    sete %al692; AVX-NEXT:    vzeroupper693; AVX-NEXT:    retq694  %1 = call i8 @llvm.vector.reduce.or.v32i8(<32 x i8> %a0)695  %2 = icmp eq i8 %1, 0696  ret i1 %2697}698 699define i1 @test_v64i8(<64 x i8> %a0) {700; SSE2-LABEL: test_v64i8:701; SSE2:       # %bb.0:702; SSE2-NEXT:    por %xmm3, %xmm1703; SSE2-NEXT:    por %xmm2, %xmm0704; SSE2-NEXT:    por %xmm1, %xmm0705; SSE2-NEXT:    pxor %xmm1, %xmm1706; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1707; SSE2-NEXT:    pmovmskb %xmm1, %eax708; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF709; SSE2-NEXT:    setne %al710; SSE2-NEXT:    retq711;712; SSE41-LABEL: test_v64i8:713; SSE41:       # %bb.0:714; SSE41-NEXT:    por %xmm3, %xmm1715; SSE41-NEXT:    por %xmm2, %xmm0716; SSE41-NEXT:    por %xmm1, %xmm0717; SSE41-NEXT:    ptest %xmm0, %xmm0718; SSE41-NEXT:    setne %al719; SSE41-NEXT:    retq720;721; AVX1-LABEL: test_v64i8:722; AVX1:       # %bb.0:723; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0724; AVX1-NEXT:    vptest %ymm0, %ymm0725; AVX1-NEXT:    setne %al726; AVX1-NEXT:    vzeroupper727; AVX1-NEXT:    retq728;729; AVX2-LABEL: test_v64i8:730; AVX2:       # %bb.0:731; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0732; AVX2-NEXT:    vptest %ymm0, %ymm0733; AVX2-NEXT:    setne %al734; AVX2-NEXT:    vzeroupper735; AVX2-NEXT:    retq736;737; AVX512-LABEL: test_v64i8:738; AVX512:       # %bb.0:739; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0740; AVX512-NEXT:    kortestw %k0, %k0741; AVX512-NEXT:    setne %al742; AVX512-NEXT:    vzeroupper743; AVX512-NEXT:    retq744  %1 = call i8 @llvm.vector.reduce.or.v64i8(<64 x i8> %a0)745  %2 = icmp ne i8 %1, 0746  ret i1 %2747}748 749define i1 @test_v128i8(<128 x i8> %a0) {750; SSE2-LABEL: test_v128i8:751; SSE2:       # %bb.0:752; SSE2-NEXT:    por %xmm7, %xmm3753; SSE2-NEXT:    por %xmm5, %xmm1754; SSE2-NEXT:    por %xmm3, %xmm1755; SSE2-NEXT:    por %xmm6, %xmm2756; SSE2-NEXT:    por %xmm4, %xmm0757; SSE2-NEXT:    por %xmm2, %xmm0758; SSE2-NEXT:    por %xmm1, %xmm0759; SSE2-NEXT:    pxor %xmm1, %xmm1760; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1761; SSE2-NEXT:    pmovmskb %xmm1, %eax762; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF763; SSE2-NEXT:    sete %al764; SSE2-NEXT:    retq765;766; SSE41-LABEL: test_v128i8:767; SSE41:       # %bb.0:768; SSE41-NEXT:    por %xmm7, %xmm3769; SSE41-NEXT:    por %xmm5, %xmm1770; SSE41-NEXT:    por %xmm3, %xmm1771; SSE41-NEXT:    por %xmm6, %xmm2772; SSE41-NEXT:    por %xmm4, %xmm0773; SSE41-NEXT:    por %xmm2, %xmm0774; SSE41-NEXT:    por %xmm1, %xmm0775; SSE41-NEXT:    ptest %xmm0, %xmm0776; SSE41-NEXT:    sete %al777; SSE41-NEXT:    retq778;779; AVX1-LABEL: test_v128i8:780; AVX1:       # %bb.0:781; AVX1-NEXT:    vorps %ymm3, %ymm1, %ymm1782; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0783; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0784; AVX1-NEXT:    vptest %ymm0, %ymm0785; AVX1-NEXT:    sete %al786; AVX1-NEXT:    vzeroupper787; AVX1-NEXT:    retq788;789; AVX2-LABEL: test_v128i8:790; AVX2:       # %bb.0:791; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm1792; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0793; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0794; AVX2-NEXT:    vptest %ymm0, %ymm0795; AVX2-NEXT:    sete %al796; AVX2-NEXT:    vzeroupper797; AVX2-NEXT:    retq798;799; AVX512-LABEL: test_v128i8:800; AVX512:       # %bb.0:801; AVX512-NEXT:    vporq %zmm1, %zmm0, %zmm0802; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0803; AVX512-NEXT:    kortestw %k0, %k0804; AVX512-NEXT:    sete %al805; AVX512-NEXT:    vzeroupper806; AVX512-NEXT:    retq807  %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0)808  %2 = icmp eq i8 %1, 0809  ret i1 %2810}811 812;813; Compare Truncated/Masked OR Reductions814;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, %xmm1821; SSE2-NEXT:    movd %xmm1, %eax822; SSE2-NEXT:    testw %ax, %ax823; SSE2-NEXT:    sete %al824; SSE2-NEXT:    retq825;826; SSE41-LABEL: trunc_v2i64:827; SSE41:       # %bb.0:828; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0829; SSE41-NEXT:    sete %al830; SSE41-NEXT:    retq831;832; AVX1OR2-LABEL: trunc_v2i64:833; AVX1OR2:       # %bb.0:834; AVX1OR2-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0835; AVX1OR2-NEXT:    sete %al836; AVX1OR2-NEXT:    retq837;838; AVX512F-LABEL: trunc_v2i64:839; AVX512F:       # %bb.0:840; AVX512F-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0841; AVX512F-NEXT:    sete %al842; AVX512F-NEXT:    retq843;844; AVX512BW-LABEL: trunc_v2i64:845; AVX512BW:       # %bb.0:846; AVX512BW-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0847; AVX512BW-NEXT:    sete %al848; AVX512BW-NEXT:    retq849;850; AVX512BWVL-LABEL: trunc_v2i64:851; AVX512BWVL:       # %bb.0:852; AVX512BWVL-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [65535,65535]853; AVX512BWVL-NEXT:    vptest %xmm1, %xmm0854; AVX512BWVL-NEXT:    sete %al855; AVX512BWVL-NEXT:    retq856  %1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0)857  %2 = trunc i64 %1 to i16858  %3 = icmp eq i16 %2, 0859  ret i1 %3860}861 862define i1 @mask_v8i32(<8 x i32> %a0) {863; SSE2-LABEL: mask_v8i32:864; SSE2:       # %bb.0:865; SSE2-NEXT:    orps %xmm1, %xmm0866; SSE2-NEXT:    movmskps %xmm0, %eax867; SSE2-NEXT:    testl %eax, %eax868; SSE2-NEXT:    sete %al869; SSE2-NEXT:    retq870;871; SSE41-LABEL: mask_v8i32:872; SSE41:       # %bb.0:873; SSE41-NEXT:    por %xmm1, %xmm0874; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0875; SSE41-NEXT:    sete %al876; SSE41-NEXT:    retq877;878; AVX-LABEL: mask_v8i32:879; AVX:       # %bb.0:880; AVX-NEXT:    vtestps %ymm0, %ymm0881; AVX-NEXT:    sete %al882; AVX-NEXT:    vzeroupper883; AVX-NEXT:    retq884  %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)885  %2 = and i32 %1, 2147483648886  %3 = icmp eq i32 %2, 0887  ret i1 %3888}889 890define i1 @mask_v8i32_2(<8 x i32> %a0) {891; SSE2-LABEL: mask_v8i32_2:892; SSE2:       # %bb.0:893; SSE2-NEXT:    por %xmm1, %xmm0894; SSE2-NEXT:    paddd %xmm0, %xmm0895; SSE2-NEXT:    movmskps %xmm0, %eax896; SSE2-NEXT:    testl %eax, %eax897; SSE2-NEXT:    sete %al898; SSE2-NEXT:    retq899;900; SSE41-LABEL: mask_v8i32_2:901; SSE41:       # %bb.0:902; SSE41-NEXT:    por %xmm1, %xmm0903; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0904; SSE41-NEXT:    sete %al905; SSE41-NEXT:    retq906;907; AVX1-LABEL: mask_v8i32_2:908; AVX1:       # %bb.0:909; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0910; AVX1-NEXT:    sete %al911; AVX1-NEXT:    vzeroupper912; AVX1-NEXT:    retq913;914; AVX2-LABEL: mask_v8i32_2:915; AVX2:       # %bb.0:916; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4611686019501129728,4611686019501129728,4611686019501129728,4611686019501129728]917; AVX2-NEXT:    vptest %ymm1, %ymm0918; AVX2-NEXT:    sete %al919; AVX2-NEXT:    vzeroupper920; AVX2-NEXT:    retq921;922; AVX512-LABEL: mask_v8i32_2:923; AVX512:       # %bb.0:924; AVX512-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4611686019501129728,4611686019501129728,4611686019501129728,4611686019501129728]925; AVX512-NEXT:    vptest %ymm1, %ymm0926; AVX512-NEXT:    sete %al927; AVX512-NEXT:    vzeroupper928; AVX512-NEXT:    retq929  %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)930  %2 = and i32 %1, 1073741824931  %3 = icmp eq i32 %2, 0932  ret i1 %3933}934 935 936define i1 @signtest_v8i32(<8 x i32> %a0) {937; SSE2-LABEL: signtest_v8i32:938; SSE2:       # %bb.0:939; SSE2-NEXT:    orps %xmm1, %xmm0940; SSE2-NEXT:    movmskps %xmm0, %eax941; SSE2-NEXT:    testl %eax, %eax942; SSE2-NEXT:    sete %al943; SSE2-NEXT:    retq944;945; SSE41-LABEL: signtest_v8i32:946; SSE41:       # %bb.0:947; SSE41-NEXT:    por %xmm1, %xmm0948; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0949; SSE41-NEXT:    sete %al950; SSE41-NEXT:    retq951;952; AVX-LABEL: signtest_v8i32:953; AVX:       # %bb.0:954; AVX-NEXT:    vtestps %ymm0, %ymm0955; AVX-NEXT:    sete %al956; AVX-NEXT:    vzeroupper957; AVX-NEXT:    retq958  %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)959  %2 = icmp sgt i32 %1, -1960  ret i1 %2961}962 963define i1 @signtest_v4i64(<4 x i64> %a0) {964; SSE2-LABEL: signtest_v4i64:965; SSE2:       # %bb.0:966; SSE2-NEXT:    por %xmm1, %xmm0967; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]968; SSE2-NEXT:    por %xmm0, %xmm1969; SSE2-NEXT:    movq %xmm1, %rax970; SSE2-NEXT:    testq %rax, %rax971; SSE2-NEXT:    setns %al972; SSE2-NEXT:    retq973;974; SSE41-LABEL: signtest_v4i64:975; SSE41:       # %bb.0:976; SSE41-NEXT:    por %xmm1, %xmm0977; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0978; SSE41-NEXT:    sete %al979; SSE41-NEXT:    retq980;981; AVX-LABEL: signtest_v4i64:982; AVX:       # %bb.0:983; AVX-NEXT:    vtestpd %ymm0, %ymm0984; AVX-NEXT:    sete %al985; AVX-NEXT:    vzeroupper986; AVX-NEXT:    retq987  %1 = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %a0)988  %2 = icmp sgt i64 %1, -1989  ret i1 %2990}991 992define i1 @trunc_v16i16(<16 x i16> %a0) {993; SSE2-LABEL: trunc_v16i16:994; SSE2:       # %bb.0:995; SSE2-NEXT:    por %xmm1, %xmm0996; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0997; SSE2-NEXT:    pxor %xmm1, %xmm1998; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1999; SSE2-NEXT:    pmovmskb %xmm1, %eax1000; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF1001; SSE2-NEXT:    setne %al1002; SSE2-NEXT:    retq1003;1004; SSE41-LABEL: trunc_v16i16:1005; SSE41:       # %bb.0:1006; SSE41-NEXT:    por %xmm1, %xmm01007; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01008; SSE41-NEXT:    setne %al1009; SSE41-NEXT:    retq1010;1011; AVX-LABEL: trunc_v16i16:1012; AVX:       # %bb.0:1013; AVX-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm01014; AVX-NEXT:    setne %al1015; AVX-NEXT:    vzeroupper1016; AVX-NEXT:    retq1017  %1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0)1018  %2 = trunc i16 %1 to i81019  %3 = icmp ne i8 %2, 01020  ret i1 %31021}1022 1023define i1 @mask_v128i8(<128 x i8> %a0) {1024; SSE2-LABEL: mask_v128i8:1025; SSE2:       # %bb.0:1026; SSE2-NEXT:    por %xmm7, %xmm31027; SSE2-NEXT:    por %xmm5, %xmm11028; SSE2-NEXT:    por %xmm3, %xmm11029; SSE2-NEXT:    por %xmm6, %xmm21030; SSE2-NEXT:    por %xmm4, %xmm01031; SSE2-NEXT:    por %xmm2, %xmm01032; SSE2-NEXT:    por %xmm1, %xmm01033; SSE2-NEXT:    psllw $7, %xmm01034; SSE2-NEXT:    pmovmskb %xmm0, %eax1035; SSE2-NEXT:    testl %eax, %eax1036; SSE2-NEXT:    sete %al1037; SSE2-NEXT:    retq1038;1039; SSE41-LABEL: mask_v128i8:1040; SSE41:       # %bb.0:1041; SSE41-NEXT:    por %xmm7, %xmm31042; SSE41-NEXT:    por %xmm5, %xmm11043; SSE41-NEXT:    por %xmm3, %xmm11044; SSE41-NEXT:    por %xmm6, %xmm21045; SSE41-NEXT:    por %xmm4, %xmm01046; SSE41-NEXT:    por %xmm2, %xmm01047; SSE41-NEXT:    por %xmm1, %xmm01048; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01049; SSE41-NEXT:    sete %al1050; SSE41-NEXT:    retq1051;1052; AVX1-LABEL: mask_v128i8:1053; AVX1:       # %bb.0:1054; AVX1-NEXT:    vorps %ymm3, %ymm1, %ymm11055; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm01056; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm01057; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm01058; AVX1-NEXT:    sete %al1059; AVX1-NEXT:    vzeroupper1060; AVX1-NEXT:    retq1061;1062; AVX2-LABEL: mask_v128i8:1063; AVX2:       # %bb.0:1064; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm11065; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm01066; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01067; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]1068; AVX2-NEXT:    vptest %ymm1, %ymm01069; AVX2-NEXT:    sete %al1070; AVX2-NEXT:    vzeroupper1071; AVX2-NEXT:    retq1072;1073; AVX512-LABEL: mask_v128i8:1074; AVX512:       # %bb.0:1075; AVX512-NEXT:    vporq %zmm1, %zmm0, %zmm01076; AVX512-NEXT:    vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k01077; AVX512-NEXT:    kortestw %k0, %k01078; AVX512-NEXT:    sete %al1079; AVX512-NEXT:    vzeroupper1080; AVX512-NEXT:    retq1081  %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0)1082  %2 = and i8 %1, 11083  %3 = icmp eq i8 %2, 01084  ret i1 %31085}1086 1087%struct.Box = type { i32, i32, i32, i32 }1088define zeroext i1 @PR44781(ptr %0) {1089; SSE2-LABEL: PR44781:1090; SSE2:       # %bb.0:1091; SSE2-NEXT:    movdqu (%rdi), %xmm01092; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01093; SSE2-NEXT:    pxor %xmm1, %xmm11094; SSE2-NEXT:    pcmpeqd %xmm0, %xmm11095; SSE2-NEXT:    movmskps %xmm1, %eax1096; SSE2-NEXT:    xorl $15, %eax1097; SSE2-NEXT:    sete %al1098; SSE2-NEXT:    retq1099;1100; SSE41-LABEL: PR44781:1101; SSE41:       # %bb.0:1102; SSE41-NEXT:    movdqu (%rdi), %xmm01103; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01104; SSE41-NEXT:    sete %al1105; SSE41-NEXT:    retq1106;1107; AVX1-LABEL: PR44781:1108; AVX1:       # %bb.0:1109; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm0 = [15,15,15,15]1110; AVX1-NEXT:    vptest (%rdi), %xmm01111; AVX1-NEXT:    sete %al1112; AVX1-NEXT:    retq1113;1114; AVX2-LABEL: PR44781:1115; AVX2:       # %bb.0:1116; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [15,15,15,15]1117; AVX2-NEXT:    vptest (%rdi), %xmm01118; AVX2-NEXT:    sete %al1119; AVX2-NEXT:    retq1120;1121; AVX512F-LABEL: PR44781:1122; AVX512F:       # %bb.0:1123; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [15,15,15,15]1124; AVX512F-NEXT:    vptest (%rdi), %xmm01125; AVX512F-NEXT:    sete %al1126; AVX512F-NEXT:    retq1127;1128; AVX512BW-LABEL: PR44781:1129; AVX512BW:       # %bb.0:1130; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [15,15,15,15]1131; AVX512BW-NEXT:    vptest (%rdi), %xmm01132; AVX512BW-NEXT:    sete %al1133; AVX512BW-NEXT:    retq1134;1135; AVX512BWVL-LABEL: PR44781:1136; AVX512BWVL:       # %bb.0:1137; AVX512BWVL-NEXT:    vpbroadcastq {{.*#+}} xmm0 = [64424509455,64424509455]1138; AVX512BWVL-NEXT:    vptest (%rdi), %xmm01139; AVX512BWVL-NEXT:    sete %al1140; AVX512BWVL-NEXT:    retq1141  %2 = load <4 x i32>, ptr %0, align 41142  %3 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %2)1143  %4 = and i32 %3, 151144  %5 = icmp eq i32 %4, 01145  ret i1 %51146}1147 1148define i32 @mask_v3i1(<3 x i32> %a, <3 x i32> %b) {1149; SSE2-LABEL: mask_v3i1:1150; SSE2:       # %bb.0:1151; SSE2-NEXT:    pcmpeqd %xmm1, %xmm01152; SSE2-NEXT:    pcmpeqd %xmm1, %xmm11153; SSE2-NEXT:    pxor %xmm0, %xmm11154; SSE2-NEXT:    movd %xmm1, %eax1155; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1156; SSE2-NEXT:    movd %xmm0, %ecx1157; SSE2-NEXT:    orl %eax, %ecx1158; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1159; SSE2-NEXT:    movd %xmm0, %eax1160; SSE2-NEXT:    orl %ecx, %eax1161; SSE2-NEXT:    testb $1, %al1162; SSE2-NEXT:    je .LBB30_21163; SSE2-NEXT:  # %bb.1:1164; SSE2-NEXT:    xorl %eax, %eax1165; SSE2-NEXT:    retq1166; SSE2-NEXT:  .LBB30_2:1167; SSE2-NEXT:    movl $1, %eax1168; SSE2-NEXT:    retq1169;1170; SSE41-LABEL: mask_v3i1:1171; SSE41:       # %bb.0:1172; SSE41-NEXT:    pcmpeqd %xmm1, %xmm01173; SSE41-NEXT:    pcmpeqd %xmm1, %xmm11174; SSE41-NEXT:    pxor %xmm0, %xmm11175; SSE41-NEXT:    pextrd $1, %xmm1, %eax1176; SSE41-NEXT:    movd %xmm1, %ecx1177; SSE41-NEXT:    orl %eax, %ecx1178; SSE41-NEXT:    pextrd $2, %xmm1, %eax1179; SSE41-NEXT:    orl %ecx, %eax1180; SSE41-NEXT:    testb $1, %al1181; SSE41-NEXT:    je .LBB30_21182; SSE41-NEXT:  # %bb.1:1183; SSE41-NEXT:    xorl %eax, %eax1184; SSE41-NEXT:    retq1185; SSE41-NEXT:  .LBB30_2:1186; SSE41-NEXT:    movl $1, %eax1187; SSE41-NEXT:    retq1188;1189; AVX1OR2-LABEL: mask_v3i1:1190; AVX1OR2:       # %bb.0:1191; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm01192; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm11193; AVX1OR2-NEXT:    vpxor %xmm1, %xmm0, %xmm01194; AVX1OR2-NEXT:    vpextrd $1, %xmm0, %eax1195; AVX1OR2-NEXT:    vmovd %xmm0, %ecx1196; AVX1OR2-NEXT:    orl %eax, %ecx1197; AVX1OR2-NEXT:    vpextrd $2, %xmm0, %eax1198; AVX1OR2-NEXT:    orl %ecx, %eax1199; AVX1OR2-NEXT:    testb $1, %al1200; AVX1OR2-NEXT:    je .LBB30_21201; AVX1OR2-NEXT:  # %bb.1:1202; AVX1OR2-NEXT:    xorl %eax, %eax1203; AVX1OR2-NEXT:    retq1204; AVX1OR2-NEXT:  .LBB30_2:1205; AVX1OR2-NEXT:    movl $1, %eax1206; AVX1OR2-NEXT:    retq1207;1208; AVX512F-LABEL: mask_v3i1:1209; AVX512F:       # %bb.0:1210; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm11211; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01212; AVX512F-NEXT:    vpcmpneqd %zmm1, %zmm0, %k01213; AVX512F-NEXT:    kshiftrw $2, %k0, %k11214; AVX512F-NEXT:    korw %k1, %k0, %k11215; AVX512F-NEXT:    kshiftrw $1, %k0, %k01216; AVX512F-NEXT:    korw %k0, %k1, %k01217; AVX512F-NEXT:    kmovw %k0, %eax1218; AVX512F-NEXT:    testb $1, %al1219; AVX512F-NEXT:    je .LBB30_21220; AVX512F-NEXT:  # %bb.1:1221; AVX512F-NEXT:    xorl %eax, %eax1222; AVX512F-NEXT:    vzeroupper1223; AVX512F-NEXT:    retq1224; AVX512F-NEXT:  .LBB30_2:1225; AVX512F-NEXT:    movl $1, %eax1226; AVX512F-NEXT:    vzeroupper1227; AVX512F-NEXT:    retq1228;1229; AVX512BW-LABEL: mask_v3i1:1230; AVX512BW:       # %bb.0:1231; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm11232; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01233; AVX512BW-NEXT:    vpcmpneqd %zmm1, %zmm0, %k01234; AVX512BW-NEXT:    kshiftrw $2, %k0, %k11235; AVX512BW-NEXT:    korw %k1, %k0, %k11236; AVX512BW-NEXT:    kshiftrw $1, %k0, %k01237; AVX512BW-NEXT:    korw %k0, %k1, %k01238; AVX512BW-NEXT:    kmovd %k0, %eax1239; AVX512BW-NEXT:    testb $1, %al1240; AVX512BW-NEXT:    je .LBB30_21241; AVX512BW-NEXT:  # %bb.1:1242; AVX512BW-NEXT:    xorl %eax, %eax1243; AVX512BW-NEXT:    vzeroupper1244; AVX512BW-NEXT:    retq1245; AVX512BW-NEXT:  .LBB30_2:1246; AVX512BW-NEXT:    movl $1, %eax1247; AVX512BW-NEXT:    vzeroupper1248; AVX512BW-NEXT:    retq1249;1250; AVX512BWVL-LABEL: mask_v3i1:1251; AVX512BWVL:       # %bb.0:1252; AVX512BWVL-NEXT:    vpcmpneqd %xmm1, %xmm0, %k01253; AVX512BWVL-NEXT:    kshiftrw $2, %k0, %k11254; AVX512BWVL-NEXT:    korw %k1, %k0, %k11255; AVX512BWVL-NEXT:    kshiftrw $1, %k0, %k01256; AVX512BWVL-NEXT:    korw %k0, %k1, %k01257; AVX512BWVL-NEXT:    kmovd %k0, %eax1258; AVX512BWVL-NEXT:    testb $1, %al1259; AVX512BWVL-NEXT:    je .LBB30_21260; AVX512BWVL-NEXT:  # %bb.1:1261; AVX512BWVL-NEXT:    xorl %eax, %eax1262; AVX512BWVL-NEXT:    retq1263; AVX512BWVL-NEXT:  .LBB30_2:1264; AVX512BWVL-NEXT:    movl $1, %eax1265; AVX512BWVL-NEXT:    retq1266  %1 = icmp ne <3 x i32> %a, %b1267  %2 = call i1 @llvm.vector.reduce.or.v3i1(<3 x i1> %1)1268  br i1 %2, label %3, label %412693:1270  ret i32 012714:1272  ret i32 11273}1274 1275declare i64 @llvm.vector.reduce.or.v2i64(<2 x i64>)1276declare i64 @llvm.vector.reduce.or.v4i64(<4 x i64>)1277declare i64 @llvm.vector.reduce.or.v8i64(<8 x i64>)1278declare i64 @llvm.vector.reduce.or.v16i64(<16 x i64>)1279 1280declare i32 @llvm.vector.reduce.or.v2i32(<2 x i32>)1281declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>)1282declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>)1283declare i32 @llvm.vector.reduce.or.v16i32(<16 x i32>)1284declare i32 @llvm.vector.reduce.or.v32i32(<32 x i32>)1285 1286declare i16 @llvm.vector.reduce.or.v2i16(<2 x i16>)1287declare i16 @llvm.vector.reduce.or.v4i16(<4 x i16>)1288declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>)1289declare i16 @llvm.vector.reduce.or.v16i16(<16 x i16>)1290declare i16 @llvm.vector.reduce.or.v32i16(<32 x i16>)1291declare i16 @llvm.vector.reduce.or.v64i16(<64 x i16>)1292 1293declare i8 @llvm.vector.reduce.or.v2i8(<2 x i8>)1294declare i8 @llvm.vector.reduce.or.v4i8(<4 x i8>)1295declare i8 @llvm.vector.reduce.or.v8i8(<8 x i8>)1296declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>)1297declare i8 @llvm.vector.reduce.or.v32i8(<32 x i8>)1298declare i8 @llvm.vector.reduce.or.v64i8(<64 x i8>)1299declare i8 @llvm.vector.reduce.or.v128i8(<128 x i8>)1300 1301declare i1 @llvm.vector.reduce.or.v3i1(<3 x i1>)1302