1786 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=ALL,SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=ALL,SSE,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.fmaximum.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: movd %xmm0, %eax27; SSE2-NEXT: testl %eax, %eax28; SSE2-NEXT: movaps %xmm0, %xmm329; SSE2-NEXT: js .LBB1_230; SSE2-NEXT: # %bb.1:31; SSE2-NEXT: movaps %xmm2, %xmm332; SSE2-NEXT: .LBB1_2:33; SSE2-NEXT: movaps %xmm3, %xmm134; SSE2-NEXT: cmpunordss %xmm3, %xmm135; SSE2-NEXT: movaps %xmm1, %xmm436; SSE2-NEXT: andps %xmm3, %xmm437; SSE2-NEXT: js .LBB1_438; SSE2-NEXT: # %bb.3:39; SSE2-NEXT: movaps %xmm0, %xmm240; SSE2-NEXT: .LBB1_4:41; SSE2-NEXT: maxss %xmm2, %xmm342; SSE2-NEXT: andnps %xmm3, %xmm143; SSE2-NEXT: orps %xmm4, %xmm144; SSE2-NEXT: movaps %xmm1, %xmm045; SSE2-NEXT: retq46;47; SSE41-LABEL: test_v2f32:48; SSE41: # %bb.0:49; SSE41-NEXT: movshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]50; SSE41-NEXT: movd %xmm0, %eax51; SSE41-NEXT: testl %eax, %eax52; SSE41-NEXT: js .LBB1_153; SSE41-NEXT: # %bb.2:54; SSE41-NEXT: movaps %xmm0, %xmm355; SSE41-NEXT: jmp .LBB1_356; SSE41-NEXT: .LBB1_1:57; SSE41-NEXT: movaps %xmm2, %xmm358; SSE41-NEXT: movaps %xmm0, %xmm259; SSE41-NEXT: .LBB1_3:60; SSE41-NEXT: movaps %xmm2, %xmm161; SSE41-NEXT: maxss %xmm3, %xmm162; SSE41-NEXT: movaps %xmm2, %xmm063; SSE41-NEXT: cmpunordss %xmm2, %xmm064; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm165; SSE41-NEXT: movaps %xmm1, %xmm066; SSE41-NEXT: retq67;68; AVX-LABEL: test_v2f32:69; AVX: # %bb.0:70; AVX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]71; AVX-NEXT: vmovd %xmm0, %eax72; AVX-NEXT: testl %eax, %eax73; AVX-NEXT: js .LBB1_174; AVX-NEXT: # %bb.2:75; AVX-NEXT: vmovaps %xmm0, %xmm276; AVX-NEXT: jmp .LBB1_377; AVX-NEXT: .LBB1_1:78; AVX-NEXT: vmovaps %xmm1, %xmm279; AVX-NEXT: vmovaps %xmm0, %xmm180; AVX-NEXT: .LBB1_3:81; AVX-NEXT: vmaxss %xmm2, %xmm1, %xmm082; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm283; AVX-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm084; AVX-NEXT: retq85;86; AVX512-LABEL: test_v2f32:87; AVX512: # %bb.0:88; AVX512-NEXT: vmovd %xmm0, %eax89; AVX512-NEXT: testl %eax, %eax90; AVX512-NEXT: sets %al91; AVX512-NEXT: kmovd %eax, %k192; AVX512-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]93; AVX512-NEXT: vmovaps %xmm0, %xmm294; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}95; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}96; AVX512-NEXT: vmaxss %xmm2, %xmm1, %xmm097; AVX512-NEXT: vcmpunordss %xmm1, %xmm1, %k198; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}99; AVX512-NEXT: retq100 %1 = call float @llvm.vector.reduce.fmaximum.v2f32(<2 x float> %a0)101 ret float %1102}103 104define float @test_v4f32(<4 x float> %a0) {105; SSE2-LABEL: test_v4f32:106; SSE2: # %bb.0:107; SSE2-NEXT: movaps %xmm0, %xmm3108; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[1,1]109; SSE2-NEXT: movd %xmm0, %eax110; SSE2-NEXT: testl %eax, %eax111; SSE2-NEXT: movaps %xmm0, %xmm4112; SSE2-NEXT: js .LBB2_2113; SSE2-NEXT: # %bb.1:114; SSE2-NEXT: movaps %xmm3, %xmm4115; SSE2-NEXT: .LBB2_2:116; SSE2-NEXT: movaps %xmm0, %xmm1117; SSE2-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]118; SSE2-NEXT: movaps %xmm4, %xmm2119; SSE2-NEXT: cmpunordss %xmm4, %xmm2120; SSE2-NEXT: movaps %xmm2, %xmm5121; SSE2-NEXT: andps %xmm4, %xmm5122; SSE2-NEXT: js .LBB2_4123; SSE2-NEXT: # %bb.3:124; SSE2-NEXT: movaps %xmm0, %xmm3125; SSE2-NEXT: .LBB2_4:126; SSE2-NEXT: maxss %xmm3, %xmm4127; SSE2-NEXT: andnps %xmm4, %xmm2128; SSE2-NEXT: orps %xmm5, %xmm2129; SSE2-NEXT: movd %xmm2, %eax130; SSE2-NEXT: testl %eax, %eax131; SSE2-NEXT: movaps %xmm2, %xmm4132; SSE2-NEXT: js .LBB2_6133; SSE2-NEXT: # %bb.5:134; SSE2-NEXT: movaps %xmm1, %xmm4135; SSE2-NEXT: .LBB2_6:136; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]137; SSE2-NEXT: movaps %xmm4, %xmm3138; SSE2-NEXT: cmpunordss %xmm4, %xmm3139; SSE2-NEXT: movaps %xmm3, %xmm5140; SSE2-NEXT: andps %xmm4, %xmm5141; SSE2-NEXT: js .LBB2_8142; SSE2-NEXT: # %bb.7:143; SSE2-NEXT: movaps %xmm2, %xmm1144; SSE2-NEXT: .LBB2_8:145; SSE2-NEXT: maxss %xmm1, %xmm4146; SSE2-NEXT: andnps %xmm4, %xmm3147; SSE2-NEXT: orps %xmm5, %xmm3148; SSE2-NEXT: movd %xmm3, %eax149; SSE2-NEXT: testl %eax, %eax150; SSE2-NEXT: movaps %xmm3, %xmm2151; SSE2-NEXT: js .LBB2_10152; SSE2-NEXT: # %bb.9:153; SSE2-NEXT: movaps %xmm0, %xmm2154; SSE2-NEXT: .LBB2_10:155; SSE2-NEXT: movaps %xmm2, %xmm1156; SSE2-NEXT: cmpunordss %xmm2, %xmm1157; SSE2-NEXT: movaps %xmm1, %xmm4158; SSE2-NEXT: andps %xmm2, %xmm4159; SSE2-NEXT: js .LBB2_12160; SSE2-NEXT: # %bb.11:161; SSE2-NEXT: movaps %xmm3, %xmm0162; SSE2-NEXT: .LBB2_12:163; SSE2-NEXT: maxss %xmm0, %xmm2164; SSE2-NEXT: andnps %xmm2, %xmm1165; SSE2-NEXT: orps %xmm4, %xmm1166; SSE2-NEXT: movaps %xmm1, %xmm0167; SSE2-NEXT: retq168;169; SSE41-LABEL: test_v4f32:170; SSE41: # %bb.0:171; SSE41-NEXT: movaps %xmm0, %xmm1172; SSE41-NEXT: movaps %xmm0, %xmm2173; SSE41-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1]174; SSE41-NEXT: movshdup {{.*#+}} xmm3 = xmm0[1,1,3,3]175; SSE41-NEXT: movd %xmm0, %eax176; SSE41-NEXT: testl %eax, %eax177; SSE41-NEXT: js .LBB2_1178; SSE41-NEXT: # %bb.2:179; SSE41-NEXT: movaps %xmm1, %xmm0180; SSE41-NEXT: jmp .LBB2_3181; SSE41-NEXT: .LBB2_1:182; SSE41-NEXT: movaps %xmm3, %xmm0183; SSE41-NEXT: movaps %xmm1, %xmm3184; SSE41-NEXT: .LBB2_3:185; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3,3,3]186; SSE41-NEXT: movaps %xmm3, %xmm4187; SSE41-NEXT: maxss %xmm0, %xmm4188; SSE41-NEXT: movaps %xmm3, %xmm0189; SSE41-NEXT: cmpunordss %xmm3, %xmm0190; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm4191; SSE41-NEXT: movd %xmm4, %eax192; SSE41-NEXT: testl %eax, %eax193; SSE41-NEXT: js .LBB2_4194; SSE41-NEXT: # %bb.5:195; SSE41-NEXT: movaps %xmm4, %xmm0196; SSE41-NEXT: jmp .LBB2_6197; SSE41-NEXT: .LBB2_4:198; SSE41-NEXT: movaps %xmm2, %xmm0199; SSE41-NEXT: movaps %xmm4, %xmm2200; SSE41-NEXT: .LBB2_6:201; SSE41-NEXT: movaps %xmm2, %xmm3202; SSE41-NEXT: maxss %xmm0, %xmm3203; SSE41-NEXT: movaps %xmm2, %xmm0204; SSE41-NEXT: cmpunordss %xmm2, %xmm0205; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm3206; SSE41-NEXT: movd %xmm3, %eax207; SSE41-NEXT: testl %eax, %eax208; SSE41-NEXT: js .LBB2_7209; SSE41-NEXT: # %bb.8:210; SSE41-NEXT: movaps %xmm3, %xmm0211; SSE41-NEXT: jmp .LBB2_9212; SSE41-NEXT: .LBB2_7:213; SSE41-NEXT: movaps %xmm1, %xmm0214; SSE41-NEXT: movaps %xmm3, %xmm1215; SSE41-NEXT: .LBB2_9:216; SSE41-NEXT: movaps %xmm1, %xmm2217; SSE41-NEXT: maxss %xmm0, %xmm2218; SSE41-NEXT: movaps %xmm1, %xmm0219; SSE41-NEXT: cmpunordss %xmm1, %xmm0220; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2221; SSE41-NEXT: movaps %xmm2, %xmm0222; SSE41-NEXT: retq223;224; AVX-LABEL: test_v4f32:225; AVX: # %bb.0:226; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]227; AVX-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]228; AVX-NEXT: vmovd %xmm0, %eax229; AVX-NEXT: testl %eax, %eax230; AVX-NEXT: js .LBB2_1231; AVX-NEXT: # %bb.2:232; AVX-NEXT: vmovaps %xmm0, %xmm3233; AVX-NEXT: jmp .LBB2_3234; AVX-NEXT: .LBB2_1:235; AVX-NEXT: vmovaps %xmm2, %xmm3236; AVX-NEXT: vmovaps %xmm0, %xmm2237; AVX-NEXT: .LBB2_3:238; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]239; AVX-NEXT: vmaxss %xmm3, %xmm2, %xmm3240; AVX-NEXT: vcmpunordss %xmm2, %xmm2, %xmm4241; AVX-NEXT: vblendvps %xmm4, %xmm2, %xmm3, %xmm3242; AVX-NEXT: vmovd %xmm3, %eax243; AVX-NEXT: testl %eax, %eax244; AVX-NEXT: js .LBB2_4245; AVX-NEXT: # %bb.5:246; AVX-NEXT: vmovaps %xmm3, %xmm2247; AVX-NEXT: jmp .LBB2_6248; AVX-NEXT: .LBB2_4:249; AVX-NEXT: vmovapd %xmm1, %xmm2250; AVX-NEXT: vmovaps %xmm3, %xmm1251; AVX-NEXT: .LBB2_6:252; AVX-NEXT: vmaxss %xmm2, %xmm1, %xmm2253; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm3254; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm1255; AVX-NEXT: vmovd %xmm1, %eax256; AVX-NEXT: testl %eax, %eax257; AVX-NEXT: js .LBB2_7258; AVX-NEXT: # %bb.8:259; AVX-NEXT: vmovaps %xmm1, %xmm2260; AVX-NEXT: jmp .LBB2_9261; AVX-NEXT: .LBB2_7:262; AVX-NEXT: vmovaps %xmm0, %xmm2263; AVX-NEXT: vmovaps %xmm1, %xmm0264; AVX-NEXT: .LBB2_9:265; AVX-NEXT: vmaxss %xmm2, %xmm0, %xmm1266; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm2267; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0268; AVX-NEXT: retq269;270; AVX512-LABEL: test_v4f32:271; AVX512: # %bb.0:272; AVX512-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]273; AVX512-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]274; AVX512-NEXT: vmovshdup {{.*#+}} xmm3 = xmm0[1,1,3,3]275; AVX512-NEXT: vmovd %xmm0, %eax276; AVX512-NEXT: testl %eax, %eax277; AVX512-NEXT: sets %al278; AVX512-NEXT: kmovd %eax, %k1279; AVX512-NEXT: vmovaps %xmm0, %xmm4280; AVX512-NEXT: vmovss %xmm3, %xmm4, %xmm4 {%k1}281; AVX512-NEXT: vmovss %xmm0, %xmm3, %xmm3 {%k1}282; AVX512-NEXT: vmaxss %xmm4, %xmm3, %xmm0283; AVX512-NEXT: vcmpunordss %xmm3, %xmm3, %k1284; AVX512-NEXT: vmovss %xmm3, %xmm0, %xmm0 {%k1}285; AVX512-NEXT: vmovd %xmm0, %eax286; AVX512-NEXT: testl %eax, %eax287; AVX512-NEXT: sets %al288; AVX512-NEXT: kmovd %eax, %k1289; AVX512-NEXT: vmovaps %xmm0, %xmm3290; AVX512-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1}291; AVX512-NEXT: vmovss %xmm0, %xmm2, %xmm2 {%k1}292; AVX512-NEXT: vmaxss %xmm3, %xmm2, %xmm0293; AVX512-NEXT: vcmpunordss %xmm2, %xmm2, %k1294; AVX512-NEXT: vmovss %xmm2, %xmm0, %xmm0 {%k1}295; AVX512-NEXT: vmovd %xmm0, %eax296; AVX512-NEXT: testl %eax, %eax297; AVX512-NEXT: sets %al298; AVX512-NEXT: kmovd %eax, %k1299; AVX512-NEXT: vmovaps %xmm0, %xmm2300; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}301; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}302; AVX512-NEXT: vmaxss %xmm2, %xmm1, %xmm0303; AVX512-NEXT: vcmpunordss %xmm1, %xmm1, %k1304; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}305; AVX512-NEXT: retq306 %1 = call float @llvm.vector.reduce.fmaximum.v4f32(<4 x float> %a0)307 ret float %1308}309 310define float @test_v8f32(<8 x float> %a0) {311; SSE2-LABEL: test_v8f32:312; SSE2: # %bb.0:313; SSE2-NEXT: pxor %xmm2, %xmm2314; SSE2-NEXT: pcmpgtd %xmm0, %xmm2315; SSE2-NEXT: movdqa %xmm2, %xmm3316; SSE2-NEXT: pandn %xmm0, %xmm3317; SSE2-NEXT: movdqa %xmm2, %xmm4318; SSE2-NEXT: pandn %xmm1, %xmm4319; SSE2-NEXT: pand %xmm2, %xmm1320; SSE2-NEXT: por %xmm3, %xmm1321; SSE2-NEXT: pand %xmm0, %xmm2322; SSE2-NEXT: por %xmm4, %xmm2323; SSE2-NEXT: movdqa %xmm2, %xmm3324; SSE2-NEXT: maxps %xmm1, %xmm3325; SSE2-NEXT: movdqa %xmm2, %xmm0326; SSE2-NEXT: cmpunordps %xmm2, %xmm0327; SSE2-NEXT: andps %xmm0, %xmm2328; SSE2-NEXT: andnps %xmm3, %xmm0329; SSE2-NEXT: orps %xmm2, %xmm0330; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]331; SSE2-NEXT: movd %xmm0, %eax332; SSE2-NEXT: testl %eax, %eax333; SSE2-NEXT: movdqa %xmm0, %xmm3334; SSE2-NEXT: js .LBB3_2335; SSE2-NEXT: # %bb.1:336; SSE2-NEXT: movdqa %xmm2, %xmm3337; SSE2-NEXT: .LBB3_2:338; SSE2-NEXT: movdqa %xmm3, %xmm1339; SSE2-NEXT: cmpunordss %xmm3, %xmm1340; SSE2-NEXT: movaps %xmm1, %xmm4341; SSE2-NEXT: andps %xmm3, %xmm4342; SSE2-NEXT: js .LBB3_4343; SSE2-NEXT: # %bb.3:344; SSE2-NEXT: movdqa %xmm0, %xmm2345; SSE2-NEXT: .LBB3_4:346; SSE2-NEXT: maxss %xmm2, %xmm3347; SSE2-NEXT: andnps %xmm3, %xmm1348; SSE2-NEXT: orps %xmm4, %xmm1349; SSE2-NEXT: movd %xmm1, %eax350; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]351; SSE2-NEXT: testl %eax, %eax352; SSE2-NEXT: movdqa %xmm1, %xmm4353; SSE2-NEXT: js .LBB3_6354; SSE2-NEXT: # %bb.5:355; SSE2-NEXT: movdqa %xmm3, %xmm4356; SSE2-NEXT: .LBB3_6:357; SSE2-NEXT: movdqa %xmm4, %xmm2358; SSE2-NEXT: cmpunordss %xmm4, %xmm2359; SSE2-NEXT: movaps %xmm2, %xmm5360; SSE2-NEXT: andps %xmm4, %xmm5361; SSE2-NEXT: js .LBB3_8362; SSE2-NEXT: # %bb.7:363; SSE2-NEXT: movdqa %xmm1, %xmm3364; SSE2-NEXT: .LBB3_8:365; SSE2-NEXT: maxss %xmm3, %xmm4366; SSE2-NEXT: andnps %xmm4, %xmm2367; SSE2-NEXT: orps %xmm5, %xmm2368; SSE2-NEXT: movd %xmm2, %eax369; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]370; SSE2-NEXT: testl %eax, %eax371; SSE2-NEXT: movdqa %xmm2, %xmm3372; SSE2-NEXT: js .LBB3_10373; SSE2-NEXT: # %bb.9:374; SSE2-NEXT: movdqa %xmm1, %xmm3375; SSE2-NEXT: .LBB3_10:376; SSE2-NEXT: movdqa %xmm3, %xmm0377; SSE2-NEXT: cmpunordss %xmm3, %xmm0378; SSE2-NEXT: movaps %xmm0, %xmm4379; SSE2-NEXT: andps %xmm3, %xmm4380; SSE2-NEXT: js .LBB3_12381; SSE2-NEXT: # %bb.11:382; SSE2-NEXT: movdqa %xmm2, %xmm1383; SSE2-NEXT: .LBB3_12:384; SSE2-NEXT: maxss %xmm1, %xmm3385; SSE2-NEXT: andnps %xmm3, %xmm0386; SSE2-NEXT: orps %xmm4, %xmm0387; SSE2-NEXT: retq388;389; SSE41-LABEL: test_v8f32:390; SSE41: # %bb.0:391; SSE41-NEXT: movaps %xmm0, %xmm3392; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3393; SSE41-NEXT: blendvps %xmm0, %xmm0, %xmm1394; SSE41-NEXT: movaps %xmm1, %xmm2395; SSE41-NEXT: maxps %xmm3, %xmm2396; SSE41-NEXT: movaps %xmm1, %xmm0397; SSE41-NEXT: cmpunordps %xmm1, %xmm0398; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2399; SSE41-NEXT: movshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]400; SSE41-NEXT: movd %xmm2, %eax401; SSE41-NEXT: testl %eax, %eax402; SSE41-NEXT: js .LBB3_1403; SSE41-NEXT: # %bb.2:404; SSE41-NEXT: movaps %xmm2, %xmm0405; SSE41-NEXT: jmp .LBB3_3406; SSE41-NEXT: .LBB3_1:407; SSE41-NEXT: movaps %xmm1, %xmm0408; SSE41-NEXT: movaps %xmm2, %xmm1409; SSE41-NEXT: .LBB3_3:410; SSE41-NEXT: movaps %xmm1, %xmm3411; SSE41-NEXT: maxss %xmm0, %xmm3412; SSE41-NEXT: movaps %xmm1, %xmm0413; SSE41-NEXT: cmpunordss %xmm1, %xmm0414; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3415; SSE41-NEXT: movd %xmm3, %eax416; SSE41-NEXT: movaps %xmm2, %xmm1417; SSE41-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm2[1]418; SSE41-NEXT: testl %eax, %eax419; SSE41-NEXT: js .LBB3_4420; SSE41-NEXT: # %bb.5:421; SSE41-NEXT: movaps %xmm3, %xmm0422; SSE41-NEXT: jmp .LBB3_6423; SSE41-NEXT: .LBB3_4:424; SSE41-NEXT: movaps %xmm1, %xmm0425; SSE41-NEXT: movaps %xmm3, %xmm1426; SSE41-NEXT: .LBB3_6:427; SSE41-NEXT: movaps %xmm1, %xmm3428; SSE41-NEXT: maxss %xmm0, %xmm3429; SSE41-NEXT: movaps %xmm1, %xmm0430; SSE41-NEXT: cmpunordss %xmm1, %xmm0431; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3432; SSE41-NEXT: movd %xmm3, %eax433; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[3,3,3,3]434; SSE41-NEXT: testl %eax, %eax435; SSE41-NEXT: js .LBB3_7436; SSE41-NEXT: # %bb.8:437; SSE41-NEXT: movaps %xmm3, %xmm0438; SSE41-NEXT: jmp .LBB3_9439; SSE41-NEXT: .LBB3_7:440; SSE41-NEXT: movaps %xmm2, %xmm0441; SSE41-NEXT: movaps %xmm3, %xmm2442; SSE41-NEXT: .LBB3_9:443; SSE41-NEXT: movaps %xmm2, %xmm1444; SSE41-NEXT: maxss %xmm0, %xmm1445; SSE41-NEXT: movaps %xmm2, %xmm0446; SSE41-NEXT: cmpunordss %xmm2, %xmm0447; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1448; SSE41-NEXT: movaps %xmm1, %xmm0449; SSE41-NEXT: retq450;451; AVX-LABEL: test_v8f32:452; AVX: # %bb.0:453; AVX-NEXT: vextractf128 $1, %ymm0, %xmm1454; AVX-NEXT: vblendvps %xmm0, %xmm1, %xmm0, %xmm2455; AVX-NEXT: vblendvps %xmm0, %xmm0, %xmm1, %xmm0456; AVX-NEXT: vmaxps %xmm2, %xmm0, %xmm1457; AVX-NEXT: vcmpunordps %xmm0, %xmm0, %xmm2458; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0459; AVX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]460; AVX-NEXT: vmovd %xmm0, %eax461; AVX-NEXT: testl %eax, %eax462; AVX-NEXT: js .LBB3_1463; AVX-NEXT: # %bb.2:464; AVX-NEXT: vmovaps %xmm0, %xmm2465; AVX-NEXT: jmp .LBB3_3466; AVX-NEXT: .LBB3_1:467; AVX-NEXT: vmovaps %xmm1, %xmm2468; AVX-NEXT: vmovaps %xmm0, %xmm1469; AVX-NEXT: .LBB3_3:470; AVX-NEXT: vmaxss %xmm2, %xmm1, %xmm2471; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm3472; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm2473; AVX-NEXT: vmovd %xmm2, %eax474; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]475; AVX-NEXT: testl %eax, %eax476; AVX-NEXT: js .LBB3_4477; AVX-NEXT: # %bb.5:478; AVX-NEXT: vmovaps %xmm2, %xmm3479; AVX-NEXT: jmp .LBB3_6480; AVX-NEXT: .LBB3_4:481; AVX-NEXT: vmovapd %xmm1, %xmm3482; AVX-NEXT: vmovaps %xmm2, %xmm1483; AVX-NEXT: .LBB3_6:484; AVX-NEXT: vmaxss %xmm3, %xmm1, %xmm2485; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm3486; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm1487; AVX-NEXT: vmovd %xmm1, %eax488; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]489; AVX-NEXT: testl %eax, %eax490; AVX-NEXT: js .LBB3_7491; AVX-NEXT: # %bb.8:492; AVX-NEXT: vmovaps %xmm1, %xmm2493; AVX-NEXT: jmp .LBB3_9494; AVX-NEXT: .LBB3_7:495; AVX-NEXT: vmovaps %xmm0, %xmm2496; AVX-NEXT: vmovaps %xmm1, %xmm0497; AVX-NEXT: .LBB3_9:498; AVX-NEXT: vmaxss %xmm2, %xmm0, %xmm1499; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm2500; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0501; AVX-NEXT: vzeroupper502; AVX-NEXT: retq503;504; AVX512BW-LABEL: test_v8f32:505; AVX512BW: # %bb.0:506; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm1507; AVX512BW-NEXT: vblendvps %xmm0, %xmm1, %xmm0, %xmm2508; AVX512BW-NEXT: vblendvps %xmm0, %xmm0, %xmm1, %xmm0509; AVX512BW-NEXT: vmaxps %xmm2, %xmm0, %xmm1510; AVX512BW-NEXT: vcmpunordps %xmm0, %xmm0, %xmm2511; AVX512BW-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0512; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]513; AVX512BW-NEXT: vmovd %xmm0, %eax514; AVX512BW-NEXT: testl %eax, %eax515; AVX512BW-NEXT: sets %al516; AVX512BW-NEXT: kmovd %eax, %k1517; AVX512BW-NEXT: vmovaps %xmm0, %xmm2518; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}519; AVX512BW-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}520; AVX512BW-NEXT: vmaxss %xmm2, %xmm1, %xmm2521; AVX512BW-NEXT: vcmpunordss %xmm1, %xmm1, %k1522; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}523; AVX512BW-NEXT: vmovd %xmm2, %eax524; AVX512BW-NEXT: testl %eax, %eax525; AVX512BW-NEXT: sets %al526; AVX512BW-NEXT: kmovd %eax, %k1527; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]528; AVX512BW-NEXT: vmovaps %xmm2, %xmm3529; AVX512BW-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1}530; AVX512BW-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1}531; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm2532; AVX512BW-NEXT: vcmpunordss %xmm1, %xmm1, %k1533; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}534; AVX512BW-NEXT: vmovd %xmm2, %eax535; AVX512BW-NEXT: testl %eax, %eax536; AVX512BW-NEXT: sets %al537; AVX512BW-NEXT: kmovd %eax, %k1538; AVX512BW-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]539; AVX512BW-NEXT: vmovaps %xmm2, %xmm0540; AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}541; AVX512BW-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1}542; AVX512BW-NEXT: vmaxss %xmm0, %xmm1, %xmm0543; AVX512BW-NEXT: vcmpunordss %xmm1, %xmm1, %k1544; AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}545; AVX512BW-NEXT: vzeroupper546; AVX512BW-NEXT: retq547;548; AVX512VL-LABEL: test_v8f32:549; AVX512VL: # %bb.0:550; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1551; AVX512VL-NEXT: vpcmpgtd %xmm0, %xmm1, %k1552; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1553; AVX512VL-NEXT: vblendmps %xmm1, %xmm0, %xmm2 {%k1}554; AVX512VL-NEXT: vmovaps %xmm0, %xmm1 {%k1}555; AVX512VL-NEXT: vmaxps %xmm2, %xmm1, %xmm0556; AVX512VL-NEXT: vcmpunordps %xmm1, %xmm1, %k1557; AVX512VL-NEXT: vmovaps %xmm1, %xmm0 {%k1}558; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]559; AVX512VL-NEXT: vmovd %xmm0, %eax560; AVX512VL-NEXT: testl %eax, %eax561; AVX512VL-NEXT: sets %al562; AVX512VL-NEXT: kmovd %eax, %k1563; AVX512VL-NEXT: vmovaps %xmm0, %xmm2564; AVX512VL-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}565; AVX512VL-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}566; AVX512VL-NEXT: vmaxss %xmm2, %xmm1, %xmm2567; AVX512VL-NEXT: vcmpunordss %xmm1, %xmm1, %k1568; AVX512VL-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}569; AVX512VL-NEXT: vmovd %xmm2, %eax570; AVX512VL-NEXT: testl %eax, %eax571; AVX512VL-NEXT: sets %al572; AVX512VL-NEXT: kmovd %eax, %k1573; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]574; AVX512VL-NEXT: vmovaps %xmm2, %xmm3575; AVX512VL-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1}576; AVX512VL-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1}577; AVX512VL-NEXT: vmaxss %xmm3, %xmm1, %xmm2578; AVX512VL-NEXT: vcmpunordss %xmm1, %xmm1, %k1579; AVX512VL-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}580; AVX512VL-NEXT: vmovd %xmm2, %eax581; AVX512VL-NEXT: testl %eax, %eax582; AVX512VL-NEXT: sets %al583; AVX512VL-NEXT: kmovd %eax, %k1584; AVX512VL-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]585; AVX512VL-NEXT: vmovaps %xmm2, %xmm0586; AVX512VL-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}587; AVX512VL-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1}588; AVX512VL-NEXT: vmaxss %xmm0, %xmm1, %xmm0589; AVX512VL-NEXT: vcmpunordss %xmm1, %xmm1, %k1590; AVX512VL-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}591; AVX512VL-NEXT: vzeroupper592; AVX512VL-NEXT: retq593 %1 = call float @llvm.vector.reduce.fmaximum.v8f32(<8 x float> %a0)594 ret float %1595}596 597define float @test_v16f32(<16 x float> %a0) {598; SSE2-LABEL: test_v16f32:599; SSE2: # %bb.0:600; SSE2-NEXT: pxor %xmm4, %xmm4601; SSE2-NEXT: pxor %xmm5, %xmm5602; SSE2-NEXT: pcmpgtd %xmm0, %xmm5603; SSE2-NEXT: movdqa %xmm5, %xmm6604; SSE2-NEXT: pandn %xmm0, %xmm6605; SSE2-NEXT: movdqa %xmm5, %xmm7606; SSE2-NEXT: pandn %xmm2, %xmm7607; SSE2-NEXT: pand %xmm5, %xmm2608; SSE2-NEXT: por %xmm6, %xmm2609; SSE2-NEXT: pand %xmm0, %xmm5610; SSE2-NEXT: por %xmm7, %xmm5611; SSE2-NEXT: movdqa %xmm5, %xmm6612; SSE2-NEXT: maxps %xmm2, %xmm6613; SSE2-NEXT: movdqa %xmm5, %xmm0614; SSE2-NEXT: cmpunordps %xmm5, %xmm0615; SSE2-NEXT: andps %xmm0, %xmm5616; SSE2-NEXT: andnps %xmm6, %xmm0617; SSE2-NEXT: orps %xmm5, %xmm0618; SSE2-NEXT: pxor %xmm2, %xmm2619; SSE2-NEXT: pcmpgtd %xmm0, %xmm2620; SSE2-NEXT: movdqa %xmm2, %xmm5621; SSE2-NEXT: pandn %xmm0, %xmm5622; SSE2-NEXT: pcmpgtd %xmm1, %xmm4623; SSE2-NEXT: movdqa %xmm4, %xmm6624; SSE2-NEXT: pandn %xmm1, %xmm6625; SSE2-NEXT: movdqa %xmm4, %xmm7626; SSE2-NEXT: pandn %xmm3, %xmm7627; SSE2-NEXT: pand %xmm4, %xmm3628; SSE2-NEXT: por %xmm6, %xmm3629; SSE2-NEXT: pand %xmm1, %xmm4630; SSE2-NEXT: por %xmm7, %xmm4631; SSE2-NEXT: movdqa %xmm4, %xmm1632; SSE2-NEXT: maxps %xmm3, %xmm1633; SSE2-NEXT: movdqa %xmm4, %xmm3634; SSE2-NEXT: cmpunordps %xmm4, %xmm3635; SSE2-NEXT: andps %xmm3, %xmm4636; SSE2-NEXT: andnps %xmm1, %xmm3637; SSE2-NEXT: orps %xmm4, %xmm3638; SSE2-NEXT: movdqa %xmm2, %xmm1639; SSE2-NEXT: pandn %xmm3, %xmm1640; SSE2-NEXT: pand %xmm2, %xmm3641; SSE2-NEXT: por %xmm5, %xmm3642; SSE2-NEXT: pand %xmm0, %xmm2643; SSE2-NEXT: por %xmm1, %xmm2644; SSE2-NEXT: movdqa %xmm2, %xmm1645; SSE2-NEXT: maxps %xmm3, %xmm1646; SSE2-NEXT: movdqa %xmm2, %xmm0647; SSE2-NEXT: cmpunordps %xmm2, %xmm0648; SSE2-NEXT: andps %xmm0, %xmm2649; SSE2-NEXT: andnps %xmm1, %xmm0650; SSE2-NEXT: orps %xmm2, %xmm0651; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]652; SSE2-NEXT: movd %xmm0, %eax653; SSE2-NEXT: testl %eax, %eax654; SSE2-NEXT: movdqa %xmm0, %xmm3655; SSE2-NEXT: js .LBB4_2656; SSE2-NEXT: # %bb.1:657; SSE2-NEXT: movdqa %xmm2, %xmm3658; SSE2-NEXT: .LBB4_2:659; SSE2-NEXT: movdqa %xmm3, %xmm1660; SSE2-NEXT: cmpunordss %xmm3, %xmm1661; SSE2-NEXT: movaps %xmm1, %xmm4662; SSE2-NEXT: andps %xmm3, %xmm4663; SSE2-NEXT: js .LBB4_4664; SSE2-NEXT: # %bb.3:665; SSE2-NEXT: movdqa %xmm0, %xmm2666; SSE2-NEXT: .LBB4_4:667; SSE2-NEXT: maxss %xmm2, %xmm3668; SSE2-NEXT: andnps %xmm3, %xmm1669; SSE2-NEXT: orps %xmm4, %xmm1670; SSE2-NEXT: movd %xmm1, %eax671; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]672; SSE2-NEXT: testl %eax, %eax673; SSE2-NEXT: movdqa %xmm1, %xmm4674; SSE2-NEXT: js .LBB4_6675; SSE2-NEXT: # %bb.5:676; SSE2-NEXT: movdqa %xmm3, %xmm4677; SSE2-NEXT: .LBB4_6:678; SSE2-NEXT: movdqa %xmm4, %xmm2679; SSE2-NEXT: cmpunordss %xmm4, %xmm2680; SSE2-NEXT: movaps %xmm2, %xmm5681; SSE2-NEXT: andps %xmm4, %xmm5682; SSE2-NEXT: js .LBB4_8683; SSE2-NEXT: # %bb.7:684; SSE2-NEXT: movdqa %xmm1, %xmm3685; SSE2-NEXT: .LBB4_8:686; SSE2-NEXT: maxss %xmm3, %xmm4687; SSE2-NEXT: andnps %xmm4, %xmm2688; SSE2-NEXT: orps %xmm5, %xmm2689; SSE2-NEXT: movd %xmm2, %eax690; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]691; SSE2-NEXT: testl %eax, %eax692; SSE2-NEXT: movdqa %xmm2, %xmm3693; SSE2-NEXT: js .LBB4_10694; SSE2-NEXT: # %bb.9:695; SSE2-NEXT: movdqa %xmm1, %xmm3696; SSE2-NEXT: .LBB4_10:697; SSE2-NEXT: movdqa %xmm3, %xmm0698; SSE2-NEXT: cmpunordss %xmm3, %xmm0699; SSE2-NEXT: movaps %xmm0, %xmm4700; SSE2-NEXT: andps %xmm3, %xmm4701; SSE2-NEXT: js .LBB4_12702; SSE2-NEXT: # %bb.11:703; SSE2-NEXT: movdqa %xmm2, %xmm1704; SSE2-NEXT: .LBB4_12:705; SSE2-NEXT: maxss %xmm1, %xmm3706; SSE2-NEXT: andnps %xmm3, %xmm0707; SSE2-NEXT: orps %xmm4, %xmm0708; SSE2-NEXT: retq709;710; SSE41-LABEL: test_v16f32:711; SSE41: # %bb.0:712; SSE41-NEXT: movaps %xmm0, %xmm4713; SSE41-NEXT: movaps %xmm1, %xmm6714; SSE41-NEXT: movaps %xmm1, %xmm0715; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm6716; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3717; SSE41-NEXT: movaps %xmm3, %xmm5718; SSE41-NEXT: maxps %xmm6, %xmm5719; SSE41-NEXT: movaps %xmm3, %xmm0720; SSE41-NEXT: cmpunordps %xmm3, %xmm0721; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm5722; SSE41-NEXT: movaps %xmm4, %xmm3723; SSE41-NEXT: movaps %xmm4, %xmm0724; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm3725; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm2726; SSE41-NEXT: movaps %xmm2, %xmm1727; SSE41-NEXT: maxps %xmm3, %xmm1728; SSE41-NEXT: movaps %xmm2, %xmm0729; SSE41-NEXT: cmpunordps %xmm2, %xmm0730; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1731; SSE41-NEXT: movaps %xmm1, %xmm3732; SSE41-NEXT: movaps %xmm1, %xmm0733; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm3734; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm5735; SSE41-NEXT: movaps %xmm5, %xmm2736; SSE41-NEXT: maxps %xmm3, %xmm2737; SSE41-NEXT: movaps %xmm5, %xmm0738; SSE41-NEXT: cmpunordps %xmm5, %xmm0739; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm2740; SSE41-NEXT: movshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]741; SSE41-NEXT: movd %xmm2, %eax742; SSE41-NEXT: testl %eax, %eax743; SSE41-NEXT: js .LBB4_1744; SSE41-NEXT: # %bb.2:745; SSE41-NEXT: movaps %xmm2, %xmm0746; SSE41-NEXT: jmp .LBB4_3747; SSE41-NEXT: .LBB4_1:748; SSE41-NEXT: movaps %xmm1, %xmm0749; SSE41-NEXT: movaps %xmm2, %xmm1750; SSE41-NEXT: .LBB4_3:751; SSE41-NEXT: movaps %xmm1, %xmm3752; SSE41-NEXT: maxss %xmm0, %xmm3753; SSE41-NEXT: movaps %xmm1, %xmm0754; SSE41-NEXT: cmpunordss %xmm1, %xmm0755; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3756; SSE41-NEXT: movd %xmm3, %eax757; SSE41-NEXT: movaps %xmm2, %xmm1758; SSE41-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm2[1]759; SSE41-NEXT: testl %eax, %eax760; SSE41-NEXT: js .LBB4_4761; SSE41-NEXT: # %bb.5:762; SSE41-NEXT: movaps %xmm3, %xmm0763; SSE41-NEXT: jmp .LBB4_6764; SSE41-NEXT: .LBB4_4:765; SSE41-NEXT: movaps %xmm1, %xmm0766; SSE41-NEXT: movaps %xmm3, %xmm1767; SSE41-NEXT: .LBB4_6:768; SSE41-NEXT: movaps %xmm1, %xmm3769; SSE41-NEXT: maxss %xmm0, %xmm3770; SSE41-NEXT: movaps %xmm1, %xmm0771; SSE41-NEXT: cmpunordss %xmm1, %xmm0772; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3773; SSE41-NEXT: movd %xmm3, %eax774; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[3,3,3,3]775; SSE41-NEXT: testl %eax, %eax776; SSE41-NEXT: js .LBB4_7777; SSE41-NEXT: # %bb.8:778; SSE41-NEXT: movaps %xmm3, %xmm0779; SSE41-NEXT: jmp .LBB4_9780; SSE41-NEXT: .LBB4_7:781; SSE41-NEXT: movaps %xmm2, %xmm0782; SSE41-NEXT: movaps %xmm3, %xmm2783; SSE41-NEXT: .LBB4_9:784; SSE41-NEXT: movaps %xmm2, %xmm1785; SSE41-NEXT: maxss %xmm0, %xmm1786; SSE41-NEXT: movaps %xmm2, %xmm0787; SSE41-NEXT: cmpunordss %xmm2, %xmm0788; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1789; SSE41-NEXT: movaps %xmm1, %xmm0790; SSE41-NEXT: retq791;792; AVX-LABEL: test_v16f32:793; AVX: # %bb.0:794; AVX-NEXT: vblendvps %ymm0, %ymm1, %ymm0, %ymm2795; AVX-NEXT: vblendvps %ymm0, %ymm0, %ymm1, %ymm0796; AVX-NEXT: vmaxps %ymm2, %ymm0, %ymm1797; AVX-NEXT: vcmpunordps %ymm0, %ymm0, %ymm2798; AVX-NEXT: vblendvps %ymm2, %ymm0, %ymm1, %ymm0799; AVX-NEXT: vextractf128 $1, %ymm0, %xmm1800; AVX-NEXT: vblendvps %xmm0, %xmm1, %xmm0, %xmm2801; AVX-NEXT: vblendvps %xmm0, %xmm0, %xmm1, %xmm0802; AVX-NEXT: vmaxps %xmm2, %xmm0, %xmm1803; AVX-NEXT: vcmpunordps %xmm0, %xmm0, %xmm2804; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0805; AVX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]806; AVX-NEXT: vmovd %xmm0, %eax807; AVX-NEXT: testl %eax, %eax808; AVX-NEXT: js .LBB4_1809; AVX-NEXT: # %bb.2:810; AVX-NEXT: vmovaps %xmm0, %xmm2811; AVX-NEXT: jmp .LBB4_3812; AVX-NEXT: .LBB4_1:813; AVX-NEXT: vmovaps %xmm1, %xmm2814; AVX-NEXT: vmovaps %xmm0, %xmm1815; AVX-NEXT: .LBB4_3:816; AVX-NEXT: vmaxss %xmm2, %xmm1, %xmm2817; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm3818; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm2819; AVX-NEXT: vmovd %xmm2, %eax820; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]821; AVX-NEXT: testl %eax, %eax822; AVX-NEXT: js .LBB4_4823; AVX-NEXT: # %bb.5:824; AVX-NEXT: vmovaps %xmm2, %xmm3825; AVX-NEXT: jmp .LBB4_6826; AVX-NEXT: .LBB4_4:827; AVX-NEXT: vmovapd %xmm1, %xmm3828; AVX-NEXT: vmovaps %xmm2, %xmm1829; AVX-NEXT: .LBB4_6:830; AVX-NEXT: vmaxss %xmm3, %xmm1, %xmm2831; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm3832; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm1833; AVX-NEXT: vmovd %xmm1, %eax834; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]835; AVX-NEXT: testl %eax, %eax836; AVX-NEXT: js .LBB4_7837; AVX-NEXT: # %bb.8:838; AVX-NEXT: vmovaps %xmm1, %xmm2839; AVX-NEXT: jmp .LBB4_9840; AVX-NEXT: .LBB4_7:841; AVX-NEXT: vmovaps %xmm0, %xmm2842; AVX-NEXT: vmovaps %xmm1, %xmm0843; AVX-NEXT: .LBB4_9:844; AVX-NEXT: vmaxss %xmm2, %xmm0, %xmm1845; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm2846; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0847; AVX-NEXT: vzeroupper848; AVX-NEXT: retq849;850; AVX512BW-LABEL: test_v16f32:851; AVX512BW: # %bb.0:852; AVX512BW-NEXT: vextractf64x4 $1, %zmm0, %ymm1853; AVX512BW-NEXT: vblendvps %ymm0, %ymm1, %ymm0, %ymm2854; AVX512BW-NEXT: vblendvps %ymm0, %ymm0, %ymm1, %ymm0855; AVX512BW-NEXT: vmaxps %ymm2, %ymm0, %ymm1856; AVX512BW-NEXT: vcmpunordps %ymm0, %ymm0, %ymm2857; AVX512BW-NEXT: vblendvps %ymm2, %ymm0, %ymm1, %ymm0858; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm1859; AVX512BW-NEXT: vblendvps %xmm0, %xmm1, %xmm0, %xmm2860; AVX512BW-NEXT: vblendvps %xmm0, %xmm0, %xmm1, %xmm0861; AVX512BW-NEXT: vmaxps %xmm2, %xmm0, %xmm1862; AVX512BW-NEXT: vcmpunordps %xmm0, %xmm0, %xmm2863; AVX512BW-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0864; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]865; AVX512BW-NEXT: vmovd %xmm0, %eax866; AVX512BW-NEXT: testl %eax, %eax867; AVX512BW-NEXT: sets %al868; AVX512BW-NEXT: kmovd %eax, %k1869; AVX512BW-NEXT: vmovaps %xmm0, %xmm2870; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}871; AVX512BW-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}872; AVX512BW-NEXT: vmaxss %xmm2, %xmm1, %xmm2873; AVX512BW-NEXT: vcmpunordss %xmm1, %xmm1, %k1874; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}875; AVX512BW-NEXT: vmovd %xmm2, %eax876; AVX512BW-NEXT: testl %eax, %eax877; AVX512BW-NEXT: sets %al878; AVX512BW-NEXT: kmovd %eax, %k1879; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]880; AVX512BW-NEXT: vmovaps %xmm2, %xmm3881; AVX512BW-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1}882; AVX512BW-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1}883; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm2884; AVX512BW-NEXT: vcmpunordss %xmm1, %xmm1, %k1885; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}886; AVX512BW-NEXT: vmovd %xmm2, %eax887; AVX512BW-NEXT: testl %eax, %eax888; AVX512BW-NEXT: sets %al889; AVX512BW-NEXT: kmovd %eax, %k1890; AVX512BW-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]891; AVX512BW-NEXT: vmovaps %xmm2, %xmm0892; AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}893; AVX512BW-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1}894; AVX512BW-NEXT: vmaxss %xmm0, %xmm1, %xmm0895; AVX512BW-NEXT: vcmpunordss %xmm1, %xmm1, %k1896; AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}897; AVX512BW-NEXT: vzeroupper898; AVX512BW-NEXT: retq899;900; AVX512VL-LABEL: test_v16f32:901; AVX512VL: # %bb.0:902; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1903; AVX512VL-NEXT: vpcmpgtd %ymm0, %ymm1, %k1904; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1905; AVX512VL-NEXT: vblendmps %ymm1, %ymm0, %ymm2 {%k1}906; AVX512VL-NEXT: vmovaps %ymm0, %ymm1 {%k1}907; AVX512VL-NEXT: vmaxps %ymm2, %ymm1, %ymm0908; AVX512VL-NEXT: vcmpunordps %ymm1, %ymm1, %k1909; AVX512VL-NEXT: vmovaps %ymm1, %ymm0 {%k1}910; AVX512VL-NEXT: vxorps %xmm1, %xmm1, %xmm1911; AVX512VL-NEXT: vpcmpgtd %xmm0, %xmm1, %k1912; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm1913; AVX512VL-NEXT: vblendmps %xmm1, %xmm0, %xmm2 {%k1}914; AVX512VL-NEXT: vmovaps %xmm0, %xmm1 {%k1}915; AVX512VL-NEXT: vmaxps %xmm2, %xmm1, %xmm0916; AVX512VL-NEXT: vcmpunordps %xmm1, %xmm1, %k1917; AVX512VL-NEXT: vmovaps %xmm1, %xmm0 {%k1}918; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]919; AVX512VL-NEXT: vmovd %xmm0, %eax920; AVX512VL-NEXT: testl %eax, %eax921; AVX512VL-NEXT: sets %al922; AVX512VL-NEXT: kmovd %eax, %k1923; AVX512VL-NEXT: vmovaps %xmm0, %xmm2924; AVX512VL-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}925; AVX512VL-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}926; AVX512VL-NEXT: vmaxss %xmm2, %xmm1, %xmm2927; AVX512VL-NEXT: vcmpunordss %xmm1, %xmm1, %k1928; AVX512VL-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}929; AVX512VL-NEXT: vmovd %xmm2, %eax930; AVX512VL-NEXT: testl %eax, %eax931; AVX512VL-NEXT: sets %al932; AVX512VL-NEXT: kmovd %eax, %k1933; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]934; AVX512VL-NEXT: vmovaps %xmm2, %xmm3935; AVX512VL-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1}936; AVX512VL-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1}937; AVX512VL-NEXT: vmaxss %xmm3, %xmm1, %xmm2938; AVX512VL-NEXT: vcmpunordss %xmm1, %xmm1, %k1939; AVX512VL-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}940; AVX512VL-NEXT: vmovd %xmm2, %eax941; AVX512VL-NEXT: testl %eax, %eax942; AVX512VL-NEXT: sets %al943; AVX512VL-NEXT: kmovd %eax, %k1944; AVX512VL-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]945; AVX512VL-NEXT: vmovaps %xmm2, %xmm0946; AVX512VL-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}947; AVX512VL-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1}948; AVX512VL-NEXT: vmaxss %xmm0, %xmm1, %xmm0949; AVX512VL-NEXT: vcmpunordss %xmm1, %xmm1, %k1950; AVX512VL-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}951; AVX512VL-NEXT: vzeroupper952; AVX512VL-NEXT: retq953 %1 = call float @llvm.vector.reduce.fmaximum.v16f32(<16 x float> %a0)954 ret float %1955}956 957;958; vXf64959;960 961define double @test_v2f64(<2 x double> %a0) {962; SSE2-LABEL: test_v2f64:963; SSE2: # %bb.0:964; SSE2-NEXT: movdqa %xmm0, %xmm2965; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm0[1]966; SSE2-NEXT: movq %xmm0, %rax967; SSE2-NEXT: testq %rax, %rax968; SSE2-NEXT: movdqa %xmm0, %xmm3969; SSE2-NEXT: js .LBB5_2970; SSE2-NEXT: # %bb.1:971; SSE2-NEXT: movdqa %xmm2, %xmm3972; SSE2-NEXT: .LBB5_2:973; SSE2-NEXT: movdqa %xmm3, %xmm1974; SSE2-NEXT: cmpunordsd %xmm3, %xmm1975; SSE2-NEXT: movapd %xmm1, %xmm4976; SSE2-NEXT: andpd %xmm3, %xmm4977; SSE2-NEXT: js .LBB5_4978; SSE2-NEXT: # %bb.3:979; SSE2-NEXT: movdqa %xmm0, %xmm2980; SSE2-NEXT: .LBB5_4:981; SSE2-NEXT: maxsd %xmm2, %xmm3982; SSE2-NEXT: andnpd %xmm3, %xmm1983; SSE2-NEXT: orpd %xmm4, %xmm1984; SSE2-NEXT: movapd %xmm1, %xmm0985; SSE2-NEXT: retq986;987; SSE41-LABEL: test_v2f64:988; SSE41: # %bb.0:989; SSE41-NEXT: movdqa %xmm0, %xmm2990; SSE41-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm0[1]991; SSE41-NEXT: movq %xmm0, %rax992; SSE41-NEXT: testq %rax, %rax993; SSE41-NEXT: js .LBB5_1994; SSE41-NEXT: # %bb.2:995; SSE41-NEXT: movdqa %xmm0, %xmm3996; SSE41-NEXT: jmp .LBB5_3997; SSE41-NEXT: .LBB5_1:998; SSE41-NEXT: movdqa %xmm2, %xmm3999; SSE41-NEXT: movdqa %xmm0, %xmm21000; SSE41-NEXT: .LBB5_3:1001; SSE41-NEXT: movdqa %xmm2, %xmm11002; SSE41-NEXT: maxsd %xmm3, %xmm11003; SSE41-NEXT: movdqa %xmm2, %xmm01004; SSE41-NEXT: cmpunordsd %xmm2, %xmm01005; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm11006; SSE41-NEXT: movapd %xmm1, %xmm01007; SSE41-NEXT: retq1008;1009; AVX-LABEL: test_v2f64:1010; AVX: # %bb.0:1011; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1012; AVX-NEXT: vmovq %xmm0, %rax1013; AVX-NEXT: testq %rax, %rax1014; AVX-NEXT: js .LBB5_11015; AVX-NEXT: # %bb.2:1016; AVX-NEXT: vmovapd %xmm0, %xmm21017; AVX-NEXT: jmp .LBB5_31018; AVX-NEXT: .LBB5_1:1019; AVX-NEXT: vmovapd %xmm1, %xmm21020; AVX-NEXT: vmovapd %xmm0, %xmm11021; AVX-NEXT: .LBB5_3:1022; AVX-NEXT: vmaxsd %xmm2, %xmm1, %xmm01023; AVX-NEXT: vcmpunordsd %xmm1, %xmm1, %xmm21024; AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm01025; AVX-NEXT: retq1026;1027; AVX512-LABEL: test_v2f64:1028; AVX512: # %bb.0:1029; AVX512-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1030; AVX512-NEXT: vmovq %xmm0, %rax1031; AVX512-NEXT: testq %rax, %rax1032; AVX512-NEXT: sets %al1033; AVX512-NEXT: kmovd %eax, %k11034; AVX512-NEXT: vmovapd %xmm0, %xmm21035; AVX512-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1}1036; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1037; AVX512-NEXT: vmaxsd %xmm2, %xmm1, %xmm01038; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k11039; AVX512-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}1040; AVX512-NEXT: retq1041 %1 = call double @llvm.vector.reduce.fmaximum.v2f64(<2 x double> %a0)1042 ret double %11043}1044 1045define double @test_v4f64(<4 x double> %a0) {1046; SSE2-LABEL: test_v4f64:1047; SSE2: # %bb.0:1048; SSE2-NEXT: movaps %xmm0, %xmm21049; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1],xmm0[3,3]1050; SSE2-NEXT: pxor %xmm3, %xmm31051; SSE2-NEXT: pcmpgtd %xmm2, %xmm31052; SSE2-NEXT: movdqa %xmm3, %xmm21053; SSE2-NEXT: pandn %xmm0, %xmm21054; SSE2-NEXT: movdqa %xmm3, %xmm41055; SSE2-NEXT: pandn %xmm1, %xmm41056; SSE2-NEXT: pand %xmm3, %xmm11057; SSE2-NEXT: por %xmm2, %xmm11058; SSE2-NEXT: pand %xmm0, %xmm31059; SSE2-NEXT: por %xmm4, %xmm31060; SSE2-NEXT: movdqa %xmm3, %xmm01061; SSE2-NEXT: maxpd %xmm1, %xmm01062; SSE2-NEXT: movdqa %xmm3, %xmm11063; SSE2-NEXT: cmpunordpd %xmm3, %xmm11064; SSE2-NEXT: andpd %xmm1, %xmm31065; SSE2-NEXT: andnpd %xmm0, %xmm11066; SSE2-NEXT: orpd %xmm3, %xmm11067; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]1068; SSE2-NEXT: movq %xmm1, %rax1069; SSE2-NEXT: testq %rax, %rax1070; SSE2-NEXT: movdqa %xmm1, %xmm31071; SSE2-NEXT: js .LBB6_21072; SSE2-NEXT: # %bb.1:1073; SSE2-NEXT: movdqa %xmm2, %xmm31074; SSE2-NEXT: .LBB6_2:1075; SSE2-NEXT: movdqa %xmm3, %xmm01076; SSE2-NEXT: cmpunordsd %xmm3, %xmm01077; SSE2-NEXT: movapd %xmm0, %xmm41078; SSE2-NEXT: andpd %xmm3, %xmm41079; SSE2-NEXT: js .LBB6_41080; SSE2-NEXT: # %bb.3:1081; SSE2-NEXT: movdqa %xmm1, %xmm21082; SSE2-NEXT: .LBB6_4:1083; SSE2-NEXT: maxsd %xmm2, %xmm31084; SSE2-NEXT: andnpd %xmm3, %xmm01085; SSE2-NEXT: orpd %xmm4, %xmm01086; SSE2-NEXT: retq1087;1088; SSE41-LABEL: test_v4f64:1089; SSE41: # %bb.0:1090; SSE41-NEXT: movapd %xmm0, %xmm21091; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm21092; SSE41-NEXT: blendvpd %xmm0, %xmm0, %xmm11093; SSE41-NEXT: movapd %xmm1, %xmm31094; SSE41-NEXT: maxpd %xmm2, %xmm31095; SSE41-NEXT: movapd %xmm1, %xmm01096; SSE41-NEXT: cmpunordpd %xmm1, %xmm01097; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm31098; SSE41-NEXT: movapd %xmm3, %xmm21099; SSE41-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm3[1]1100; SSE41-NEXT: movq %xmm3, %rax1101; SSE41-NEXT: testq %rax, %rax1102; SSE41-NEXT: js .LBB6_11103; SSE41-NEXT: # %bb.2:1104; SSE41-NEXT: movapd %xmm3, %xmm01105; SSE41-NEXT: jmp .LBB6_31106; SSE41-NEXT: .LBB6_1:1107; SSE41-NEXT: movapd %xmm2, %xmm01108; SSE41-NEXT: movapd %xmm3, %xmm21109; SSE41-NEXT: .LBB6_3:1110; SSE41-NEXT: movapd %xmm2, %xmm11111; SSE41-NEXT: maxsd %xmm0, %xmm11112; SSE41-NEXT: movapd %xmm2, %xmm01113; SSE41-NEXT: cmpunordsd %xmm2, %xmm01114; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm11115; SSE41-NEXT: movapd %xmm1, %xmm01116; SSE41-NEXT: retq1117;1118; AVX-LABEL: test_v4f64:1119; AVX: # %bb.0:1120; AVX-NEXT: vextractf128 $1, %ymm0, %xmm11121; AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm21122; AVX-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm01123; AVX-NEXT: vmaxpd %xmm2, %xmm0, %xmm11124; AVX-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm21125; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm11126; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm1[1,0]1127; AVX-NEXT: vmovq %xmm1, %rax1128; AVX-NEXT: testq %rax, %rax1129; AVX-NEXT: js .LBB6_11130; AVX-NEXT: # %bb.2:1131; AVX-NEXT: vmovapd %xmm1, %xmm21132; AVX-NEXT: jmp .LBB6_31133; AVX-NEXT: .LBB6_1:1134; AVX-NEXT: vmovapd %xmm0, %xmm21135; AVX-NEXT: vmovapd %xmm1, %xmm01136; AVX-NEXT: .LBB6_3:1137; AVX-NEXT: vmaxsd %xmm2, %xmm0, %xmm11138; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm21139; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01140; AVX-NEXT: vzeroupper1141; AVX-NEXT: retq1142;1143; AVX512BW-LABEL: test_v4f64:1144; AVX512BW: # %bb.0:1145; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm11146; AVX512BW-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm21147; AVX512BW-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm01148; AVX512BW-NEXT: vmaxpd %xmm2, %xmm0, %xmm11149; AVX512BW-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm21150; AVX512BW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01151; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1152; AVX512BW-NEXT: vmovq %xmm0, %rax1153; AVX512BW-NEXT: testq %rax, %rax1154; AVX512BW-NEXT: sets %al1155; AVX512BW-NEXT: kmovd %eax, %k11156; AVX512BW-NEXT: vmovapd %xmm0, %xmm21157; AVX512BW-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1}1158; AVX512BW-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1159; AVX512BW-NEXT: vmaxsd %xmm2, %xmm1, %xmm01160; AVX512BW-NEXT: vcmpunordsd %xmm1, %xmm1, %k11161; AVX512BW-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}1162; AVX512BW-NEXT: vzeroupper1163; AVX512BW-NEXT: retq1164;1165; AVX512VL-LABEL: test_v4f64:1166; AVX512VL: # %bb.0:1167; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11168; AVX512VL-NEXT: vpcmpgtq %xmm0, %xmm1, %k11169; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm11170; AVX512VL-NEXT: vblendmpd %xmm1, %xmm0, %xmm2 {%k1}1171; AVX512VL-NEXT: vmovapd %xmm0, %xmm1 {%k1}1172; AVX512VL-NEXT: vmaxpd %xmm2, %xmm1, %xmm01173; AVX512VL-NEXT: vcmpunordpd %xmm1, %xmm1, %k11174; AVX512VL-NEXT: vmovapd %xmm1, %xmm0 {%k1}1175; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1176; AVX512VL-NEXT: vmovq %xmm0, %rax1177; AVX512VL-NEXT: testq %rax, %rax1178; AVX512VL-NEXT: sets %al1179; AVX512VL-NEXT: kmovd %eax, %k11180; AVX512VL-NEXT: vmovapd %xmm0, %xmm21181; AVX512VL-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1}1182; AVX512VL-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1183; AVX512VL-NEXT: vmaxsd %xmm2, %xmm1, %xmm01184; AVX512VL-NEXT: vcmpunordsd %xmm1, %xmm1, %k11185; AVX512VL-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}1186; AVX512VL-NEXT: vzeroupper1187; AVX512VL-NEXT: retq1188 %1 = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> %a0)1189 ret double %11190}1191 1192define double @test_v8f64(<8 x double> %a0) {1193; SSE2-LABEL: test_v8f64:1194; SSE2: # %bb.0:1195; SSE2-NEXT: movaps %xmm0, %xmm51196; SSE2-NEXT: shufps {{.*#+}} xmm5 = xmm5[1,1],xmm0[3,3]1197; SSE2-NEXT: pxor %xmm4, %xmm41198; SSE2-NEXT: pxor %xmm6, %xmm61199; SSE2-NEXT: pcmpgtd %xmm5, %xmm61200; SSE2-NEXT: movdqa %xmm6, %xmm51201; SSE2-NEXT: pandn %xmm0, %xmm51202; SSE2-NEXT: movdqa %xmm6, %xmm71203; SSE2-NEXT: pandn %xmm2, %xmm71204; SSE2-NEXT: pand %xmm6, %xmm21205; SSE2-NEXT: por %xmm5, %xmm21206; SSE2-NEXT: pand %xmm0, %xmm61207; SSE2-NEXT: por %xmm7, %xmm61208; SSE2-NEXT: movdqa %xmm6, %xmm01209; SSE2-NEXT: maxpd %xmm2, %xmm01210; SSE2-NEXT: movdqa %xmm6, %xmm21211; SSE2-NEXT: cmpunordpd %xmm6, %xmm21212; SSE2-NEXT: andpd %xmm2, %xmm61213; SSE2-NEXT: andnpd %xmm0, %xmm21214; SSE2-NEXT: orpd %xmm6, %xmm21215; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]1216; SSE2-NEXT: xorpd %xmm0, %xmm01217; SSE2-NEXT: pcmpgtd %xmm5, %xmm01218; SSE2-NEXT: movdqa %xmm0, %xmm51219; SSE2-NEXT: pandn %xmm2, %xmm51220; SSE2-NEXT: movaps %xmm1, %xmm61221; SSE2-NEXT: shufps {{.*#+}} xmm6 = xmm6[1,1],xmm1[3,3]1222; SSE2-NEXT: pcmpgtd %xmm6, %xmm41223; SSE2-NEXT: movdqa %xmm4, %xmm61224; SSE2-NEXT: pandn %xmm1, %xmm61225; SSE2-NEXT: movdqa %xmm4, %xmm71226; SSE2-NEXT: pandn %xmm3, %xmm71227; SSE2-NEXT: pand %xmm4, %xmm31228; SSE2-NEXT: por %xmm6, %xmm31229; SSE2-NEXT: pand %xmm1, %xmm41230; SSE2-NEXT: por %xmm7, %xmm41231; SSE2-NEXT: movdqa %xmm4, %xmm11232; SSE2-NEXT: maxpd %xmm3, %xmm11233; SSE2-NEXT: movdqa %xmm4, %xmm31234; SSE2-NEXT: cmpunordpd %xmm4, %xmm31235; SSE2-NEXT: andpd %xmm3, %xmm41236; SSE2-NEXT: andnpd %xmm1, %xmm31237; SSE2-NEXT: orpd %xmm4, %xmm31238; SSE2-NEXT: movdqa %xmm0, %xmm11239; SSE2-NEXT: pandn %xmm3, %xmm11240; SSE2-NEXT: pand %xmm0, %xmm31241; SSE2-NEXT: por %xmm5, %xmm31242; SSE2-NEXT: pand %xmm2, %xmm01243; SSE2-NEXT: por %xmm1, %xmm01244; SSE2-NEXT: movdqa %xmm0, %xmm21245; SSE2-NEXT: maxpd %xmm3, %xmm21246; SSE2-NEXT: movdqa %xmm0, %xmm11247; SSE2-NEXT: cmpunordpd %xmm0, %xmm11248; SSE2-NEXT: andpd %xmm1, %xmm01249; SSE2-NEXT: andnpd %xmm2, %xmm11250; SSE2-NEXT: orpd %xmm0, %xmm11251; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]1252; SSE2-NEXT: movq %xmm1, %rax1253; SSE2-NEXT: testq %rax, %rax1254; SSE2-NEXT: movdqa %xmm1, %xmm31255; SSE2-NEXT: js .LBB7_21256; SSE2-NEXT: # %bb.1:1257; SSE2-NEXT: movdqa %xmm2, %xmm31258; SSE2-NEXT: .LBB7_2:1259; SSE2-NEXT: movdqa %xmm3, %xmm01260; SSE2-NEXT: cmpunordsd %xmm3, %xmm01261; SSE2-NEXT: movapd %xmm0, %xmm41262; SSE2-NEXT: andpd %xmm3, %xmm41263; SSE2-NEXT: js .LBB7_41264; SSE2-NEXT: # %bb.3:1265; SSE2-NEXT: movdqa %xmm1, %xmm21266; SSE2-NEXT: .LBB7_4:1267; SSE2-NEXT: maxsd %xmm2, %xmm31268; SSE2-NEXT: andnpd %xmm3, %xmm01269; SSE2-NEXT: orpd %xmm4, %xmm01270; SSE2-NEXT: retq1271;1272; SSE41-LABEL: test_v8f64:1273; SSE41: # %bb.0:1274; SSE41-NEXT: movapd %xmm0, %xmm41275; SSE41-NEXT: movapd %xmm1, %xmm61276; SSE41-NEXT: movapd %xmm1, %xmm01277; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm61278; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm31279; SSE41-NEXT: movapd %xmm3, %xmm51280; SSE41-NEXT: maxpd %xmm6, %xmm51281; SSE41-NEXT: movapd %xmm3, %xmm01282; SSE41-NEXT: cmpunordpd %xmm3, %xmm01283; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm51284; SSE41-NEXT: movapd %xmm4, %xmm31285; SSE41-NEXT: movapd %xmm4, %xmm01286; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm31287; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm21288; SSE41-NEXT: movapd %xmm2, %xmm11289; SSE41-NEXT: maxpd %xmm3, %xmm11290; SSE41-NEXT: movapd %xmm2, %xmm01291; SSE41-NEXT: cmpunordpd %xmm2, %xmm01292; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm11293; SSE41-NEXT: movapd %xmm1, %xmm21294; SSE41-NEXT: movapd %xmm1, %xmm01295; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm21296; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm51297; SSE41-NEXT: movapd %xmm5, %xmm11298; SSE41-NEXT: maxpd %xmm2, %xmm11299; SSE41-NEXT: movapd %xmm5, %xmm01300; SSE41-NEXT: cmpunordpd %xmm5, %xmm01301; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm11302; SSE41-NEXT: movapd %xmm1, %xmm21303; SSE41-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1]1304; SSE41-NEXT: movq %xmm1, %rax1305; SSE41-NEXT: testq %rax, %rax1306; SSE41-NEXT: js .LBB7_11307; SSE41-NEXT: # %bb.2:1308; SSE41-NEXT: movapd %xmm1, %xmm01309; SSE41-NEXT: jmp .LBB7_31310; SSE41-NEXT: .LBB7_1:1311; SSE41-NEXT: movapd %xmm2, %xmm01312; SSE41-NEXT: movapd %xmm1, %xmm21313; SSE41-NEXT: .LBB7_3:1314; SSE41-NEXT: movapd %xmm2, %xmm11315; SSE41-NEXT: maxsd %xmm0, %xmm11316; SSE41-NEXT: movapd %xmm2, %xmm01317; SSE41-NEXT: cmpunordsd %xmm2, %xmm01318; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm11319; SSE41-NEXT: movapd %xmm1, %xmm01320; SSE41-NEXT: retq1321;1322; AVX-LABEL: test_v8f64:1323; AVX: # %bb.0:1324; AVX-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm21325; AVX-NEXT: vblendvpd %ymm0, %ymm0, %ymm1, %ymm01326; AVX-NEXT: vmaxpd %ymm2, %ymm0, %ymm11327; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm21328; AVX-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm01329; AVX-NEXT: vextractf128 $1, %ymm0, %xmm11330; AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm21331; AVX-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm01332; AVX-NEXT: vmaxpd %xmm2, %xmm0, %xmm11333; AVX-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm21334; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm11335; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm1[1,0]1336; AVX-NEXT: vmovq %xmm1, %rax1337; AVX-NEXT: testq %rax, %rax1338; AVX-NEXT: js .LBB7_11339; AVX-NEXT: # %bb.2:1340; AVX-NEXT: vmovapd %xmm1, %xmm21341; AVX-NEXT: jmp .LBB7_31342; AVX-NEXT: .LBB7_1:1343; AVX-NEXT: vmovapd %xmm0, %xmm21344; AVX-NEXT: vmovapd %xmm1, %xmm01345; AVX-NEXT: .LBB7_3:1346; AVX-NEXT: vmaxsd %xmm2, %xmm0, %xmm11347; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm21348; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01349; AVX-NEXT: vzeroupper1350; AVX-NEXT: retq1351;1352; AVX512BW-LABEL: test_v8f64:1353; AVX512BW: # %bb.0:1354; AVX512BW-NEXT: vextractf64x4 $1, %zmm0, %ymm11355; AVX512BW-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm21356; AVX512BW-NEXT: vblendvpd %ymm0, %ymm0, %ymm1, %ymm01357; AVX512BW-NEXT: vmaxpd %ymm2, %ymm0, %ymm11358; AVX512BW-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm21359; AVX512BW-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm01360; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm11361; AVX512BW-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm21362; AVX512BW-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm01363; AVX512BW-NEXT: vmaxpd %xmm2, %xmm0, %xmm11364; AVX512BW-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm21365; AVX512BW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01366; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1367; AVX512BW-NEXT: vmovq %xmm0, %rax1368; AVX512BW-NEXT: testq %rax, %rax1369; AVX512BW-NEXT: sets %al1370; AVX512BW-NEXT: kmovd %eax, %k11371; AVX512BW-NEXT: vmovapd %xmm0, %xmm21372; AVX512BW-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1}1373; AVX512BW-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1374; AVX512BW-NEXT: vmaxsd %xmm2, %xmm1, %xmm01375; AVX512BW-NEXT: vcmpunordsd %xmm1, %xmm1, %k11376; AVX512BW-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}1377; AVX512BW-NEXT: vzeroupper1378; AVX512BW-NEXT: retq1379;1380; AVX512VL-LABEL: test_v8f64:1381; AVX512VL: # %bb.0:1382; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11383; AVX512VL-NEXT: vpcmpgtq %ymm0, %ymm1, %k11384; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm11385; AVX512VL-NEXT: vblendmpd %ymm1, %ymm0, %ymm2 {%k1}1386; AVX512VL-NEXT: vmovapd %ymm0, %ymm1 {%k1}1387; AVX512VL-NEXT: vmaxpd %ymm2, %ymm1, %ymm01388; AVX512VL-NEXT: vcmpunordpd %ymm1, %ymm1, %k11389; AVX512VL-NEXT: vmovapd %ymm1, %ymm0 {%k1}1390; AVX512VL-NEXT: vxorpd %xmm1, %xmm1, %xmm11391; AVX512VL-NEXT: vpcmpgtq %xmm0, %xmm1, %k11392; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm11393; AVX512VL-NEXT: vblendmpd %xmm1, %xmm0, %xmm2 {%k1}1394; AVX512VL-NEXT: vmovapd %xmm0, %xmm1 {%k1}1395; AVX512VL-NEXT: vmaxpd %xmm2, %xmm1, %xmm01396; AVX512VL-NEXT: vcmpunordpd %xmm1, %xmm1, %k11397; AVX512VL-NEXT: vmovapd %xmm1, %xmm0 {%k1}1398; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1399; AVX512VL-NEXT: vmovq %xmm0, %rax1400; AVX512VL-NEXT: testq %rax, %rax1401; AVX512VL-NEXT: sets %al1402; AVX512VL-NEXT: kmovd %eax, %k11403; AVX512VL-NEXT: vmovapd %xmm0, %xmm21404; AVX512VL-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1}1405; AVX512VL-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1406; AVX512VL-NEXT: vmaxsd %xmm2, %xmm1, %xmm01407; AVX512VL-NEXT: vcmpunordsd %xmm1, %xmm1, %k11408; AVX512VL-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}1409; AVX512VL-NEXT: vzeroupper1410; AVX512VL-NEXT: retq1411 %1 = call double @llvm.vector.reduce.fmaximum.v8f64(<8 x double> %a0)1412 ret double %11413}1414 1415define double @test_v16f64(<16 x double> %a0) {1416; SSE2-LABEL: test_v16f64:1417; SSE2: # %bb.0:1418; SSE2-NEXT: movaps %xmm0, %xmm91419; SSE2-NEXT: shufps {{.*#+}} xmm9 = xmm9[1,1],xmm0[3,3]1420; SSE2-NEXT: pxor %xmm8, %xmm81421; SSE2-NEXT: pxor %xmm10, %xmm101422; SSE2-NEXT: pcmpgtd %xmm9, %xmm101423; SSE2-NEXT: movdqa %xmm10, %xmm91424; SSE2-NEXT: pandn %xmm0, %xmm91425; SSE2-NEXT: movdqa %xmm10, %xmm111426; SSE2-NEXT: pandn %xmm4, %xmm111427; SSE2-NEXT: pand %xmm10, %xmm41428; SSE2-NEXT: por %xmm9, %xmm41429; SSE2-NEXT: pand %xmm0, %xmm101430; SSE2-NEXT: por %xmm11, %xmm101431; SSE2-NEXT: movdqa %xmm10, %xmm01432; SSE2-NEXT: maxpd %xmm4, %xmm01433; SSE2-NEXT: movdqa %xmm10, %xmm41434; SSE2-NEXT: cmpunordpd %xmm10, %xmm41435; SSE2-NEXT: andpd %xmm4, %xmm101436; SSE2-NEXT: andnpd %xmm0, %xmm41437; SSE2-NEXT: orpd %xmm10, %xmm41438; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm4[1,1,3,3]1439; SSE2-NEXT: xorpd %xmm0, %xmm01440; SSE2-NEXT: pcmpgtd %xmm9, %xmm01441; SSE2-NEXT: movdqa %xmm0, %xmm91442; SSE2-NEXT: pandn %xmm4, %xmm91443; SSE2-NEXT: movaps %xmm2, %xmm101444; SSE2-NEXT: shufps {{.*#+}} xmm10 = xmm10[1,1],xmm2[3,3]1445; SSE2-NEXT: pxor %xmm11, %xmm111446; SSE2-NEXT: pcmpgtd %xmm10, %xmm111447; SSE2-NEXT: movdqa %xmm11, %xmm101448; SSE2-NEXT: pandn %xmm2, %xmm101449; SSE2-NEXT: movdqa %xmm11, %xmm121450; SSE2-NEXT: pandn %xmm6, %xmm121451; SSE2-NEXT: pand %xmm11, %xmm61452; SSE2-NEXT: por %xmm10, %xmm61453; SSE2-NEXT: pand %xmm2, %xmm111454; SSE2-NEXT: por %xmm12, %xmm111455; SSE2-NEXT: movdqa %xmm11, %xmm21456; SSE2-NEXT: maxpd %xmm6, %xmm21457; SSE2-NEXT: movdqa %xmm11, %xmm61458; SSE2-NEXT: cmpunordpd %xmm11, %xmm61459; SSE2-NEXT: andpd %xmm6, %xmm111460; SSE2-NEXT: andnpd %xmm2, %xmm61461; SSE2-NEXT: orpd %xmm11, %xmm61462; SSE2-NEXT: movdqa %xmm0, %xmm21463; SSE2-NEXT: pandn %xmm6, %xmm21464; SSE2-NEXT: pand %xmm0, %xmm61465; SSE2-NEXT: por %xmm9, %xmm61466; SSE2-NEXT: pand %xmm4, %xmm01467; SSE2-NEXT: por %xmm2, %xmm01468; SSE2-NEXT: movdqa %xmm0, %xmm41469; SSE2-NEXT: maxpd %xmm6, %xmm41470; SSE2-NEXT: movdqa %xmm0, %xmm21471; SSE2-NEXT: cmpunordpd %xmm0, %xmm21472; SSE2-NEXT: andpd %xmm2, %xmm01473; SSE2-NEXT: andnpd %xmm4, %xmm21474; SSE2-NEXT: orpd %xmm0, %xmm21475; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]1476; SSE2-NEXT: xorpd %xmm0, %xmm01477; SSE2-NEXT: pcmpgtd %xmm4, %xmm01478; SSE2-NEXT: movdqa %xmm0, %xmm41479; SSE2-NEXT: pandn %xmm2, %xmm41480; SSE2-NEXT: movaps %xmm1, %xmm61481; SSE2-NEXT: shufps {{.*#+}} xmm6 = xmm6[1,1],xmm1[3,3]1482; SSE2-NEXT: pxor %xmm9, %xmm91483; SSE2-NEXT: pcmpgtd %xmm6, %xmm91484; SSE2-NEXT: movdqa %xmm9, %xmm61485; SSE2-NEXT: pandn %xmm1, %xmm61486; SSE2-NEXT: movdqa %xmm9, %xmm101487; SSE2-NEXT: pandn %xmm5, %xmm101488; SSE2-NEXT: pand %xmm9, %xmm51489; SSE2-NEXT: por %xmm6, %xmm51490; SSE2-NEXT: pand %xmm1, %xmm91491; SSE2-NEXT: por %xmm10, %xmm91492; SSE2-NEXT: movdqa %xmm9, %xmm11493; SSE2-NEXT: maxpd %xmm5, %xmm11494; SSE2-NEXT: movdqa %xmm9, %xmm51495; SSE2-NEXT: cmpunordpd %xmm9, %xmm51496; SSE2-NEXT: andpd %xmm5, %xmm91497; SSE2-NEXT: andnpd %xmm1, %xmm51498; SSE2-NEXT: orpd %xmm9, %xmm51499; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]1500; SSE2-NEXT: xorpd %xmm1, %xmm11501; SSE2-NEXT: pcmpgtd %xmm6, %xmm11502; SSE2-NEXT: movdqa %xmm1, %xmm61503; SSE2-NEXT: pandn %xmm5, %xmm61504; SSE2-NEXT: movaps %xmm3, %xmm91505; SSE2-NEXT: shufps {{.*#+}} xmm9 = xmm9[1,1],xmm3[3,3]1506; SSE2-NEXT: pcmpgtd %xmm9, %xmm81507; SSE2-NEXT: movdqa %xmm8, %xmm91508; SSE2-NEXT: pandn %xmm3, %xmm91509; SSE2-NEXT: movdqa %xmm8, %xmm101510; SSE2-NEXT: pandn %xmm7, %xmm101511; SSE2-NEXT: pand %xmm8, %xmm71512; SSE2-NEXT: por %xmm9, %xmm71513; SSE2-NEXT: pand %xmm3, %xmm81514; SSE2-NEXT: por %xmm10, %xmm81515; SSE2-NEXT: movdqa %xmm8, %xmm31516; SSE2-NEXT: maxpd %xmm7, %xmm31517; SSE2-NEXT: movdqa %xmm8, %xmm71518; SSE2-NEXT: cmpunordpd %xmm8, %xmm71519; SSE2-NEXT: andpd %xmm7, %xmm81520; SSE2-NEXT: andnpd %xmm3, %xmm71521; SSE2-NEXT: orpd %xmm8, %xmm71522; SSE2-NEXT: movdqa %xmm1, %xmm31523; SSE2-NEXT: pandn %xmm7, %xmm31524; SSE2-NEXT: pand %xmm1, %xmm71525; SSE2-NEXT: por %xmm6, %xmm71526; SSE2-NEXT: pand %xmm5, %xmm11527; SSE2-NEXT: por %xmm3, %xmm11528; SSE2-NEXT: movdqa %xmm1, %xmm31529; SSE2-NEXT: maxpd %xmm7, %xmm31530; SSE2-NEXT: movdqa %xmm1, %xmm51531; SSE2-NEXT: cmpunordpd %xmm1, %xmm51532; SSE2-NEXT: andpd %xmm5, %xmm11533; SSE2-NEXT: andnpd %xmm3, %xmm51534; SSE2-NEXT: orpd %xmm1, %xmm51535; SSE2-NEXT: movdqa %xmm0, %xmm11536; SSE2-NEXT: pandn %xmm5, %xmm11537; SSE2-NEXT: pand %xmm0, %xmm51538; SSE2-NEXT: por %xmm4, %xmm51539; SSE2-NEXT: pand %xmm2, %xmm01540; SSE2-NEXT: por %xmm1, %xmm01541; SSE2-NEXT: movdqa %xmm0, %xmm21542; SSE2-NEXT: maxpd %xmm5, %xmm21543; SSE2-NEXT: movdqa %xmm0, %xmm11544; SSE2-NEXT: cmpunordpd %xmm0, %xmm11545; SSE2-NEXT: andpd %xmm1, %xmm01546; SSE2-NEXT: andnpd %xmm2, %xmm11547; SSE2-NEXT: orpd %xmm0, %xmm11548; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]1549; SSE2-NEXT: movq %xmm1, %rax1550; SSE2-NEXT: testq %rax, %rax1551; SSE2-NEXT: movdqa %xmm1, %xmm31552; SSE2-NEXT: js .LBB8_21553; SSE2-NEXT: # %bb.1:1554; SSE2-NEXT: movdqa %xmm2, %xmm31555; SSE2-NEXT: .LBB8_2:1556; SSE2-NEXT: movdqa %xmm3, %xmm01557; SSE2-NEXT: cmpunordsd %xmm3, %xmm01558; SSE2-NEXT: movapd %xmm0, %xmm41559; SSE2-NEXT: andpd %xmm3, %xmm41560; SSE2-NEXT: js .LBB8_41561; SSE2-NEXT: # %bb.3:1562; SSE2-NEXT: movdqa %xmm1, %xmm21563; SSE2-NEXT: .LBB8_4:1564; SSE2-NEXT: maxsd %xmm2, %xmm31565; SSE2-NEXT: andnpd %xmm3, %xmm01566; SSE2-NEXT: orpd %xmm4, %xmm01567; SSE2-NEXT: retq1568;1569; SSE41-LABEL: test_v16f64:1570; SSE41: # %bb.0:1571; SSE41-NEXT: movapd %xmm1, %xmm81572; SSE41-NEXT: movapd %xmm0, %xmm11573; SSE41-NEXT: movapd %xmm3, %xmm101574; SSE41-NEXT: movapd %xmm3, %xmm01575; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm101576; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm71577; SSE41-NEXT: movapd %xmm7, %xmm91578; SSE41-NEXT: maxpd %xmm10, %xmm91579; SSE41-NEXT: movapd %xmm7, %xmm01580; SSE41-NEXT: cmpunordpd %xmm7, %xmm01581; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm91582; SSE41-NEXT: movapd %xmm8, %xmm71583; SSE41-NEXT: movapd %xmm8, %xmm01584; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm71585; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm51586; SSE41-NEXT: movapd %xmm5, %xmm31587; SSE41-NEXT: maxpd %xmm7, %xmm31588; SSE41-NEXT: movapd %xmm5, %xmm01589; SSE41-NEXT: cmpunordpd %xmm5, %xmm01590; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm31591; SSE41-NEXT: movapd %xmm3, %xmm51592; SSE41-NEXT: movapd %xmm3, %xmm01593; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm51594; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm91595; SSE41-NEXT: movapd %xmm9, %xmm31596; SSE41-NEXT: maxpd %xmm5, %xmm31597; SSE41-NEXT: movapd %xmm9, %xmm01598; SSE41-NEXT: cmpunordpd %xmm9, %xmm01599; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm31600; SSE41-NEXT: movapd %xmm2, %xmm51601; SSE41-NEXT: movapd %xmm2, %xmm01602; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm51603; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm61604; SSE41-NEXT: movapd %xmm6, %xmm21605; SSE41-NEXT: maxpd %xmm5, %xmm21606; SSE41-NEXT: movapd %xmm6, %xmm01607; SSE41-NEXT: cmpunordpd %xmm6, %xmm01608; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm21609; SSE41-NEXT: movapd %xmm1, %xmm51610; SSE41-NEXT: movapd %xmm1, %xmm01611; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm51612; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm41613; SSE41-NEXT: movapd %xmm4, %xmm11614; SSE41-NEXT: maxpd %xmm5, %xmm11615; SSE41-NEXT: movapd %xmm4, %xmm01616; SSE41-NEXT: cmpunordpd %xmm4, %xmm01617; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm11618; SSE41-NEXT: movapd %xmm1, %xmm41619; SSE41-NEXT: movapd %xmm1, %xmm01620; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm41621; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm21622; SSE41-NEXT: movapd %xmm2, %xmm11623; SSE41-NEXT: maxpd %xmm4, %xmm11624; SSE41-NEXT: movapd %xmm2, %xmm01625; SSE41-NEXT: cmpunordpd %xmm2, %xmm01626; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm11627; SSE41-NEXT: movapd %xmm1, %xmm21628; SSE41-NEXT: movapd %xmm1, %xmm01629; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm21630; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm31631; SSE41-NEXT: movapd %xmm3, %xmm11632; SSE41-NEXT: maxpd %xmm2, %xmm11633; SSE41-NEXT: movapd %xmm3, %xmm01634; SSE41-NEXT: cmpunordpd %xmm3, %xmm01635; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm11636; SSE41-NEXT: movapd %xmm1, %xmm21637; SSE41-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1]1638; SSE41-NEXT: movq %xmm1, %rax1639; SSE41-NEXT: testq %rax, %rax1640; SSE41-NEXT: js .LBB8_11641; SSE41-NEXT: # %bb.2:1642; SSE41-NEXT: movapd %xmm1, %xmm01643; SSE41-NEXT: jmp .LBB8_31644; SSE41-NEXT: .LBB8_1:1645; SSE41-NEXT: movapd %xmm2, %xmm01646; SSE41-NEXT: movapd %xmm1, %xmm21647; SSE41-NEXT: .LBB8_3:1648; SSE41-NEXT: movapd %xmm2, %xmm11649; SSE41-NEXT: maxsd %xmm0, %xmm11650; SSE41-NEXT: movapd %xmm2, %xmm01651; SSE41-NEXT: cmpunordsd %xmm2, %xmm01652; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm11653; SSE41-NEXT: movapd %xmm1, %xmm01654; SSE41-NEXT: retq1655;1656; AVX-LABEL: test_v16f64:1657; AVX: # %bb.0:1658; AVX-NEXT: vblendvpd %ymm1, %ymm3, %ymm1, %ymm41659; AVX-NEXT: vblendvpd %ymm1, %ymm1, %ymm3, %ymm11660; AVX-NEXT: vmaxpd %ymm4, %ymm1, %ymm31661; AVX-NEXT: vcmpunordpd %ymm1, %ymm1, %ymm41662; AVX-NEXT: vblendvpd %ymm4, %ymm1, %ymm3, %ymm11663; AVX-NEXT: vblendvpd %ymm0, %ymm2, %ymm0, %ymm31664; AVX-NEXT: vblendvpd %ymm0, %ymm0, %ymm2, %ymm01665; AVX-NEXT: vmaxpd %ymm3, %ymm0, %ymm21666; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm31667; AVX-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm01668; AVX-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm21669; AVX-NEXT: vblendvpd %ymm0, %ymm0, %ymm1, %ymm01670; AVX-NEXT: vmaxpd %ymm2, %ymm0, %ymm11671; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm21672; AVX-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm01673; AVX-NEXT: vextractf128 $1, %ymm0, %xmm11674; AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm21675; AVX-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm01676; AVX-NEXT: vmaxpd %xmm2, %xmm0, %xmm11677; AVX-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm21678; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm11679; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm1[1,0]1680; AVX-NEXT: vmovq %xmm1, %rax1681; AVX-NEXT: testq %rax, %rax1682; AVX-NEXT: js .LBB8_11683; AVX-NEXT: # %bb.2:1684; AVX-NEXT: vmovapd %xmm1, %xmm21685; AVX-NEXT: jmp .LBB8_31686; AVX-NEXT: .LBB8_1:1687; AVX-NEXT: vmovapd %xmm0, %xmm21688; AVX-NEXT: vmovapd %xmm1, %xmm01689; AVX-NEXT: .LBB8_3:1690; AVX-NEXT: vmaxsd %xmm2, %xmm0, %xmm11691; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm21692; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01693; AVX-NEXT: vzeroupper1694; AVX-NEXT: retq1695;1696; AVX512BW-LABEL: test_v16f64:1697; AVX512BW: # %bb.0:1698; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm21699; AVX512BW-NEXT: vpcmpgtq %zmm0, %zmm2, %k11700; AVX512BW-NEXT: vblendmpd %zmm1, %zmm0, %zmm2 {%k1}1701; AVX512BW-NEXT: vmovapd %zmm0, %zmm1 {%k1}1702; AVX512BW-NEXT: vmaxpd %zmm2, %zmm1, %zmm01703; AVX512BW-NEXT: vcmpunordpd %zmm1, %zmm1, %k11704; AVX512BW-NEXT: vmovapd %zmm1, %zmm0 {%k1}1705; AVX512BW-NEXT: vextractf64x4 $1, %zmm0, %ymm11706; AVX512BW-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm21707; AVX512BW-NEXT: vblendvpd %ymm0, %ymm0, %ymm1, %ymm01708; AVX512BW-NEXT: vmaxpd %ymm2, %ymm0, %ymm11709; AVX512BW-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm21710; AVX512BW-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm01711; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm11712; AVX512BW-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm21713; AVX512BW-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm01714; AVX512BW-NEXT: vmaxpd %xmm2, %xmm0, %xmm11715; AVX512BW-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm21716; AVX512BW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01717; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1718; AVX512BW-NEXT: vmovq %xmm0, %rax1719; AVX512BW-NEXT: testq %rax, %rax1720; AVX512BW-NEXT: sets %al1721; AVX512BW-NEXT: kmovd %eax, %k11722; AVX512BW-NEXT: vmovapd %xmm0, %xmm21723; AVX512BW-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1}1724; AVX512BW-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1725; AVX512BW-NEXT: vmaxsd %xmm2, %xmm1, %xmm01726; AVX512BW-NEXT: vcmpunordsd %xmm1, %xmm1, %k11727; AVX512BW-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}1728; AVX512BW-NEXT: vzeroupper1729; AVX512BW-NEXT: retq1730;1731; AVX512VL-LABEL: test_v16f64:1732; AVX512VL: # %bb.0:1733; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm21734; AVX512VL-NEXT: vpcmpgtq %zmm0, %zmm2, %k11735; AVX512VL-NEXT: vblendmpd %zmm1, %zmm0, %zmm2 {%k1}1736; AVX512VL-NEXT: vmovapd %zmm0, %zmm1 {%k1}1737; AVX512VL-NEXT: vmaxpd %zmm2, %zmm1, %zmm01738; AVX512VL-NEXT: vcmpunordpd %zmm1, %zmm1, %k11739; AVX512VL-NEXT: vmovapd %zmm1, %zmm0 {%k1}1740; AVX512VL-NEXT: vxorpd %xmm1, %xmm1, %xmm11741; AVX512VL-NEXT: vpcmpgtq %ymm0, %ymm1, %k11742; AVX512VL-NEXT: vextractf64x4 $1, %zmm0, %ymm11743; AVX512VL-NEXT: vblendmpd %ymm1, %ymm0, %ymm2 {%k1}1744; AVX512VL-NEXT: vmovapd %ymm0, %ymm1 {%k1}1745; AVX512VL-NEXT: vmaxpd %ymm2, %ymm1, %ymm01746; AVX512VL-NEXT: vcmpunordpd %ymm1, %ymm1, %k11747; AVX512VL-NEXT: vmovapd %ymm1, %ymm0 {%k1}1748; AVX512VL-NEXT: vxorpd %xmm1, %xmm1, %xmm11749; AVX512VL-NEXT: vpcmpgtq %xmm0, %xmm1, %k11750; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm11751; AVX512VL-NEXT: vblendmpd %xmm1, %xmm0, %xmm2 {%k1}1752; AVX512VL-NEXT: vmovapd %xmm0, %xmm1 {%k1}1753; AVX512VL-NEXT: vmaxpd %xmm2, %xmm1, %xmm01754; AVX512VL-NEXT: vcmpunordpd %xmm1, %xmm1, %k11755; AVX512VL-NEXT: vmovapd %xmm1, %xmm0 {%k1}1756; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1757; AVX512VL-NEXT: vmovq %xmm0, %rax1758; AVX512VL-NEXT: testq %rax, %rax1759; AVX512VL-NEXT: sets %al1760; AVX512VL-NEXT: kmovd %eax, %k11761; AVX512VL-NEXT: vmovapd %xmm0, %xmm21762; AVX512VL-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1}1763; AVX512VL-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}1764; AVX512VL-NEXT: vmaxsd %xmm2, %xmm1, %xmm01765; AVX512VL-NEXT: vcmpunordsd %xmm1, %xmm1, %k11766; AVX512VL-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}1767; AVX512VL-NEXT: vzeroupper1768; AVX512VL-NEXT: retq1769 %1 = call double @llvm.vector.reduce.fmaximum.v16f64(<16 x double> %a0)1770 ret double %11771}1772 1773declare float @llvm.vector.reduce.fmaximum.v1f32(<1 x float>)1774declare float @llvm.vector.reduce.fmaximum.v2f32(<2 x float>)1775declare float @llvm.vector.reduce.fmaximum.v3f32(<3 x float>)1776declare float @llvm.vector.reduce.fmaximum.v4f32(<4 x float>)1777declare float @llvm.vector.reduce.fmaximum.v8f32(<8 x float>)1778declare float @llvm.vector.reduce.fmaximum.v16f32(<16 x float>)1779 1780declare double @llvm.vector.reduce.fmaximum.v2f64(<2 x double>)1781declare double @llvm.vector.reduce.fmaximum.v4f64(<4 x double>)1782declare double @llvm.vector.reduce.fmaximum.v8f64(<8 x double>)1783declare double @llvm.vector.reduce.fmaximum.v16f64(<16 x double>)1784;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:1785; SSE: {{.*}}1786