2263 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,SSE4,SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,SSE4,SSE425; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL9 10;11; vXi6412;13 14define i64 @test_v2i64(<2 x i64> %a0) {15; SSE2-LABEL: test_v2i64:16; SSE2: # %bb.0:17; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]18; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]19; SSE2-NEXT: movdqa %xmm0, %xmm320; SSE2-NEXT: pxor %xmm2, %xmm321; SSE2-NEXT: pxor %xmm1, %xmm222; SSE2-NEXT: movdqa %xmm3, %xmm423; SSE2-NEXT: pcmpgtd %xmm2, %xmm424; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]25; SSE2-NEXT: pcmpeqd %xmm3, %xmm226; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]27; SSE2-NEXT: pand %xmm5, %xmm228; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]29; SSE2-NEXT: por %xmm2, %xmm330; SSE2-NEXT: pand %xmm3, %xmm031; SSE2-NEXT: pandn %xmm1, %xmm332; SSE2-NEXT: por %xmm0, %xmm333; SSE2-NEXT: movq %xmm3, %rax34; SSE2-NEXT: retq35;36; SSE41-LABEL: test_v2i64:37; SSE41: # %bb.0:38; SSE41-NEXT: movdqa %xmm0, %xmm139; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]40; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]41; SSE41-NEXT: movdqa %xmm1, %xmm342; SSE41-NEXT: pxor %xmm0, %xmm343; SSE41-NEXT: pxor %xmm2, %xmm044; SSE41-NEXT: movdqa %xmm3, %xmm445; SSE41-NEXT: pcmpeqd %xmm0, %xmm446; SSE41-NEXT: pcmpgtd %xmm0, %xmm347; SSE41-NEXT: pmovsxdq %xmm3, %xmm048; SSE41-NEXT: pand %xmm4, %xmm049; SSE41-NEXT: por %xmm3, %xmm050; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm251; SSE41-NEXT: movq %xmm2, %rax52; SSE41-NEXT: retq53;54; SSE42-LABEL: test_v2i64:55; SSE42: # %bb.0:56; SSE42-NEXT: movdqa %xmm0, %xmm157; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]58; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]59; SSE42-NEXT: pxor %xmm3, %xmm060; SSE42-NEXT: pxor %xmm2, %xmm361; SSE42-NEXT: pcmpgtq %xmm3, %xmm062; SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm263; SSE42-NEXT: movq %xmm2, %rax64; SSE42-NEXT: retq65;66; AVX1-LABEL: test_v2i64:67; AVX1: # %bb.0:68; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]69; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]70; AVX1-NEXT: # xmm2 = mem[0,0]71; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm372; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm273; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm274; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm075; AVX1-NEXT: vmovq %xmm0, %rax76; AVX1-NEXT: retq77;78; AVX2-LABEL: test_v2i64:79; AVX2: # %bb.0:80; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]81; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]82; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm383; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm284; AVX2-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm285; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm086; AVX2-NEXT: vmovq %xmm0, %rax87; AVX2-NEXT: retq88;89; AVX512BW-LABEL: test_v2i64:90; AVX512BW: # %bb.0:91; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm092; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]93; AVX512BW-NEXT: vpmaxuq %zmm1, %zmm0, %zmm094; AVX512BW-NEXT: vmovq %xmm0, %rax95; AVX512BW-NEXT: vzeroupper96; AVX512BW-NEXT: retq97;98; AVX512VL-LABEL: test_v2i64:99; AVX512VL: # %bb.0:100; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]101; AVX512VL-NEXT: vpmaxuq %xmm1, %xmm0, %xmm0102; AVX512VL-NEXT: vmovq %xmm0, %rax103; AVX512VL-NEXT: retq104 %1 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> %a0)105 ret i64 %1106}107 108define i64 @test_v4i64(<4 x i64> %a0) {109; SSE2-LABEL: test_v4i64:110; SSE2: # %bb.0:111; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]112; SSE2-NEXT: movdqa %xmm1, %xmm3113; SSE2-NEXT: pxor %xmm2, %xmm3114; SSE2-NEXT: movdqa %xmm0, %xmm4115; SSE2-NEXT: pxor %xmm2, %xmm4116; SSE2-NEXT: movdqa %xmm4, %xmm5117; SSE2-NEXT: pcmpgtd %xmm3, %xmm5118; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]119; SSE2-NEXT: pcmpeqd %xmm3, %xmm4120; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]121; SSE2-NEXT: pand %xmm6, %xmm3122; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]123; SSE2-NEXT: por %xmm3, %xmm4124; SSE2-NEXT: pand %xmm4, %xmm0125; SSE2-NEXT: pandn %xmm1, %xmm4126; SSE2-NEXT: por %xmm0, %xmm4127; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]128; SSE2-NEXT: movdqa %xmm4, %xmm1129; SSE2-NEXT: pxor %xmm2, %xmm1130; SSE2-NEXT: pxor %xmm0, %xmm2131; SSE2-NEXT: movdqa %xmm1, %xmm3132; SSE2-NEXT: pcmpgtd %xmm2, %xmm3133; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]134; SSE2-NEXT: pcmpeqd %xmm1, %xmm2135; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]136; SSE2-NEXT: pand %xmm5, %xmm1137; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]138; SSE2-NEXT: por %xmm1, %xmm2139; SSE2-NEXT: pand %xmm2, %xmm4140; SSE2-NEXT: pandn %xmm0, %xmm2141; SSE2-NEXT: por %xmm4, %xmm2142; SSE2-NEXT: movq %xmm2, %rax143; SSE2-NEXT: retq144;145; SSE41-LABEL: test_v4i64:146; SSE41: # %bb.0:147; SSE41-NEXT: movdqa %xmm0, %xmm2148; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]149; SSE41-NEXT: movdqa %xmm1, %xmm0150; SSE41-NEXT: pxor %xmm3, %xmm0151; SSE41-NEXT: movdqa %xmm2, %xmm4152; SSE41-NEXT: pxor %xmm3, %xmm4153; SSE41-NEXT: movdqa %xmm4, %xmm5154; SSE41-NEXT: pcmpeqd %xmm0, %xmm5155; SSE41-NEXT: pcmpgtd %xmm0, %xmm4156; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]157; SSE41-NEXT: pand %xmm5, %xmm0158; SSE41-NEXT: por %xmm4, %xmm0159; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1160; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]161; SSE41-NEXT: movdqa %xmm1, %xmm4162; SSE41-NEXT: pxor %xmm3, %xmm4163; SSE41-NEXT: pxor %xmm2, %xmm3164; SSE41-NEXT: movdqa %xmm4, %xmm5165; SSE41-NEXT: pcmpeqd %xmm3, %xmm5166; SSE41-NEXT: pcmpgtd %xmm3, %xmm4167; SSE41-NEXT: pmovsxdq %xmm4, %xmm0168; SSE41-NEXT: pand %xmm5, %xmm0169; SSE41-NEXT: por %xmm4, %xmm0170; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2171; SSE41-NEXT: movq %xmm2, %rax172; SSE41-NEXT: retq173;174; SSE42-LABEL: test_v4i64:175; SSE42: # %bb.0:176; SSE42-NEXT: movdqa %xmm0, %xmm2177; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]178; SSE42-NEXT: movdqa %xmm1, %xmm4179; SSE42-NEXT: pxor %xmm3, %xmm4180; SSE42-NEXT: pxor %xmm3, %xmm0181; SSE42-NEXT: pcmpgtq %xmm4, %xmm0182; SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm1183; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]184; SSE42-NEXT: movdqa %xmm1, %xmm0185; SSE42-NEXT: pxor %xmm3, %xmm0186; SSE42-NEXT: pxor %xmm2, %xmm3187; SSE42-NEXT: pcmpgtq %xmm3, %xmm0188; SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm2189; SSE42-NEXT: movq %xmm2, %rax190; SSE42-NEXT: retq191;192; AVX1-LABEL: test_v4i64:193; AVX1: # %bb.0:194; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1195; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]196; AVX1-NEXT: # xmm2 = mem[0,0]197; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm3198; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm4199; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3200; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0201; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]202; AVX1-NEXT: vxorpd %xmm2, %xmm0, %xmm3203; AVX1-NEXT: vxorpd %xmm2, %xmm1, %xmm2204; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2205; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0206; AVX1-NEXT: vmovq %xmm0, %rax207; AVX1-NEXT: vzeroupper208; AVX1-NEXT: retq209;210; AVX2-LABEL: test_v4i64:211; AVX2: # %bb.0:212; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1213; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]214; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm3215; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm4216; AVX2-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3217; AVX2-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0218; AVX2-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]219; AVX2-NEXT: vxorpd %xmm2, %xmm0, %xmm3220; AVX2-NEXT: vxorpd %xmm2, %xmm1, %xmm2221; AVX2-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2222; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0223; AVX2-NEXT: vmovq %xmm0, %rax224; AVX2-NEXT: vzeroupper225; AVX2-NEXT: retq226;227; AVX512BW-LABEL: test_v4i64:228; AVX512BW: # %bb.0:229; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0230; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1231; AVX512BW-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0232; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]233; AVX512BW-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0234; AVX512BW-NEXT: vmovq %xmm0, %rax235; AVX512BW-NEXT: vzeroupper236; AVX512BW-NEXT: retq237;238; AVX512VL-LABEL: test_v4i64:239; AVX512VL: # %bb.0:240; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1241; AVX512VL-NEXT: vpmaxuq %xmm1, %xmm0, %xmm0242; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]243; AVX512VL-NEXT: vpmaxuq %xmm1, %xmm0, %xmm0244; AVX512VL-NEXT: vmovq %xmm0, %rax245; AVX512VL-NEXT: vzeroupper246; AVX512VL-NEXT: retq247 %1 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> %a0)248 ret i64 %1249}250 251define i64 @test_v8i64(<8 x i64> %a0) {252; SSE2-LABEL: test_v8i64:253; SSE2: # %bb.0:254; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]255; SSE2-NEXT: movdqa %xmm2, %xmm5256; SSE2-NEXT: pxor %xmm4, %xmm5257; SSE2-NEXT: movdqa %xmm0, %xmm6258; SSE2-NEXT: pxor %xmm4, %xmm6259; SSE2-NEXT: movdqa %xmm6, %xmm7260; SSE2-NEXT: pcmpgtd %xmm5, %xmm7261; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]262; SSE2-NEXT: pcmpeqd %xmm5, %xmm6263; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]264; SSE2-NEXT: pand %xmm8, %xmm6265; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]266; SSE2-NEXT: por %xmm6, %xmm5267; SSE2-NEXT: pand %xmm5, %xmm0268; SSE2-NEXT: pandn %xmm2, %xmm5269; SSE2-NEXT: por %xmm0, %xmm5270; SSE2-NEXT: movdqa %xmm3, %xmm0271; SSE2-NEXT: pxor %xmm4, %xmm0272; SSE2-NEXT: movdqa %xmm1, %xmm2273; SSE2-NEXT: pxor %xmm4, %xmm2274; SSE2-NEXT: movdqa %xmm2, %xmm6275; SSE2-NEXT: pcmpgtd %xmm0, %xmm6276; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]277; SSE2-NEXT: pcmpeqd %xmm0, %xmm2278; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]279; SSE2-NEXT: pand %xmm7, %xmm0280; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]281; SSE2-NEXT: por %xmm0, %xmm2282; SSE2-NEXT: pand %xmm2, %xmm1283; SSE2-NEXT: pandn %xmm3, %xmm2284; SSE2-NEXT: por %xmm1, %xmm2285; SSE2-NEXT: movdqa %xmm2, %xmm0286; SSE2-NEXT: pxor %xmm4, %xmm0287; SSE2-NEXT: movdqa %xmm5, %xmm1288; SSE2-NEXT: pxor %xmm4, %xmm1289; SSE2-NEXT: movdqa %xmm1, %xmm3290; SSE2-NEXT: pcmpgtd %xmm0, %xmm3291; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]292; SSE2-NEXT: pcmpeqd %xmm0, %xmm1293; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]294; SSE2-NEXT: pand %xmm6, %xmm0295; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]296; SSE2-NEXT: por %xmm0, %xmm1297; SSE2-NEXT: pand %xmm1, %xmm5298; SSE2-NEXT: pandn %xmm2, %xmm1299; SSE2-NEXT: por %xmm5, %xmm1300; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]301; SSE2-NEXT: movdqa %xmm1, %xmm2302; SSE2-NEXT: pxor %xmm4, %xmm2303; SSE2-NEXT: pxor %xmm0, %xmm4304; SSE2-NEXT: movdqa %xmm2, %xmm3305; SSE2-NEXT: pcmpgtd %xmm4, %xmm3306; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]307; SSE2-NEXT: pcmpeqd %xmm2, %xmm4308; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]309; SSE2-NEXT: pand %xmm5, %xmm2310; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]311; SSE2-NEXT: por %xmm2, %xmm3312; SSE2-NEXT: pand %xmm3, %xmm1313; SSE2-NEXT: pandn %xmm0, %xmm3314; SSE2-NEXT: por %xmm1, %xmm3315; SSE2-NEXT: movq %xmm3, %rax316; SSE2-NEXT: retq317;318; SSE41-LABEL: test_v8i64:319; SSE41: # %bb.0:320; SSE41-NEXT: movdqa %xmm0, %xmm4321; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]322; SSE41-NEXT: movdqa %xmm2, %xmm0323; SSE41-NEXT: pxor %xmm5, %xmm0324; SSE41-NEXT: movdqa %xmm4, %xmm6325; SSE41-NEXT: pxor %xmm5, %xmm6326; SSE41-NEXT: movdqa %xmm6, %xmm7327; SSE41-NEXT: pcmpeqd %xmm0, %xmm7328; SSE41-NEXT: pcmpgtd %xmm0, %xmm6329; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]330; SSE41-NEXT: pand %xmm7, %xmm0331; SSE41-NEXT: por %xmm6, %xmm0332; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2333; SSE41-NEXT: movdqa %xmm3, %xmm0334; SSE41-NEXT: pxor %xmm5, %xmm0335; SSE41-NEXT: movdqa %xmm1, %xmm4336; SSE41-NEXT: pxor %xmm5, %xmm4337; SSE41-NEXT: movdqa %xmm4, %xmm6338; SSE41-NEXT: pcmpeqd %xmm0, %xmm6339; SSE41-NEXT: pcmpgtd %xmm0, %xmm4340; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]341; SSE41-NEXT: pand %xmm6, %xmm0342; SSE41-NEXT: por %xmm4, %xmm0343; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3344; SSE41-NEXT: movapd %xmm3, %xmm0345; SSE41-NEXT: xorpd %xmm5, %xmm0346; SSE41-NEXT: movapd %xmm2, %xmm1347; SSE41-NEXT: xorpd %xmm5, %xmm1348; SSE41-NEXT: movapd %xmm1, %xmm4349; SSE41-NEXT: pcmpeqd %xmm0, %xmm4350; SSE41-NEXT: pcmpgtd %xmm0, %xmm1351; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]352; SSE41-NEXT: pand %xmm4, %xmm0353; SSE41-NEXT: por %xmm1, %xmm0354; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3355; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]356; SSE41-NEXT: movdqa %xmm3, %xmm2357; SSE41-NEXT: pxor %xmm5, %xmm2358; SSE41-NEXT: pxor %xmm1, %xmm5359; SSE41-NEXT: movdqa %xmm2, %xmm4360; SSE41-NEXT: pcmpeqd %xmm5, %xmm4361; SSE41-NEXT: pcmpgtd %xmm5, %xmm2362; SSE41-NEXT: pmovsxdq %xmm2, %xmm0363; SSE41-NEXT: pand %xmm4, %xmm0364; SSE41-NEXT: por %xmm2, %xmm0365; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1366; SSE41-NEXT: movq %xmm1, %rax367; SSE41-NEXT: retq368;369; SSE42-LABEL: test_v8i64:370; SSE42: # %bb.0:371; SSE42-NEXT: movdqa %xmm0, %xmm4372; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]373; SSE42-NEXT: movdqa %xmm2, %xmm6374; SSE42-NEXT: pxor %xmm5, %xmm6375; SSE42-NEXT: pxor %xmm5, %xmm0376; SSE42-NEXT: pcmpgtq %xmm6, %xmm0377; SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm2378; SSE42-NEXT: movdqa %xmm3, %xmm4379; SSE42-NEXT: pxor %xmm5, %xmm4380; SSE42-NEXT: movdqa %xmm1, %xmm0381; SSE42-NEXT: pxor %xmm5, %xmm0382; SSE42-NEXT: pcmpgtq %xmm4, %xmm0383; SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm3384; SSE42-NEXT: movapd %xmm3, %xmm1385; SSE42-NEXT: xorpd %xmm5, %xmm1386; SSE42-NEXT: movapd %xmm2, %xmm0387; SSE42-NEXT: xorpd %xmm5, %xmm0388; SSE42-NEXT: pcmpgtq %xmm1, %xmm0389; SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm3390; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]391; SSE42-NEXT: movdqa %xmm3, %xmm0392; SSE42-NEXT: pxor %xmm5, %xmm0393; SSE42-NEXT: pxor %xmm1, %xmm5394; SSE42-NEXT: pcmpgtq %xmm5, %xmm0395; SSE42-NEXT: blendvpd %xmm0, %xmm3, %xmm1396; SSE42-NEXT: movq %xmm1, %rax397; SSE42-NEXT: retq398;399; AVX1-LABEL: test_v8i64:400; AVX1: # %bb.0:401; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]402; AVX1-NEXT: # xmm2 = mem[0,0]403; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm3404; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm4405; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3406; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm3407; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1408; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm4409; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0410; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm5411; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4412; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm1, %xmm0413; AVX1-NEXT: vxorpd %xmm2, %xmm0, %xmm1414; AVX1-NEXT: vxorpd %xmm2, %xmm3, %xmm4415; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm1416; AVX1-NEXT: vblendvpd %xmm1, %xmm3, %xmm0, %xmm0417; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]418; AVX1-NEXT: vxorpd %xmm2, %xmm0, %xmm3419; AVX1-NEXT: vxorpd %xmm2, %xmm1, %xmm2420; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2421; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0422; AVX1-NEXT: vmovq %xmm0, %rax423; AVX1-NEXT: vzeroupper424; AVX1-NEXT: retq425;426; AVX2-LABEL: test_v8i64:427; AVX2: # %bb.0:428; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]429; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm3430; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm4431; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm3432; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0433; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1434; AVX2-NEXT: vxorpd %xmm2, %xmm1, %xmm3435; AVX2-NEXT: vxorpd %xmm2, %xmm0, %xmm4436; AVX2-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3437; AVX2-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0438; AVX2-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]439; AVX2-NEXT: vxorpd %xmm2, %xmm0, %xmm3440; AVX2-NEXT: vxorpd %xmm2, %xmm1, %xmm2441; AVX2-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2442; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0443; AVX2-NEXT: vmovq %xmm0, %rax444; AVX2-NEXT: vzeroupper445; AVX2-NEXT: retq446;447; AVX512BW-LABEL: test_v8i64:448; AVX512BW: # %bb.0:449; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1450; AVX512BW-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0451; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1452; AVX512BW-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0453; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]454; AVX512BW-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0455; AVX512BW-NEXT: vmovq %xmm0, %rax456; AVX512BW-NEXT: vzeroupper457; AVX512BW-NEXT: retq458;459; AVX512VL-LABEL: test_v8i64:460; AVX512VL: # %bb.0:461; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1462; AVX512VL-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0463; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1464; AVX512VL-NEXT: vpmaxuq %xmm1, %xmm0, %xmm0465; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]466; AVX512VL-NEXT: vpmaxuq %xmm1, %xmm0, %xmm0467; AVX512VL-NEXT: vmovq %xmm0, %rax468; AVX512VL-NEXT: vzeroupper469; AVX512VL-NEXT: retq470 %1 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> %a0)471 ret i64 %1472}473 474define i64 @test_v16i64(<16 x i64> %a0) {475; SSE2-LABEL: test_v16i64:476; SSE2: # %bb.0:477; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]478; SSE2-NEXT: movdqa %xmm5, %xmm9479; SSE2-NEXT: pxor %xmm8, %xmm9480; SSE2-NEXT: movdqa %xmm1, %xmm10481; SSE2-NEXT: pxor %xmm8, %xmm10482; SSE2-NEXT: movdqa %xmm10, %xmm11483; SSE2-NEXT: pcmpgtd %xmm9, %xmm11484; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]485; SSE2-NEXT: pcmpeqd %xmm9, %xmm10486; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]487; SSE2-NEXT: pand %xmm12, %xmm10488; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm11[1,1,3,3]489; SSE2-NEXT: por %xmm10, %xmm9490; SSE2-NEXT: pand %xmm9, %xmm1491; SSE2-NEXT: pandn %xmm5, %xmm9492; SSE2-NEXT: por %xmm1, %xmm9493; SSE2-NEXT: movdqa %xmm7, %xmm1494; SSE2-NEXT: pxor %xmm8, %xmm1495; SSE2-NEXT: movdqa %xmm3, %xmm5496; SSE2-NEXT: pxor %xmm8, %xmm5497; SSE2-NEXT: movdqa %xmm5, %xmm10498; SSE2-NEXT: pcmpgtd %xmm1, %xmm10499; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]500; SSE2-NEXT: pcmpeqd %xmm1, %xmm5501; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]502; SSE2-NEXT: pand %xmm11, %xmm5503; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm10[1,1,3,3]504; SSE2-NEXT: por %xmm5, %xmm1505; SSE2-NEXT: pand %xmm1, %xmm3506; SSE2-NEXT: pandn %xmm7, %xmm1507; SSE2-NEXT: por %xmm3, %xmm1508; SSE2-NEXT: movdqa %xmm4, %xmm3509; SSE2-NEXT: pxor %xmm8, %xmm3510; SSE2-NEXT: movdqa %xmm0, %xmm5511; SSE2-NEXT: pxor %xmm8, %xmm5512; SSE2-NEXT: movdqa %xmm5, %xmm7513; SSE2-NEXT: pcmpgtd %xmm3, %xmm7514; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]515; SSE2-NEXT: pcmpeqd %xmm3, %xmm5516; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]517; SSE2-NEXT: pand %xmm10, %xmm5518; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]519; SSE2-NEXT: por %xmm5, %xmm3520; SSE2-NEXT: pand %xmm3, %xmm0521; SSE2-NEXT: pandn %xmm4, %xmm3522; SSE2-NEXT: por %xmm0, %xmm3523; SSE2-NEXT: movdqa %xmm6, %xmm0524; SSE2-NEXT: pxor %xmm8, %xmm0525; SSE2-NEXT: movdqa %xmm2, %xmm4526; SSE2-NEXT: pxor %xmm8, %xmm4527; SSE2-NEXT: movdqa %xmm4, %xmm5528; SSE2-NEXT: pcmpgtd %xmm0, %xmm5529; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]530; SSE2-NEXT: pcmpeqd %xmm0, %xmm4531; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]532; SSE2-NEXT: pand %xmm7, %xmm0533; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]534; SSE2-NEXT: por %xmm0, %xmm4535; SSE2-NEXT: pand %xmm4, %xmm2536; SSE2-NEXT: pandn %xmm6, %xmm4537; SSE2-NEXT: por %xmm2, %xmm4538; SSE2-NEXT: movdqa %xmm4, %xmm0539; SSE2-NEXT: pxor %xmm8, %xmm0540; SSE2-NEXT: movdqa %xmm3, %xmm2541; SSE2-NEXT: pxor %xmm8, %xmm2542; SSE2-NEXT: movdqa %xmm2, %xmm5543; SSE2-NEXT: pcmpgtd %xmm0, %xmm5544; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]545; SSE2-NEXT: pcmpeqd %xmm0, %xmm2546; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]547; SSE2-NEXT: pand %xmm6, %xmm2548; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]549; SSE2-NEXT: por %xmm2, %xmm0550; SSE2-NEXT: pand %xmm0, %xmm3551; SSE2-NEXT: pandn %xmm4, %xmm0552; SSE2-NEXT: por %xmm3, %xmm0553; SSE2-NEXT: movdqa %xmm1, %xmm2554; SSE2-NEXT: pxor %xmm8, %xmm2555; SSE2-NEXT: movdqa %xmm9, %xmm3556; SSE2-NEXT: pxor %xmm8, %xmm3557; SSE2-NEXT: movdqa %xmm3, %xmm4558; SSE2-NEXT: pcmpgtd %xmm2, %xmm4559; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]560; SSE2-NEXT: pcmpeqd %xmm2, %xmm3561; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]562; SSE2-NEXT: pand %xmm5, %xmm2563; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]564; SSE2-NEXT: por %xmm2, %xmm3565; SSE2-NEXT: pand %xmm3, %xmm9566; SSE2-NEXT: pandn %xmm1, %xmm3567; SSE2-NEXT: por %xmm9, %xmm3568; SSE2-NEXT: movdqa %xmm3, %xmm1569; SSE2-NEXT: pxor %xmm8, %xmm1570; SSE2-NEXT: movdqa %xmm0, %xmm2571; SSE2-NEXT: pxor %xmm8, %xmm2572; SSE2-NEXT: movdqa %xmm2, %xmm4573; SSE2-NEXT: pcmpgtd %xmm1, %xmm4574; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]575; SSE2-NEXT: pcmpeqd %xmm1, %xmm2576; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]577; SSE2-NEXT: pand %xmm5, %xmm1578; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]579; SSE2-NEXT: por %xmm1, %xmm2580; SSE2-NEXT: pand %xmm2, %xmm0581; SSE2-NEXT: pandn %xmm3, %xmm2582; SSE2-NEXT: por %xmm0, %xmm2583; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]584; SSE2-NEXT: movdqa %xmm2, %xmm1585; SSE2-NEXT: pxor %xmm8, %xmm1586; SSE2-NEXT: pxor %xmm0, %xmm8587; SSE2-NEXT: movdqa %xmm1, %xmm3588; SSE2-NEXT: pcmpgtd %xmm8, %xmm3589; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]590; SSE2-NEXT: pcmpeqd %xmm1, %xmm8591; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]592; SSE2-NEXT: pand %xmm4, %xmm1593; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]594; SSE2-NEXT: por %xmm1, %xmm3595; SSE2-NEXT: pand %xmm3, %xmm2596; SSE2-NEXT: pandn %xmm0, %xmm3597; SSE2-NEXT: por %xmm2, %xmm3598; SSE2-NEXT: movq %xmm3, %rax599; SSE2-NEXT: retq600;601; SSE41-LABEL: test_v16i64:602; SSE41: # %bb.0:603; SSE41-NEXT: movdqa %xmm0, %xmm8604; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]605; SSE41-NEXT: movdqa %xmm5, %xmm0606; SSE41-NEXT: pxor %xmm9, %xmm0607; SSE41-NEXT: movdqa %xmm1, %xmm10608; SSE41-NEXT: pxor %xmm9, %xmm10609; SSE41-NEXT: movdqa %xmm10, %xmm11610; SSE41-NEXT: pcmpeqd %xmm0, %xmm11611; SSE41-NEXT: pcmpgtd %xmm0, %xmm10612; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm10[0,0,2,2]613; SSE41-NEXT: pand %xmm11, %xmm0614; SSE41-NEXT: por %xmm10, %xmm0615; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5616; SSE41-NEXT: movdqa %xmm7, %xmm0617; SSE41-NEXT: pxor %xmm9, %xmm0618; SSE41-NEXT: movdqa %xmm3, %xmm1619; SSE41-NEXT: pxor %xmm9, %xmm1620; SSE41-NEXT: movdqa %xmm1, %xmm10621; SSE41-NEXT: pcmpeqd %xmm0, %xmm10622; SSE41-NEXT: pcmpgtd %xmm0, %xmm1623; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]624; SSE41-NEXT: pand %xmm10, %xmm0625; SSE41-NEXT: por %xmm1, %xmm0626; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm7627; SSE41-NEXT: movdqa %xmm4, %xmm0628; SSE41-NEXT: pxor %xmm9, %xmm0629; SSE41-NEXT: movdqa %xmm8, %xmm1630; SSE41-NEXT: pxor %xmm9, %xmm1631; SSE41-NEXT: movdqa %xmm1, %xmm3632; SSE41-NEXT: pcmpeqd %xmm0, %xmm3633; SSE41-NEXT: pcmpgtd %xmm0, %xmm1634; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]635; SSE41-NEXT: pand %xmm3, %xmm0636; SSE41-NEXT: por %xmm1, %xmm0637; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm4638; SSE41-NEXT: movdqa %xmm6, %xmm0639; SSE41-NEXT: pxor %xmm9, %xmm0640; SSE41-NEXT: movdqa %xmm2, %xmm1641; SSE41-NEXT: pxor %xmm9, %xmm1642; SSE41-NEXT: movdqa %xmm1, %xmm3643; SSE41-NEXT: pcmpeqd %xmm0, %xmm3644; SSE41-NEXT: pcmpgtd %xmm0, %xmm1645; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]646; SSE41-NEXT: pand %xmm3, %xmm0647; SSE41-NEXT: por %xmm1, %xmm0648; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm6649; SSE41-NEXT: movapd %xmm6, %xmm0650; SSE41-NEXT: xorpd %xmm9, %xmm0651; SSE41-NEXT: movapd %xmm4, %xmm1652; SSE41-NEXT: xorpd %xmm9, %xmm1653; SSE41-NEXT: movapd %xmm1, %xmm2654; SSE41-NEXT: pcmpeqd %xmm0, %xmm2655; SSE41-NEXT: pcmpgtd %xmm0, %xmm1656; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]657; SSE41-NEXT: pand %xmm2, %xmm0658; SSE41-NEXT: por %xmm1, %xmm0659; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm6660; SSE41-NEXT: movapd %xmm7, %xmm0661; SSE41-NEXT: xorpd %xmm9, %xmm0662; SSE41-NEXT: movapd %xmm5, %xmm1663; SSE41-NEXT: xorpd %xmm9, %xmm1664; SSE41-NEXT: movapd %xmm1, %xmm2665; SSE41-NEXT: pcmpeqd %xmm0, %xmm2666; SSE41-NEXT: pcmpgtd %xmm0, %xmm1667; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]668; SSE41-NEXT: pand %xmm2, %xmm0669; SSE41-NEXT: por %xmm1, %xmm0670; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm7671; SSE41-NEXT: movapd %xmm7, %xmm0672; SSE41-NEXT: xorpd %xmm9, %xmm0673; SSE41-NEXT: movapd %xmm6, %xmm1674; SSE41-NEXT: xorpd %xmm9, %xmm1675; SSE41-NEXT: movapd %xmm1, %xmm2676; SSE41-NEXT: pcmpeqd %xmm0, %xmm2677; SSE41-NEXT: pcmpgtd %xmm0, %xmm1678; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]679; SSE41-NEXT: pand %xmm2, %xmm0680; SSE41-NEXT: por %xmm1, %xmm0681; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm7682; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm7[2,3,2,3]683; SSE41-NEXT: movdqa %xmm7, %xmm2684; SSE41-NEXT: pxor %xmm9, %xmm2685; SSE41-NEXT: pxor %xmm1, %xmm9686; SSE41-NEXT: movdqa %xmm2, %xmm3687; SSE41-NEXT: pcmpeqd %xmm9, %xmm3688; SSE41-NEXT: pcmpgtd %xmm9, %xmm2689; SSE41-NEXT: pmovsxdq %xmm2, %xmm0690; SSE41-NEXT: pand %xmm3, %xmm0691; SSE41-NEXT: por %xmm2, %xmm0692; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1693; SSE41-NEXT: movq %xmm1, %rax694; SSE41-NEXT: retq695;696; SSE42-LABEL: test_v16i64:697; SSE42: # %bb.0:698; SSE42-NEXT: movdqa %xmm0, %xmm8699; SSE42-NEXT: movdqa {{.*#+}} xmm9 = [9223372036854775808,9223372036854775808]700; SSE42-NEXT: movdqa %xmm5, %xmm10701; SSE42-NEXT: pxor %xmm9, %xmm10702; SSE42-NEXT: movdqa %xmm1, %xmm0703; SSE42-NEXT: pxor %xmm9, %xmm0704; SSE42-NEXT: pcmpgtq %xmm10, %xmm0705; SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm5706; SSE42-NEXT: movdqa %xmm7, %xmm1707; SSE42-NEXT: pxor %xmm9, %xmm1708; SSE42-NEXT: movdqa %xmm3, %xmm0709; SSE42-NEXT: pxor %xmm9, %xmm0710; SSE42-NEXT: pcmpgtq %xmm1, %xmm0711; SSE42-NEXT: blendvpd %xmm0, %xmm3, %xmm7712; SSE42-NEXT: movdqa %xmm4, %xmm1713; SSE42-NEXT: pxor %xmm9, %xmm1714; SSE42-NEXT: movdqa %xmm8, %xmm0715; SSE42-NEXT: pxor %xmm9, %xmm0716; SSE42-NEXT: pcmpgtq %xmm1, %xmm0717; SSE42-NEXT: blendvpd %xmm0, %xmm8, %xmm4718; SSE42-NEXT: movdqa %xmm6, %xmm1719; SSE42-NEXT: pxor %xmm9, %xmm1720; SSE42-NEXT: movdqa %xmm2, %xmm0721; SSE42-NEXT: pxor %xmm9, %xmm0722; SSE42-NEXT: pcmpgtq %xmm1, %xmm0723; SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm6724; SSE42-NEXT: movapd %xmm6, %xmm1725; SSE42-NEXT: xorpd %xmm9, %xmm1726; SSE42-NEXT: movapd %xmm4, %xmm0727; SSE42-NEXT: xorpd %xmm9, %xmm0728; SSE42-NEXT: pcmpgtq %xmm1, %xmm0729; SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm6730; SSE42-NEXT: movapd %xmm7, %xmm1731; SSE42-NEXT: xorpd %xmm9, %xmm1732; SSE42-NEXT: movapd %xmm5, %xmm0733; SSE42-NEXT: xorpd %xmm9, %xmm0734; SSE42-NEXT: pcmpgtq %xmm1, %xmm0735; SSE42-NEXT: blendvpd %xmm0, %xmm5, %xmm7736; SSE42-NEXT: movapd %xmm7, %xmm1737; SSE42-NEXT: xorpd %xmm9, %xmm1738; SSE42-NEXT: movapd %xmm6, %xmm0739; SSE42-NEXT: xorpd %xmm9, %xmm0740; SSE42-NEXT: pcmpgtq %xmm1, %xmm0741; SSE42-NEXT: blendvpd %xmm0, %xmm6, %xmm7742; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm7[2,3,2,3]743; SSE42-NEXT: movdqa %xmm7, %xmm0744; SSE42-NEXT: pxor %xmm9, %xmm0745; SSE42-NEXT: pxor %xmm1, %xmm9746; SSE42-NEXT: pcmpgtq %xmm9, %xmm0747; SSE42-NEXT: blendvpd %xmm0, %xmm7, %xmm1748; SSE42-NEXT: movq %xmm1, %rax749; SSE42-NEXT: retq750;751; AVX1-LABEL: test_v16i64:752; AVX1: # %bb.0:753; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5754; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]755; AVX1-NEXT: # xmm4 = mem[0,0]756; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm6757; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7758; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm8759; AVX1-NEXT: vpcmpgtq %xmm6, %xmm8, %xmm6760; AVX1-NEXT: vblendvpd %xmm6, %xmm7, %xmm5, %xmm5761; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm6762; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm7763; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm8764; AVX1-NEXT: vpxor %xmm4, %xmm8, %xmm9765; AVX1-NEXT: vpcmpgtq %xmm7, %xmm9, %xmm7766; AVX1-NEXT: vblendvpd %xmm7, %xmm8, %xmm6, %xmm6767; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm7768; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm8769; AVX1-NEXT: vpcmpgtq %xmm7, %xmm8, %xmm7770; AVX1-NEXT: vblendvpd %xmm7, %xmm0, %xmm2, %xmm0771; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm2772; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm7773; AVX1-NEXT: vpcmpgtq %xmm2, %xmm7, %xmm2774; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm3, %xmm1775; AVX1-NEXT: vxorpd %xmm4, %xmm1, %xmm2776; AVX1-NEXT: vxorpd %xmm4, %xmm0, %xmm3777; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2778; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0779; AVX1-NEXT: vxorpd %xmm4, %xmm6, %xmm1780; AVX1-NEXT: vxorpd %xmm4, %xmm5, %xmm2781; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm1782; AVX1-NEXT: vblendvpd %xmm1, %xmm5, %xmm6, %xmm1783; AVX1-NEXT: vxorpd %xmm4, %xmm1, %xmm2784; AVX1-NEXT: vxorpd %xmm4, %xmm0, %xmm3785; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2786; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0787; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]788; AVX1-NEXT: vxorpd %xmm4, %xmm0, %xmm2789; AVX1-NEXT: vxorpd %xmm4, %xmm1, %xmm3790; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2791; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0792; AVX1-NEXT: vmovq %xmm0, %rax793; AVX1-NEXT: vzeroupper794; AVX1-NEXT: retq795;796; AVX2-LABEL: test_v16i64:797; AVX2: # %bb.0:798; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]799; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm5800; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm6801; AVX2-NEXT: vpcmpgtq %ymm5, %ymm6, %ymm5802; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm2, %ymm0803; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm2804; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm5805; AVX2-NEXT: vpcmpgtq %ymm2, %ymm5, %ymm2806; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm3, %ymm1807; AVX2-NEXT: vxorpd %ymm4, %ymm1, %ymm2808; AVX2-NEXT: vxorpd %ymm4, %ymm0, %ymm3809; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2810; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0811; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1812; AVX2-NEXT: vxorpd %xmm4, %xmm1, %xmm2813; AVX2-NEXT: vxorpd %xmm4, %xmm0, %xmm3814; AVX2-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2815; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0816; AVX2-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]817; AVX2-NEXT: vxorpd %xmm4, %xmm0, %xmm2818; AVX2-NEXT: vxorpd %xmm4, %xmm1, %xmm3819; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2820; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0821; AVX2-NEXT: vmovq %xmm0, %rax822; AVX2-NEXT: vzeroupper823; AVX2-NEXT: retq824;825; AVX512BW-LABEL: test_v16i64:826; AVX512BW: # %bb.0:827; AVX512BW-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0828; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1829; AVX512BW-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0830; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1831; AVX512BW-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0832; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]833; AVX512BW-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0834; AVX512BW-NEXT: vmovq %xmm0, %rax835; AVX512BW-NEXT: vzeroupper836; AVX512BW-NEXT: retq837;838; AVX512VL-LABEL: test_v16i64:839; AVX512VL: # %bb.0:840; AVX512VL-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0841; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1842; AVX512VL-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0843; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1844; AVX512VL-NEXT: vpmaxuq %xmm1, %xmm0, %xmm0845; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]846; AVX512VL-NEXT: vpmaxuq %xmm1, %xmm0, %xmm0847; AVX512VL-NEXT: vmovq %xmm0, %rax848; AVX512VL-NEXT: vzeroupper849; AVX512VL-NEXT: retq850 %1 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> %a0)851 ret i64 %1852}853 854;855; vXi32856;857 858define i32 @test_v2i32(<2 x i32> %a0) {859; SSE2-LABEL: test_v2i32:860; SSE2: # %bb.0:861; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]862; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]863; SSE2-NEXT: movdqa %xmm0, %xmm3864; SSE2-NEXT: pxor %xmm2, %xmm3865; SSE2-NEXT: pxor %xmm1, %xmm2866; SSE2-NEXT: pcmpgtd %xmm2, %xmm3867; SSE2-NEXT: pand %xmm3, %xmm0868; SSE2-NEXT: pandn %xmm1, %xmm3869; SSE2-NEXT: por %xmm0, %xmm3870; SSE2-NEXT: movd %xmm3, %eax871; SSE2-NEXT: retq872;873; SSE4-LABEL: test_v2i32:874; SSE4: # %bb.0:875; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]876; SSE4-NEXT: pmaxud %xmm0, %xmm1877; SSE4-NEXT: movd %xmm1, %eax878; SSE4-NEXT: retq879;880; AVX-LABEL: test_v2i32:881; AVX: # %bb.0:882; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]883; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0884; AVX-NEXT: vmovd %xmm0, %eax885; AVX-NEXT: retq886;887; AVX512-LABEL: test_v2i32:888; AVX512: # %bb.0:889; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]890; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm0891; AVX512-NEXT: vmovd %xmm0, %eax892; AVX512-NEXT: retq893 %1 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> %a0)894 ret i32 %1895}896 897define i32 @test_v4i32(<4 x i32> %a0) {898; SSE2-LABEL: test_v4i32:899; SSE2: # %bb.0:900; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]901; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]902; SSE2-NEXT: movdqa %xmm0, %xmm3903; SSE2-NEXT: pxor %xmm2, %xmm3904; SSE2-NEXT: movdqa %xmm1, %xmm4905; SSE2-NEXT: pxor %xmm2, %xmm4906; SSE2-NEXT: pcmpgtd %xmm4, %xmm3907; SSE2-NEXT: pand %xmm3, %xmm0908; SSE2-NEXT: pandn %xmm1, %xmm3909; SSE2-NEXT: por %xmm0, %xmm3910; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]911; SSE2-NEXT: movdqa %xmm3, %xmm1912; SSE2-NEXT: pxor %xmm2, %xmm1913; SSE2-NEXT: pxor %xmm0, %xmm2914; SSE2-NEXT: pcmpgtd %xmm2, %xmm1915; SSE2-NEXT: pand %xmm1, %xmm3916; SSE2-NEXT: pandn %xmm0, %xmm1917; SSE2-NEXT: por %xmm3, %xmm1918; SSE2-NEXT: movd %xmm1, %eax919; SSE2-NEXT: retq920;921; SSE4-LABEL: test_v4i32:922; SSE4: # %bb.0:923; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]924; SSE4-NEXT: pmaxud %xmm0, %xmm1925; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]926; SSE4-NEXT: pmaxud %xmm1, %xmm0927; SSE4-NEXT: movd %xmm0, %eax928; SSE4-NEXT: retq929;930; AVX-LABEL: test_v4i32:931; AVX: # %bb.0:932; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]933; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0934; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]935; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0936; AVX-NEXT: vmovd %xmm0, %eax937; AVX-NEXT: retq938;939; AVX512-LABEL: test_v4i32:940; AVX512: # %bb.0:941; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]942; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm0943; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]944; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm0945; AVX512-NEXT: vmovd %xmm0, %eax946; AVX512-NEXT: retq947 %1 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> %a0)948 ret i32 %1949}950 951define i32 @test_v8i32(<8 x i32> %a0) {952; SSE2-LABEL: test_v8i32:953; SSE2: # %bb.0:954; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]955; SSE2-NEXT: movdqa %xmm1, %xmm3956; SSE2-NEXT: pxor %xmm2, %xmm3957; SSE2-NEXT: movdqa %xmm0, %xmm4958; SSE2-NEXT: pxor %xmm2, %xmm4959; SSE2-NEXT: pcmpgtd %xmm3, %xmm4960; SSE2-NEXT: pand %xmm4, %xmm0961; SSE2-NEXT: pandn %xmm1, %xmm4962; SSE2-NEXT: por %xmm0, %xmm4963; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]964; SSE2-NEXT: movdqa %xmm4, %xmm1965; SSE2-NEXT: pxor %xmm2, %xmm1966; SSE2-NEXT: movdqa %xmm0, %xmm3967; SSE2-NEXT: pxor %xmm2, %xmm3968; SSE2-NEXT: pcmpgtd %xmm3, %xmm1969; SSE2-NEXT: pand %xmm1, %xmm4970; SSE2-NEXT: pandn %xmm0, %xmm1971; SSE2-NEXT: por %xmm4, %xmm1972; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]973; SSE2-NEXT: movdqa %xmm1, %xmm3974; SSE2-NEXT: pxor %xmm2, %xmm3975; SSE2-NEXT: pxor %xmm0, %xmm2976; SSE2-NEXT: pcmpgtd %xmm2, %xmm3977; SSE2-NEXT: pand %xmm3, %xmm1978; SSE2-NEXT: pandn %xmm0, %xmm3979; SSE2-NEXT: por %xmm1, %xmm3980; SSE2-NEXT: movd %xmm3, %eax981; SSE2-NEXT: retq982;983; SSE4-LABEL: test_v8i32:984; SSE4: # %bb.0:985; SSE4-NEXT: pmaxud %xmm1, %xmm0986; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]987; SSE4-NEXT: pmaxud %xmm0, %xmm1988; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]989; SSE4-NEXT: pmaxud %xmm1, %xmm0990; SSE4-NEXT: movd %xmm0, %eax991; SSE4-NEXT: retq992;993; AVX1-LABEL: test_v8i32:994; AVX1: # %bb.0:995; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1996; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0997; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]998; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0999; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1000; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm01001; AVX1-NEXT: vmovd %xmm0, %eax1002; AVX1-NEXT: vzeroupper1003; AVX1-NEXT: retq1004;1005; AVX2-LABEL: test_v8i32:1006; AVX2: # %bb.0:1007; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11008; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm01009; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1010; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm01011; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1012; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm01013; AVX2-NEXT: vmovd %xmm0, %eax1014; AVX2-NEXT: vzeroupper1015; AVX2-NEXT: retq1016;1017; AVX512-LABEL: test_v8i32:1018; AVX512: # %bb.0:1019; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm11020; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm01021; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1022; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm01023; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1024; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm01025; AVX512-NEXT: vmovd %xmm0, %eax1026; AVX512-NEXT: vzeroupper1027; AVX512-NEXT: retq1028 %1 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> %a0)1029 ret i32 %11030}1031 1032define i32 @test_v16i32(<16 x i32> %a0) {1033; SSE2-LABEL: test_v16i32:1034; SSE2: # %bb.0:1035; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]1036; SSE2-NEXT: movdqa %xmm2, %xmm61037; SSE2-NEXT: pxor %xmm4, %xmm61038; SSE2-NEXT: movdqa %xmm0, %xmm51039; SSE2-NEXT: pxor %xmm4, %xmm51040; SSE2-NEXT: pcmpgtd %xmm6, %xmm51041; SSE2-NEXT: pand %xmm5, %xmm01042; SSE2-NEXT: pandn %xmm2, %xmm51043; SSE2-NEXT: por %xmm0, %xmm51044; SSE2-NEXT: movdqa %xmm3, %xmm01045; SSE2-NEXT: pxor %xmm4, %xmm01046; SSE2-NEXT: movdqa %xmm1, %xmm21047; SSE2-NEXT: pxor %xmm4, %xmm21048; SSE2-NEXT: pcmpgtd %xmm0, %xmm21049; SSE2-NEXT: pand %xmm2, %xmm11050; SSE2-NEXT: pandn %xmm3, %xmm21051; SSE2-NEXT: por %xmm1, %xmm21052; SSE2-NEXT: movdqa %xmm2, %xmm01053; SSE2-NEXT: pxor %xmm4, %xmm01054; SSE2-NEXT: movdqa %xmm5, %xmm11055; SSE2-NEXT: pxor %xmm4, %xmm11056; SSE2-NEXT: pcmpgtd %xmm0, %xmm11057; SSE2-NEXT: pand %xmm1, %xmm51058; SSE2-NEXT: pandn %xmm2, %xmm11059; SSE2-NEXT: por %xmm5, %xmm11060; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1061; SSE2-NEXT: movdqa %xmm1, %xmm21062; SSE2-NEXT: pxor %xmm4, %xmm21063; SSE2-NEXT: movdqa %xmm0, %xmm31064; SSE2-NEXT: pxor %xmm4, %xmm31065; SSE2-NEXT: pcmpgtd %xmm3, %xmm21066; SSE2-NEXT: pand %xmm2, %xmm11067; SSE2-NEXT: pandn %xmm0, %xmm21068; SSE2-NEXT: por %xmm1, %xmm21069; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]1070; SSE2-NEXT: movdqa %xmm2, %xmm11071; SSE2-NEXT: pxor %xmm4, %xmm11072; SSE2-NEXT: pxor %xmm0, %xmm41073; SSE2-NEXT: pcmpgtd %xmm4, %xmm11074; SSE2-NEXT: pand %xmm1, %xmm21075; SSE2-NEXT: pandn %xmm0, %xmm11076; SSE2-NEXT: por %xmm2, %xmm11077; SSE2-NEXT: movd %xmm1, %eax1078; SSE2-NEXT: retq1079;1080; SSE4-LABEL: test_v16i32:1081; SSE4: # %bb.0:1082; SSE4-NEXT: pmaxud %xmm3, %xmm11083; SSE4-NEXT: pmaxud %xmm2, %xmm01084; SSE4-NEXT: pmaxud %xmm1, %xmm01085; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1086; SSE4-NEXT: pmaxud %xmm0, %xmm11087; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1088; SSE4-NEXT: pmaxud %xmm1, %xmm01089; SSE4-NEXT: movd %xmm0, %eax1090; SSE4-NEXT: retq1091;1092; AVX1-LABEL: test_v16i32:1093; AVX1: # %bb.0:1094; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21095; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31096; AVX1-NEXT: vpmaxud %xmm2, %xmm3, %xmm21097; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm01098; AVX1-NEXT: vpmaxud %xmm2, %xmm0, %xmm01099; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1100; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm01101; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1102; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm01103; AVX1-NEXT: vmovd %xmm0, %eax1104; AVX1-NEXT: vzeroupper1105; AVX1-NEXT: retq1106;1107; AVX2-LABEL: test_v16i32:1108; AVX2: # %bb.0:1109; AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm01110; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11111; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm01112; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1113; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm01114; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1115; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm01116; AVX2-NEXT: vmovd %xmm0, %eax1117; AVX2-NEXT: vzeroupper1118; AVX2-NEXT: retq1119;1120; AVX512-LABEL: test_v16i32:1121; AVX512: # %bb.0:1122; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm11123; AVX512-NEXT: vpmaxud %zmm1, %zmm0, %zmm01124; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm11125; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm01126; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1127; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm01128; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1129; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm01130; AVX512-NEXT: vmovd %xmm0, %eax1131; AVX512-NEXT: vzeroupper1132; AVX512-NEXT: retq1133 %1 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> %a0)1134 ret i32 %11135}1136 1137define i32 @test_v32i32(<32 x i32> %a0) {1138; SSE2-LABEL: test_v32i32:1139; SSE2: # %bb.0:1140; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]1141; SSE2-NEXT: movdqa %xmm5, %xmm101142; SSE2-NEXT: pxor %xmm8, %xmm101143; SSE2-NEXT: movdqa %xmm1, %xmm91144; SSE2-NEXT: pxor %xmm8, %xmm91145; SSE2-NEXT: pcmpgtd %xmm10, %xmm91146; SSE2-NEXT: pand %xmm9, %xmm11147; SSE2-NEXT: pandn %xmm5, %xmm91148; SSE2-NEXT: por %xmm1, %xmm91149; SSE2-NEXT: movdqa %xmm7, %xmm51150; SSE2-NEXT: pxor %xmm8, %xmm51151; SSE2-NEXT: movdqa %xmm3, %xmm11152; SSE2-NEXT: pxor %xmm8, %xmm11153; SSE2-NEXT: pcmpgtd %xmm5, %xmm11154; SSE2-NEXT: pand %xmm1, %xmm31155; SSE2-NEXT: pandn %xmm7, %xmm11156; SSE2-NEXT: por %xmm3, %xmm11157; SSE2-NEXT: movdqa %xmm4, %xmm51158; SSE2-NEXT: pxor %xmm8, %xmm51159; SSE2-NEXT: movdqa %xmm0, %xmm31160; SSE2-NEXT: pxor %xmm8, %xmm31161; SSE2-NEXT: pcmpgtd %xmm5, %xmm31162; SSE2-NEXT: pand %xmm3, %xmm01163; SSE2-NEXT: pandn %xmm4, %xmm31164; SSE2-NEXT: por %xmm0, %xmm31165; SSE2-NEXT: movdqa %xmm6, %xmm01166; SSE2-NEXT: pxor %xmm8, %xmm01167; SSE2-NEXT: movdqa %xmm2, %xmm41168; SSE2-NEXT: pxor %xmm8, %xmm41169; SSE2-NEXT: pcmpgtd %xmm0, %xmm41170; SSE2-NEXT: pand %xmm4, %xmm21171; SSE2-NEXT: pandn %xmm6, %xmm41172; SSE2-NEXT: por %xmm2, %xmm41173; SSE2-NEXT: movdqa %xmm4, %xmm21174; SSE2-NEXT: pxor %xmm8, %xmm21175; SSE2-NEXT: movdqa %xmm3, %xmm01176; SSE2-NEXT: pxor %xmm8, %xmm01177; SSE2-NEXT: pcmpgtd %xmm2, %xmm01178; SSE2-NEXT: pand %xmm0, %xmm31179; SSE2-NEXT: pandn %xmm4, %xmm01180; SSE2-NEXT: por %xmm3, %xmm01181; SSE2-NEXT: movdqa %xmm1, %xmm21182; SSE2-NEXT: pxor %xmm8, %xmm21183; SSE2-NEXT: movdqa %xmm9, %xmm31184; SSE2-NEXT: pxor %xmm8, %xmm31185; SSE2-NEXT: pcmpgtd %xmm2, %xmm31186; SSE2-NEXT: pand %xmm3, %xmm91187; SSE2-NEXT: pandn %xmm1, %xmm31188; SSE2-NEXT: por %xmm9, %xmm31189; SSE2-NEXT: movdqa %xmm3, %xmm11190; SSE2-NEXT: pxor %xmm8, %xmm11191; SSE2-NEXT: movdqa %xmm0, %xmm21192; SSE2-NEXT: pxor %xmm8, %xmm21193; SSE2-NEXT: pcmpgtd %xmm1, %xmm21194; SSE2-NEXT: pand %xmm2, %xmm01195; SSE2-NEXT: pandn %xmm3, %xmm21196; SSE2-NEXT: por %xmm0, %xmm21197; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]1198; SSE2-NEXT: movdqa %xmm2, %xmm11199; SSE2-NEXT: pxor %xmm8, %xmm11200; SSE2-NEXT: movdqa %xmm0, %xmm31201; SSE2-NEXT: pxor %xmm8, %xmm31202; SSE2-NEXT: pcmpgtd %xmm3, %xmm11203; SSE2-NEXT: pand %xmm1, %xmm21204; SSE2-NEXT: pandn %xmm0, %xmm11205; SSE2-NEXT: por %xmm2, %xmm11206; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1207; SSE2-NEXT: movdqa %xmm1, %xmm21208; SSE2-NEXT: pxor %xmm8, %xmm21209; SSE2-NEXT: pxor %xmm0, %xmm81210; SSE2-NEXT: pcmpgtd %xmm8, %xmm21211; SSE2-NEXT: pand %xmm2, %xmm11212; SSE2-NEXT: pandn %xmm0, %xmm21213; SSE2-NEXT: por %xmm1, %xmm21214; SSE2-NEXT: movd %xmm2, %eax1215; SSE2-NEXT: retq1216;1217; SSE4-LABEL: test_v32i32:1218; SSE4: # %bb.0:1219; SSE4-NEXT: pmaxud %xmm6, %xmm21220; SSE4-NEXT: pmaxud %xmm4, %xmm01221; SSE4-NEXT: pmaxud %xmm2, %xmm01222; SSE4-NEXT: pmaxud %xmm7, %xmm31223; SSE4-NEXT: pmaxud %xmm5, %xmm11224; SSE4-NEXT: pmaxud %xmm3, %xmm11225; SSE4-NEXT: pmaxud %xmm0, %xmm11226; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1227; SSE4-NEXT: pmaxud %xmm1, %xmm01228; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1229; SSE4-NEXT: pmaxud %xmm0, %xmm11230; SSE4-NEXT: movd %xmm1, %eax1231; SSE4-NEXT: retq1232;1233; AVX1-LABEL: test_v32i32:1234; AVX1: # %bb.0:1235; AVX1-NEXT: vpmaxud %xmm3, %xmm1, %xmm41236; AVX1-NEXT: vpmaxud %xmm2, %xmm0, %xmm51237; AVX1-NEXT: vpmaxud %xmm4, %xmm5, %xmm41238; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm31239; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11240; AVX1-NEXT: vpmaxud %xmm3, %xmm1, %xmm11241; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm21242; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01243; AVX1-NEXT: vpmaxud %xmm2, %xmm0, %xmm01244; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm01245; AVX1-NEXT: vpmaxud %xmm0, %xmm4, %xmm01246; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1247; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm01248; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1249; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm01250; AVX1-NEXT: vmovd %xmm0, %eax1251; AVX1-NEXT: vzeroupper1252; AVX1-NEXT: retq1253;1254; AVX2-LABEL: test_v32i32:1255; AVX2: # %bb.0:1256; AVX2-NEXT: vpmaxud %ymm3, %ymm1, %ymm11257; AVX2-NEXT: vpmaxud %ymm2, %ymm0, %ymm01258; AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm01259; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11260; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm01261; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1262; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm01263; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1264; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm01265; AVX2-NEXT: vmovd %xmm0, %eax1266; AVX2-NEXT: vzeroupper1267; AVX2-NEXT: retq1268;1269; AVX512-LABEL: test_v32i32:1270; AVX512: # %bb.0:1271; AVX512-NEXT: vpmaxud %zmm1, %zmm0, %zmm01272; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm11273; AVX512-NEXT: vpmaxud %zmm1, %zmm0, %zmm01274; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm11275; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm01276; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1277; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm01278; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1279; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm01280; AVX512-NEXT: vmovd %xmm0, %eax1281; AVX512-NEXT: vzeroupper1282; AVX512-NEXT: retq1283 %1 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> %a0)1284 ret i32 %11285}1286 1287;1288; vXi161289;1290 1291define i16 @test_v2i16(<2 x i16> %a0) {1292; SSE2-LABEL: test_v2i16:1293; SSE2: # %bb.0:1294; SSE2-NEXT: movdqa %xmm0, %xmm11295; SSE2-NEXT: psrld $16, %xmm11296; SSE2-NEXT: psubusw %xmm0, %xmm11297; SSE2-NEXT: paddw %xmm0, %xmm11298; SSE2-NEXT: movd %xmm1, %eax1299; SSE2-NEXT: # kill: def $ax killed $ax killed $eax1300; SSE2-NEXT: retq1301;1302; SSE4-LABEL: test_v2i16:1303; SSE4: # %bb.0:1304; SSE4-NEXT: movdqa %xmm0, %xmm11305; SSE4-NEXT: psrld $16, %xmm11306; SSE4-NEXT: pmaxuw %xmm0, %xmm11307; SSE4-NEXT: movd %xmm1, %eax1308; SSE4-NEXT: # kill: def $ax killed $ax killed $eax1309; SSE4-NEXT: retq1310;1311; AVX-LABEL: test_v2i16:1312; AVX: # %bb.0:1313; AVX-NEXT: vpsrld $16, %xmm0, %xmm11314; AVX-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01315; AVX-NEXT: vmovd %xmm0, %eax1316; AVX-NEXT: # kill: def $ax killed $ax killed $eax1317; AVX-NEXT: retq1318;1319; AVX512-LABEL: test_v2i16:1320; AVX512: # %bb.0:1321; AVX512-NEXT: vpsrld $16, %xmm0, %xmm11322; AVX512-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01323; AVX512-NEXT: vmovd %xmm0, %eax1324; AVX512-NEXT: # kill: def $ax killed $ax killed $eax1325; AVX512-NEXT: retq1326 %1 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> %a0)1327 ret i16 %11328}1329 1330define i16 @test_v4i16(<4 x i16> %a0) {1331; SSE2-LABEL: test_v4i16:1332; SSE2: # %bb.0:1333; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1334; SSE2-NEXT: psubusw %xmm0, %xmm11335; SSE2-NEXT: paddw %xmm0, %xmm11336; SSE2-NEXT: movdqa %xmm1, %xmm01337; SSE2-NEXT: psrld $16, %xmm01338; SSE2-NEXT: psubusw %xmm1, %xmm01339; SSE2-NEXT: paddw %xmm1, %xmm01340; SSE2-NEXT: movd %xmm0, %eax1341; SSE2-NEXT: # kill: def $ax killed $ax killed $eax1342; SSE2-NEXT: retq1343;1344; SSE4-LABEL: test_v4i16:1345; SSE4: # %bb.0:1346; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1347; SSE4-NEXT: pmaxuw %xmm0, %xmm11348; SSE4-NEXT: movdqa %xmm1, %xmm01349; SSE4-NEXT: psrld $16, %xmm01350; SSE4-NEXT: pmaxuw %xmm1, %xmm01351; SSE4-NEXT: movd %xmm0, %eax1352; SSE4-NEXT: # kill: def $ax killed $ax killed $eax1353; SSE4-NEXT: retq1354;1355; AVX-LABEL: test_v4i16:1356; AVX: # %bb.0:1357; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1358; AVX-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01359; AVX-NEXT: vpsrld $16, %xmm0, %xmm11360; AVX-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01361; AVX-NEXT: vmovd %xmm0, %eax1362; AVX-NEXT: # kill: def $ax killed $ax killed $eax1363; AVX-NEXT: retq1364;1365; AVX512-LABEL: test_v4i16:1366; AVX512: # %bb.0:1367; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1368; AVX512-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01369; AVX512-NEXT: vpsrld $16, %xmm0, %xmm11370; AVX512-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01371; AVX512-NEXT: vmovd %xmm0, %eax1372; AVX512-NEXT: # kill: def $ax killed $ax killed $eax1373; AVX512-NEXT: retq1374 %1 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> %a0)1375 ret i16 %11376}1377 1378define i16 @test_v8i16(<8 x i16> %a0) {1379; SSE2-LABEL: test_v8i16:1380; SSE2: # %bb.0:1381; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1382; SSE2-NEXT: psubusw %xmm0, %xmm11383; SSE2-NEXT: paddw %xmm0, %xmm11384; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1385; SSE2-NEXT: psubusw %xmm1, %xmm01386; SSE2-NEXT: paddw %xmm1, %xmm01387; SSE2-NEXT: movdqa %xmm0, %xmm11388; SSE2-NEXT: psrld $16, %xmm11389; SSE2-NEXT: psubusw %xmm0, %xmm11390; SSE2-NEXT: paddw %xmm0, %xmm11391; SSE2-NEXT: movd %xmm1, %eax1392; SSE2-NEXT: # kill: def $ax killed $ax killed $eax1393; SSE2-NEXT: retq1394;1395; SSE4-LABEL: test_v8i16:1396; SSE4: # %bb.0:1397; SSE4-NEXT: pcmpeqd %xmm1, %xmm11398; SSE4-NEXT: pxor %xmm0, %xmm11399; SSE4-NEXT: phminposuw %xmm1, %xmm01400; SSE4-NEXT: movd %xmm0, %eax1401; SSE4-NEXT: notl %eax1402; SSE4-NEXT: # kill: def $ax killed $ax killed $eax1403; SSE4-NEXT: retq1404;1405; AVX-LABEL: test_v8i16:1406; AVX: # %bb.0:1407; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11408; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm01409; AVX-NEXT: vphminposuw %xmm0, %xmm01410; AVX-NEXT: vmovd %xmm0, %eax1411; AVX-NEXT: notl %eax1412; AVX-NEXT: # kill: def $ax killed $ax killed $eax1413; AVX-NEXT: retq1414;1415; AVX512BW-LABEL: test_v8i16:1416; AVX512BW: # %bb.0:1417; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01418; AVX512BW-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01419; AVX512BW-NEXT: vphminposuw %xmm0, %xmm01420; AVX512BW-NEXT: vmovd %xmm0, %eax1421; AVX512BW-NEXT: notl %eax1422; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax1423; AVX512BW-NEXT: vzeroupper1424; AVX512BW-NEXT: retq1425;1426; AVX512VL-LABEL: test_v8i16:1427; AVX512VL: # %bb.0:1428; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01429; AVX512VL-NEXT: vphminposuw %xmm0, %xmm01430; AVX512VL-NEXT: vmovd %xmm0, %eax1431; AVX512VL-NEXT: notl %eax1432; AVX512VL-NEXT: # kill: def $ax killed $ax killed $eax1433; AVX512VL-NEXT: retq1434 %1 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> %a0)1435 ret i16 %11436}1437 1438define i16 @test_v16i16(<16 x i16> %a0) {1439; SSE2-LABEL: test_v16i16:1440; SSE2: # %bb.0:1441; SSE2-NEXT: psubusw %xmm0, %xmm11442; SSE2-NEXT: paddw %xmm0, %xmm11443; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1444; SSE2-NEXT: psubusw %xmm1, %xmm01445; SSE2-NEXT: paddw %xmm1, %xmm01446; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1447; SSE2-NEXT: psubusw %xmm0, %xmm11448; SSE2-NEXT: paddw %xmm0, %xmm11449; SSE2-NEXT: movdqa %xmm1, %xmm01450; SSE2-NEXT: psrld $16, %xmm01451; SSE2-NEXT: psubusw %xmm1, %xmm01452; SSE2-NEXT: paddw %xmm1, %xmm01453; SSE2-NEXT: movd %xmm0, %eax1454; SSE2-NEXT: # kill: def $ax killed $ax killed $eax1455; SSE2-NEXT: retq1456;1457; SSE4-LABEL: test_v16i16:1458; SSE4: # %bb.0:1459; SSE4-NEXT: pmaxuw %xmm1, %xmm01460; SSE4-NEXT: pcmpeqd %xmm1, %xmm11461; SSE4-NEXT: pxor %xmm0, %xmm11462; SSE4-NEXT: phminposuw %xmm1, %xmm01463; SSE4-NEXT: movd %xmm0, %eax1464; SSE4-NEXT: notl %eax1465; SSE4-NEXT: # kill: def $ax killed $ax killed $eax1466; SSE4-NEXT: retq1467;1468; AVX1-LABEL: test_v16i16:1469; AVX1: # %bb.0:1470; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11471; AVX1-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01472; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11473; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm01474; AVX1-NEXT: vphminposuw %xmm0, %xmm01475; AVX1-NEXT: vmovd %xmm0, %eax1476; AVX1-NEXT: notl %eax1477; AVX1-NEXT: # kill: def $ax killed $ax killed $eax1478; AVX1-NEXT: vzeroupper1479; AVX1-NEXT: retq1480;1481; AVX2-LABEL: test_v16i16:1482; AVX2: # %bb.0:1483; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11484; AVX2-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01485; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11486; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm01487; AVX2-NEXT: vphminposuw %xmm0, %xmm01488; AVX2-NEXT: vmovd %xmm0, %eax1489; AVX2-NEXT: notl %eax1490; AVX2-NEXT: # kill: def $ax killed $ax killed $eax1491; AVX2-NEXT: vzeroupper1492; AVX2-NEXT: retq1493;1494; AVX512BW-LABEL: test_v16i16:1495; AVX512BW: # %bb.0:1496; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm11497; AVX512BW-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01498; AVX512BW-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01499; AVX512BW-NEXT: vphminposuw %xmm0, %xmm01500; AVX512BW-NEXT: vmovd %xmm0, %eax1501; AVX512BW-NEXT: notl %eax1502; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax1503; AVX512BW-NEXT: vzeroupper1504; AVX512BW-NEXT: retq1505;1506; AVX512VL-LABEL: test_v16i16:1507; AVX512VL: # %bb.0:1508; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm11509; AVX512VL-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01510; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01511; AVX512VL-NEXT: vphminposuw %xmm0, %xmm01512; AVX512VL-NEXT: vmovd %xmm0, %eax1513; AVX512VL-NEXT: notl %eax1514; AVX512VL-NEXT: # kill: def $ax killed $ax killed $eax1515; AVX512VL-NEXT: vzeroupper1516; AVX512VL-NEXT: retq1517 %1 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> %a0)1518 ret i16 %11519}1520 1521define i16 @test_v32i16(<32 x i16> %a0) {1522; SSE2-LABEL: test_v32i16:1523; SSE2: # %bb.0:1524; SSE2-NEXT: psubusw %xmm0, %xmm21525; SSE2-NEXT: paddw %xmm0, %xmm21526; SSE2-NEXT: psubusw %xmm1, %xmm31527; SSE2-NEXT: paddw %xmm1, %xmm31528; SSE2-NEXT: psubusw %xmm2, %xmm31529; SSE2-NEXT: paddw %xmm2, %xmm31530; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]1531; SSE2-NEXT: psubusw %xmm3, %xmm01532; SSE2-NEXT: paddw %xmm3, %xmm01533; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1534; SSE2-NEXT: psubusw %xmm0, %xmm11535; SSE2-NEXT: paddw %xmm0, %xmm11536; SSE2-NEXT: movdqa %xmm1, %xmm01537; SSE2-NEXT: psrld $16, %xmm01538; SSE2-NEXT: psubusw %xmm1, %xmm01539; SSE2-NEXT: paddw %xmm1, %xmm01540; SSE2-NEXT: movd %xmm0, %eax1541; SSE2-NEXT: # kill: def $ax killed $ax killed $eax1542; SSE2-NEXT: retq1543;1544; SSE4-LABEL: test_v32i16:1545; SSE4: # %bb.0:1546; SSE4-NEXT: pmaxuw %xmm3, %xmm11547; SSE4-NEXT: pmaxuw %xmm2, %xmm01548; SSE4-NEXT: pmaxuw %xmm1, %xmm01549; SSE4-NEXT: pcmpeqd %xmm1, %xmm11550; SSE4-NEXT: pxor %xmm0, %xmm11551; SSE4-NEXT: phminposuw %xmm1, %xmm01552; SSE4-NEXT: movd %xmm0, %eax1553; SSE4-NEXT: notl %eax1554; SSE4-NEXT: # kill: def $ax killed $ax killed $eax1555; SSE4-NEXT: retq1556;1557; AVX1-LABEL: test_v32i16:1558; AVX1: # %bb.0:1559; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21560; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31561; AVX1-NEXT: vpmaxuw %xmm2, %xmm3, %xmm21562; AVX1-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01563; AVX1-NEXT: vpmaxuw %xmm2, %xmm0, %xmm01564; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11565; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm01566; AVX1-NEXT: vphminposuw %xmm0, %xmm01567; AVX1-NEXT: vmovd %xmm0, %eax1568; AVX1-NEXT: notl %eax1569; AVX1-NEXT: # kill: def $ax killed $ax killed $eax1570; AVX1-NEXT: vzeroupper1571; AVX1-NEXT: retq1572;1573; AVX2-LABEL: test_v32i16:1574; AVX2: # %bb.0:1575; AVX2-NEXT: vpmaxuw %ymm1, %ymm0, %ymm01576; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11577; AVX2-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01578; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11579; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm01580; AVX2-NEXT: vphminposuw %xmm0, %xmm01581; AVX2-NEXT: vmovd %xmm0, %eax1582; AVX2-NEXT: notl %eax1583; AVX2-NEXT: # kill: def $ax killed $ax killed $eax1584; AVX2-NEXT: vzeroupper1585; AVX2-NEXT: retq1586;1587; AVX512BW-LABEL: test_v32i16:1588; AVX512BW: # %bb.0:1589; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm11590; AVX512BW-NEXT: vpmaxuw %ymm1, %ymm0, %ymm01591; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm11592; AVX512BW-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01593; AVX512BW-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01594; AVX512BW-NEXT: vphminposuw %xmm0, %xmm01595; AVX512BW-NEXT: vmovd %xmm0, %eax1596; AVX512BW-NEXT: notl %eax1597; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax1598; AVX512BW-NEXT: vzeroupper1599; AVX512BW-NEXT: retq1600;1601; AVX512VL-LABEL: test_v32i16:1602; AVX512VL: # %bb.0:1603; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm11604; AVX512VL-NEXT: vpmaxuw %ymm1, %ymm0, %ymm01605; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm11606; AVX512VL-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01607; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01608; AVX512VL-NEXT: vphminposuw %xmm0, %xmm01609; AVX512VL-NEXT: vmovd %xmm0, %eax1610; AVX512VL-NEXT: notl %eax1611; AVX512VL-NEXT: # kill: def $ax killed $ax killed $eax1612; AVX512VL-NEXT: vzeroupper1613; AVX512VL-NEXT: retq1614 %1 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> %a0)1615 ret i16 %11616}1617 1618define i16 @test_v64i16(<64 x i16> %a0) {1619; SSE2-LABEL: test_v64i16:1620; SSE2: # %bb.0:1621; SSE2-NEXT: psubusw %xmm1, %xmm51622; SSE2-NEXT: paddw %xmm1, %xmm51623; SSE2-NEXT: psubusw %xmm3, %xmm71624; SSE2-NEXT: paddw %xmm3, %xmm71625; SSE2-NEXT: psubusw %xmm0, %xmm41626; SSE2-NEXT: paddw %xmm0, %xmm41627; SSE2-NEXT: psubusw %xmm2, %xmm61628; SSE2-NEXT: paddw %xmm2, %xmm61629; SSE2-NEXT: psubusw %xmm4, %xmm61630; SSE2-NEXT: paddw %xmm4, %xmm61631; SSE2-NEXT: psubusw %xmm5, %xmm71632; SSE2-NEXT: paddw %xmm5, %xmm71633; SSE2-NEXT: psubusw %xmm6, %xmm71634; SSE2-NEXT: paddw %xmm6, %xmm71635; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[2,3,2,3]1636; SSE2-NEXT: psubusw %xmm7, %xmm01637; SSE2-NEXT: paddw %xmm7, %xmm01638; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1639; SSE2-NEXT: psubusw %xmm0, %xmm11640; SSE2-NEXT: paddw %xmm0, %xmm11641; SSE2-NEXT: movdqa %xmm1, %xmm01642; SSE2-NEXT: psrld $16, %xmm01643; SSE2-NEXT: psubusw %xmm1, %xmm01644; SSE2-NEXT: paddw %xmm1, %xmm01645; SSE2-NEXT: movd %xmm0, %eax1646; SSE2-NEXT: # kill: def $ax killed $ax killed $eax1647; SSE2-NEXT: retq1648;1649; SSE4-LABEL: test_v64i16:1650; SSE4: # %bb.0:1651; SSE4-NEXT: pmaxuw %xmm7, %xmm31652; SSE4-NEXT: pmaxuw %xmm5, %xmm11653; SSE4-NEXT: pmaxuw %xmm3, %xmm11654; SSE4-NEXT: pmaxuw %xmm6, %xmm21655; SSE4-NEXT: pmaxuw %xmm4, %xmm01656; SSE4-NEXT: pmaxuw %xmm2, %xmm01657; SSE4-NEXT: pmaxuw %xmm1, %xmm01658; SSE4-NEXT: pcmpeqd %xmm1, %xmm11659; SSE4-NEXT: pxor %xmm0, %xmm11660; SSE4-NEXT: phminposuw %xmm1, %xmm01661; SSE4-NEXT: movd %xmm0, %eax1662; SSE4-NEXT: notl %eax1663; SSE4-NEXT: # kill: def $ax killed $ax killed $eax1664; SSE4-NEXT: retq1665;1666; AVX1-LABEL: test_v64i16:1667; AVX1: # %bb.0:1668; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm41669; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm51670; AVX1-NEXT: vpmaxuw %xmm4, %xmm5, %xmm41671; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm51672; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm61673; AVX1-NEXT: vpmaxuw %xmm5, %xmm6, %xmm51674; AVX1-NEXT: vpmaxuw %xmm4, %xmm5, %xmm41675; AVX1-NEXT: vpmaxuw %xmm3, %xmm1, %xmm11676; AVX1-NEXT: vpmaxuw %xmm2, %xmm0, %xmm01677; AVX1-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01678; AVX1-NEXT: vpmaxuw %xmm4, %xmm0, %xmm01679; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11680; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm01681; AVX1-NEXT: vphminposuw %xmm0, %xmm01682; AVX1-NEXT: vmovd %xmm0, %eax1683; AVX1-NEXT: notl %eax1684; AVX1-NEXT: # kill: def $ax killed $ax killed $eax1685; AVX1-NEXT: vzeroupper1686; AVX1-NEXT: retq1687;1688; AVX2-LABEL: test_v64i16:1689; AVX2: # %bb.0:1690; AVX2-NEXT: vpmaxuw %ymm3, %ymm1, %ymm11691; AVX2-NEXT: vpmaxuw %ymm2, %ymm0, %ymm01692; AVX2-NEXT: vpmaxuw %ymm1, %ymm0, %ymm01693; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11694; AVX2-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01695; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11696; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm01697; AVX2-NEXT: vphminposuw %xmm0, %xmm01698; AVX2-NEXT: vmovd %xmm0, %eax1699; AVX2-NEXT: notl %eax1700; AVX2-NEXT: # kill: def $ax killed $ax killed $eax1701; AVX2-NEXT: vzeroupper1702; AVX2-NEXT: retq1703;1704; AVX512BW-LABEL: test_v64i16:1705; AVX512BW: # %bb.0:1706; AVX512BW-NEXT: vpmaxuw %zmm1, %zmm0, %zmm01707; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm11708; AVX512BW-NEXT: vpmaxuw %ymm1, %ymm0, %ymm01709; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm11710; AVX512BW-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01711; AVX512BW-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01712; AVX512BW-NEXT: vphminposuw %xmm0, %xmm01713; AVX512BW-NEXT: vmovd %xmm0, %eax1714; AVX512BW-NEXT: notl %eax1715; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax1716; AVX512BW-NEXT: vzeroupper1717; AVX512BW-NEXT: retq1718;1719; AVX512VL-LABEL: test_v64i16:1720; AVX512VL: # %bb.0:1721; AVX512VL-NEXT: vpmaxuw %zmm1, %zmm0, %zmm01722; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm11723; AVX512VL-NEXT: vpmaxuw %ymm1, %ymm0, %ymm01724; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm11725; AVX512VL-NEXT: vpmaxuw %xmm1, %xmm0, %xmm01726; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01727; AVX512VL-NEXT: vphminposuw %xmm0, %xmm01728; AVX512VL-NEXT: vmovd %xmm0, %eax1729; AVX512VL-NEXT: notl %eax1730; AVX512VL-NEXT: # kill: def $ax killed $ax killed $eax1731; AVX512VL-NEXT: vzeroupper1732; AVX512VL-NEXT: retq1733 %1 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> %a0)1734 ret i16 %11735}1736 1737;1738; vXi81739;1740 1741define i8 @test_v2i8(<2 x i8> %a0) {1742; SSE-LABEL: test_v2i8:1743; SSE: # %bb.0:1744; SSE-NEXT: movdqa %xmm0, %xmm11745; SSE-NEXT: psrlw $8, %xmm11746; SSE-NEXT: pmaxub %xmm0, %xmm11747; SSE-NEXT: movd %xmm1, %eax1748; SSE-NEXT: # kill: def $al killed $al killed $eax1749; SSE-NEXT: retq1750;1751; AVX-LABEL: test_v2i8:1752; AVX: # %bb.0:1753; AVX-NEXT: vpsrlw $8, %xmm0, %xmm11754; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm01755; AVX-NEXT: vmovd %xmm0, %eax1756; AVX-NEXT: # kill: def $al killed $al killed $eax1757; AVX-NEXT: retq1758;1759; AVX512-LABEL: test_v2i8:1760; AVX512: # %bb.0:1761; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm11762; AVX512-NEXT: vpmaxub %xmm1, %xmm0, %xmm01763; AVX512-NEXT: vmovd %xmm0, %eax1764; AVX512-NEXT: # kill: def $al killed $al killed $eax1765; AVX512-NEXT: retq1766 %1 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> %a0)1767 ret i8 %11768}1769 1770define i8 @test_v4i8(<4 x i8> %a0) {1771; SSE-LABEL: test_v4i8:1772; SSE: # %bb.0:1773; SSE-NEXT: movdqa %xmm0, %xmm11774; SSE-NEXT: psrld $16, %xmm11775; SSE-NEXT: pmaxub %xmm0, %xmm11776; SSE-NEXT: movdqa %xmm1, %xmm01777; SSE-NEXT: psrlw $8, %xmm01778; SSE-NEXT: pmaxub %xmm1, %xmm01779; SSE-NEXT: movd %xmm0, %eax1780; SSE-NEXT: # kill: def $al killed $al killed $eax1781; SSE-NEXT: retq1782;1783; AVX-LABEL: test_v4i8:1784; AVX: # %bb.0:1785; AVX-NEXT: vpsrld $16, %xmm0, %xmm11786; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm01787; AVX-NEXT: vpsrlw $8, %xmm0, %xmm11788; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm01789; AVX-NEXT: vmovd %xmm0, %eax1790; AVX-NEXT: # kill: def $al killed $al killed $eax1791; AVX-NEXT: retq1792;1793; AVX512-LABEL: test_v4i8:1794; AVX512: # %bb.0:1795; AVX512-NEXT: vpsrld $16, %xmm0, %xmm11796; AVX512-NEXT: vpmaxub %xmm1, %xmm0, %xmm01797; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm11798; AVX512-NEXT: vpmaxub %xmm1, %xmm0, %xmm01799; AVX512-NEXT: vmovd %xmm0, %eax1800; AVX512-NEXT: # kill: def $al killed $al killed $eax1801; AVX512-NEXT: retq1802 %1 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> %a0)1803 ret i8 %11804}1805 1806define i8 @test_v8i8(<8 x i8> %a0) {1807; SSE-LABEL: test_v8i8:1808; SSE: # %bb.0:1809; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1810; SSE-NEXT: pmaxub %xmm0, %xmm11811; SSE-NEXT: movdqa %xmm1, %xmm01812; SSE-NEXT: psrld $16, %xmm01813; SSE-NEXT: pmaxub %xmm1, %xmm01814; SSE-NEXT: movdqa %xmm0, %xmm11815; SSE-NEXT: psrlw $8, %xmm11816; SSE-NEXT: pmaxub %xmm0, %xmm11817; SSE-NEXT: movd %xmm1, %eax1818; SSE-NEXT: # kill: def $al killed $al killed $eax1819; SSE-NEXT: retq1820;1821; AVX-LABEL: test_v8i8:1822; AVX: # %bb.0:1823; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1824; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm01825; AVX-NEXT: vpsrld $16, %xmm0, %xmm11826; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm01827; AVX-NEXT: vpsrlw $8, %xmm0, %xmm11828; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm01829; AVX-NEXT: vmovd %xmm0, %eax1830; AVX-NEXT: # kill: def $al killed $al killed $eax1831; AVX-NEXT: retq1832;1833; AVX512-LABEL: test_v8i8:1834; AVX512: # %bb.0:1835; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1836; AVX512-NEXT: vpmaxub %xmm1, %xmm0, %xmm01837; AVX512-NEXT: vpsrld $16, %xmm0, %xmm11838; AVX512-NEXT: vpmaxub %xmm1, %xmm0, %xmm01839; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm11840; AVX512-NEXT: vpmaxub %xmm1, %xmm0, %xmm01841; AVX512-NEXT: vmovd %xmm0, %eax1842; AVX512-NEXT: # kill: def $al killed $al killed $eax1843; AVX512-NEXT: retq1844 %1 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> %a0)1845 ret i8 %11846}1847 1848define i8 @test_v16i8(<16 x i8> %a0) {1849; SSE2-LABEL: test_v16i8:1850; SSE2: # %bb.0:1851; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1852; SSE2-NEXT: pmaxub %xmm0, %xmm11853; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1854; SSE2-NEXT: pmaxub %xmm1, %xmm01855; SSE2-NEXT: movdqa %xmm0, %xmm11856; SSE2-NEXT: psrld $16, %xmm11857; SSE2-NEXT: pmaxub %xmm0, %xmm11858; SSE2-NEXT: movdqa %xmm1, %xmm01859; SSE2-NEXT: psrlw $8, %xmm01860; SSE2-NEXT: pmaxub %xmm1, %xmm01861; SSE2-NEXT: movd %xmm0, %eax1862; SSE2-NEXT: # kill: def $al killed $al killed $eax1863; SSE2-NEXT: retq1864;1865; SSE4-LABEL: test_v16i8:1866; SSE4: # %bb.0:1867; SSE4-NEXT: pcmpeqd %xmm1, %xmm11868; SSE4-NEXT: pxor %xmm0, %xmm11869; SSE4-NEXT: movdqa %xmm1, %xmm01870; SSE4-NEXT: psrlw $8, %xmm01871; SSE4-NEXT: pminub %xmm1, %xmm01872; SSE4-NEXT: phminposuw %xmm0, %xmm01873; SSE4-NEXT: movd %xmm0, %eax1874; SSE4-NEXT: notb %al1875; SSE4-NEXT: # kill: def $al killed $al killed $eax1876; SSE4-NEXT: retq1877;1878; AVX-LABEL: test_v16i8:1879; AVX: # %bb.0:1880; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11881; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm01882; AVX-NEXT: vpsrlw $8, %xmm0, %xmm11883; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm01884; AVX-NEXT: vphminposuw %xmm0, %xmm01885; AVX-NEXT: vmovd %xmm0, %eax1886; AVX-NEXT: notb %al1887; AVX-NEXT: # kill: def $al killed $al killed $eax1888; AVX-NEXT: retq1889;1890; AVX512BW-LABEL: test_v16i8:1891; AVX512BW: # %bb.0:1892; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01893; AVX512BW-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01894; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm11895; AVX512BW-NEXT: vpminub %xmm1, %xmm0, %xmm01896; AVX512BW-NEXT: vphminposuw %xmm0, %xmm01897; AVX512BW-NEXT: vmovd %xmm0, %eax1898; AVX512BW-NEXT: notb %al1899; AVX512BW-NEXT: # kill: def $al killed $al killed $eax1900; AVX512BW-NEXT: vzeroupper1901; AVX512BW-NEXT: retq1902;1903; AVX512VL-LABEL: test_v16i8:1904; AVX512VL: # %bb.0:1905; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01906; AVX512VL-NEXT: vpsrlw $8, %xmm0, %xmm11907; AVX512VL-NEXT: vpminub %xmm1, %xmm0, %xmm01908; AVX512VL-NEXT: vphminposuw %xmm0, %xmm01909; AVX512VL-NEXT: vmovd %xmm0, %eax1910; AVX512VL-NEXT: notb %al1911; AVX512VL-NEXT: # kill: def $al killed $al killed $eax1912; AVX512VL-NEXT: retq1913 %1 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> %a0)1914 ret i8 %11915}1916 1917define i8 @test_v32i8(<32 x i8> %a0) {1918; SSE2-LABEL: test_v32i8:1919; SSE2: # %bb.0:1920; SSE2-NEXT: pmaxub %xmm1, %xmm01921; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1922; SSE2-NEXT: pmaxub %xmm0, %xmm11923; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1924; SSE2-NEXT: pmaxub %xmm1, %xmm01925; SSE2-NEXT: movdqa %xmm0, %xmm11926; SSE2-NEXT: psrld $16, %xmm11927; SSE2-NEXT: pmaxub %xmm0, %xmm11928; SSE2-NEXT: movdqa %xmm1, %xmm01929; SSE2-NEXT: psrlw $8, %xmm01930; SSE2-NEXT: pmaxub %xmm1, %xmm01931; SSE2-NEXT: movd %xmm0, %eax1932; SSE2-NEXT: # kill: def $al killed $al killed $eax1933; SSE2-NEXT: retq1934;1935; SSE4-LABEL: test_v32i8:1936; SSE4: # %bb.0:1937; SSE4-NEXT: pmaxub %xmm1, %xmm01938; SSE4-NEXT: pcmpeqd %xmm1, %xmm11939; SSE4-NEXT: pxor %xmm0, %xmm11940; SSE4-NEXT: movdqa %xmm1, %xmm01941; SSE4-NEXT: psrlw $8, %xmm01942; SSE4-NEXT: pminub %xmm1, %xmm01943; SSE4-NEXT: phminposuw %xmm0, %xmm01944; SSE4-NEXT: movd %xmm0, %eax1945; SSE4-NEXT: notb %al1946; SSE4-NEXT: # kill: def $al killed $al killed $eax1947; SSE4-NEXT: retq1948;1949; AVX1-LABEL: test_v32i8:1950; AVX1: # %bb.0:1951; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11952; AVX1-NEXT: vpmaxub %xmm1, %xmm0, %xmm01953; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11954; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm01955; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm11956; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm01957; AVX1-NEXT: vphminposuw %xmm0, %xmm01958; AVX1-NEXT: vmovd %xmm0, %eax1959; AVX1-NEXT: notb %al1960; AVX1-NEXT: # kill: def $al killed $al killed $eax1961; AVX1-NEXT: vzeroupper1962; AVX1-NEXT: retq1963;1964; AVX2-LABEL: test_v32i8:1965; AVX2: # %bb.0:1966; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11967; AVX2-NEXT: vpmaxub %xmm1, %xmm0, %xmm01968; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11969; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm01970; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm11971; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm01972; AVX2-NEXT: vphminposuw %xmm0, %xmm01973; AVX2-NEXT: vmovd %xmm0, %eax1974; AVX2-NEXT: notb %al1975; AVX2-NEXT: # kill: def $al killed $al killed $eax1976; AVX2-NEXT: vzeroupper1977; AVX2-NEXT: retq1978;1979; AVX512BW-LABEL: test_v32i8:1980; AVX512BW: # %bb.0:1981; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm11982; AVX512BW-NEXT: vpmaxub %xmm1, %xmm0, %xmm01983; AVX512BW-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01984; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm11985; AVX512BW-NEXT: vpminub %xmm1, %xmm0, %xmm01986; AVX512BW-NEXT: vphminposuw %xmm0, %xmm01987; AVX512BW-NEXT: vmovd %xmm0, %eax1988; AVX512BW-NEXT: notb %al1989; AVX512BW-NEXT: # kill: def $al killed $al killed $eax1990; AVX512BW-NEXT: vzeroupper1991; AVX512BW-NEXT: retq1992;1993; AVX512VL-LABEL: test_v32i8:1994; AVX512VL: # %bb.0:1995; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm11996; AVX512VL-NEXT: vpmaxub %xmm1, %xmm0, %xmm01997; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01998; AVX512VL-NEXT: vpsrlw $8, %xmm0, %xmm11999; AVX512VL-NEXT: vpminub %xmm1, %xmm0, %xmm02000; AVX512VL-NEXT: vphminposuw %xmm0, %xmm02001; AVX512VL-NEXT: vmovd %xmm0, %eax2002; AVX512VL-NEXT: notb %al2003; AVX512VL-NEXT: # kill: def $al killed $al killed $eax2004; AVX512VL-NEXT: vzeroupper2005; AVX512VL-NEXT: retq2006 %1 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> %a0)2007 ret i8 %12008}2009 2010define i8 @test_v64i8(<64 x i8> %a0) {2011; SSE2-LABEL: test_v64i8:2012; SSE2: # %bb.0:2013; SSE2-NEXT: pmaxub %xmm3, %xmm12014; SSE2-NEXT: pmaxub %xmm2, %xmm02015; SSE2-NEXT: pmaxub %xmm1, %xmm02016; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2017; SSE2-NEXT: pmaxub %xmm0, %xmm12018; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]2019; SSE2-NEXT: pmaxub %xmm1, %xmm02020; SSE2-NEXT: movdqa %xmm0, %xmm12021; SSE2-NEXT: psrld $16, %xmm12022; SSE2-NEXT: pmaxub %xmm0, %xmm12023; SSE2-NEXT: movdqa %xmm1, %xmm02024; SSE2-NEXT: psrlw $8, %xmm02025; SSE2-NEXT: pmaxub %xmm1, %xmm02026; SSE2-NEXT: movd %xmm0, %eax2027; SSE2-NEXT: # kill: def $al killed $al killed $eax2028; SSE2-NEXT: retq2029;2030; SSE4-LABEL: test_v64i8:2031; SSE4: # %bb.0:2032; SSE4-NEXT: pmaxub %xmm3, %xmm12033; SSE4-NEXT: pmaxub %xmm2, %xmm02034; SSE4-NEXT: pmaxub %xmm1, %xmm02035; SSE4-NEXT: pcmpeqd %xmm1, %xmm12036; SSE4-NEXT: pxor %xmm0, %xmm12037; SSE4-NEXT: movdqa %xmm1, %xmm02038; SSE4-NEXT: psrlw $8, %xmm02039; SSE4-NEXT: pminub %xmm1, %xmm02040; SSE4-NEXT: phminposuw %xmm0, %xmm02041; SSE4-NEXT: movd %xmm0, %eax2042; SSE4-NEXT: notb %al2043; SSE4-NEXT: # kill: def $al killed $al killed $eax2044; SSE4-NEXT: retq2045;2046; AVX1-LABEL: test_v64i8:2047; AVX1: # %bb.0:2048; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22049; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm32050; AVX1-NEXT: vpmaxub %xmm2, %xmm3, %xmm22051; AVX1-NEXT: vpmaxub %xmm1, %xmm0, %xmm02052; AVX1-NEXT: vpmaxub %xmm2, %xmm0, %xmm02053; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm12054; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm02055; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm12056; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm02057; AVX1-NEXT: vphminposuw %xmm0, %xmm02058; AVX1-NEXT: vmovd %xmm0, %eax2059; AVX1-NEXT: notb %al2060; AVX1-NEXT: # kill: def $al killed $al killed $eax2061; AVX1-NEXT: vzeroupper2062; AVX1-NEXT: retq2063;2064; AVX2-LABEL: test_v64i8:2065; AVX2: # %bb.0:2066; AVX2-NEXT: vpmaxub %ymm1, %ymm0, %ymm02067; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12068; AVX2-NEXT: vpmaxub %xmm1, %xmm0, %xmm02069; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm12070; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm02071; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm12072; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm02073; AVX2-NEXT: vphminposuw %xmm0, %xmm02074; AVX2-NEXT: vmovd %xmm0, %eax2075; AVX2-NEXT: notb %al2076; AVX2-NEXT: # kill: def $al killed $al killed $eax2077; AVX2-NEXT: vzeroupper2078; AVX2-NEXT: retq2079;2080; AVX512BW-LABEL: test_v64i8:2081; AVX512BW: # %bb.0:2082; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm12083; AVX512BW-NEXT: vpmaxub %ymm1, %ymm0, %ymm02084; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm12085; AVX512BW-NEXT: vpmaxub %xmm1, %xmm0, %xmm02086; AVX512BW-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm02087; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm12088; AVX512BW-NEXT: vpminub %xmm1, %xmm0, %xmm02089; AVX512BW-NEXT: vphminposuw %xmm0, %xmm02090; AVX512BW-NEXT: vmovd %xmm0, %eax2091; AVX512BW-NEXT: notb %al2092; AVX512BW-NEXT: # kill: def $al killed $al killed $eax2093; AVX512BW-NEXT: vzeroupper2094; AVX512BW-NEXT: retq2095;2096; AVX512VL-LABEL: test_v64i8:2097; AVX512VL: # %bb.0:2098; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm12099; AVX512VL-NEXT: vpmaxub %ymm1, %ymm0, %ymm02100; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm12101; AVX512VL-NEXT: vpmaxub %xmm1, %xmm0, %xmm02102; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm02103; AVX512VL-NEXT: vpsrlw $8, %xmm0, %xmm12104; AVX512VL-NEXT: vpminub %xmm1, %xmm0, %xmm02105; AVX512VL-NEXT: vphminposuw %xmm0, %xmm02106; AVX512VL-NEXT: vmovd %xmm0, %eax2107; AVX512VL-NEXT: notb %al2108; AVX512VL-NEXT: # kill: def $al killed $al killed $eax2109; AVX512VL-NEXT: vzeroupper2110; AVX512VL-NEXT: retq2111 %1 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> %a0)2112 ret i8 %12113}2114 2115define i8 @test_v128i8(<128 x i8> %a0) {2116; SSE2-LABEL: test_v128i8:2117; SSE2: # %bb.0:2118; SSE2-NEXT: pmaxub %xmm6, %xmm22119; SSE2-NEXT: pmaxub %xmm4, %xmm02120; SSE2-NEXT: pmaxub %xmm2, %xmm02121; SSE2-NEXT: pmaxub %xmm7, %xmm32122; SSE2-NEXT: pmaxub %xmm5, %xmm12123; SSE2-NEXT: pmaxub %xmm3, %xmm12124; SSE2-NEXT: pmaxub %xmm0, %xmm12125; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]2126; SSE2-NEXT: pmaxub %xmm1, %xmm02127; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2128; SSE2-NEXT: pmaxub %xmm0, %xmm12129; SSE2-NEXT: movdqa %xmm1, %xmm02130; SSE2-NEXT: psrld $16, %xmm02131; SSE2-NEXT: pmaxub %xmm1, %xmm02132; SSE2-NEXT: movdqa %xmm0, %xmm12133; SSE2-NEXT: psrlw $8, %xmm12134; SSE2-NEXT: pmaxub %xmm0, %xmm12135; SSE2-NEXT: movd %xmm1, %eax2136; SSE2-NEXT: # kill: def $al killed $al killed $eax2137; SSE2-NEXT: retq2138;2139; SSE4-LABEL: test_v128i8:2140; SSE4: # %bb.0:2141; SSE4-NEXT: pmaxub %xmm7, %xmm32142; SSE4-NEXT: pmaxub %xmm5, %xmm12143; SSE4-NEXT: pmaxub %xmm3, %xmm12144; SSE4-NEXT: pmaxub %xmm6, %xmm22145; SSE4-NEXT: pmaxub %xmm4, %xmm02146; SSE4-NEXT: pmaxub %xmm2, %xmm02147; SSE4-NEXT: pmaxub %xmm1, %xmm02148; SSE4-NEXT: pcmpeqd %xmm1, %xmm12149; SSE4-NEXT: pxor %xmm0, %xmm12150; SSE4-NEXT: movdqa %xmm1, %xmm02151; SSE4-NEXT: psrlw $8, %xmm02152; SSE4-NEXT: pminub %xmm1, %xmm02153; SSE4-NEXT: phminposuw %xmm0, %xmm02154; SSE4-NEXT: movd %xmm0, %eax2155; SSE4-NEXT: notb %al2156; SSE4-NEXT: # kill: def $al killed $al killed $eax2157; SSE4-NEXT: retq2158;2159; AVX1-LABEL: test_v128i8:2160; AVX1: # %bb.0:2161; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm42162; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm52163; AVX1-NEXT: vpmaxub %xmm4, %xmm5, %xmm42164; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm52165; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm62166; AVX1-NEXT: vpmaxub %xmm5, %xmm6, %xmm52167; AVX1-NEXT: vpmaxub %xmm4, %xmm5, %xmm42168; AVX1-NEXT: vpmaxub %xmm3, %xmm1, %xmm12169; AVX1-NEXT: vpmaxub %xmm2, %xmm0, %xmm02170; AVX1-NEXT: vpmaxub %xmm1, %xmm0, %xmm02171; AVX1-NEXT: vpmaxub %xmm4, %xmm0, %xmm02172; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm12173; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm02174; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm12175; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm02176; AVX1-NEXT: vphminposuw %xmm0, %xmm02177; AVX1-NEXT: vmovd %xmm0, %eax2178; AVX1-NEXT: notb %al2179; AVX1-NEXT: # kill: def $al killed $al killed $eax2180; AVX1-NEXT: vzeroupper2181; AVX1-NEXT: retq2182;2183; AVX2-LABEL: test_v128i8:2184; AVX2: # %bb.0:2185; AVX2-NEXT: vpmaxub %ymm3, %ymm1, %ymm12186; AVX2-NEXT: vpmaxub %ymm2, %ymm0, %ymm02187; AVX2-NEXT: vpmaxub %ymm1, %ymm0, %ymm02188; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12189; AVX2-NEXT: vpmaxub %xmm1, %xmm0, %xmm02190; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm12191; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm02192; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm12193; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm02194; AVX2-NEXT: vphminposuw %xmm0, %xmm02195; AVX2-NEXT: vmovd %xmm0, %eax2196; AVX2-NEXT: notb %al2197; AVX2-NEXT: # kill: def $al killed $al killed $eax2198; AVX2-NEXT: vzeroupper2199; AVX2-NEXT: retq2200;2201; AVX512BW-LABEL: test_v128i8:2202; AVX512BW: # %bb.0:2203; AVX512BW-NEXT: vpmaxub %zmm1, %zmm0, %zmm02204; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm12205; AVX512BW-NEXT: vpmaxub %ymm1, %ymm0, %ymm02206; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm12207; AVX512BW-NEXT: vpmaxub %xmm1, %xmm0, %xmm02208; AVX512BW-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm02209; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm12210; AVX512BW-NEXT: vpminub %xmm1, %xmm0, %xmm02211; AVX512BW-NEXT: vphminposuw %xmm0, %xmm02212; AVX512BW-NEXT: vmovd %xmm0, %eax2213; AVX512BW-NEXT: notb %al2214; AVX512BW-NEXT: # kill: def $al killed $al killed $eax2215; AVX512BW-NEXT: vzeroupper2216; AVX512BW-NEXT: retq2217;2218; AVX512VL-LABEL: test_v128i8:2219; AVX512VL: # %bb.0:2220; AVX512VL-NEXT: vpmaxub %zmm1, %zmm0, %zmm02221; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm12222; AVX512VL-NEXT: vpmaxub %ymm1, %ymm0, %ymm02223; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm12224; AVX512VL-NEXT: vpmaxub %xmm1, %xmm0, %xmm02225; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm02226; AVX512VL-NEXT: vpsrlw $8, %xmm0, %xmm12227; AVX512VL-NEXT: vpminub %xmm1, %xmm0, %xmm02228; AVX512VL-NEXT: vphminposuw %xmm0, %xmm02229; AVX512VL-NEXT: vmovd %xmm0, %eax2230; AVX512VL-NEXT: notb %al2231; AVX512VL-NEXT: # kill: def $al killed $al killed $eax2232; AVX512VL-NEXT: vzeroupper2233; AVX512VL-NEXT: retq2234 %1 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> %a0)2235 ret i8 %12236}2237 2238declare i64 @llvm.vector.reduce.umax.v2i64(<2 x i64>)2239declare i64 @llvm.vector.reduce.umax.v4i64(<4 x i64>)2240declare i64 @llvm.vector.reduce.umax.v8i64(<8 x i64>)2241declare i64 @llvm.vector.reduce.umax.v16i64(<16 x i64>)2242 2243declare i32 @llvm.vector.reduce.umax.v2i32(<2 x i32>)2244declare i32 @llvm.vector.reduce.umax.v4i32(<4 x i32>)2245declare i32 @llvm.vector.reduce.umax.v8i32(<8 x i32>)2246declare i32 @llvm.vector.reduce.umax.v16i32(<16 x i32>)2247declare i32 @llvm.vector.reduce.umax.v32i32(<32 x i32>)2248 2249declare i16 @llvm.vector.reduce.umax.v2i16(<2 x i16>)2250declare i16 @llvm.vector.reduce.umax.v4i16(<4 x i16>)2251declare i16 @llvm.vector.reduce.umax.v8i16(<8 x i16>)2252declare i16 @llvm.vector.reduce.umax.v16i16(<16 x i16>)2253declare i16 @llvm.vector.reduce.umax.v32i16(<32 x i16>)2254declare i16 @llvm.vector.reduce.umax.v64i16(<64 x i16>)2255 2256declare i8 @llvm.vector.reduce.umax.v2i8(<2 x i8>)2257declare i8 @llvm.vector.reduce.umax.v4i8(<4 x i8>)2258declare i8 @llvm.vector.reduce.umax.v8i8(<8 x i8>)2259declare i8 @llvm.vector.reduce.umax.v16i8(<16 x i8>)2260declare i8 @llvm.vector.reduce.umax.v32i8(<32 x i8>)2261declare i8 @llvm.vector.reduce.umax.v64i8(<64 x i8>)2262declare i8 @llvm.vector.reduce.umax.v128i8(<128 x i8>)2263