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