1090 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=ALL,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=ALL,SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=ALL,AVX5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=ALL,AVX512,AVX512BW7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX512,AVX512VL8 9;10; vXf3211;12 13define float @test_v1f32(<1 x float> %a0) {14; ALL-LABEL: test_v1f32:15; ALL: # %bb.0:16; ALL-NEXT: retq17 %1 = call float @llvm.vector.reduce.fmax.v1f32(<1 x float> %a0)18 ret float %119}20 21define float @test_v2f32(<2 x float> %a0) {22; SSE2-LABEL: test_v2f32:23; SSE2: # %bb.0:24; SSE2-NEXT: movaps %xmm0, %xmm225; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1],xmm0[1,1]26; SSE2-NEXT: movaps %xmm0, %xmm127; SSE2-NEXT: cmpunordss %xmm0, %xmm128; SSE2-NEXT: movaps %xmm1, %xmm329; SSE2-NEXT: andps %xmm2, %xmm330; SSE2-NEXT: maxss %xmm0, %xmm231; SSE2-NEXT: andnps %xmm2, %xmm132; SSE2-NEXT: orps %xmm3, %xmm133; SSE2-NEXT: movaps %xmm1, %xmm034; SSE2-NEXT: retq35;36; SSE41-LABEL: test_v2f32:37; SSE41: # %bb.0:38; SSE41-NEXT: movshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]39; SSE41-NEXT: movaps %xmm2, %xmm140; SSE41-NEXT: maxss %xmm0, %xmm141; SSE41-NEXT: cmpunordss %xmm0, %xmm042; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm143; SSE41-NEXT: movaps %xmm1, %xmm044; SSE41-NEXT: retq45;46; AVX-LABEL: test_v2f32:47; AVX: # %bb.0:48; AVX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]49; AVX-NEXT: vmaxss %xmm0, %xmm1, %xmm250; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm051; AVX-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm052; AVX-NEXT: retq53;54; AVX512-LABEL: test_v2f32:55; AVX512: # %bb.0:56; AVX512-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]57; AVX512-NEXT: vmaxss %xmm0, %xmm2, %xmm158; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k159; AVX512-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1}60; AVX512-NEXT: vmovaps %xmm1, %xmm061; AVX512-NEXT: retq62 %1 = call float @llvm.vector.reduce.fmax.v2f32(<2 x float> %a0)63 ret float %164}65 66define float @test_v3f32(<3 x float> %a0) {67; SSE2-LABEL: test_v3f32:68; SSE2: # %bb.0:69; SSE2-NEXT: movaps %xmm0, %xmm170; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]71; SSE2-NEXT: movaps %xmm0, %xmm272; SSE2-NEXT: cmpunordss %xmm0, %xmm273; SSE2-NEXT: movaps %xmm2, %xmm374; SSE2-NEXT: andps %xmm1, %xmm375; SSE2-NEXT: maxss %xmm0, %xmm176; SSE2-NEXT: andnps %xmm1, %xmm277; SSE2-NEXT: orps %xmm3, %xmm278; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]79; SSE2-NEXT: movaps %xmm0, %xmm180; SSE2-NEXT: maxss %xmm2, %xmm181; SSE2-NEXT: cmpunordss %xmm2, %xmm282; SSE2-NEXT: andps %xmm2, %xmm083; SSE2-NEXT: andnps %xmm1, %xmm284; SSE2-NEXT: orps %xmm2, %xmm085; SSE2-NEXT: retq86;87; SSE41-LABEL: test_v3f32:88; SSE41: # %bb.0:89; SSE41-NEXT: movaps %xmm0, %xmm190; SSE41-NEXT: movshdup {{.*#+}} xmm3 = xmm0[1,1,3,3]91; SSE41-NEXT: movaps %xmm3, %xmm292; SSE41-NEXT: maxss %xmm0, %xmm293; SSE41-NEXT: cmpunordss %xmm0, %xmm094; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm295; SSE41-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]96; SSE41-NEXT: movaps %xmm1, %xmm397; SSE41-NEXT: maxss %xmm2, %xmm398; SSE41-NEXT: cmpunordss %xmm2, %xmm299; SSE41-NEXT: movaps %xmm2, %xmm0100; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3101; SSE41-NEXT: movaps %xmm3, %xmm0102; SSE41-NEXT: retq103;104; AVX-LABEL: test_v3f32:105; AVX: # %bb.0:106; AVX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]107; AVX-NEXT: vmaxss %xmm0, %xmm1, %xmm2108; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm3109; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm1110; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2111; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]112; AVX-NEXT: vmaxss %xmm1, %xmm0, %xmm1113; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0114; AVX-NEXT: retq115;116; AVX512-LABEL: test_v3f32:117; AVX512: # %bb.0:118; AVX512-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]119; AVX512-NEXT: vmaxss %xmm0, %xmm1, %xmm2120; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k1121; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}122; AVX512-NEXT: vcmpunordss %xmm2, %xmm2, %k1123; AVX512-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]124; AVX512-NEXT: vmaxss %xmm2, %xmm1, %xmm0125; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}126; AVX512-NEXT: retq127 %1 = call float @llvm.vector.reduce.fmax.v3f32(<3 x float> %a0)128 ret float %1129}130 131define float @test_v4f32(<4 x float> %a0) {132; SSE2-LABEL: test_v4f32:133; SSE2: # %bb.0:134; SSE2-NEXT: movaps %xmm0, %xmm1135; SSE2-NEXT: movaps %xmm0, %xmm2136; SSE2-NEXT: movaps %xmm0, %xmm3137; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[1,1]138; SSE2-NEXT: cmpunordss %xmm0, %xmm0139; SSE2-NEXT: movaps %xmm0, %xmm4140; SSE2-NEXT: andps %xmm3, %xmm4141; SSE2-NEXT: maxss %xmm1, %xmm3142; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3,3,3]143; SSE2-NEXT: movhlps {{.*#+}} xmm2 = xmm2[1,1]144; SSE2-NEXT: andnps %xmm3, %xmm0145; SSE2-NEXT: orps %xmm4, %xmm0146; SSE2-NEXT: movaps %xmm2, %xmm3147; SSE2-NEXT: maxss %xmm0, %xmm3148; SSE2-NEXT: cmpunordss %xmm0, %xmm0149; SSE2-NEXT: movaps %xmm0, %xmm4150; SSE2-NEXT: andnps %xmm3, %xmm4151; SSE2-NEXT: andps %xmm2, %xmm0152; SSE2-NEXT: orps %xmm4, %xmm0153; SSE2-NEXT: movaps %xmm1, %xmm2154; SSE2-NEXT: maxss %xmm0, %xmm2155; SSE2-NEXT: cmpunordss %xmm0, %xmm0156; SSE2-NEXT: movaps %xmm0, %xmm3157; SSE2-NEXT: andnps %xmm2, %xmm3158; SSE2-NEXT: andps %xmm1, %xmm0159; SSE2-NEXT: orps %xmm3, %xmm0160; SSE2-NEXT: retq161;162; SSE41-LABEL: test_v4f32:163; SSE41: # %bb.0:164; SSE41-NEXT: movaps %xmm0, %xmm3165; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[3,3],xmm0[3,3]166; SSE41-NEXT: movaps %xmm0, %xmm4167; SSE41-NEXT: unpckhpd {{.*#+}} xmm4 = xmm4[1],xmm0[1]168; SSE41-NEXT: movshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]169; SSE41-NEXT: movaps %xmm2, %xmm1170; SSE41-NEXT: maxss %xmm0, %xmm1171; SSE41-NEXT: cmpunordss %xmm0, %xmm0172; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1173; SSE41-NEXT: movaps %xmm4, %xmm2174; SSE41-NEXT: maxss %xmm1, %xmm2175; SSE41-NEXT: cmpunordss %xmm1, %xmm1176; SSE41-NEXT: movaps %xmm1, %xmm0177; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm2178; SSE41-NEXT: movaps %xmm3, %xmm1179; SSE41-NEXT: maxss %xmm2, %xmm1180; SSE41-NEXT: cmpunordss %xmm2, %xmm2181; SSE41-NEXT: movaps %xmm2, %xmm0182; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm1183; SSE41-NEXT: movaps %xmm1, %xmm0184; SSE41-NEXT: retq185;186; AVX-LABEL: test_v4f32:187; AVX: # %bb.0:188; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]189; AVX-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]190; AVX-NEXT: vmovshdup {{.*#+}} xmm3 = xmm0[1,1,3,3]191; AVX-NEXT: vmaxss %xmm0, %xmm3, %xmm4192; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0193; AVX-NEXT: vblendvps %xmm0, %xmm3, %xmm4, %xmm0194; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm3195; AVX-NEXT: vmaxss %xmm0, %xmm2, %xmm0196; AVX-NEXT: vblendvps %xmm3, %xmm2, %xmm0, %xmm0197; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm2198; AVX-NEXT: vmaxss %xmm0, %xmm1, %xmm0199; AVX-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm0200; AVX-NEXT: retq201;202; AVX512-LABEL: test_v4f32:203; AVX512: # %bb.0:204; AVX512-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]205; AVX512-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]206; AVX512-NEXT: vmovshdup {{.*#+}} xmm3 = xmm0[1,1,3,3]207; AVX512-NEXT: vmaxss %xmm0, %xmm3, %xmm4208; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k1209; AVX512-NEXT: vmovss %xmm3, %xmm4, %xmm4 {%k1}210; AVX512-NEXT: vcmpunordss %xmm4, %xmm4, %k1211; AVX512-NEXT: vmaxss %xmm4, %xmm2, %xmm0212; AVX512-NEXT: vmovss %xmm2, %xmm0, %xmm0 {%k1}213; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k1214; AVX512-NEXT: vmaxss %xmm0, %xmm1, %xmm0215; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}216; AVX512-NEXT: retq217 %1 = call float @llvm.vector.reduce.fmax.v4f32(<4 x float> %a0)218 ret float %1219}220 221define float @test_v8f32(<8 x float> %a0) {222; SSE2-LABEL: test_v8f32:223; SSE2: # %bb.0:224; SSE2-NEXT: movaps %xmm1, %xmm2225; SSE2-NEXT: maxps %xmm0, %xmm2226; SSE2-NEXT: cmpunordps %xmm0, %xmm0227; SSE2-NEXT: andps %xmm0, %xmm1228; SSE2-NEXT: andnps %xmm2, %xmm0229; SSE2-NEXT: orps %xmm1, %xmm0230; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]231; SSE2-NEXT: movaps %xmm0, %xmm1232; SSE2-NEXT: cmpunordss %xmm0, %xmm1233; SSE2-NEXT: movaps %xmm1, %xmm3234; SSE2-NEXT: andps %xmm2, %xmm3235; SSE2-NEXT: maxss %xmm0, %xmm2236; SSE2-NEXT: andnps %xmm2, %xmm1237; SSE2-NEXT: orps %xmm3, %xmm1238; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]239; SSE2-NEXT: movdqa %xmm2, %xmm3240; SSE2-NEXT: maxss %xmm1, %xmm3241; SSE2-NEXT: cmpunordss %xmm1, %xmm1242; SSE2-NEXT: movaps %xmm1, %xmm4243; SSE2-NEXT: andnps %xmm3, %xmm4244; SSE2-NEXT: andps %xmm2, %xmm1245; SSE2-NEXT: orps %xmm4, %xmm1246; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]247; SSE2-NEXT: movdqa %xmm0, %xmm2248; SSE2-NEXT: maxss %xmm1, %xmm2249; SSE2-NEXT: cmpunordss %xmm1, %xmm1250; SSE2-NEXT: movaps %xmm1, %xmm3251; SSE2-NEXT: andnps %xmm2, %xmm3252; SSE2-NEXT: andps %xmm0, %xmm1253; SSE2-NEXT: orps %xmm3, %xmm1254; SSE2-NEXT: movaps %xmm1, %xmm0255; SSE2-NEXT: retq256;257; SSE41-LABEL: test_v8f32:258; SSE41: # %bb.0:259; SSE41-NEXT: movaps %xmm1, %xmm3260; SSE41-NEXT: maxps %xmm0, %xmm3261; SSE41-NEXT: cmpunordps %xmm0, %xmm0262; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3263; SSE41-NEXT: movshdup {{.*#+}} xmm2 = xmm3[1,1,3,3]264; SSE41-NEXT: movaps %xmm2, %xmm1265; SSE41-NEXT: maxss %xmm3, %xmm1266; SSE41-NEXT: movaps %xmm3, %xmm0267; SSE41-NEXT: cmpunordss %xmm3, %xmm0268; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1269; SSE41-NEXT: movaps %xmm3, %xmm4270; SSE41-NEXT: unpckhpd {{.*#+}} xmm4 = xmm4[1],xmm3[1]271; SSE41-NEXT: movaps %xmm4, %xmm2272; SSE41-NEXT: maxss %xmm1, %xmm2273; SSE41-NEXT: cmpunordss %xmm1, %xmm1274; SSE41-NEXT: movaps %xmm1, %xmm0275; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm2276; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[3,3,3,3]277; SSE41-NEXT: movaps %xmm3, %xmm1278; SSE41-NEXT: maxss %xmm2, %xmm1279; SSE41-NEXT: cmpunordss %xmm2, %xmm2280; SSE41-NEXT: movaps %xmm2, %xmm0281; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm1282; SSE41-NEXT: movaps %xmm1, %xmm0283; SSE41-NEXT: retq284;285; AVX-LABEL: test_v8f32:286; AVX: # %bb.0:287; AVX-NEXT: vextractf128 $1, %ymm0, %xmm1288; AVX-NEXT: vshufps {{.*#+}} xmm2 = xmm1[3,3,3,3]289; AVX-NEXT: vshufpd {{.*#+}} xmm3 = xmm1[1,0]290; AVX-NEXT: vmovshdup {{.*#+}} xmm4 = xmm1[1,1,3,3]291; AVX-NEXT: vshufps {{.*#+}} xmm5 = xmm0[3,3,3,3]292; AVX-NEXT: vshufpd {{.*#+}} xmm6 = xmm0[1,0]293; AVX-NEXT: vmovshdup {{.*#+}} xmm7 = xmm0[1,1,3,3]294; AVX-NEXT: vmaxss %xmm0, %xmm7, %xmm8295; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0296; AVX-NEXT: vblendvps %xmm0, %xmm7, %xmm8, %xmm0297; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm7298; AVX-NEXT: vmaxss %xmm0, %xmm6, %xmm0299; AVX-NEXT: vblendvps %xmm7, %xmm6, %xmm0, %xmm0300; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm6301; AVX-NEXT: vmaxss %xmm0, %xmm5, %xmm0302; AVX-NEXT: vblendvps %xmm6, %xmm5, %xmm0, %xmm0303; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm5304; AVX-NEXT: vmaxss %xmm0, %xmm1, %xmm0305; AVX-NEXT: vblendvps %xmm5, %xmm1, %xmm0, %xmm0306; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm1307; AVX-NEXT: vmaxss %xmm0, %xmm4, %xmm0308; AVX-NEXT: vblendvps %xmm1, %xmm4, %xmm0, %xmm0309; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm1310; AVX-NEXT: vmaxss %xmm0, %xmm3, %xmm0311; AVX-NEXT: vblendvps %xmm1, %xmm3, %xmm0, %xmm0312; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm1313; AVX-NEXT: vmaxss %xmm0, %xmm2, %xmm0314; AVX-NEXT: vblendvps %xmm1, %xmm2, %xmm0, %xmm0315; AVX-NEXT: vzeroupper316; AVX-NEXT: retq317;318; AVX512BW-LABEL: test_v8f32:319; AVX512BW: # %bb.0:320; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm3321; AVX512BW-NEXT: vshufps {{.*#+}} xmm1 = xmm3[3,3,3,3]322; AVX512BW-NEXT: vshufpd {{.*#+}} xmm2 = xmm3[1,0]323; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm4 = xmm3[1,1,3,3]324; AVX512BW-NEXT: vshufps {{.*#+}} xmm5 = xmm0[3,3,3,3]325; AVX512BW-NEXT: vshufpd {{.*#+}} xmm6 = xmm0[1,0]326; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm7 = xmm0[1,1,3,3]327; AVX512BW-NEXT: vmaxss %xmm0, %xmm7, %xmm8328; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1329; AVX512BW-NEXT: vmovss %xmm7, %xmm8, %xmm8 {%k1}330; AVX512BW-NEXT: vcmpunordss %xmm8, %xmm8, %k1331; AVX512BW-NEXT: vmaxss %xmm8, %xmm6, %xmm0332; AVX512BW-NEXT: vmovss %xmm6, %xmm0, %xmm0 {%k1}333; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1334; AVX512BW-NEXT: vmaxss %xmm0, %xmm5, %xmm0335; AVX512BW-NEXT: vmovss %xmm5, %xmm0, %xmm0 {%k1}336; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1337; AVX512BW-NEXT: vmaxss %xmm0, %xmm3, %xmm0338; AVX512BW-NEXT: vmovss %xmm3, %xmm0, %xmm0 {%k1}339; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1340; AVX512BW-NEXT: vmaxss %xmm0, %xmm4, %xmm0341; AVX512BW-NEXT: vmovss %xmm4, %xmm0, %xmm0 {%k1}342; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1343; AVX512BW-NEXT: vmaxss %xmm0, %xmm2, %xmm0344; AVX512BW-NEXT: vmovss %xmm2, %xmm0, %xmm0 {%k1}345; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1346; AVX512BW-NEXT: vmaxss %xmm0, %xmm1, %xmm0347; AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}348; AVX512BW-NEXT: vzeroupper349; AVX512BW-NEXT: retq350;351; AVX512VL-LABEL: test_v8f32:352; AVX512VL: # %bb.0:353; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm1354; AVX512VL-NEXT: vshufps {{.*#+}} xmm2 = xmm1[3,3,3,3]355; AVX512VL-NEXT: vshufpd {{.*#+}} xmm3 = xmm1[1,0]356; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm4 = xmm1[1,1,3,3]357; AVX512VL-NEXT: vshufps {{.*#+}} xmm5 = xmm0[3,3,3,3]358; AVX512VL-NEXT: vshufpd {{.*#+}} xmm6 = xmm0[1,0]359; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm7 = xmm0[1,1,3,3]360; AVX512VL-NEXT: vmaxss %xmm0, %xmm7, %xmm8361; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1362; AVX512VL-NEXT: vmovss %xmm7, %xmm8, %xmm8 {%k1}363; AVX512VL-NEXT: vcmpunordss %xmm8, %xmm8, %k1364; AVX512VL-NEXT: vmaxss %xmm8, %xmm6, %xmm0365; AVX512VL-NEXT: vmovss %xmm6, %xmm0, %xmm0 {%k1}366; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1367; AVX512VL-NEXT: vmaxss %xmm0, %xmm5, %xmm0368; AVX512VL-NEXT: vmovss %xmm5, %xmm0, %xmm0 {%k1}369; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1370; AVX512VL-NEXT: vmaxss %xmm0, %xmm1, %xmm0371; AVX512VL-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}372; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1373; AVX512VL-NEXT: vmaxss %xmm0, %xmm4, %xmm0374; AVX512VL-NEXT: vmovss %xmm4, %xmm0, %xmm0 {%k1}375; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1376; AVX512VL-NEXT: vmaxss %xmm0, %xmm3, %xmm0377; AVX512VL-NEXT: vmovss %xmm3, %xmm0, %xmm0 {%k1}378; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1379; AVX512VL-NEXT: vmaxss %xmm0, %xmm2, %xmm0380; AVX512VL-NEXT: vmovss %xmm2, %xmm0, %xmm0 {%k1}381; AVX512VL-NEXT: vzeroupper382; AVX512VL-NEXT: retq383 %1 = call float @llvm.vector.reduce.fmax.v8f32(<8 x float> %a0)384 ret float %1385}386 387define float @test_v16f32(<16 x float> %a0) {388; SSE2-LABEL: test_v16f32:389; SSE2: # %bb.0:390; SSE2-NEXT: movaps %xmm2, %xmm4391; SSE2-NEXT: maxps %xmm0, %xmm4392; SSE2-NEXT: cmpunordps %xmm0, %xmm0393; SSE2-NEXT: andps %xmm0, %xmm2394; SSE2-NEXT: andnps %xmm4, %xmm0395; SSE2-NEXT: orps %xmm2, %xmm0396; SSE2-NEXT: movaps %xmm3, %xmm2397; SSE2-NEXT: maxps %xmm1, %xmm2398; SSE2-NEXT: cmpunordps %xmm1, %xmm1399; SSE2-NEXT: andps %xmm1, %xmm3400; SSE2-NEXT: andnps %xmm2, %xmm1401; SSE2-NEXT: orps %xmm3, %xmm1402; SSE2-NEXT: movaps %xmm1, %xmm2403; SSE2-NEXT: maxps %xmm0, %xmm2404; SSE2-NEXT: cmpunordps %xmm0, %xmm0405; SSE2-NEXT: andps %xmm0, %xmm1406; SSE2-NEXT: andnps %xmm2, %xmm0407; SSE2-NEXT: orps %xmm1, %xmm0408; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]409; SSE2-NEXT: movaps %xmm0, %xmm1410; SSE2-NEXT: cmpunordss %xmm0, %xmm1411; SSE2-NEXT: movaps %xmm1, %xmm3412; SSE2-NEXT: andps %xmm2, %xmm3413; SSE2-NEXT: maxss %xmm0, %xmm2414; SSE2-NEXT: andnps %xmm2, %xmm1415; SSE2-NEXT: orps %xmm3, %xmm1416; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]417; SSE2-NEXT: movdqa %xmm2, %xmm3418; SSE2-NEXT: maxss %xmm1, %xmm3419; SSE2-NEXT: cmpunordss %xmm1, %xmm1420; SSE2-NEXT: movaps %xmm1, %xmm4421; SSE2-NEXT: andnps %xmm3, %xmm4422; SSE2-NEXT: andps %xmm2, %xmm1423; SSE2-NEXT: orps %xmm4, %xmm1424; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]425; SSE2-NEXT: movdqa %xmm0, %xmm2426; SSE2-NEXT: maxss %xmm1, %xmm2427; SSE2-NEXT: cmpunordss %xmm1, %xmm1428; SSE2-NEXT: movaps %xmm1, %xmm3429; SSE2-NEXT: andnps %xmm2, %xmm3430; SSE2-NEXT: andps %xmm0, %xmm1431; SSE2-NEXT: orps %xmm3, %xmm1432; SSE2-NEXT: movaps %xmm1, %xmm0433; SSE2-NEXT: retq434;435; SSE41-LABEL: test_v16f32:436; SSE41: # %bb.0:437; SSE41-NEXT: movaps %xmm2, %xmm4438; SSE41-NEXT: maxps %xmm0, %xmm4439; SSE41-NEXT: cmpunordps %xmm0, %xmm0440; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm4441; SSE41-NEXT: movaps %xmm3, %xmm2442; SSE41-NEXT: maxps %xmm1, %xmm2443; SSE41-NEXT: cmpunordps %xmm1, %xmm1444; SSE41-NEXT: movaps %xmm1, %xmm0445; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm2446; SSE41-NEXT: movaps %xmm2, %xmm3447; SSE41-NEXT: maxps %xmm4, %xmm3448; SSE41-NEXT: cmpunordps %xmm4, %xmm4449; SSE41-NEXT: movaps %xmm4, %xmm0450; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm3451; SSE41-NEXT: movshdup {{.*#+}} xmm2 = xmm3[1,1,3,3]452; SSE41-NEXT: movaps %xmm2, %xmm1453; SSE41-NEXT: maxss %xmm3, %xmm1454; SSE41-NEXT: movaps %xmm3, %xmm0455; SSE41-NEXT: cmpunordss %xmm3, %xmm0456; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1457; SSE41-NEXT: movaps %xmm3, %xmm4458; SSE41-NEXT: unpckhpd {{.*#+}} xmm4 = xmm4[1],xmm3[1]459; SSE41-NEXT: movaps %xmm4, %xmm2460; SSE41-NEXT: maxss %xmm1, %xmm2461; SSE41-NEXT: cmpunordss %xmm1, %xmm1462; SSE41-NEXT: movaps %xmm1, %xmm0463; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm2464; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[3,3,3,3]465; SSE41-NEXT: movaps %xmm3, %xmm1466; SSE41-NEXT: maxss %xmm2, %xmm1467; SSE41-NEXT: cmpunordss %xmm2, %xmm2468; SSE41-NEXT: movaps %xmm2, %xmm0469; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm1470; SSE41-NEXT: movaps %xmm1, %xmm0471; SSE41-NEXT: retq472;473; AVX-LABEL: test_v16f32:474; AVX: # %bb.0:475; AVX-NEXT: vmaxps %ymm0, %ymm1, %ymm2476; AVX-NEXT: vcmpunordps %ymm0, %ymm0, %ymm0477; AVX-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0478; AVX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]479; AVX-NEXT: vmaxss %xmm0, %xmm1, %xmm2480; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm3481; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm1482; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2483; AVX-NEXT: vshufpd {{.*#+}} xmm3 = xmm0[1,0]484; AVX-NEXT: vmaxss %xmm1, %xmm3, %xmm1485; AVX-NEXT: vblendvps %xmm2, %xmm3, %xmm1, %xmm1486; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2487; AVX-NEXT: vshufps {{.*#+}} xmm3 = xmm0[3,3,3,3]488; AVX-NEXT: vmaxss %xmm1, %xmm3, %xmm1489; AVX-NEXT: vblendvps %xmm2, %xmm3, %xmm1, %xmm1490; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2491; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0492; AVX-NEXT: vmaxss %xmm1, %xmm0, %xmm1493; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm1494; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2495; AVX-NEXT: vmovshdup {{.*#+}} xmm3 = xmm0[1,1,3,3]496; AVX-NEXT: vmaxss %xmm1, %xmm3, %xmm1497; AVX-NEXT: vblendvps %xmm2, %xmm3, %xmm1, %xmm1498; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2499; AVX-NEXT: vshufpd {{.*#+}} xmm3 = xmm0[1,0]500; AVX-NEXT: vmaxss %xmm1, %xmm3, %xmm1501; AVX-NEXT: vblendvps %xmm2, %xmm3, %xmm1, %xmm1502; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2503; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]504; AVX-NEXT: vmaxss %xmm1, %xmm0, %xmm1505; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0506; AVX-NEXT: vzeroupper507; AVX-NEXT: retq508;509; AVX512BW-LABEL: test_v16f32:510; AVX512BW: # %bb.0:511; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm1512; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]513; AVX512BW-NEXT: vmaxss %xmm0, %xmm2, %xmm3514; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1515; AVX512BW-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1}516; AVX512BW-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]517; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1518; AVX512BW-NEXT: vmaxss %xmm3, %xmm2, %xmm3519; AVX512BW-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1}520; AVX512BW-NEXT: vshufps {{.*#+}} xmm2 = xmm0[3,3,3,3]521; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1522; AVX512BW-NEXT: vmaxss %xmm3, %xmm2, %xmm3523; AVX512BW-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1}524; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]525; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1526; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm3527; AVX512BW-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1}528; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1529; AVX512BW-NEXT: vmaxss %xmm3, %xmm2, %xmm3530; AVX512BW-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1}531; AVX512BW-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0]532; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1533; AVX512BW-NEXT: vmaxss %xmm3, %xmm2, %xmm3534; AVX512BW-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1}535; AVX512BW-NEXT: vextractf32x4 $2, %zmm0, %xmm2536; AVX512BW-NEXT: vshufps {{.*#+}} xmm1 = xmm1[3,3,3,3]537; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1538; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm3539; AVX512BW-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1}540; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]541; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1542; AVX512BW-NEXT: vmaxss %xmm3, %xmm2, %xmm3543; AVX512BW-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1}544; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1545; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm3546; AVX512BW-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1}547; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm2[1,0]548; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1549; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm3550; AVX512BW-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1}551; AVX512BW-NEXT: vextractf32x4 $3, %zmm0, %xmm0552; AVX512BW-NEXT: vshufps {{.*#+}} xmm1 = xmm2[3,3,3,3]553; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1554; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm2555; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}556; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]557; AVX512BW-NEXT: vcmpunordss %xmm2, %xmm2, %k1558; AVX512BW-NEXT: vmaxss %xmm2, %xmm0, %xmm2559; AVX512BW-NEXT: vmovss %xmm0, %xmm2, %xmm2 {%k1}560; AVX512BW-NEXT: vcmpunordss %xmm2, %xmm2, %k1561; AVX512BW-NEXT: vmaxss %xmm2, %xmm1, %xmm2562; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}563; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]564; AVX512BW-NEXT: vcmpunordss %xmm2, %xmm2, %k1565; AVX512BW-NEXT: vmaxss %xmm2, %xmm1, %xmm2566; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}567; AVX512BW-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]568; AVX512BW-NEXT: vcmpunordss %xmm2, %xmm2, %k1569; AVX512BW-NEXT: vmaxss %xmm2, %xmm1, %xmm0570; AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}571; AVX512BW-NEXT: vzeroupper572; AVX512BW-NEXT: retq573;574; AVX512VL-LABEL: test_v16f32:575; AVX512VL: # %bb.0:576; AVX512VL-NEXT: vextractf32x4 $3, %zmm0, %xmm3577; AVX512VL-NEXT: vshufps {{.*#+}} xmm1 = xmm3[3,3,3,3]578; AVX512VL-NEXT: vshufpd {{.*#+}} xmm2 = xmm3[1,0]579; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm4 = xmm3[1,1,3,3]580; AVX512VL-NEXT: vextractf32x4 $2, %zmm0, %xmm6581; AVX512VL-NEXT: vshufps {{.*#+}} xmm5 = xmm6[3,3,3,3]582; AVX512VL-NEXT: vshufpd {{.*#+}} xmm7 = xmm6[1,0]583; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm8 = xmm6[1,1,3,3]584; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm9585; AVX512VL-NEXT: vshufps {{.*#+}} xmm10 = xmm9[3,3,3,3]586; AVX512VL-NEXT: vshufpd {{.*#+}} xmm11 = xmm9[1,0]587; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm12 = xmm9[1,1,3,3]588; AVX512VL-NEXT: vshufps {{.*#+}} xmm13 = xmm0[3,3,3,3]589; AVX512VL-NEXT: vshufpd {{.*#+}} xmm14 = xmm0[1,0]590; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm15 = xmm0[1,1,3,3]591; AVX512VL-NEXT: vmaxss %xmm0, %xmm15, %xmm16592; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1593; AVX512VL-NEXT: vmovss %xmm15, %xmm16, %xmm16 {%k1}594; AVX512VL-NEXT: vcmpunordss %xmm16, %xmm16, %k1595; AVX512VL-NEXT: vmaxss %xmm16, %xmm14, %xmm0596; AVX512VL-NEXT: vmovss %xmm14, %xmm0, %xmm0 {%k1}597; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1598; AVX512VL-NEXT: vmaxss %xmm0, %xmm13, %xmm0599; AVX512VL-NEXT: vmovss %xmm13, %xmm0, %xmm0 {%k1}600; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1601; AVX512VL-NEXT: vmaxss %xmm0, %xmm9, %xmm0602; AVX512VL-NEXT: vmovss %xmm9, %xmm0, %xmm0 {%k1}603; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1604; AVX512VL-NEXT: vmaxss %xmm0, %xmm12, %xmm0605; AVX512VL-NEXT: vmovss %xmm12, %xmm0, %xmm0 {%k1}606; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1607; AVX512VL-NEXT: vmaxss %xmm0, %xmm11, %xmm0608; AVX512VL-NEXT: vmovss %xmm11, %xmm0, %xmm0 {%k1}609; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1610; AVX512VL-NEXT: vmaxss %xmm0, %xmm10, %xmm0611; AVX512VL-NEXT: vmovss %xmm10, %xmm0, %xmm0 {%k1}612; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1613; AVX512VL-NEXT: vmaxss %xmm0, %xmm6, %xmm0614; AVX512VL-NEXT: vmovss %xmm6, %xmm0, %xmm0 {%k1}615; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1616; AVX512VL-NEXT: vmaxss %xmm0, %xmm8, %xmm0617; AVX512VL-NEXT: vmovss %xmm8, %xmm0, %xmm0 {%k1}618; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1619; AVX512VL-NEXT: vmaxss %xmm0, %xmm7, %xmm0620; AVX512VL-NEXT: vmovss %xmm7, %xmm0, %xmm0 {%k1}621; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1622; AVX512VL-NEXT: vmaxss %xmm0, %xmm5, %xmm0623; AVX512VL-NEXT: vmovss %xmm5, %xmm0, %xmm0 {%k1}624; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1625; AVX512VL-NEXT: vmaxss %xmm0, %xmm3, %xmm0626; AVX512VL-NEXT: vmovss %xmm3, %xmm0, %xmm0 {%k1}627; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1628; AVX512VL-NEXT: vmaxss %xmm0, %xmm4, %xmm0629; AVX512VL-NEXT: vmovss %xmm4, %xmm0, %xmm0 {%k1}630; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1631; AVX512VL-NEXT: vmaxss %xmm0, %xmm2, %xmm0632; AVX512VL-NEXT: vmovss %xmm2, %xmm0, %xmm0 {%k1}633; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1634; AVX512VL-NEXT: vmaxss %xmm0, %xmm1, %xmm0635; AVX512VL-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}636; AVX512VL-NEXT: vzeroupper637; AVX512VL-NEXT: retq638 %1 = call float @llvm.vector.reduce.fmax.v16f32(<16 x float> %a0)639 ret float %1640}641 642;643; vXf64644;645 646define double @test_v2f64(<2 x double> %a0) {647; SSE2-LABEL: test_v2f64:648; SSE2: # %bb.0:649; SSE2-NEXT: movapd %xmm0, %xmm2650; SSE2-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1]651; SSE2-NEXT: movapd %xmm0, %xmm1652; SSE2-NEXT: cmpunordsd %xmm0, %xmm1653; SSE2-NEXT: movapd %xmm1, %xmm3654; SSE2-NEXT: andpd %xmm2, %xmm3655; SSE2-NEXT: maxsd %xmm0, %xmm2656; SSE2-NEXT: andnpd %xmm2, %xmm1657; SSE2-NEXT: orpd %xmm3, %xmm1658; SSE2-NEXT: movapd %xmm1, %xmm0659; SSE2-NEXT: retq660;661; SSE41-LABEL: test_v2f64:662; SSE41: # %bb.0:663; SSE41-NEXT: movapd %xmm0, %xmm2664; SSE41-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1]665; SSE41-NEXT: movapd %xmm2, %xmm1666; SSE41-NEXT: maxsd %xmm0, %xmm1667; SSE41-NEXT: cmpunordsd %xmm0, %xmm0668; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1669; SSE41-NEXT: movapd %xmm1, %xmm0670; SSE41-NEXT: retq671;672; AVX-LABEL: test_v2f64:673; AVX: # %bb.0:674; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]675; AVX-NEXT: vmaxsd %xmm0, %xmm1, %xmm2676; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm0677; AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0678; AVX-NEXT: retq679;680; AVX512-LABEL: test_v2f64:681; AVX512: # %bb.0:682; AVX512-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]683; AVX512-NEXT: vmaxsd %xmm0, %xmm2, %xmm1684; AVX512-NEXT: vcmpunordsd %xmm0, %xmm0, %k1685; AVX512-NEXT: vmovsd %xmm2, %xmm1, %xmm1 {%k1}686; AVX512-NEXT: vmovapd %xmm1, %xmm0687; AVX512-NEXT: retq688 %1 = call double @llvm.vector.reduce.fmax.v2f64(<2 x double> %a0)689 ret double %1690}691 692define double @test_v4f64(<4 x double> %a0) {693; SSE2-LABEL: test_v4f64:694; SSE2: # %bb.0:695; SSE2-NEXT: movapd %xmm1, %xmm2696; SSE2-NEXT: maxpd %xmm0, %xmm2697; SSE2-NEXT: cmpunordpd %xmm0, %xmm0698; SSE2-NEXT: andpd %xmm0, %xmm1699; SSE2-NEXT: andnpd %xmm2, %xmm0700; SSE2-NEXT: orpd %xmm1, %xmm0701; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]702; SSE2-NEXT: movapd %xmm0, %xmm1703; SSE2-NEXT: cmpunordsd %xmm0, %xmm1704; SSE2-NEXT: movapd %xmm1, %xmm3705; SSE2-NEXT: andpd %xmm2, %xmm3706; SSE2-NEXT: maxsd %xmm0, %xmm2707; SSE2-NEXT: andnpd %xmm2, %xmm1708; SSE2-NEXT: orpd %xmm3, %xmm1709; SSE2-NEXT: movapd %xmm1, %xmm0710; SSE2-NEXT: retq711;712; SSE41-LABEL: test_v4f64:713; SSE41: # %bb.0:714; SSE41-NEXT: movapd %xmm1, %xmm2715; SSE41-NEXT: maxpd %xmm0, %xmm2716; SSE41-NEXT: cmpunordpd %xmm0, %xmm0717; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2718; SSE41-NEXT: movapd %xmm2, %xmm3719; SSE41-NEXT: unpckhpd {{.*#+}} xmm3 = xmm3[1],xmm2[1]720; SSE41-NEXT: movapd %xmm3, %xmm1721; SSE41-NEXT: maxsd %xmm2, %xmm1722; SSE41-NEXT: cmpunordsd %xmm2, %xmm2723; SSE41-NEXT: movapd %xmm2, %xmm0724; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1725; SSE41-NEXT: movapd %xmm1, %xmm0726; SSE41-NEXT: retq727;728; AVX-LABEL: test_v4f64:729; AVX: # %bb.0:730; AVX-NEXT: vextractf128 $1, %ymm0, %xmm1731; AVX-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0]732; AVX-NEXT: vshufpd {{.*#+}} xmm3 = xmm0[1,0]733; AVX-NEXT: vmaxsd %xmm0, %xmm3, %xmm4734; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm0735; AVX-NEXT: vblendvpd %xmm0, %xmm3, %xmm4, %xmm0736; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm3737; AVX-NEXT: vmaxsd %xmm0, %xmm1, %xmm0738; AVX-NEXT: vblendvpd %xmm3, %xmm1, %xmm0, %xmm0739; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm1740; AVX-NEXT: vmaxsd %xmm0, %xmm2, %xmm0741; AVX-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0742; AVX-NEXT: vzeroupper743; AVX-NEXT: retq744;745; AVX512-LABEL: test_v4f64:746; AVX512: # %bb.0:747; AVX512-NEXT: vextractf128 $1, %ymm0, %xmm1748; AVX512-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0]749; AVX512-NEXT: vshufpd {{.*#+}} xmm3 = xmm0[1,0]750; AVX512-NEXT: vmaxsd %xmm0, %xmm3, %xmm4751; AVX512-NEXT: vcmpunordsd %xmm0, %xmm0, %k1752; AVX512-NEXT: vmovsd %xmm3, %xmm4, %xmm4 {%k1}753; AVX512-NEXT: vcmpunordsd %xmm4, %xmm4, %k1754; AVX512-NEXT: vmaxsd %xmm4, %xmm1, %xmm0755; AVX512-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}756; AVX512-NEXT: vcmpunordsd %xmm0, %xmm0, %k1757; AVX512-NEXT: vmaxsd %xmm0, %xmm2, %xmm0758; AVX512-NEXT: vmovsd %xmm2, %xmm0, %xmm0 {%k1}759; AVX512-NEXT: vzeroupper760; AVX512-NEXT: retq761 %1 = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %a0)762 ret double %1763}764 765define double @test_v8f64(<8 x double> %a0) {766; SSE2-LABEL: test_v8f64:767; SSE2: # %bb.0:768; SSE2-NEXT: movapd %xmm2, %xmm4769; SSE2-NEXT: maxpd %xmm0, %xmm4770; SSE2-NEXT: cmpunordpd %xmm0, %xmm0771; SSE2-NEXT: andpd %xmm0, %xmm2772; SSE2-NEXT: andnpd %xmm4, %xmm0773; SSE2-NEXT: orpd %xmm2, %xmm0774; SSE2-NEXT: movapd %xmm3, %xmm2775; SSE2-NEXT: maxpd %xmm1, %xmm2776; SSE2-NEXT: cmpunordpd %xmm1, %xmm1777; SSE2-NEXT: andpd %xmm1, %xmm3778; SSE2-NEXT: andnpd %xmm2, %xmm1779; SSE2-NEXT: orpd %xmm3, %xmm1780; SSE2-NEXT: movapd %xmm1, %xmm2781; SSE2-NEXT: maxpd %xmm0, %xmm2782; SSE2-NEXT: cmpunordpd %xmm0, %xmm0783; SSE2-NEXT: andpd %xmm0, %xmm1784; SSE2-NEXT: andnpd %xmm2, %xmm0785; SSE2-NEXT: orpd %xmm1, %xmm0786; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]787; SSE2-NEXT: movapd %xmm0, %xmm1788; SSE2-NEXT: cmpunordsd %xmm0, %xmm1789; SSE2-NEXT: movapd %xmm1, %xmm3790; SSE2-NEXT: andpd %xmm2, %xmm3791; SSE2-NEXT: maxsd %xmm0, %xmm2792; SSE2-NEXT: andnpd %xmm2, %xmm1793; SSE2-NEXT: orpd %xmm3, %xmm1794; SSE2-NEXT: movapd %xmm1, %xmm0795; SSE2-NEXT: retq796;797; SSE41-LABEL: test_v8f64:798; SSE41: # %bb.0:799; SSE41-NEXT: movapd %xmm2, %xmm4800; SSE41-NEXT: maxpd %xmm0, %xmm4801; SSE41-NEXT: cmpunordpd %xmm0, %xmm0802; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4803; SSE41-NEXT: movapd %xmm3, %xmm2804; SSE41-NEXT: maxpd %xmm1, %xmm2805; SSE41-NEXT: cmpunordpd %xmm1, %xmm1806; SSE41-NEXT: movapd %xmm1, %xmm0807; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2808; SSE41-NEXT: movapd %xmm2, %xmm1809; SSE41-NEXT: maxpd %xmm4, %xmm1810; SSE41-NEXT: cmpunordpd %xmm4, %xmm4811; SSE41-NEXT: movapd %xmm4, %xmm0812; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1813; SSE41-NEXT: movapd %xmm1, %xmm3814; SSE41-NEXT: unpckhpd {{.*#+}} xmm3 = xmm3[1],xmm1[1]815; SSE41-NEXT: movapd %xmm3, %xmm2816; SSE41-NEXT: maxsd %xmm1, %xmm2817; SSE41-NEXT: cmpunordsd %xmm1, %xmm1818; SSE41-NEXT: movapd %xmm1, %xmm0819; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2820; SSE41-NEXT: movapd %xmm2, %xmm0821; SSE41-NEXT: retq822;823; AVX-LABEL: test_v8f64:824; AVX: # %bb.0:825; AVX-NEXT: vmaxpd %ymm0, %ymm1, %ymm2826; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm0827; AVX-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm0828; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]829; AVX-NEXT: vmaxsd %xmm0, %xmm1, %xmm2830; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm3831; AVX-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1832; AVX-NEXT: vcmpunordsd %xmm1, %xmm1, %xmm2833; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0834; AVX-NEXT: vmaxsd %xmm1, %xmm0, %xmm1835; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm1836; AVX-NEXT: vcmpunordsd %xmm1, %xmm1, %xmm2837; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]838; AVX-NEXT: vmaxsd %xmm1, %xmm0, %xmm1839; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0840; AVX-NEXT: vzeroupper841; AVX-NEXT: retq842;843; AVX512BW-LABEL: test_v8f64:844; AVX512BW: # %bb.0:845; AVX512BW-NEXT: vextractf32x4 $3, %zmm0, %xmm2846; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm2[1,0]847; AVX512BW-NEXT: vextractf32x4 $2, %zmm0, %xmm3848; AVX512BW-NEXT: vshufpd {{.*#+}} xmm4 = xmm3[1,0]849; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm5850; AVX512BW-NEXT: vshufpd {{.*#+}} xmm6 = xmm5[1,0]851; AVX512BW-NEXT: vshufpd {{.*#+}} xmm7 = xmm0[1,0]852; AVX512BW-NEXT: vmaxsd %xmm0, %xmm7, %xmm8853; AVX512BW-NEXT: vcmpunordsd %xmm0, %xmm0, %k1854; AVX512BW-NEXT: vmovsd %xmm7, %xmm8, %xmm8 {%k1}855; AVX512BW-NEXT: vcmpunordsd %xmm8, %xmm8, %k1856; AVX512BW-NEXT: vmaxsd %xmm8, %xmm5, %xmm0857; AVX512BW-NEXT: vmovsd %xmm5, %xmm0, %xmm0 {%k1}858; AVX512BW-NEXT: vcmpunordsd %xmm0, %xmm0, %k1859; AVX512BW-NEXT: vmaxsd %xmm0, %xmm6, %xmm0860; AVX512BW-NEXT: vmovsd %xmm6, %xmm0, %xmm0 {%k1}861; AVX512BW-NEXT: vcmpunordsd %xmm0, %xmm0, %k1862; AVX512BW-NEXT: vmaxsd %xmm0, %xmm3, %xmm0863; AVX512BW-NEXT: vmovsd %xmm3, %xmm0, %xmm0 {%k1}864; AVX512BW-NEXT: vcmpunordsd %xmm0, %xmm0, %k1865; AVX512BW-NEXT: vmaxsd %xmm0, %xmm4, %xmm0866; AVX512BW-NEXT: vmovsd %xmm4, %xmm0, %xmm0 {%k1}867; AVX512BW-NEXT: vcmpunordsd %xmm0, %xmm0, %k1868; AVX512BW-NEXT: vmaxsd %xmm0, %xmm2, %xmm0869; AVX512BW-NEXT: vmovsd %xmm2, %xmm0, %xmm0 {%k1}870; AVX512BW-NEXT: vcmpunordsd %xmm0, %xmm0, %k1871; AVX512BW-NEXT: vmaxsd %xmm0, %xmm1, %xmm0872; AVX512BW-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}873; AVX512BW-NEXT: vzeroupper874; AVX512BW-NEXT: retq875;876; AVX512VL-LABEL: test_v8f64:877; AVX512VL: # %bb.0:878; AVX512VL-NEXT: vextractf32x4 $3, %zmm0, %xmm1879; AVX512VL-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0]880; AVX512VL-NEXT: vextractf32x4 $2, %zmm0, %xmm3881; AVX512VL-NEXT: vshufpd {{.*#+}} xmm4 = xmm3[1,0]882; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm5883; AVX512VL-NEXT: vshufpd {{.*#+}} xmm6 = xmm5[1,0]884; AVX512VL-NEXT: vshufpd {{.*#+}} xmm7 = xmm0[1,0]885; AVX512VL-NEXT: vmaxsd %xmm0, %xmm7, %xmm8886; AVX512VL-NEXT: vcmpunordsd %xmm0, %xmm0, %k1887; AVX512VL-NEXT: vmovsd %xmm7, %xmm8, %xmm8 {%k1}888; AVX512VL-NEXT: vcmpunordsd %xmm8, %xmm8, %k1889; AVX512VL-NEXT: vmaxsd %xmm8, %xmm5, %xmm0890; AVX512VL-NEXT: vmovsd %xmm5, %xmm0, %xmm0 {%k1}891; AVX512VL-NEXT: vcmpunordsd %xmm0, %xmm0, %k1892; AVX512VL-NEXT: vmaxsd %xmm0, %xmm6, %xmm0893; AVX512VL-NEXT: vmovsd %xmm6, %xmm0, %xmm0 {%k1}894; AVX512VL-NEXT: vcmpunordsd %xmm0, %xmm0, %k1895; AVX512VL-NEXT: vmaxsd %xmm0, %xmm3, %xmm0896; AVX512VL-NEXT: vmovsd %xmm3, %xmm0, %xmm0 {%k1}897; AVX512VL-NEXT: vcmpunordsd %xmm0, %xmm0, %k1898; AVX512VL-NEXT: vmaxsd %xmm0, %xmm4, %xmm0899; AVX512VL-NEXT: vmovsd %xmm4, %xmm0, %xmm0 {%k1}900; AVX512VL-NEXT: vcmpunordsd %xmm0, %xmm0, %k1901; AVX512VL-NEXT: vmaxsd %xmm0, %xmm1, %xmm0902; AVX512VL-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}903; AVX512VL-NEXT: vcmpunordsd %xmm0, %xmm0, %k1904; AVX512VL-NEXT: vmaxsd %xmm0, %xmm2, %xmm0905; AVX512VL-NEXT: vmovsd %xmm2, %xmm0, %xmm0 {%k1}906; AVX512VL-NEXT: vzeroupper907; AVX512VL-NEXT: retq908 %1 = call double @llvm.vector.reduce.fmax.v8f64(<8 x double> %a0)909 ret double %1910}911 912define double @test_v16f64(<16 x double> %a0) {913; SSE2-LABEL: test_v16f64:914; SSE2: # %bb.0:915; SSE2-NEXT: movapd %xmm4, %xmm8916; SSE2-NEXT: maxpd %xmm0, %xmm8917; SSE2-NEXT: cmpunordpd %xmm0, %xmm0918; SSE2-NEXT: andpd %xmm0, %xmm4919; SSE2-NEXT: andnpd %xmm8, %xmm0920; SSE2-NEXT: orpd %xmm4, %xmm0921; SSE2-NEXT: movapd %xmm6, %xmm4922; SSE2-NEXT: maxpd %xmm2, %xmm4923; SSE2-NEXT: cmpunordpd %xmm2, %xmm2924; SSE2-NEXT: andpd %xmm2, %xmm6925; SSE2-NEXT: andnpd %xmm4, %xmm2926; SSE2-NEXT: orpd %xmm6, %xmm2927; SSE2-NEXT: movapd %xmm2, %xmm4928; SSE2-NEXT: maxpd %xmm0, %xmm4929; SSE2-NEXT: cmpunordpd %xmm0, %xmm0930; SSE2-NEXT: andpd %xmm0, %xmm2931; SSE2-NEXT: andnpd %xmm4, %xmm0932; SSE2-NEXT: orpd %xmm2, %xmm0933; SSE2-NEXT: movapd %xmm5, %xmm2934; SSE2-NEXT: maxpd %xmm1, %xmm2935; SSE2-NEXT: cmpunordpd %xmm1, %xmm1936; SSE2-NEXT: andpd %xmm1, %xmm5937; SSE2-NEXT: andnpd %xmm2, %xmm1938; SSE2-NEXT: orpd %xmm5, %xmm1939; SSE2-NEXT: movapd %xmm7, %xmm2940; SSE2-NEXT: maxpd %xmm3, %xmm2941; SSE2-NEXT: cmpunordpd %xmm3, %xmm3942; SSE2-NEXT: andpd %xmm3, %xmm7943; SSE2-NEXT: andnpd %xmm2, %xmm3944; SSE2-NEXT: orpd %xmm7, %xmm3945; SSE2-NEXT: movapd %xmm3, %xmm2946; SSE2-NEXT: maxpd %xmm1, %xmm2947; SSE2-NEXT: cmpunordpd %xmm1, %xmm1948; SSE2-NEXT: andpd %xmm1, %xmm3949; SSE2-NEXT: andnpd %xmm2, %xmm1950; SSE2-NEXT: orpd %xmm3, %xmm1951; SSE2-NEXT: movapd %xmm1, %xmm2952; SSE2-NEXT: maxpd %xmm0, %xmm2953; SSE2-NEXT: cmpunordpd %xmm0, %xmm0954; SSE2-NEXT: andpd %xmm0, %xmm1955; SSE2-NEXT: andnpd %xmm2, %xmm0956; SSE2-NEXT: orpd %xmm1, %xmm0957; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]958; SSE2-NEXT: movapd %xmm0, %xmm1959; SSE2-NEXT: cmpunordsd %xmm0, %xmm1960; SSE2-NEXT: movapd %xmm1, %xmm3961; SSE2-NEXT: andpd %xmm2, %xmm3962; SSE2-NEXT: maxsd %xmm0, %xmm2963; SSE2-NEXT: andnpd %xmm2, %xmm1964; SSE2-NEXT: orpd %xmm3, %xmm1965; SSE2-NEXT: movapd %xmm1, %xmm0966; SSE2-NEXT: retq967;968; SSE41-LABEL: test_v16f64:969; SSE41: # %bb.0:970; SSE41-NEXT: movapd %xmm4, %xmm8971; SSE41-NEXT: maxpd %xmm0, %xmm8972; SSE41-NEXT: cmpunordpd %xmm0, %xmm0973; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm8974; SSE41-NEXT: movapd %xmm6, %xmm4975; SSE41-NEXT: maxpd %xmm2, %xmm4976; SSE41-NEXT: cmpunordpd %xmm2, %xmm2977; SSE41-NEXT: movapd %xmm2, %xmm0978; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm4979; SSE41-NEXT: movapd %xmm4, %xmm2980; SSE41-NEXT: maxpd %xmm8, %xmm2981; SSE41-NEXT: cmpunordpd %xmm8, %xmm8982; SSE41-NEXT: movapd %xmm8, %xmm0983; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2984; SSE41-NEXT: movapd %xmm5, %xmm4985; SSE41-NEXT: maxpd %xmm1, %xmm4986; SSE41-NEXT: cmpunordpd %xmm1, %xmm1987; SSE41-NEXT: movapd %xmm1, %xmm0988; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm4989; SSE41-NEXT: movapd %xmm7, %xmm1990; SSE41-NEXT: maxpd %xmm3, %xmm1991; SSE41-NEXT: cmpunordpd %xmm3, %xmm3992; SSE41-NEXT: movapd %xmm3, %xmm0993; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1994; SSE41-NEXT: movapd %xmm1, %xmm3995; SSE41-NEXT: maxpd %xmm4, %xmm3996; SSE41-NEXT: cmpunordpd %xmm4, %xmm4997; SSE41-NEXT: movapd %xmm4, %xmm0998; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3999; SSE41-NEXT: movapd %xmm3, %xmm11000; SSE41-NEXT: maxpd %xmm2, %xmm11001; SSE41-NEXT: cmpunordpd %xmm2, %xmm21002; SSE41-NEXT: movapd %xmm2, %xmm01003; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm11004; SSE41-NEXT: movapd %xmm1, %xmm31005; SSE41-NEXT: unpckhpd {{.*#+}} xmm3 = xmm3[1],xmm1[1]1006; SSE41-NEXT: movapd %xmm3, %xmm21007; SSE41-NEXT: maxsd %xmm1, %xmm21008; SSE41-NEXT: cmpunordsd %xmm1, %xmm11009; SSE41-NEXT: movapd %xmm1, %xmm01010; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm21011; SSE41-NEXT: movapd %xmm2, %xmm01012; SSE41-NEXT: retq1013;1014; AVX-LABEL: test_v16f64:1015; AVX: # %bb.0:1016; AVX-NEXT: vmaxpd %ymm0, %ymm2, %ymm41017; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm01018; AVX-NEXT: vblendvpd %ymm0, %ymm2, %ymm4, %ymm01019; AVX-NEXT: vmaxpd %ymm1, %ymm3, %ymm21020; AVX-NEXT: vcmpunordpd %ymm1, %ymm1, %ymm11021; AVX-NEXT: vblendvpd %ymm1, %ymm3, %ymm2, %ymm11022; AVX-NEXT: vmaxpd %ymm0, %ymm1, %ymm21023; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm01024; AVX-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm01025; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1026; AVX-NEXT: vmaxsd %xmm0, %xmm1, %xmm21027; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm31028; AVX-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm11029; AVX-NEXT: vcmpunordsd %xmm1, %xmm1, %xmm21030; AVX-NEXT: vextractf128 $1, %ymm0, %xmm01031; AVX-NEXT: vmaxsd %xmm1, %xmm0, %xmm11032; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm11033; AVX-NEXT: vcmpunordsd %xmm1, %xmm1, %xmm21034; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]1035; AVX-NEXT: vmaxsd %xmm1, %xmm0, %xmm11036; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01037; AVX-NEXT: vzeroupper1038; AVX-NEXT: retq1039;1040; AVX512-LABEL: test_v16f64:1041; AVX512: # %bb.0:1042; AVX512-NEXT: vmaxpd %zmm0, %zmm1, %zmm21043; AVX512-NEXT: vcmpunordpd %zmm0, %zmm0, %k11044; AVX512-NEXT: vmovapd %zmm1, %zmm2 {%k1}1045; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm2[1,0]1046; AVX512-NEXT: vmaxsd %xmm2, %xmm0, %xmm11047; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k11048; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1049; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k11050; AVX512-NEXT: vextractf128 $1, %ymm2, %xmm01051; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm11052; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1053; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k11054; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]1055; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm11056; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1057; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k11058; AVX512-NEXT: vextractf32x4 $2, %zmm2, %xmm01059; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm11060; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1061; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k11062; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]1063; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm11064; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1065; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k11066; AVX512-NEXT: vextractf32x4 $3, %zmm2, %xmm01067; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm11068; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1069; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k11070; AVX512-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]1071; AVX512-NEXT: vmaxsd %xmm1, %xmm2, %xmm01072; AVX512-NEXT: vmovsd %xmm2, %xmm0, %xmm0 {%k1}1073; AVX512-NEXT: vzeroupper1074; AVX512-NEXT: retq1075 %1 = call double @llvm.vector.reduce.fmax.v16f64(<16 x double> %a0)1076 ret double %11077}1078 1079declare float @llvm.vector.reduce.fmax.v1f32(<1 x float>)1080declare float @llvm.vector.reduce.fmax.v2f32(<2 x float>)1081declare float @llvm.vector.reduce.fmax.v3f32(<3 x float>)1082declare float @llvm.vector.reduce.fmax.v4f32(<4 x float>)1083declare float @llvm.vector.reduce.fmax.v8f32(<8 x float>)1084declare float @llvm.vector.reduce.fmax.v16f32(<16 x float>)1085 1086declare double @llvm.vector.reduce.fmax.v2f64(<2 x double>)1087declare double @llvm.vector.reduce.fmax.v4f64(<4 x double>)1088declare double @llvm.vector.reduce.fmax.v8f64(<8 x double>)1089declare double @llvm.vector.reduce.fmax.v16f64(<16 x double>)1090