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
This commit is contained in:
Tim Northover 2014-07-17 11:04:04 +00:00
parent 3e61ccdded
commit ed05086d61
2 changed files with 19 additions and 1 deletions

View File

@ -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 {

View File

@ -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