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;
53 Floating(llvm::APFloatBase::Semantics Semantics)
54 :
Val(0), Semantics(Semantics) {}
57 Semantics = llvm::APFloatBase::SemanticsToEnum(F.getSemantics());
72 return getValue().convertToInteger(
Result, llvm::APFloat::rmTowardZero,
76 void toSemantics(
const llvm::fltSemantics *Sem, llvm::RoundingMode RM,
80 Copy.convert(*Sem, RM, &LosesInfo);
86 return APSInt(getValue().bitcastToAPInt());
89 void print(llvm::raw_ostream &OS)
const {
92 getValue().toString(Buffer);
97 llvm::raw_string_ostream OS(NameStr);
103 return llvm::APFloatBase::semanticsSizeInBits(
getSemantics());
116 return APInt::getNumWords(llvm::APFloatBase::getSizeInBits(Sem)) == 1;
119 return llvm::APFloatBase::EnumToSemantics(Semantics);
124 Val = F.bitcastToAPInt().getZExtValue();
127 std::memcpy(
Memory, F.bitcastToAPInt().getRawData(),
132 void take(uint64_t *NewMemory) {
143 bool isZero()
const {
return getValue().isZero(); }
144 bool isNonZero()
const {
return getValue().isNonZero(); }
145 bool isMin()
const {
return getValue().isSmallest(); }
146 bool isMinusOne()
const {
return getValue().isExactlyValue(-1.0); }
147 bool isNan()
const {
return getValue().isNaN(); }
149 bool isInf()
const {
return getValue().isInfinity(); }
150 bool isFinite()
const {
return getValue().isFinite(); }
151 bool isNormal()
const {
return getValue().isNormal(); }
153 llvm::FPClassTest
classify()
const {
return getValue().classify(); }
154 APFloat::fltCategory
getCategory()
const {
return getValue().getCategory(); }
157 llvm::APFloatBase::cmpResult CmpRes = getValue().compare(RHS.getValue());
159 case llvm::APFloatBase::cmpLessThan:
161 case llvm::APFloatBase::cmpEqual:
163 case llvm::APFloatBase::cmpGreaterThan:
165 case llvm::APFloatBase::cmpUnordered:
168 llvm_unreachable(
"Inavlid cmpResult value");
172 const llvm::fltSemantics &Sem,
173 llvm::RoundingMode RM,
176 APFloat::opStatus Status = F.convertFromAPInt(
Val,
Val.isSigned(), RM);
182 const llvm::fltSemantics &Sem,
184 size_t Size = APFloat::semanticsSizeInBits(Sem);
185 llvm::APInt API(Size,
true);
186 llvm::LoadIntFromMemory(API, (
const uint8_t *)Buff, Size / 8);
191 llvm::APInt API = getValue().bitcastToAPInt();
192 llvm::StoreIntToMemory(API, (uint8_t *)Buff,
bitWidth() / 8);
197 return sizeof(Semantics) + (
numWords() *
sizeof(uint64_t));
201 std::memcpy(Buff, &Semantics,
sizeof(Semantics));
203 std::memcpy(Buff +
sizeof(Semantics), &
Val,
sizeof(uint64_t));
205 std::memcpy(Buff +
sizeof(Semantics),
Memory,
210 static llvm::APFloatBase::Semantics
212 return *
reinterpret_cast<const llvm::APFloatBase::Semantics *
>(Buff);
216 llvm::APFloatBase::Semantics Semantics;
217 std::memcpy(&Semantics, Buff,
sizeof(Semantics));
219 unsigned BitWidth = llvm::APFloat::semanticsSizeInBits(
220 llvm::APFloatBase::EnumToSemantics(Semantics));
221 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
223 Result->Semantics = Semantics;
225 std::memcpy(&
Result->Val, Buff +
sizeof(Semantics),
sizeof(uint64_t));
228 std::memcpy(
Result->Memory, Buff +
sizeof(Semantics),
229 NumWords *
sizeof(uint64_t));
236 llvm::RoundingMode RM,
Floating *R) {
240 auto Status = LHS.add(RHS, RM);
250 auto Status = LHS.add(One, RM);
256 llvm::RoundingMode RM,
Floating *R) {
260 auto Status = LHS.subtract(RHS, RM);
270 auto Status = LHS.subtract(One, RM);
276 llvm::RoundingMode RM,
Floating *R) {
281 auto Status = LHS.multiply(RHS, RM);
287 llvm::RoundingMode RM,
Floating *R) {
291 auto Status = LHS.divide(RHS, RM);
297 R->
copy(-A.getValue());
302llvm::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 ...
If a Floating is constructed from Memory, it DOES NOT OWN THAT MEMORY.
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.