brintos

brintos / llvm-project-archived public Read only

0
0
Text · 92.1 KiB · aae6cda Raw
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