13#ifndef LLVM_CLANG_AST_INTERP_FLOATING_H
14#define LLVM_CLANG_AST_INTERP_FLOATING_H
18#include "llvm/ADT/APFloat.h"
38 return Floating(APFloat::getInf(Sem));
52 return F.convertToInteger(
Result, llvm::APFloat::rmTowardZero, &IsExact);
56 llvm::RoundingMode RM)
const {
59 Copy.convert(*Sem, RM, &LosesInfo);
70 return APSInt(F.bitcastToAPInt());
73 void print(llvm::raw_ostream &OS)
const {
80 unsigned bitWidth()
const {
return F.semanticsSizeInBits(F.getSemantics()); }
85 bool isZero()
const {
return F.isZero(); }
87 bool isMin()
const {
return F.isSmallest(); }
88 bool isMinusOne()
const {
return F.isExactlyValue(-1.0); }
89 bool isNan()
const {
return F.isNaN(); }
90 bool isInf()
const {
return F.isInfinity(); }
94 llvm::FPClassTest
classify()
const {
return F.classify(); }
95 APFloat::fltCategory
getCategory()
const {
return F.getCategory(); }
98 llvm::APFloatBase::cmpResult CmpRes = F.compare(RHS.F);
100 case llvm::APFloatBase::cmpLessThan:
102 case llvm::APFloatBase::cmpEqual:
104 case llvm::APFloatBase::cmpGreaterThan:
106 case llvm::APFloatBase::cmpUnordered:
109 llvm_unreachable(
"Inavlid cmpResult value");
113 const llvm::fltSemantics &Sem,
114 llvm::RoundingMode RM,
117 APFloat::opStatus Status = F.convertFromAPInt(Val, Val.isSigned(), RM);
123 const llvm::fltSemantics &Sem) {
124 size_t Size = APFloat::semanticsSizeInBits(Sem);
125 llvm::APInt API(Size,
true);
126 llvm::LoadIntFromMemory(API, (
const uint8_t *)Buff, Size / 8);
133 return sizeof(llvm::fltSemantics *) +
134 (APFloat::semanticsSizeInBits(F.getSemantics()) / 8);
139 *
reinterpret_cast<const llvm::fltSemantics **
>(Buff) = &F.getSemantics();
141 llvm::APInt API = F.bitcastToAPInt();
142 llvm::StoreIntToMemory(API, (uint8_t *)(Buff +
sizeof(
void *)),
147 const llvm::fltSemantics *Sem;
148 std::memcpy((
void *)&Sem, Buff,
sizeof(
void *));
162 llvm::RoundingMode RM,
Floating *R) {
164 return R->F.add(B.F, RM);
169 APFloat One(A.F.getSemantics(), 1);
171 return R->F.add(One, RM);
175 llvm::RoundingMode RM,
Floating *R) {
177 return R->F.subtract(B.F, RM);
182 APFloat One(A.F.getSemantics(), 1);
184 return R->F.subtract(One, RM);
188 llvm::RoundingMode RM,
Floating *R) {
190 return R->F.multiply(B.F, RM);
194 llvm::RoundingMode RM,
Floating *R) {
196 return R->F.divide(B.F, RM);
205llvm::raw_ostream &
operator<<(llvm::raw_ostream &OS, Floating F);
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
bool operator<(Floating RHS) const
static APFloat::opStatus div(const Floating &A, const Floating &B, llvm::RoundingMode RM, Floating *R)
Floating operator-() const
static Floating bitcastFromMemory(const std::byte *Buff, const llvm::fltSemantics &Sem)
void print(llvm::raw_ostream &OS) const
APSInt toAPSInt(unsigned NumBits=0) const
static Floating deserialize(const std::byte *Buff)
void serialize(std::byte *Buff) const
static APFloat::opStatus sub(const Floating &A, const Floating &B, llvm::RoundingMode RM, Floating *R)
const APFloat & getAPFloat() const
llvm::FPClassTest classify() const
Floating toSemantics(const Floating &Other, llvm::RoundingMode RM) const
Convert this Floating to one with the same semantics as \Other.
bool operator>(Floating RHS) const
Floating()
Zero-initializes a Floating.
unsigned bitWidth() const
ComparisonCategoryResult compare(const Floating &RHS) const
static APFloat::opStatus increment(const Floating &A, llvm::RoundingMode RM, Floating *R)
bool operator>=(Floating RHS) const
bool operator<=(Floating RHS) const
static APFloat::opStatus fromIntegral(APSInt Val, const llvm::fltSemantics &Sem, llvm::RoundingMode RM, Floating &Result)
Floating toSemantics(const llvm::fltSemantics *Sem, llvm::RoundingMode RM) const
size_t bytesToSerialize() const
static APFloat::opStatus add(const Floating &A, const Floating &B, llvm::RoundingMode RM, Floating *R)
static APFloat::opStatus mul(const Floating &A, const Floating &B, llvm::RoundingMode RM, Floating *R)
bool operator!=(Floating RHS) const
APValue toAPValue() const
static Floating getInf(const llvm::fltSemantics &Sem)
bool operator==(Floating RHS) const
static bool neg(const Floating &A, Floating *R)
static APFloat::opStatus decrement(const Floating &A, llvm::RoundingMode RM, Floating *R)
Floating(const APFloat &F)
static Floating abs(const Floating &F)
APFloat::opStatus convertToInteger(APSInt &Result) const
APFloat::fltCategory getCategory() const
Floating getSwappedBytes(Floating F)
llvm::raw_ostream & operator<<(llvm::raw_ostream &OS, const Boolean &B)
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
@ Result
The result type of a method or function.