brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.1 KiB · 57ab56b Raw
966 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:    pcmpeqd %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:    pcmpeqd %xmm1, %xmm127; SSE41-NEXT:    ptest %xmm1, %xmm028; SSE41-NEXT:    setb %al29; SSE41-NEXT:    retq30;31; AVX-LABEL: test_v2i64:32; AVX:       # %bb.0:33; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm134; AVX-NEXT:    vptest %xmm1, %xmm035; AVX-NEXT:    setb %al36; AVX-NEXT:    retq37  %1 = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %a0)38  %2 = icmp eq i64 %1, -139  ret i1 %240}41 42define i1 @test_v4i64(<4 x i64> %a0) {43; SSE2-LABEL: test_v4i64:44; SSE2:       # %bb.0:45; SSE2-NEXT:    pand %xmm1, %xmm046; SSE2-NEXT:    pcmpeqd %xmm1, %xmm147; SSE2-NEXT:    pcmpeqd %xmm0, %xmm148; SSE2-NEXT:    movmskps %xmm1, %eax49; SSE2-NEXT:    xorl $15, %eax50; SSE2-NEXT:    setne %al51; SSE2-NEXT:    retq52;53; SSE41-LABEL: test_v4i64:54; SSE41:       # %bb.0:55; SSE41-NEXT:    pand %xmm1, %xmm056; SSE41-NEXT:    pcmpeqd %xmm1, %xmm157; SSE41-NEXT:    ptest %xmm1, %xmm058; SSE41-NEXT:    setae %al59; SSE41-NEXT:    retq60;61; AVX1-LABEL: test_v4i64:62; AVX1:       # %bb.0:63; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm164; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm165; AVX1-NEXT:    vptest %ymm1, %ymm066; AVX1-NEXT:    setae %al67; AVX1-NEXT:    vzeroupper68; AVX1-NEXT:    retq69;70; AVX2-LABEL: test_v4i64:71; AVX2:       # %bb.0:72; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm173; AVX2-NEXT:    vptest %ymm1, %ymm074; AVX2-NEXT:    setae %al75; AVX2-NEXT:    vzeroupper76; AVX2-NEXT:    retq77;78; AVX512-LABEL: test_v4i64:79; AVX512:       # %bb.0:80; AVX512-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm181; AVX512-NEXT:    vptest %ymm1, %ymm082; AVX512-NEXT:    setae %al83; AVX512-NEXT:    vzeroupper84; AVX512-NEXT:    retq85  %1 = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %a0)86  %2 = icmp ne i64 %1, -187  ret i1 %288}89 90define i1 @test_v8i64(<8 x i64> %a0) {91; SSE2-LABEL: test_v8i64:92; SSE2:       # %bb.0:93; SSE2-NEXT:    pand %xmm3, %xmm194; SSE2-NEXT:    pand %xmm2, %xmm095; SSE2-NEXT:    pand %xmm1, %xmm096; SSE2-NEXT:    pcmpeqd %xmm1, %xmm197; SSE2-NEXT:    pcmpeqd %xmm0, %xmm198; SSE2-NEXT:    movmskps %xmm1, %eax99; SSE2-NEXT:    xorl $15, %eax100; SSE2-NEXT:    sete %al101; SSE2-NEXT:    retq102;103; SSE41-LABEL: test_v8i64:104; SSE41:       # %bb.0:105; SSE41-NEXT:    pand %xmm3, %xmm1106; SSE41-NEXT:    pand %xmm2, %xmm0107; SSE41-NEXT:    pand %xmm1, %xmm0108; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1109; SSE41-NEXT:    ptest %xmm1, %xmm0110; SSE41-NEXT:    setb %al111; SSE41-NEXT:    retq112;113; AVX1-LABEL: test_v8i64:114; AVX1:       # %bb.0:115; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0116; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1117; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1118; AVX1-NEXT:    vptest %ymm1, %ymm0119; AVX1-NEXT:    setb %al120; AVX1-NEXT:    vzeroupper121; AVX1-NEXT:    retq122;123; AVX2-LABEL: test_v8i64:124; AVX2:       # %bb.0:125; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0126; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1127; AVX2-NEXT:    vptest %ymm1, %ymm0128; AVX2-NEXT:    setb %al129; AVX2-NEXT:    vzeroupper130; AVX2-NEXT:    retq131;132; AVX512-LABEL: test_v8i64:133; AVX512:       # %bb.0:134; AVX512-NEXT:    vpternlogd {{.*#+}} zmm1 = -1135; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0136; AVX512-NEXT:    kortestw %k0, %k0137; AVX512-NEXT:    sete %al138; AVX512-NEXT:    vzeroupper139; AVX512-NEXT:    retq140  %1 = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %a0)141  %2 = icmp eq i64 %1, -1142  ret i1 %2143}144 145define i1 @test_v16i64(<16 x i64> %a0) {146; SSE2-LABEL: test_v16i64:147; SSE2:       # %bb.0:148; SSE2-NEXT:    pand %xmm7, %xmm3149; SSE2-NEXT:    pand %xmm5, %xmm1150; SSE2-NEXT:    pand %xmm3, %xmm1151; SSE2-NEXT:    pand %xmm6, %xmm2152; SSE2-NEXT:    pand %xmm4, %xmm0153; SSE2-NEXT:    pand %xmm2, %xmm0154; SSE2-NEXT:    pand %xmm1, %xmm0155; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1156; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1157; SSE2-NEXT:    movmskps %xmm1, %eax158; SSE2-NEXT:    xorl $15, %eax159; SSE2-NEXT:    setne %al160; SSE2-NEXT:    retq161;162; SSE41-LABEL: test_v16i64:163; SSE41:       # %bb.0:164; SSE41-NEXT:    pand %xmm7, %xmm3165; SSE41-NEXT:    pand %xmm5, %xmm1166; SSE41-NEXT:    pand %xmm3, %xmm1167; SSE41-NEXT:    pand %xmm6, %xmm2168; SSE41-NEXT:    pand %xmm4, %xmm0169; SSE41-NEXT:    pand %xmm2, %xmm0170; SSE41-NEXT:    pand %xmm1, %xmm0171; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1172; SSE41-NEXT:    ptest %xmm1, %xmm0173; SSE41-NEXT:    setae %al174; SSE41-NEXT:    retq175;176; AVX1-LABEL: test_v16i64:177; AVX1:       # %bb.0:178; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1179; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0180; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0181; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1182; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1183; AVX1-NEXT:    vptest %ymm1, %ymm0184; AVX1-NEXT:    setae %al185; AVX1-NEXT:    vzeroupper186; AVX1-NEXT:    retq187;188; AVX2-LABEL: test_v16i64:189; AVX2:       # %bb.0:190; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1191; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0192; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0193; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1194; AVX2-NEXT:    vptest %ymm1, %ymm0195; AVX2-NEXT:    setae %al196; AVX2-NEXT:    vzeroupper197; AVX2-NEXT:    retq198;199; AVX512-LABEL: test_v16i64:200; AVX512:       # %bb.0:201; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm0202; AVX512-NEXT:    vpternlogd {{.*#+}} zmm1 = -1203; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0204; AVX512-NEXT:    kortestw %k0, %k0205; AVX512-NEXT:    setne %al206; AVX512-NEXT:    vzeroupper207; AVX512-NEXT:    retq208  %1 = call i64 @llvm.vector.reduce.and.v16i64(<16 x i64> %a0)209  %2 = icmp ne i64 %1, -1210  ret i1 %2211}212 213;214; vXi32215;216 217define i1 @test_v2i32(<2 x i32> %a0) {218; SSE-LABEL: test_v2i32:219; SSE:       # %bb.0:220; SSE-NEXT:    movq %xmm0, %rax221; SSE-NEXT:    cmpq $-1, %rax222; SSE-NEXT:    sete %al223; SSE-NEXT:    retq224;225; AVX-LABEL: test_v2i32:226; AVX:       # %bb.0:227; AVX-NEXT:    vmovq %xmm0, %rax228; AVX-NEXT:    cmpq $-1, %rax229; AVX-NEXT:    sete %al230; AVX-NEXT:    retq231  %1 = call i32 @llvm.vector.reduce.and.v2i32(<2 x i32> %a0)232  %2 = icmp eq i32 %1, -1233  ret i1 %2234}235 236define i1 @test_v4i32(<4 x i32> %a0) {237; SSE2-LABEL: test_v4i32:238; SSE2:       # %bb.0:239; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1240; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1241; SSE2-NEXT:    movmskps %xmm1, %eax242; SSE2-NEXT:    xorl $15, %eax243; SSE2-NEXT:    setne %al244; SSE2-NEXT:    retq245;246; SSE41-LABEL: test_v4i32:247; SSE41:       # %bb.0:248; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1249; SSE41-NEXT:    ptest %xmm1, %xmm0250; SSE41-NEXT:    setae %al251; SSE41-NEXT:    retq252;253; AVX-LABEL: test_v4i32:254; AVX:       # %bb.0:255; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1256; AVX-NEXT:    vptest %xmm1, %xmm0257; AVX-NEXT:    setae %al258; AVX-NEXT:    retq259  %1 = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %a0)260  %2 = icmp ne i32 %1, -1261  ret i1 %2262}263 264define i1 @test_v8i32(<8 x i32> %a0) {265; SSE2-LABEL: test_v8i32:266; SSE2:       # %bb.0:267; SSE2-NEXT:    pand %xmm1, %xmm0268; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1269; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1270; SSE2-NEXT:    movmskps %xmm1, %eax271; SSE2-NEXT:    xorl $15, %eax272; SSE2-NEXT:    sete %al273; SSE2-NEXT:    retq274;275; SSE41-LABEL: test_v8i32:276; SSE41:       # %bb.0:277; SSE41-NEXT:    pand %xmm1, %xmm0278; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1279; SSE41-NEXT:    ptest %xmm1, %xmm0280; SSE41-NEXT:    setb %al281; SSE41-NEXT:    retq282;283; AVX1-LABEL: test_v8i32:284; AVX1:       # %bb.0:285; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1286; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1287; AVX1-NEXT:    vptest %ymm1, %ymm0288; AVX1-NEXT:    setb %al289; AVX1-NEXT:    vzeroupper290; AVX1-NEXT:    retq291;292; AVX2-LABEL: test_v8i32:293; AVX2:       # %bb.0:294; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1295; AVX2-NEXT:    vptest %ymm1, %ymm0296; AVX2-NEXT:    setb %al297; AVX2-NEXT:    vzeroupper298; AVX2-NEXT:    retq299;300; AVX512-LABEL: test_v8i32:301; AVX512:       # %bb.0:302; AVX512-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1303; AVX512-NEXT:    vptest %ymm1, %ymm0304; AVX512-NEXT:    setb %al305; AVX512-NEXT:    vzeroupper306; AVX512-NEXT:    retq307  %1 = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %a0)308  %2 = icmp eq i32 %1, -1309  ret i1 %2310}311 312define i1 @test_v16i32(<16 x i32> %a0) {313; SSE2-LABEL: test_v16i32:314; SSE2:       # %bb.0:315; SSE2-NEXT:    pand %xmm3, %xmm1316; SSE2-NEXT:    pand %xmm2, %xmm0317; SSE2-NEXT:    pand %xmm1, %xmm0318; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1319; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1320; SSE2-NEXT:    movmskps %xmm1, %eax321; SSE2-NEXT:    xorl $15, %eax322; SSE2-NEXT:    setne %al323; SSE2-NEXT:    retq324;325; SSE41-LABEL: test_v16i32:326; SSE41:       # %bb.0:327; SSE41-NEXT:    pand %xmm3, %xmm1328; SSE41-NEXT:    pand %xmm2, %xmm0329; SSE41-NEXT:    pand %xmm1, %xmm0330; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1331; SSE41-NEXT:    ptest %xmm1, %xmm0332; SSE41-NEXT:    setae %al333; SSE41-NEXT:    retq334;335; AVX1-LABEL: test_v16i32:336; AVX1:       # %bb.0:337; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0338; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1339; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1340; AVX1-NEXT:    vptest %ymm1, %ymm0341; AVX1-NEXT:    setae %al342; AVX1-NEXT:    vzeroupper343; AVX1-NEXT:    retq344;345; AVX2-LABEL: test_v16i32:346; AVX2:       # %bb.0:347; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0348; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1349; AVX2-NEXT:    vptest %ymm1, %ymm0350; AVX2-NEXT:    setae %al351; AVX2-NEXT:    vzeroupper352; AVX2-NEXT:    retq353;354; AVX512-LABEL: test_v16i32:355; AVX512:       # %bb.0:356; AVX512-NEXT:    vpternlogd {{.*#+}} zmm1 = -1357; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0358; AVX512-NEXT:    kortestw %k0, %k0359; AVX512-NEXT:    setne %al360; AVX512-NEXT:    vzeroupper361; AVX512-NEXT:    retq362  %1 = call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %a0)363  %2 = icmp ne i32 %1, -1364  ret i1 %2365}366 367define i1 @test_v32i32(<32 x i32> %a0) {368; SSE2-LABEL: test_v32i32:369; SSE2:       # %bb.0:370; SSE2-NEXT:    pand %xmm7, %xmm3371; SSE2-NEXT:    pand %xmm5, %xmm1372; SSE2-NEXT:    pand %xmm3, %xmm1373; SSE2-NEXT:    pand %xmm6, %xmm2374; SSE2-NEXT:    pand %xmm4, %xmm0375; SSE2-NEXT:    pand %xmm2, %xmm0376; SSE2-NEXT:    pand %xmm1, %xmm0377; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1378; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1379; SSE2-NEXT:    movmskps %xmm1, %eax380; SSE2-NEXT:    xorl $15, %eax381; SSE2-NEXT:    sete %al382; SSE2-NEXT:    retq383;384; SSE41-LABEL: test_v32i32:385; SSE41:       # %bb.0:386; SSE41-NEXT:    pand %xmm7, %xmm3387; SSE41-NEXT:    pand %xmm5, %xmm1388; SSE41-NEXT:    pand %xmm3, %xmm1389; SSE41-NEXT:    pand %xmm6, %xmm2390; SSE41-NEXT:    pand %xmm4, %xmm0391; SSE41-NEXT:    pand %xmm2, %xmm0392; SSE41-NEXT:    pand %xmm1, %xmm0393; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1394; SSE41-NEXT:    ptest %xmm1, %xmm0395; SSE41-NEXT:    setb %al396; SSE41-NEXT:    retq397;398; AVX1-LABEL: test_v32i32:399; AVX1:       # %bb.0:400; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1401; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0402; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0403; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1404; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1405; AVX1-NEXT:    vptest %ymm1, %ymm0406; AVX1-NEXT:    setb %al407; AVX1-NEXT:    vzeroupper408; AVX1-NEXT:    retq409;410; AVX2-LABEL: test_v32i32:411; AVX2:       # %bb.0:412; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1413; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0414; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0415; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1416; AVX2-NEXT:    vptest %ymm1, %ymm0417; AVX2-NEXT:    setb %al418; AVX2-NEXT:    vzeroupper419; AVX2-NEXT:    retq420;421; AVX512-LABEL: test_v32i32:422; AVX512:       # %bb.0:423; AVX512-NEXT:    vpandd %zmm1, %zmm0, %zmm0424; AVX512-NEXT:    vpternlogd {{.*#+}} zmm1 = -1425; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0426; AVX512-NEXT:    kortestw %k0, %k0427; AVX512-NEXT:    sete %al428; AVX512-NEXT:    vzeroupper429; AVX512-NEXT:    retq430  %1 = call i32 @llvm.vector.reduce.and.v32i32(<32 x i32> %a0)431  %2 = icmp eq i32 %1, -1432  ret i1 %2433}434 435;436; vXi16437;438 439define i1 @test_v2i16(<2 x i16> %a0) {440; SSE-LABEL: test_v2i16:441; SSE:       # %bb.0:442; SSE-NEXT:    movd %xmm0, %eax443; SSE-NEXT:    cmpl $-1, %eax444; SSE-NEXT:    sete %al445; SSE-NEXT:    retq446;447; AVX-LABEL: test_v2i16:448; AVX:       # %bb.0:449; AVX-NEXT:    vmovd %xmm0, %eax450; AVX-NEXT:    cmpl $-1, %eax451; AVX-NEXT:    sete %al452; AVX-NEXT:    retq453  %1 = call i16 @llvm.vector.reduce.and.v2i16(<2 x i16> %a0)454  %2 = icmp eq i16 %1, -1455  ret i1 %2456}457 458define i1 @test_v4i16(<4 x i16> %a0) {459; SSE-LABEL: test_v4i16:460; SSE:       # %bb.0:461; SSE-NEXT:    movq %xmm0, %rax462; SSE-NEXT:    cmpq $-1, %rax463; SSE-NEXT:    setne %al464; SSE-NEXT:    retq465;466; AVX-LABEL: test_v4i16:467; AVX:       # %bb.0:468; AVX-NEXT:    vmovq %xmm0, %rax469; AVX-NEXT:    cmpq $-1, %rax470; AVX-NEXT:    setne %al471; AVX-NEXT:    retq472  %1 = call i16 @llvm.vector.reduce.and.v4i16(<4 x i16> %a0)473  %2 = icmp ne i16 %1, -1474  ret i1 %2475}476 477define i1 @test_v8i16(<8 x i16> %a0) {478; SSE2-LABEL: test_v8i16:479; SSE2:       # %bb.0:480; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1481; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1482; SSE2-NEXT:    pmovmskb %xmm1, %eax483; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF484; SSE2-NEXT:    sete %al485; SSE2-NEXT:    retq486;487; SSE41-LABEL: test_v8i16:488; SSE41:       # %bb.0:489; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1490; SSE41-NEXT:    ptest %xmm1, %xmm0491; SSE41-NEXT:    setb %al492; SSE41-NEXT:    retq493;494; AVX-LABEL: test_v8i16:495; AVX:       # %bb.0:496; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1497; AVX-NEXT:    vptest %xmm1, %xmm0498; AVX-NEXT:    setb %al499; AVX-NEXT:    retq500  %1 = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %a0)501  %2 = icmp eq i16 %1, -1502  ret i1 %2503}504 505define i1 @test_v16i16(<16 x i16> %a0) {506; SSE2-LABEL: test_v16i16:507; SSE2:       # %bb.0:508; SSE2-NEXT:    pand %xmm1, %xmm0509; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1510; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1511; SSE2-NEXT:    pmovmskb %xmm1, %eax512; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF513; SSE2-NEXT:    setne %al514; SSE2-NEXT:    retq515;516; SSE41-LABEL: test_v16i16:517; SSE41:       # %bb.0:518; SSE41-NEXT:    pand %xmm1, %xmm0519; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1520; SSE41-NEXT:    ptest %xmm1, %xmm0521; SSE41-NEXT:    setae %al522; SSE41-NEXT:    retq523;524; AVX1-LABEL: test_v16i16:525; AVX1:       # %bb.0:526; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1527; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1528; AVX1-NEXT:    vptest %ymm1, %ymm0529; AVX1-NEXT:    setae %al530; AVX1-NEXT:    vzeroupper531; AVX1-NEXT:    retq532;533; AVX2-LABEL: test_v16i16:534; AVX2:       # %bb.0:535; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1536; AVX2-NEXT:    vptest %ymm1, %ymm0537; AVX2-NEXT:    setae %al538; AVX2-NEXT:    vzeroupper539; AVX2-NEXT:    retq540;541; AVX512-LABEL: test_v16i16:542; AVX512:       # %bb.0:543; AVX512-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1544; AVX512-NEXT:    vptest %ymm1, %ymm0545; AVX512-NEXT:    setae %al546; AVX512-NEXT:    vzeroupper547; AVX512-NEXT:    retq548  %1 = call i16 @llvm.vector.reduce.and.v16i16(<16 x i16> %a0)549  %2 = icmp ne i16 %1, -1550  ret i1 %2551}552 553define i1 @test_v32i16(<32 x i16> %a0) {554; SSE2-LABEL: test_v32i16:555; SSE2:       # %bb.0:556; SSE2-NEXT:    pand %xmm3, %xmm1557; SSE2-NEXT:    pand %xmm2, %xmm0558; SSE2-NEXT:    pand %xmm1, %xmm0559; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1560; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1561; SSE2-NEXT:    pmovmskb %xmm1, %eax562; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF563; SSE2-NEXT:    sete %al564; SSE2-NEXT:    retq565;566; SSE41-LABEL: test_v32i16:567; SSE41:       # %bb.0:568; SSE41-NEXT:    pand %xmm3, %xmm1569; SSE41-NEXT:    pand %xmm2, %xmm0570; SSE41-NEXT:    pand %xmm1, %xmm0571; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1572; SSE41-NEXT:    ptest %xmm1, %xmm0573; SSE41-NEXT:    setb %al574; SSE41-NEXT:    retq575;576; AVX1-LABEL: test_v32i16:577; AVX1:       # %bb.0:578; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0579; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1580; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1581; AVX1-NEXT:    vptest %ymm1, %ymm0582; AVX1-NEXT:    setb %al583; AVX1-NEXT:    vzeroupper584; AVX1-NEXT:    retq585;586; AVX2-LABEL: test_v32i16:587; AVX2:       # %bb.0:588; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0589; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1590; AVX2-NEXT:    vptest %ymm1, %ymm0591; AVX2-NEXT:    setb %al592; AVX2-NEXT:    vzeroupper593; AVX2-NEXT:    retq594;595; AVX512-LABEL: test_v32i16:596; AVX512:       # %bb.0:597; AVX512-NEXT:    vpternlogd {{.*#+}} zmm1 = -1598; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0599; AVX512-NEXT:    kortestw %k0, %k0600; AVX512-NEXT:    sete %al601; AVX512-NEXT:    vzeroupper602; AVX512-NEXT:    retq603  %1 = call i16 @llvm.vector.reduce.and.v32i16(<32 x i16> %a0)604  %2 = icmp eq i16 %1, -1605  ret i1 %2606}607 608define i1 @test_v64i16(<64 x i16> %a0) {609; SSE2-LABEL: test_v64i16:610; SSE2:       # %bb.0:611; SSE2-NEXT:    pand %xmm7, %xmm3612; SSE2-NEXT:    pand %xmm5, %xmm1613; SSE2-NEXT:    pand %xmm3, %xmm1614; SSE2-NEXT:    pand %xmm6, %xmm2615; SSE2-NEXT:    pand %xmm4, %xmm0616; SSE2-NEXT:    pand %xmm2, %xmm0617; SSE2-NEXT:    pand %xmm1, %xmm0618; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1619; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1620; SSE2-NEXT:    pmovmskb %xmm1, %eax621; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF622; SSE2-NEXT:    setne %al623; SSE2-NEXT:    retq624;625; SSE41-LABEL: test_v64i16:626; SSE41:       # %bb.0:627; SSE41-NEXT:    pand %xmm7, %xmm3628; SSE41-NEXT:    pand %xmm5, %xmm1629; SSE41-NEXT:    pand %xmm3, %xmm1630; SSE41-NEXT:    pand %xmm6, %xmm2631; SSE41-NEXT:    pand %xmm4, %xmm0632; SSE41-NEXT:    pand %xmm2, %xmm0633; SSE41-NEXT:    pand %xmm1, %xmm0634; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1635; SSE41-NEXT:    ptest %xmm1, %xmm0636; SSE41-NEXT:    setae %al637; SSE41-NEXT:    retq638;639; AVX1-LABEL: test_v64i16:640; AVX1:       # %bb.0:641; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1642; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0643; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0644; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1645; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1646; AVX1-NEXT:    vptest %ymm1, %ymm0647; AVX1-NEXT:    setae %al648; AVX1-NEXT:    vzeroupper649; AVX1-NEXT:    retq650;651; AVX2-LABEL: test_v64i16:652; AVX2:       # %bb.0:653; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1654; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0655; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0656; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1657; AVX2-NEXT:    vptest %ymm1, %ymm0658; AVX2-NEXT:    setae %al659; AVX2-NEXT:    vzeroupper660; AVX2-NEXT:    retq661;662; AVX512-LABEL: test_v64i16:663; AVX512:       # %bb.0:664; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm0665; AVX512-NEXT:    vpternlogd {{.*#+}} zmm1 = -1666; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0667; AVX512-NEXT:    kortestw %k0, %k0668; AVX512-NEXT:    setne %al669; AVX512-NEXT:    vzeroupper670; AVX512-NEXT:    retq671  %1 = call i16 @llvm.vector.reduce.and.v64i16(<64 x i16> %a0)672  %2 = icmp ne i16 %1, -1673  ret i1 %2674}675 676;677; vXi8678;679 680define i1 @test_v2i8(<2 x i8> %a0) {681; SSE-LABEL: test_v2i8:682; SSE:       # %bb.0:683; SSE-NEXT:    movd %xmm0, %eax684; SSE-NEXT:    cmpw $-1, %ax685; SSE-NEXT:    sete %al686; SSE-NEXT:    retq687;688; AVX-LABEL: test_v2i8:689; AVX:       # %bb.0:690; AVX-NEXT:    vmovd %xmm0, %eax691; AVX-NEXT:    cmpw $-1, %ax692; AVX-NEXT:    sete %al693; AVX-NEXT:    retq694  %1 = call i8 @llvm.vector.reduce.and.v2i8(<2 x i8> %a0)695  %2 = icmp eq i8 %1, -1696  ret i1 %2697}698 699define i1 @test_v4i8(<4 x i8> %a0) {700; SSE-LABEL: test_v4i8:701; SSE:       # %bb.0:702; SSE-NEXT:    movd %xmm0, %eax703; SSE-NEXT:    cmpl $-1, %eax704; SSE-NEXT:    setne %al705; SSE-NEXT:    retq706;707; AVX-LABEL: test_v4i8:708; AVX:       # %bb.0:709; AVX-NEXT:    vmovd %xmm0, %eax710; AVX-NEXT:    cmpl $-1, %eax711; AVX-NEXT:    setne %al712; AVX-NEXT:    retq713  %1 = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> %a0)714  %2 = icmp ne i8 %1, -1715  ret i1 %2716}717 718define i1 @test_v8i8(<8 x i8> %a0) {719; SSE-LABEL: test_v8i8:720; SSE:       # %bb.0:721; SSE-NEXT:    movq %xmm0, %rax722; SSE-NEXT:    cmpq $-1, %rax723; SSE-NEXT:    sete %al724; SSE-NEXT:    retq725;726; AVX-LABEL: test_v8i8:727; AVX:       # %bb.0:728; AVX-NEXT:    vmovq %xmm0, %rax729; AVX-NEXT:    cmpq $-1, %rax730; AVX-NEXT:    sete %al731; AVX-NEXT:    retq732  %1 = call i8 @llvm.vector.reduce.and.v8i8(<8 x i8> %a0)733  %2 = icmp eq i8 %1, -1734  ret i1 %2735}736 737define i1 @test_v16i8(<16 x i8> %a0) {738; SSE2-LABEL: test_v16i8:739; SSE2:       # %bb.0:740; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1741; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1742; SSE2-NEXT:    pmovmskb %xmm1, %eax743; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF744; SSE2-NEXT:    setne %al745; SSE2-NEXT:    retq746;747; SSE41-LABEL: test_v16i8:748; SSE41:       # %bb.0:749; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1750; SSE41-NEXT:    ptest %xmm1, %xmm0751; SSE41-NEXT:    setae %al752; SSE41-NEXT:    retq753;754; AVX-LABEL: test_v16i8:755; AVX:       # %bb.0:756; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1757; AVX-NEXT:    vptest %xmm1, %xmm0758; AVX-NEXT:    setae %al759; AVX-NEXT:    retq760  %1 = call i8 @llvm.vector.reduce.and.v16i8(<16 x i8> %a0)761  %2 = icmp ne i8 %1, -1762  ret i1 %2763}764 765define i1 @test_v32i8(<32 x i8> %a0) {766; SSE2-LABEL: test_v32i8:767; SSE2:       # %bb.0:768; SSE2-NEXT:    pand %xmm1, %xmm0769; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1770; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1771; SSE2-NEXT:    pmovmskb %xmm1, %eax772; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF773; SSE2-NEXT:    sete %al774; SSE2-NEXT:    retq775;776; SSE41-LABEL: test_v32i8:777; SSE41:       # %bb.0:778; SSE41-NEXT:    pand %xmm1, %xmm0779; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1780; SSE41-NEXT:    ptest %xmm1, %xmm0781; SSE41-NEXT:    setb %al782; SSE41-NEXT:    retq783;784; AVX1-LABEL: test_v32i8:785; AVX1:       # %bb.0:786; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1787; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1788; AVX1-NEXT:    vptest %ymm1, %ymm0789; AVX1-NEXT:    setb %al790; AVX1-NEXT:    vzeroupper791; AVX1-NEXT:    retq792;793; AVX2-LABEL: test_v32i8:794; AVX2:       # %bb.0:795; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1796; AVX2-NEXT:    vptest %ymm1, %ymm0797; AVX2-NEXT:    setb %al798; AVX2-NEXT:    vzeroupper799; AVX2-NEXT:    retq800;801; AVX512-LABEL: test_v32i8:802; AVX512:       # %bb.0:803; AVX512-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1804; AVX512-NEXT:    vptest %ymm1, %ymm0805; AVX512-NEXT:    setb %al806; AVX512-NEXT:    vzeroupper807; AVX512-NEXT:    retq808  %1 = call i8 @llvm.vector.reduce.and.v32i8(<32 x i8> %a0)809  %2 = icmp eq i8 %1, -1810  ret i1 %2811}812 813define i1 @test_v64i8(<64 x i8> %a0) {814; SSE2-LABEL: test_v64i8:815; SSE2:       # %bb.0:816; SSE2-NEXT:    pand %xmm3, %xmm1817; SSE2-NEXT:    pand %xmm2, %xmm0818; SSE2-NEXT:    pand %xmm1, %xmm0819; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1820; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1821; SSE2-NEXT:    pmovmskb %xmm1, %eax822; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF823; SSE2-NEXT:    setne %al824; SSE2-NEXT:    retq825;826; SSE41-LABEL: test_v64i8:827; SSE41:       # %bb.0:828; SSE41-NEXT:    pand %xmm3, %xmm1829; SSE41-NEXT:    pand %xmm2, %xmm0830; SSE41-NEXT:    pand %xmm1, %xmm0831; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1832; SSE41-NEXT:    ptest %xmm1, %xmm0833; SSE41-NEXT:    setae %al834; SSE41-NEXT:    retq835;836; AVX1-LABEL: test_v64i8:837; AVX1:       # %bb.0:838; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0839; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1840; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1841; AVX1-NEXT:    vptest %ymm1, %ymm0842; AVX1-NEXT:    setae %al843; AVX1-NEXT:    vzeroupper844; AVX1-NEXT:    retq845;846; AVX2-LABEL: test_v64i8:847; AVX2:       # %bb.0:848; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0849; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1850; AVX2-NEXT:    vptest %ymm1, %ymm0851; AVX2-NEXT:    setae %al852; AVX2-NEXT:    vzeroupper853; AVX2-NEXT:    retq854;855; AVX512-LABEL: test_v64i8:856; AVX512:       # %bb.0:857; AVX512-NEXT:    vpternlogd {{.*#+}} zmm1 = -1858; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0859; AVX512-NEXT:    kortestw %k0, %k0860; AVX512-NEXT:    setne %al861; AVX512-NEXT:    vzeroupper862; AVX512-NEXT:    retq863  %1 = call i8 @llvm.vector.reduce.and.v64i8(<64 x i8> %a0)864  %2 = icmp ne i8 %1, -1865  ret i1 %2866}867 868define i1 @test_v128i8(<128 x i8> %a0) {869; SSE2-LABEL: test_v128i8:870; SSE2:       # %bb.0:871; SSE2-NEXT:    pand %xmm7, %xmm3872; SSE2-NEXT:    pand %xmm5, %xmm1873; SSE2-NEXT:    pand %xmm3, %xmm1874; SSE2-NEXT:    pand %xmm6, %xmm2875; SSE2-NEXT:    pand %xmm4, %xmm0876; SSE2-NEXT:    pand %xmm2, %xmm0877; SSE2-NEXT:    pand %xmm1, %xmm0878; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1879; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1880; SSE2-NEXT:    pmovmskb %xmm1, %eax881; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF882; SSE2-NEXT:    sete %al883; SSE2-NEXT:    retq884;885; SSE41-LABEL: test_v128i8:886; SSE41:       # %bb.0:887; SSE41-NEXT:    pand %xmm7, %xmm3888; SSE41-NEXT:    pand %xmm5, %xmm1889; SSE41-NEXT:    pand %xmm3, %xmm1890; SSE41-NEXT:    pand %xmm6, %xmm2891; SSE41-NEXT:    pand %xmm4, %xmm0892; SSE41-NEXT:    pand %xmm2, %xmm0893; SSE41-NEXT:    pand %xmm1, %xmm0894; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1895; SSE41-NEXT:    ptest %xmm1, %xmm0896; SSE41-NEXT:    setb %al897; SSE41-NEXT:    retq898;899; AVX1-LABEL: test_v128i8:900; AVX1:       # %bb.0:901; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1902; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0903; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0904; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1905; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1906; AVX1-NEXT:    vptest %ymm1, %ymm0907; AVX1-NEXT:    setb %al908; AVX1-NEXT:    vzeroupper909; AVX1-NEXT:    retq910;911; AVX2-LABEL: test_v128i8:912; AVX2:       # %bb.0:913; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1914; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0915; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0916; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1917; AVX2-NEXT:    vptest %ymm1, %ymm0918; AVX2-NEXT:    setb %al919; AVX2-NEXT:    vzeroupper920; AVX2-NEXT:    retq921;922; AVX512-LABEL: test_v128i8:923; AVX512:       # %bb.0:924; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm0925; AVX512-NEXT:    vpternlogd {{.*#+}} zmm1 = -1926; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0927; AVX512-NEXT:    kortestw %k0, %k0928; AVX512-NEXT:    sete %al929; AVX512-NEXT:    vzeroupper930; AVX512-NEXT:    retq931  %1 = call i8 @llvm.vector.reduce.and.v128i8(<128 x i8> %a0)932  %2 = icmp eq i8 %1, -1933  ret i1 %2934}935 936declare i64 @llvm.vector.reduce.and.v2i64(<2 x i64>)937declare i64 @llvm.vector.reduce.and.v4i64(<4 x i64>)938declare i64 @llvm.vector.reduce.and.v8i64(<8 x i64>)939declare i64 @llvm.vector.reduce.and.v16i64(<16 x i64>)940 941declare i32 @llvm.vector.reduce.and.v2i32(<2 x i32>)942declare i32 @llvm.vector.reduce.and.v4i32(<4 x i32>)943declare i32 @llvm.vector.reduce.and.v8i32(<8 x i32>)944declare i32 @llvm.vector.reduce.and.v16i32(<16 x i32>)945declare i32 @llvm.vector.reduce.and.v32i32(<32 x i32>)946 947declare i16 @llvm.vector.reduce.and.v2i16(<2 x i16>)948declare i16 @llvm.vector.reduce.and.v4i16(<4 x i16>)949declare i16 @llvm.vector.reduce.and.v8i16(<8 x i16>)950declare i16 @llvm.vector.reduce.and.v16i16(<16 x i16>)951declare i16 @llvm.vector.reduce.and.v32i16(<32 x i16>)952declare i16 @llvm.vector.reduce.and.v64i16(<64 x i16>)953 954declare i8 @llvm.vector.reduce.and.v2i8(<2 x i8>)955declare i8 @llvm.vector.reduce.and.v4i8(<4 x i8>)956declare i8 @llvm.vector.reduce.and.v8i8(<8 x i8>)957declare i8 @llvm.vector.reduce.and.v16i8(<16 x i8>)958declare i8 @llvm.vector.reduce.and.v32i8(<32 x i8>)959declare i8 @llvm.vector.reduce.and.v64i8(<64 x i8>)960declare i8 @llvm.vector.reduce.and.v128i8(<128 x i8>)961;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:962; AVX1OR2: {{.*}}963; AVX512BW: {{.*}}964; AVX512BWVL: {{.*}}965; AVX512F: {{.*}}966