13#ifndef LLVM_CLANG_AST_INTERP_FLOATING_H
14#define LLVM_CLANG_AST_INTERP_FLOATING_H
18#include "llvm/ADT/APFloat.h"
28using APSInt = llvm::APSInt;
29using APInt = llvm::APInt;
41 llvm::APFloatBase::Semantics Semantics;
54 Floating(llvm::APFloatBase::Semantics Semantics)
55 :
Val(0), Semantics(Semantics) {}
58 Semantics = llvm::APFloatBase::SemanticsToEnum(F.getSemantics());
73 return getValue().convertToInteger(
Result, llvm::APFloat::rmTowardZero,
77 void toSemantics(
const llvm::fltSemantics *Sem, llvm::RoundingMode RM,
81 Copy.convert(*Sem, RM, &LosesInfo);
87 return APSInt(getValue().bitcastToAPInt());
90 void print(llvm::raw_ostream &OS)
const {
93 getValue().toString(Buffer);
98 llvm::raw_string_ostream OS(NameStr);
104 return llvm::APFloatBase::semanticsSizeInBits(
getSemantics());
117 return APInt::getNumWords(llvm::APFloatBase::getSizeInBits(Sem)) == 1;
120 return llvm::APFloatBase::EnumToSemantics(Semantics);
125 Val = F.bitcastToAPInt().getZExtValue();
128 std::memcpy(
Memory, F.bitcastToAPInt().getRawData(),
133 void take(uint64_t *NewMemory) {
144 bool isZero()
const {
return getValue().isZero(); }
145 bool isNonZero()
const {
return getValue().isNonZero(); }
146 bool isMin()
const {
return getValue().isSmallest(); }
147 bool isMinusOne()
const {
return getValue().isExactlyValue(-1.0); }
148 bool isNan()
const {
return getValue().isNaN(); }
150 bool isInf()
const {
return getValue().isInfinity(); }
151 bool isFinite()
const {
return getValue().isFinite(); }
152 bool isNormal()
const {
return getValue().isNormal(); }
154 llvm::FPClassTest
classify()
const {
return getValue().classify(); }
155 APFloat::fltCategory
getCategory()
const {
return getValue().getCategory(); }
158 llvm::APFloatBase::cmpResult CmpRes = getValue().compare(RHS.getValue());
160 case llvm::APFloatBase::cmpLessThan:
162 case llvm::APFloatBase::cmpEqual:
164 case llvm::APFloatBase::cmpGreaterThan:
166 case llvm::APFloatBase::cmpUnordered:
169 llvm_unreachable(
"Inavlid cmpResult value");
173 const llvm::fltSemantics &Sem,
174 llvm::RoundingMode RM,
177 APFloat::opStatus Status = F.convertFromAPInt(
Val,
Val.isSigned(), RM);
183 const llvm::fltSemantics &Sem,
185 size_t Size = APFloat::semanticsSizeInBits(Sem);
186 llvm::APInt API(Size,
true);
187 llvm::LoadIntFromMemory(API, (
const uint8_t *)Buff, Size / 8);
192 llvm::APInt API = getValue().bitcastToAPInt();
193 llvm::StoreIntToMemory(API, (uint8_t *)Buff,
bitWidth() / 8);
198 return sizeof(Semantics) + (
numWords() *
sizeof(uint64_t));
202 std::memcpy(Buff, &Semantics,
sizeof(Semantics));
204 std::memcpy(Buff +
sizeof(Semantics), &
Val,
sizeof(uint64_t));
206 std::memcpy(Buff +
sizeof(Semantics),
Memory,
211 static llvm::APFloatBase::Semantics
213 return *
reinterpret_cast<const llvm::APFloatBase::Semantics *
>(Buff);
217 llvm::APFloatBase::Semantics Semantics;
218 std::memcpy(&Semantics, Buff,
sizeof(Semantics));
220 unsigned BitWidth = llvm::APFloat::semanticsSizeInBits(
221 llvm::APFloatBase::EnumToSemantics(Semantics));
222 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
224 Result->Semantics = Semantics;
226 std::memcpy(&
Result->Val, Buff +
sizeof(Semantics),
sizeof(uint64_t));
229 std::memcpy(
Result->Memory, Buff +
sizeof(Semantics),
230 NumWords *
sizeof(uint64_t));
237 llvm::RoundingMode RM,
Floating *R) {
241 auto Status = LHS.add(RHS, RM);
251 auto Status = LHS.add(One, RM);
257 llvm::RoundingMode RM,
Floating *R) {
261 auto Status = LHS.subtract(RHS, RM);
271 auto Status = LHS.subtract(One, RM);
277 llvm::RoundingMode RM,
Floating *R) {
282 auto Status = LHS.multiply(RHS, RM);
288 llvm::RoundingMode RM,
Floating *R) {
292 auto Status = LHS.divide(RHS, RM);
298 R->
copy(-A.getValue());
303llvm::raw_ostream &
operator<<(llvm::raw_ostream &OS, Floating F);
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
bool operator<(Floating RHS) const
static APFloat::opStatus div(const Floating &A, const Floating &B, llvm::RoundingMode RM, Floating *R)
static llvm::APFloatBase::Semantics deserializeSemantics(const std::byte *Buff)
void copy(const APFloat &F)
static APFloat::opStatus fromIntegral(APSInt Val, const llvm::fltSemantics &Sem, llvm::RoundingMode RM, Floating *Result)
void print(llvm::raw_ostream &OS) const
APSInt toAPSInt(unsigned NumBits=0) const
void serialize(std::byte *Buff) const
static APFloat::opStatus sub(const Floating &A, const Floating &B, llvm::RoundingMode RM, Floating *R)
llvm::FPClassTest classify() const
Floating(llvm::APFloatBase::Semantics Semantics)
bool operator>(Floating RHS) const
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
void take(uint64_t *NewMemory)
bool operator<=(Floating RHS) const
unsigned numWords() const
size_t bytesToSerialize() const
static APFloat::opStatus add(const Floating &A, const Floating &B, llvm::RoundingMode RM, Floating *R)
static void deserialize(const std::byte *Buff, Floating *Result)
static APFloat::opStatus mul(const Floating &A, const Floating &B, llvm::RoundingMode RM, Floating *R)
void toSemantics(const llvm::fltSemantics *Sem, llvm::RoundingMode RM, Floating *Result) const
std::string toDiagnosticString(const ASTContext &Ctx) const
const llvm::fltSemantics & getSemantics() const
Floating(uint64_t *Memory, llvm::APFloatBase::Semantics Semantics)
static bool neg(const Floating &A, Floating *R)
static bool singleWord(const llvm::fltSemantics &Sem)
static APFloat::opStatus decrement(const Floating &A, llvm::RoundingMode RM, Floating *R)
Floating(const APFloat &F)
APFloat::opStatus convertToInteger(APSInt &Result) const
APValue toAPValue(const ASTContext &) const
APFloat::fltCategory getCategory() const
void bitcastToMemory(std::byte *Buff) const
static void bitcastFromMemory(const std::byte *Buff, const llvm::fltSemantics &Sem, Floating *Result)
APFloat getAPFloat() const
FixedPoint getSwappedBytes(FixedPoint F)
llvm::raw_ostream & operator<<(llvm::raw_ostream &OS, const Boolean &B)
The JSON file list parser is used to communicate input to InstallAPI.
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
@ Result
The result type of a method or function.