diff --git a/llvm/include/llvm/ADT/APFloat.h b/llvm/include/llvm/ADT/APFloat.h index b51b6256ad2c6..9b903fc888b4c 100644 --- a/llvm/include/llvm/ADT/APFloat.h +++ b/llvm/include/llvm/ADT/APFloat.h @@ -163,6 +163,8 @@ class APFloatBase { S_IEEEsingle, S_IEEEdouble, S_IEEEquad, + // TODO: Documentation is missing. + S_x87DoubleExtended, // The IBM double-double semantics. Such a number consists of a pair of // IEEE 64-bit doubles (Hi, Lo), where |Hi| > |Lo|, and if normal, // (double)(Hi + Lo) == Hi. The numeric value it's modeling is Hi + Lo. @@ -262,9 +264,7 @@ class APFloatBase { // Unlike IEEE-754 types, there are no infinity values, and NaN is // represented with the exponent and mantissa bits set to all 1s. S_Float8E5M3FNU, - // TODO: Documentation is missing. - S_x87DoubleExtended, - S_MaxSemantics = S_x87DoubleExtended, + S_MaxSemantics = S_Float8E5M3FNU, }; LLVM_ABI static const llvm::fltSemantics &EnumToSemantics(Semantics S); @@ -276,6 +276,9 @@ class APFloatBase { LLVM_ABI static const fltSemantics semIEEEsingle; LLVM_ABI static const fltSemantics semIEEEdouble; LLVM_ABI static const fltSemantics semIEEEquad; + LLVM_ABI static const fltSemantics semX87DoubleExtended; + LLVM_ABI static const fltSemantics semPPCDoubleDouble; + LLVM_ABI static const fltSemantics semPPCDoubleDoubleLegacy; LLVM_ABI static const fltSemantics semFloat8E5M2; LLVM_ABI static const fltSemantics semFloat8E5M2FNUZ; LLVM_ABI static const fltSemantics semFloat8E4M3; @@ -289,10 +292,7 @@ class APFloatBase { LLVM_ABI static const fltSemantics semFloat6E3M2FN; LLVM_ABI static const fltSemantics semFloat6E2M3FN; LLVM_ABI static const fltSemantics semFloat4E2M1FN; - LLVM_ABI static const fltSemantics semX87DoubleExtended; LLVM_ABI static const fltSemantics semBogus; - LLVM_ABI static const fltSemantics semPPCDoubleDouble; - LLVM_ABI static const fltSemantics semPPCDoubleDoubleLegacy; friend class detail::IEEEFloat; friend class detail::DoubleAPFloat; @@ -304,6 +304,9 @@ class APFloatBase { static const fltSemantics &IEEEsingle() { return semIEEEsingle; } static const fltSemantics &IEEEdouble() { return semIEEEdouble; } static const fltSemantics &IEEEquad() { return semIEEEquad; } + static const fltSemantics &x87DoubleExtended() { + return semX87DoubleExtended; + } static const fltSemantics &PPCDoubleDouble() { return semPPCDoubleDouble; } static const fltSemantics &PPCDoubleDoubleLegacy() { return semPPCDoubleDoubleLegacy; @@ -323,9 +326,6 @@ class APFloatBase { static const fltSemantics &Float6E3M2FN() { return semFloat6E3M2FN; } static const fltSemantics &Float6E2M3FN() { return semFloat6E2M3FN; } static const fltSemantics &Float4E2M1FN() { return semFloat4E2M1FN; } - static const fltSemantics &x87DoubleExtended() { - return semX87DoubleExtended; - } /// A Pseudo fltsemantic used to construct APFloats that cannot conflict with /// anything real. diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp index 59a6ba3867d40..45ee43a595e56 100644 --- a/llvm/lib/Support/APFloat.cpp +++ b/llvm/lib/Support/APFloat.cpp @@ -73,6 +73,21 @@ constexpr fltSemantics APFloatBase::semBFloat = {127, -126, 8, 16}; constexpr fltSemantics APFloatBase::semIEEEsingle = {127, -126, 24, 32}; constexpr fltSemantics APFloatBase::semIEEEdouble = {1023, -1022, 53, 64}; constexpr fltSemantics APFloatBase::semIEEEquad = {16383, -16382, 113, 128}; +constexpr fltSemantics APFloatBase::semX87DoubleExtended = { + 16383, + -16382, + 64, + 80, + fltNonfiniteBehavior::IEEE754, + fltNanEncoding::IEEE, + true, + true, + true, + true, + true}; +constexpr fltSemantics APFloatBase::semPPCDoubleDouble = {-1, 0, 0, 128}; +constexpr fltSemantics APFloatBase::semPPCDoubleDoubleLegacy = { + 1023, -1022 + 53, 53 + 53, 128}; constexpr fltSemantics APFloatBase::semFloat8E5M2 = {15, -14, 3, 8}; constexpr fltSemantics APFloatBase::semFloat8E5M2FNUZ = { 15, -15, 3, 8, fltNonfiniteBehavior::NanOnly, fltNanEncoding::NegativeZero}; @@ -114,22 +129,7 @@ constexpr fltSemantics APFloatBase::semFloat6E2M3FN = { 2, 0, 4, 6, fltNonfiniteBehavior::FiniteOnly}; constexpr fltSemantics APFloatBase::semFloat4E2M1FN = { 2, 0, 2, 4, fltNonfiniteBehavior::FiniteOnly}; -constexpr fltSemantics APFloatBase::semX87DoubleExtended = { - 16383, - -16382, - 64, - 80, - fltNonfiniteBehavior::IEEE754, - fltNanEncoding::IEEE, - true, - true, - true, - true, - true}; constexpr fltSemantics APFloatBase::semBogus = {0, 0, 0, 0}; -constexpr fltSemantics APFloatBase::semPPCDoubleDouble = {-1, 0, 0, 128}; -constexpr fltSemantics APFloatBase::semPPCDoubleDoubleLegacy = { - 1023, -1022 + 53, 53 + 53, 128}; const llvm::fltSemantics &APFloatBase::EnumToSemantics(Semantics S) { switch (S) { @@ -143,6 +143,8 @@ const llvm::fltSemantics &APFloatBase::EnumToSemantics(Semantics S) { return IEEEdouble(); case S_IEEEquad: return IEEEquad(); + case S_x87DoubleExtended: + return x87DoubleExtended(); case S_PPCDoubleDouble: return PPCDoubleDouble(); case S_PPCDoubleDoubleLegacy: @@ -173,8 +175,6 @@ const llvm::fltSemantics &APFloatBase::EnumToSemantics(Semantics S) { return Float6E2M3FN(); case S_Float4E2M1FN: return Float4E2M1FN(); - case S_x87DoubleExtended: - return x87DoubleExtended(); } llvm_unreachable("Unrecognised floating semantics"); } @@ -191,6 +191,8 @@ APFloatBase::SemanticsToEnum(const llvm::fltSemantics &Sem) { return S_IEEEdouble; else if (&Sem == &llvm::APFloat::IEEEquad()) return S_IEEEquad; + else if (&Sem == &llvm::APFloat::x87DoubleExtended()) + return S_x87DoubleExtended; else if (&Sem == &llvm::APFloat::PPCDoubleDouble()) return S_PPCDoubleDouble; else if (&Sem == &llvm::APFloat::PPCDoubleDoubleLegacy()) @@ -221,8 +223,6 @@ APFloatBase::SemanticsToEnum(const llvm::fltSemantics &Sem) { return S_Float6E2M3FN; else if (&Sem == &llvm::APFloat::Float4E2M1FN()) return S_Float4E2M1FN; - else if (&Sem == &llvm::APFloat::x87DoubleExtended()) - return S_x87DoubleExtended; else llvm_unreachable("Unknown floating semantics"); } @@ -3691,6 +3691,10 @@ APInt IEEEFloat::bitcastToAPInt() const { if (semantics == (const llvm::fltSemantics *)&APFloatBase::semIEEEquad) return convertQuadrupleAPFloatToAPInt(); + if (semantics == + (const llvm::fltSemantics *)&APFloatBase::semX87DoubleExtended) + return convertF80LongDoubleAPFloatToAPInt(); + if (semantics == (const llvm::fltSemantics *)&APFloatBase::semPPCDoubleDoubleLegacy) return convertPPCDoubleDoubleLegacyAPFloatToAPInt(); @@ -3735,10 +3739,7 @@ APInt IEEEFloat::bitcastToAPInt() const { if (semantics == (const llvm::fltSemantics *)&APFloatBase::semFloat4E2M1FN) return convertFloat4E2M1FNAPFloatToAPInt(); - assert(semantics == - (const llvm::fltSemantics *)&APFloatBase::semX87DoubleExtended && - "unknown format!"); - return convertF80LongDoubleAPFloatToAPInt(); + llvm_unreachable("unknown format!"); } float IEEEFloat::convertToFloat() const { @@ -4017,10 +4018,10 @@ void IEEEFloat::initFromAPInt(const fltSemantics *Sem, const APInt &api) { return initFromFloatAPInt(api); if (Sem == &APFloatBase::semIEEEdouble) return initFromDoubleAPInt(api); - if (Sem == &APFloatBase::semX87DoubleExtended) - return initFromF80LongDoubleAPInt(api); if (Sem == &APFloatBase::semIEEEquad) return initFromQuadrupleAPInt(api); + if (Sem == &APFloatBase::semX87DoubleExtended) + return initFromF80LongDoubleAPInt(api); if (Sem == &APFloatBase::semPPCDoubleDoubleLegacy) return initFromPPCDoubleDoubleLegacyAPInt(api); if (Sem == &APFloatBase::semFloat8E5M2)