mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-01 04:29:57 +00:00
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:
parent
3e61ccdded
commit
ed05086d61
@ -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 {
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user