2572 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=SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=AVX,AVX512,AVX512DQ6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx10.2 | FileCheck %s --check-prefixes=AVX10_27; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=X868 9declare float @llvm.maximumnum.f32(float, float)10declare double @llvm.maximumnum.f64(double, double)11declare float @llvm.minimumnum.f32(float, float)12declare double @llvm.minimumnum.f64(double, double)13declare <2 x double> @llvm.minimumnum.v2f64(<2 x double>, <2 x double>)14declare <4 x float> @llvm.maximumnum.v4f32(<4 x float>, <4 x float>)15declare <4 x half> @llvm.maximumnum.v4f16(<4 x half>, <4 x half>)16declare <4 x bfloat> @llvm.maximumnum.v4bf16(<4 x bfloat>, <4 x bfloat>)17 18;19; fmaximumnum20;21 22define float @test_fmaximumnum(float %x, float %y) nounwind {23; SSE2-LABEL: test_fmaximumnum:24; SSE2: # %bb.0:25; SSE2-NEXT: movd %xmm0, %eax26; SSE2-NEXT: testl %eax, %eax27; SSE2-NEXT: js .LBB0_128; SSE2-NEXT: # %bb.2:29; SSE2-NEXT: movdqa %xmm0, %xmm230; SSE2-NEXT: jmp .LBB0_331; SSE2-NEXT: .LBB0_1:32; SSE2-NEXT: movdqa %xmm1, %xmm233; SSE2-NEXT: movdqa %xmm0, %xmm134; SSE2-NEXT: .LBB0_3:35; SSE2-NEXT: movdqa %xmm1, %xmm336; SSE2-NEXT: maxss %xmm2, %xmm337; SSE2-NEXT: movaps %xmm3, %xmm038; SSE2-NEXT: cmpunordss %xmm3, %xmm039; SSE2-NEXT: movaps %xmm0, %xmm240; SSE2-NEXT: andnps %xmm3, %xmm241; SSE2-NEXT: andps %xmm1, %xmm042; SSE2-NEXT: orps %xmm2, %xmm043; SSE2-NEXT: retq44;45; AVX1-LABEL: test_fmaximumnum:46; AVX1: # %bb.0:47; AVX1-NEXT: vmovd %xmm0, %eax48; AVX1-NEXT: testl %eax, %eax49; AVX1-NEXT: js .LBB0_150; AVX1-NEXT: # %bb.2:51; AVX1-NEXT: vmovdqa %xmm0, %xmm252; AVX1-NEXT: jmp .LBB0_353; AVX1-NEXT: .LBB0_1:54; AVX1-NEXT: vmovdqa %xmm1, %xmm255; AVX1-NEXT: vmovdqa %xmm0, %xmm156; AVX1-NEXT: .LBB0_3:57; AVX1-NEXT: vmaxss %xmm2, %xmm1, %xmm058; AVX1-NEXT: vcmpunordss %xmm0, %xmm0, %xmm259; AVX1-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm060; AVX1-NEXT: retq61;62; AVX512-LABEL: test_fmaximumnum:63; AVX512: # %bb.0:64; AVX512-NEXT: vmovd %xmm0, %eax65; AVX512-NEXT: testl %eax, %eax66; AVX512-NEXT: sets %al67; AVX512-NEXT: kmovw %eax, %k168; AVX512-NEXT: vmovdqa %xmm0, %xmm269; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}70; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}71; AVX512-NEXT: vmaxss %xmm2, %xmm1, %xmm072; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k173; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}74; AVX512-NEXT: retq75;76; AVX10_2-LABEL: test_fmaximumnum:77; AVX10_2: # %bb.0:78; AVX10_2-NEXT: vminmaxss $17, %xmm1, %xmm079; AVX10_2-NEXT: retq80;81; X86-LABEL: test_fmaximumnum:82; X86: # %bb.0:83; X86-NEXT: pushl %eax84; X86-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero85; X86-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero86; X86-NEXT: vmovd %xmm2, %eax87; X86-NEXT: testl %eax, %eax88; X86-NEXT: js .LBB0_189; X86-NEXT: # %bb.2:90; X86-NEXT: vmovdqa %xmm2, %xmm191; X86-NEXT: jmp .LBB0_392; X86-NEXT: .LBB0_1:93; X86-NEXT: vmovdqa %xmm0, %xmm194; X86-NEXT: vmovdqa %xmm2, %xmm095; X86-NEXT: .LBB0_3:96; X86-NEXT: vmaxss %xmm1, %xmm0, %xmm197; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm298; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm099; X86-NEXT: vmovss %xmm0, (%esp)100; X86-NEXT: flds (%esp)101; X86-NEXT: popl %eax102; X86-NEXT: retl103 %1 = tail call float @llvm.maximumnum.f32(float %x, float %y)104 ret float %1105}106 107define <4 x float> @test_fmaximumnum_scalarize(<4 x float> %x, <4 x float> %y) "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" {108; SSE2-LABEL: test_fmaximumnum_scalarize:109; SSE2: # %bb.0:110; SSE2-NEXT: maxps %xmm1, %xmm0111; SSE2-NEXT: retq112;113; AVX-LABEL: test_fmaximumnum_scalarize:114; AVX: # %bb.0:115; AVX-NEXT: vmaxps %xmm1, %xmm0, %xmm0116; AVX-NEXT: retq117;118; AVX10_2-LABEL: test_fmaximumnum_scalarize:119; AVX10_2: # %bb.0:120; AVX10_2-NEXT: vminmaxps $17, %xmm1, %xmm0, %xmm0121; AVX10_2-NEXT: retq122;123; X86-LABEL: test_fmaximumnum_scalarize:124; X86: # %bb.0:125; X86-NEXT: vmaxps %xmm1, %xmm0, %xmm0126; X86-NEXT: retl127 %r = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> %x, <4 x float> %y)128 ret <4 x float> %r129}130 131define float @test_fmaximumnum_nan0(float %x, float %y) {132; SSE2-LABEL: test_fmaximumnum_nan0:133; SSE2: # %bb.0:134; SSE2-NEXT: movaps %xmm1, %xmm0135; SSE2-NEXT: retq136;137; AVX-LABEL: test_fmaximumnum_nan0:138; AVX: # %bb.0:139; AVX-NEXT: vmovaps %xmm1, %xmm0140; AVX-NEXT: retq141;142; AVX10_2-LABEL: test_fmaximumnum_nan0:143; AVX10_2: # %bb.0:144; AVX10_2-NEXT: vmovaps %xmm1, %xmm0145; AVX10_2-NEXT: retq146;147; X86-LABEL: test_fmaximumnum_nan0:148; X86: # %bb.0:149; X86-NEXT: flds {{[0-9]+}}(%esp)150; X86-NEXT: retl151 %1 = tail call float @llvm.maximumnum.f32(float 0x7fff000000000000, float %y)152 ret float %1153}154 155define float @test_fmaximumnum_nan1(float %x, float %y) {156; SSE2-LABEL: test_fmaximumnum_nan1:157; SSE2: # %bb.0:158; SSE2-NEXT: retq159;160; AVX-LABEL: test_fmaximumnum_nan1:161; AVX: # %bb.0:162; AVX-NEXT: retq163;164; AVX10_2-LABEL: test_fmaximumnum_nan1:165; AVX10_2: # %bb.0:166; AVX10_2-NEXT: retq167;168; X86-LABEL: test_fmaximumnum_nan1:169; X86: # %bb.0:170; X86-NEXT: flds {{[0-9]+}}(%esp)171; X86-NEXT: retl172 %1 = tail call float @llvm.maximumnum.f32(float %x, float 0x7fff000000000000)173 ret float %1174}175 176define float @test_fmaximumnum_nnan(float %x, float %y) nounwind {177; SSE2-LABEL: test_fmaximumnum_nnan:178; SSE2: # %bb.0:179; SSE2-NEXT: movaps %xmm0, %xmm2180; SSE2-NEXT: addss %xmm1, %xmm2181; SSE2-NEXT: subss %xmm1, %xmm0182; SSE2-NEXT: movd %xmm2, %eax183; SSE2-NEXT: testl %eax, %eax184; SSE2-NEXT: js .LBB4_1185; SSE2-NEXT: # %bb.2:186; SSE2-NEXT: maxss %xmm2, %xmm0187; SSE2-NEXT: retq188; SSE2-NEXT: .LBB4_1:189; SSE2-NEXT: movaps %xmm0, %xmm1190; SSE2-NEXT: movaps %xmm2, %xmm0191; SSE2-NEXT: maxss %xmm1, %xmm0192; SSE2-NEXT: retq193;194; AVX1-LABEL: test_fmaximumnum_nnan:195; AVX1: # %bb.0:196; AVX1-NEXT: vaddss %xmm1, %xmm0, %xmm2197; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm0198; AVX1-NEXT: vmovd %xmm2, %eax199; AVX1-NEXT: testl %eax, %eax200; AVX1-NEXT: js .LBB4_1201; AVX1-NEXT: # %bb.2:202; AVX1-NEXT: vmaxss %xmm2, %xmm0, %xmm0203; AVX1-NEXT: retq204; AVX1-NEXT: .LBB4_1:205; AVX1-NEXT: vmovaps %xmm0, %xmm1206; AVX1-NEXT: vmaxss %xmm1, %xmm2, %xmm0207; AVX1-NEXT: retq208;209; AVX512F-LABEL: test_fmaximumnum_nnan:210; AVX512F: # %bb.0:211; AVX512F-NEXT: vaddss %xmm1, %xmm0, %xmm2212; AVX512F-NEXT: vsubss %xmm1, %xmm0, %xmm0213; AVX512F-NEXT: vmovd %xmm2, %eax214; AVX512F-NEXT: testl %eax, %eax215; AVX512F-NEXT: sets %al216; AVX512F-NEXT: kmovw %eax, %k1217; AVX512F-NEXT: vmovaps %xmm2, %xmm1218; AVX512F-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}219; AVX512F-NEXT: vmovss %xmm2, %xmm0, %xmm0 {%k1}220; AVX512F-NEXT: vmaxss %xmm1, %xmm0, %xmm0221; AVX512F-NEXT: retq222;223; AVX512DQ-LABEL: test_fmaximumnum_nnan:224; AVX512DQ: # %bb.0:225; AVX512DQ-NEXT: vaddss %xmm1, %xmm0, %xmm2226; AVX512DQ-NEXT: vsubss %xmm1, %xmm0, %xmm0227; AVX512DQ-NEXT: vfpclassss $3, %xmm0, %k0 # k0 = isQuietNaN(xmm0) | isPositiveZero(xmm0)228; AVX512DQ-NEXT: kmovw %k0, %k1229; AVX512DQ-NEXT: vmovaps %xmm2, %xmm1230; AVX512DQ-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}231; AVX512DQ-NEXT: vmovss %xmm2, %xmm0, %xmm0 {%k1}232; AVX512DQ-NEXT: vmaxss %xmm1, %xmm0, %xmm0233; AVX512DQ-NEXT: retq234;235; AVX10_2-LABEL: test_fmaximumnum_nnan:236; AVX10_2: # %bb.0:237; AVX10_2-NEXT: vaddss %xmm1, %xmm0, %xmm2238; AVX10_2-NEXT: vsubss %xmm1, %xmm0, %xmm0239; AVX10_2-NEXT: vminmaxss $17, %xmm0, %xmm2240; AVX10_2-NEXT: retq241;242; X86-LABEL: test_fmaximumnum_nnan:243; X86: # %bb.0:244; X86-NEXT: pushl %eax245; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero246; X86-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero247; X86-NEXT: vaddss %xmm0, %xmm2, %xmm1248; X86-NEXT: vsubss %xmm0, %xmm2, %xmm0249; X86-NEXT: vmovd %xmm1, %eax250; X86-NEXT: testl %eax, %eax251; X86-NEXT: js .LBB4_1252; X86-NEXT: # %bb.2:253; X86-NEXT: vmovaps %xmm1, %xmm2254; X86-NEXT: jmp .LBB4_3255; X86-NEXT: .LBB4_1:256; X86-NEXT: vmovaps %xmm0, %xmm2257; X86-NEXT: vmovaps %xmm1, %xmm0258; X86-NEXT: .LBB4_3:259; X86-NEXT: vmaxss %xmm2, %xmm0, %xmm0260; X86-NEXT: vmovss %xmm0, (%esp)261; X86-NEXT: flds (%esp)262; X86-NEXT: popl %eax263; X86-NEXT: retl264 %1 = fadd nnan float %x, %y265 %2 = fsub nnan float %x, %y266 %3 = tail call float @llvm.maximumnum.f32(float %1, float %2)267 ret float %3268}269 270define double @test_fmaximumnum_zero0(double %x, double %y) nounwind {271; SSE2-LABEL: test_fmaximumnum_zero0:272; SSE2: # %bb.0:273; SSE2-NEXT: movapd %xmm1, %xmm0274; SSE2-NEXT: xorpd %xmm1, %xmm1275; SSE2-NEXT: maxsd %xmm1, %xmm0276; SSE2-NEXT: retq277;278; AVX-LABEL: test_fmaximumnum_zero0:279; AVX: # %bb.0:280; AVX-NEXT: vxorpd %xmm0, %xmm0, %xmm0281; AVX-NEXT: vmaxsd %xmm0, %xmm1, %xmm0282; AVX-NEXT: retq283;284; AVX10_2-LABEL: test_fmaximumnum_zero0:285; AVX10_2: # %bb.0:286; AVX10_2-NEXT: vxorpd %xmm0, %xmm0, %xmm0287; AVX10_2-NEXT: vminmaxsd $17, %xmm0, %xmm1288; AVX10_2-NEXT: retq289;290; X86-LABEL: test_fmaximumnum_zero0:291; X86: # %bb.0:292; X86-NEXT: pushl %ebp293; X86-NEXT: movl %esp, %ebp294; X86-NEXT: andl $-8, %esp295; X86-NEXT: subl $8, %esp296; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero297; X86-NEXT: vxorpd %xmm1, %xmm1, %xmm1298; X86-NEXT: vmaxsd %xmm1, %xmm0, %xmm0299; X86-NEXT: vmovsd %xmm0, (%esp)300; X86-NEXT: fldl (%esp)301; X86-NEXT: movl %ebp, %esp302; X86-NEXT: popl %ebp303; X86-NEXT: retl304 %1 = tail call double @llvm.maximumnum.f64(double 0.0, double %y)305 ret double %1306}307 308define double @test_fmaximumnum_zero1(double %x, double %y) nounwind {309; SSE2-LABEL: test_fmaximumnum_zero1:310; SSE2: # %bb.0:311; SSE2-NEXT: xorpd %xmm1, %xmm1312; SSE2-NEXT: maxsd %xmm1, %xmm0313; SSE2-NEXT: retq314;315; AVX-LABEL: test_fmaximumnum_zero1:316; AVX: # %bb.0:317; AVX-NEXT: vxorpd %xmm1, %xmm1, %xmm1318; AVX-NEXT: vmaxsd %xmm1, %xmm0, %xmm0319; AVX-NEXT: retq320;321; AVX10_2-LABEL: test_fmaximumnum_zero1:322; AVX10_2: # %bb.0:323; AVX10_2-NEXT: vxorpd %xmm1, %xmm1, %xmm1324; AVX10_2-NEXT: vminmaxsd $17, %xmm1, %xmm0325; AVX10_2-NEXT: retq326;327; X86-LABEL: test_fmaximumnum_zero1:328; X86: # %bb.0:329; X86-NEXT: pushl %ebp330; X86-NEXT: movl %esp, %ebp331; X86-NEXT: andl $-8, %esp332; X86-NEXT: subl $8, %esp333; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero334; X86-NEXT: vxorpd %xmm1, %xmm1, %xmm1335; X86-NEXT: vmaxsd %xmm1, %xmm0, %xmm0336; X86-NEXT: vmovsd %xmm0, (%esp)337; X86-NEXT: fldl (%esp)338; X86-NEXT: movl %ebp, %esp339; X86-NEXT: popl %ebp340; X86-NEXT: retl341 %1 = tail call double @llvm.maximumnum.f64(double %x, double 0.0)342 ret double %1343}344 345define double @test_fmaximumnum_zero2(double %x, double %y) {346; SSE2-LABEL: test_fmaximumnum_zero2:347; SSE2: # %bb.0:348; SSE2-NEXT: xorps %xmm0, %xmm0349; SSE2-NEXT: retq350;351; AVX-LABEL: test_fmaximumnum_zero2:352; AVX: # %bb.0:353; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0354; AVX-NEXT: retq355;356; AVX10_2-LABEL: test_fmaximumnum_zero2:357; AVX10_2: # %bb.0:358; AVX10_2-NEXT: vxorps %xmm0, %xmm0, %xmm0359; AVX10_2-NEXT: retq360;361; X86-LABEL: test_fmaximumnum_zero2:362; X86: # %bb.0:363; X86-NEXT: fldz364; X86-NEXT: retl365 %1 = tail call double @llvm.maximumnum.f64(double 0.0, double -0.0)366 ret double %1367}368 369define float @test_fmaximumnum_nsz(float %x, float %y) "no-signed-zeros-fp-math"="true" nounwind {370; SSE2-LABEL: test_fmaximumnum_nsz:371; SSE2: # %bb.0:372; SSE2-NEXT: movaps %xmm0, %xmm2373; SSE2-NEXT: maxss %xmm1, %xmm2374; SSE2-NEXT: movaps %xmm2, %xmm1375; SSE2-NEXT: cmpunordss %xmm2, %xmm1376; SSE2-NEXT: andps %xmm1, %xmm0377; SSE2-NEXT: andnps %xmm2, %xmm1378; SSE2-NEXT: orps %xmm1, %xmm0379; SSE2-NEXT: retq380;381; AVX1-LABEL: test_fmaximumnum_nsz:382; AVX1: # %bb.0:383; AVX1-NEXT: vmaxss %xmm1, %xmm0, %xmm1384; AVX1-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2385; AVX1-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0386; AVX1-NEXT: retq387;388; AVX512-LABEL: test_fmaximumnum_nsz:389; AVX512: # %bb.0:390; AVX512-NEXT: vmaxss %xmm1, %xmm0, %xmm1391; AVX512-NEXT: vcmpunordss %xmm1, %xmm1, %k1392; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}393; AVX512-NEXT: vmovaps %xmm1, %xmm0394; AVX512-NEXT: retq395;396; AVX10_2-LABEL: test_fmaximumnum_nsz:397; AVX10_2: # %bb.0:398; AVX10_2-NEXT: vminmaxss $17, %xmm1, %xmm0399; AVX10_2-NEXT: retq400;401; X86-LABEL: test_fmaximumnum_nsz:402; X86: # %bb.0:403; X86-NEXT: pushl %eax404; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero405; X86-NEXT: vmaxss {{[0-9]+}}(%esp), %xmm0, %xmm1406; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2407; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0408; X86-NEXT: vmovss %xmm0, (%esp)409; X86-NEXT: flds (%esp)410; X86-NEXT: popl %eax411; X86-NEXT: retl412 %1 = tail call float @llvm.maximumnum.f32(float %x, float %y)413 ret float %1414}415 416define float @test_fmaximumnum_combine_cmps(float %x, float %y) nounwind {417; SSE2-LABEL: test_fmaximumnum_combine_cmps:418; SSE2: # %bb.0:419; SSE2-NEXT: divss %xmm0, %xmm1420; SSE2-NEXT: movd %xmm0, %eax421; SSE2-NEXT: testl %eax, %eax422; SSE2-NEXT: js .LBB9_1423; SSE2-NEXT: # %bb.2:424; SSE2-NEXT: movaps %xmm0, %xmm2425; SSE2-NEXT: jmp .LBB9_3426; SSE2-NEXT: .LBB9_1:427; SSE2-NEXT: movaps %xmm1, %xmm2428; SSE2-NEXT: movaps %xmm0, %xmm1429; SSE2-NEXT: .LBB9_3:430; SSE2-NEXT: movaps %xmm1, %xmm3431; SSE2-NEXT: maxss %xmm2, %xmm3432; SSE2-NEXT: movaps %xmm3, %xmm0433; SSE2-NEXT: cmpunordss %xmm3, %xmm0434; SSE2-NEXT: movaps %xmm0, %xmm2435; SSE2-NEXT: andnps %xmm3, %xmm2436; SSE2-NEXT: andps %xmm1, %xmm0437; SSE2-NEXT: orps %xmm2, %xmm0438; SSE2-NEXT: retq439;440; AVX1-LABEL: test_fmaximumnum_combine_cmps:441; AVX1: # %bb.0:442; AVX1-NEXT: vdivss %xmm0, %xmm1, %xmm1443; AVX1-NEXT: vmovd %xmm0, %eax444; AVX1-NEXT: testl %eax, %eax445; AVX1-NEXT: js .LBB9_1446; AVX1-NEXT: # %bb.2:447; AVX1-NEXT: vmovaps %xmm0, %xmm2448; AVX1-NEXT: jmp .LBB9_3449; AVX1-NEXT: .LBB9_1:450; AVX1-NEXT: vmovaps %xmm1, %xmm2451; AVX1-NEXT: vmovaps %xmm0, %xmm1452; AVX1-NEXT: .LBB9_3:453; AVX1-NEXT: vmaxss %xmm2, %xmm1, %xmm0454; AVX1-NEXT: vcmpunordss %xmm0, %xmm0, %xmm2455; AVX1-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm0456; AVX1-NEXT: retq457;458; AVX512F-LABEL: test_fmaximumnum_combine_cmps:459; AVX512F: # %bb.0:460; AVX512F-NEXT: vdivss %xmm0, %xmm1, %xmm1461; AVX512F-NEXT: vmovd %xmm0, %eax462; AVX512F-NEXT: testl %eax, %eax463; AVX512F-NEXT: sets %al464; AVX512F-NEXT: kmovw %eax, %k1465; AVX512F-NEXT: vmovaps %xmm0, %xmm2466; AVX512F-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}467; AVX512F-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}468; AVX512F-NEXT: vmaxss %xmm2, %xmm1, %xmm0469; AVX512F-NEXT: vcmpunordss %xmm0, %xmm0, %k1470; AVX512F-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}471; AVX512F-NEXT: retq472;473; AVX512DQ-LABEL: test_fmaximumnum_combine_cmps:474; AVX512DQ: # %bb.0:475; AVX512DQ-NEXT: vdivss %xmm0, %xmm1, %xmm1476; AVX512DQ-NEXT: vfpclassss $3, %xmm0, %k0 # k0 = isQuietNaN(xmm0) | isPositiveZero(xmm0)477; AVX512DQ-NEXT: kmovw %k0, %k1478; AVX512DQ-NEXT: vmovaps %xmm1, %xmm2479; AVX512DQ-NEXT: vmovss %xmm0, %xmm2, %xmm2 {%k1}480; AVX512DQ-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}481; AVX512DQ-NEXT: vmaxss %xmm2, %xmm0, %xmm0482; AVX512DQ-NEXT: retq483;484; AVX10_2-LABEL: test_fmaximumnum_combine_cmps:485; AVX10_2: # %bb.0:486; AVX10_2-NEXT: vdivss %xmm0, %xmm1, %xmm1487; AVX10_2-NEXT: vminmaxss $17, %xmm1, %xmm0488; AVX10_2-NEXT: retq489;490; X86-LABEL: test_fmaximumnum_combine_cmps:491; X86: # %bb.0:492; X86-NEXT: pushl %eax493; X86-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero494; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero495; X86-NEXT: vdivss %xmm1, %xmm0, %xmm0496; X86-NEXT: vmovd %xmm1, %eax497; X86-NEXT: testl %eax, %eax498; X86-NEXT: js .LBB9_1499; X86-NEXT: # %bb.2:500; X86-NEXT: vmovaps %xmm1, %xmm2501; X86-NEXT: jmp .LBB9_3502; X86-NEXT: .LBB9_1:503; X86-NEXT: vmovaps %xmm0, %xmm2504; X86-NEXT: vmovaps %xmm1, %xmm0505; X86-NEXT: .LBB9_3:506; X86-NEXT: vmaxss %xmm2, %xmm0, %xmm1507; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2508; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0509; X86-NEXT: vmovss %xmm0, (%esp)510; X86-NEXT: flds (%esp)511; X86-NEXT: popl %eax512; X86-NEXT: retl513 %1 = fdiv nnan float %y, %x514 %2 = tail call float @llvm.maximumnum.f32(float %x, float %1)515 ret float %2516}517 518;519; fminimumnum520;521 522define float @test_fminimumnum(float %x, float %y) nounwind {523; SSE2-LABEL: test_fminimumnum:524; SSE2: # %bb.0:525; SSE2-NEXT: movd %xmm0, %eax526; SSE2-NEXT: testl %eax, %eax527; SSE2-NEXT: js .LBB10_1528; SSE2-NEXT: # %bb.2:529; SSE2-NEXT: movdqa %xmm1, %xmm2530; SSE2-NEXT: jmp .LBB10_3531; SSE2-NEXT: .LBB10_1:532; SSE2-NEXT: movdqa %xmm0, %xmm2533; SSE2-NEXT: movdqa %xmm1, %xmm0534; SSE2-NEXT: .LBB10_3:535; SSE2-NEXT: movdqa %xmm0, %xmm3536; SSE2-NEXT: minss %xmm2, %xmm3537; SSE2-NEXT: movaps %xmm3, %xmm1538; SSE2-NEXT: cmpunordss %xmm3, %xmm1539; SSE2-NEXT: movaps %xmm1, %xmm2540; SSE2-NEXT: andnps %xmm3, %xmm2541; SSE2-NEXT: andps %xmm0, %xmm1542; SSE2-NEXT: orps %xmm2, %xmm1543; SSE2-NEXT: movaps %xmm1, %xmm0544; SSE2-NEXT: retq545;546; AVX1-LABEL: test_fminimumnum:547; AVX1: # %bb.0:548; AVX1-NEXT: vmovd %xmm0, %eax549; AVX1-NEXT: testl %eax, %eax550; AVX1-NEXT: js .LBB10_1551; AVX1-NEXT: # %bb.2:552; AVX1-NEXT: vmovdqa %xmm1, %xmm2553; AVX1-NEXT: jmp .LBB10_3554; AVX1-NEXT: .LBB10_1:555; AVX1-NEXT: vmovdqa %xmm0, %xmm2556; AVX1-NEXT: vmovdqa %xmm1, %xmm0557; AVX1-NEXT: .LBB10_3:558; AVX1-NEXT: vminss %xmm2, %xmm0, %xmm1559; AVX1-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2560; AVX1-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0561; AVX1-NEXT: retq562;563; AVX512-LABEL: test_fminimumnum:564; AVX512: # %bb.0:565; AVX512-NEXT: vmovd %xmm0, %eax566; AVX512-NEXT: testl %eax, %eax567; AVX512-NEXT: sets %al568; AVX512-NEXT: kmovw %eax, %k1569; AVX512-NEXT: vmovaps %xmm1, %xmm2570; AVX512-NEXT: vmovss %xmm0, %xmm2, %xmm2 {%k1}571; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}572; AVX512-NEXT: vminss %xmm2, %xmm0, %xmm1573; AVX512-NEXT: vcmpunordss %xmm1, %xmm1, %k1574; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}575; AVX512-NEXT: vmovaps %xmm1, %xmm0576; AVX512-NEXT: retq577;578; AVX10_2-LABEL: test_fminimumnum:579; AVX10_2: # %bb.0:580; AVX10_2-NEXT: vminmaxss $16, %xmm1, %xmm0581; AVX10_2-NEXT: retq582;583; X86-LABEL: test_fminimumnum:584; X86: # %bb.0:585; X86-NEXT: pushl %eax586; X86-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero587; X86-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero588; X86-NEXT: vmovd %xmm0, %eax589; X86-NEXT: testl %eax, %eax590; X86-NEXT: js .LBB10_1591; X86-NEXT: # %bb.2:592; X86-NEXT: vmovdqa %xmm1, %xmm2593; X86-NEXT: jmp .LBB10_3594; X86-NEXT: .LBB10_1:595; X86-NEXT: vmovdqa %xmm0, %xmm2596; X86-NEXT: vmovdqa %xmm1, %xmm0597; X86-NEXT: .LBB10_3:598; X86-NEXT: vminss %xmm2, %xmm0, %xmm1599; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2600; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0601; X86-NEXT: vmovss %xmm0, (%esp)602; X86-NEXT: flds (%esp)603; X86-NEXT: popl %eax604; X86-NEXT: retl605 %1 = tail call float @llvm.minimumnum.f32(float %x, float %y)606 ret float %1607}608 609define <2 x double> @test_fminimumnum_scalarize(<2 x double> %x, <2 x double> %y) "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" {610; SSE2-LABEL: test_fminimumnum_scalarize:611; SSE2: # %bb.0:612; SSE2-NEXT: minpd %xmm1, %xmm0613; SSE2-NEXT: retq614;615; AVX-LABEL: test_fminimumnum_scalarize:616; AVX: # %bb.0:617; AVX-NEXT: vminpd %xmm1, %xmm0, %xmm0618; AVX-NEXT: retq619;620; AVX10_2-LABEL: test_fminimumnum_scalarize:621; AVX10_2: # %bb.0:622; AVX10_2-NEXT: vminmaxpd $16, %xmm1, %xmm0, %xmm0623; AVX10_2-NEXT: retq624;625; X86-LABEL: test_fminimumnum_scalarize:626; X86: # %bb.0:627; X86-NEXT: vminpd %xmm1, %xmm0, %xmm0628; X86-NEXT: retl629 %r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %x, <2 x double> %y)630 ret <2 x double> %r631}632 633define float @test_fminimumnum_nan0(float %x, float %y) {634; SSE2-LABEL: test_fminimumnum_nan0:635; SSE2: # %bb.0:636; SSE2-NEXT: movaps %xmm1, %xmm0637; SSE2-NEXT: retq638;639; AVX-LABEL: test_fminimumnum_nan0:640; AVX: # %bb.0:641; AVX-NEXT: vmovaps %xmm1, %xmm0642; AVX-NEXT: retq643;644; AVX10_2-LABEL: test_fminimumnum_nan0:645; AVX10_2: # %bb.0:646; AVX10_2-NEXT: vmovaps %xmm1, %xmm0647; AVX10_2-NEXT: retq648;649; X86-LABEL: test_fminimumnum_nan0:650; X86: # %bb.0:651; X86-NEXT: flds {{[0-9]+}}(%esp)652; X86-NEXT: retl653 %1 = tail call float @llvm.minimumnum.f32(float 0x7fff000000000000, float %y)654 ret float %1655}656 657define float @test_fminimumnum_nan1(float %x, float %y) {658; SSE2-LABEL: test_fminimumnum_nan1:659; SSE2: # %bb.0:660; SSE2-NEXT: retq661;662; AVX-LABEL: test_fminimumnum_nan1:663; AVX: # %bb.0:664; AVX-NEXT: retq665;666; AVX10_2-LABEL: test_fminimumnum_nan1:667; AVX10_2: # %bb.0:668; AVX10_2-NEXT: retq669;670; X86-LABEL: test_fminimumnum_nan1:671; X86: # %bb.0:672; X86-NEXT: flds {{[0-9]+}}(%esp)673; X86-NEXT: retl674 %1 = tail call float @llvm.minimumnum.f32(float %x, float 0x7fff000000000000)675 ret float %1676}677 678define double @test_fminimumnum_nnan(double %x, double %y) "no-nans-fp-math"="true" nounwind {679; SSE2-LABEL: test_fminimumnum_nnan:680; SSE2: # %bb.0:681; SSE2-NEXT: movq %xmm0, %rax682; SSE2-NEXT: testq %rax, %rax683; SSE2-NEXT: js .LBB14_1684; SSE2-NEXT: # %bb.2:685; SSE2-NEXT: minsd %xmm1, %xmm0686; SSE2-NEXT: retq687; SSE2-NEXT: .LBB14_1:688; SSE2-NEXT: movdqa %xmm0, %xmm2689; SSE2-NEXT: movapd %xmm1, %xmm0690; SSE2-NEXT: minsd %xmm2, %xmm0691; SSE2-NEXT: retq692;693; AVX1-LABEL: test_fminimumnum_nnan:694; AVX1: # %bb.0:695; AVX1-NEXT: vmovq %xmm0, %rax696; AVX1-NEXT: testq %rax, %rax697; AVX1-NEXT: js .LBB14_1698; AVX1-NEXT: # %bb.2:699; AVX1-NEXT: vminsd %xmm1, %xmm0, %xmm0700; AVX1-NEXT: retq701; AVX1-NEXT: .LBB14_1:702; AVX1-NEXT: vmovdqa %xmm0, %xmm2703; AVX1-NEXT: vminsd %xmm2, %xmm1, %xmm0704; AVX1-NEXT: retq705;706; AVX512F-LABEL: test_fminimumnum_nnan:707; AVX512F: # %bb.0:708; AVX512F-NEXT: vmovq %xmm0, %rax709; AVX512F-NEXT: testq %rax, %rax710; AVX512F-NEXT: sets %al711; AVX512F-NEXT: kmovw %eax, %k1712; AVX512F-NEXT: vmovapd %xmm1, %xmm2713; AVX512F-NEXT: vmovsd %xmm0, %xmm2, %xmm2 {%k1}714; AVX512F-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1}715; AVX512F-NEXT: vminsd %xmm2, %xmm0, %xmm0716; AVX512F-NEXT: retq717;718; AVX512DQ-LABEL: test_fminimumnum_nnan:719; AVX512DQ: # %bb.0:720; AVX512DQ-NEXT: vfpclasssd $5, %xmm1, %k0 # k0 = isQuietNaN(xmm1) | isNegativeZero(xmm1)721; AVX512DQ-NEXT: kmovw %k0, %k1722; AVX512DQ-NEXT: vmovapd %xmm0, %xmm2723; AVX512DQ-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1}724; AVX512DQ-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}725; AVX512DQ-NEXT: vminsd %xmm2, %xmm1, %xmm0726; AVX512DQ-NEXT: retq727;728; AVX10_2-LABEL: test_fminimumnum_nnan:729; AVX10_2: # %bb.0:730; AVX10_2-NEXT: vminmaxsd $16, %xmm1, %xmm0731; AVX10_2-NEXT: retq732;733; X86-LABEL: test_fminimumnum_nnan:734; X86: # %bb.0:735; X86-NEXT: pushl %ebp736; X86-NEXT: movl %esp, %ebp737; X86-NEXT: andl $-8, %esp738; X86-NEXT: subl $8, %esp739; X86-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero740; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero741; X86-NEXT: vextractps $1, %xmm0, %eax742; X86-NEXT: testl %eax, %eax743; X86-NEXT: js .LBB14_1744; X86-NEXT: # %bb.2:745; X86-NEXT: vmovapd %xmm1, %xmm2746; X86-NEXT: jmp .LBB14_3747; X86-NEXT: .LBB14_1:748; X86-NEXT: vmovapd %xmm0, %xmm2749; X86-NEXT: vmovapd %xmm1, %xmm0750; X86-NEXT: .LBB14_3:751; X86-NEXT: vminsd %xmm2, %xmm0, %xmm0752; X86-NEXT: vmovsd %xmm0, (%esp)753; X86-NEXT: fldl (%esp)754; X86-NEXT: movl %ebp, %esp755; X86-NEXT: popl %ebp756; X86-NEXT: retl757 %1 = tail call double @llvm.minimumnum.f64(double %x, double %y)758 ret double %1759}760 761define double @test_fminimumnum_zero0(double %x, double %y) nounwind {762; SSE2-LABEL: test_fminimumnum_zero0:763; SSE2: # %bb.0:764; SSE2-NEXT: movapd %xmm1, %xmm0765; SSE2-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0766; SSE2-NEXT: retq767;768; AVX-LABEL: test_fminimumnum_zero0:769; AVX: # %bb.0:770; AVX-NEXT: vminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0771; AVX-NEXT: retq772;773; AVX10_2-LABEL: test_fminimumnum_zero0:774; AVX10_2: # %bb.0:775; AVX10_2-NEXT: vminmaxsd $16, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1776; AVX10_2-NEXT: retq777;778; X86-LABEL: test_fminimumnum_zero0:779; X86: # %bb.0:780; X86-NEXT: pushl %ebp781; X86-NEXT: movl %esp, %ebp782; X86-NEXT: andl $-8, %esp783; X86-NEXT: subl $8, %esp784; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero785; X86-NEXT: vminsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0786; X86-NEXT: vmovsd %xmm0, (%esp)787; X86-NEXT: fldl (%esp)788; X86-NEXT: movl %ebp, %esp789; X86-NEXT: popl %ebp790; X86-NEXT: retl791 %1 = tail call double @llvm.minimumnum.f64(double -0.0, double %y)792 ret double %1793}794 795define double @test_fminimumnum_zero1(double %x, double %y) nounwind {796; SSE2-LABEL: test_fminimumnum_zero1:797; SSE2: # %bb.0:798; SSE2-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0799; SSE2-NEXT: retq800;801; AVX-LABEL: test_fminimumnum_zero1:802; AVX: # %bb.0:803; AVX-NEXT: vminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0804; AVX-NEXT: retq805;806; AVX10_2-LABEL: test_fminimumnum_zero1:807; AVX10_2: # %bb.0:808; AVX10_2-NEXT: vminmaxsd $16, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0809; AVX10_2-NEXT: retq810;811; X86-LABEL: test_fminimumnum_zero1:812; X86: # %bb.0:813; X86-NEXT: pushl %ebp814; X86-NEXT: movl %esp, %ebp815; X86-NEXT: andl $-8, %esp816; X86-NEXT: subl $8, %esp817; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero818; X86-NEXT: vminsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0819; X86-NEXT: vmovsd %xmm0, (%esp)820; X86-NEXT: fldl (%esp)821; X86-NEXT: movl %ebp, %esp822; X86-NEXT: popl %ebp823; X86-NEXT: retl824 %1 = tail call double @llvm.minimumnum.f64(double %x, double -0.0)825 ret double %1826}827 828define double @test_fminimumnum_zero2(double %x, double %y) {829; SSE2-LABEL: test_fminimumnum_zero2:830; SSE2: # %bb.0:831; SSE2-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]832; SSE2-NEXT: retq833;834; AVX-LABEL: test_fminimumnum_zero2:835; AVX: # %bb.0:836; AVX-NEXT: vmovsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]837; AVX-NEXT: retq838;839; AVX10_2-LABEL: test_fminimumnum_zero2:840; AVX10_2: # %bb.0:841; AVX10_2-NEXT: vmovsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]842; AVX10_2-NEXT: retq843;844; X86-LABEL: test_fminimumnum_zero2:845; X86: # %bb.0:846; X86-NEXT: fldz847; X86-NEXT: fchs848; X86-NEXT: retl849 %1 = tail call double @llvm.minimumnum.f64(double -0.0, double 0.0)850 ret double %1851}852 853define float @test_fminimumnum_nsz(float %x, float %y) nounwind {854; SSE2-LABEL: test_fminimumnum_nsz:855; SSE2: # %bb.0:856; SSE2-NEXT: movaps %xmm0, %xmm2857; SSE2-NEXT: minss %xmm1, %xmm2858; SSE2-NEXT: movaps %xmm2, %xmm1859; SSE2-NEXT: cmpunordss %xmm2, %xmm1860; SSE2-NEXT: andps %xmm1, %xmm0861; SSE2-NEXT: andnps %xmm2, %xmm1862; SSE2-NEXT: orps %xmm1, %xmm0863; SSE2-NEXT: retq864;865; AVX1-LABEL: test_fminimumnum_nsz:866; AVX1: # %bb.0:867; AVX1-NEXT: vminss %xmm1, %xmm0, %xmm1868; AVX1-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2869; AVX1-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0870; AVX1-NEXT: retq871;872; AVX512-LABEL: test_fminimumnum_nsz:873; AVX512: # %bb.0:874; AVX512-NEXT: vminss %xmm1, %xmm0, %xmm1875; AVX512-NEXT: vcmpunordss %xmm1, %xmm1, %k1876; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}877; AVX512-NEXT: vmovaps %xmm1, %xmm0878; AVX512-NEXT: retq879;880; AVX10_2-LABEL: test_fminimumnum_nsz:881; AVX10_2: # %bb.0:882; AVX10_2-NEXT: vminmaxss $16, %xmm1, %xmm0883; AVX10_2-NEXT: retq884;885; X86-LABEL: test_fminimumnum_nsz:886; X86: # %bb.0:887; X86-NEXT: pushl %eax888; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero889; X86-NEXT: vminss {{[0-9]+}}(%esp), %xmm0, %xmm1890; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2891; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0892; X86-NEXT: vmovss %xmm0, (%esp)893; X86-NEXT: flds (%esp)894; X86-NEXT: popl %eax895; X86-NEXT: retl896 %1 = tail call nsz float @llvm.minimumnum.f32(float %x, float %y)897 ret float %1898}899 900define float @test_fminimumnum_combine_cmps(float %x, float %y) nounwind {901; SSE2-LABEL: test_fminimumnum_combine_cmps:902; SSE2: # %bb.0:903; SSE2-NEXT: divss %xmm0, %xmm1904; SSE2-NEXT: movd %xmm0, %eax905; SSE2-NEXT: testl %eax, %eax906; SSE2-NEXT: js .LBB19_1907; SSE2-NEXT: # %bb.2:908; SSE2-NEXT: movaps %xmm1, %xmm2909; SSE2-NEXT: jmp .LBB19_3910; SSE2-NEXT: .LBB19_1:911; SSE2-NEXT: movaps %xmm0, %xmm2912; SSE2-NEXT: movaps %xmm1, %xmm0913; SSE2-NEXT: .LBB19_3:914; SSE2-NEXT: movaps %xmm0, %xmm3915; SSE2-NEXT: minss %xmm2, %xmm3916; SSE2-NEXT: movaps %xmm3, %xmm1917; SSE2-NEXT: cmpunordss %xmm3, %xmm1918; SSE2-NEXT: movaps %xmm1, %xmm2919; SSE2-NEXT: andnps %xmm3, %xmm2920; SSE2-NEXT: andps %xmm0, %xmm1921; SSE2-NEXT: orps %xmm2, %xmm1922; SSE2-NEXT: movaps %xmm1, %xmm0923; SSE2-NEXT: retq924;925; AVX1-LABEL: test_fminimumnum_combine_cmps:926; AVX1: # %bb.0:927; AVX1-NEXT: vdivss %xmm0, %xmm1, %xmm2928; AVX1-NEXT: vmovd %xmm0, %eax929; AVX1-NEXT: testl %eax, %eax930; AVX1-NEXT: js .LBB19_1931; AVX1-NEXT: # %bb.2:932; AVX1-NEXT: vmovaps %xmm2, %xmm1933; AVX1-NEXT: jmp .LBB19_3934; AVX1-NEXT: .LBB19_1:935; AVX1-NEXT: vmovaps %xmm0, %xmm1936; AVX1-NEXT: vmovaps %xmm2, %xmm0937; AVX1-NEXT: .LBB19_3:938; AVX1-NEXT: vminss %xmm1, %xmm0, %xmm1939; AVX1-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2940; AVX1-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0941; AVX1-NEXT: retq942;943; AVX512F-LABEL: test_fminimumnum_combine_cmps:944; AVX512F: # %bb.0:945; AVX512F-NEXT: vdivss %xmm0, %xmm1, %xmm1946; AVX512F-NEXT: vmovd %xmm0, %eax947; AVX512F-NEXT: testl %eax, %eax948; AVX512F-NEXT: sets %al949; AVX512F-NEXT: kmovw %eax, %k1950; AVX512F-NEXT: vmovaps %xmm1, %xmm2951; AVX512F-NEXT: vmovss %xmm0, %xmm2, %xmm2 {%k1}952; AVX512F-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}953; AVX512F-NEXT: vminss %xmm2, %xmm0, %xmm1954; AVX512F-NEXT: vcmpunordss %xmm1, %xmm1, %k1955; AVX512F-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}956; AVX512F-NEXT: vmovaps %xmm1, %xmm0957; AVX512F-NEXT: retq958;959; AVX512DQ-LABEL: test_fminimumnum_combine_cmps:960; AVX512DQ: # %bb.0:961; AVX512DQ-NEXT: vdivss %xmm0, %xmm1, %xmm1962; AVX512DQ-NEXT: vfpclassss $5, %xmm0, %k0 # k0 = isQuietNaN(xmm0) | isNegativeZero(xmm0)963; AVX512DQ-NEXT: kmovw %k0, %k1964; AVX512DQ-NEXT: vmovaps %xmm1, %xmm2965; AVX512DQ-NEXT: vmovss %xmm0, %xmm2, %xmm2 {%k1}966; AVX512DQ-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}967; AVX512DQ-NEXT: vminss %xmm2, %xmm0, %xmm0968; AVX512DQ-NEXT: retq969;970; AVX10_2-LABEL: test_fminimumnum_combine_cmps:971; AVX10_2: # %bb.0:972; AVX10_2-NEXT: vdivss %xmm0, %xmm1, %xmm1973; AVX10_2-NEXT: vminmaxss $16, %xmm1, %xmm0974; AVX10_2-NEXT: retq975;976; X86-LABEL: test_fminimumnum_combine_cmps:977; X86: # %bb.0:978; X86-NEXT: pushl %eax979; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero980; X86-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero981; X86-NEXT: vdivss %xmm0, %xmm1, %xmm2982; X86-NEXT: vmovd %xmm0, %eax983; X86-NEXT: testl %eax, %eax984; X86-NEXT: js .LBB19_1985; X86-NEXT: # %bb.2:986; X86-NEXT: vmovaps %xmm2, %xmm1987; X86-NEXT: jmp .LBB19_3988; X86-NEXT: .LBB19_1:989; X86-NEXT: vmovaps %xmm0, %xmm1990; X86-NEXT: vmovaps %xmm2, %xmm0991; X86-NEXT: .LBB19_3:992; X86-NEXT: vminss %xmm1, %xmm0, %xmm1993; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2994; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0995; X86-NEXT: vmovss %xmm0, (%esp)996; X86-NEXT: flds (%esp)997; X86-NEXT: popl %eax998; X86-NEXT: retl999 %1 = fdiv nnan float %y, %x1000 %2 = tail call float @llvm.minimumnum.f32(float %x, float %1)1001 ret float %21002}1003 1004define <2 x double> @test_fminimumnum_vector(<2 x double> %x, <2 x double> %y) {1005; SSE2-LABEL: test_fminimumnum_vector:1006; SSE2: # %bb.0:1007; SSE2-NEXT: movaps %xmm0, %xmm21008; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1],xmm0[3,3]1009; SSE2-NEXT: pxor %xmm3, %xmm31010; SSE2-NEXT: pcmpgtd %xmm2, %xmm31011; SSE2-NEXT: movdqa %xmm3, %xmm21012; SSE2-NEXT: pandn %xmm1, %xmm21013; SSE2-NEXT: movdqa %xmm3, %xmm41014; SSE2-NEXT: pandn %xmm0, %xmm41015; SSE2-NEXT: pand %xmm3, %xmm01016; SSE2-NEXT: por %xmm2, %xmm01017; SSE2-NEXT: pand %xmm1, %xmm31018; SSE2-NEXT: por %xmm4, %xmm31019; SSE2-NEXT: movdqa %xmm3, %xmm11020; SSE2-NEXT: minpd %xmm0, %xmm11021; SSE2-NEXT: movapd %xmm1, %xmm01022; SSE2-NEXT: cmpunordpd %xmm1, %xmm01023; SSE2-NEXT: pand %xmm0, %xmm31024; SSE2-NEXT: andnpd %xmm1, %xmm01025; SSE2-NEXT: orpd %xmm3, %xmm01026; SSE2-NEXT: retq1027;1028; AVX-LABEL: test_fminimumnum_vector:1029; AVX: # %bb.0:1030; AVX-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm21031; AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm01032; AVX-NEXT: vminpd %xmm2, %xmm0, %xmm11033; AVX-NEXT: vcmpunordpd %xmm1, %xmm1, %xmm21034; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01035; AVX-NEXT: retq1036;1037; AVX10_2-LABEL: test_fminimumnum_vector:1038; AVX10_2: # %bb.0:1039; AVX10_2-NEXT: vminmaxpd $16, %xmm1, %xmm0, %xmm01040; AVX10_2-NEXT: retq1041;1042; X86-LABEL: test_fminimumnum_vector:1043; X86: # %bb.0:1044; X86-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm21045; X86-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm01046; X86-NEXT: vminpd %xmm2, %xmm0, %xmm11047; X86-NEXT: vcmpunordpd %xmm1, %xmm1, %xmm21048; X86-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01049; X86-NEXT: retl1050 %r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %x, <2 x double> %y)1051 ret <2 x double> %r1052}1053 1054define <4 x float> @test_fmaximumnum_vector(<4 x float> %x, <4 x float> %y) "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" {1055; SSE2-LABEL: test_fmaximumnum_vector:1056; SSE2: # %bb.0:1057; SSE2-NEXT: maxps %xmm1, %xmm01058; SSE2-NEXT: retq1059;1060; AVX-LABEL: test_fmaximumnum_vector:1061; AVX: # %bb.0:1062; AVX-NEXT: vmaxps %xmm1, %xmm0, %xmm01063; AVX-NEXT: retq1064;1065; AVX10_2-LABEL: test_fmaximumnum_vector:1066; AVX10_2: # %bb.0:1067; AVX10_2-NEXT: vminmaxps $17, %xmm1, %xmm0, %xmm01068; AVX10_2-NEXT: retq1069;1070; X86-LABEL: test_fmaximumnum_vector:1071; X86: # %bb.0:1072; X86-NEXT: vmaxps %xmm1, %xmm0, %xmm01073; X86-NEXT: retl1074 %r = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> %x, <4 x float> %y)1075 ret <4 x float> %r1076}1077 1078define <2 x double> @test_fminimumnum_vector_zero(<2 x double> %x) {1079; SSE2-LABEL: test_fminimumnum_vector_zero:1080; SSE2: # %bb.0:1081; SSE2-NEXT: xorpd %xmm1, %xmm11082; SSE2-NEXT: minpd %xmm0, %xmm11083; SSE2-NEXT: movapd %xmm1, %xmm01084; SSE2-NEXT: cmpunordpd %xmm1, %xmm01085; SSE2-NEXT: andnpd %xmm1, %xmm01086; SSE2-NEXT: retq1087;1088; AVX-LABEL: test_fminimumnum_vector_zero:1089; AVX: # %bb.0:1090; AVX-NEXT: vxorpd %xmm1, %xmm1, %xmm11091; AVX-NEXT: vminpd %xmm0, %xmm1, %xmm01092; AVX-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm11093; AVX-NEXT: vandnpd %xmm0, %xmm1, %xmm01094; AVX-NEXT: retq1095;1096; AVX10_2-LABEL: test_fminimumnum_vector_zero:1097; AVX10_2: # %bb.0:1098; AVX10_2-NEXT: vxorpd %xmm1, %xmm1, %xmm11099; AVX10_2-NEXT: vminmaxpd $16, %xmm1, %xmm0, %xmm01100; AVX10_2-NEXT: retq1101;1102; X86-LABEL: test_fminimumnum_vector_zero:1103; X86: # %bb.0:1104; X86-NEXT: vxorpd %xmm1, %xmm1, %xmm11105; X86-NEXT: vminpd %xmm0, %xmm1, %xmm01106; X86-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm11107; X86-NEXT: vandnpd %xmm0, %xmm1, %xmm01108; X86-NEXT: retl1109 %r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %x, <2 x double> <double 0., double 0.>)1110 ret <2 x double> %r1111}1112 1113define <4 x float> @test_fmaximumnum_vector_signed_zero(<4 x float> %x) {1114; SSE2-LABEL: test_fmaximumnum_vector_signed_zero:1115; SSE2: # %bb.0:1116; SSE2-NEXT: movaps {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]1117; SSE2-NEXT: movaps %xmm1, %xmm21118; SSE2-NEXT: maxps %xmm0, %xmm21119; SSE2-NEXT: movaps %xmm2, %xmm01120; SSE2-NEXT: cmpunordps %xmm2, %xmm01121; SSE2-NEXT: andps %xmm0, %xmm11122; SSE2-NEXT: andnps %xmm2, %xmm01123; SSE2-NEXT: orps %xmm1, %xmm01124; SSE2-NEXT: retq1125;1126; AVX-LABEL: test_fmaximumnum_vector_signed_zero:1127; AVX: # %bb.0:1128; AVX-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]1129; AVX-NEXT: vmaxps %xmm0, %xmm1, %xmm01130; AVX-NEXT: vcmpunordps %xmm0, %xmm0, %xmm21131; AVX-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm01132; AVX-NEXT: retq1133;1134; AVX10_2-LABEL: test_fmaximumnum_vector_signed_zero:1135; AVX10_2: # %bb.0:1136; AVX10_2-NEXT: vminmaxps $17, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm01137; AVX10_2-NEXT: retq1138;1139; X86-LABEL: test_fmaximumnum_vector_signed_zero:1140; X86: # %bb.0:1141; X86-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]1142; X86-NEXT: vmaxps %xmm0, %xmm1, %xmm01143; X86-NEXT: vcmpunordps %xmm0, %xmm0, %xmm21144; X86-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm01145; X86-NEXT: retl1146 %r = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> %x, <4 x float> <float -0., float -0., float -0., float -0.>)1147 ret <4 x float> %r1148}1149 1150define <2 x double> @test_fminimumnum_vector_partially_zero(<2 x double> %x) {1151; SSE2-LABEL: test_fminimumnum_vector_partially_zero:1152; SSE2: # %bb.0:1153; SSE2-NEXT: xorpd %xmm1, %xmm11154; SSE2-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]1155; SSE2-NEXT: movapd %xmm1, %xmm21156; SSE2-NEXT: minpd %xmm0, %xmm21157; SSE2-NEXT: movapd %xmm2, %xmm01158; SSE2-NEXT: cmpunordpd %xmm2, %xmm01159; SSE2-NEXT: andpd %xmm0, %xmm11160; SSE2-NEXT: andnpd %xmm2, %xmm01161; SSE2-NEXT: orpd %xmm1, %xmm01162; SSE2-NEXT: retq1163;1164; AVX-LABEL: test_fminimumnum_vector_partially_zero:1165; AVX: # %bb.0:1166; AVX-NEXT: vxorpd %xmm1, %xmm1, %xmm11167; AVX-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]1168; AVX-NEXT: vminpd %xmm0, %xmm1, %xmm01169; AVX-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm21170; AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm01171; AVX-NEXT: retq1172;1173; AVX10_2-LABEL: test_fminimumnum_vector_partially_zero:1174; AVX10_2: # %bb.0:1175; AVX10_2-NEXT: vxorpd %xmm1, %xmm1, %xmm11176; AVX10_2-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]1177; AVX10_2-NEXT: vminmaxpd $16, %xmm1, %xmm0, %xmm01178; AVX10_2-NEXT: retq1179;1180; X86-LABEL: test_fminimumnum_vector_partially_zero:1181; X86: # %bb.0:1182; X86-NEXT: vxorpd %xmm1, %xmm1, %xmm11183; X86-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]1184; X86-NEXT: vminpd %xmm0, %xmm1, %xmm01185; X86-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm21186; X86-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm01187; X86-NEXT: retl1188 %r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %x, <2 x double> <double 0., double 5.>)1189 ret <2 x double> %r1190}1191 1192define <2 x double> @test_fminimumnum_vector_different_zeros(<2 x double> %x) {1193; SSE2-LABEL: test_fminimumnum_vector_different_zeros:1194; SSE2: # %bb.0:1195; SSE2-NEXT: movaps %xmm0, %xmm11196; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[3,3]1197; SSE2-NEXT: xorps %xmm2, %xmm21198; SSE2-NEXT: pxor %xmm3, %xmm31199; SSE2-NEXT: pcmpgtd %xmm1, %xmm31200; SSE2-NEXT: movhps {{.*#+}} xmm2 = xmm2[0,1],mem[0,1]1201; SSE2-NEXT: movdqa %xmm3, %xmm11202; SSE2-NEXT: pandn %xmm2, %xmm11203; SSE2-NEXT: movaps %xmm0, %xmm41204; SSE2-NEXT: andps %xmm3, %xmm41205; SSE2-NEXT: orps %xmm1, %xmm41206; SSE2-NEXT: pand %xmm0, %xmm21207; SSE2-NEXT: pandn %xmm0, %xmm31208; SSE2-NEXT: por %xmm2, %xmm31209; SSE2-NEXT: movdqa %xmm3, %xmm11210; SSE2-NEXT: minpd %xmm4, %xmm11211; SSE2-NEXT: movapd %xmm1, %xmm01212; SSE2-NEXT: cmpunordpd %xmm1, %xmm01213; SSE2-NEXT: pand %xmm0, %xmm31214; SSE2-NEXT: andnpd %xmm1, %xmm01215; SSE2-NEXT: orpd %xmm3, %xmm01216; SSE2-NEXT: retq1217;1218; AVX-LABEL: test_fminimumnum_vector_different_zeros:1219; AVX: # %bb.0:1220; AVX-NEXT: vxorpd %xmm1, %xmm1, %xmm11221; AVX-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]1222; AVX-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm21223; AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm01224; AVX-NEXT: vminpd %xmm2, %xmm0, %xmm11225; AVX-NEXT: vcmpunordpd %xmm1, %xmm1, %xmm21226; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01227; AVX-NEXT: retq1228;1229; AVX10_2-LABEL: test_fminimumnum_vector_different_zeros:1230; AVX10_2: # %bb.0:1231; AVX10_2-NEXT: vxorpd %xmm1, %xmm1, %xmm11232; AVX10_2-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]1233; AVX10_2-NEXT: vminmaxpd $16, %xmm1, %xmm0, %xmm01234; AVX10_2-NEXT: retq1235;1236; X86-LABEL: test_fminimumnum_vector_different_zeros:1237; X86: # %bb.0:1238; X86-NEXT: vxorpd %xmm1, %xmm1, %xmm11239; X86-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]1240; X86-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm21241; X86-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm01242; X86-NEXT: vminpd %xmm2, %xmm0, %xmm11243; X86-NEXT: vcmpunordpd %xmm1, %xmm1, %xmm21244; X86-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01245; X86-NEXT: retl1246 %r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %x, <2 x double> <double 0., double -0.>)1247 ret <2 x double> %r1248}1249 1250define <4 x float> @test_fmaximumnum_vector_non_zero(<4 x float> %x) {1251; SSE2-LABEL: test_fmaximumnum_vector_non_zero:1252; SSE2: # %bb.0:1253; SSE2-NEXT: maxps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01254; SSE2-NEXT: retq1255;1256; AVX-LABEL: test_fmaximumnum_vector_non_zero:1257; AVX: # %bb.0:1258; AVX-NEXT: vmaxps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01259; AVX-NEXT: retq1260;1261; AVX10_2-LABEL: test_fmaximumnum_vector_non_zero:1262; AVX10_2: # %bb.0:1263; AVX10_2-NEXT: vminmaxps $17, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01264; AVX10_2-NEXT: retq1265;1266; X86-LABEL: test_fmaximumnum_vector_non_zero:1267; X86: # %bb.0:1268; X86-NEXT: vmaxps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm01269; X86-NEXT: retl1270 %r = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> %x, <4 x float> <float 5., float 4., float 3., float 2.>)1271 ret <4 x float> %r1272}1273 1274define <2 x double> @test_fminimumnum_vector_nan(<2 x double> %x) {1275; SSE2-LABEL: test_fminimumnum_vector_nan:1276; SSE2: # %bb.0:1277; SSE2-NEXT: xorpd %xmm1, %xmm11278; SSE2-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]1279; SSE2-NEXT: movapd %xmm1, %xmm21280; SSE2-NEXT: minpd %xmm0, %xmm21281; SSE2-NEXT: movapd %xmm2, %xmm01282; SSE2-NEXT: cmpunordpd %xmm2, %xmm01283; SSE2-NEXT: andpd %xmm0, %xmm11284; SSE2-NEXT: andnpd %xmm2, %xmm01285; SSE2-NEXT: orpd %xmm1, %xmm01286; SSE2-NEXT: retq1287;1288; AVX-LABEL: test_fminimumnum_vector_nan:1289; AVX: # %bb.0:1290; AVX-NEXT: vxorpd %xmm1, %xmm1, %xmm11291; AVX-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]1292; AVX-NEXT: vminpd %xmm0, %xmm1, %xmm01293; AVX-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm21294; AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm01295; AVX-NEXT: retq1296;1297; AVX10_2-LABEL: test_fminimumnum_vector_nan:1298; AVX10_2: # %bb.0:1299; AVX10_2-NEXT: vxorpd %xmm1, %xmm1, %xmm11300; AVX10_2-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]1301; AVX10_2-NEXT: vminmaxpd $16, %xmm1, %xmm0, %xmm01302; AVX10_2-NEXT: retq1303;1304; X86-LABEL: test_fminimumnum_vector_nan:1305; X86: # %bb.0:1306; X86-NEXT: vxorpd %xmm1, %xmm1, %xmm11307; X86-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]1308; X86-NEXT: vminpd %xmm0, %xmm1, %xmm01309; X86-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm21310; X86-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm01311; X86-NEXT: retl1312 %r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %x, <2 x double> <double 0., double 0x7fff000000000000>)1313 ret <2 x double> %r1314}1315 1316define <2 x double> @test_fminimumnum_vector_zero_first(<2 x double> %x) {1317; SSE2-LABEL: test_fminimumnum_vector_zero_first:1318; SSE2: # %bb.0:1319; SSE2-NEXT: xorpd %xmm1, %xmm11320; SSE2-NEXT: minpd %xmm0, %xmm11321; SSE2-NEXT: movapd %xmm1, %xmm01322; SSE2-NEXT: cmpunordpd %xmm1, %xmm01323; SSE2-NEXT: andnpd %xmm1, %xmm01324; SSE2-NEXT: retq1325;1326; AVX-LABEL: test_fminimumnum_vector_zero_first:1327; AVX: # %bb.0:1328; AVX-NEXT: vxorpd %xmm1, %xmm1, %xmm11329; AVX-NEXT: vminpd %xmm0, %xmm1, %xmm01330; AVX-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm11331; AVX-NEXT: vandnpd %xmm0, %xmm1, %xmm01332; AVX-NEXT: retq1333;1334; AVX10_2-LABEL: test_fminimumnum_vector_zero_first:1335; AVX10_2: # %bb.0:1336; AVX10_2-NEXT: vxorpd %xmm1, %xmm1, %xmm11337; AVX10_2-NEXT: vminmaxpd $16, %xmm1, %xmm0, %xmm01338; AVX10_2-NEXT: retq1339;1340; X86-LABEL: test_fminimumnum_vector_zero_first:1341; X86: # %bb.0:1342; X86-NEXT: vxorpd %xmm1, %xmm1, %xmm11343; X86-NEXT: vminpd %xmm0, %xmm1, %xmm01344; X86-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm11345; X86-NEXT: vandnpd %xmm0, %xmm1, %xmm01346; X86-NEXT: retl1347 %r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> <double 0., double 0.>, <2 x double> %x)1348 ret <2 x double> %r1349}1350 1351define <2 x double> @test_fminimumnum_vector_signed_zero(<2 x double> %x) {1352; SSE2-LABEL: test_fminimumnum_vector_signed_zero:1353; SSE2: # %bb.0:1354; SSE2-NEXT: minpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01355; SSE2-NEXT: retq1356;1357; AVX-LABEL: test_fminimumnum_vector_signed_zero:1358; AVX: # %bb.0:1359; AVX-NEXT: vminpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01360; AVX-NEXT: retq1361;1362; AVX10_2-LABEL: test_fminimumnum_vector_signed_zero:1363; AVX10_2: # %bb.0:1364; AVX10_2-NEXT: vminmaxpd $16, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm01365; AVX10_2-NEXT: retq1366;1367; X86-LABEL: test_fminimumnum_vector_signed_zero:1368; X86: # %bb.0:1369; X86-NEXT: vminpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm01370; X86-NEXT: retl1371 %r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %x, <2 x double> <double -0., double -0.>)1372 ret <2 x double> %r1373}1374 1375define <4 x float> @test_fmaximumnum_vector_signed_zero_first(<4 x float> %x) {1376; SSE2-LABEL: test_fmaximumnum_vector_signed_zero_first:1377; SSE2: # %bb.0:1378; SSE2-NEXT: movaps {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]1379; SSE2-NEXT: movaps %xmm1, %xmm21380; SSE2-NEXT: maxps %xmm0, %xmm21381; SSE2-NEXT: movaps %xmm2, %xmm01382; SSE2-NEXT: cmpunordps %xmm2, %xmm01383; SSE2-NEXT: andps %xmm0, %xmm11384; SSE2-NEXT: andnps %xmm2, %xmm01385; SSE2-NEXT: orps %xmm1, %xmm01386; SSE2-NEXT: retq1387;1388; AVX-LABEL: test_fmaximumnum_vector_signed_zero_first:1389; AVX: # %bb.0:1390; AVX-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]1391; AVX-NEXT: vmaxps %xmm0, %xmm1, %xmm01392; AVX-NEXT: vcmpunordps %xmm0, %xmm0, %xmm21393; AVX-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm01394; AVX-NEXT: retq1395;1396; AVX10_2-LABEL: test_fmaximumnum_vector_signed_zero_first:1397; AVX10_2: # %bb.0:1398; AVX10_2-NEXT: vminmaxps $17, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm01399; AVX10_2-NEXT: retq1400;1401; X86-LABEL: test_fmaximumnum_vector_signed_zero_first:1402; X86: # %bb.0:1403; X86-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]1404; X86-NEXT: vmaxps %xmm0, %xmm1, %xmm01405; X86-NEXT: vcmpunordps %xmm0, %xmm0, %xmm21406; X86-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm01407; X86-NEXT: retl1408 %r = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> <float -0., float -0., float -0., float -0.>, <4 x float> %x)1409 ret <4 x float> %r1410}1411 1412define <4 x float> @test_fmaximumnum_vector_zero(<4 x float> %x) {1413; SSE2-LABEL: test_fmaximumnum_vector_zero:1414; SSE2: # %bb.0:1415; SSE2-NEXT: xorps %xmm1, %xmm11416; SSE2-NEXT: maxps %xmm1, %xmm01417; SSE2-NEXT: retq1418;1419; AVX-LABEL: test_fmaximumnum_vector_zero:1420; AVX: # %bb.0:1421; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm11422; AVX-NEXT: vmaxps %xmm1, %xmm0, %xmm01423; AVX-NEXT: retq1424;1425; AVX10_2-LABEL: test_fmaximumnum_vector_zero:1426; AVX10_2: # %bb.0:1427; AVX10_2-NEXT: vxorpd %xmm1, %xmm1, %xmm11428; AVX10_2-NEXT: vminmaxps $17, %xmm1, %xmm0, %xmm01429; AVX10_2-NEXT: retq1430;1431; X86-LABEL: test_fmaximumnum_vector_zero:1432; X86: # %bb.0:1433; X86-NEXT: vxorps %xmm1, %xmm1, %xmm11434; X86-NEXT: vmaxps %xmm1, %xmm0, %xmm01435; X86-NEXT: retl1436 %r = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> %x, <4 x float> <float 0., float 0., float 0., float 0.>)1437 ret <4 x float> %r1438}1439 1440; PR77805: Check that signed zeroes are handled correctly in this case (FIXME)1441define <4 x float> @test_fmaximumnum_v4f32_splat(<4 x float> %x, float %y) {1442; SSE2-LABEL: test_fmaximumnum_v4f32_splat:1443; SSE2: # %bb.0:1444; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0,0,0]1445; SSE2-NEXT: pxor %xmm2, %xmm21446; SSE2-NEXT: pcmpgtd %xmm0, %xmm21447; SSE2-NEXT: movdqa %xmm2, %xmm31448; SSE2-NEXT: pandn %xmm0, %xmm31449; SSE2-NEXT: movaps %xmm1, %xmm41450; SSE2-NEXT: andps %xmm2, %xmm41451; SSE2-NEXT: orps %xmm3, %xmm41452; SSE2-NEXT: pand %xmm2, %xmm01453; SSE2-NEXT: andnps %xmm1, %xmm21454; SSE2-NEXT: por %xmm2, %xmm01455; SSE2-NEXT: movdqa %xmm0, %xmm11456; SSE2-NEXT: maxps %xmm4, %xmm11457; SSE2-NEXT: movaps %xmm1, %xmm21458; SSE2-NEXT: cmpunordps %xmm1, %xmm21459; SSE2-NEXT: pand %xmm2, %xmm01460; SSE2-NEXT: andnps %xmm1, %xmm21461; SSE2-NEXT: por %xmm2, %xmm01462; SSE2-NEXT: retq1463;1464; AVX1-LABEL: test_fmaximumnum_v4f32_splat:1465; AVX1: # %bb.0:1466; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,0,0,0]1467; AVX1-NEXT: vblendvps %xmm0, %xmm1, %xmm0, %xmm21468; AVX1-NEXT: vblendvps %xmm0, %xmm0, %xmm1, %xmm01469; AVX1-NEXT: vmaxps %xmm2, %xmm0, %xmm11470; AVX1-NEXT: vcmpunordps %xmm1, %xmm1, %xmm21471; AVX1-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm01472; AVX1-NEXT: retq1473;1474; AVX512-LABEL: test_fmaximumnum_v4f32_splat:1475; AVX512: # %bb.0:1476; AVX512-NEXT: vbroadcastss %xmm1, %xmm11477; AVX512-NEXT: vblendvps %xmm0, %xmm1, %xmm0, %xmm21478; AVX512-NEXT: vblendvps %xmm0, %xmm0, %xmm1, %xmm01479; AVX512-NEXT: vmaxps %xmm2, %xmm0, %xmm11480; AVX512-NEXT: vcmpunordps %xmm1, %xmm1, %xmm21481; AVX512-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm01482; AVX512-NEXT: retq1483;1484; AVX10_2-LABEL: test_fmaximumnum_v4f32_splat:1485; AVX10_2: # %bb.0:1486; AVX10_2-NEXT: vbroadcastss %xmm1, %xmm11487; AVX10_2-NEXT: vminmaxps $17, %xmm1, %xmm0, %xmm01488; AVX10_2-NEXT: retq1489;1490; X86-LABEL: test_fmaximumnum_v4f32_splat:1491; X86: # %bb.0:1492; X86-NEXT: vbroadcastss {{[0-9]+}}(%esp), %xmm11493; X86-NEXT: vblendvps %xmm0, %xmm1, %xmm0, %xmm21494; X86-NEXT: vblendvps %xmm0, %xmm0, %xmm1, %xmm01495; X86-NEXT: vmaxps %xmm2, %xmm0, %xmm11496; X86-NEXT: vcmpunordps %xmm1, %xmm1, %xmm21497; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm01498; X86-NEXT: retl1499 %splatinsert = insertelement <4 x float> poison, float %y, i64 01500 %vec = shufflevector <4 x float> %splatinsert, <4 x float> poison, <4 x i32> zeroinitializer1501 %r = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> %x, <4 x float> %vec) readnone1502 ret <4 x float> %r1503}1504 1505define <4 x half> @test_fmaximumnum_v4f16(<4 x half> %x, <4 x half> %y) nounwind {1506; SSE2-LABEL: test_fmaximumnum_v4f16:1507; SSE2: # %bb.0:1508; SSE2-NEXT: subq $136, %rsp1509; SSE2-NEXT: movaps %xmm0, %xmm21510; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1],xmm0[1,1]1511; SSE2-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1512; SSE2-NEXT: movaps %xmm1, %xmm21513; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1],xmm1[1,1]1514; SSE2-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1515; SSE2-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1516; SSE2-NEXT: movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1517; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1518; SSE2-NEXT: psrld $16, %xmm01519; SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1520; SSE2-NEXT: movaps %xmm1, (%rsp) # 16-byte Spill1521; SSE2-NEXT: movaps %xmm1, %xmm01522; SSE2-NEXT: psrld $16, %xmm01523; SSE2-NEXT: callq __extendhfsf2@PLT1524; SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1525; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1526; SSE2-NEXT: callq __extendhfsf2@PLT1527; SSE2-NEXT: movd %xmm0, %eax1528; SSE2-NEXT: testl %eax, %eax1529; SSE2-NEXT: js .LBB33_11530; SSE2-NEXT: # %bb.2:1531; SSE2-NEXT: movdqa %xmm0, %xmm11532; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload1533; SSE2-NEXT: jmp .LBB33_31534; SSE2-NEXT: .LBB33_1:1535; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1536; SSE2-NEXT: movdqa %xmm0, %xmm31537; SSE2-NEXT: .LBB33_3:1538; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1539; SSE2-NEXT: psrlq $48, %xmm01540; SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1541; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload1542; SSE2-NEXT: psrlq $48, %xmm01543; SSE2-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill1544; SSE2-NEXT: movdqa %xmm3, %xmm21545; SSE2-NEXT: maxss %xmm1, %xmm21546; SSE2-NEXT: movaps %xmm2, %xmm01547; SSE2-NEXT: cmpunordss %xmm2, %xmm01548; SSE2-NEXT: movaps %xmm0, %xmm11549; SSE2-NEXT: andnps %xmm2, %xmm11550; SSE2-NEXT: andps %xmm3, %xmm01551; SSE2-NEXT: orps %xmm1, %xmm01552; SSE2-NEXT: callq __truncsfhf2@PLT1553; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1554; SSE2-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload1555; SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1556; SSE2-NEXT: callq __extendhfsf2@PLT1557; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1558; SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1559; SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1560; SSE2-NEXT: callq __extendhfsf2@PLT1561; SSE2-NEXT: movd %xmm0, %eax1562; SSE2-NEXT: testl %eax, %eax1563; SSE2-NEXT: js .LBB33_41564; SSE2-NEXT: # %bb.5:1565; SSE2-NEXT: movdqa %xmm0, %xmm11566; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload1567; SSE2-NEXT: jmp .LBB33_61568; SSE2-NEXT: .LBB33_4:1569; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1570; SSE2-NEXT: movdqa %xmm0, %xmm31571; SSE2-NEXT: .LBB33_6:1572; SSE2-NEXT: movdqa %xmm3, %xmm21573; SSE2-NEXT: maxss %xmm1, %xmm21574; SSE2-NEXT: movaps %xmm2, %xmm01575; SSE2-NEXT: cmpunordss %xmm2, %xmm01576; SSE2-NEXT: movaps %xmm0, %xmm11577; SSE2-NEXT: andnps %xmm2, %xmm11578; SSE2-NEXT: andps %xmm3, %xmm01579; SSE2-NEXT: orps %xmm1, %xmm01580; SSE2-NEXT: callq __truncsfhf2@PLT1581; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1582; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1583; SSE2-NEXT: callq __extendhfsf2@PLT1584; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1585; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1586; SSE2-NEXT: callq __extendhfsf2@PLT1587; SSE2-NEXT: movd %xmm0, %eax1588; SSE2-NEXT: testl %eax, %eax1589; SSE2-NEXT: js .LBB33_71590; SSE2-NEXT: # %bb.8:1591; SSE2-NEXT: movdqa %xmm0, %xmm11592; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload1593; SSE2-NEXT: jmp .LBB33_91594; SSE2-NEXT: .LBB33_7:1595; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1596; SSE2-NEXT: movdqa %xmm0, %xmm31597; SSE2-NEXT: .LBB33_9:1598; SSE2-NEXT: movdqa %xmm3, %xmm21599; SSE2-NEXT: maxss %xmm1, %xmm21600; SSE2-NEXT: movaps %xmm2, %xmm01601; SSE2-NEXT: cmpunordss %xmm2, %xmm01602; SSE2-NEXT: movaps %xmm0, %xmm11603; SSE2-NEXT: andnps %xmm2, %xmm11604; SSE2-NEXT: andps %xmm3, %xmm01605; SSE2-NEXT: orps %xmm1, %xmm01606; SSE2-NEXT: callq __truncsfhf2@PLT1607; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1608; SSE2-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload1609; SSE2-NEXT: callq __extendhfsf2@PLT1610; SSE2-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill1611; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1612; SSE2-NEXT: callq __extendhfsf2@PLT1613; SSE2-NEXT: movd %xmm0, %eax1614; SSE2-NEXT: testl %eax, %eax1615; SSE2-NEXT: js .LBB33_101616; SSE2-NEXT: # %bb.11:1617; SSE2-NEXT: movdqa %xmm0, %xmm11618; SSE2-NEXT: movdqa (%rsp), %xmm3 # 16-byte Reload1619; SSE2-NEXT: jmp .LBB33_121620; SSE2-NEXT: .LBB33_10:1621; SSE2-NEXT: movdqa (%rsp), %xmm1 # 16-byte Reload1622; SSE2-NEXT: movdqa %xmm0, %xmm31623; SSE2-NEXT: .LBB33_12:1624; SSE2-NEXT: movdqa %xmm3, %xmm21625; SSE2-NEXT: maxss %xmm1, %xmm21626; SSE2-NEXT: movaps %xmm2, %xmm01627; SSE2-NEXT: cmpunordss %xmm2, %xmm01628; SSE2-NEXT: movaps %xmm0, %xmm11629; SSE2-NEXT: andnps %xmm2, %xmm11630; SSE2-NEXT: andps %xmm3, %xmm01631; SSE2-NEXT: orps %xmm1, %xmm01632; SSE2-NEXT: callq __truncsfhf2@PLT1633; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1634; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1635; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1636; SSE2-NEXT: punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload1637; SSE2-NEXT: # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]1638; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1639; SSE2-NEXT: addq $136, %rsp1640; SSE2-NEXT: retq1641;1642; AVX1-LABEL: test_fmaximumnum_v4f16:1643; AVX1: # %bb.0:1644; AVX1-NEXT: subq $120, %rsp1645; AVX1-NEXT: vmovaps %xmm0, %xmm21646; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1647; AVX1-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1648; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]1649; AVX1-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1650; AVX1-NEXT: vmovaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1651; AVX1-NEXT: vpsrld $16, %xmm2, %xmm01652; AVX1-NEXT: vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1653; AVX1-NEXT: vmovaps %xmm1, (%rsp) # 16-byte Spill1654; AVX1-NEXT: vpsrld $16, %xmm1, %xmm01655; AVX1-NEXT: callq __extendhfsf2@PLT1656; AVX1-NEXT: vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1657; AVX1-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1658; AVX1-NEXT: callq __extendhfsf2@PLT1659; AVX1-NEXT: vmovd %xmm0, %eax1660; AVX1-NEXT: testl %eax, %eax1661; AVX1-NEXT: js .LBB33_11662; AVX1-NEXT: # %bb.2:1663; AVX1-NEXT: vmovdqa %xmm0, %xmm11664; AVX1-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload1665; AVX1-NEXT: jmp .LBB33_31666; AVX1-NEXT: .LBB33_1:1667; AVX1-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1668; AVX1-NEXT: vmovdqa %xmm0, %xmm21669; AVX1-NEXT: .LBB33_3:1670; AVX1-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1671; AVX1-NEXT: vpsrlq $48, %xmm0, %xmm01672; AVX1-NEXT: vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1673; AVX1-NEXT: vmovdqa (%rsp), %xmm0 # 16-byte Reload1674; AVX1-NEXT: vpsrlq $48, %xmm0, %xmm01675; AVX1-NEXT: vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1676; AVX1-NEXT: vmaxss %xmm1, %xmm2, %xmm01677; AVX1-NEXT: vcmpunordss %xmm0, %xmm0, %xmm11678; AVX1-NEXT: vblendvps %xmm1, %xmm2, %xmm0, %xmm01679; AVX1-NEXT: callq __truncsfhf2@PLT1680; AVX1-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1681; AVX1-NEXT: vmovaps (%rsp), %xmm0 # 16-byte Reload1682; AVX1-NEXT: callq __extendhfsf2@PLT1683; AVX1-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill1684; AVX1-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1685; AVX1-NEXT: callq __extendhfsf2@PLT1686; AVX1-NEXT: vmovd %xmm0, %eax1687; AVX1-NEXT: testl %eax, %eax1688; AVX1-NEXT: js .LBB33_41689; AVX1-NEXT: # %bb.5:1690; AVX1-NEXT: vmovdqa %xmm0, %xmm11691; AVX1-NEXT: vmovdqa (%rsp), %xmm2 # 16-byte Reload1692; AVX1-NEXT: jmp .LBB33_61693; AVX1-NEXT: .LBB33_4:1694; AVX1-NEXT: vmovdqa (%rsp), %xmm1 # 16-byte Reload1695; AVX1-NEXT: vmovdqa %xmm0, %xmm21696; AVX1-NEXT: .LBB33_6:1697; AVX1-NEXT: vmaxss %xmm1, %xmm2, %xmm01698; AVX1-NEXT: vcmpunordss %xmm0, %xmm0, %xmm11699; AVX1-NEXT: vblendvps %xmm1, %xmm2, %xmm0, %xmm01700; AVX1-NEXT: callq __truncsfhf2@PLT1701; AVX1-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1702; AVX1-NEXT: vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1703; AVX1-NEXT: callq __extendhfsf2@PLT1704; AVX1-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill1705; AVX1-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1706; AVX1-NEXT: callq __extendhfsf2@PLT1707; AVX1-NEXT: vmovd %xmm0, %eax1708; AVX1-NEXT: testl %eax, %eax1709; AVX1-NEXT: js .LBB33_71710; AVX1-NEXT: # %bb.8:1711; AVX1-NEXT: vmovdqa %xmm0, %xmm11712; AVX1-NEXT: vmovdqa (%rsp), %xmm2 # 16-byte Reload1713; AVX1-NEXT: jmp .LBB33_91714; AVX1-NEXT: .LBB33_7:1715; AVX1-NEXT: vmovdqa (%rsp), %xmm1 # 16-byte Reload1716; AVX1-NEXT: vmovdqa %xmm0, %xmm21717; AVX1-NEXT: .LBB33_9:1718; AVX1-NEXT: vmaxss %xmm1, %xmm2, %xmm01719; AVX1-NEXT: vcmpunordss %xmm0, %xmm0, %xmm11720; AVX1-NEXT: vblendvps %xmm1, %xmm2, %xmm0, %xmm01721; AVX1-NEXT: callq __truncsfhf2@PLT1722; AVX1-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill1723; AVX1-NEXT: vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1724; AVX1-NEXT: callq __extendhfsf2@PLT1725; AVX1-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1726; AVX1-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1727; AVX1-NEXT: callq __extendhfsf2@PLT1728; AVX1-NEXT: vmovd %xmm0, %eax1729; AVX1-NEXT: testl %eax, %eax1730; AVX1-NEXT: js .LBB33_101731; AVX1-NEXT: # %bb.11:1732; AVX1-NEXT: vmovdqa %xmm0, %xmm11733; AVX1-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload1734; AVX1-NEXT: jmp .LBB33_121735; AVX1-NEXT: .LBB33_10:1736; AVX1-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1737; AVX1-NEXT: vmovdqa %xmm0, %xmm21738; AVX1-NEXT: .LBB33_12:1739; AVX1-NEXT: vmaxss %xmm1, %xmm2, %xmm01740; AVX1-NEXT: vcmpunordss %xmm0, %xmm0, %xmm11741; AVX1-NEXT: vblendvps %xmm1, %xmm2, %xmm0, %xmm01742; AVX1-NEXT: callq __truncsfhf2@PLT1743; AVX1-NEXT: vmovdqa (%rsp), %xmm1 # 16-byte Reload1744; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1745; AVX1-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1746; AVX1-NEXT: vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload1747; AVX1-NEXT: # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]1748; AVX1-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero1749; AVX1-NEXT: addq $120, %rsp1750; AVX1-NEXT: retq1751;1752; AVX512-LABEL: test_fmaximumnum_v4f16:1753; AVX512: # %bb.0:1754; AVX512-NEXT: vpsrldq {{.*#+}} xmm2 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1755; AVX512-NEXT: vcvtph2ps %xmm2, %xmm21756; AVX512-NEXT: vmovd %xmm2, %eax1757; AVX512-NEXT: testl %eax, %eax1758; AVX512-NEXT: sets %al1759; AVX512-NEXT: kmovw %eax, %k11760; AVX512-NEXT: vpsrldq {{.*#+}} xmm3 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1761; AVX512-NEXT: vcvtph2ps %xmm3, %xmm31762; AVX512-NEXT: vmovdqa %xmm2, %xmm41763; AVX512-NEXT: vmovss %xmm3, %xmm4, %xmm4 {%k1}1764; AVX512-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1}1765; AVX512-NEXT: vmaxss %xmm4, %xmm3, %xmm21766; AVX512-NEXT: vcmpunordss %xmm2, %xmm2, %k11767; AVX512-NEXT: vmovss %xmm3, %xmm2, %xmm2 {%k1}1768; AVX512-NEXT: vcvtps2ph $4, %xmm2, %xmm21769; AVX512-NEXT: vshufps {{.*#+}} xmm3 = xmm0[3,3,3,3]1770; AVX512-NEXT: vcvtph2ps %xmm3, %xmm31771; AVX512-NEXT: vmovd %xmm3, %eax1772; AVX512-NEXT: testl %eax, %eax1773; AVX512-NEXT: sets %al1774; AVX512-NEXT: kmovw %eax, %k11775; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm1[3,3,3,3]1776; AVX512-NEXT: vcvtph2ps %xmm4, %xmm41777; AVX512-NEXT: vmovdqa %xmm3, %xmm51778; AVX512-NEXT: vmovss %xmm4, %xmm5, %xmm5 {%k1}1779; AVX512-NEXT: vmovss %xmm3, %xmm4, %xmm4 {%k1}1780; AVX512-NEXT: vmaxss %xmm5, %xmm4, %xmm31781; AVX512-NEXT: vcmpunordss %xmm3, %xmm3, %k11782; AVX512-NEXT: vmovss %xmm4, %xmm3, %xmm3 {%k1}1783; AVX512-NEXT: vcvtps2ph $4, %xmm3, %xmm31784; AVX512-NEXT: vpunpcklwd {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]1785; AVX512-NEXT: vpsrldq {{.*#+}} xmm3 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1786; AVX512-NEXT: vcvtph2ps %xmm3, %xmm31787; AVX512-NEXT: vmovd %xmm3, %eax1788; AVX512-NEXT: testl %eax, %eax1789; AVX512-NEXT: sets %al1790; AVX512-NEXT: kmovw %eax, %k11791; AVX512-NEXT: vpsrldq {{.*#+}} xmm4 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1792; AVX512-NEXT: vcvtph2ps %xmm4, %xmm41793; AVX512-NEXT: vmovdqa %xmm3, %xmm51794; AVX512-NEXT: vmovss %xmm4, %xmm5, %xmm5 {%k1}1795; AVX512-NEXT: vmovss %xmm3, %xmm4, %xmm4 {%k1}1796; AVX512-NEXT: vmaxss %xmm5, %xmm4, %xmm31797; AVX512-NEXT: vcmpunordss %xmm3, %xmm3, %k11798; AVX512-NEXT: vmovss %xmm4, %xmm3, %xmm3 {%k1}1799; AVX512-NEXT: vcvtps2ph $4, %xmm3, %xmm31800; AVX512-NEXT: vshufpd {{.*#+}} xmm4 = xmm0[1,0]1801; AVX512-NEXT: vcvtph2ps %xmm4, %xmm41802; AVX512-NEXT: vmovd %xmm4, %eax1803; AVX512-NEXT: testl %eax, %eax1804; AVX512-NEXT: sets %al1805; AVX512-NEXT: kmovw %eax, %k11806; AVX512-NEXT: vshufpd {{.*#+}} xmm5 = xmm1[1,0]1807; AVX512-NEXT: vcvtph2ps %xmm5, %xmm51808; AVX512-NEXT: vmovdqa %xmm4, %xmm61809; AVX512-NEXT: vmovss %xmm5, %xmm6, %xmm6 {%k1}1810; AVX512-NEXT: vmovss %xmm4, %xmm5, %xmm5 {%k1}1811; AVX512-NEXT: vmaxss %xmm6, %xmm5, %xmm41812; AVX512-NEXT: vcmpunordss %xmm4, %xmm4, %k11813; AVX512-NEXT: vmovss %xmm5, %xmm4, %xmm4 {%k1}1814; AVX512-NEXT: vcvtps2ph $4, %xmm4, %xmm41815; AVX512-NEXT: vpunpcklwd {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]1816; AVX512-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]1817; AVX512-NEXT: vpsrlq $48, %xmm0, %xmm31818; AVX512-NEXT: vcvtph2ps %xmm3, %xmm31819; AVX512-NEXT: vmovd %xmm3, %eax1820; AVX512-NEXT: testl %eax, %eax1821; AVX512-NEXT: sets %al1822; AVX512-NEXT: kmovw %eax, %k11823; AVX512-NEXT: vpsrlq $48, %xmm1, %xmm41824; AVX512-NEXT: vcvtph2ps %xmm4, %xmm41825; AVX512-NEXT: vmovdqa %xmm3, %xmm51826; AVX512-NEXT: vmovss %xmm4, %xmm5, %xmm5 {%k1}1827; AVX512-NEXT: vmovss %xmm3, %xmm4, %xmm4 {%k1}1828; AVX512-NEXT: vmaxss %xmm5, %xmm4, %xmm31829; AVX512-NEXT: vcmpunordss %xmm3, %xmm3, %k11830; AVX512-NEXT: vmovss %xmm4, %xmm3, %xmm3 {%k1}1831; AVX512-NEXT: vcvtps2ph $4, %xmm3, %xmm31832; AVX512-NEXT: vmovshdup {{.*#+}} xmm4 = xmm0[1,1,3,3]1833; AVX512-NEXT: vcvtph2ps %xmm4, %xmm41834; AVX512-NEXT: vmovd %xmm4, %eax1835; AVX512-NEXT: testl %eax, %eax1836; AVX512-NEXT: sets %al1837; AVX512-NEXT: kmovw %eax, %k11838; AVX512-NEXT: vmovshdup {{.*#+}} xmm5 = xmm1[1,1,3,3]1839; AVX512-NEXT: vcvtph2ps %xmm5, %xmm51840; AVX512-NEXT: vmovdqa %xmm4, %xmm61841; AVX512-NEXT: vmovss %xmm5, %xmm6, %xmm6 {%k1}1842; AVX512-NEXT: vmovss %xmm4, %xmm5, %xmm5 {%k1}1843; AVX512-NEXT: vmaxss %xmm6, %xmm5, %xmm41844; AVX512-NEXT: vcmpunordss %xmm4, %xmm4, %k11845; AVX512-NEXT: vmovss %xmm5, %xmm4, %xmm4 {%k1}1846; AVX512-NEXT: vcvtps2ph $4, %xmm4, %xmm41847; AVX512-NEXT: vpunpcklwd {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]1848; AVX512-NEXT: vcvtph2ps %xmm0, %xmm41849; AVX512-NEXT: vmovd %xmm4, %eax1850; AVX512-NEXT: testl %eax, %eax1851; AVX512-NEXT: sets %al1852; AVX512-NEXT: kmovw %eax, %k11853; AVX512-NEXT: vcvtph2ps %xmm1, %xmm51854; AVX512-NEXT: vmovdqa %xmm4, %xmm61855; AVX512-NEXT: vmovss %xmm5, %xmm6, %xmm6 {%k1}1856; AVX512-NEXT: vmovss %xmm4, %xmm5, %xmm5 {%k1}1857; AVX512-NEXT: vmaxss %xmm6, %xmm5, %xmm41858; AVX512-NEXT: vcmpunordss %xmm4, %xmm4, %k11859; AVX512-NEXT: vmovss %xmm5, %xmm4, %xmm4 {%k1}1860; AVX512-NEXT: vcvtps2ph $4, %xmm4, %xmm41861; AVX512-NEXT: vpsrld $16, %xmm0, %xmm01862; AVX512-NEXT: vcvtph2ps %xmm0, %xmm01863; AVX512-NEXT: vmovd %xmm0, %eax1864; AVX512-NEXT: testl %eax, %eax1865; AVX512-NEXT: sets %al1866; AVX512-NEXT: kmovw %eax, %k11867; AVX512-NEXT: vpsrld $16, %xmm1, %xmm11868; AVX512-NEXT: vcvtph2ps %xmm1, %xmm11869; AVX512-NEXT: vmovdqa %xmm0, %xmm51870; AVX512-NEXT: vmovss %xmm1, %xmm5, %xmm5 {%k1}1871; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}1872; AVX512-NEXT: vmaxss %xmm5, %xmm1, %xmm01873; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k11874; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}1875; AVX512-NEXT: vcvtps2ph $4, %xmm0, %xmm01876; AVX512-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]1877; AVX512-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]1878; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]1879; AVX512-NEXT: retq1880;1881; AVX10_2-LABEL: test_fmaximumnum_v4f16:1882; AVX10_2: # %bb.0:1883; AVX10_2-NEXT: vminmaxph $17, %xmm1, %xmm0, %xmm01884; AVX10_2-NEXT: retq1885;1886; X86-LABEL: test_fmaximumnum_v4f16:1887; X86: # %bb.0:1888; X86-NEXT: subl $164, %esp1889; X86-NEXT: vmovdqa %xmm0, %xmm21890; X86-NEXT: vmovdqu %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1891; X86-NEXT: vpsrlq $48, %xmm0, %xmm01892; X86-NEXT: vmovdqu %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1893; X86-NEXT: vmovshdup {{.*#+}} xmm0 = xmm2[1,1,3,3]1894; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1895; X86-NEXT: vmovshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]1896; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1897; X86-NEXT: vpsrlq $48, %xmm1, %xmm01898; X86-NEXT: vmovdqu %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1899; X86-NEXT: vpsrld $16, %xmm2, %xmm01900; X86-NEXT: vmovdqu %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1901; X86-NEXT: vpsrld $16, %xmm1, %xmm01902; X86-NEXT: vmovdqu %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1903; X86-NEXT: vpextrw $0, %xmm1, (%esp)1904; X86-NEXT: calll __extendhfsf21905; X86-NEXT: fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill1906; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1907; X86-NEXT: vpextrw $0, %xmm0, (%esp)1908; X86-NEXT: calll __extendhfsf21909; X86-NEXT: fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill1910; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1911; X86-NEXT: vpextrw $0, %xmm0, (%esp)1912; X86-NEXT: calll __extendhfsf21913; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1914; X86-NEXT: vpextrw $0, %xmm0, (%esp)1915; X86-NEXT: fstps {{[0-9]+}}(%esp)1916; X86-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload1917; X86-NEXT: fstps {{[0-9]+}}(%esp)1918; X86-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1919; X86-NEXT: vmovd %xmm1, %eax1920; X86-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1921; X86-NEXT: testl %eax, %eax1922; X86-NEXT: js .LBB33_11923; X86-NEXT: # %bb.2:1924; X86-NEXT: vmovdqa %xmm1, %xmm21925; X86-NEXT: jmp .LBB33_31926; X86-NEXT: .LBB33_1:1927; X86-NEXT: vmovdqa %xmm0, %xmm21928; X86-NEXT: vmovdqa %xmm1, %xmm01929; X86-NEXT: .LBB33_3:1930; X86-NEXT: vmaxss %xmm2, %xmm0, %xmm11931; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm21932; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm01933; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1934; X86-NEXT: calll __extendhfsf21935; X86-NEXT: vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1936; X86-NEXT: vmovss %xmm0, (%esp)1937; X86-NEXT: fstps {{[0-9]+}}(%esp)1938; X86-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload1939; X86-NEXT: fstps {{[0-9]+}}(%esp)1940; X86-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1941; X86-NEXT: vmovd %xmm1, %eax1942; X86-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1943; X86-NEXT: testl %eax, %eax1944; X86-NEXT: js .LBB33_41945; X86-NEXT: # %bb.5:1946; X86-NEXT: vmovdqa %xmm1, %xmm21947; X86-NEXT: jmp .LBB33_61948; X86-NEXT: .LBB33_4:1949; X86-NEXT: vmovdqa %xmm0, %xmm21950; X86-NEXT: vmovdqa %xmm1, %xmm01951; X86-NEXT: .LBB33_6:1952; X86-NEXT: vmaxss %xmm2, %xmm0, %xmm11953; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm21954; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm01955; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1956; X86-NEXT: calll __truncsfhf21957; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1958; X86-NEXT: vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1959; X86-NEXT: vmovss %xmm0, (%esp)1960; X86-NEXT: calll __truncsfhf21961; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1962; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1963; X86-NEXT: vpextrw $0, %xmm0, (%esp)1964; X86-NEXT: calll __extendhfsf21965; X86-NEXT: fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill1966; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1967; X86-NEXT: vpextrw $0, %xmm0, (%esp)1968; X86-NEXT: calll __extendhfsf21969; X86-NEXT: fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill1970; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1971; X86-NEXT: vpextrw $0, %xmm0, (%esp)1972; X86-NEXT: calll __extendhfsf21973; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1974; X86-NEXT: vpextrw $0, %xmm0, (%esp)1975; X86-NEXT: fstps {{[0-9]+}}(%esp)1976; X86-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload1977; X86-NEXT: fstps {{[0-9]+}}(%esp)1978; X86-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1979; X86-NEXT: vmovd %xmm1, %eax1980; X86-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1981; X86-NEXT: testl %eax, %eax1982; X86-NEXT: js .LBB33_71983; X86-NEXT: # %bb.8:1984; X86-NEXT: vmovdqa %xmm1, %xmm21985; X86-NEXT: jmp .LBB33_91986; X86-NEXT: .LBB33_7:1987; X86-NEXT: vmovdqa %xmm0, %xmm21988; X86-NEXT: vmovdqa %xmm1, %xmm01989; X86-NEXT: .LBB33_9:1990; X86-NEXT: vmaxss %xmm2, %xmm0, %xmm11991; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm21992; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm01993; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1994; X86-NEXT: calll __extendhfsf21995; X86-NEXT: vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1996; X86-NEXT: vmovss %xmm0, (%esp)1997; X86-NEXT: fstps {{[0-9]+}}(%esp)1998; X86-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload1999; X86-NEXT: fstps {{[0-9]+}}(%esp)2000; X86-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero2001; X86-NEXT: vmovd %xmm1, %eax2002; X86-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero2003; X86-NEXT: testl %eax, %eax2004; X86-NEXT: js .LBB33_102005; X86-NEXT: # %bb.11:2006; X86-NEXT: vmovdqa %xmm1, %xmm22007; X86-NEXT: jmp .LBB33_122008; X86-NEXT: .LBB33_10:2009; X86-NEXT: vmovdqa %xmm0, %xmm22010; X86-NEXT: vmovdqa %xmm1, %xmm02011; X86-NEXT: .LBB33_12:2012; X86-NEXT: vmaxss %xmm2, %xmm0, %xmm12013; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm22014; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm02015; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill2016; X86-NEXT: calll __truncsfhf22017; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill2018; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload2019; X86-NEXT: vmovd %xmm0, (%esp)2020; X86-NEXT: calll __truncsfhf22021; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload2022; X86-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]2023; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload2024; X86-NEXT: vpunpcklwd {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload2025; X86-NEXT: # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]2026; X86-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero2027; X86-NEXT: addl $164, %esp2028; X86-NEXT: retl2029 %r = call <4 x half> @llvm.maximumnum.v4f16(<4 x half> %x, <4 x half> %y)2030 ret <4 x half> %r2031}2032 2033define <4 x bfloat> @test_fmaximumnum_v4bf16(<4 x bfloat> %x, <4 x bfloat> %y) nounwind {2034; SSE2-LABEL: test_fmaximumnum_v4bf16:2035; SSE2: # %bb.0:2036; SSE2-NEXT: pushq %rbp2037; SSE2-NEXT: pushq %r152038; SSE2-NEXT: pushq %r142039; SSE2-NEXT: pushq %r132040; SSE2-NEXT: pushq %r122041; SSE2-NEXT: pushq %rbx2042; SSE2-NEXT: subq $56, %rsp2043; SSE2-NEXT: movdqa %xmm0, %xmm22044; SSE2-NEXT: psrlq $48, %xmm22045; SSE2-NEXT: movdqa %xmm1, %xmm32046; SSE2-NEXT: psrlq $48, %xmm32047; SSE2-NEXT: movdqa %xmm0, %xmm42048; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[1,1],xmm0[1,1]2049; SSE2-NEXT: pextrw $0, %xmm4, %ebp2050; SSE2-NEXT: movdqa %xmm1, %xmm42051; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[1,1],xmm1[1,1]2052; SSE2-NEXT: pextrw $0, %xmm4, %r15d2053; SSE2-NEXT: pextrw $0, %xmm0, %r12d2054; SSE2-NEXT: pextrw $0, %xmm1, %r13d2055; SSE2-NEXT: psrld $16, %xmm02056; SSE2-NEXT: pextrw $0, %xmm0, %eax2057; SSE2-NEXT: psrld $16, %xmm12058; SSE2-NEXT: pextrw $0, %xmm1, %ecx2059; SSE2-NEXT: shll $16, %ecx2060; SSE2-NEXT: movd %ecx, %xmm12061; SSE2-NEXT: shll $16, %eax2062; SSE2-NEXT: movd %eax, %xmm42063; SSE2-NEXT: js .LBB34_12064; SSE2-NEXT: # %bb.2:2065; SSE2-NEXT: movdqa %xmm4, %xmm02066; SSE2-NEXT: jmp .LBB34_32067; SSE2-NEXT: .LBB34_1:2068; SSE2-NEXT: movdqa %xmm1, %xmm02069; SSE2-NEXT: movdqa %xmm4, %xmm12070; SSE2-NEXT: .LBB34_3:2071; SSE2-NEXT: pextrw $0, %xmm2, %ebx2072; SSE2-NEXT: pextrw $0, %xmm3, %r14d2073; SSE2-NEXT: movdqa %xmm1, %xmm22074; SSE2-NEXT: maxss %xmm0, %xmm22075; SSE2-NEXT: movaps %xmm2, %xmm02076; SSE2-NEXT: cmpunordss %xmm2, %xmm02077; SSE2-NEXT: movaps %xmm0, %xmm32078; SSE2-NEXT: andnps %xmm2, %xmm32079; SSE2-NEXT: andps %xmm1, %xmm02080; SSE2-NEXT: orps %xmm3, %xmm02081; SSE2-NEXT: callq __truncsfbf2@PLT2082; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill2083; SSE2-NEXT: shll $16, %r13d2084; SSE2-NEXT: movd %r13d, %xmm12085; SSE2-NEXT: shll $16, %r12d2086; SSE2-NEXT: movd %r12d, %xmm22087; SSE2-NEXT: js .LBB34_42088; SSE2-NEXT: # %bb.5:2089; SSE2-NEXT: movdqa %xmm2, %xmm02090; SSE2-NEXT: jmp .LBB34_62091; SSE2-NEXT: .LBB34_4:2092; SSE2-NEXT: movdqa %xmm1, %xmm02093; SSE2-NEXT: movdqa %xmm2, %xmm12094; SSE2-NEXT: .LBB34_6:2095; SSE2-NEXT: movdqa %xmm1, %xmm22096; SSE2-NEXT: maxss %xmm0, %xmm22097; SSE2-NEXT: movaps %xmm2, %xmm02098; SSE2-NEXT: cmpunordss %xmm2, %xmm02099; SSE2-NEXT: movaps %xmm0, %xmm32100; SSE2-NEXT: andnps %xmm2, %xmm32101; SSE2-NEXT: andps %xmm1, %xmm02102; SSE2-NEXT: orps %xmm3, %xmm02103; SSE2-NEXT: callq __truncsfbf2@PLT2104; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill2105; SSE2-NEXT: shll $16, %r15d2106; SSE2-NEXT: movd %r15d, %xmm12107; SSE2-NEXT: shll $16, %ebp2108; SSE2-NEXT: movd %ebp, %xmm22109; SSE2-NEXT: js .LBB34_72110; SSE2-NEXT: # %bb.8:2111; SSE2-NEXT: movdqa %xmm2, %xmm02112; SSE2-NEXT: jmp .LBB34_92113; SSE2-NEXT: .LBB34_7:2114; SSE2-NEXT: movdqa %xmm1, %xmm02115; SSE2-NEXT: movdqa %xmm2, %xmm12116; SSE2-NEXT: .LBB34_9:2117; SSE2-NEXT: movdqa %xmm1, %xmm22118; SSE2-NEXT: maxss %xmm0, %xmm22119; SSE2-NEXT: movaps %xmm2, %xmm02120; SSE2-NEXT: cmpunordss %xmm2, %xmm02121; SSE2-NEXT: movaps %xmm0, %xmm32122; SSE2-NEXT: andnps %xmm2, %xmm32123; SSE2-NEXT: andps %xmm1, %xmm02124; SSE2-NEXT: orps %xmm3, %xmm02125; SSE2-NEXT: callq __truncsfbf2@PLT2126; SSE2-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill2127; SSE2-NEXT: shll $16, %r14d2128; SSE2-NEXT: movd %r14d, %xmm12129; SSE2-NEXT: shll $16, %ebx2130; SSE2-NEXT: movd %ebx, %xmm22131; SSE2-NEXT: js .LBB34_102132; SSE2-NEXT: # %bb.11:2133; SSE2-NEXT: movdqa %xmm2, %xmm02134; SSE2-NEXT: jmp .LBB34_122135; SSE2-NEXT: .LBB34_10:2136; SSE2-NEXT: movdqa %xmm1, %xmm02137; SSE2-NEXT: movdqa %xmm2, %xmm12138; SSE2-NEXT: .LBB34_12:2139; SSE2-NEXT: movdqa %xmm1, %xmm22140; SSE2-NEXT: maxss %xmm0, %xmm22141; SSE2-NEXT: movaps %xmm2, %xmm02142; SSE2-NEXT: cmpunordss %xmm2, %xmm02143; SSE2-NEXT: movaps %xmm0, %xmm32144; SSE2-NEXT: andnps %xmm2, %xmm32145; SSE2-NEXT: andps %xmm1, %xmm02146; SSE2-NEXT: orps %xmm3, %xmm02147; SSE2-NEXT: callq __truncsfbf2@PLT2148; SSE2-NEXT: movdqa (%rsp), %xmm1 # 16-byte Reload2149; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]2150; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload2151; SSE2-NEXT: punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload2152; SSE2-NEXT: # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]2153; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]2154; SSE2-NEXT: addq $56, %rsp2155; SSE2-NEXT: popq %rbx2156; SSE2-NEXT: popq %r122157; SSE2-NEXT: popq %r132158; SSE2-NEXT: popq %r142159; SSE2-NEXT: popq %r152160; SSE2-NEXT: popq %rbp2161; SSE2-NEXT: retq2162;2163; AVX1-LABEL: test_fmaximumnum_v4bf16:2164; AVX1: # %bb.0:2165; AVX1-NEXT: pushq %rbp2166; AVX1-NEXT: pushq %r152167; AVX1-NEXT: pushq %r142168; AVX1-NEXT: pushq %r132169; AVX1-NEXT: pushq %r122170; AVX1-NEXT: pushq %rbx2171; AVX1-NEXT: subq $56, %rsp2172; AVX1-NEXT: vpsrlq $48, %xmm0, %xmm22173; AVX1-NEXT: vpsrlq $48, %xmm1, %xmm32174; AVX1-NEXT: vmovshdup {{.*#+}} xmm4 = xmm0[1,1,3,3]2175; AVX1-NEXT: vpextrw $0, %xmm4, %ebx2176; AVX1-NEXT: vmovshdup {{.*#+}} xmm4 = xmm1[1,1,3,3]2177; AVX1-NEXT: vpextrw $0, %xmm4, %r14d2178; AVX1-NEXT: vpextrw $0, %xmm0, %r12d2179; AVX1-NEXT: vpextrw $0, %xmm1, %r13d2180; AVX1-NEXT: vpsrld $16, %xmm0, %xmm02181; AVX1-NEXT: vpextrw $0, %xmm0, %eax2182; AVX1-NEXT: vpsrld $16, %xmm1, %xmm02183; AVX1-NEXT: vpextrw $0, %xmm0, %ecx2184; AVX1-NEXT: shll $16, %ecx2185; AVX1-NEXT: vmovd %ecx, %xmm02186; AVX1-NEXT: shll $16, %eax2187; AVX1-NEXT: vmovd %eax, %xmm42188; AVX1-NEXT: js .LBB34_12189; AVX1-NEXT: # %bb.2:2190; AVX1-NEXT: vmovdqa %xmm4, %xmm12191; AVX1-NEXT: jmp .LBB34_32192; AVX1-NEXT: .LBB34_1:2193; AVX1-NEXT: vmovdqa %xmm0, %xmm12194; AVX1-NEXT: vmovdqa %xmm4, %xmm02195; AVX1-NEXT: .LBB34_3:2196; AVX1-NEXT: vpextrw $0, %xmm2, %ebp2197; AVX1-NEXT: vpextrw $0, %xmm3, %r15d2198; AVX1-NEXT: vmaxss %xmm1, %xmm0, %xmm12199; AVX1-NEXT: vcmpunordss %xmm1, %xmm1, %xmm22200; AVX1-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm02201; AVX1-NEXT: callq __truncsfbf2@PLT2202; AVX1-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill2203; AVX1-NEXT: shll $16, %r13d2204; AVX1-NEXT: vmovd %r13d, %xmm02205; AVX1-NEXT: shll $16, %r12d2206; AVX1-NEXT: vmovd %r12d, %xmm22207; AVX1-NEXT: js .LBB34_42208; AVX1-NEXT: # %bb.5:2209; AVX1-NEXT: vmovdqa %xmm2, %xmm12210; AVX1-NEXT: jmp .LBB34_62211; AVX1-NEXT: .LBB34_4:2212; AVX1-NEXT: vmovdqa %xmm0, %xmm12213; AVX1-NEXT: vmovdqa %xmm2, %xmm02214; AVX1-NEXT: .LBB34_6:2215; AVX1-NEXT: vmaxss %xmm1, %xmm0, %xmm12216; AVX1-NEXT: vcmpunordss %xmm1, %xmm1, %xmm22217; AVX1-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm02218; AVX1-NEXT: callq __truncsfbf2@PLT2219; AVX1-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill2220; AVX1-NEXT: shll $16, %r14d2221; AVX1-NEXT: vmovd %r14d, %xmm02222; AVX1-NEXT: shll $16, %ebx2223; AVX1-NEXT: vmovd %ebx, %xmm22224; AVX1-NEXT: js .LBB34_72225; AVX1-NEXT: # %bb.8:2226; AVX1-NEXT: vmovdqa %xmm2, %xmm12227; AVX1-NEXT: jmp .LBB34_92228; AVX1-NEXT: .LBB34_7:2229; AVX1-NEXT: vmovdqa %xmm0, %xmm12230; AVX1-NEXT: vmovdqa %xmm2, %xmm02231; AVX1-NEXT: .LBB34_9:2232; AVX1-NEXT: vmaxss %xmm1, %xmm0, %xmm12233; AVX1-NEXT: vcmpunordss %xmm1, %xmm1, %xmm22234; AVX1-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm02235; AVX1-NEXT: callq __truncsfbf2@PLT2236; AVX1-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill2237; AVX1-NEXT: shll $16, %r15d2238; AVX1-NEXT: vmovd %r15d, %xmm02239; AVX1-NEXT: shll $16, %ebp2240; AVX1-NEXT: vmovd %ebp, %xmm22241; AVX1-NEXT: js .LBB34_102242; AVX1-NEXT: # %bb.11:2243; AVX1-NEXT: vmovdqa %xmm2, %xmm12244; AVX1-NEXT: jmp .LBB34_122245; AVX1-NEXT: .LBB34_10:2246; AVX1-NEXT: vmovdqa %xmm0, %xmm12247; AVX1-NEXT: vmovdqa %xmm2, %xmm02248; AVX1-NEXT: .LBB34_12:2249; AVX1-NEXT: vmaxss %xmm1, %xmm0, %xmm12250; AVX1-NEXT: vcmpunordss %xmm1, %xmm1, %xmm22251; AVX1-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm02252; AVX1-NEXT: callq __truncsfbf2@PLT2253; AVX1-NEXT: vmovdqa (%rsp), %xmm1 # 16-byte Reload2254; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]2255; AVX1-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload2256; AVX1-NEXT: vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload2257; AVX1-NEXT: # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]2258; AVX1-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero2259; AVX1-NEXT: addq $56, %rsp2260; AVX1-NEXT: popq %rbx2261; AVX1-NEXT: popq %r122262; AVX1-NEXT: popq %r132263; AVX1-NEXT: popq %r142264; AVX1-NEXT: popq %r152265; AVX1-NEXT: popq %rbp2266; AVX1-NEXT: retq2267;2268; AVX512-LABEL: test_fmaximumnum_v4bf16:2269; AVX512: # %bb.0:2270; AVX512-NEXT: pushq %rbp2271; AVX512-NEXT: pushq %r152272; AVX512-NEXT: pushq %r142273; AVX512-NEXT: pushq %r132274; AVX512-NEXT: pushq %r122275; AVX512-NEXT: pushq %rbx2276; AVX512-NEXT: pushq %rax2277; AVX512-NEXT: vmovq %xmm1, %r132278; AVX512-NEXT: movq %r13, %rbx2279; AVX512-NEXT: shrq $32, %rbx2280; AVX512-NEXT: vmovq %xmm0, %rbp2281; AVX512-NEXT: movq %rbp, %r142282; AVX512-NEXT: shrq $32, %r142283; AVX512-NEXT: movq %r13, %r152284; AVX512-NEXT: shrq $48, %r152285; AVX512-NEXT: movq %rbp, %r122286; AVX512-NEXT: shrq $48, %r122287; AVX512-NEXT: movl %ebp, %eax2288; AVX512-NEXT: andl $-65536, %eax # imm = 0xFFFF00002289; AVX512-NEXT: sets %cl2290; AVX512-NEXT: kmovw %ecx, %k12291; AVX512-NEXT: movl %r13d, %ecx2292; AVX512-NEXT: andl $-65536, %ecx # imm = 0xFFFF00002293; AVX512-NEXT: vmovd %ecx, %xmm12294; AVX512-NEXT: vmovd %eax, %xmm02295; AVX512-NEXT: vmovdqa %xmm0, %xmm22296; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}2297; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}2298; AVX512-NEXT: vmaxss %xmm2, %xmm1, %xmm02299; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k12300; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}2301; AVX512-NEXT: callq __truncsfbf2@PLT2302; AVX512-NEXT: vpextrw $0, %xmm0, {{[0-9]+}}(%rsp)2303; AVX512-NEXT: shll $16, %ebp2304; AVX512-NEXT: sets %al2305; AVX512-NEXT: kmovw %eax, %k12306; AVX512-NEXT: shll $16, %r13d2307; AVX512-NEXT: vmovd %r13d, %xmm12308; AVX512-NEXT: vmovd %ebp, %xmm02309; AVX512-NEXT: vmovdqa %xmm0, %xmm22310; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}2311; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}2312; AVX512-NEXT: vmaxss %xmm2, %xmm1, %xmm02313; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k12314; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}2315; AVX512-NEXT: callq __truncsfbf2@PLT2316; AVX512-NEXT: vpextrw $0, %xmm0, (%rsp)2317; AVX512-NEXT: shll $16, %r12d2318; AVX512-NEXT: sets %al2319; AVX512-NEXT: kmovw %eax, %k12320; AVX512-NEXT: shll $16, %r15d2321; AVX512-NEXT: vmovd %r15d, %xmm12322; AVX512-NEXT: vmovd %r12d, %xmm02323; AVX512-NEXT: vmovdqa %xmm0, %xmm22324; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}2325; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}2326; AVX512-NEXT: vmaxss %xmm2, %xmm1, %xmm02327; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k12328; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}2329; AVX512-NEXT: callq __truncsfbf2@PLT2330; AVX512-NEXT: vpextrw $0, %xmm0, {{[0-9]+}}(%rsp)2331; AVX512-NEXT: shll $16, %r14d2332; AVX512-NEXT: sets %al2333; AVX512-NEXT: kmovw %eax, %k12334; AVX512-NEXT: shll $16, %ebx2335; AVX512-NEXT: vmovd %ebx, %xmm12336; AVX512-NEXT: vmovd %r14d, %xmm02337; AVX512-NEXT: vmovdqa %xmm0, %xmm22338; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}2339; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}2340; AVX512-NEXT: vmaxss %xmm2, %xmm1, %xmm02341; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k12342; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}2343; AVX512-NEXT: callq __truncsfbf2@PLT2344; AVX512-NEXT: vpextrw $0, %xmm0, {{[0-9]+}}(%rsp)2345; AVX512-NEXT: vmovaps (%rsp), %xmm02346; AVX512-NEXT: addq $8, %rsp2347; AVX512-NEXT: popq %rbx2348; AVX512-NEXT: popq %r122349; AVX512-NEXT: popq %r132350; AVX512-NEXT: popq %r142351; AVX512-NEXT: popq %r152352; AVX512-NEXT: popq %rbp2353; AVX512-NEXT: retq2354;2355; AVX10_2-LABEL: test_fmaximumnum_v4bf16:2356; AVX10_2: # %bb.0:2357; AVX10_2-NEXT: vminmaxbf16 $17, %xmm1, %xmm0, %xmm02358; AVX10_2-NEXT: retq2359;2360; X86-LABEL: test_fmaximumnum_v4bf16:2361; X86: # %bb.0:2362; X86-NEXT: pushl %ebp2363; X86-NEXT: pushl %ebx2364; X86-NEXT: pushl %edi2365; X86-NEXT: pushl %esi2366; X86-NEXT: subl $68, %esp2367; X86-NEXT: vpsrlq $48, %xmm0, %xmm22368; X86-NEXT: vpsrlq $48, %xmm1, %xmm32369; X86-NEXT: vmovshdup {{.*#+}} xmm4 = xmm0[1,1,3,3]2370; X86-NEXT: vpextrw $0, %xmm4, %esi2371; X86-NEXT: vmovshdup {{.*#+}} xmm4 = xmm1[1,1,3,3]2372; X86-NEXT: vpextrw $0, %xmm4, %ebx2373; X86-NEXT: vpextrw $0, %xmm0, %eax2374; X86-NEXT: vpextrw $0, %xmm1, %ecx2375; X86-NEXT: vpsrld $16, %xmm0, %xmm02376; X86-NEXT: vpextrw $0, %xmm0, %edx2377; X86-NEXT: vpsrld $16, %xmm1, %xmm02378; X86-NEXT: vpextrw $0, %xmm0, %edi2379; X86-NEXT: shll $16, %edi2380; X86-NEXT: vmovd %edi, %xmm02381; X86-NEXT: shll $16, %edx2382; X86-NEXT: vmovd %edx, %xmm42383; X86-NEXT: js .LBB34_12384; X86-NEXT: # %bb.2:2385; X86-NEXT: vmovdqa %xmm4, %xmm12386; X86-NEXT: jmp .LBB34_32387; X86-NEXT: .LBB34_1:2388; X86-NEXT: vmovdqa %xmm0, %xmm12389; X86-NEXT: vmovdqa %xmm4, %xmm02390; X86-NEXT: .LBB34_3:2391; X86-NEXT: vpextrw $0, %xmm2, %edi2392; X86-NEXT: vpextrw $0, %xmm3, %ebp2393; X86-NEXT: vmaxss %xmm1, %xmm0, %xmm12394; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm22395; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm02396; X86-NEXT: vmovss %xmm0, (%esp)2397; X86-NEXT: shll $16, %ecx2398; X86-NEXT: vmovd %ecx, %xmm02399; X86-NEXT: shll $16, %eax2400; X86-NEXT: vmovd %eax, %xmm22401; X86-NEXT: js .LBB34_42402; X86-NEXT: # %bb.5:2403; X86-NEXT: vmovdqa %xmm2, %xmm12404; X86-NEXT: jmp .LBB34_62405; X86-NEXT: .LBB34_4:2406; X86-NEXT: vmovdqa %xmm0, %xmm12407; X86-NEXT: vmovdqa %xmm2, %xmm02408; X86-NEXT: .LBB34_6:2409; X86-NEXT: vmaxss %xmm1, %xmm0, %xmm12410; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm22411; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm02412; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill2413; X86-NEXT: calll __truncsfbf22414; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill2415; X86-NEXT: vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload2416; X86-NEXT: vmovss %xmm0, (%esp)2417; X86-NEXT: shll $16, %ebx2418; X86-NEXT: vmovd %ebx, %xmm02419; X86-NEXT: shll $16, %esi2420; X86-NEXT: vmovd %esi, %xmm22421; X86-NEXT: js .LBB34_72422; X86-NEXT: # %bb.8:2423; X86-NEXT: vmovdqa %xmm2, %xmm12424; X86-NEXT: jmp .LBB34_92425; X86-NEXT: .LBB34_7:2426; X86-NEXT: vmovdqa %xmm0, %xmm12427; X86-NEXT: vmovdqa %xmm2, %xmm02428; X86-NEXT: .LBB34_9:2429; X86-NEXT: vmaxss %xmm1, %xmm0, %xmm12430; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm22431; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm02432; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill2433; X86-NEXT: calll __truncsfbf22434; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill2435; X86-NEXT: vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload2436; X86-NEXT: vmovss %xmm0, (%esp)2437; X86-NEXT: shll $16, %ebp2438; X86-NEXT: vmovd %ebp, %xmm02439; X86-NEXT: shll $16, %edi2440; X86-NEXT: vmovd %edi, %xmm22441; X86-NEXT: js .LBB34_102442; X86-NEXT: # %bb.11:2443; X86-NEXT: vmovdqa %xmm2, %xmm12444; X86-NEXT: jmp .LBB34_122445; X86-NEXT: .LBB34_10:2446; X86-NEXT: vmovdqa %xmm0, %xmm12447; X86-NEXT: vmovdqa %xmm2, %xmm02448; X86-NEXT: .LBB34_12:2449; X86-NEXT: vmaxss %xmm1, %xmm0, %xmm12450; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm22451; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm02452; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill2453; X86-NEXT: calll __truncsfbf22454; X86-NEXT: vmovups %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill2455; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload2456; X86-NEXT: vmovd %xmm0, (%esp)2457; X86-NEXT: calll __truncsfbf22458; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload2459; X86-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]2460; X86-NEXT: vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload2461; X86-NEXT: vpunpcklwd {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload2462; X86-NEXT: # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]2463; X86-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero2464; X86-NEXT: addl $68, %esp2465; X86-NEXT: popl %esi2466; X86-NEXT: popl %edi2467; X86-NEXT: popl %ebx2468; X86-NEXT: popl %ebp2469; X86-NEXT: retl2470 %r = call <4 x bfloat> @llvm.maximumnum.v4bf16(<4 x bfloat> %x, <4 x bfloat> %y)2471 ret <4 x bfloat> %r2472}2473 2474; nnan minimumnum(Y, +inf) -> Y2475define float @test_fminimumnum_inf_nnan(float %x, float %y) nounwind {2476; SSE2-LABEL: test_fminimumnum_inf_nnan:2477; SSE2: # %bb.0:2478; SSE2-NEXT: movaps %xmm1, %xmm02479; SSE2-NEXT: retq2480;2481; AVX-LABEL: test_fminimumnum_inf_nnan:2482; AVX: # %bb.0:2483; AVX-NEXT: vmovaps %xmm1, %xmm02484; AVX-NEXT: retq2485;2486; AVX10_2-LABEL: test_fminimumnum_inf_nnan:2487; AVX10_2: # %bb.0:2488; AVX10_2-NEXT: vmovaps %xmm1, %xmm02489; AVX10_2-NEXT: retq2490;2491; X86-LABEL: test_fminimumnum_inf_nnan:2492; X86: # %bb.0:2493; X86-NEXT: flds {{[0-9]+}}(%esp)2494; X86-NEXT: retl2495 %1 = call nnan float @llvm.minimumnum.f32(float %y, float 0x7ff0000000000000)2496 ret float %12497}2498 2499; nnan maximumnum(Y, -inf) -> Y2500define float @test_fmaximumnum_neg_inf_nnan(float %x, float %y) nounwind {2501; SSE2-LABEL: test_fmaximumnum_neg_inf_nnan:2502; SSE2: # %bb.0:2503; SSE2-NEXT: movaps %xmm1, %xmm02504; SSE2-NEXT: retq2505;2506; AVX-LABEL: test_fmaximumnum_neg_inf_nnan:2507; AVX: # %bb.0:2508; AVX-NEXT: vmovaps %xmm1, %xmm02509; AVX-NEXT: retq2510;2511; AVX10_2-LABEL: test_fmaximumnum_neg_inf_nnan:2512; AVX10_2: # %bb.0:2513; AVX10_2-NEXT: vmovaps %xmm1, %xmm02514; AVX10_2-NEXT: retq2515;2516; X86-LABEL: test_fmaximumnum_neg_inf_nnan:2517; X86: # %bb.0:2518; X86-NEXT: flds {{[0-9]+}}(%esp)2519; X86-NEXT: retl2520 %1 = call nnan float @llvm.maximumnum.f32(float %y, float 0xfff0000000000000)2521 ret float %12522}2523 2524; Test we propagate the non-NaN arg, even if one arg is SNaN2525define float @test_fmaximumnum_snan(float %x, float %y) {2526; SSE2-LABEL: test_fmaximumnum_snan:2527; SSE2: # %bb.0:2528; SSE2-NEXT: movaps %xmm1, %xmm02529; SSE2-NEXT: retq2530;2531; AVX-LABEL: test_fmaximumnum_snan:2532; AVX: # %bb.0:2533; AVX-NEXT: vmovaps %xmm1, %xmm02534; AVX-NEXT: retq2535;2536; AVX10_2-LABEL: test_fmaximumnum_snan:2537; AVX10_2: # %bb.0:2538; AVX10_2-NEXT: vmovaps %xmm1, %xmm02539; AVX10_2-NEXT: retq2540;2541; X86-LABEL: test_fmaximumnum_snan:2542; X86: # %bb.0:2543; X86-NEXT: flds {{[0-9]+}}(%esp)2544; X86-NEXT: retl2545 %1 = tail call float @llvm.maximumnum.f32(float 0x7ff4000000000000, float %y)2546 ret float %12547}2548 2549define float @test_fminimumnum_snan(float %x, float %y) {2550; SSE2-LABEL: test_fminimumnum_snan:2551; SSE2: # %bb.0:2552; SSE2-NEXT: movaps %xmm1, %xmm02553; SSE2-NEXT: retq2554;2555; AVX-LABEL: test_fminimumnum_snan:2556; AVX: # %bb.0:2557; AVX-NEXT: vmovaps %xmm1, %xmm02558; AVX-NEXT: retq2559;2560; AVX10_2-LABEL: test_fminimumnum_snan:2561; AVX10_2: # %bb.0:2562; AVX10_2-NEXT: vmovaps %xmm1, %xmm02563; AVX10_2-NEXT: retq2564;2565; X86-LABEL: test_fminimumnum_snan:2566; X86: # %bb.0:2567; X86-NEXT: flds {{[0-9]+}}(%esp)2568; X86-NEXT: retl2569 %1 = tail call float @llvm.minimumnum.f32(float 0x7ff4000000000000, float %y)2570 ret float %12571}2572