1647 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -enable-legalize-types-checking -mtriple=x86_64-linux-gnu -mattr=+f16c | FileCheck %s --check-prefix=F16C3; RUN: llc < %s -enable-legalize-types-checking -mtriple=x86_64-linux-gnu -mattr=+avx512fp16 | FileCheck %s --check-prefix=FP164; RUN: llc < %s -enable-legalize-types-checking -mtriple=x86_64-linux-gnu | FileCheck %s --check-prefix=X645; RUN: llc < %s -enable-legalize-types-checking -mtriple=i686-linux-gnu -mattr=sse2 | FileCheck %s --check-prefix=X866 7; Check all soft floating point library function calls.8 9define void @test_half_ceil(half %a0, ptr %p0) nounwind {10; F16C-LABEL: test_half_ceil:11; F16C: # %bb.0:12; F16C-NEXT: vcvtph2ps %xmm0, %xmm013; F16C-NEXT: vroundss $10, %xmm0, %xmm0, %xmm014; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm015; F16C-NEXT: vpextrw $0, %xmm0, (%rdi)16; F16C-NEXT: retq17;18; FP16-LABEL: test_half_ceil:19; FP16: # %bb.0:20; FP16-NEXT: vrndscalesh $10, %xmm0, %xmm0, %xmm021; FP16-NEXT: vmovsh %xmm0, (%rdi)22; FP16-NEXT: retq23;24; X64-LABEL: test_half_ceil:25; X64: # %bb.0:26; X64-NEXT: pushq %rbx27; X64-NEXT: movq %rdi, %rbx28; X64-NEXT: callq __extendhfsf2@PLT29; X64-NEXT: callq ceilf@PLT30; X64-NEXT: callq __truncsfhf2@PLT31; X64-NEXT: pextrw $0, %xmm0, %eax32; X64-NEXT: movw %ax, (%rbx)33; X64-NEXT: popq %rbx34; X64-NEXT: retq35;36; X86-LABEL: test_half_ceil:37; X86: # %bb.0:38; X86-NEXT: pushl %esi39; X86-NEXT: subl $8, %esp40; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm041; X86-NEXT: movl {{[0-9]+}}(%esp), %esi42; X86-NEXT: pextrw $0, %xmm0, %eax43; X86-NEXT: movw %ax, (%esp)44; X86-NEXT: calll __extendhfsf245; X86-NEXT: fstps (%esp)46; X86-NEXT: calll ceilf47; X86-NEXT: fstps (%esp)48; X86-NEXT: calll __truncsfhf249; X86-NEXT: pextrw $0, %xmm0, %eax50; X86-NEXT: movw %ax, (%esi)51; X86-NEXT: addl $8, %esp52; X86-NEXT: popl %esi53; X86-NEXT: retl54 %res = call half @llvm.ceil.half(half %a0)55 store half %res, ptr %p0, align 256 ret void57}58 59define void @test_half_copysign(half %a0, half %a1, ptr %p0) nounwind {60; F16C-LABEL: test_half_copysign:61; F16C: # %bb.0:62; F16C-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm163; F16C-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm064; F16C-NEXT: vpor %xmm1, %xmm0, %xmm065; F16C-NEXT: vpextrw $0, %xmm0, (%rdi)66; F16C-NEXT: retq67;68; FP16-LABEL: test_half_copysign:69; FP16: # %bb.0:70; FP16-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm171; FP16-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm072; FP16-NEXT: vpbroadcastw {{.*#+}} xmm2 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]73; FP16-NEXT: vpternlogd {{.*#+}} zmm0 = zmm1 ^ (zmm2 & (zmm0 ^ zmm1))74; FP16-NEXT: vmovsh %xmm0, (%rdi)75; FP16-NEXT: vzeroupper76; FP16-NEXT: retq77;78; X64-LABEL: test_half_copysign:79; X64: # %bb.0:80; X64-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm181; X64-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm082; X64-NEXT: por %xmm1, %xmm083; X64-NEXT: pextrw $0, %xmm0, %eax84; X64-NEXT: movw %ax, (%rdi)85; X64-NEXT: retq86;87; X86-LABEL: test_half_copysign:88; X86: # %bb.0:89; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm090; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm191; X86-NEXT: movl {{[0-9]+}}(%esp), %eax92; X86-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm193; X86-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm094; X86-NEXT: por %xmm1, %xmm095; X86-NEXT: pextrw $0, %xmm0, %ecx96; X86-NEXT: movw %cx, (%eax)97; X86-NEXT: retl98 %res = call half @llvm.copysign.half(half %a0, half %a1)99 store half %res, ptr %p0, align 2100 ret void101}102 103define void @test_half_cos(half %a0, ptr %p0) nounwind {104; F16C-LABEL: test_half_cos:105; F16C: # %bb.0:106; F16C-NEXT: pushq %rbx107; F16C-NEXT: movq %rdi, %rbx108; F16C-NEXT: vcvtph2ps %xmm0, %xmm0109; F16C-NEXT: callq cosf@PLT110; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0111; F16C-NEXT: vpextrw $0, %xmm0, (%rbx)112; F16C-NEXT: popq %rbx113; F16C-NEXT: retq114;115; FP16-LABEL: test_half_cos:116; FP16: # %bb.0:117; FP16-NEXT: pushq %rbx118; FP16-NEXT: movq %rdi, %rbx119; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0120; FP16-NEXT: callq cosf@PLT121; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0122; FP16-NEXT: vmovsh %xmm0, (%rbx)123; FP16-NEXT: popq %rbx124; FP16-NEXT: retq125;126; X64-LABEL: test_half_cos:127; X64: # %bb.0:128; X64-NEXT: pushq %rbx129; X64-NEXT: movq %rdi, %rbx130; X64-NEXT: callq __extendhfsf2@PLT131; X64-NEXT: callq cosf@PLT132; X64-NEXT: callq __truncsfhf2@PLT133; X64-NEXT: pextrw $0, %xmm0, %eax134; X64-NEXT: movw %ax, (%rbx)135; X64-NEXT: popq %rbx136; X64-NEXT: retq137;138; X86-LABEL: test_half_cos:139; X86: # %bb.0:140; X86-NEXT: pushl %esi141; X86-NEXT: subl $8, %esp142; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0143; X86-NEXT: movl {{[0-9]+}}(%esp), %esi144; X86-NEXT: pextrw $0, %xmm0, %eax145; X86-NEXT: movw %ax, (%esp)146; X86-NEXT: calll __extendhfsf2147; X86-NEXT: fstps (%esp)148; X86-NEXT: calll cosf149; X86-NEXT: fstps (%esp)150; X86-NEXT: calll __truncsfhf2151; X86-NEXT: pextrw $0, %xmm0, %eax152; X86-NEXT: movw %ax, (%esi)153; X86-NEXT: addl $8, %esp154; X86-NEXT: popl %esi155; X86-NEXT: retl156 %res = call half @llvm.cos.half(half %a0)157 store half %res, ptr %p0, align 2158 ret void159}160 161define void @test_half_exp(half %a0, ptr %p0) nounwind {162; F16C-LABEL: test_half_exp:163; F16C: # %bb.0:164; F16C-NEXT: pushq %rbx165; F16C-NEXT: movq %rdi, %rbx166; F16C-NEXT: vcvtph2ps %xmm0, %xmm0167; F16C-NEXT: callq expf@PLT168; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0169; F16C-NEXT: vpextrw $0, %xmm0, (%rbx)170; F16C-NEXT: popq %rbx171; F16C-NEXT: retq172;173; FP16-LABEL: test_half_exp:174; FP16: # %bb.0:175; FP16-NEXT: pushq %rbx176; FP16-NEXT: movq %rdi, %rbx177; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0178; FP16-NEXT: callq expf@PLT179; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0180; FP16-NEXT: vmovsh %xmm0, (%rbx)181; FP16-NEXT: popq %rbx182; FP16-NEXT: retq183;184; X64-LABEL: test_half_exp:185; X64: # %bb.0:186; X64-NEXT: pushq %rbx187; X64-NEXT: movq %rdi, %rbx188; X64-NEXT: callq __extendhfsf2@PLT189; X64-NEXT: callq expf@PLT190; X64-NEXT: callq __truncsfhf2@PLT191; X64-NEXT: pextrw $0, %xmm0, %eax192; X64-NEXT: movw %ax, (%rbx)193; X64-NEXT: popq %rbx194; X64-NEXT: retq195;196; X86-LABEL: test_half_exp:197; X86: # %bb.0:198; X86-NEXT: pushl %esi199; X86-NEXT: subl $8, %esp200; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0201; X86-NEXT: movl {{[0-9]+}}(%esp), %esi202; X86-NEXT: pextrw $0, %xmm0, %eax203; X86-NEXT: movw %ax, (%esp)204; X86-NEXT: calll __extendhfsf2205; X86-NEXT: fstps (%esp)206; X86-NEXT: calll expf207; X86-NEXT: fstps (%esp)208; X86-NEXT: calll __truncsfhf2209; X86-NEXT: pextrw $0, %xmm0, %eax210; X86-NEXT: movw %ax, (%esi)211; X86-NEXT: addl $8, %esp212; X86-NEXT: popl %esi213; X86-NEXT: retl214 %res = call half @llvm.exp.half(half %a0)215 store half %res, ptr %p0, align 2216 ret void217}218 219define void @test_half_exp2(half %a0, ptr %p0) nounwind {220; F16C-LABEL: test_half_exp2:221; F16C: # %bb.0:222; F16C-NEXT: pushq %rbx223; F16C-NEXT: movq %rdi, %rbx224; F16C-NEXT: vcvtph2ps %xmm0, %xmm0225; F16C-NEXT: callq exp2f@PLT226; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0227; F16C-NEXT: vpextrw $0, %xmm0, (%rbx)228; F16C-NEXT: popq %rbx229; F16C-NEXT: retq230;231; FP16-LABEL: test_half_exp2:232; FP16: # %bb.0:233; FP16-NEXT: pushq %rbx234; FP16-NEXT: movq %rdi, %rbx235; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0236; FP16-NEXT: callq exp2f@PLT237; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0238; FP16-NEXT: vmovsh %xmm0, (%rbx)239; FP16-NEXT: popq %rbx240; FP16-NEXT: retq241;242; X64-LABEL: test_half_exp2:243; X64: # %bb.0:244; X64-NEXT: pushq %rbx245; X64-NEXT: movq %rdi, %rbx246; X64-NEXT: callq __extendhfsf2@PLT247; X64-NEXT: callq exp2f@PLT248; X64-NEXT: callq __truncsfhf2@PLT249; X64-NEXT: pextrw $0, %xmm0, %eax250; X64-NEXT: movw %ax, (%rbx)251; X64-NEXT: popq %rbx252; X64-NEXT: retq253;254; X86-LABEL: test_half_exp2:255; X86: # %bb.0:256; X86-NEXT: pushl %esi257; X86-NEXT: subl $8, %esp258; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0259; X86-NEXT: movl {{[0-9]+}}(%esp), %esi260; X86-NEXT: pextrw $0, %xmm0, %eax261; X86-NEXT: movw %ax, (%esp)262; X86-NEXT: calll __extendhfsf2263; X86-NEXT: fstps (%esp)264; X86-NEXT: calll exp2f265; X86-NEXT: fstps (%esp)266; X86-NEXT: calll __truncsfhf2267; X86-NEXT: pextrw $0, %xmm0, %eax268; X86-NEXT: movw %ax, (%esi)269; X86-NEXT: addl $8, %esp270; X86-NEXT: popl %esi271; X86-NEXT: retl272 %res = call half @llvm.exp2.half(half %a0)273 store half %res, ptr %p0, align 2274 ret void275}276 277define void @test_half_exp10(half %a0, ptr %p0) nounwind {278; F16C-LABEL: test_half_exp10:279; F16C: # %bb.0:280; F16C-NEXT: pushq %rbx281; F16C-NEXT: movq %rdi, %rbx282; F16C-NEXT: vcvtph2ps %xmm0, %xmm0283; F16C-NEXT: callq exp10f@PLT284; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0285; F16C-NEXT: vpextrw $0, %xmm0, (%rbx)286; F16C-NEXT: popq %rbx287; F16C-NEXT: retq288;289; FP16-LABEL: test_half_exp10:290; FP16: # %bb.0:291; FP16-NEXT: pushq %rbx292; FP16-NEXT: movq %rdi, %rbx293; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0294; FP16-NEXT: callq exp10f@PLT295; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0296; FP16-NEXT: vmovsh %xmm0, (%rbx)297; FP16-NEXT: popq %rbx298; FP16-NEXT: retq299;300; X64-LABEL: test_half_exp10:301; X64: # %bb.0:302; X64-NEXT: pushq %rbx303; X64-NEXT: movq %rdi, %rbx304; X64-NEXT: callq __extendhfsf2@PLT305; X64-NEXT: callq exp10f@PLT306; X64-NEXT: callq __truncsfhf2@PLT307; X64-NEXT: pextrw $0, %xmm0, %eax308; X64-NEXT: movw %ax, (%rbx)309; X64-NEXT: popq %rbx310; X64-NEXT: retq311;312; X86-LABEL: test_half_exp10:313; X86: # %bb.0:314; X86-NEXT: pushl %esi315; X86-NEXT: subl $8, %esp316; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0317; X86-NEXT: movl {{[0-9]+}}(%esp), %esi318; X86-NEXT: pextrw $0, %xmm0, %eax319; X86-NEXT: movw %ax, (%esp)320; X86-NEXT: calll __extendhfsf2321; X86-NEXT: fstps (%esp)322; X86-NEXT: calll exp10f323; X86-NEXT: fstps (%esp)324; X86-NEXT: calll __truncsfhf2325; X86-NEXT: pextrw $0, %xmm0, %eax326; X86-NEXT: movw %ax, (%esi)327; X86-NEXT: addl $8, %esp328; X86-NEXT: popl %esi329; X86-NEXT: retl330 %res = call half @llvm.exp10.half(half %a0)331 store half %res, ptr %p0, align 2332 ret void333}334 335define void @test_half_fabs(half %a0, ptr %p0) nounwind {336; F16C-LABEL: test_half_fabs:337; F16C: # %bb.0:338; F16C-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0339; F16C-NEXT: vpextrw $0, %xmm0, (%rdi)340; F16C-NEXT: retq341;342; FP16-LABEL: test_half_fabs:343; FP16: # %bb.0:344; FP16-NEXT: vpbroadcastw {{.*#+}} xmm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]345; FP16-NEXT: vpand %xmm1, %xmm0, %xmm0346; FP16-NEXT: vmovsh %xmm0, (%rdi)347; FP16-NEXT: retq348;349; X64-LABEL: test_half_fabs:350; X64: # %bb.0:351; X64-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0352; X64-NEXT: pextrw $0, %xmm0, %eax353; X64-NEXT: movw %ax, (%rdi)354; X64-NEXT: retq355;356; X86-LABEL: test_half_fabs:357; X86: # %bb.0:358; X86-NEXT: movl {{[0-9]+}}(%esp), %eax359; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx360; X86-NEXT: andl $32767, %ecx # imm = 0x7FFF361; X86-NEXT: movw %cx, (%eax)362; X86-NEXT: retl363 %res = call half @llvm.fabs.half(half %a0)364 store half %res, ptr %p0, align 2365 ret void366}367 368define void @test_half_floor(half %a0, ptr %p0) nounwind {369; F16C-LABEL: test_half_floor:370; F16C: # %bb.0:371; F16C-NEXT: vcvtph2ps %xmm0, %xmm0372; F16C-NEXT: vroundss $9, %xmm0, %xmm0, %xmm0373; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0374; F16C-NEXT: vpextrw $0, %xmm0, (%rdi)375; F16C-NEXT: retq376;377; FP16-LABEL: test_half_floor:378; FP16: # %bb.0:379; FP16-NEXT: vrndscalesh $9, %xmm0, %xmm0, %xmm0380; FP16-NEXT: vmovsh %xmm0, (%rdi)381; FP16-NEXT: retq382;383; X64-LABEL: test_half_floor:384; X64: # %bb.0:385; X64-NEXT: pushq %rbx386; X64-NEXT: movq %rdi, %rbx387; X64-NEXT: callq __extendhfsf2@PLT388; X64-NEXT: callq floorf@PLT389; X64-NEXT: callq __truncsfhf2@PLT390; X64-NEXT: pextrw $0, %xmm0, %eax391; X64-NEXT: movw %ax, (%rbx)392; X64-NEXT: popq %rbx393; X64-NEXT: retq394;395; X86-LABEL: test_half_floor:396; X86: # %bb.0:397; X86-NEXT: pushl %esi398; X86-NEXT: subl $8, %esp399; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0400; X86-NEXT: movl {{[0-9]+}}(%esp), %esi401; X86-NEXT: pextrw $0, %xmm0, %eax402; X86-NEXT: movw %ax, (%esp)403; X86-NEXT: calll __extendhfsf2404; X86-NEXT: fstps (%esp)405; X86-NEXT: calll floorf406; X86-NEXT: fstps (%esp)407; X86-NEXT: calll __truncsfhf2408; X86-NEXT: pextrw $0, %xmm0, %eax409; X86-NEXT: movw %ax, (%esi)410; X86-NEXT: addl $8, %esp411; X86-NEXT: popl %esi412; X86-NEXT: retl413 %res = call half @llvm.floor.half(half %a0)414 store half %res, ptr %p0, align 2415 ret void416}417 418define void @test_half_fma(half %a0, half %a1, half %a2, ptr %p0) nounwind {419; F16C-LABEL: test_half_fma:420; F16C: # %bb.0:421; F16C-NEXT: pushq %rbx422; F16C-NEXT: movq %rdi, %rbx423; F16C-NEXT: vcvtph2ps %xmm0, %xmm0424; F16C-NEXT: vcvtph2ps %xmm1, %xmm1425; F16C-NEXT: vcvtph2ps %xmm2, %xmm2426; F16C-NEXT: callq fmaf@PLT427; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0428; F16C-NEXT: vpextrw $0, %xmm0, (%rbx)429; F16C-NEXT: popq %rbx430; F16C-NEXT: retq431;432; FP16-LABEL: test_half_fma:433; FP16: # %bb.0:434; FP16-NEXT: vfmadd213sh %xmm2, %xmm1, %xmm0435; FP16-NEXT: vmovsh %xmm0, (%rdi)436; FP16-NEXT: retq437;438; X64-LABEL: test_half_fma:439; X64: # %bb.0:440; X64-NEXT: pushq %rbx441; X64-NEXT: subq $16, %rsp442; X64-NEXT: movq %rdi, %rbx443; X64-NEXT: movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill444; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill445; X64-NEXT: movaps %xmm1, %xmm0446; X64-NEXT: callq __extendhfsf2@PLT447; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill448; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload449; X64-NEXT: # xmm0 = mem[0],zero,zero,zero450; X64-NEXT: callq __extendhfsf2@PLT451; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill452; X64-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload453; X64-NEXT: # xmm0 = mem[0],zero,zero,zero454; X64-NEXT: callq __extendhfsf2@PLT455; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload456; X64-NEXT: # xmm1 = mem[0],zero,zero,zero457; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 4-byte Reload458; X64-NEXT: # xmm2 = mem[0],zero,zero,zero459; X64-NEXT: callq fmaf@PLT460; X64-NEXT: callq __truncsfhf2@PLT461; X64-NEXT: pextrw $0, %xmm0, %eax462; X64-NEXT: movw %ax, (%rbx)463; X64-NEXT: addq $16, %rsp464; X64-NEXT: popq %rbx465; X64-NEXT: retq466;467; X86-LABEL: test_half_fma:468; X86: # %bb.0:469; X86-NEXT: pushl %esi470; X86-NEXT: subl $72, %esp471; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0472; X86-NEXT: movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill473; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0474; X86-NEXT: movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill475; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0476; X86-NEXT: movl {{[0-9]+}}(%esp), %esi477; X86-NEXT: pextrw $0, %xmm0, %eax478; X86-NEXT: movw %ax, (%esp)479; X86-NEXT: calll __extendhfsf2480; X86-NEXT: fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill481; X86-NEXT: movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload482; X86-NEXT: pextrw $0, %xmm0, %eax483; X86-NEXT: movw %ax, (%esp)484; X86-NEXT: calll __extendhfsf2485; X86-NEXT: fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill486; X86-NEXT: movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload487; X86-NEXT: pextrw $0, %xmm0, %eax488; X86-NEXT: movw %ax, (%esp)489; X86-NEXT: calll __extendhfsf2490; X86-NEXT: fstps {{[0-9]+}}(%esp)491; X86-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload492; X86-NEXT: fstps {{[0-9]+}}(%esp)493; X86-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload494; X86-NEXT: fstps (%esp)495; X86-NEXT: calll fmaf496; X86-NEXT: fstps (%esp)497; X86-NEXT: calll __truncsfhf2498; X86-NEXT: pextrw $0, %xmm0, %eax499; X86-NEXT: movw %ax, (%esi)500; X86-NEXT: addl $72, %esp501; X86-NEXT: popl %esi502; X86-NEXT: retl503 %res = call half @llvm.fma.half(half %a0, half %a1, half %a2)504 store half %res, ptr %p0, align 2505 ret void506}507 508define void @test_half_fneg(half %a0, ptr %p0) nounwind {509; F16C-LABEL: test_half_fneg:510; F16C: # %bb.0:511; F16C-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0512; F16C-NEXT: vpextrw $0, %xmm0, (%rdi)513; F16C-NEXT: retq514;515; FP16-LABEL: test_half_fneg:516; FP16: # %bb.0:517; FP16-NEXT: vpbroadcastw {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]518; FP16-NEXT: vpxor %xmm1, %xmm0, %xmm0519; FP16-NEXT: vmovsh %xmm0, (%rdi)520; FP16-NEXT: retq521;522; X64-LABEL: test_half_fneg:523; X64: # %bb.0:524; X64-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0525; X64-NEXT: pextrw $0, %xmm0, %eax526; X64-NEXT: movw %ax, (%rdi)527; X64-NEXT: retq528;529; X86-LABEL: test_half_fneg:530; X86: # %bb.0:531; X86-NEXT: movl {{[0-9]+}}(%esp), %eax532; X86-NEXT: movl $32768, %ecx # imm = 0x8000533; X86-NEXT: xorl {{[0-9]+}}(%esp), %ecx534; X86-NEXT: movw %cx, (%eax)535; X86-NEXT: retl536 %res = fneg half %a0537 store half %res, ptr %p0, align 2538 ret void539}540 541define void @test_half_log(half %a0, ptr %p0) nounwind {542; F16C-LABEL: test_half_log:543; F16C: # %bb.0:544; F16C-NEXT: pushq %rbx545; F16C-NEXT: movq %rdi, %rbx546; F16C-NEXT: vcvtph2ps %xmm0, %xmm0547; F16C-NEXT: callq logf@PLT548; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0549; F16C-NEXT: vpextrw $0, %xmm0, (%rbx)550; F16C-NEXT: popq %rbx551; F16C-NEXT: retq552;553; FP16-LABEL: test_half_log:554; FP16: # %bb.0:555; FP16-NEXT: pushq %rbx556; FP16-NEXT: movq %rdi, %rbx557; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0558; FP16-NEXT: callq logf@PLT559; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0560; FP16-NEXT: vmovsh %xmm0, (%rbx)561; FP16-NEXT: popq %rbx562; FP16-NEXT: retq563;564; X64-LABEL: test_half_log:565; X64: # %bb.0:566; X64-NEXT: pushq %rbx567; X64-NEXT: movq %rdi, %rbx568; X64-NEXT: callq __extendhfsf2@PLT569; X64-NEXT: callq logf@PLT570; X64-NEXT: callq __truncsfhf2@PLT571; X64-NEXT: pextrw $0, %xmm0, %eax572; X64-NEXT: movw %ax, (%rbx)573; X64-NEXT: popq %rbx574; X64-NEXT: retq575;576; X86-LABEL: test_half_log:577; X86: # %bb.0:578; X86-NEXT: pushl %esi579; X86-NEXT: subl $8, %esp580; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0581; X86-NEXT: movl {{[0-9]+}}(%esp), %esi582; X86-NEXT: pextrw $0, %xmm0, %eax583; X86-NEXT: movw %ax, (%esp)584; X86-NEXT: calll __extendhfsf2585; X86-NEXT: fstps (%esp)586; X86-NEXT: calll logf587; X86-NEXT: fstps (%esp)588; X86-NEXT: calll __truncsfhf2589; X86-NEXT: pextrw $0, %xmm0, %eax590; X86-NEXT: movw %ax, (%esi)591; X86-NEXT: addl $8, %esp592; X86-NEXT: popl %esi593; X86-NEXT: retl594 %res = call half @llvm.log.half(half %a0)595 store half %res, ptr %p0, align 2596 ret void597}598 599define void @test_half_log2(half %a0, ptr %p0) nounwind {600; F16C-LABEL: test_half_log2:601; F16C: # %bb.0:602; F16C-NEXT: pushq %rbx603; F16C-NEXT: movq %rdi, %rbx604; F16C-NEXT: vcvtph2ps %xmm0, %xmm0605; F16C-NEXT: callq log2f@PLT606; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0607; F16C-NEXT: vpextrw $0, %xmm0, (%rbx)608; F16C-NEXT: popq %rbx609; F16C-NEXT: retq610;611; FP16-LABEL: test_half_log2:612; FP16: # %bb.0:613; FP16-NEXT: pushq %rbx614; FP16-NEXT: movq %rdi, %rbx615; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0616; FP16-NEXT: callq log2f@PLT617; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0618; FP16-NEXT: vmovsh %xmm0, (%rbx)619; FP16-NEXT: popq %rbx620; FP16-NEXT: retq621;622; X64-LABEL: test_half_log2:623; X64: # %bb.0:624; X64-NEXT: pushq %rbx625; X64-NEXT: movq %rdi, %rbx626; X64-NEXT: callq __extendhfsf2@PLT627; X64-NEXT: callq log2f@PLT628; X64-NEXT: callq __truncsfhf2@PLT629; X64-NEXT: pextrw $0, %xmm0, %eax630; X64-NEXT: movw %ax, (%rbx)631; X64-NEXT: popq %rbx632; X64-NEXT: retq633;634; X86-LABEL: test_half_log2:635; X86: # %bb.0:636; X86-NEXT: pushl %esi637; X86-NEXT: subl $8, %esp638; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0639; X86-NEXT: movl {{[0-9]+}}(%esp), %esi640; X86-NEXT: pextrw $0, %xmm0, %eax641; X86-NEXT: movw %ax, (%esp)642; X86-NEXT: calll __extendhfsf2643; X86-NEXT: fstps (%esp)644; X86-NEXT: calll log2f645; X86-NEXT: fstps (%esp)646; X86-NEXT: calll __truncsfhf2647; X86-NEXT: pextrw $0, %xmm0, %eax648; X86-NEXT: movw %ax, (%esi)649; X86-NEXT: addl $8, %esp650; X86-NEXT: popl %esi651; X86-NEXT: retl652 %res = call half @llvm.log2.half(half %a0)653 store half %res, ptr %p0, align 2654 ret void655}656 657define void @test_half_log10(half %a0, ptr %p0) nounwind {658; F16C-LABEL: test_half_log10:659; F16C: # %bb.0:660; F16C-NEXT: pushq %rbx661; F16C-NEXT: movq %rdi, %rbx662; F16C-NEXT: vcvtph2ps %xmm0, %xmm0663; F16C-NEXT: callq log10f@PLT664; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0665; F16C-NEXT: vpextrw $0, %xmm0, (%rbx)666; F16C-NEXT: popq %rbx667; F16C-NEXT: retq668;669; FP16-LABEL: test_half_log10:670; FP16: # %bb.0:671; FP16-NEXT: pushq %rbx672; FP16-NEXT: movq %rdi, %rbx673; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0674; FP16-NEXT: callq log10f@PLT675; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0676; FP16-NEXT: vmovsh %xmm0, (%rbx)677; FP16-NEXT: popq %rbx678; FP16-NEXT: retq679;680; X64-LABEL: test_half_log10:681; X64: # %bb.0:682; X64-NEXT: pushq %rbx683; X64-NEXT: movq %rdi, %rbx684; X64-NEXT: callq __extendhfsf2@PLT685; X64-NEXT: callq log10f@PLT686; X64-NEXT: callq __truncsfhf2@PLT687; X64-NEXT: pextrw $0, %xmm0, %eax688; X64-NEXT: movw %ax, (%rbx)689; X64-NEXT: popq %rbx690; X64-NEXT: retq691;692; X86-LABEL: test_half_log10:693; X86: # %bb.0:694; X86-NEXT: pushl %esi695; X86-NEXT: subl $8, %esp696; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0697; X86-NEXT: movl {{[0-9]+}}(%esp), %esi698; X86-NEXT: pextrw $0, %xmm0, %eax699; X86-NEXT: movw %ax, (%esp)700; X86-NEXT: calll __extendhfsf2701; X86-NEXT: fstps (%esp)702; X86-NEXT: calll log10f703; X86-NEXT: fstps (%esp)704; X86-NEXT: calll __truncsfhf2705; X86-NEXT: pextrw $0, %xmm0, %eax706; X86-NEXT: movw %ax, (%esi)707; X86-NEXT: addl $8, %esp708; X86-NEXT: popl %esi709; X86-NEXT: retl710 %res = call half @llvm.log10.half(half %a0)711 store half %res, ptr %p0, align 2712 ret void713}714 715define void @test_half_nearbyint(half %a0, ptr %p0) nounwind {716; F16C-LABEL: test_half_nearbyint:717; F16C: # %bb.0:718; F16C-NEXT: vcvtph2ps %xmm0, %xmm0719; F16C-NEXT: vroundss $12, %xmm0, %xmm0, %xmm0720; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0721; F16C-NEXT: vpextrw $0, %xmm0, (%rdi)722; F16C-NEXT: retq723;724; FP16-LABEL: test_half_nearbyint:725; FP16: # %bb.0:726; FP16-NEXT: vrndscalesh $12, %xmm0, %xmm0, %xmm0727; FP16-NEXT: vmovsh %xmm0, (%rdi)728; FP16-NEXT: retq729;730; X64-LABEL: test_half_nearbyint:731; X64: # %bb.0:732; X64-NEXT: pushq %rbx733; X64-NEXT: movq %rdi, %rbx734; X64-NEXT: callq __extendhfsf2@PLT735; X64-NEXT: callq nearbyintf@PLT736; X64-NEXT: callq __truncsfhf2@PLT737; X64-NEXT: pextrw $0, %xmm0, %eax738; X64-NEXT: movw %ax, (%rbx)739; X64-NEXT: popq %rbx740; X64-NEXT: retq741;742; X86-LABEL: test_half_nearbyint:743; X86: # %bb.0:744; X86-NEXT: pushl %esi745; X86-NEXT: subl $8, %esp746; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0747; X86-NEXT: movl {{[0-9]+}}(%esp), %esi748; X86-NEXT: pextrw $0, %xmm0, %eax749; X86-NEXT: movw %ax, (%esp)750; X86-NEXT: calll __extendhfsf2751; X86-NEXT: fstps (%esp)752; X86-NEXT: calll nearbyintf753; X86-NEXT: fstps (%esp)754; X86-NEXT: calll __truncsfhf2755; X86-NEXT: pextrw $0, %xmm0, %eax756; X86-NEXT: movw %ax, (%esi)757; X86-NEXT: addl $8, %esp758; X86-NEXT: popl %esi759; X86-NEXT: retl760 %res = call half @llvm.nearbyint.half(half %a0)761 store half %res, ptr %p0, align 2762 ret void763}764 765define void @test_half_pow(half %a0, half %a1, ptr %p0) nounwind {766; F16C-LABEL: test_half_pow:767; F16C: # %bb.0:768; F16C-NEXT: pushq %rbx769; F16C-NEXT: movq %rdi, %rbx770; F16C-NEXT: vcvtph2ps %xmm0, %xmm0771; F16C-NEXT: vcvtph2ps %xmm1, %xmm1772; F16C-NEXT: callq powf@PLT773; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0774; F16C-NEXT: vpextrw $0, %xmm0, (%rbx)775; F16C-NEXT: popq %rbx776; F16C-NEXT: retq777;778; FP16-LABEL: test_half_pow:779; FP16: # %bb.0:780; FP16-NEXT: pushq %rbx781; FP16-NEXT: movq %rdi, %rbx782; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0783; FP16-NEXT: vcvtsh2ss %xmm1, %xmm1, %xmm1784; FP16-NEXT: callq powf@PLT785; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0786; FP16-NEXT: vmovsh %xmm0, (%rbx)787; FP16-NEXT: popq %rbx788; FP16-NEXT: retq789;790; X64-LABEL: test_half_pow:791; X64: # %bb.0:792; X64-NEXT: pushq %rbx793; X64-NEXT: subq $16, %rsp794; X64-NEXT: movq %rdi, %rbx795; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill796; X64-NEXT: movaps %xmm1, %xmm0797; X64-NEXT: callq __extendhfsf2@PLT798; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill799; X64-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload800; X64-NEXT: # xmm0 = mem[0],zero,zero,zero801; X64-NEXT: callq __extendhfsf2@PLT802; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload803; X64-NEXT: # xmm1 = mem[0],zero,zero,zero804; X64-NEXT: callq powf@PLT805; X64-NEXT: callq __truncsfhf2@PLT806; X64-NEXT: pextrw $0, %xmm0, %eax807; X64-NEXT: movw %ax, (%rbx)808; X64-NEXT: addq $16, %rsp809; X64-NEXT: popq %rbx810; X64-NEXT: retq811;812; X86-LABEL: test_half_pow:813; X86: # %bb.0:814; X86-NEXT: pushl %esi815; X86-NEXT: subl $56, %esp816; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0817; X86-NEXT: movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill818; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0819; X86-NEXT: movl {{[0-9]+}}(%esp), %esi820; X86-NEXT: pextrw $0, %xmm0, %eax821; X86-NEXT: movw %ax, (%esp)822; X86-NEXT: calll __extendhfsf2823; X86-NEXT: fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill824; X86-NEXT: movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload825; X86-NEXT: pextrw $0, %xmm0, %eax826; X86-NEXT: movw %ax, (%esp)827; X86-NEXT: calll __extendhfsf2828; X86-NEXT: fstps {{[0-9]+}}(%esp)829; X86-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload830; X86-NEXT: fstps (%esp)831; X86-NEXT: calll powf832; X86-NEXT: fstps (%esp)833; X86-NEXT: calll __truncsfhf2834; X86-NEXT: pextrw $0, %xmm0, %eax835; X86-NEXT: movw %ax, (%esi)836; X86-NEXT: addl $56, %esp837; X86-NEXT: popl %esi838; X86-NEXT: retl839 %res = call half @llvm.pow.half(half %a0, half %a1)840 store half %res, ptr %p0, align 2841 ret void842}843 844define void @test_half_powi(half %a0, i32 %a1, ptr %p0) nounwind {845; F16C-LABEL: test_half_powi:846; F16C: # %bb.0:847; F16C-NEXT: pushq %rbx848; F16C-NEXT: movq %rsi, %rbx849; F16C-NEXT: vcvtph2ps %xmm0, %xmm0850; F16C-NEXT: callq __powisf2@PLT851; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0852; F16C-NEXT: vpextrw $0, %xmm0, (%rbx)853; F16C-NEXT: popq %rbx854; F16C-NEXT: retq855;856; FP16-LABEL: test_half_powi:857; FP16: # %bb.0:858; FP16-NEXT: pushq %rbx859; FP16-NEXT: movq %rsi, %rbx860; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0861; FP16-NEXT: callq __powisf2@PLT862; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0863; FP16-NEXT: vmovsh %xmm0, (%rbx)864; FP16-NEXT: popq %rbx865; FP16-NEXT: retq866;867; X64-LABEL: test_half_powi:868; X64: # %bb.0:869; X64-NEXT: pushq %rbp870; X64-NEXT: pushq %rbx871; X64-NEXT: pushq %rax872; X64-NEXT: movq %rsi, %rbx873; X64-NEXT: movl %edi, %ebp874; X64-NEXT: callq __extendhfsf2@PLT875; X64-NEXT: movl %ebp, %edi876; X64-NEXT: callq __powisf2@PLT877; X64-NEXT: callq __truncsfhf2@PLT878; X64-NEXT: pextrw $0, %xmm0, %eax879; X64-NEXT: movw %ax, (%rbx)880; X64-NEXT: addq $8, %rsp881; X64-NEXT: popq %rbx882; X64-NEXT: popq %rbp883; X64-NEXT: retq884;885; X86-LABEL: test_half_powi:886; X86: # %bb.0:887; X86-NEXT: pushl %edi888; X86-NEXT: pushl %esi889; X86-NEXT: subl $20, %esp890; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0891; X86-NEXT: movl {{[0-9]+}}(%esp), %esi892; X86-NEXT: movl {{[0-9]+}}(%esp), %edi893; X86-NEXT: pextrw $0, %xmm0, %eax894; X86-NEXT: movw %ax, (%esp)895; X86-NEXT: calll __extendhfsf2896; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)897; X86-NEXT: fstps (%esp)898; X86-NEXT: calll __powisf2899; X86-NEXT: fstps (%esp)900; X86-NEXT: calll __truncsfhf2901; X86-NEXT: pextrw $0, %xmm0, %eax902; X86-NEXT: movw %ax, (%esi)903; X86-NEXT: addl $20, %esp904; X86-NEXT: popl %esi905; X86-NEXT: popl %edi906; X86-NEXT: retl907 %res = call half @llvm.powi.half(half %a0, i32 %a1)908 store half %res, ptr %p0, align 2909 ret void910}911 912define void @test_half_rint(half %a0, ptr %p0) nounwind {913; F16C-LABEL: test_half_rint:914; F16C: # %bb.0:915; F16C-NEXT: vcvtph2ps %xmm0, %xmm0916; F16C-NEXT: vroundss $4, %xmm0, %xmm0, %xmm0917; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0918; F16C-NEXT: vpextrw $0, %xmm0, (%rdi)919; F16C-NEXT: retq920;921; FP16-LABEL: test_half_rint:922; FP16: # %bb.0:923; FP16-NEXT: vrndscalesh $4, %xmm0, %xmm0, %xmm0924; FP16-NEXT: vmovsh %xmm0, (%rdi)925; FP16-NEXT: retq926;927; X64-LABEL: test_half_rint:928; X64: # %bb.0:929; X64-NEXT: pushq %rbx930; X64-NEXT: movq %rdi, %rbx931; X64-NEXT: callq __extendhfsf2@PLT932; X64-NEXT: callq rintf@PLT933; X64-NEXT: callq __truncsfhf2@PLT934; X64-NEXT: pextrw $0, %xmm0, %eax935; X64-NEXT: movw %ax, (%rbx)936; X64-NEXT: popq %rbx937; X64-NEXT: retq938;939; X86-LABEL: test_half_rint:940; X86: # %bb.0:941; X86-NEXT: pushl %esi942; X86-NEXT: subl $8, %esp943; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0944; X86-NEXT: movl {{[0-9]+}}(%esp), %esi945; X86-NEXT: pextrw $0, %xmm0, %eax946; X86-NEXT: movw %ax, (%esp)947; X86-NEXT: calll __extendhfsf2948; X86-NEXT: fstps (%esp)949; X86-NEXT: calll rintf950; X86-NEXT: fstps (%esp)951; X86-NEXT: calll __truncsfhf2952; X86-NEXT: pextrw $0, %xmm0, %eax953; X86-NEXT: movw %ax, (%esi)954; X86-NEXT: addl $8, %esp955; X86-NEXT: popl %esi956; X86-NEXT: retl957 %res = call half @llvm.rint.half(half %a0)958 store half %res, ptr %p0, align 2959 ret void960}961 962define void @test_half_sin(half %a0, ptr %p0) nounwind {963; F16C-LABEL: test_half_sin:964; F16C: # %bb.0:965; F16C-NEXT: pushq %rbx966; F16C-NEXT: movq %rdi, %rbx967; F16C-NEXT: vcvtph2ps %xmm0, %xmm0968; F16C-NEXT: callq sinf@PLT969; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0970; F16C-NEXT: vpextrw $0, %xmm0, (%rbx)971; F16C-NEXT: popq %rbx972; F16C-NEXT: retq973;974; FP16-LABEL: test_half_sin:975; FP16: # %bb.0:976; FP16-NEXT: pushq %rbx977; FP16-NEXT: movq %rdi, %rbx978; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0979; FP16-NEXT: callq sinf@PLT980; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0981; FP16-NEXT: vmovsh %xmm0, (%rbx)982; FP16-NEXT: popq %rbx983; FP16-NEXT: retq984;985; X64-LABEL: test_half_sin:986; X64: # %bb.0:987; X64-NEXT: pushq %rbx988; X64-NEXT: movq %rdi, %rbx989; X64-NEXT: callq __extendhfsf2@PLT990; X64-NEXT: callq sinf@PLT991; X64-NEXT: callq __truncsfhf2@PLT992; X64-NEXT: pextrw $0, %xmm0, %eax993; X64-NEXT: movw %ax, (%rbx)994; X64-NEXT: popq %rbx995; X64-NEXT: retq996;997; X86-LABEL: test_half_sin:998; X86: # %bb.0:999; X86-NEXT: pushl %esi1000; X86-NEXT: subl $8, %esp1001; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01002; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1003; X86-NEXT: pextrw $0, %xmm0, %eax1004; X86-NEXT: movw %ax, (%esp)1005; X86-NEXT: calll __extendhfsf21006; X86-NEXT: fstps (%esp)1007; X86-NEXT: calll sinf1008; X86-NEXT: fstps (%esp)1009; X86-NEXT: calll __truncsfhf21010; X86-NEXT: pextrw $0, %xmm0, %eax1011; X86-NEXT: movw %ax, (%esi)1012; X86-NEXT: addl $8, %esp1013; X86-NEXT: popl %esi1014; X86-NEXT: retl1015 %res = call half @llvm.sin.half(half %a0)1016 store half %res, ptr %p0, align 21017 ret void1018}1019 1020define void @test_half_sqrt(half %a0, ptr %p0) nounwind {1021; F16C-LABEL: test_half_sqrt:1022; F16C: # %bb.0:1023; F16C-NEXT: vcvtph2ps %xmm0, %xmm01024; F16C-NEXT: vsqrtss %xmm0, %xmm0, %xmm01025; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01026; F16C-NEXT: vpextrw $0, %xmm0, (%rdi)1027; F16C-NEXT: retq1028;1029; FP16-LABEL: test_half_sqrt:1030; FP16: # %bb.0:1031; FP16-NEXT: vsqrtsh %xmm0, %xmm0, %xmm01032; FP16-NEXT: vmovsh %xmm0, (%rdi)1033; FP16-NEXT: retq1034;1035; X64-LABEL: test_half_sqrt:1036; X64: # %bb.0:1037; X64-NEXT: pushq %rbx1038; X64-NEXT: movq %rdi, %rbx1039; X64-NEXT: callq __extendhfsf2@PLT1040; X64-NEXT: sqrtss %xmm0, %xmm01041; X64-NEXT: callq __truncsfhf2@PLT1042; X64-NEXT: pextrw $0, %xmm0, %eax1043; X64-NEXT: movw %ax, (%rbx)1044; X64-NEXT: popq %rbx1045; X64-NEXT: retq1046;1047; X86-LABEL: test_half_sqrt:1048; X86: # %bb.0:1049; X86-NEXT: pushl %esi1050; X86-NEXT: subl $8, %esp1051; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01052; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1053; X86-NEXT: pextrw $0, %xmm0, %eax1054; X86-NEXT: movw %ax, (%esp)1055; X86-NEXT: calll __extendhfsf21056; X86-NEXT: fstps {{[0-9]+}}(%esp)1057; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1058; X86-NEXT: sqrtss %xmm0, %xmm01059; X86-NEXT: movss %xmm0, (%esp)1060; X86-NEXT: calll __truncsfhf21061; X86-NEXT: pextrw $0, %xmm0, %eax1062; X86-NEXT: movw %ax, (%esi)1063; X86-NEXT: addl $8, %esp1064; X86-NEXT: popl %esi1065; X86-NEXT: retl1066 %res = call half @llvm.sqrt.half(half %a0)1067 store half %res, ptr %p0, align 21068 ret void1069}1070 1071define void @test_half_tan(half %a0, ptr %p0) nounwind {1072; F16C-LABEL: test_half_tan:1073; F16C: # %bb.0:1074; F16C-NEXT: pushq %rbx1075; F16C-NEXT: movq %rdi, %rbx1076; F16C-NEXT: vcvtph2ps %xmm0, %xmm01077; F16C-NEXT: callq tanf@PLT1078; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01079; F16C-NEXT: vpextrw $0, %xmm0, (%rbx)1080; F16C-NEXT: popq %rbx1081; F16C-NEXT: retq1082;1083; FP16-LABEL: test_half_tan:1084; FP16: # %bb.0:1085; FP16-NEXT: pushq %rbx1086; FP16-NEXT: movq %rdi, %rbx1087; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm01088; FP16-NEXT: callq tanf@PLT1089; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm01090; FP16-NEXT: vmovsh %xmm0, (%rbx)1091; FP16-NEXT: popq %rbx1092; FP16-NEXT: retq1093;1094; X64-LABEL: test_half_tan:1095; X64: # %bb.0:1096; X64-NEXT: pushq %rbx1097; X64-NEXT: movq %rdi, %rbx1098; X64-NEXT: callq __extendhfsf2@PLT1099; X64-NEXT: callq tanf@PLT1100; X64-NEXT: callq __truncsfhf2@PLT1101; X64-NEXT: pextrw $0, %xmm0, %eax1102; X64-NEXT: movw %ax, (%rbx)1103; X64-NEXT: popq %rbx1104; X64-NEXT: retq1105;1106; X86-LABEL: test_half_tan:1107; X86: # %bb.0:1108; X86-NEXT: pushl %esi1109; X86-NEXT: subl $8, %esp1110; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01111; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1112; X86-NEXT: pextrw $0, %xmm0, %eax1113; X86-NEXT: movw %ax, (%esp)1114; X86-NEXT: calll __extendhfsf21115; X86-NEXT: fstps (%esp)1116; X86-NEXT: calll tanf1117; X86-NEXT: fstps (%esp)1118; X86-NEXT: calll __truncsfhf21119; X86-NEXT: pextrw $0, %xmm0, %eax1120; X86-NEXT: movw %ax, (%esi)1121; X86-NEXT: addl $8, %esp1122; X86-NEXT: popl %esi1123; X86-NEXT: retl1124 %res = call half @llvm.tan.half(half %a0)1125 store half %res, ptr %p0, align 21126 ret void1127}1128 1129define void @test_half_trunc(half %a0, ptr %p0) nounwind {1130; F16C-LABEL: test_half_trunc:1131; F16C: # %bb.0:1132; F16C-NEXT: vcvtph2ps %xmm0, %xmm01133; F16C-NEXT: vroundss $11, %xmm0, %xmm0, %xmm01134; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01135; F16C-NEXT: vpextrw $0, %xmm0, (%rdi)1136; F16C-NEXT: retq1137;1138; FP16-LABEL: test_half_trunc:1139; FP16: # %bb.0:1140; FP16-NEXT: vrndscalesh $11, %xmm0, %xmm0, %xmm01141; FP16-NEXT: vmovsh %xmm0, (%rdi)1142; FP16-NEXT: retq1143;1144; X64-LABEL: test_half_trunc:1145; X64: # %bb.0:1146; X64-NEXT: pushq %rbx1147; X64-NEXT: movq %rdi, %rbx1148; X64-NEXT: callq __extendhfsf2@PLT1149; X64-NEXT: callq truncf@PLT1150; X64-NEXT: callq __truncsfhf2@PLT1151; X64-NEXT: pextrw $0, %xmm0, %eax1152; X64-NEXT: movw %ax, (%rbx)1153; X64-NEXT: popq %rbx1154; X64-NEXT: retq1155;1156; X86-LABEL: test_half_trunc:1157; X86: # %bb.0:1158; X86-NEXT: pushl %esi1159; X86-NEXT: subl $8, %esp1160; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01161; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1162; X86-NEXT: pextrw $0, %xmm0, %eax1163; X86-NEXT: movw %ax, (%esp)1164; X86-NEXT: calll __extendhfsf21165; X86-NEXT: fstps (%esp)1166; X86-NEXT: calll truncf1167; X86-NEXT: fstps (%esp)1168; X86-NEXT: calll __truncsfhf21169; X86-NEXT: pextrw $0, %xmm0, %eax1170; X86-NEXT: movw %ax, (%esi)1171; X86-NEXT: addl $8, %esp1172; X86-NEXT: popl %esi1173; X86-NEXT: retl1174 %res = call half @llvm.trunc.half(half %a0)1175 store half %res, ptr %p0, align 21176 ret void1177}1178 1179define half @test_half_acos(half %a) nounwind {1180; F16C-LABEL: test_half_acos:1181; F16C: # %bb.0:1182; F16C-NEXT: pushq %rax1183; F16C-NEXT: vcvtph2ps %xmm0, %xmm01184; F16C-NEXT: callq acosf@PLT1185; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01186; F16C-NEXT: popq %rax1187; F16C-NEXT: retq1188;1189; FP16-LABEL: test_half_acos:1190; FP16: # %bb.0:1191; FP16-NEXT: pushq %rax1192; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm01193; FP16-NEXT: callq acosf@PLT1194; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm01195; FP16-NEXT: popq %rax1196; FP16-NEXT: retq1197;1198; X64-LABEL: test_half_acos:1199; X64: # %bb.0:1200; X64-NEXT: pushq %rax1201; X64-NEXT: callq __extendhfsf2@PLT1202; X64-NEXT: callq acosf@PLT1203; X64-NEXT: callq __truncsfhf2@PLT1204; X64-NEXT: popq %rax1205; X64-NEXT: retq1206;1207; X86-LABEL: test_half_acos:1208; X86: # %bb.0:1209; X86-NEXT: subl $12, %esp1210; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01211; X86-NEXT: pextrw $0, %xmm0, %eax1212; X86-NEXT: movw %ax, (%esp)1213; X86-NEXT: calll __extendhfsf21214; X86-NEXT: fstps (%esp)1215; X86-NEXT: calll acosf1216; X86-NEXT: fstps (%esp)1217; X86-NEXT: calll __truncsfhf21218; X86-NEXT: addl $12, %esp1219; X86-NEXT: retl1220 %x = call half @llvm.acos.f16(half %a)1221 ret half %x1222}1223 1224define half @test_half_asin(half %a) nounwind {1225; F16C-LABEL: test_half_asin:1226; F16C: # %bb.0:1227; F16C-NEXT: pushq %rax1228; F16C-NEXT: vcvtph2ps %xmm0, %xmm01229; F16C-NEXT: callq asinf@PLT1230; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01231; F16C-NEXT: popq %rax1232; F16C-NEXT: retq1233;1234; FP16-LABEL: test_half_asin:1235; FP16: # %bb.0:1236; FP16-NEXT: pushq %rax1237; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm01238; FP16-NEXT: callq asinf@PLT1239; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm01240; FP16-NEXT: popq %rax1241; FP16-NEXT: retq1242;1243; X64-LABEL: test_half_asin:1244; X64: # %bb.0:1245; X64-NEXT: pushq %rax1246; X64-NEXT: callq __extendhfsf2@PLT1247; X64-NEXT: callq asinf@PLT1248; X64-NEXT: callq __truncsfhf2@PLT1249; X64-NEXT: popq %rax1250; X64-NEXT: retq1251;1252; X86-LABEL: test_half_asin:1253; X86: # %bb.0:1254; X86-NEXT: subl $12, %esp1255; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01256; X86-NEXT: pextrw $0, %xmm0, %eax1257; X86-NEXT: movw %ax, (%esp)1258; X86-NEXT: calll __extendhfsf21259; X86-NEXT: fstps (%esp)1260; X86-NEXT: calll asinf1261; X86-NEXT: fstps (%esp)1262; X86-NEXT: calll __truncsfhf21263; X86-NEXT: addl $12, %esp1264; X86-NEXT: retl1265 %x = call half @llvm.asin.f16(half %a)1266 ret half %x1267}1268 1269define half @test_half_atan(half %a) nounwind {1270; F16C-LABEL: test_half_atan:1271; F16C: # %bb.0:1272; F16C-NEXT: pushq %rax1273; F16C-NEXT: vcvtph2ps %xmm0, %xmm01274; F16C-NEXT: callq atanf@PLT1275; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01276; F16C-NEXT: popq %rax1277; F16C-NEXT: retq1278;1279; FP16-LABEL: test_half_atan:1280; FP16: # %bb.0:1281; FP16-NEXT: pushq %rax1282; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm01283; FP16-NEXT: callq atanf@PLT1284; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm01285; FP16-NEXT: popq %rax1286; FP16-NEXT: retq1287;1288; X64-LABEL: test_half_atan:1289; X64: # %bb.0:1290; X64-NEXT: pushq %rax1291; X64-NEXT: callq __extendhfsf2@PLT1292; X64-NEXT: callq atanf@PLT1293; X64-NEXT: callq __truncsfhf2@PLT1294; X64-NEXT: popq %rax1295; X64-NEXT: retq1296;1297; X86-LABEL: test_half_atan:1298; X86: # %bb.0:1299; X86-NEXT: subl $12, %esp1300; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01301; X86-NEXT: pextrw $0, %xmm0, %eax1302; X86-NEXT: movw %ax, (%esp)1303; X86-NEXT: calll __extendhfsf21304; X86-NEXT: fstps (%esp)1305; X86-NEXT: calll atanf1306; X86-NEXT: fstps (%esp)1307; X86-NEXT: calll __truncsfhf21308; X86-NEXT: addl $12, %esp1309; X86-NEXT: retl1310 %x = call half @llvm.atan.f16(half %a)1311 ret half %x1312}1313 1314define half @test_half_atan2(half %a, half %b) nounwind {1315; F16C-LABEL: test_half_atan2:1316; F16C: # %bb.0:1317; F16C-NEXT: pushq %rax1318; F16C-NEXT: vcvtph2ps %xmm0, %xmm01319; F16C-NEXT: vcvtph2ps %xmm1, %xmm11320; F16C-NEXT: callq atan2f@PLT1321; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01322; F16C-NEXT: popq %rax1323; F16C-NEXT: retq1324;1325; FP16-LABEL: test_half_atan2:1326; FP16: # %bb.0:1327; FP16-NEXT: pushq %rax1328; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm01329; FP16-NEXT: vcvtsh2ss %xmm1, %xmm1, %xmm11330; FP16-NEXT: callq atan2f@PLT1331; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm01332; FP16-NEXT: popq %rax1333; FP16-NEXT: retq1334;1335; X64-LABEL: test_half_atan2:1336; X64: # %bb.0:1337; X64-NEXT: pushq %rax1338; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1339; X64-NEXT: movaps %xmm1, %xmm01340; X64-NEXT: callq __extendhfsf2@PLT1341; X64-NEXT: movss %xmm0, (%rsp) # 4-byte Spill1342; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload1343; X64-NEXT: # xmm0 = mem[0],zero,zero,zero1344; X64-NEXT: callq __extendhfsf2@PLT1345; X64-NEXT: movss (%rsp), %xmm1 # 4-byte Reload1346; X64-NEXT: # xmm1 = mem[0],zero,zero,zero1347; X64-NEXT: callq atan2f@PLT1348; X64-NEXT: callq __truncsfhf2@PLT1349; X64-NEXT: popq %rax1350; X64-NEXT: retq1351;1352; X86-LABEL: test_half_atan2:1353; X86: # %bb.0:1354; X86-NEXT: subl $60, %esp1355; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01356; X86-NEXT: movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1357; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01358; X86-NEXT: pextrw $0, %xmm0, %eax1359; X86-NEXT: movw %ax, (%esp)1360; X86-NEXT: calll __extendhfsf21361; X86-NEXT: fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill1362; X86-NEXT: movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1363; X86-NEXT: pextrw $0, %xmm0, %eax1364; X86-NEXT: movw %ax, (%esp)1365; X86-NEXT: calll __extendhfsf21366; X86-NEXT: fstps {{[0-9]+}}(%esp)1367; X86-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload1368; X86-NEXT: fstps (%esp)1369; X86-NEXT: calll atan2f1370; X86-NEXT: fstps (%esp)1371; X86-NEXT: calll __truncsfhf21372; X86-NEXT: addl $60, %esp1373; X86-NEXT: retl1374 %x = call half @llvm.atan2.f16(half %a, half %b)1375 ret half %x1376}1377 1378define half @test2_half_cos(half %Val) nounwind {1379; F16C-LABEL: test2_half_cos:1380; F16C: # %bb.0:1381; F16C-NEXT: pushq %rax1382; F16C-NEXT: vcvtph2ps %xmm0, %xmm01383; F16C-NEXT: callq cosf@PLT1384; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01385; F16C-NEXT: popq %rax1386; F16C-NEXT: retq1387;1388; FP16-LABEL: test2_half_cos:1389; FP16: # %bb.0:1390; FP16-NEXT: pushq %rax1391; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm01392; FP16-NEXT: callq cosf@PLT1393; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm01394; FP16-NEXT: popq %rax1395; FP16-NEXT: retq1396;1397; X64-LABEL: test2_half_cos:1398; X64: # %bb.0:1399; X64-NEXT: pushq %rax1400; X64-NEXT: callq __extendhfsf2@PLT1401; X64-NEXT: callq cosf@PLT1402; X64-NEXT: callq __truncsfhf2@PLT1403; X64-NEXT: popq %rax1404; X64-NEXT: retq1405;1406; X86-LABEL: test2_half_cos:1407; X86: # %bb.0:1408; X86-NEXT: subl $12, %esp1409; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01410; X86-NEXT: pextrw $0, %xmm0, %eax1411; X86-NEXT: movw %ax, (%esp)1412; X86-NEXT: calll __extendhfsf21413; X86-NEXT: fstps (%esp)1414; X86-NEXT: calll cosf1415; X86-NEXT: fstps (%esp)1416; X86-NEXT: calll __truncsfhf21417; X86-NEXT: addl $12, %esp1418; X86-NEXT: retl1419 %res = call half @llvm.cos.f16(half %Val)1420 ret half %res1421}1422 1423define half @test_half_cosh(half %a) nounwind {1424; F16C-LABEL: test_half_cosh:1425; F16C: # %bb.0:1426; F16C-NEXT: pushq %rax1427; F16C-NEXT: vcvtph2ps %xmm0, %xmm01428; F16C-NEXT: callq coshf@PLT1429; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01430; F16C-NEXT: popq %rax1431; F16C-NEXT: retq1432;1433; FP16-LABEL: test_half_cosh:1434; FP16: # %bb.0:1435; FP16-NEXT: pushq %rax1436; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm01437; FP16-NEXT: callq coshf@PLT1438; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm01439; FP16-NEXT: popq %rax1440; FP16-NEXT: retq1441;1442; X64-LABEL: test_half_cosh:1443; X64: # %bb.0:1444; X64-NEXT: pushq %rax1445; X64-NEXT: callq __extendhfsf2@PLT1446; X64-NEXT: callq coshf@PLT1447; X64-NEXT: callq __truncsfhf2@PLT1448; X64-NEXT: popq %rax1449; X64-NEXT: retq1450;1451; X86-LABEL: test_half_cosh:1452; X86: # %bb.0:1453; X86-NEXT: subl $12, %esp1454; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01455; X86-NEXT: pextrw $0, %xmm0, %eax1456; X86-NEXT: movw %ax, (%esp)1457; X86-NEXT: calll __extendhfsf21458; X86-NEXT: fstps (%esp)1459; X86-NEXT: calll coshf1460; X86-NEXT: fstps (%esp)1461; X86-NEXT: calll __truncsfhf21462; X86-NEXT: addl $12, %esp1463; X86-NEXT: retl1464 %x = call half @llvm.cosh.f16(half %a)1465 ret half %x1466}1467 1468define half @test2_half_sin(half %Val) nounwind {1469; F16C-LABEL: test2_half_sin:1470; F16C: # %bb.0:1471; F16C-NEXT: pushq %rax1472; F16C-NEXT: vcvtph2ps %xmm0, %xmm01473; F16C-NEXT: callq sinf@PLT1474; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01475; F16C-NEXT: popq %rax1476; F16C-NEXT: retq1477;1478; FP16-LABEL: test2_half_sin:1479; FP16: # %bb.0:1480; FP16-NEXT: pushq %rax1481; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm01482; FP16-NEXT: callq sinf@PLT1483; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm01484; FP16-NEXT: popq %rax1485; FP16-NEXT: retq1486;1487; X64-LABEL: test2_half_sin:1488; X64: # %bb.0:1489; X64-NEXT: pushq %rax1490; X64-NEXT: callq __extendhfsf2@PLT1491; X64-NEXT: callq sinf@PLT1492; X64-NEXT: callq __truncsfhf2@PLT1493; X64-NEXT: popq %rax1494; X64-NEXT: retq1495;1496; X86-LABEL: test2_half_sin:1497; X86: # %bb.0:1498; X86-NEXT: subl $12, %esp1499; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01500; X86-NEXT: pextrw $0, %xmm0, %eax1501; X86-NEXT: movw %ax, (%esp)1502; X86-NEXT: calll __extendhfsf21503; X86-NEXT: fstps (%esp)1504; X86-NEXT: calll sinf1505; X86-NEXT: fstps (%esp)1506; X86-NEXT: calll __truncsfhf21507; X86-NEXT: addl $12, %esp1508; X86-NEXT: retl1509 %res = call half @llvm.sin.f16(half %Val)1510 ret half %res1511}1512 1513define half @test_half_sinh(half %a) nounwind {1514; F16C-LABEL: test_half_sinh:1515; F16C: # %bb.0:1516; F16C-NEXT: pushq %rax1517; F16C-NEXT: vcvtph2ps %xmm0, %xmm01518; F16C-NEXT: callq sinhf@PLT1519; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01520; F16C-NEXT: popq %rax1521; F16C-NEXT: retq1522;1523; FP16-LABEL: test_half_sinh:1524; FP16: # %bb.0:1525; FP16-NEXT: pushq %rax1526; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm01527; FP16-NEXT: callq sinhf@PLT1528; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm01529; FP16-NEXT: popq %rax1530; FP16-NEXT: retq1531;1532; X64-LABEL: test_half_sinh:1533; X64: # %bb.0:1534; X64-NEXT: pushq %rax1535; X64-NEXT: callq __extendhfsf2@PLT1536; X64-NEXT: callq sinhf@PLT1537; X64-NEXT: callq __truncsfhf2@PLT1538; X64-NEXT: popq %rax1539; X64-NEXT: retq1540;1541; X86-LABEL: test_half_sinh:1542; X86: # %bb.0:1543; X86-NEXT: subl $12, %esp1544; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01545; X86-NEXT: pextrw $0, %xmm0, %eax1546; X86-NEXT: movw %ax, (%esp)1547; X86-NEXT: calll __extendhfsf21548; X86-NEXT: fstps (%esp)1549; X86-NEXT: calll sinhf1550; X86-NEXT: fstps (%esp)1551; X86-NEXT: calll __truncsfhf21552; X86-NEXT: addl $12, %esp1553; X86-NEXT: retl1554 %x = call half @llvm.sinh.f16(half %a)1555 ret half %x1556}1557 1558define half @test2_half_tan(half %a) nounwind {1559; F16C-LABEL: test2_half_tan:1560; F16C: # %bb.0:1561; F16C-NEXT: pushq %rax1562; F16C-NEXT: vcvtph2ps %xmm0, %xmm01563; F16C-NEXT: callq tanf@PLT1564; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01565; F16C-NEXT: popq %rax1566; F16C-NEXT: retq1567;1568; FP16-LABEL: test2_half_tan:1569; FP16: # %bb.0:1570; FP16-NEXT: pushq %rax1571; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm01572; FP16-NEXT: callq tanf@PLT1573; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm01574; FP16-NEXT: popq %rax1575; FP16-NEXT: retq1576;1577; X64-LABEL: test2_half_tan:1578; X64: # %bb.0:1579; X64-NEXT: pushq %rax1580; X64-NEXT: callq __extendhfsf2@PLT1581; X64-NEXT: callq tanf@PLT1582; X64-NEXT: callq __truncsfhf2@PLT1583; X64-NEXT: popq %rax1584; X64-NEXT: retq1585;1586; X86-LABEL: test2_half_tan:1587; X86: # %bb.0:1588; X86-NEXT: subl $12, %esp1589; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01590; X86-NEXT: pextrw $0, %xmm0, %eax1591; X86-NEXT: movw %ax, (%esp)1592; X86-NEXT: calll __extendhfsf21593; X86-NEXT: fstps (%esp)1594; X86-NEXT: calll tanf1595; X86-NEXT: fstps (%esp)1596; X86-NEXT: calll __truncsfhf21597; X86-NEXT: addl $12, %esp1598; X86-NEXT: retl1599 %x = call half @llvm.tan.f16(half %a)1600 ret half %x1601}1602 1603define half @test_half_tanh(half %a) nounwind {1604; F16C-LABEL: test_half_tanh:1605; F16C: # %bb.0:1606; F16C-NEXT: pushq %rax1607; F16C-NEXT: vcvtph2ps %xmm0, %xmm01608; F16C-NEXT: callq tanhf@PLT1609; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm01610; F16C-NEXT: popq %rax1611; F16C-NEXT: retq1612;1613; FP16-LABEL: test_half_tanh:1614; FP16: # %bb.0:1615; FP16-NEXT: pushq %rax1616; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm01617; FP16-NEXT: callq tanhf@PLT1618; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm01619; FP16-NEXT: popq %rax1620; FP16-NEXT: retq1621;1622; X64-LABEL: test_half_tanh:1623; X64: # %bb.0:1624; X64-NEXT: pushq %rax1625; X64-NEXT: callq __extendhfsf2@PLT1626; X64-NEXT: callq tanhf@PLT1627; X64-NEXT: callq __truncsfhf2@PLT1628; X64-NEXT: popq %rax1629; X64-NEXT: retq1630;1631; X86-LABEL: test_half_tanh:1632; X86: # %bb.0:1633; X86-NEXT: subl $12, %esp1634; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm01635; X86-NEXT: pextrw $0, %xmm0, %eax1636; X86-NEXT: movw %ax, (%esp)1637; X86-NEXT: calll __extendhfsf21638; X86-NEXT: fstps (%esp)1639; X86-NEXT: calll tanhf1640; X86-NEXT: fstps (%esp)1641; X86-NEXT: calll __truncsfhf21642; X86-NEXT: addl $12, %esp1643; X86-NEXT: retl1644 %x = call half @llvm.tanh.f16(half %a)1645 ret half %x1646}1647