diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -204,6 +204,7 @@ bool HasBFloat16; bool HasIbm128; bool HasLongDouble; + bool Has80BitLongDouble; bool HasFPReturn; bool HasStrictFP; diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -38,6 +38,7 @@ HasFloat16 = false; HasBFloat16 = false; HasLongDouble = true; + Has80BitLongDouble = false; HasFPReturn = true; HasStrictFP = false; PointerWidth = PointerAlign = 32; @@ -449,6 +450,9 @@ } } + if (LongDoubleFormat == &llvm::APFloat::x87DoubleExtended()) + HasLongDouble = Has80BitLongDouble; + if (Opts.NewAlignOverride) NewAlign = Opts.NewAlignOverride * getCharWidth(); diff --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp --- a/clang/lib/Basic/Targets/X86.cpp +++ b/clang/lib/Basic/Targets/X86.cpp @@ -384,8 +384,8 @@ // FIXME: We should allow long double type on 32-bits to match with GCC. // This requires backend to be able to lower f80 without x87 first. - if (!HasX87 && LongDoubleFormat == &llvm::APFloat::x87DoubleExtended()) - HasLongDouble = false; + if (HasX87) + Has80BitLongDouble = true; if (SSELevel < SSE1 && getTriple().getArch() == llvm::Triple::x86_64) HasFPReturn = false; diff --git a/clang/test/Sema/x86-no-x87.cpp b/clang/test/Sema/x86-no-x87.cpp --- a/clang/test/Sema/x86-no-x87.cpp +++ b/clang/test/Sema/x86-no-x87.cpp @@ -1,5 +1,6 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s -triple i686-linux-gnu -target-feature -x87 // RUN: %clang_cc1 -fsyntax-only -verify %s -triple i686-linux-gnu -DNOERROR +// RUN: %clang_cc1 -fsyntax-only -verify %s -triple i686-linux-gnu -mlong-double-64 -DNOERROR #ifdef NOERROR // expected-no-diagnostics diff --git a/clang/test/Sema/x86_64-no-x87.cpp b/clang/test/Sema/x86_64-no-x87.cpp --- a/clang/test/Sema/x86_64-no-x87.cpp +++ b/clang/test/Sema/x86_64-no-x87.cpp @@ -1,6 +1,7 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu -target-feature -x87 -target-feature -sse -DERROR_LONGDOUBLE -DERROR_NOSSE // RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu -target-feature -x87 -DERROR_LONGDOUBLE // RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu -DNOERROR +// RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu -mlong-double-64 -DNOERROR #ifdef NOERROR // expected-no-diagnostics