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