@@ -322,7 +322,38 @@ struct APFloatBase {
322
322
323
323
namespace detail {
324
324
325
- class IEEEFloat final : public APFloatBase {
325
+ using integerPart = APFloatBase::integerPart;
326
+ using uninitializedTag = APFloatBase::uninitializedTag;
327
+ using roundingMode = APFloatBase::roundingMode;
328
+ using opStatus = APFloatBase::opStatus;
329
+ using cmpResult = APFloatBase::cmpResult;
330
+ using fltCategory = APFloatBase::fltCategory;
331
+ using ExponentType = APFloatBase::ExponentType;
332
+ static constexpr uninitializedTag uninitialized = APFloatBase::uninitialized;
333
+ static constexpr roundingMode rmNearestTiesToEven =
334
+ APFloatBase::rmNearestTiesToEven;
335
+ static constexpr roundingMode rmNearestTiesToAway =
336
+ APFloatBase::rmNearestTiesToAway;
337
+ static constexpr roundingMode rmTowardNegative = APFloatBase::rmTowardNegative;
338
+ static constexpr roundingMode rmTowardPositive = APFloatBase::rmTowardPositive;
339
+ static constexpr roundingMode rmTowardZero = APFloatBase::rmTowardZero;
340
+ static constexpr unsigned integerPartWidth = APFloatBase::integerPartWidth;
341
+ static constexpr cmpResult cmpEqual = APFloatBase::cmpEqual;
342
+ static constexpr cmpResult cmpLessThan = APFloatBase::cmpLessThan;
343
+ static constexpr cmpResult cmpGreaterThan = APFloatBase::cmpGreaterThan;
344
+ static constexpr cmpResult cmpUnordered = APFloatBase::cmpUnordered;
345
+ static constexpr opStatus opOK = APFloatBase::opOK;
346
+ static constexpr opStatus opInvalidOp = APFloatBase::opInvalidOp;
347
+ static constexpr opStatus opDivByZero = APFloatBase::opDivByZero;
348
+ static constexpr opStatus opOverflow = APFloatBase::opOverflow;
349
+ static constexpr opStatus opUnderflow = APFloatBase::opUnderflow;
350
+ static constexpr opStatus opInexact = APFloatBase::opInexact;
351
+ static constexpr fltCategory fcInfinity = APFloatBase::fcInfinity;
352
+ static constexpr fltCategory fcNaN = APFloatBase::fcNaN;
353
+ static constexpr fltCategory fcNormal = APFloatBase::fcNormal;
354
+ static constexpr fltCategory fcZero = APFloatBase::fcZero;
355
+
356
+ class IEEEFloat final {
326
357
public:
327
358
// / \name Constructors
328
359
// / @{
@@ -433,7 +464,7 @@ class IEEEFloat final : public APFloatBase {
433
464
bool isFinite () const { return !isNaN () && !isInfinity (); }
434
465
435
466
// / Returns true if and only if the float is plus or minus zero.
436
- bool isZero () const { return category == fcZero; }
467
+ bool isZero () const { return category == fltCategory:: fcZero; }
437
468
438
469
// / IEEE-754R isSubnormal(): Returns true if and only if the float is a
439
470
// / denormal.
@@ -455,7 +486,7 @@ class IEEEFloat final : public APFloatBase {
455
486
456
487
fltCategory getCategory () const { return category; }
457
488
const fltSemantics &getSemantics () const { return *semantics; }
458
- bool isNonZero () const { return category != fcZero; }
489
+ bool isNonZero () const { return category != fltCategory:: fcZero; }
459
490
bool isFiniteNonZero () const { return isFinite () && !isZero (); }
460
491
bool isPosZero () const { return isZero () && !isNegative (); }
461
492
bool isNegZero () const { return isZero () && isNegative (); }
@@ -719,14 +750,14 @@ class IEEEFloat final : public APFloatBase {
719
750
720
751
hash_code hash_value (const IEEEFloat &Arg);
721
752
int ilogb (const IEEEFloat &Arg);
722
- IEEEFloat scalbn (IEEEFloat X, int Exp, IEEEFloat:: roundingMode);
723
- IEEEFloat frexp (const IEEEFloat &Val, int &Exp, IEEEFloat:: roundingMode RM);
753
+ IEEEFloat scalbn (IEEEFloat X, int Exp, roundingMode);
754
+ IEEEFloat frexp (const IEEEFloat &Val, int &Exp, roundingMode RM);
724
755
725
756
// This mode implements more precise float in terms of two APFloats.
726
757
// The interface and layout is designed for arbitrary underlying semantics,
727
758
// though currently only PPCDoubleDouble semantics are supported, whose
728
759
// corresponding underlying semantics are IEEEdouble.
729
- class DoubleAPFloat final : public APFloatBase {
760
+ class DoubleAPFloat final {
730
761
// Note: this must be the first data member.
731
762
const fltSemantics *Semantics;
732
763
std::unique_ptr<APFloat[]> Floats;
@@ -819,8 +850,8 @@ class DoubleAPFloat final : public APFloatBase {
819
850
};
820
851
821
852
hash_code hash_value (const DoubleAPFloat &Arg);
822
- DoubleAPFloat scalbn (const DoubleAPFloat &Arg, int Exp, IEEEFloat:: roundingMode RM);
823
- DoubleAPFloat frexp (const DoubleAPFloat &X, int &Exp, IEEEFloat:: roundingMode);
853
+ DoubleAPFloat scalbn (const DoubleAPFloat &Arg, int Exp, roundingMode RM);
854
+ DoubleAPFloat frexp (const DoubleAPFloat &X, int &Exp, roundingMode);
824
855
825
856
} // End detail namespace
826
857
@@ -1440,6 +1471,9 @@ class APFloat : public APFloatBase {
1440
1471
friend DoubleAPFloat;
1441
1472
};
1442
1473
1474
+ static_assert (sizeof (APFloat) == sizeof (detail::IEEEFloat),
1475
+ " Empty base class optimization is not performed." );
1476
+
1443
1477
// / See friend declarations above.
1444
1478
// /
1445
1479
// / These additional declarations are required in order to compile LLVM with IBM
0 commit comments