From ed05086d61a6ef6c375d9d7e7e7f5a94b03a5b58 Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Thu, 17 Jul 2014 11:04:04 +0000 Subject: [PATCH] X86: support double extension of f16 type. x86 has no native ability to extend an f16 to f64, but the same result is obtained if we expand it into two separate extensions: f16 -> f32 -> f64. Unfortunately the same is not true for truncate, so that still results in a compilation failure. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213251 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 4 ++++ test/CodeGen/X86/cvt16.ll | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 39186c54f9d..d3d2c76de21 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -523,6 +523,10 @@ void X86TargetLowering::resetOperationActions() { setOperationAction(ISD::FP_TO_FP16, MVT::f32, Expand); } + // There's never any support for extending beyond MVT::f32. + setOperationAction(ISD::FP16_TO_FP, MVT::f64, Expand); + setOperationAction(ISD::FP16_TO_FP, MVT::f80, Expand); + if (Subtarget->hasPOPCNT()) { setOperationAction(ISD::CTPOP , MVT::i8 , Promote); } else { diff --git a/test/CodeGen/X86/cvt16.ll b/test/CodeGen/X86/cvt16.ll index f3d80493210..501145ca715 100644 --- a/test/CodeGen/X86/cvt16.ll +++ b/test/CodeGen/X86/cvt16.ll @@ -59,6 +59,20 @@ define float @test3(float %src) nounwind uwtable readnone { ; F16C-NEXT: vcvtph2ps ; F16C: ret +define double @test4(i16* nocapture %src) { + %1 = load i16* %src, align 2 + %2 = tail call double @llvm.convert.from.fp16.f64(i16 %1) + ret double %2 +} +; CHECK-LABEL: test4: +; LIBCALL: callq __gnu_h2f_ieee +; LIBCALL: cvtss2sd +; SOFTFLOAT: callq __gnu_h2f_ieee +; SOFTFLOAT: callq __extendsfdf2 +; F16C: vcvtph2ps +; F16C: vcvtss2sd +; F16C: ret + declare float @llvm.convert.from.fp16.f32(i16) nounwind readnone declare i16 @llvm.convert.to.fp16.f32(float) nounwind readnone - +declare double @llvm.convert.from.fp16.f64(i16) nounwind readnone -- 2.34.1