brintos

brintos / llvm-project-archived public Read only

0
0
Text · 103.6 KiB · 5d69a21 Raw
3240 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -O3 -mtriple=i686-pc-linux -mattr=+cmov < %s | FileCheck %s --check-prefix=X873; RUN: llc -O3 -mtriple=i686-pc-linux -mattr=sse2 < %s | FileCheck %s --check-prefix=X86-SSE4; RUN: llc -O3 -mtriple=x86_64-pc-linux < %s | FileCheck %s --check-prefix=SSE5; RUN: llc -O3 -mtriple=x86_64-pc-linux -mattr=+avx < %s | FileCheck %s --check-prefixes=AVX,AVX16; RUN: llc -O3 -mtriple=x86_64-pc-linux -mattr=+avx512f < %s | FileCheck %s --check-prefixes=AVX,AVX5127; RUN: llc -O3 -mtriple=x86_64-pc-linux -mattr=+avx512dq < %s | FileCheck %s --check-prefixes=AVX,AVX5128 9; Verify that constants aren't folded to inexact results when the rounding mode10; is unknown.11;12; double f1() {13;   // Because 0.1 cannot be represented exactly, this shouldn't be folded.14;   return 1.0/10.0;15; }16;17define double @f1() #0 {18; X87-LABEL: f1:19; X87:       # %bb.0: # %entry20; X87-NEXT:    fld121; X87-NEXT:    fdivs {{\.?LCPI[0-9]+_[0-9]+}}22; X87-NEXT:    wait23; X87-NEXT:    retl24;25; X86-SSE-LABEL: f1:26; X86-SSE:       # %bb.0: # %entry27; X86-SSE-NEXT:    subl $12, %esp28; X86-SSE-NEXT:    .cfi_def_cfa_offset 1629; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]30; X86-SSE-NEXT:    divsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm031; X86-SSE-NEXT:    movsd %xmm0, (%esp)32; X86-SSE-NEXT:    fldl (%esp)33; X86-SSE-NEXT:    wait34; X86-SSE-NEXT:    addl $12, %esp35; X86-SSE-NEXT:    .cfi_def_cfa_offset 436; X86-SSE-NEXT:    retl37;38; SSE-LABEL: f1:39; SSE:       # %bb.0: # %entry40; SSE-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]41; SSE-NEXT:    divsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm042; SSE-NEXT:    retq43;44; AVX-LABEL: f1:45; AVX:       # %bb.0: # %entry46; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]47; AVX-NEXT:    vdivsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm048; AVX-NEXT:    retq49entry:50  %div = call double @llvm.experimental.constrained.fdiv.f64(51                                               double 1.000000e+00,52                                               double 1.000000e+01,53                                               metadata !"round.dynamic",54                                               metadata !"fpexcept.strict") #055  ret double %div56}57 58; Verify that 'a - 0' isn't simplified to 'a' when the rounding mode is unknown.59;60; double f2(double a) {61;   // Because the result of '0 - 0' is negative zero if rounding mode is62;   // downward, this shouldn't be simplified.63;   return a - 0;64; }65;66define double @f2(double %a) #0 {67; X87-LABEL: f2:68; X87:       # %bb.0: # %entry69; X87-NEXT:    fldz70; X87-NEXT:    fsubrl {{[0-9]+}}(%esp)71; X87-NEXT:    wait72; X87-NEXT:    retl73;74; X86-SSE-LABEL: f2:75; X86-SSE:       # %bb.0: # %entry76; X86-SSE-NEXT:    subl $12, %esp77; X86-SSE-NEXT:    .cfi_def_cfa_offset 1678; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero79; X86-SSE-NEXT:    xorpd %xmm1, %xmm180; X86-SSE-NEXT:    subsd %xmm1, %xmm081; X86-SSE-NEXT:    movsd %xmm0, (%esp)82; X86-SSE-NEXT:    fldl (%esp)83; X86-SSE-NEXT:    wait84; X86-SSE-NEXT:    addl $12, %esp85; X86-SSE-NEXT:    .cfi_def_cfa_offset 486; X86-SSE-NEXT:    retl87;88; SSE-LABEL: f2:89; SSE:       # %bb.0: # %entry90; SSE-NEXT:    xorpd %xmm1, %xmm191; SSE-NEXT:    subsd %xmm1, %xmm092; SSE-NEXT:    retq93;94; AVX-LABEL: f2:95; AVX:       # %bb.0: # %entry96; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm197; AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm098; AVX-NEXT:    retq99entry:100  %sub = call double @llvm.experimental.constrained.fsub.f64(101                                               double %a,102                                               double 0.000000e+00,103                                               metadata !"round.dynamic",104                                               metadata !"fpexcept.strict") #0105  ret double %sub106}107 108; Verify that '-((-a)*b)' isn't simplified to 'a*b' when the rounding mode is109; unknown.110;111; double f3(double a, double b) {112;   // Because the intermediate value involved in this calculation may require113;   // rounding, this shouldn't be simplified.114;   return -((-a)*b);115; }116;117define double @f3(double %a, double %b) #0 {118; X87-LABEL: f3:119; X87:       # %bb.0: # %entry120; X87-NEXT:    fldz121; X87-NEXT:    fchs122; X87-NEXT:    fld %st(0)123; X87-NEXT:    fsubl {{[0-9]+}}(%esp)124; X87-NEXT:    fmull {{[0-9]+}}(%esp)125; X87-NEXT:    fsubrp %st, %st(1)126; X87-NEXT:    wait127; X87-NEXT:    retl128;129; X86-SSE-LABEL: f3:130; X86-SSE:       # %bb.0: # %entry131; X86-SSE-NEXT:    subl $12, %esp132; X86-SSE-NEXT:    .cfi_def_cfa_offset 16133; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]134; X86-SSE-NEXT:    movapd %xmm0, %xmm1135; X86-SSE-NEXT:    subsd {{[0-9]+}}(%esp), %xmm1136; X86-SSE-NEXT:    mulsd {{[0-9]+}}(%esp), %xmm1137; X86-SSE-NEXT:    subsd %xmm1, %xmm0138; X86-SSE-NEXT:    movsd %xmm0, (%esp)139; X86-SSE-NEXT:    fldl (%esp)140; X86-SSE-NEXT:    wait141; X86-SSE-NEXT:    addl $12, %esp142; X86-SSE-NEXT:    .cfi_def_cfa_offset 4143; X86-SSE-NEXT:    retl144;145; SSE-LABEL: f3:146; SSE:       # %bb.0: # %entry147; SSE-NEXT:    movsd {{.*#+}} xmm2 = [-0.0E+0,0.0E+0]148; SSE-NEXT:    movapd %xmm2, %xmm3149; SSE-NEXT:    subsd %xmm0, %xmm3150; SSE-NEXT:    mulsd %xmm1, %xmm3151; SSE-NEXT:    subsd %xmm3, %xmm2152; SSE-NEXT:    movapd %xmm2, %xmm0153; SSE-NEXT:    retq154;155; AVX-LABEL: f3:156; AVX:       # %bb.0: # %entry157; AVX-NEXT:    vmovsd {{.*#+}} xmm2 = [-0.0E+0,0.0E+0]158; AVX-NEXT:    vsubsd %xmm0, %xmm2, %xmm0159; AVX-NEXT:    vmulsd %xmm1, %xmm0, %xmm0160; AVX-NEXT:    vsubsd %xmm0, %xmm2, %xmm0161; AVX-NEXT:    retq162entry:163  %sub = call double @llvm.experimental.constrained.fsub.f64(164                                               double -0.000000e+00, double %a,165                                               metadata !"round.dynamic",166                                               metadata !"fpexcept.strict") #0167  %mul = call double @llvm.experimental.constrained.fmul.f64(168                                               double %sub, double %b,169                                               metadata !"round.dynamic",170                                               metadata !"fpexcept.strict") #0171  %ret = call double @llvm.experimental.constrained.fsub.f64(172                                               double -0.000000e+00,173                                               double %mul,174                                               metadata !"round.dynamic",175                                               metadata !"fpexcept.strict") #0176  ret double %ret177}178 179; Verify that FP operations are not performed speculatively when FP exceptions180; are not being ignored.181;182; double f4(int n, double a) {183;   // Because a + 1 may overflow, this should not be simplified.184;   if (n > 0)185;     return a + 1.0;186;   return a;187; }188;189;190define double @f4(i32 %n, double %a) #0 {191; X87-LABEL: f4:192; X87:       # %bb.0: # %entry193; X87-NEXT:    fldl {{[0-9]+}}(%esp)194; X87-NEXT:    wait195; X87-NEXT:    cmpl $0, {{[0-9]+}}(%esp)196; X87-NEXT:    jle .LBB3_2197; X87-NEXT:  # %bb.1: # %if.then198; X87-NEXT:    fld1199; X87-NEXT:    faddp %st, %st(1)200; X87-NEXT:    wait201; X87-NEXT:  .LBB3_2: # %if.end202; X87-NEXT:    retl203;204; X86-SSE-LABEL: f4:205; X86-SSE:       # %bb.0: # %entry206; X86-SSE-NEXT:    subl $12, %esp207; X86-SSE-NEXT:    .cfi_def_cfa_offset 16208; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero209; X86-SSE-NEXT:    cmpl $0, {{[0-9]+}}(%esp)210; X86-SSE-NEXT:    jle .LBB3_2211; X86-SSE-NEXT:  # %bb.1: # %if.then212; X86-SSE-NEXT:    addsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0213; X86-SSE-NEXT:  .LBB3_2: # %if.end214; X86-SSE-NEXT:    movsd %xmm0, (%esp)215; X86-SSE-NEXT:    fldl (%esp)216; X86-SSE-NEXT:    wait217; X86-SSE-NEXT:    addl $12, %esp218; X86-SSE-NEXT:    .cfi_def_cfa_offset 4219; X86-SSE-NEXT:    retl220;221; SSE-LABEL: f4:222; SSE:       # %bb.0: # %entry223; SSE-NEXT:    testl %edi, %edi224; SSE-NEXT:    jle .LBB3_2225; SSE-NEXT:  # %bb.1: # %if.then226; SSE-NEXT:    addsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0227; SSE-NEXT:  .LBB3_2: # %if.end228; SSE-NEXT:    retq229;230; AVX-LABEL: f4:231; AVX:       # %bb.0: # %entry232; AVX-NEXT:    testl %edi, %edi233; AVX-NEXT:    jle .LBB3_2234; AVX-NEXT:  # %bb.1: # %if.then235; AVX-NEXT:    vaddsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0236; AVX-NEXT:  .LBB3_2: # %if.end237; AVX-NEXT:    retq238entry:239  %cmp = icmp sgt i32 %n, 0240  br i1 %cmp, label %if.then, label %if.end241 242if.then:243  %add = call double @llvm.experimental.constrained.fadd.f64(244                                               double 1.000000e+00, double %a,245                                               metadata !"round.dynamic",246                                               metadata !"fpexcept.strict") #0247  br label %if.end248 249if.end:250  %a.0 = phi double [%add, %if.then], [ %a, %entry ]251  ret double %a.0252}253 254; Verify that sqrt(42.0) isn't simplified when the rounding mode is unknown.255define double @f5() #0 {256; X87-LABEL: f5:257; X87:       # %bb.0: # %entry258; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}259; X87-NEXT:    fsqrt260; X87-NEXT:    wait261; X87-NEXT:    retl262;263; X86-SSE-LABEL: f5:264; X86-SSE:       # %bb.0: # %entry265; X86-SSE-NEXT:    subl $12, %esp266; X86-SSE-NEXT:    .cfi_def_cfa_offset 16267; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]268; X86-SSE-NEXT:    sqrtsd %xmm0, %xmm0269; X86-SSE-NEXT:    movsd %xmm0, (%esp)270; X86-SSE-NEXT:    fldl (%esp)271; X86-SSE-NEXT:    wait272; X86-SSE-NEXT:    addl $12, %esp273; X86-SSE-NEXT:    .cfi_def_cfa_offset 4274; X86-SSE-NEXT:    retl275;276; SSE-LABEL: f5:277; SSE:       # %bb.0: # %entry278; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]279; SSE-NEXT:    sqrtsd %xmm0, %xmm0280; SSE-NEXT:    retq281;282; AVX-LABEL: f5:283; AVX:       # %bb.0: # %entry284; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]285; AVX-NEXT:    vsqrtsd %xmm0, %xmm0, %xmm0286; AVX-NEXT:    retq287entry:288  %result = call double @llvm.experimental.constrained.sqrt.f64(double 42.0,289                                               metadata !"round.dynamic",290                                               metadata !"fpexcept.strict") #0291  ret double %result292}293 294; Verify that pow(42.1, 3.0) isn't simplified when the rounding mode is unknown.295define double @f6() #0 {296; X87-LABEL: f6:297; X87:       # %bb.0: # %entry298; X87-NEXT:    subl $28, %esp299; X87-NEXT:    .cfi_def_cfa_offset 32300; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}301; X87-NEXT:    fstpl {{[0-9]+}}(%esp)302; X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}303; X87-NEXT:    fstpl (%esp)304; X87-NEXT:    wait305; X87-NEXT:    calll pow306; X87-NEXT:    addl $28, %esp307; X87-NEXT:    .cfi_def_cfa_offset 4308; X87-NEXT:    retl309;310; X86-SSE-LABEL: f6:311; X86-SSE:       # %bb.0: # %entry312; X86-SSE-NEXT:    subl $28, %esp313; X86-SSE-NEXT:    .cfi_def_cfa_offset 32314; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [3.0E+0,0.0E+0]315; X86-SSE-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)316; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]317; X86-SSE-NEXT:    movsd %xmm0, (%esp)318; X86-SSE-NEXT:    calll pow319; X86-SSE-NEXT:    addl $28, %esp320; X86-SSE-NEXT:    .cfi_def_cfa_offset 4321; X86-SSE-NEXT:    retl322;323; SSE-LABEL: f6:324; SSE:       # %bb.0: # %entry325; SSE-NEXT:    pushq %rax326; SSE-NEXT:    .cfi_def_cfa_offset 16327; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]328; SSE-NEXT:    movsd {{.*#+}} xmm1 = [3.0E+0,0.0E+0]329; SSE-NEXT:    callq pow@PLT330; SSE-NEXT:    popq %rax331; SSE-NEXT:    .cfi_def_cfa_offset 8332; SSE-NEXT:    retq333;334; AVX-LABEL: f6:335; AVX:       # %bb.0: # %entry336; AVX-NEXT:    pushq %rax337; AVX-NEXT:    .cfi_def_cfa_offset 16338; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]339; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = [3.0E+0,0.0E+0]340; AVX-NEXT:    callq pow@PLT341; AVX-NEXT:    popq %rax342; AVX-NEXT:    .cfi_def_cfa_offset 8343; AVX-NEXT:    retq344entry:345  %result = call double @llvm.experimental.constrained.pow.f64(double 42.1,346                                               double 3.0,347                                               metadata !"round.dynamic",348                                               metadata !"fpexcept.strict") #0349  ret double %result350}351 352; Verify that powi(42.1, 3) isn't simplified when the rounding mode is unknown.353define double @f7() #0 {354; X87-LABEL: f7:355; X87:       # %bb.0: # %entry356; X87-NEXT:    subl $12, %esp357; X87-NEXT:    .cfi_def_cfa_offset 16358; X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}359; X87-NEXT:    fstpl (%esp)360; X87-NEXT:    wait361; X87-NEXT:    movl $3, {{[0-9]+}}(%esp)362; X87-NEXT:    calll __powidf2363; X87-NEXT:    addl $12, %esp364; X87-NEXT:    .cfi_def_cfa_offset 4365; X87-NEXT:    retl366;367; X86-SSE-LABEL: f7:368; X86-SSE:       # %bb.0: # %entry369; X86-SSE-NEXT:    subl $12, %esp370; X86-SSE-NEXT:    .cfi_def_cfa_offset 16371; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]372; X86-SSE-NEXT:    movsd %xmm0, (%esp)373; X86-SSE-NEXT:    movl $3, {{[0-9]+}}(%esp)374; X86-SSE-NEXT:    calll __powidf2375; X86-SSE-NEXT:    addl $12, %esp376; X86-SSE-NEXT:    .cfi_def_cfa_offset 4377; X86-SSE-NEXT:    retl378;379; SSE-LABEL: f7:380; SSE:       # %bb.0: # %entry381; SSE-NEXT:    pushq %rax382; SSE-NEXT:    .cfi_def_cfa_offset 16383; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]384; SSE-NEXT:    movl $3, %edi385; SSE-NEXT:    callq __powidf2@PLT386; SSE-NEXT:    popq %rax387; SSE-NEXT:    .cfi_def_cfa_offset 8388; SSE-NEXT:    retq389;390; AVX-LABEL: f7:391; AVX:       # %bb.0: # %entry392; AVX-NEXT:    pushq %rax393; AVX-NEXT:    .cfi_def_cfa_offset 16394; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]395; AVX-NEXT:    movl $3, %edi396; AVX-NEXT:    callq __powidf2@PLT397; AVX-NEXT:    popq %rax398; AVX-NEXT:    .cfi_def_cfa_offset 8399; AVX-NEXT:    retq400entry:401  %result = call double @llvm.experimental.constrained.powi.f64(double 42.1,402                                               i32 3,403                                               metadata !"round.dynamic",404                                               metadata !"fpexcept.strict") #0405  ret double %result406}407 408; Verify that sin(42.0) isn't simplified when the rounding mode is unknown.409define double @f8() #0 {410; X87-LABEL: f8:411; X87:       # %bb.0: # %entry412; X87-NEXT:    subl $12, %esp413; X87-NEXT:    .cfi_def_cfa_offset 16414; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}415; X87-NEXT:    fstpl (%esp)416; X87-NEXT:    wait417; X87-NEXT:    calll sin418; X87-NEXT:    addl $12, %esp419; X87-NEXT:    .cfi_def_cfa_offset 4420; X87-NEXT:    retl421;422; X86-SSE-LABEL: f8:423; X86-SSE:       # %bb.0: # %entry424; X86-SSE-NEXT:    subl $12, %esp425; X86-SSE-NEXT:    .cfi_def_cfa_offset 16426; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]427; X86-SSE-NEXT:    movsd %xmm0, (%esp)428; X86-SSE-NEXT:    calll sin429; X86-SSE-NEXT:    addl $12, %esp430; X86-SSE-NEXT:    .cfi_def_cfa_offset 4431; X86-SSE-NEXT:    retl432;433; SSE-LABEL: f8:434; SSE:       # %bb.0: # %entry435; SSE-NEXT:    pushq %rax436; SSE-NEXT:    .cfi_def_cfa_offset 16437; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]438; SSE-NEXT:    callq sin@PLT439; SSE-NEXT:    popq %rax440; SSE-NEXT:    .cfi_def_cfa_offset 8441; SSE-NEXT:    retq442;443; AVX-LABEL: f8:444; AVX:       # %bb.0: # %entry445; AVX-NEXT:    pushq %rax446; AVX-NEXT:    .cfi_def_cfa_offset 16447; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]448; AVX-NEXT:    callq sin@PLT449; AVX-NEXT:    popq %rax450; AVX-NEXT:    .cfi_def_cfa_offset 8451; AVX-NEXT:    retq452entry:453  %result = call double @llvm.experimental.constrained.sin.f64(double 42.0,454                                               metadata !"round.dynamic",455                                               metadata !"fpexcept.strict") #0456  ret double %result457}458 459; Verify that cos(42.0) isn't simplified when the rounding mode is unknown.460define double @f9() #0 {461; X87-LABEL: f9:462; X87:       # %bb.0: # %entry463; X87-NEXT:    subl $12, %esp464; X87-NEXT:    .cfi_def_cfa_offset 16465; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}466; X87-NEXT:    fstpl (%esp)467; X87-NEXT:    wait468; X87-NEXT:    calll cos469; X87-NEXT:    addl $12, %esp470; X87-NEXT:    .cfi_def_cfa_offset 4471; X87-NEXT:    retl472;473; X86-SSE-LABEL: f9:474; X86-SSE:       # %bb.0: # %entry475; X86-SSE-NEXT:    subl $12, %esp476; X86-SSE-NEXT:    .cfi_def_cfa_offset 16477; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]478; X86-SSE-NEXT:    movsd %xmm0, (%esp)479; X86-SSE-NEXT:    calll cos480; X86-SSE-NEXT:    addl $12, %esp481; X86-SSE-NEXT:    .cfi_def_cfa_offset 4482; X86-SSE-NEXT:    retl483;484; SSE-LABEL: f9:485; SSE:       # %bb.0: # %entry486; SSE-NEXT:    pushq %rax487; SSE-NEXT:    .cfi_def_cfa_offset 16488; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]489; SSE-NEXT:    callq cos@PLT490; SSE-NEXT:    popq %rax491; SSE-NEXT:    .cfi_def_cfa_offset 8492; SSE-NEXT:    retq493;494; AVX-LABEL: f9:495; AVX:       # %bb.0: # %entry496; AVX-NEXT:    pushq %rax497; AVX-NEXT:    .cfi_def_cfa_offset 16498; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]499; AVX-NEXT:    callq cos@PLT500; AVX-NEXT:    popq %rax501; AVX-NEXT:    .cfi_def_cfa_offset 8502; AVX-NEXT:    retq503entry:504  %result = call double @llvm.experimental.constrained.cos.f64(double 42.0,505                                               metadata !"round.dynamic",506                                               metadata !"fpexcept.strict") #0507  ret double %result508}509 510; Verify that exp(42.0) isn't simplified when the rounding mode is unknown.511define double @f10() #0 {512; X87-LABEL: f10:513; X87:       # %bb.0: # %entry514; X87-NEXT:    subl $12, %esp515; X87-NEXT:    .cfi_def_cfa_offset 16516; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}517; X87-NEXT:    fstpl (%esp)518; X87-NEXT:    wait519; X87-NEXT:    calll exp520; X87-NEXT:    addl $12, %esp521; X87-NEXT:    .cfi_def_cfa_offset 4522; X87-NEXT:    retl523;524; X86-SSE-LABEL: f10:525; X86-SSE:       # %bb.0: # %entry526; X86-SSE-NEXT:    subl $12, %esp527; X86-SSE-NEXT:    .cfi_def_cfa_offset 16528; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]529; X86-SSE-NEXT:    movsd %xmm0, (%esp)530; X86-SSE-NEXT:    calll exp531; X86-SSE-NEXT:    addl $12, %esp532; X86-SSE-NEXT:    .cfi_def_cfa_offset 4533; X86-SSE-NEXT:    retl534;535; SSE-LABEL: f10:536; SSE:       # %bb.0: # %entry537; SSE-NEXT:    pushq %rax538; SSE-NEXT:    .cfi_def_cfa_offset 16539; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]540; SSE-NEXT:    callq exp@PLT541; SSE-NEXT:    popq %rax542; SSE-NEXT:    .cfi_def_cfa_offset 8543; SSE-NEXT:    retq544;545; AVX-LABEL: f10:546; AVX:       # %bb.0: # %entry547; AVX-NEXT:    pushq %rax548; AVX-NEXT:    .cfi_def_cfa_offset 16549; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]550; AVX-NEXT:    callq exp@PLT551; AVX-NEXT:    popq %rax552; AVX-NEXT:    .cfi_def_cfa_offset 8553; AVX-NEXT:    retq554entry:555  %result = call double @llvm.experimental.constrained.exp.f64(double 42.0,556                                               metadata !"round.dynamic",557                                               metadata !"fpexcept.strict") #0558  ret double %result559}560 561; Verify that exp2(42.1) isn't simplified when the rounding mode is unknown.562define double @f11() #0 {563; X87-LABEL: f11:564; X87:       # %bb.0: # %entry565; X87-NEXT:    subl $12, %esp566; X87-NEXT:    .cfi_def_cfa_offset 16567; X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}568; X87-NEXT:    fstpl (%esp)569; X87-NEXT:    wait570; X87-NEXT:    calll exp2571; X87-NEXT:    addl $12, %esp572; X87-NEXT:    .cfi_def_cfa_offset 4573; X87-NEXT:    retl574;575; X86-SSE-LABEL: f11:576; X86-SSE:       # %bb.0: # %entry577; X86-SSE-NEXT:    subl $12, %esp578; X86-SSE-NEXT:    .cfi_def_cfa_offset 16579; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]580; X86-SSE-NEXT:    movsd %xmm0, (%esp)581; X86-SSE-NEXT:    calll exp2582; X86-SSE-NEXT:    addl $12, %esp583; X86-SSE-NEXT:    .cfi_def_cfa_offset 4584; X86-SSE-NEXT:    retl585;586; SSE-LABEL: f11:587; SSE:       # %bb.0: # %entry588; SSE-NEXT:    pushq %rax589; SSE-NEXT:    .cfi_def_cfa_offset 16590; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]591; SSE-NEXT:    callq exp2@PLT592; SSE-NEXT:    popq %rax593; SSE-NEXT:    .cfi_def_cfa_offset 8594; SSE-NEXT:    retq595;596; AVX-LABEL: f11:597; AVX:       # %bb.0: # %entry598; AVX-NEXT:    pushq %rax599; AVX-NEXT:    .cfi_def_cfa_offset 16600; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]601; AVX-NEXT:    callq exp2@PLT602; AVX-NEXT:    popq %rax603; AVX-NEXT:    .cfi_def_cfa_offset 8604; AVX-NEXT:    retq605entry:606  %result = call double @llvm.experimental.constrained.exp2.f64(double 42.1,607                                               metadata !"round.dynamic",608                                               metadata !"fpexcept.strict") #0609  ret double %result610}611 612; Verify that log(42.0) isn't simplified when the rounding mode is unknown.613define double @f12() #0 {614; X87-LABEL: f12:615; X87:       # %bb.0: # %entry616; X87-NEXT:    subl $12, %esp617; X87-NEXT:    .cfi_def_cfa_offset 16618; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}619; X87-NEXT:    fstpl (%esp)620; X87-NEXT:    wait621; X87-NEXT:    calll log622; X87-NEXT:    addl $12, %esp623; X87-NEXT:    .cfi_def_cfa_offset 4624; X87-NEXT:    retl625;626; X86-SSE-LABEL: f12:627; X86-SSE:       # %bb.0: # %entry628; X86-SSE-NEXT:    subl $12, %esp629; X86-SSE-NEXT:    .cfi_def_cfa_offset 16630; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]631; X86-SSE-NEXT:    movsd %xmm0, (%esp)632; X86-SSE-NEXT:    calll log633; X86-SSE-NEXT:    addl $12, %esp634; X86-SSE-NEXT:    .cfi_def_cfa_offset 4635; X86-SSE-NEXT:    retl636;637; SSE-LABEL: f12:638; SSE:       # %bb.0: # %entry639; SSE-NEXT:    pushq %rax640; SSE-NEXT:    .cfi_def_cfa_offset 16641; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]642; SSE-NEXT:    callq log@PLT643; SSE-NEXT:    popq %rax644; SSE-NEXT:    .cfi_def_cfa_offset 8645; SSE-NEXT:    retq646;647; AVX-LABEL: f12:648; AVX:       # %bb.0: # %entry649; AVX-NEXT:    pushq %rax650; AVX-NEXT:    .cfi_def_cfa_offset 16651; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]652; AVX-NEXT:    callq log@PLT653; AVX-NEXT:    popq %rax654; AVX-NEXT:    .cfi_def_cfa_offset 8655; AVX-NEXT:    retq656entry:657  %result = call double @llvm.experimental.constrained.log.f64(double 42.0,658                                               metadata !"round.dynamic",659                                               metadata !"fpexcept.strict") #0660  ret double %result661}662 663; Verify that log10(42.0) isn't simplified when the rounding mode is unknown.664define double @f13() #0 {665; X87-LABEL: f13:666; X87:       # %bb.0: # %entry667; X87-NEXT:    subl $12, %esp668; X87-NEXT:    .cfi_def_cfa_offset 16669; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}670; X87-NEXT:    fstpl (%esp)671; X87-NEXT:    wait672; X87-NEXT:    calll log10673; X87-NEXT:    addl $12, %esp674; X87-NEXT:    .cfi_def_cfa_offset 4675; X87-NEXT:    retl676;677; X86-SSE-LABEL: f13:678; X86-SSE:       # %bb.0: # %entry679; X86-SSE-NEXT:    subl $12, %esp680; X86-SSE-NEXT:    .cfi_def_cfa_offset 16681; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]682; X86-SSE-NEXT:    movsd %xmm0, (%esp)683; X86-SSE-NEXT:    calll log10684; X86-SSE-NEXT:    addl $12, %esp685; X86-SSE-NEXT:    .cfi_def_cfa_offset 4686; X86-SSE-NEXT:    retl687;688; SSE-LABEL: f13:689; SSE:       # %bb.0: # %entry690; SSE-NEXT:    pushq %rax691; SSE-NEXT:    .cfi_def_cfa_offset 16692; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]693; SSE-NEXT:    callq log10@PLT694; SSE-NEXT:    popq %rax695; SSE-NEXT:    .cfi_def_cfa_offset 8696; SSE-NEXT:    retq697;698; AVX-LABEL: f13:699; AVX:       # %bb.0: # %entry700; AVX-NEXT:    pushq %rax701; AVX-NEXT:    .cfi_def_cfa_offset 16702; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]703; AVX-NEXT:    callq log10@PLT704; AVX-NEXT:    popq %rax705; AVX-NEXT:    .cfi_def_cfa_offset 8706; AVX-NEXT:    retq707entry:708  %result = call double @llvm.experimental.constrained.log10.f64(double 42.0,709                                               metadata !"round.dynamic",710                                               metadata !"fpexcept.strict") #0711  ret double %result712}713 714; Verify that log2(42.0) isn't simplified when the rounding mode is unknown.715define double @f14() #0 {716; X87-LABEL: f14:717; X87:       # %bb.0: # %entry718; X87-NEXT:    subl $12, %esp719; X87-NEXT:    .cfi_def_cfa_offset 16720; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}721; X87-NEXT:    fstpl (%esp)722; X87-NEXT:    wait723; X87-NEXT:    calll log2724; X87-NEXT:    addl $12, %esp725; X87-NEXT:    .cfi_def_cfa_offset 4726; X87-NEXT:    retl727;728; X86-SSE-LABEL: f14:729; X86-SSE:       # %bb.0: # %entry730; X86-SSE-NEXT:    subl $12, %esp731; X86-SSE-NEXT:    .cfi_def_cfa_offset 16732; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]733; X86-SSE-NEXT:    movsd %xmm0, (%esp)734; X86-SSE-NEXT:    calll log2735; X86-SSE-NEXT:    addl $12, %esp736; X86-SSE-NEXT:    .cfi_def_cfa_offset 4737; X86-SSE-NEXT:    retl738;739; SSE-LABEL: f14:740; SSE:       # %bb.0: # %entry741; SSE-NEXT:    pushq %rax742; SSE-NEXT:    .cfi_def_cfa_offset 16743; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]744; SSE-NEXT:    callq log2@PLT745; SSE-NEXT:    popq %rax746; SSE-NEXT:    .cfi_def_cfa_offset 8747; SSE-NEXT:    retq748;749; AVX-LABEL: f14:750; AVX:       # %bb.0: # %entry751; AVX-NEXT:    pushq %rax752; AVX-NEXT:    .cfi_def_cfa_offset 16753; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]754; AVX-NEXT:    callq log2@PLT755; AVX-NEXT:    popq %rax756; AVX-NEXT:    .cfi_def_cfa_offset 8757; AVX-NEXT:    retq758entry:759  %result = call double @llvm.experimental.constrained.log2.f64(double 42.0,760                                               metadata !"round.dynamic",761                                               metadata !"fpexcept.strict") #0762  ret double %result763}764 765; Verify that rint(42.1) isn't simplified when the rounding mode is unknown.766define double @f15() #0 {767; X87-LABEL: f15:768; X87:       # %bb.0: # %entry769; X87-NEXT:    subl $12, %esp770; X87-NEXT:    .cfi_def_cfa_offset 16771; X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}772; X87-NEXT:    fstpl (%esp)773; X87-NEXT:    wait774; X87-NEXT:    calll rint775; X87-NEXT:    addl $12, %esp776; X87-NEXT:    .cfi_def_cfa_offset 4777; X87-NEXT:    retl778;779; X86-SSE-LABEL: f15:780; X86-SSE:       # %bb.0: # %entry781; X86-SSE-NEXT:    subl $12, %esp782; X86-SSE-NEXT:    .cfi_def_cfa_offset 16783; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]784; X86-SSE-NEXT:    movsd %xmm0, (%esp)785; X86-SSE-NEXT:    calll rint786; X86-SSE-NEXT:    addl $12, %esp787; X86-SSE-NEXT:    .cfi_def_cfa_offset 4788; X86-SSE-NEXT:    retl789;790; SSE-LABEL: f15:791; SSE:       # %bb.0: # %entry792; SSE-NEXT:    pushq %rax793; SSE-NEXT:    .cfi_def_cfa_offset 16794; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]795; SSE-NEXT:    callq rint@PLT796; SSE-NEXT:    popq %rax797; SSE-NEXT:    .cfi_def_cfa_offset 8798; SSE-NEXT:    retq799;800; AVX-LABEL: f15:801; AVX:       # %bb.0: # %entry802; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]803; AVX-NEXT:    vroundsd $4, %xmm0, %xmm0, %xmm0804; AVX-NEXT:    retq805entry:806  %result = call double @llvm.experimental.constrained.rint.f64(double 42.1,807                                               metadata !"round.dynamic",808                                               metadata !"fpexcept.strict") #0809  ret double %result810}811 812; Verify that nearbyint(42.1) isn't simplified when the rounding mode is813; unknown.814define double @f16() #0 {815; X87-LABEL: f16:816; X87:       # %bb.0: # %entry817; X87-NEXT:    subl $12, %esp818; X87-NEXT:    .cfi_def_cfa_offset 16819; X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}820; X87-NEXT:    fstpl (%esp)821; X87-NEXT:    wait822; X87-NEXT:    calll nearbyint823; X87-NEXT:    addl $12, %esp824; X87-NEXT:    .cfi_def_cfa_offset 4825; X87-NEXT:    retl826;827; X86-SSE-LABEL: f16:828; X86-SSE:       # %bb.0: # %entry829; X86-SSE-NEXT:    subl $12, %esp830; X86-SSE-NEXT:    .cfi_def_cfa_offset 16831; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]832; X86-SSE-NEXT:    movsd %xmm0, (%esp)833; X86-SSE-NEXT:    calll nearbyint834; X86-SSE-NEXT:    addl $12, %esp835; X86-SSE-NEXT:    .cfi_def_cfa_offset 4836; X86-SSE-NEXT:    retl837;838; SSE-LABEL: f16:839; SSE:       # %bb.0: # %entry840; SSE-NEXT:    pushq %rax841; SSE-NEXT:    .cfi_def_cfa_offset 16842; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]843; SSE-NEXT:    callq nearbyint@PLT844; SSE-NEXT:    popq %rax845; SSE-NEXT:    .cfi_def_cfa_offset 8846; SSE-NEXT:    retq847;848; AVX-LABEL: f16:849; AVX:       # %bb.0: # %entry850; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]851; AVX-NEXT:    vroundsd $12, %xmm0, %xmm0, %xmm0852; AVX-NEXT:    retq853entry:854  %result = call double @llvm.experimental.constrained.nearbyint.f64(855                                               double 42.1,856                                               metadata !"round.dynamic",857                                               metadata !"fpexcept.strict") #0858  ret double %result859}860 861define double @f19() #0 {862; X87-LABEL: f19:863; X87:       # %bb.0: # %entry864; X87-NEXT:    subl $28, %esp865; X87-NEXT:    .cfi_def_cfa_offset 32866; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}867; X87-NEXT:    fstpl {{[0-9]+}}(%esp)868; X87-NEXT:    fld1869; X87-NEXT:    fstpl (%esp)870; X87-NEXT:    wait871; X87-NEXT:    calll fmod872; X87-NEXT:    addl $28, %esp873; X87-NEXT:    .cfi_def_cfa_offset 4874; X87-NEXT:    retl875;876; X86-SSE-LABEL: f19:877; X86-SSE:       # %bb.0: # %entry878; X86-SSE-NEXT:    subl $28, %esp879; X86-SSE-NEXT:    .cfi_def_cfa_offset 32880; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+1,0.0E+0]881; X86-SSE-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)882; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]883; X86-SSE-NEXT:    movsd %xmm0, (%esp)884; X86-SSE-NEXT:    calll fmod885; X86-SSE-NEXT:    addl $28, %esp886; X86-SSE-NEXT:    .cfi_def_cfa_offset 4887; X86-SSE-NEXT:    retl888;889; SSE-LABEL: f19:890; SSE:       # %bb.0: # %entry891; SSE-NEXT:    pushq %rax892; SSE-NEXT:    .cfi_def_cfa_offset 16893; SSE-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]894; SSE-NEXT:    movsd {{.*#+}} xmm1 = [1.0E+1,0.0E+0]895; SSE-NEXT:    callq fmod@PLT896; SSE-NEXT:    popq %rax897; SSE-NEXT:    .cfi_def_cfa_offset 8898; SSE-NEXT:    retq899;900; AVX-LABEL: f19:901; AVX:       # %bb.0: # %entry902; AVX-NEXT:    pushq %rax903; AVX-NEXT:    .cfi_def_cfa_offset 16904; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]905; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = [1.0E+1,0.0E+0]906; AVX-NEXT:    callq fmod@PLT907; AVX-NEXT:    popq %rax908; AVX-NEXT:    .cfi_def_cfa_offset 8909; AVX-NEXT:    retq910entry:911  %rem = call double @llvm.experimental.constrained.frem.f64(912                                               double 1.000000e+00,913                                               double 1.000000e+01,914                                               metadata !"round.dynamic",915                                               metadata !"fpexcept.strict") #0916  ret double %rem917}918 919; Verify that fptosi(%x) isn't simplified when the rounding mode is920; unknown.921; Verify that no gross errors happen.922; FIXME: The SSE/AVX code does not raise an invalid exception for all values923; that don't fit in i8.924define i8 @f20s8(double %x) #0 {925; X87-LABEL: f20s8:926; X87:       # %bb.0: # %entry927; X87-NEXT:    subl $8, %esp928; X87-NEXT:    .cfi_def_cfa_offset 12929; X87-NEXT:    fldl {{[0-9]+}}(%esp)930; X87-NEXT:    wait931; X87-NEXT:    fnstcw {{[0-9]+}}(%esp)932; X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax933; X87-NEXT:    orl $3072, %eax # imm = 0xC00934; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)935; X87-NEXT:    fldcw {{[0-9]+}}(%esp)936; X87-NEXT:    fistps {{[0-9]+}}(%esp)937; X87-NEXT:    fldcw {{[0-9]+}}(%esp)938; X87-NEXT:    movzbl {{[0-9]+}}(%esp), %eax939; X87-NEXT:    addl $8, %esp940; X87-NEXT:    .cfi_def_cfa_offset 4941; X87-NEXT:    retl942;943; X86-SSE-LABEL: f20s8:944; X86-SSE:       # %bb.0: # %entry945; X86-SSE-NEXT:    cvttsd2si {{[0-9]+}}(%esp), %eax946; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax947; X86-SSE-NEXT:    retl948;949; SSE-LABEL: f20s8:950; SSE:       # %bb.0: # %entry951; SSE-NEXT:    cvttsd2si %xmm0, %eax952; SSE-NEXT:    # kill: def $al killed $al killed $eax953; SSE-NEXT:    retq954;955; AVX-LABEL: f20s8:956; AVX:       # %bb.0: # %entry957; AVX-NEXT:    vcvttsd2si %xmm0, %eax958; AVX-NEXT:    # kill: def $al killed $al killed $eax959; AVX-NEXT:    retq960entry:961  %result = call i8 @llvm.experimental.constrained.fptosi.i8.f64(double %x,962                                               metadata !"fpexcept.strict") #0963  ret i8 %result964}965 966; Verify that fptosi(%x) isn't simplified when the rounding mode is967; unknown.968; Verify that no gross errors happen.969; FIXME: The SSE/AVX code does not raise an invalid exception for all values970; that don't fit in i16.971define i16 @f20s16(double %x) #0 {972; X87-LABEL: f20s16:973; X87:       # %bb.0: # %entry974; X87-NEXT:    subl $8, %esp975; X87-NEXT:    .cfi_def_cfa_offset 12976; X87-NEXT:    fldl {{[0-9]+}}(%esp)977; X87-NEXT:    wait978; X87-NEXT:    fnstcw {{[0-9]+}}(%esp)979; X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax980; X87-NEXT:    orl $3072, %eax # imm = 0xC00981; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)982; X87-NEXT:    fldcw {{[0-9]+}}(%esp)983; X87-NEXT:    fistps {{[0-9]+}}(%esp)984; X87-NEXT:    fldcw {{[0-9]+}}(%esp)985; X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax986; X87-NEXT:    addl $8, %esp987; X87-NEXT:    .cfi_def_cfa_offset 4988; X87-NEXT:    retl989;990; X86-SSE-LABEL: f20s16:991; X86-SSE:       # %bb.0: # %entry992; X86-SSE-NEXT:    cvttsd2si {{[0-9]+}}(%esp), %eax993; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax994; X86-SSE-NEXT:    retl995;996; SSE-LABEL: f20s16:997; SSE:       # %bb.0: # %entry998; SSE-NEXT:    cvttsd2si %xmm0, %eax999; SSE-NEXT:    # kill: def $ax killed $ax killed $eax1000; SSE-NEXT:    retq1001;1002; AVX-LABEL: f20s16:1003; AVX:       # %bb.0: # %entry1004; AVX-NEXT:    vcvttsd2si %xmm0, %eax1005; AVX-NEXT:    # kill: def $ax killed $ax killed $eax1006; AVX-NEXT:    retq1007entry:1008  %result = call i16 @llvm.experimental.constrained.fptosi.i16.f64(double %x,1009                                               metadata !"fpexcept.strict") #01010  ret i16 %result1011}1012 1013; Verify that fptosi(%x) isn't simplified when the rounding mode is1014; unknown.1015; Verify that no gross errors happen.1016define i32 @f20s(double %x) #0 {1017; X87-LABEL: f20s:1018; X87:       # %bb.0: # %entry1019; X87-NEXT:    subl $8, %esp1020; X87-NEXT:    .cfi_def_cfa_offset 121021; X87-NEXT:    fldl {{[0-9]+}}(%esp)1022; X87-NEXT:    wait1023; X87-NEXT:    fnstcw (%esp)1024; X87-NEXT:    movzwl (%esp), %eax1025; X87-NEXT:    orl $3072, %eax # imm = 0xC001026; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)1027; X87-NEXT:    fldcw {{[0-9]+}}(%esp)1028; X87-NEXT:    fistpl {{[0-9]+}}(%esp)1029; X87-NEXT:    fldcw (%esp)1030; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax1031; X87-NEXT:    addl $8, %esp1032; X87-NEXT:    .cfi_def_cfa_offset 41033; X87-NEXT:    retl1034;1035; X86-SSE-LABEL: f20s:1036; X86-SSE:       # %bb.0: # %entry1037; X86-SSE-NEXT:    cvttsd2si {{[0-9]+}}(%esp), %eax1038; X86-SSE-NEXT:    retl1039;1040; SSE-LABEL: f20s:1041; SSE:       # %bb.0: # %entry1042; SSE-NEXT:    cvttsd2si %xmm0, %eax1043; SSE-NEXT:    retq1044;1045; AVX-LABEL: f20s:1046; AVX:       # %bb.0: # %entry1047; AVX-NEXT:    vcvttsd2si %xmm0, %eax1048; AVX-NEXT:    retq1049entry:1050  %result = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %x,1051                                               metadata !"fpexcept.strict") #01052  ret i32 %result1053}1054 1055; Verify that fptoui(%x) isn't simplified when the rounding mode is1056; unknown.1057; Verify that no gross errors happen.1058; FIXME: This code generates spurious inexact exceptions.1059define i64 @f20s64(double %x) #0 {1060; X87-LABEL: f20s64:1061; X87:       # %bb.0: # %entry1062; X87-NEXT:    subl $20, %esp1063; X87-NEXT:    .cfi_def_cfa_offset 241064; X87-NEXT:    fldl {{[0-9]+}}(%esp)1065; X87-NEXT:    wait1066; X87-NEXT:    fnstcw {{[0-9]+}}(%esp)1067; X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax1068; X87-NEXT:    orl $3072, %eax # imm = 0xC001069; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)1070; X87-NEXT:    fldcw {{[0-9]+}}(%esp)1071; X87-NEXT:    fistpll {{[0-9]+}}(%esp)1072; X87-NEXT:    fldcw {{[0-9]+}}(%esp)1073; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax1074; X87-NEXT:    movl {{[0-9]+}}(%esp), %edx1075; X87-NEXT:    addl $20, %esp1076; X87-NEXT:    .cfi_def_cfa_offset 41077; X87-NEXT:    retl1078;1079; X86-SSE-LABEL: f20s64:1080; X86-SSE:       # %bb.0: # %entry1081; X86-SSE-NEXT:    subl $20, %esp1082; X86-SSE-NEXT:    .cfi_def_cfa_offset 241083; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1084; X86-SSE-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)1085; X86-SSE-NEXT:    fldl {{[0-9]+}}(%esp)1086; X86-SSE-NEXT:    wait1087; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)1088; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax1089; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC001090; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)1091; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)1092; X86-SSE-NEXT:    fistpll {{[0-9]+}}(%esp)1093; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)1094; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1095; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edx1096; X86-SSE-NEXT:    addl $20, %esp1097; X86-SSE-NEXT:    .cfi_def_cfa_offset 41098; X86-SSE-NEXT:    retl1099;1100; SSE-LABEL: f20s64:1101; SSE:       # %bb.0: # %entry1102; SSE-NEXT:    cvttsd2si %xmm0, %rax1103; SSE-NEXT:    retq1104;1105; AVX-LABEL: f20s64:1106; AVX:       # %bb.0: # %entry1107; AVX-NEXT:    vcvttsd2si %xmm0, %rax1108; AVX-NEXT:    retq1109entry:1110  %result = call i64 @llvm.experimental.constrained.fptosi.i64.f64(double %x,1111                                               metadata !"fpexcept.strict") #01112  ret i64 %result1113}1114 1115; Verify that fptoui(%x) isn't simplified when the rounding mode is1116; unknown.1117; Verify that no gross errors happen.1118define i128 @f20s128(double %x) nounwind strictfp {1119; X87-LABEL: f20s128:1120; X87:       # %bb.0: # %entry1121; X87-NEXT:    pushl %edi1122; X87-NEXT:    pushl %esi1123; X87-NEXT:    subl $36, %esp1124; X87-NEXT:    movl {{[0-9]+}}(%esp), %esi1125; X87-NEXT:    fldl {{[0-9]+}}(%esp)1126; X87-NEXT:    fstpl {{[0-9]+}}(%esp)1127; X87-NEXT:    wait1128; X87-NEXT:    leal {{[0-9]+}}(%esp), %eax1129; X87-NEXT:    movl %eax, (%esp)1130; X87-NEXT:    calll __fixdfti1131; X87-NEXT:    subl $4, %esp1132; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax1133; X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx1134; X87-NEXT:    movl {{[0-9]+}}(%esp), %edx1135; X87-NEXT:    movl {{[0-9]+}}(%esp), %edi1136; X87-NEXT:    movl %edi, 8(%esi)1137; X87-NEXT:    movl %edx, 12(%esi)1138; X87-NEXT:    movl %eax, (%esi)1139; X87-NEXT:    movl %ecx, 4(%esi)1140; X87-NEXT:    movl %esi, %eax1141; X87-NEXT:    addl $36, %esp1142; X87-NEXT:    popl %esi1143; X87-NEXT:    popl %edi1144; X87-NEXT:    retl $41145;1146; X86-SSE-LABEL: f20s128:1147; X86-SSE:       # %bb.0: # %entry1148; X86-SSE-NEXT:    pushl %esi1149; X86-SSE-NEXT:    subl $40, %esp1150; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi1151; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1152; X86-SSE-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)1153; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax1154; X86-SSE-NEXT:    movl %eax, (%esp)1155; X86-SSE-NEXT:    calll __fixdfti1156; X86-SSE-NEXT:    subl $4, %esp1157; X86-SSE-NEXT:    movaps {{[0-9]+}}(%esp), %xmm01158; X86-SSE-NEXT:    movaps %xmm0, (%esi)1159; X86-SSE-NEXT:    movl %esi, %eax1160; X86-SSE-NEXT:    addl $40, %esp1161; X86-SSE-NEXT:    popl %esi1162; X86-SSE-NEXT:    retl $41163;1164; SSE-LABEL: f20s128:1165; SSE:       # %bb.0: # %entry1166; SSE-NEXT:    pushq %rax1167; SSE-NEXT:    callq __fixdfti@PLT1168; SSE-NEXT:    popq %rcx1169; SSE-NEXT:    retq1170;1171; AVX-LABEL: f20s128:1172; AVX:       # %bb.0: # %entry1173; AVX-NEXT:    pushq %rax1174; AVX-NEXT:    callq __fixdfti@PLT1175; AVX-NEXT:    popq %rcx1176; AVX-NEXT:    retq1177entry:1178  %result = call i128 @llvm.experimental.constrained.fptosi.i128.f64(double %x,1179                                               metadata !"fpexcept.strict") #01180  ret i128 %result1181}1182 1183; Verify that fptoui(%x) isn't simplified when the rounding mode is1184; unknown.1185; Verify that no gross errors happen.1186; FIXME: The SSE/AVX code does not raise an invalid exception for all values1187; that don't fit in i8.1188define i8 @f20u8(double %x) #0 {1189; X87-LABEL: f20u8:1190; X87:       # %bb.0: # %entry1191; X87-NEXT:    subl $8, %esp1192; X87-NEXT:    .cfi_def_cfa_offset 121193; X87-NEXT:    fldl {{[0-9]+}}(%esp)1194; X87-NEXT:    wait1195; X87-NEXT:    fnstcw {{[0-9]+}}(%esp)1196; X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax1197; X87-NEXT:    orl $3072, %eax # imm = 0xC001198; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)1199; X87-NEXT:    fldcw {{[0-9]+}}(%esp)1200; X87-NEXT:    fistps {{[0-9]+}}(%esp)1201; X87-NEXT:    fldcw {{[0-9]+}}(%esp)1202; X87-NEXT:    movzbl {{[0-9]+}}(%esp), %eax1203; X87-NEXT:    addl $8, %esp1204; X87-NEXT:    .cfi_def_cfa_offset 41205; X87-NEXT:    retl1206;1207; X86-SSE-LABEL: f20u8:1208; X86-SSE:       # %bb.0: # %entry1209; X86-SSE-NEXT:    cvttsd2si {{[0-9]+}}(%esp), %eax1210; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax1211; X86-SSE-NEXT:    retl1212;1213; SSE-LABEL: f20u8:1214; SSE:       # %bb.0: # %entry1215; SSE-NEXT:    cvttsd2si %xmm0, %eax1216; SSE-NEXT:    # kill: def $al killed $al killed $eax1217; SSE-NEXT:    retq1218;1219; AVX-LABEL: f20u8:1220; AVX:       # %bb.0: # %entry1221; AVX-NEXT:    vcvttsd2si %xmm0, %eax1222; AVX-NEXT:    # kill: def $al killed $al killed $eax1223; AVX-NEXT:    retq1224entry:1225  %result = call i8 @llvm.experimental.constrained.fptoui.i8.f64(double %x,1226                                               metadata !"fpexcept.strict") #01227  ret i8 %result1228}1229; Verify that fptoui(%x) isn't simplified when the rounding mode is1230; unknown.1231; Verify that no gross errors happen.1232; FIXME: The SSE/AVX code does not raise an invalid exception for all values1233; that don't fit in i16.1234define i16 @f20u16(double %x) #0 {1235; X87-LABEL: f20u16:1236; X87:       # %bb.0: # %entry1237; X87-NEXT:    subl $8, %esp1238; X87-NEXT:    .cfi_def_cfa_offset 121239; X87-NEXT:    fldl {{[0-9]+}}(%esp)1240; X87-NEXT:    wait1241; X87-NEXT:    fnstcw (%esp)1242; X87-NEXT:    movzwl (%esp), %eax1243; X87-NEXT:    orl $3072, %eax # imm = 0xC001244; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)1245; X87-NEXT:    fldcw {{[0-9]+}}(%esp)1246; X87-NEXT:    fistpl {{[0-9]+}}(%esp)1247; X87-NEXT:    fldcw (%esp)1248; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax1249; X87-NEXT:    # kill: def $ax killed $ax killed $eax1250; X87-NEXT:    addl $8, %esp1251; X87-NEXT:    .cfi_def_cfa_offset 41252; X87-NEXT:    retl1253;1254; X86-SSE-LABEL: f20u16:1255; X86-SSE:       # %bb.0: # %entry1256; X86-SSE-NEXT:    cvttsd2si {{[0-9]+}}(%esp), %eax1257; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax1258; X86-SSE-NEXT:    retl1259;1260; SSE-LABEL: f20u16:1261; SSE:       # %bb.0: # %entry1262; SSE-NEXT:    cvttsd2si %xmm0, %eax1263; SSE-NEXT:    # kill: def $ax killed $ax killed $eax1264; SSE-NEXT:    retq1265;1266; AVX-LABEL: f20u16:1267; AVX:       # %bb.0: # %entry1268; AVX-NEXT:    vcvttsd2si %xmm0, %eax1269; AVX-NEXT:    # kill: def $ax killed $ax killed $eax1270; AVX-NEXT:    retq1271entry:1272  %result = call i16 @llvm.experimental.constrained.fptoui.i16.f64(double %x,1273                                               metadata !"fpexcept.strict") #01274  ret i16 %result1275}1276 1277; Verify that fptoui(%x) isn't simplified when the rounding mode is1278; unknown.1279; Verify that no gross errors happen.1280; FIXME: The X87/SSE/AVX1 code does not raise an invalid exception for all1281; values that don't fit in i32. The AVX512 code does.1282define i32 @f20u(double %x) #0 {1283; X87-LABEL: f20u:1284; X87:       # %bb.0: # %entry1285; X87-NEXT:    subl $20, %esp1286; X87-NEXT:    .cfi_def_cfa_offset 241287; X87-NEXT:    fldl {{[0-9]+}}(%esp)1288; X87-NEXT:    wait1289; X87-NEXT:    fnstcw {{[0-9]+}}(%esp)1290; X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax1291; X87-NEXT:    orl $3072, %eax # imm = 0xC001292; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)1293; X87-NEXT:    fldcw {{[0-9]+}}(%esp)1294; X87-NEXT:    fistpll {{[0-9]+}}(%esp)1295; X87-NEXT:    fldcw {{[0-9]+}}(%esp)1296; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax1297; X87-NEXT:    addl $20, %esp1298; X87-NEXT:    .cfi_def_cfa_offset 41299; X87-NEXT:    retl1300;1301; X86-SSE-LABEL: f20u:1302; X86-SSE:       # %bb.0: # %entry1303; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1304; X86-SSE-NEXT:    movsd {{.*#+}} xmm2 = [2.147483648E+9,0.0E+0]1305; X86-SSE-NEXT:    comisd %xmm0, %xmm21306; X86-SSE-NEXT:    xorpd %xmm1, %xmm11307; X86-SSE-NEXT:    ja .LBB24_21308; X86-SSE-NEXT:  # %bb.1: # %entry1309; X86-SSE-NEXT:    movapd %xmm2, %xmm11310; X86-SSE-NEXT:  .LBB24_2: # %entry1311; X86-SSE-NEXT:    setbe %al1312; X86-SSE-NEXT:    movzbl %al, %ecx1313; X86-SSE-NEXT:    shll $31, %ecx1314; X86-SSE-NEXT:    subsd %xmm1, %xmm01315; X86-SSE-NEXT:    cvttsd2si %xmm0, %eax1316; X86-SSE-NEXT:    xorl %ecx, %eax1317; X86-SSE-NEXT:    retl1318;1319; SSE-LABEL: f20u:1320; SSE:       # %bb.0: # %entry1321; SSE-NEXT:    cvttsd2si %xmm0, %rax1322; SSE-NEXT:    # kill: def $eax killed $eax killed $rax1323; SSE-NEXT:    retq1324;1325; AVX1-LABEL: f20u:1326; AVX1:       # %bb.0: # %entry1327; AVX1-NEXT:    vcvttsd2si %xmm0, %rax1328; AVX1-NEXT:    # kill: def $eax killed $eax killed $rax1329; AVX1-NEXT:    retq1330;1331; AVX512-LABEL: f20u:1332; AVX512:       # %bb.0: # %entry1333; AVX512-NEXT:    vcvttsd2usi %xmm0, %eax1334; AVX512-NEXT:    retq1335entry:1336  %result = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %x,1337                                               metadata !"fpexcept.strict") #01338  ret i32 %result1339}1340 1341; Verify that fptoui(%x) isn't simplified when the rounding mode is1342; unknown.1343; Verify that no gross errors happen.1344; FIXME: This code generates spurious inexact exceptions.1345define i64 @f20u64(double %x) #0 {1346; X87-LABEL: f20u64:1347; X87:       # %bb.0: # %entry1348; X87-NEXT:    subl $20, %esp1349; X87-NEXT:    .cfi_def_cfa_offset 241350; X87-NEXT:    fldl {{[0-9]+}}(%esp)1351; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}1352; X87-NEXT:    wait1353; X87-NEXT:    xorl %edx, %edx1354; X87-NEXT:    fcomi %st(1), %st1355; X87-NEXT:    wait1356; X87-NEXT:    setbe %dl1357; X87-NEXT:    fldz1358; X87-NEXT:    fcmovbe %st(1), %st1359; X87-NEXT:    fstp %st(1)1360; X87-NEXT:    fsubrp %st, %st(1)1361; X87-NEXT:    wait1362; X87-NEXT:    fnstcw {{[0-9]+}}(%esp)1363; X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax1364; X87-NEXT:    orl $3072, %eax # imm = 0xC001365; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)1366; X87-NEXT:    fldcw {{[0-9]+}}(%esp)1367; X87-NEXT:    fistpll {{[0-9]+}}(%esp)1368; X87-NEXT:    fldcw {{[0-9]+}}(%esp)1369; X87-NEXT:    shll $31, %edx1370; X87-NEXT:    xorl {{[0-9]+}}(%esp), %edx1371; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax1372; X87-NEXT:    addl $20, %esp1373; X87-NEXT:    .cfi_def_cfa_offset 41374; X87-NEXT:    retl1375;1376; X86-SSE-LABEL: f20u64:1377; X86-SSE:       # %bb.0: # %entry1378; X86-SSE-NEXT:    subl $20, %esp1379; X86-SSE-NEXT:    .cfi_def_cfa_offset 241380; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1381; X86-SSE-NEXT:    movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]1382; X86-SSE-NEXT:    comisd %xmm0, %xmm11383; X86-SSE-NEXT:    jbe .LBB25_21384; X86-SSE-NEXT:  # %bb.1: # %entry1385; X86-SSE-NEXT:    xorpd %xmm1, %xmm11386; X86-SSE-NEXT:  .LBB25_2: # %entry1387; X86-SSE-NEXT:    subsd %xmm1, %xmm01388; X86-SSE-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)1389; X86-SSE-NEXT:    setbe %al1390; X86-SSE-NEXT:    fldl {{[0-9]+}}(%esp)1391; X86-SSE-NEXT:    wait1392; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)1393; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx1394; X86-SSE-NEXT:    orl $3072, %ecx # imm = 0xC001395; X86-SSE-NEXT:    movw %cx, {{[0-9]+}}(%esp)1396; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)1397; X86-SSE-NEXT:    fistpll {{[0-9]+}}(%esp)1398; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)1399; X86-SSE-NEXT:    movzbl %al, %edx1400; X86-SSE-NEXT:    shll $31, %edx1401; X86-SSE-NEXT:    xorl {{[0-9]+}}(%esp), %edx1402; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1403; X86-SSE-NEXT:    addl $20, %esp1404; X86-SSE-NEXT:    .cfi_def_cfa_offset 41405; X86-SSE-NEXT:    retl1406;1407; SSE-LABEL: f20u64:1408; SSE:       # %bb.0: # %entry1409; SSE-NEXT:    movsd {{.*#+}} xmm2 = [9.2233720368547758E+18,0.0E+0]1410; SSE-NEXT:    comisd %xmm2, %xmm01411; SSE-NEXT:    xorpd %xmm1, %xmm11412; SSE-NEXT:    jb .LBB25_21413; SSE-NEXT:  # %bb.1: # %entry1414; SSE-NEXT:    movapd %xmm2, %xmm11415; SSE-NEXT:  .LBB25_2: # %entry1416; SSE-NEXT:    subsd %xmm1, %xmm01417; SSE-NEXT:    cvttsd2si %xmm0, %rcx1418; SSE-NEXT:    setae %al1419; SSE-NEXT:    movzbl %al, %eax1420; SSE-NEXT:    shlq $63, %rax1421; SSE-NEXT:    xorq %rcx, %rax1422; SSE-NEXT:    retq1423;1424; AVX1-LABEL: f20u64:1425; AVX1:       # %bb.0: # %entry1426; AVX1-NEXT:    vmovsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]1427; AVX1-NEXT:    vcomisd %xmm1, %xmm01428; AVX1-NEXT:    vxorpd %xmm2, %xmm2, %xmm21429; AVX1-NEXT:    jb .LBB25_21430; AVX1-NEXT:  # %bb.1: # %entry1431; AVX1-NEXT:    vmovapd %xmm1, %xmm21432; AVX1-NEXT:  .LBB25_2: # %entry1433; AVX1-NEXT:    vsubsd %xmm2, %xmm0, %xmm01434; AVX1-NEXT:    vcvttsd2si %xmm0, %rcx1435; AVX1-NEXT:    setae %al1436; AVX1-NEXT:    movzbl %al, %eax1437; AVX1-NEXT:    shlq $63, %rax1438; AVX1-NEXT:    xorq %rcx, %rax1439; AVX1-NEXT:    retq1440;1441; AVX512-LABEL: f20u64:1442; AVX512:       # %bb.0: # %entry1443; AVX512-NEXT:    vcvttsd2usi %xmm0, %rax1444; AVX512-NEXT:    retq1445entry:1446  %result = call i64 @llvm.experimental.constrained.fptoui.i64.f64(double %x,1447                                               metadata !"fpexcept.strict") #01448  ret i64 %result1449}1450 1451 1452; Verify that fptoui(%x) isn't simplified when the rounding mode is1453; unknown.1454; Verify that no gross errors happen.1455define i128 @f20u128(double %x) nounwind strictfp {1456; X87-LABEL: f20u128:1457; X87:       # %bb.0: # %entry1458; X87-NEXT:    pushl %edi1459; X87-NEXT:    pushl %esi1460; X87-NEXT:    subl $36, %esp1461; X87-NEXT:    movl {{[0-9]+}}(%esp), %esi1462; X87-NEXT:    fldl {{[0-9]+}}(%esp)1463; X87-NEXT:    fstpl {{[0-9]+}}(%esp)1464; X87-NEXT:    wait1465; X87-NEXT:    leal {{[0-9]+}}(%esp), %eax1466; X87-NEXT:    movl %eax, (%esp)1467; X87-NEXT:    calll __fixunsdfti1468; X87-NEXT:    subl $4, %esp1469; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax1470; X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx1471; X87-NEXT:    movl {{[0-9]+}}(%esp), %edx1472; X87-NEXT:    movl {{[0-9]+}}(%esp), %edi1473; X87-NEXT:    movl %edi, 8(%esi)1474; X87-NEXT:    movl %edx, 12(%esi)1475; X87-NEXT:    movl %eax, (%esi)1476; X87-NEXT:    movl %ecx, 4(%esi)1477; X87-NEXT:    movl %esi, %eax1478; X87-NEXT:    addl $36, %esp1479; X87-NEXT:    popl %esi1480; X87-NEXT:    popl %edi1481; X87-NEXT:    retl $41482;1483; X86-SSE-LABEL: f20u128:1484; X86-SSE:       # %bb.0: # %entry1485; X86-SSE-NEXT:    pushl %esi1486; X86-SSE-NEXT:    subl $40, %esp1487; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi1488; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1489; X86-SSE-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)1490; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax1491; X86-SSE-NEXT:    movl %eax, (%esp)1492; X86-SSE-NEXT:    calll __fixunsdfti1493; X86-SSE-NEXT:    subl $4, %esp1494; X86-SSE-NEXT:    movaps {{[0-9]+}}(%esp), %xmm01495; X86-SSE-NEXT:    movaps %xmm0, (%esi)1496; X86-SSE-NEXT:    movl %esi, %eax1497; X86-SSE-NEXT:    addl $40, %esp1498; X86-SSE-NEXT:    popl %esi1499; X86-SSE-NEXT:    retl $41500;1501; SSE-LABEL: f20u128:1502; SSE:       # %bb.0: # %entry1503; SSE-NEXT:    pushq %rax1504; SSE-NEXT:    callq __fixunsdfti@PLT1505; SSE-NEXT:    popq %rcx1506; SSE-NEXT:    retq1507;1508; AVX-LABEL: f20u128:1509; AVX:       # %bb.0: # %entry1510; AVX-NEXT:    pushq %rax1511; AVX-NEXT:    callq __fixunsdfti@PLT1512; AVX-NEXT:    popq %rcx1513; AVX-NEXT:    retq1514entry:1515  %result = call i128 @llvm.experimental.constrained.fptoui.i128.f64(double %x,1516                                               metadata !"fpexcept.strict") #01517  ret i128 %result1518}1519 1520; Verify that round(42.1) isn't simplified when the rounding mode is1521; unknown.1522; Verify that no gross errors happen.1523define float @f21() #0 {1524; X87-LABEL: f21:1525; X87:       # %bb.0: # %entry1526; X87-NEXT:    pushl %eax1527; X87-NEXT:    .cfi_def_cfa_offset 81528; X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}1529; X87-NEXT:    fstps (%esp)1530; X87-NEXT:    flds (%esp)1531; X87-NEXT:    wait1532; X87-NEXT:    popl %eax1533; X87-NEXT:    .cfi_def_cfa_offset 41534; X87-NEXT:    retl1535;1536; X86-SSE-LABEL: f21:1537; X86-SSE:       # %bb.0: # %entry1538; X86-SSE-NEXT:    pushl %eax1539; X86-SSE-NEXT:    .cfi_def_cfa_offset 81540; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]1541; X86-SSE-NEXT:    cvtsd2ss %xmm0, %xmm01542; X86-SSE-NEXT:    movss %xmm0, (%esp)1543; X86-SSE-NEXT:    flds (%esp)1544; X86-SSE-NEXT:    wait1545; X86-SSE-NEXT:    popl %eax1546; X86-SSE-NEXT:    .cfi_def_cfa_offset 41547; X86-SSE-NEXT:    retl1548;1549; SSE-LABEL: f21:1550; SSE:       # %bb.0: # %entry1551; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]1552; SSE-NEXT:    cvtsd2ss %xmm0, %xmm01553; SSE-NEXT:    retq1554;1555; AVX-LABEL: f21:1556; AVX:       # %bb.0: # %entry1557; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]1558; AVX-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm01559; AVX-NEXT:    retq1560entry:1561  %result = call float @llvm.experimental.constrained.fptrunc.f32.f64(1562                                               double 42.1,1563                                               metadata !"round.dynamic",1564                                               metadata !"fpexcept.strict") #01565  ret float %result1566}1567 1568define double @f22(float %x) #0 {1569; X87-LABEL: f22:1570; X87:       # %bb.0: # %entry1571; X87-NEXT:    flds {{[0-9]+}}(%esp)1572; X87-NEXT:    wait1573; X87-NEXT:    retl1574;1575; X86-SSE-LABEL: f22:1576; X86-SSE:       # %bb.0: # %entry1577; X86-SSE-NEXT:    subl $12, %esp1578; X86-SSE-NEXT:    .cfi_def_cfa_offset 161579; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1580; X86-SSE-NEXT:    cvtss2sd %xmm0, %xmm01581; X86-SSE-NEXT:    movsd %xmm0, (%esp)1582; X86-SSE-NEXT:    fldl (%esp)1583; X86-SSE-NEXT:    wait1584; X86-SSE-NEXT:    addl $12, %esp1585; X86-SSE-NEXT:    .cfi_def_cfa_offset 41586; X86-SSE-NEXT:    retl1587;1588; SSE-LABEL: f22:1589; SSE:       # %bb.0: # %entry1590; SSE-NEXT:    cvtss2sd %xmm0, %xmm01591; SSE-NEXT:    retq1592;1593; AVX-LABEL: f22:1594; AVX:       # %bb.0: # %entry1595; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm01596; AVX-NEXT:    retq1597entry:1598  %result = call double @llvm.experimental.constrained.fpext.f64.f32(float %x,1599                                               metadata !"fpexcept.strict") #01600  ret double %result1601}1602 1603define i32 @f23(double %x) #0 {1604; X87-LABEL: f23:1605; X87:       # %bb.0: # %entry1606; X87-NEXT:    subl $12, %esp1607; X87-NEXT:    .cfi_def_cfa_offset 161608; X87-NEXT:    fldl {{[0-9]+}}(%esp)1609; X87-NEXT:    fstpl (%esp)1610; X87-NEXT:    wait1611; X87-NEXT:    calll lrint1612; X87-NEXT:    addl $12, %esp1613; X87-NEXT:    .cfi_def_cfa_offset 41614; X87-NEXT:    retl1615;1616; X86-SSE-LABEL: f23:1617; X86-SSE:       # %bb.0: # %entry1618; X86-SSE-NEXT:    subl $12, %esp1619; X86-SSE-NEXT:    .cfi_def_cfa_offset 161620; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1621; X86-SSE-NEXT:    movsd %xmm0, (%esp)1622; X86-SSE-NEXT:    calll lrint1623; X86-SSE-NEXT:    addl $12, %esp1624; X86-SSE-NEXT:    .cfi_def_cfa_offset 41625; X86-SSE-NEXT:    retl1626;1627; SSE-LABEL: f23:1628; SSE:       # %bb.0: # %entry1629; SSE-NEXT:    pushq %rax1630; SSE-NEXT:    .cfi_def_cfa_offset 161631; SSE-NEXT:    callq lrint@PLT1632; SSE-NEXT:    popq %rcx1633; SSE-NEXT:    .cfi_def_cfa_offset 81634; SSE-NEXT:    retq1635;1636; AVX-LABEL: f23:1637; AVX:       # %bb.0: # %entry1638; AVX-NEXT:    pushq %rax1639; AVX-NEXT:    .cfi_def_cfa_offset 161640; AVX-NEXT:    callq lrint@PLT1641; AVX-NEXT:    popq %rcx1642; AVX-NEXT:    .cfi_def_cfa_offset 81643; AVX-NEXT:    retq1644entry:1645  %result = call i32 @llvm.experimental.constrained.lrint.i32.f64(double %x,1646                                               metadata !"round.dynamic",1647                                               metadata !"fpexcept.strict") #01648  ret i32 %result1649}1650 1651define i32 @f24(float %x) #0 {1652; X87-LABEL: f24:1653; X87:       # %bb.0: # %entry1654; X87-NEXT:    subl $12, %esp1655; X87-NEXT:    .cfi_def_cfa_offset 161656; X87-NEXT:    flds {{[0-9]+}}(%esp)1657; X87-NEXT:    fstps (%esp)1658; X87-NEXT:    wait1659; X87-NEXT:    calll lrintf1660; X87-NEXT:    addl $12, %esp1661; X87-NEXT:    .cfi_def_cfa_offset 41662; X87-NEXT:    retl1663;1664; X86-SSE-LABEL: f24:1665; X86-SSE:       # %bb.0: # %entry1666; X86-SSE-NEXT:    subl $12, %esp1667; X86-SSE-NEXT:    .cfi_def_cfa_offset 161668; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1669; X86-SSE-NEXT:    movss %xmm0, (%esp)1670; X86-SSE-NEXT:    calll lrintf1671; X86-SSE-NEXT:    addl $12, %esp1672; X86-SSE-NEXT:    .cfi_def_cfa_offset 41673; X86-SSE-NEXT:    retl1674;1675; SSE-LABEL: f24:1676; SSE:       # %bb.0: # %entry1677; SSE-NEXT:    pushq %rax1678; SSE-NEXT:    .cfi_def_cfa_offset 161679; SSE-NEXT:    callq lrintf@PLT1680; SSE-NEXT:    popq %rcx1681; SSE-NEXT:    .cfi_def_cfa_offset 81682; SSE-NEXT:    retq1683;1684; AVX-LABEL: f24:1685; AVX:       # %bb.0: # %entry1686; AVX-NEXT:    pushq %rax1687; AVX-NEXT:    .cfi_def_cfa_offset 161688; AVX-NEXT:    callq lrintf@PLT1689; AVX-NEXT:    popq %rcx1690; AVX-NEXT:    .cfi_def_cfa_offset 81691; AVX-NEXT:    retq1692entry:1693  %result = call i32 @llvm.experimental.constrained.lrint.i32.f32(float %x,1694                                               metadata !"round.dynamic",1695                                               metadata !"fpexcept.strict") #01696  ret i32 %result1697}1698 1699define i64 @f25(double %x) #0 {1700; X87-LABEL: f25:1701; X87:       # %bb.0: # %entry1702; X87-NEXT:    subl $12, %esp1703; X87-NEXT:    .cfi_def_cfa_offset 161704; X87-NEXT:    fldl {{[0-9]+}}(%esp)1705; X87-NEXT:    fstpl (%esp)1706; X87-NEXT:    wait1707; X87-NEXT:    calll llrint1708; X87-NEXT:    addl $12, %esp1709; X87-NEXT:    .cfi_def_cfa_offset 41710; X87-NEXT:    retl1711;1712; X86-SSE-LABEL: f25:1713; X86-SSE:       # %bb.0: # %entry1714; X86-SSE-NEXT:    subl $12, %esp1715; X86-SSE-NEXT:    .cfi_def_cfa_offset 161716; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1717; X86-SSE-NEXT:    movsd %xmm0, (%esp)1718; X86-SSE-NEXT:    calll llrint1719; X86-SSE-NEXT:    addl $12, %esp1720; X86-SSE-NEXT:    .cfi_def_cfa_offset 41721; X86-SSE-NEXT:    retl1722;1723; SSE-LABEL: f25:1724; SSE:       # %bb.0: # %entry1725; SSE-NEXT:    pushq %rax1726; SSE-NEXT:    .cfi_def_cfa_offset 161727; SSE-NEXT:    callq llrint@PLT1728; SSE-NEXT:    popq %rcx1729; SSE-NEXT:    .cfi_def_cfa_offset 81730; SSE-NEXT:    retq1731;1732; AVX-LABEL: f25:1733; AVX:       # %bb.0: # %entry1734; AVX-NEXT:    pushq %rax1735; AVX-NEXT:    .cfi_def_cfa_offset 161736; AVX-NEXT:    callq llrint@PLT1737; AVX-NEXT:    popq %rcx1738; AVX-NEXT:    .cfi_def_cfa_offset 81739; AVX-NEXT:    retq1740entry:1741  %result = call i64 @llvm.experimental.constrained.llrint.i64.f64(double %x,1742                                               metadata !"round.dynamic",1743                                               metadata !"fpexcept.strict") #01744  ret i64 %result1745}1746 1747define i64 @f26(float %x) #0 {1748; X87-LABEL: f26:1749; X87:       # %bb.0: # %entry1750; X87-NEXT:    subl $12, %esp1751; X87-NEXT:    .cfi_def_cfa_offset 161752; X87-NEXT:    flds {{[0-9]+}}(%esp)1753; X87-NEXT:    fstps (%esp)1754; X87-NEXT:    wait1755; X87-NEXT:    calll llrintf1756; X87-NEXT:    addl $12, %esp1757; X87-NEXT:    .cfi_def_cfa_offset 41758; X87-NEXT:    retl1759;1760; X86-SSE-LABEL: f26:1761; X86-SSE:       # %bb.0: # %entry1762; X86-SSE-NEXT:    subl $12, %esp1763; X86-SSE-NEXT:    .cfi_def_cfa_offset 161764; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1765; X86-SSE-NEXT:    movss %xmm0, (%esp)1766; X86-SSE-NEXT:    calll llrintf1767; X86-SSE-NEXT:    addl $12, %esp1768; X86-SSE-NEXT:    .cfi_def_cfa_offset 41769; X86-SSE-NEXT:    retl1770;1771; SSE-LABEL: f26:1772; SSE:       # %bb.0: # %entry1773; SSE-NEXT:    pushq %rax1774; SSE-NEXT:    .cfi_def_cfa_offset 161775; SSE-NEXT:    callq llrintf@PLT1776; SSE-NEXT:    popq %rcx1777; SSE-NEXT:    .cfi_def_cfa_offset 81778; SSE-NEXT:    retq1779;1780; AVX-LABEL: f26:1781; AVX:       # %bb.0: # %entry1782; AVX-NEXT:    pushq %rax1783; AVX-NEXT:    .cfi_def_cfa_offset 161784; AVX-NEXT:    callq llrintf@PLT1785; AVX-NEXT:    popq %rcx1786; AVX-NEXT:    .cfi_def_cfa_offset 81787; AVX-NEXT:    retq1788entry:1789  %result = call i64 @llvm.experimental.constrained.llrint.i64.f32(float %x,1790                                               metadata !"round.dynamic",1791                                               metadata !"fpexcept.strict") #01792  ret i64 %result1793}1794 1795define i32 @f27(double %x) #0 {1796; X87-LABEL: f27:1797; X87:       # %bb.0: # %entry1798; X87-NEXT:    subl $12, %esp1799; X87-NEXT:    .cfi_def_cfa_offset 161800; X87-NEXT:    fldl {{[0-9]+}}(%esp)1801; X87-NEXT:    fstpl (%esp)1802; X87-NEXT:    wait1803; X87-NEXT:    calll lround1804; X87-NEXT:    addl $12, %esp1805; X87-NEXT:    .cfi_def_cfa_offset 41806; X87-NEXT:    retl1807;1808; X86-SSE-LABEL: f27:1809; X86-SSE:       # %bb.0: # %entry1810; X86-SSE-NEXT:    subl $12, %esp1811; X86-SSE-NEXT:    .cfi_def_cfa_offset 161812; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1813; X86-SSE-NEXT:    movsd %xmm0, (%esp)1814; X86-SSE-NEXT:    calll lround1815; X86-SSE-NEXT:    addl $12, %esp1816; X86-SSE-NEXT:    .cfi_def_cfa_offset 41817; X86-SSE-NEXT:    retl1818;1819; SSE-LABEL: f27:1820; SSE:       # %bb.0: # %entry1821; SSE-NEXT:    pushq %rax1822; SSE-NEXT:    .cfi_def_cfa_offset 161823; SSE-NEXT:    callq lround@PLT1824; SSE-NEXT:    popq %rcx1825; SSE-NEXT:    .cfi_def_cfa_offset 81826; SSE-NEXT:    retq1827;1828; AVX-LABEL: f27:1829; AVX:       # %bb.0: # %entry1830; AVX-NEXT:    pushq %rax1831; AVX-NEXT:    .cfi_def_cfa_offset 161832; AVX-NEXT:    callq lround@PLT1833; AVX-NEXT:    popq %rcx1834; AVX-NEXT:    .cfi_def_cfa_offset 81835; AVX-NEXT:    retq1836entry:1837  %result = call i32 @llvm.experimental.constrained.lround.i32.f64(double %x,1838                                               metadata !"fpexcept.strict") #01839  ret i32 %result1840}1841 1842define i32 @f28(float %x) #0 {1843; X87-LABEL: f28:1844; X87:       # %bb.0: # %entry1845; X87-NEXT:    subl $12, %esp1846; X87-NEXT:    .cfi_def_cfa_offset 161847; X87-NEXT:    flds {{[0-9]+}}(%esp)1848; X87-NEXT:    fstps (%esp)1849; X87-NEXT:    wait1850; X87-NEXT:    calll lroundf1851; X87-NEXT:    addl $12, %esp1852; X87-NEXT:    .cfi_def_cfa_offset 41853; X87-NEXT:    retl1854;1855; X86-SSE-LABEL: f28:1856; X86-SSE:       # %bb.0: # %entry1857; X86-SSE-NEXT:    subl $12, %esp1858; X86-SSE-NEXT:    .cfi_def_cfa_offset 161859; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1860; X86-SSE-NEXT:    movss %xmm0, (%esp)1861; X86-SSE-NEXT:    calll lroundf1862; X86-SSE-NEXT:    addl $12, %esp1863; X86-SSE-NEXT:    .cfi_def_cfa_offset 41864; X86-SSE-NEXT:    retl1865;1866; SSE-LABEL: f28:1867; SSE:       # %bb.0: # %entry1868; SSE-NEXT:    pushq %rax1869; SSE-NEXT:    .cfi_def_cfa_offset 161870; SSE-NEXT:    callq lroundf@PLT1871; SSE-NEXT:    popq %rcx1872; SSE-NEXT:    .cfi_def_cfa_offset 81873; SSE-NEXT:    retq1874;1875; AVX-LABEL: f28:1876; AVX:       # %bb.0: # %entry1877; AVX-NEXT:    pushq %rax1878; AVX-NEXT:    .cfi_def_cfa_offset 161879; AVX-NEXT:    callq lroundf@PLT1880; AVX-NEXT:    popq %rcx1881; AVX-NEXT:    .cfi_def_cfa_offset 81882; AVX-NEXT:    retq1883entry:1884  %result = call i32 @llvm.experimental.constrained.lround.i32.f32(float %x,1885                                               metadata !"fpexcept.strict") #01886  ret i32 %result1887}1888 1889define i64 @f29(double %x) #0 {1890; X87-LABEL: f29:1891; X87:       # %bb.0: # %entry1892; X87-NEXT:    subl $12, %esp1893; X87-NEXT:    .cfi_def_cfa_offset 161894; X87-NEXT:    fldl {{[0-9]+}}(%esp)1895; X87-NEXT:    fstpl (%esp)1896; X87-NEXT:    wait1897; X87-NEXT:    calll llround1898; X87-NEXT:    addl $12, %esp1899; X87-NEXT:    .cfi_def_cfa_offset 41900; X87-NEXT:    retl1901;1902; X86-SSE-LABEL: f29:1903; X86-SSE:       # %bb.0: # %entry1904; X86-SSE-NEXT:    subl $12, %esp1905; X86-SSE-NEXT:    .cfi_def_cfa_offset 161906; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1907; X86-SSE-NEXT:    movsd %xmm0, (%esp)1908; X86-SSE-NEXT:    calll llround1909; X86-SSE-NEXT:    addl $12, %esp1910; X86-SSE-NEXT:    .cfi_def_cfa_offset 41911; X86-SSE-NEXT:    retl1912;1913; SSE-LABEL: f29:1914; SSE:       # %bb.0: # %entry1915; SSE-NEXT:    pushq %rax1916; SSE-NEXT:    .cfi_def_cfa_offset 161917; SSE-NEXT:    callq llround@PLT1918; SSE-NEXT:    popq %rcx1919; SSE-NEXT:    .cfi_def_cfa_offset 81920; SSE-NEXT:    retq1921;1922; AVX-LABEL: f29:1923; AVX:       # %bb.0: # %entry1924; AVX-NEXT:    pushq %rax1925; AVX-NEXT:    .cfi_def_cfa_offset 161926; AVX-NEXT:    callq llround@PLT1927; AVX-NEXT:    popq %rcx1928; AVX-NEXT:    .cfi_def_cfa_offset 81929; AVX-NEXT:    retq1930entry:1931  %result = call i64 @llvm.experimental.constrained.llround.i64.f64(double %x,1932                                               metadata !"fpexcept.strict") #01933  ret i64 %result1934}1935 1936define i64 @f30(float %x) #0 {1937; X87-LABEL: f30:1938; X87:       # %bb.0: # %entry1939; X87-NEXT:    subl $12, %esp1940; X87-NEXT:    .cfi_def_cfa_offset 161941; X87-NEXT:    flds {{[0-9]+}}(%esp)1942; X87-NEXT:    fstps (%esp)1943; X87-NEXT:    wait1944; X87-NEXT:    calll llroundf1945; X87-NEXT:    addl $12, %esp1946; X87-NEXT:    .cfi_def_cfa_offset 41947; X87-NEXT:    retl1948;1949; X86-SSE-LABEL: f30:1950; X86-SSE:       # %bb.0: # %entry1951; X86-SSE-NEXT:    subl $12, %esp1952; X86-SSE-NEXT:    .cfi_def_cfa_offset 161953; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1954; X86-SSE-NEXT:    movss %xmm0, (%esp)1955; X86-SSE-NEXT:    calll llroundf1956; X86-SSE-NEXT:    addl $12, %esp1957; X86-SSE-NEXT:    .cfi_def_cfa_offset 41958; X86-SSE-NEXT:    retl1959;1960; SSE-LABEL: f30:1961; SSE:       # %bb.0: # %entry1962; SSE-NEXT:    pushq %rax1963; SSE-NEXT:    .cfi_def_cfa_offset 161964; SSE-NEXT:    callq llroundf@PLT1965; SSE-NEXT:    popq %rcx1966; SSE-NEXT:    .cfi_def_cfa_offset 81967; SSE-NEXT:    retq1968;1969; AVX-LABEL: f30:1970; AVX:       # %bb.0: # %entry1971; AVX-NEXT:    pushq %rax1972; AVX-NEXT:    .cfi_def_cfa_offset 161973; AVX-NEXT:    callq llroundf@PLT1974; AVX-NEXT:    popq %rcx1975; AVX-NEXT:    .cfi_def_cfa_offset 81976; AVX-NEXT:    retq1977entry:1978  %result = call i64 @llvm.experimental.constrained.llround.i64.f32(float %x,1979                                               metadata !"fpexcept.strict") #01980  ret i64 %result1981}1982 1983; Verify that sitofp(%x) isn't simplified when the rounding mode is1984; unknown.1985; Verify that no gross errors happen.1986define double @sifdb(i8 %x) #0 {1987; X87-LABEL: sifdb:1988; X87:       # %bb.0: # %entry1989; X87-NEXT:    pushl %eax1990; X87-NEXT:    .cfi_def_cfa_offset 81991; X87-NEXT:    movsbl {{[0-9]+}}(%esp), %eax1992; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)1993; X87-NEXT:    filds {{[0-9]+}}(%esp)1994; X87-NEXT:    wait1995; X87-NEXT:    popl %eax1996; X87-NEXT:    .cfi_def_cfa_offset 41997; X87-NEXT:    retl1998;1999; X86-SSE-LABEL: sifdb:2000; X86-SSE:       # %bb.0: # %entry2001; X86-SSE-NEXT:    subl $12, %esp2002; X86-SSE-NEXT:    .cfi_def_cfa_offset 162003; X86-SSE-NEXT:    movsbl {{[0-9]+}}(%esp), %eax2004; X86-SSE-NEXT:    cvtsi2sd %eax, %xmm02005; X86-SSE-NEXT:    movsd %xmm0, (%esp)2006; X86-SSE-NEXT:    fldl (%esp)2007; X86-SSE-NEXT:    wait2008; X86-SSE-NEXT:    addl $12, %esp2009; X86-SSE-NEXT:    .cfi_def_cfa_offset 42010; X86-SSE-NEXT:    retl2011;2012; SSE-LABEL: sifdb:2013; SSE:       # %bb.0: # %entry2014; SSE-NEXT:    movsbl %dil, %eax2015; SSE-NEXT:    cvtsi2sd %eax, %xmm02016; SSE-NEXT:    retq2017;2018; AVX-LABEL: sifdb:2019; AVX:       # %bb.0: # %entry2020; AVX-NEXT:    movsbl %dil, %eax2021; AVX-NEXT:    vcvtsi2sd %eax, %xmm15, %xmm02022; AVX-NEXT:    retq2023entry:2024  %result = call double @llvm.experimental.constrained.sitofp.f64.i8(i8 %x,2025                                               metadata !"round.dynamic",2026                                               metadata !"fpexcept.strict") #02027  ret double %result2028}2029 2030define double @sifdw(i16 %x) #0 {2031; X87-LABEL: sifdw:2032; X87:       # %bb.0: # %entry2033; X87-NEXT:    pushl %eax2034; X87-NEXT:    .cfi_def_cfa_offset 82035; X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax2036; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)2037; X87-NEXT:    filds {{[0-9]+}}(%esp)2038; X87-NEXT:    wait2039; X87-NEXT:    popl %eax2040; X87-NEXT:    .cfi_def_cfa_offset 42041; X87-NEXT:    retl2042;2043; X86-SSE-LABEL: sifdw:2044; X86-SSE:       # %bb.0: # %entry2045; X86-SSE-NEXT:    subl $12, %esp2046; X86-SSE-NEXT:    .cfi_def_cfa_offset 162047; X86-SSE-NEXT:    movswl {{[0-9]+}}(%esp), %eax2048; X86-SSE-NEXT:    cvtsi2sd %eax, %xmm02049; X86-SSE-NEXT:    movsd %xmm0, (%esp)2050; X86-SSE-NEXT:    fldl (%esp)2051; X86-SSE-NEXT:    wait2052; X86-SSE-NEXT:    addl $12, %esp2053; X86-SSE-NEXT:    .cfi_def_cfa_offset 42054; X86-SSE-NEXT:    retl2055;2056; SSE-LABEL: sifdw:2057; SSE:       # %bb.0: # %entry2058; SSE-NEXT:    movswl %di, %eax2059; SSE-NEXT:    cvtsi2sd %eax, %xmm02060; SSE-NEXT:    retq2061;2062; AVX-LABEL: sifdw:2063; AVX:       # %bb.0: # %entry2064; AVX-NEXT:    movswl %di, %eax2065; AVX-NEXT:    vcvtsi2sd %eax, %xmm15, %xmm02066; AVX-NEXT:    retq2067entry:2068  %result = call double @llvm.experimental.constrained.sitofp.f64.i16(i16 %x,2069                                               metadata !"round.dynamic",2070                                               metadata !"fpexcept.strict") #02071  ret double %result2072}2073 2074define double @sifdi(i32 %x) #0 {2075; X87-LABEL: sifdi:2076; X87:       # %bb.0: # %entry2077; X87-NEXT:    pushl %eax2078; X87-NEXT:    .cfi_def_cfa_offset 82079; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax2080; X87-NEXT:    movl %eax, (%esp)2081; X87-NEXT:    fildl (%esp)2082; X87-NEXT:    wait2083; X87-NEXT:    popl %eax2084; X87-NEXT:    .cfi_def_cfa_offset 42085; X87-NEXT:    retl2086;2087; X86-SSE-LABEL: sifdi:2088; X86-SSE:       # %bb.0: # %entry2089; X86-SSE-NEXT:    subl $12, %esp2090; X86-SSE-NEXT:    .cfi_def_cfa_offset 162091; X86-SSE-NEXT:    cvtsi2sdl {{[0-9]+}}(%esp), %xmm02092; X86-SSE-NEXT:    movsd %xmm0, (%esp)2093; X86-SSE-NEXT:    fldl (%esp)2094; X86-SSE-NEXT:    wait2095; X86-SSE-NEXT:    addl $12, %esp2096; X86-SSE-NEXT:    .cfi_def_cfa_offset 42097; X86-SSE-NEXT:    retl2098;2099; SSE-LABEL: sifdi:2100; SSE:       # %bb.0: # %entry2101; SSE-NEXT:    cvtsi2sd %edi, %xmm02102; SSE-NEXT:    retq2103;2104; AVX-LABEL: sifdi:2105; AVX:       # %bb.0: # %entry2106; AVX-NEXT:    vcvtsi2sd %edi, %xmm15, %xmm02107; AVX-NEXT:    retq2108entry:2109  %result = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %x,2110                                               metadata !"round.dynamic",2111                                               metadata !"fpexcept.strict") #02112  ret double %result2113}2114 2115define float @siffb(i8 %x) #0 {2116; X87-LABEL: siffb:2117; X87:       # %bb.0: # %entry2118; X87-NEXT:    pushl %eax2119; X87-NEXT:    .cfi_def_cfa_offset 82120; X87-NEXT:    movsbl {{[0-9]+}}(%esp), %eax2121; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)2122; X87-NEXT:    filds {{[0-9]+}}(%esp)2123; X87-NEXT:    wait2124; X87-NEXT:    popl %eax2125; X87-NEXT:    .cfi_def_cfa_offset 42126; X87-NEXT:    retl2127;2128; X86-SSE-LABEL: siffb:2129; X86-SSE:       # %bb.0: # %entry2130; X86-SSE-NEXT:    pushl %eax2131; X86-SSE-NEXT:    .cfi_def_cfa_offset 82132; X86-SSE-NEXT:    movsbl {{[0-9]+}}(%esp), %eax2133; X86-SSE-NEXT:    cvtsi2ss %eax, %xmm02134; X86-SSE-NEXT:    movss %xmm0, (%esp)2135; X86-SSE-NEXT:    flds (%esp)2136; X86-SSE-NEXT:    wait2137; X86-SSE-NEXT:    popl %eax2138; X86-SSE-NEXT:    .cfi_def_cfa_offset 42139; X86-SSE-NEXT:    retl2140;2141; SSE-LABEL: siffb:2142; SSE:       # %bb.0: # %entry2143; SSE-NEXT:    movsbl %dil, %eax2144; SSE-NEXT:    cvtsi2ss %eax, %xmm02145; SSE-NEXT:    retq2146;2147; AVX-LABEL: siffb:2148; AVX:       # %bb.0: # %entry2149; AVX-NEXT:    movsbl %dil, %eax2150; AVX-NEXT:    vcvtsi2ss %eax, %xmm15, %xmm02151; AVX-NEXT:    retq2152entry:2153  %result = call float @llvm.experimental.constrained.sitofp.f32.i8(i8 %x,2154                                               metadata !"round.dynamic",2155                                               metadata !"fpexcept.strict") #02156  ret float %result2157}2158 2159define float @siffw(i16 %x) #0 {2160; X87-LABEL: siffw:2161; X87:       # %bb.0: # %entry2162; X87-NEXT:    pushl %eax2163; X87-NEXT:    .cfi_def_cfa_offset 82164; X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax2165; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)2166; X87-NEXT:    filds {{[0-9]+}}(%esp)2167; X87-NEXT:    wait2168; X87-NEXT:    popl %eax2169; X87-NEXT:    .cfi_def_cfa_offset 42170; X87-NEXT:    retl2171;2172; X86-SSE-LABEL: siffw:2173; X86-SSE:       # %bb.0: # %entry2174; X86-SSE-NEXT:    pushl %eax2175; X86-SSE-NEXT:    .cfi_def_cfa_offset 82176; X86-SSE-NEXT:    movswl {{[0-9]+}}(%esp), %eax2177; X86-SSE-NEXT:    cvtsi2ss %eax, %xmm02178; X86-SSE-NEXT:    movss %xmm0, (%esp)2179; X86-SSE-NEXT:    flds (%esp)2180; X86-SSE-NEXT:    wait2181; X86-SSE-NEXT:    popl %eax2182; X86-SSE-NEXT:    .cfi_def_cfa_offset 42183; X86-SSE-NEXT:    retl2184;2185; SSE-LABEL: siffw:2186; SSE:       # %bb.0: # %entry2187; SSE-NEXT:    movswl %di, %eax2188; SSE-NEXT:    cvtsi2ss %eax, %xmm02189; SSE-NEXT:    retq2190;2191; AVX-LABEL: siffw:2192; AVX:       # %bb.0: # %entry2193; AVX-NEXT:    movswl %di, %eax2194; AVX-NEXT:    vcvtsi2ss %eax, %xmm15, %xmm02195; AVX-NEXT:    retq2196entry:2197  %result = call float @llvm.experimental.constrained.sitofp.f32.i16(i16 %x,2198                                               metadata !"round.dynamic",2199                                               metadata !"fpexcept.strict") #02200  ret float %result2201}2202 2203define float @siffi(i32 %x) #0 {2204; X87-LABEL: siffi:2205; X87:       # %bb.0: # %entry2206; X87-NEXT:    pushl %eax2207; X87-NEXT:    .cfi_def_cfa_offset 82208; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax2209; X87-NEXT:    movl %eax, (%esp)2210; X87-NEXT:    fildl (%esp)2211; X87-NEXT:    wait2212; X87-NEXT:    popl %eax2213; X87-NEXT:    .cfi_def_cfa_offset 42214; X87-NEXT:    retl2215;2216; X86-SSE-LABEL: siffi:2217; X86-SSE:       # %bb.0: # %entry2218; X86-SSE-NEXT:    pushl %eax2219; X86-SSE-NEXT:    .cfi_def_cfa_offset 82220; X86-SSE-NEXT:    cvtsi2ssl {{[0-9]+}}(%esp), %xmm02221; X86-SSE-NEXT:    movss %xmm0, (%esp)2222; X86-SSE-NEXT:    flds (%esp)2223; X86-SSE-NEXT:    wait2224; X86-SSE-NEXT:    popl %eax2225; X86-SSE-NEXT:    .cfi_def_cfa_offset 42226; X86-SSE-NEXT:    retl2227;2228; SSE-LABEL: siffi:2229; SSE:       # %bb.0: # %entry2230; SSE-NEXT:    cvtsi2ss %edi, %xmm02231; SSE-NEXT:    retq2232;2233; AVX-LABEL: siffi:2234; AVX:       # %bb.0: # %entry2235; AVX-NEXT:    vcvtsi2ss %edi, %xmm15, %xmm02236; AVX-NEXT:    retq2237entry:2238  %result = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %x,2239                                               metadata !"round.dynamic",2240                                               metadata !"fpexcept.strict") #02241  ret float %result2242}2243 2244define double @sifdl(i64 %x) #0 {2245; X87-LABEL: sifdl:2246; X87:       # %bb.0: # %entry2247; X87-NEXT:    fildll {{[0-9]+}}(%esp)2248; X87-NEXT:    wait2249; X87-NEXT:    retl2250;2251; X86-SSE-LABEL: sifdl:2252; X86-SSE:       # %bb.0: # %entry2253; X86-SSE-NEXT:    subl $12, %esp2254; X86-SSE-NEXT:    .cfi_def_cfa_offset 162255; X86-SSE-NEXT:    fildll {{[0-9]+}}(%esp)2256; X86-SSE-NEXT:    fstpl (%esp)2257; X86-SSE-NEXT:    fldl (%esp)2258; X86-SSE-NEXT:    wait2259; X86-SSE-NEXT:    addl $12, %esp2260; X86-SSE-NEXT:    .cfi_def_cfa_offset 42261; X86-SSE-NEXT:    retl2262;2263; SSE-LABEL: sifdl:2264; SSE:       # %bb.0: # %entry2265; SSE-NEXT:    cvtsi2sd %rdi, %xmm02266; SSE-NEXT:    retq2267;2268; AVX-LABEL: sifdl:2269; AVX:       # %bb.0: # %entry2270; AVX-NEXT:    vcvtsi2sd %rdi, %xmm15, %xmm02271; AVX-NEXT:    retq2272entry:2273  %result = call double @llvm.experimental.constrained.sitofp.f64.i64(i64 %x,2274                                               metadata !"round.dynamic",2275                                               metadata !"fpexcept.strict") #02276  ret double %result2277}2278 2279define float @siffl(i64 %x) #0 {2280; X87-LABEL: siffl:2281; X87:       # %bb.0: # %entry2282; X87-NEXT:    fildll {{[0-9]+}}(%esp)2283; X87-NEXT:    wait2284; X87-NEXT:    retl2285;2286; X86-SSE-LABEL: siffl:2287; X86-SSE:       # %bb.0: # %entry2288; X86-SSE-NEXT:    pushl %eax2289; X86-SSE-NEXT:    .cfi_def_cfa_offset 82290; X86-SSE-NEXT:    fildll {{[0-9]+}}(%esp)2291; X86-SSE-NEXT:    fstps (%esp)2292; X86-SSE-NEXT:    flds (%esp)2293; X86-SSE-NEXT:    wait2294; X86-SSE-NEXT:    popl %eax2295; X86-SSE-NEXT:    .cfi_def_cfa_offset 42296; X86-SSE-NEXT:    retl2297;2298; SSE-LABEL: siffl:2299; SSE:       # %bb.0: # %entry2300; SSE-NEXT:    cvtsi2ss %rdi, %xmm02301; SSE-NEXT:    retq2302;2303; AVX-LABEL: siffl:2304; AVX:       # %bb.0: # %entry2305; AVX-NEXT:    vcvtsi2ss %rdi, %xmm15, %xmm02306; AVX-NEXT:    retq2307entry:2308  %result = call float @llvm.experimental.constrained.sitofp.f32.i64(i64 %x,2309                                               metadata !"round.dynamic",2310                                               metadata !"fpexcept.strict") #02311  ret float %result2312}2313 2314; Verify that uitofp(%x) isn't simplified when the rounding mode is2315; unknown.2316; Verify that no gross errors happen.2317define double @uifdb(i8 %x) #0 {2318; X87-LABEL: uifdb:2319; X87:       # %bb.0: # %entry2320; X87-NEXT:    pushl %eax2321; X87-NEXT:    .cfi_def_cfa_offset 82322; X87-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2323; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)2324; X87-NEXT:    filds {{[0-9]+}}(%esp)2325; X87-NEXT:    wait2326; X87-NEXT:    popl %eax2327; X87-NEXT:    .cfi_def_cfa_offset 42328; X87-NEXT:    retl2329;2330; X86-SSE-LABEL: uifdb:2331; X86-SSE:       # %bb.0: # %entry2332; X86-SSE-NEXT:    subl $12, %esp2333; X86-SSE-NEXT:    .cfi_def_cfa_offset 162334; X86-SSE-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2335; X86-SSE-NEXT:    cvtsi2sd %eax, %xmm02336; X86-SSE-NEXT:    movsd %xmm0, (%esp)2337; X86-SSE-NEXT:    fldl (%esp)2338; X86-SSE-NEXT:    wait2339; X86-SSE-NEXT:    addl $12, %esp2340; X86-SSE-NEXT:    .cfi_def_cfa_offset 42341; X86-SSE-NEXT:    retl2342;2343; SSE-LABEL: uifdb:2344; SSE:       # %bb.0: # %entry2345; SSE-NEXT:    movzbl %dil, %eax2346; SSE-NEXT:    cvtsi2sd %eax, %xmm02347; SSE-NEXT:    retq2348;2349; AVX-LABEL: uifdb:2350; AVX:       # %bb.0: # %entry2351; AVX-NEXT:    movzbl %dil, %eax2352; AVX-NEXT:    vcvtsi2sd %eax, %xmm15, %xmm02353; AVX-NEXT:    retq2354entry:2355  %result = call double @llvm.experimental.constrained.uitofp.f64.i8(i8 %x,2356                                               metadata !"round.dynamic",2357                                               metadata !"fpexcept.strict") #02358  ret double %result2359}2360 2361define double @uifdw(i16 %x) #0 {2362; X87-LABEL: uifdw:2363; X87:       # %bb.0: # %entry2364; X87-NEXT:    pushl %eax2365; X87-NEXT:    .cfi_def_cfa_offset 82366; X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax2367; X87-NEXT:    movl %eax, (%esp)2368; X87-NEXT:    fildl (%esp)2369; X87-NEXT:    wait2370; X87-NEXT:    popl %eax2371; X87-NEXT:    .cfi_def_cfa_offset 42372; X87-NEXT:    retl2373;2374; X86-SSE-LABEL: uifdw:2375; X86-SSE:       # %bb.0: # %entry2376; X86-SSE-NEXT:    subl $12, %esp2377; X86-SSE-NEXT:    .cfi_def_cfa_offset 162378; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax2379; X86-SSE-NEXT:    cvtsi2sd %eax, %xmm02380; X86-SSE-NEXT:    movsd %xmm0, (%esp)2381; X86-SSE-NEXT:    fldl (%esp)2382; X86-SSE-NEXT:    wait2383; X86-SSE-NEXT:    addl $12, %esp2384; X86-SSE-NEXT:    .cfi_def_cfa_offset 42385; X86-SSE-NEXT:    retl2386;2387; SSE-LABEL: uifdw:2388; SSE:       # %bb.0: # %entry2389; SSE-NEXT:    movzwl %di, %eax2390; SSE-NEXT:    cvtsi2sd %eax, %xmm02391; SSE-NEXT:    retq2392;2393; AVX-LABEL: uifdw:2394; AVX:       # %bb.0: # %entry2395; AVX-NEXT:    movzwl %di, %eax2396; AVX-NEXT:    vcvtsi2sd %eax, %xmm15, %xmm02397; AVX-NEXT:    retq2398entry:2399  %result = call double @llvm.experimental.constrained.uitofp.f64.i16(i16 %x,2400                                               metadata !"round.dynamic",2401                                               metadata !"fpexcept.strict") #02402  ret double %result2403}2404 2405define double @uifdi(i32 %x) #0 {2406; X87-LABEL: uifdi:2407; X87:       # %bb.0: # %entry2408; X87-NEXT:    subl $12, %esp2409; X87-NEXT:    .cfi_def_cfa_offset 162410; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax2411; X87-NEXT:    movl %eax, (%esp)2412; X87-NEXT:    movl $0, {{[0-9]+}}(%esp)2413; X87-NEXT:    fildll (%esp)2414; X87-NEXT:    wait2415; X87-NEXT:    addl $12, %esp2416; X87-NEXT:    .cfi_def_cfa_offset 42417; X87-NEXT:    retl2418;2419; X86-SSE-LABEL: uifdi:2420; X86-SSE:       # %bb.0: # %entry2421; X86-SSE-NEXT:    subl $20, %esp2422; X86-SSE-NEXT:    .cfi_def_cfa_offset 242423; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2424; X86-SSE-NEXT:    movl %eax, (%esp)2425; X86-SSE-NEXT:    movl $0, {{[0-9]+}}(%esp)2426; X86-SSE-NEXT:    fildll (%esp)2427; X86-SSE-NEXT:    fstpl {{[0-9]+}}(%esp)2428; X86-SSE-NEXT:    fldl {{[0-9]+}}(%esp)2429; X86-SSE-NEXT:    wait2430; X86-SSE-NEXT:    addl $20, %esp2431; X86-SSE-NEXT:    .cfi_def_cfa_offset 42432; X86-SSE-NEXT:    retl2433;2434; SSE-LABEL: uifdi:2435; SSE:       # %bb.0: # %entry2436; SSE-NEXT:    movl %edi, %eax2437; SSE-NEXT:    cvtsi2sd %rax, %xmm02438; SSE-NEXT:    retq2439;2440; AVX1-LABEL: uifdi:2441; AVX1:       # %bb.0: # %entry2442; AVX1-NEXT:    movl %edi, %eax2443; AVX1-NEXT:    vcvtsi2sd %rax, %xmm15, %xmm02444; AVX1-NEXT:    retq2445;2446; AVX512-LABEL: uifdi:2447; AVX512:       # %bb.0: # %entry2448; AVX512-NEXT:    vcvtusi2sd %edi, %xmm15, %xmm02449; AVX512-NEXT:    retq2450entry:2451  %result = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %x,2452                                               metadata !"round.dynamic",2453                                               metadata !"fpexcept.strict") #02454  ret double %result2455}2456 2457define double @uifdl(i64 %x) #0 {2458; X87-LABEL: uifdl:2459; X87:       # %bb.0: # %entry2460; X87-NEXT:    subl $20, %esp2461; X87-NEXT:    .cfi_def_cfa_offset 242462; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax2463; X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx2464; X87-NEXT:    movl %ecx, {{[0-9]+}}(%esp)2465; X87-NEXT:    movl %eax, (%esp)2466; X87-NEXT:    shrl $31, %ecx2467; X87-NEXT:    fildll (%esp)2468; X87-NEXT:    fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4)2469; X87-NEXT:    fstpl {{[0-9]+}}(%esp)2470; X87-NEXT:    fldl {{[0-9]+}}(%esp)2471; X87-NEXT:    wait2472; X87-NEXT:    addl $20, %esp2473; X87-NEXT:    .cfi_def_cfa_offset 42474; X87-NEXT:    retl2475;2476; X86-SSE-LABEL: uifdl:2477; X86-SSE:       # %bb.0: # %entry2478; X86-SSE-NEXT:    subl $28, %esp2479; X86-SSE-NEXT:    .cfi_def_cfa_offset 322480; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2481; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2482; X86-SSE-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)2483; X86-SSE-NEXT:    shrl $31, %eax2484; X86-SSE-NEXT:    fildll {{[0-9]+}}(%esp)2485; X86-SSE-NEXT:    fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%eax,4)2486; X86-SSE-NEXT:    fstpl {{[0-9]+}}(%esp)2487; X86-SSE-NEXT:    wait2488; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2489; X86-SSE-NEXT:    movsd %xmm0, (%esp)2490; X86-SSE-NEXT:    fldl (%esp)2491; X86-SSE-NEXT:    wait2492; X86-SSE-NEXT:    addl $28, %esp2493; X86-SSE-NEXT:    .cfi_def_cfa_offset 42494; X86-SSE-NEXT:    retl2495;2496; SSE-LABEL: uifdl:2497; SSE:       # %bb.0: # %entry2498; SSE-NEXT:    movq %rdi, %rax2499; SSE-NEXT:    shrq %rax2500; SSE-NEXT:    movl %edi, %ecx2501; SSE-NEXT:    andl $1, %ecx2502; SSE-NEXT:    orq %rax, %rcx2503; SSE-NEXT:    testq %rdi, %rdi2504; SSE-NEXT:    cmovnsq %rdi, %rcx2505; SSE-NEXT:    cvtsi2sd %rcx, %xmm02506; SSE-NEXT:    jns .LBB48_22507; SSE-NEXT:  # %bb.1:2508; SSE-NEXT:    addsd %xmm0, %xmm02509; SSE-NEXT:  .LBB48_2: # %entry2510; SSE-NEXT:    retq2511;2512; AVX1-LABEL: uifdl:2513; AVX1:       # %bb.0: # %entry2514; AVX1-NEXT:    movq %rdi, %rax2515; AVX1-NEXT:    shrq %rax2516; AVX1-NEXT:    movl %edi, %ecx2517; AVX1-NEXT:    andl $1, %ecx2518; AVX1-NEXT:    orq %rax, %rcx2519; AVX1-NEXT:    testq %rdi, %rdi2520; AVX1-NEXT:    cmovnsq %rdi, %rcx2521; AVX1-NEXT:    vcvtsi2sd %rcx, %xmm15, %xmm02522; AVX1-NEXT:    jns .LBB48_22523; AVX1-NEXT:  # %bb.1:2524; AVX1-NEXT:    vaddsd %xmm0, %xmm0, %xmm02525; AVX1-NEXT:  .LBB48_2: # %entry2526; AVX1-NEXT:    retq2527;2528; AVX512-LABEL: uifdl:2529; AVX512:       # %bb.0: # %entry2530; AVX512-NEXT:    vcvtusi2sd %rdi, %xmm15, %xmm02531; AVX512-NEXT:    retq2532entry:2533  %result = call double @llvm.experimental.constrained.uitofp.f64.i64(i64 %x,2534                                               metadata !"round.dynamic",2535                                               metadata !"fpexcept.strict") #02536  ret double %result2537}2538 2539define float @uiffb(i8 %x) #0 {2540; X87-LABEL: uiffb:2541; X87:       # %bb.0: # %entry2542; X87-NEXT:    pushl %eax2543; X87-NEXT:    .cfi_def_cfa_offset 82544; X87-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2545; X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)2546; X87-NEXT:    filds {{[0-9]+}}(%esp)2547; X87-NEXT:    wait2548; X87-NEXT:    popl %eax2549; X87-NEXT:    .cfi_def_cfa_offset 42550; X87-NEXT:    retl2551;2552; X86-SSE-LABEL: uiffb:2553; X86-SSE:       # %bb.0: # %entry2554; X86-SSE-NEXT:    pushl %eax2555; X86-SSE-NEXT:    .cfi_def_cfa_offset 82556; X86-SSE-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2557; X86-SSE-NEXT:    cvtsi2ss %eax, %xmm02558; X86-SSE-NEXT:    movss %xmm0, (%esp)2559; X86-SSE-NEXT:    flds (%esp)2560; X86-SSE-NEXT:    wait2561; X86-SSE-NEXT:    popl %eax2562; X86-SSE-NEXT:    .cfi_def_cfa_offset 42563; X86-SSE-NEXT:    retl2564;2565; SSE-LABEL: uiffb:2566; SSE:       # %bb.0: # %entry2567; SSE-NEXT:    movzbl %dil, %eax2568; SSE-NEXT:    cvtsi2ss %eax, %xmm02569; SSE-NEXT:    retq2570;2571; AVX-LABEL: uiffb:2572; AVX:       # %bb.0: # %entry2573; AVX-NEXT:    movzbl %dil, %eax2574; AVX-NEXT:    vcvtsi2ss %eax, %xmm15, %xmm02575; AVX-NEXT:    retq2576entry:2577  %result = call float @llvm.experimental.constrained.uitofp.f32.i8(i8 %x,2578                                               metadata !"round.dynamic",2579                                               metadata !"fpexcept.strict") #02580  ret float %result2581}2582 2583define float @uiffw(i16 %x) #0 {2584; X87-LABEL: uiffw:2585; X87:       # %bb.0: # %entry2586; X87-NEXT:    pushl %eax2587; X87-NEXT:    .cfi_def_cfa_offset 82588; X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax2589; X87-NEXT:    movl %eax, (%esp)2590; X87-NEXT:    fildl (%esp)2591; X87-NEXT:    wait2592; X87-NEXT:    popl %eax2593; X87-NEXT:    .cfi_def_cfa_offset 42594; X87-NEXT:    retl2595;2596; X86-SSE-LABEL: uiffw:2597; X86-SSE:       # %bb.0: # %entry2598; X86-SSE-NEXT:    pushl %eax2599; X86-SSE-NEXT:    .cfi_def_cfa_offset 82600; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax2601; X86-SSE-NEXT:    cvtsi2ss %eax, %xmm02602; X86-SSE-NEXT:    movss %xmm0, (%esp)2603; X86-SSE-NEXT:    flds (%esp)2604; X86-SSE-NEXT:    wait2605; X86-SSE-NEXT:    popl %eax2606; X86-SSE-NEXT:    .cfi_def_cfa_offset 42607; X86-SSE-NEXT:    retl2608;2609; SSE-LABEL: uiffw:2610; SSE:       # %bb.0: # %entry2611; SSE-NEXT:    movzwl %di, %eax2612; SSE-NEXT:    cvtsi2ss %eax, %xmm02613; SSE-NEXT:    retq2614;2615; AVX-LABEL: uiffw:2616; AVX:       # %bb.0: # %entry2617; AVX-NEXT:    movzwl %di, %eax2618; AVX-NEXT:    vcvtsi2ss %eax, %xmm15, %xmm02619; AVX-NEXT:    retq2620entry:2621  %result = call float @llvm.experimental.constrained.uitofp.f32.i16(i16 %x,2622                                               metadata !"round.dynamic",2623                                               metadata !"fpexcept.strict") #02624  ret float %result2625}2626 2627define float @uiffi(i32 %x) #0 {2628; X87-LABEL: uiffi:2629; X87:       # %bb.0: # %entry2630; X87-NEXT:    subl $12, %esp2631; X87-NEXT:    .cfi_def_cfa_offset 162632; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax2633; X87-NEXT:    movl %eax, (%esp)2634; X87-NEXT:    movl $0, {{[0-9]+}}(%esp)2635; X87-NEXT:    fildll (%esp)2636; X87-NEXT:    wait2637; X87-NEXT:    addl $12, %esp2638; X87-NEXT:    .cfi_def_cfa_offset 42639; X87-NEXT:    retl2640;2641; X86-SSE-LABEL: uiffi:2642; X86-SSE:       # %bb.0: # %entry2643; X86-SSE-NEXT:    subl $20, %esp2644; X86-SSE-NEXT:    .cfi_def_cfa_offset 242645; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2646; X86-SSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)2647; X86-SSE-NEXT:    movl $0, {{[0-9]+}}(%esp)2648; X86-SSE-NEXT:    fildll {{[0-9]+}}(%esp)2649; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)2650; X86-SSE-NEXT:    flds {{[0-9]+}}(%esp)2651; X86-SSE-NEXT:    wait2652; X86-SSE-NEXT:    addl $20, %esp2653; X86-SSE-NEXT:    .cfi_def_cfa_offset 42654; X86-SSE-NEXT:    retl2655;2656; SSE-LABEL: uiffi:2657; SSE:       # %bb.0: # %entry2658; SSE-NEXT:    movl %edi, %eax2659; SSE-NEXT:    cvtsi2ss %rax, %xmm02660; SSE-NEXT:    retq2661;2662; AVX1-LABEL: uiffi:2663; AVX1:       # %bb.0: # %entry2664; AVX1-NEXT:    movl %edi, %eax2665; AVX1-NEXT:    vcvtsi2ss %rax, %xmm15, %xmm02666; AVX1-NEXT:    retq2667;2668; AVX512-LABEL: uiffi:2669; AVX512:       # %bb.0: # %entry2670; AVX512-NEXT:    vcvtusi2ss %edi, %xmm15, %xmm02671; AVX512-NEXT:    retq2672entry:2673  %result = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %x,2674                                               metadata !"round.dynamic",2675                                               metadata !"fpexcept.strict") #02676  ret float %result2677}2678 2679define float @uiffl(i64 %x) #0 {2680; X87-LABEL: uiffl:2681; X87:       # %bb.0: # %entry2682; X87-NEXT:    subl $20, %esp2683; X87-NEXT:    .cfi_def_cfa_offset 242684; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax2685; X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx2686; X87-NEXT:    movl %ecx, {{[0-9]+}}(%esp)2687; X87-NEXT:    movl %eax, {{[0-9]+}}(%esp)2688; X87-NEXT:    shrl $31, %ecx2689; X87-NEXT:    fildll {{[0-9]+}}(%esp)2690; X87-NEXT:    fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4)2691; X87-NEXT:    fstps {{[0-9]+}}(%esp)2692; X87-NEXT:    flds {{[0-9]+}}(%esp)2693; X87-NEXT:    wait2694; X87-NEXT:    addl $20, %esp2695; X87-NEXT:    .cfi_def_cfa_offset 42696; X87-NEXT:    retl2697;2698; X86-SSE-LABEL: uiffl:2699; X86-SSE:       # %bb.0: # %entry2700; X86-SSE-NEXT:    subl $20, %esp2701; X86-SSE-NEXT:    .cfi_def_cfa_offset 242702; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2703; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2704; X86-SSE-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)2705; X86-SSE-NEXT:    shrl $31, %eax2706; X86-SSE-NEXT:    fildll {{[0-9]+}}(%esp)2707; X86-SSE-NEXT:    fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%eax,4)2708; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)2709; X86-SSE-NEXT:    wait2710; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero2711; X86-SSE-NEXT:    movss %xmm0, (%esp)2712; X86-SSE-NEXT:    flds (%esp)2713; X86-SSE-NEXT:    wait2714; X86-SSE-NEXT:    addl $20, %esp2715; X86-SSE-NEXT:    .cfi_def_cfa_offset 42716; X86-SSE-NEXT:    retl2717;2718; SSE-LABEL: uiffl:2719; SSE:       # %bb.0: # %entry2720; SSE-NEXT:    movq %rdi, %rax2721; SSE-NEXT:    shrq %rax2722; SSE-NEXT:    movl %edi, %ecx2723; SSE-NEXT:    andl $1, %ecx2724; SSE-NEXT:    orq %rax, %rcx2725; SSE-NEXT:    testq %rdi, %rdi2726; SSE-NEXT:    cmovnsq %rdi, %rcx2727; SSE-NEXT:    cvtsi2ss %rcx, %xmm02728; SSE-NEXT:    jns .LBB52_22729; SSE-NEXT:  # %bb.1:2730; SSE-NEXT:    addss %xmm0, %xmm02731; SSE-NEXT:  .LBB52_2: # %entry2732; SSE-NEXT:    retq2733;2734; AVX1-LABEL: uiffl:2735; AVX1:       # %bb.0: # %entry2736; AVX1-NEXT:    movq %rdi, %rax2737; AVX1-NEXT:    shrq %rax2738; AVX1-NEXT:    movl %edi, %ecx2739; AVX1-NEXT:    andl $1, %ecx2740; AVX1-NEXT:    orq %rax, %rcx2741; AVX1-NEXT:    testq %rdi, %rdi2742; AVX1-NEXT:    cmovnsq %rdi, %rcx2743; AVX1-NEXT:    vcvtsi2ss %rcx, %xmm15, %xmm02744; AVX1-NEXT:    jns .LBB52_22745; AVX1-NEXT:  # %bb.1:2746; AVX1-NEXT:    vaddss %xmm0, %xmm0, %xmm02747; AVX1-NEXT:  .LBB52_2: # %entry2748; AVX1-NEXT:    retq2749;2750; AVX512-LABEL: uiffl:2751; AVX512:       # %bb.0: # %entry2752; AVX512-NEXT:    vcvtusi2ss %rdi, %xmm15, %xmm02753; AVX512-NEXT:    retq2754entry:2755  %result = call float @llvm.experimental.constrained.uitofp.f32.i64(i64 %x,2756                                               metadata !"round.dynamic",2757                                               metadata !"fpexcept.strict") #02758  ret float %result2759}2760 2761; Verify that tan(42.0) isn't simplified when the rounding mode is unknown.2762define double @ftan() #0 {2763; X87-LABEL: ftan:2764; X87:       # %bb.0: # %entry2765; X87-NEXT:    subl $12, %esp2766; X87-NEXT:    .cfi_def_cfa_offset 162767; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}2768; X87-NEXT:    fstpl (%esp)2769; X87-NEXT:    wait2770; X87-NEXT:    calll tan2771; X87-NEXT:    addl $12, %esp2772; X87-NEXT:    .cfi_def_cfa_offset 42773; X87-NEXT:    retl2774;2775; X86-SSE-LABEL: ftan:2776; X86-SSE:       # %bb.0: # %entry2777; X86-SSE-NEXT:    subl $12, %esp2778; X86-SSE-NEXT:    .cfi_def_cfa_offset 162779; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]2780; X86-SSE-NEXT:    movsd %xmm0, (%esp)2781; X86-SSE-NEXT:    calll tan2782; X86-SSE-NEXT:    addl $12, %esp2783; X86-SSE-NEXT:    .cfi_def_cfa_offset 42784; X86-SSE-NEXT:    retl2785;2786; SSE-LABEL: ftan:2787; SSE:       # %bb.0: # %entry2788; SSE-NEXT:    pushq %rax2789; SSE-NEXT:    .cfi_def_cfa_offset 162790; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]2791; SSE-NEXT:    callq tan@PLT2792; SSE-NEXT:    popq %rax2793; SSE-NEXT:    .cfi_def_cfa_offset 82794; SSE-NEXT:    retq2795;2796; AVX-LABEL: ftan:2797; AVX:       # %bb.0: # %entry2798; AVX-NEXT:    pushq %rax2799; AVX-NEXT:    .cfi_def_cfa_offset 162800; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]2801; AVX-NEXT:    callq tan@PLT2802; AVX-NEXT:    popq %rax2803; AVX-NEXT:    .cfi_def_cfa_offset 82804; AVX-NEXT:    retq2805entry:2806  %result = call double @llvm.experimental.constrained.tan.f64(double 42.0,2807                                               metadata !"round.dynamic",2808                                               metadata !"fpexcept.strict") #02809  ret double %result2810}2811 2812; Verify that acos(42.0) isn't simplified when the rounding mode is unknown.2813define double @facos() #0 {2814; X87-LABEL: facos:2815; X87:       # %bb.0: # %entry2816; X87-NEXT:    subl $12, %esp2817; X87-NEXT:    .cfi_def_cfa_offset 162818; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}2819; X87-NEXT:    fstpl (%esp)2820; X87-NEXT:    wait2821; X87-NEXT:    calll acos2822; X87-NEXT:    addl $12, %esp2823; X87-NEXT:    .cfi_def_cfa_offset 42824; X87-NEXT:    retl2825;2826; X86-SSE-LABEL: facos:2827; X86-SSE:       # %bb.0: # %entry2828; X86-SSE-NEXT:    subl $12, %esp2829; X86-SSE-NEXT:    .cfi_def_cfa_offset 162830; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]2831; X86-SSE-NEXT:    movsd %xmm0, (%esp)2832; X86-SSE-NEXT:    calll acos2833; X86-SSE-NEXT:    addl $12, %esp2834; X86-SSE-NEXT:    .cfi_def_cfa_offset 42835; X86-SSE-NEXT:    retl2836;2837; SSE-LABEL: facos:2838; SSE:       # %bb.0: # %entry2839; SSE-NEXT:    pushq %rax2840; SSE-NEXT:    .cfi_def_cfa_offset 162841; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]2842; SSE-NEXT:    callq acos@PLT2843; SSE-NEXT:    popq %rax2844; SSE-NEXT:    .cfi_def_cfa_offset 82845; SSE-NEXT:    retq2846;2847; AVX-LABEL: facos:2848; AVX:       # %bb.0: # %entry2849; AVX-NEXT:    pushq %rax2850; AVX-NEXT:    .cfi_def_cfa_offset 162851; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]2852; AVX-NEXT:    callq acos@PLT2853; AVX-NEXT:    popq %rax2854; AVX-NEXT:    .cfi_def_cfa_offset 82855; AVX-NEXT:    retq2856entry:2857  %result = call double @llvm.experimental.constrained.acos.f64(double 42.0,2858                                               metadata !"round.dynamic",2859                                               metadata !"fpexcept.strict") #02860  ret double %result2861}2862 2863; Verify that asin(42.0) isn't simplified when the rounding mode is unknown.2864define double @fasin() #0 {2865; X87-LABEL: fasin:2866; X87:       # %bb.0: # %entry2867; X87-NEXT:    subl $12, %esp2868; X87-NEXT:    .cfi_def_cfa_offset 162869; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}2870; X87-NEXT:    fstpl (%esp)2871; X87-NEXT:    wait2872; X87-NEXT:    calll asin2873; X87-NEXT:    addl $12, %esp2874; X87-NEXT:    .cfi_def_cfa_offset 42875; X87-NEXT:    retl2876;2877; X86-SSE-LABEL: fasin:2878; X86-SSE:       # %bb.0: # %entry2879; X86-SSE-NEXT:    subl $12, %esp2880; X86-SSE-NEXT:    .cfi_def_cfa_offset 162881; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]2882; X86-SSE-NEXT:    movsd %xmm0, (%esp)2883; X86-SSE-NEXT:    calll asin2884; X86-SSE-NEXT:    addl $12, %esp2885; X86-SSE-NEXT:    .cfi_def_cfa_offset 42886; X86-SSE-NEXT:    retl2887;2888; SSE-LABEL: fasin:2889; SSE:       # %bb.0: # %entry2890; SSE-NEXT:    pushq %rax2891; SSE-NEXT:    .cfi_def_cfa_offset 162892; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]2893; SSE-NEXT:    callq asin@PLT2894; SSE-NEXT:    popq %rax2895; SSE-NEXT:    .cfi_def_cfa_offset 82896; SSE-NEXT:    retq2897;2898; AVX-LABEL: fasin:2899; AVX:       # %bb.0: # %entry2900; AVX-NEXT:    pushq %rax2901; AVX-NEXT:    .cfi_def_cfa_offset 162902; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]2903; AVX-NEXT:    callq asin@PLT2904; AVX-NEXT:    popq %rax2905; AVX-NEXT:    .cfi_def_cfa_offset 82906; AVX-NEXT:    retq2907entry:2908  %result = call double @llvm.experimental.constrained.asin.f64(double 42.0,2909                                               metadata !"round.dynamic",2910                                               metadata !"fpexcept.strict") #02911  ret double %result2912}2913 2914; Verify that atan(42.0) isn't simplified when the rounding mode is unknown.2915define double @fatan() #0 {2916; X87-LABEL: fatan:2917; X87:       # %bb.0: # %entry2918; X87-NEXT:    subl $12, %esp2919; X87-NEXT:    .cfi_def_cfa_offset 162920; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}2921; X87-NEXT:    fstpl (%esp)2922; X87-NEXT:    wait2923; X87-NEXT:    calll atan2924; X87-NEXT:    addl $12, %esp2925; X87-NEXT:    .cfi_def_cfa_offset 42926; X87-NEXT:    retl2927;2928; X86-SSE-LABEL: fatan:2929; X86-SSE:       # %bb.0: # %entry2930; X86-SSE-NEXT:    subl $12, %esp2931; X86-SSE-NEXT:    .cfi_def_cfa_offset 162932; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]2933; X86-SSE-NEXT:    movsd %xmm0, (%esp)2934; X86-SSE-NEXT:    calll atan2935; X86-SSE-NEXT:    addl $12, %esp2936; X86-SSE-NEXT:    .cfi_def_cfa_offset 42937; X86-SSE-NEXT:    retl2938;2939; SSE-LABEL: fatan:2940; SSE:       # %bb.0: # %entry2941; SSE-NEXT:    pushq %rax2942; SSE-NEXT:    .cfi_def_cfa_offset 162943; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]2944; SSE-NEXT:    callq atan@PLT2945; SSE-NEXT:    popq %rax2946; SSE-NEXT:    .cfi_def_cfa_offset 82947; SSE-NEXT:    retq2948;2949; AVX-LABEL: fatan:2950; AVX:       # %bb.0: # %entry2951; AVX-NEXT:    pushq %rax2952; AVX-NEXT:    .cfi_def_cfa_offset 162953; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]2954; AVX-NEXT:    callq atan@PLT2955; AVX-NEXT:    popq %rax2956; AVX-NEXT:    .cfi_def_cfa_offset 82957; AVX-NEXT:    retq2958entry:2959  %result = call double @llvm.experimental.constrained.atan.f64(double 42.0,2960                                               metadata !"round.dynamic",2961                                               metadata !"fpexcept.strict") #02962  ret double %result2963}2964 2965; Verify that atan2(42.1, 3.0) isn't simplified when the rounding mode is unknown.2966define double @fatan2() #0 {2967; X87-LABEL: fatan2:2968; X87:       # %bb.0: # %entry2969; X87-NEXT:    subl $28, %esp2970; X87-NEXT:    .cfi_def_cfa_offset 322971; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}2972; X87-NEXT:    fstpl {{[0-9]+}}(%esp)2973; X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}2974; X87-NEXT:    fstpl (%esp)2975; X87-NEXT:    wait2976; X87-NEXT:    calll atan22977; X87-NEXT:    addl $28, %esp2978; X87-NEXT:    .cfi_def_cfa_offset 42979; X87-NEXT:    retl2980;2981; X86-SSE-LABEL: fatan2:2982; X86-SSE:       # %bb.0: # %entry2983; X86-SSE-NEXT:    subl $28, %esp2984; X86-SSE-NEXT:    .cfi_def_cfa_offset 322985; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [3.0E+0,0.0E+0]2986; X86-SSE-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)2987; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]2988; X86-SSE-NEXT:    movsd %xmm0, (%esp)2989; X86-SSE-NEXT:    calll atan22990; X86-SSE-NEXT:    addl $28, %esp2991; X86-SSE-NEXT:    .cfi_def_cfa_offset 42992; X86-SSE-NEXT:    retl2993;2994; SSE-LABEL: fatan2:2995; SSE:       # %bb.0: # %entry2996; SSE-NEXT:    pushq %rax2997; SSE-NEXT:    .cfi_def_cfa_offset 162998; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]2999; SSE-NEXT:    movsd {{.*#+}} xmm1 = [3.0E+0,0.0E+0]3000; SSE-NEXT:    callq atan2@PLT3001; SSE-NEXT:    popq %rax3002; SSE-NEXT:    .cfi_def_cfa_offset 83003; SSE-NEXT:    retq3004;3005; AVX-LABEL: fatan2:3006; AVX:       # %bb.0: # %entry3007; AVX-NEXT:    pushq %rax3008; AVX-NEXT:    .cfi_def_cfa_offset 163009; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2100000000000001E+1,0.0E+0]3010; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = [3.0E+0,0.0E+0]3011; AVX-NEXT:    callq atan2@PLT3012; AVX-NEXT:    popq %rax3013; AVX-NEXT:    .cfi_def_cfa_offset 83014; AVX-NEXT:    retq3015entry:3016  %result = call double @llvm.experimental.constrained.atan2.f64(double 42.1,3017                                               double 3.0,3018                                               metadata !"round.dynamic",3019                                               metadata !"fpexcept.strict") #03020  ret double %result3021}3022 3023; Verify that cosh(42.0) isn't simplified when the rounding mode is unknown.3024define double @fcosh() #0 {3025; X87-LABEL: fcosh:3026; X87:       # %bb.0: # %entry3027; X87-NEXT:    subl $12, %esp3028; X87-NEXT:    .cfi_def_cfa_offset 163029; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}3030; X87-NEXT:    fstpl (%esp)3031; X87-NEXT:    wait3032; X87-NEXT:    calll cosh3033; X87-NEXT:    addl $12, %esp3034; X87-NEXT:    .cfi_def_cfa_offset 43035; X87-NEXT:    retl3036;3037; X86-SSE-LABEL: fcosh:3038; X86-SSE:       # %bb.0: # %entry3039; X86-SSE-NEXT:    subl $12, %esp3040; X86-SSE-NEXT:    .cfi_def_cfa_offset 163041; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]3042; X86-SSE-NEXT:    movsd %xmm0, (%esp)3043; X86-SSE-NEXT:    calll cosh3044; X86-SSE-NEXT:    addl $12, %esp3045; X86-SSE-NEXT:    .cfi_def_cfa_offset 43046; X86-SSE-NEXT:    retl3047;3048; SSE-LABEL: fcosh:3049; SSE:       # %bb.0: # %entry3050; SSE-NEXT:    pushq %rax3051; SSE-NEXT:    .cfi_def_cfa_offset 163052; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]3053; SSE-NEXT:    callq cosh@PLT3054; SSE-NEXT:    popq %rax3055; SSE-NEXT:    .cfi_def_cfa_offset 83056; SSE-NEXT:    retq3057;3058; AVX-LABEL: fcosh:3059; AVX:       # %bb.0: # %entry3060; AVX-NEXT:    pushq %rax3061; AVX-NEXT:    .cfi_def_cfa_offset 163062; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]3063; AVX-NEXT:    callq cosh@PLT3064; AVX-NEXT:    popq %rax3065; AVX-NEXT:    .cfi_def_cfa_offset 83066; AVX-NEXT:    retq3067entry:3068  %result = call double @llvm.experimental.constrained.cosh.f64(double 42.0,3069                                               metadata !"round.dynamic",3070                                               metadata !"fpexcept.strict") #03071  ret double %result3072}3073 3074; Verify that sinh(42.0) isn't simplified when the rounding mode is unknown.3075define double @fsinh() #0 {3076; X87-LABEL: fsinh:3077; X87:       # %bb.0: # %entry3078; X87-NEXT:    subl $12, %esp3079; X87-NEXT:    .cfi_def_cfa_offset 163080; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}3081; X87-NEXT:    fstpl (%esp)3082; X87-NEXT:    wait3083; X87-NEXT:    calll sinh3084; X87-NEXT:    addl $12, %esp3085; X87-NEXT:    .cfi_def_cfa_offset 43086; X87-NEXT:    retl3087;3088; X86-SSE-LABEL: fsinh:3089; X86-SSE:       # %bb.0: # %entry3090; X86-SSE-NEXT:    subl $12, %esp3091; X86-SSE-NEXT:    .cfi_def_cfa_offset 163092; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]3093; X86-SSE-NEXT:    movsd %xmm0, (%esp)3094; X86-SSE-NEXT:    calll sinh3095; X86-SSE-NEXT:    addl $12, %esp3096; X86-SSE-NEXT:    .cfi_def_cfa_offset 43097; X86-SSE-NEXT:    retl3098;3099; SSE-LABEL: fsinh:3100; SSE:       # %bb.0: # %entry3101; SSE-NEXT:    pushq %rax3102; SSE-NEXT:    .cfi_def_cfa_offset 163103; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]3104; SSE-NEXT:    callq sinh@PLT3105; SSE-NEXT:    popq %rax3106; SSE-NEXT:    .cfi_def_cfa_offset 83107; SSE-NEXT:    retq3108;3109; AVX-LABEL: fsinh:3110; AVX:       # %bb.0: # %entry3111; AVX-NEXT:    pushq %rax3112; AVX-NEXT:    .cfi_def_cfa_offset 163113; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]3114; AVX-NEXT:    callq sinh@PLT3115; AVX-NEXT:    popq %rax3116; AVX-NEXT:    .cfi_def_cfa_offset 83117; AVX-NEXT:    retq3118entry:3119  %result = call double @llvm.experimental.constrained.sinh.f64(double 42.0,3120                                               metadata !"round.dynamic",3121                                               metadata !"fpexcept.strict") #03122  ret double %result3123}3124 3125; Verify that tanh(42.0) isn't simplified when the rounding mode is unknown.3126define double @ftanh() #0 {3127; X87-LABEL: ftanh:3128; X87:       # %bb.0: # %entry3129; X87-NEXT:    subl $12, %esp3130; X87-NEXT:    .cfi_def_cfa_offset 163131; X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}3132; X87-NEXT:    fstpl (%esp)3133; X87-NEXT:    wait3134; X87-NEXT:    calll tanh3135; X87-NEXT:    addl $12, %esp3136; X87-NEXT:    .cfi_def_cfa_offset 43137; X87-NEXT:    retl3138;3139; X86-SSE-LABEL: ftanh:3140; X86-SSE:       # %bb.0: # %entry3141; X86-SSE-NEXT:    subl $12, %esp3142; X86-SSE-NEXT:    .cfi_def_cfa_offset 163143; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]3144; X86-SSE-NEXT:    movsd %xmm0, (%esp)3145; X86-SSE-NEXT:    calll tanh3146; X86-SSE-NEXT:    addl $12, %esp3147; X86-SSE-NEXT:    .cfi_def_cfa_offset 43148; X86-SSE-NEXT:    retl3149;3150; SSE-LABEL: ftanh:3151; SSE:       # %bb.0: # %entry3152; SSE-NEXT:    pushq %rax3153; SSE-NEXT:    .cfi_def_cfa_offset 163154; SSE-NEXT:    movsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]3155; SSE-NEXT:    callq tanh@PLT3156; SSE-NEXT:    popq %rax3157; SSE-NEXT:    .cfi_def_cfa_offset 83158; SSE-NEXT:    retq3159;3160; AVX-LABEL: ftanh:3161; AVX:       # %bb.0: # %entry3162; AVX-NEXT:    pushq %rax3163; AVX-NEXT:    .cfi_def_cfa_offset 163164; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [4.2E+1,0.0E+0]3165; AVX-NEXT:    callq tanh@PLT3166; AVX-NEXT:    popq %rax3167; AVX-NEXT:    .cfi_def_cfa_offset 83168; AVX-NEXT:    retq3169entry:3170  %result = call double @llvm.experimental.constrained.tanh.f64(double 42.0,3171                                               metadata !"round.dynamic",3172                                               metadata !"fpexcept.strict") #03173  ret double %result3174}3175 3176attributes #0 = { strictfp }3177 3178@llvm.fp.env = thread_local global i8 zeroinitializer, section "llvm.metadata"3179declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)3180declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata)3181declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)3182declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)3183declare double @llvm.experimental.constrained.frem.f64(double, double, metadata, metadata)3184declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata)3185declare double @llvm.experimental.constrained.pow.f64(double, double, metadata, metadata)3186declare double @llvm.experimental.constrained.powi.f64(double, i32, metadata, metadata)3187declare double @llvm.experimental.constrained.sin.f64(double, metadata, metadata)3188declare double @llvm.experimental.constrained.cos.f64(double, metadata, metadata)3189declare double @llvm.experimental.constrained.tan.f64(double, metadata, metadata)3190declare double @llvm.experimental.constrained.asin.f64(double, metadata, metadata)3191declare double @llvm.experimental.constrained.acos.f64(double, metadata, metadata)3192declare double @llvm.experimental.constrained.atan.f64(double, metadata, metadata)3193declare double @llvm.experimental.constrained.atan2.f64(double, double, metadata, metadata)3194declare double @llvm.experimental.constrained.sinh.f64(double, metadata, metadata)3195declare double @llvm.experimental.constrained.cosh.f64(double, metadata, metadata)3196declare double @llvm.experimental.constrained.tanh.f64(double, metadata, metadata)3197declare double @llvm.experimental.constrained.exp.f64(double, metadata, metadata)3198declare double @llvm.experimental.constrained.exp2.f64(double, metadata, metadata)3199declare double @llvm.experimental.constrained.log.f64(double, metadata, metadata)3200declare double @llvm.experimental.constrained.log10.f64(double, metadata, metadata)3201declare double @llvm.experimental.constrained.log2.f64(double, metadata, metadata)3202declare double @llvm.experimental.constrained.rint.f64(double, metadata, metadata)3203declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata)3204declare i8  @llvm.experimental.constrained.fptosi.i8.f64(double, metadata)3205declare i16 @llvm.experimental.constrained.fptosi.i16.f64(double, metadata)3206declare i32 @llvm.experimental.constrained.fptosi.i32.f64(double, metadata)3207declare i64 @llvm.experimental.constrained.fptosi.i64.f64(double, metadata)3208declare i128 @llvm.experimental.constrained.fptosi.i128.f64(double, metadata)3209declare i8  @llvm.experimental.constrained.fptoui.i8.f64(double, metadata)3210declare i16 @llvm.experimental.constrained.fptoui.i16.f64(double, metadata)3211declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata)3212declare i64 @llvm.experimental.constrained.fptoui.i64.f64(double, metadata)3213declare i128 @llvm.experimental.constrained.fptoui.i128.f64(double, metadata)3214declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata)3215declare double @llvm.experimental.constrained.fpext.f64.f32(float, metadata)3216declare i32 @llvm.experimental.constrained.lrint.i32.f64(double, metadata, metadata)3217declare i32 @llvm.experimental.constrained.lrint.i32.f32(float, metadata, metadata)3218declare i64 @llvm.experimental.constrained.llrint.i64.f64(double, metadata, metadata)3219declare i64 @llvm.experimental.constrained.llrint.i64.f32(float, metadata, metadata)3220declare i32 @llvm.experimental.constrained.lround.i32.f64(double, metadata)3221declare i32 @llvm.experimental.constrained.lround.i32.f32(float, metadata)3222declare i64 @llvm.experimental.constrained.llround.i64.f64(double, metadata)3223declare i64 @llvm.experimental.constrained.llround.i64.f32(float, metadata)3224declare double @llvm.experimental.constrained.sitofp.f64.i8(i8, metadata, metadata)3225declare double @llvm.experimental.constrained.sitofp.f64.i16(i16, metadata, metadata)3226declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata)3227declare double @llvm.experimental.constrained.sitofp.f64.i64(i64, metadata, metadata)3228declare float @llvm.experimental.constrained.sitofp.f32.i8(i8, metadata, metadata)3229declare float @llvm.experimental.constrained.sitofp.f32.i16(i16, metadata, metadata)3230declare float @llvm.experimental.constrained.sitofp.f32.i32(i32, metadata, metadata)3231declare float @llvm.experimental.constrained.sitofp.f32.i64(i64, metadata, metadata)3232declare double @llvm.experimental.constrained.uitofp.f64.i8(i8, metadata, metadata)3233declare double @llvm.experimental.constrained.uitofp.f64.i16(i16, metadata, metadata)3234declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata)3235declare double @llvm.experimental.constrained.uitofp.f64.i64(i64, metadata, metadata)3236declare float @llvm.experimental.constrained.uitofp.f32.i8(i8, metadata, metadata)3237declare float @llvm.experimental.constrained.uitofp.f32.i16(i16, metadata, metadata)3238declare float @llvm.experimental.constrained.uitofp.f32.i32(i32, metadata, metadata)3239declare float @llvm.experimental.constrained.uitofp.f32.i64(i64, metadata, metadata)3240