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