From 21310448143b3174931530ddf9f993dd93187957 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. llvm-svn: 213251 --- llvm/lib/Target/X86/X86ISelLowering.cpp | 4 ++++ llvm/test/CodeGen/X86/cvt16.ll | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 39186c5..d3d2c76 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/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/llvm/test/CodeGen/X86/cvt16.ll b/llvm/test/CodeGen/X86/cvt16.ll index f3d8049..501145c 100644 --- a/llvm/test/CodeGen/X86/cvt16.ll +++ b/llvm/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.7.4