decompiler
1.0.0
|
Encoding information for a single floating-point format. More...
#include <float.hh>
Public Types | |
enum | floatclass { normalized = 0, infinity = 1, zero = 2, nan = 3, denormalized = 4 } |
The various classes of floating-point encodings. More... | |
Public Member Functions | |
FloatFormat (void) | |
Construct for use with restoreXml() | |
FloatFormat (int4 sz) | |
Construct default IEEE 754 standard settings. More... | |
int4 | getSize (void) const |
Get the size of the encoding in bytes. | |
double | getHostFloat (uintb encoding, floatclass *type) const |
Convert an encoding into host's double. More... | |
uintb | getEncoding (double host) const |
Convert host's double into this encoding. More... | |
int4 | getDecimalPrecision (void) const |
Get number of digits of precision. | |
uintb | convertEncoding (uintb encoding, const FloatFormat *formin) const |
Convert between two different formats. More... | |
uintb | extractFractionalCode (uintb x) const |
Extract the fractional part of the encoding. More... | |
bool | extractSign (uintb x) const |
Extract the sign bit from the encoding. More... | |
int4 | extractExponentCode (uintb x) const |
Extract the exponent from the encoding. More... | |
uintb | opEqual (uintb a, uintb b) const |
Equality comparison (==) More... | |
uintb | opNotEqual (uintb a, uintb b) const |
Inequality comparison (!=) More... | |
uintb | opLess (uintb a, uintb b) const |
Less-than comparison (<) More... | |
uintb | opLessEqual (uintb a, uintb b) const |
Less-than-or-equal comparison (<=) More... | |
uintb | opNan (uintb a) const |
Test if Not-a-Number (NaN) More... | |
uintb | opAdd (uintb a, uintb b) const |
Addition (+) More... | |
uintb | opDiv (uintb a, uintb b) const |
Division (/) More... | |
uintb | opMult (uintb a, uintb b) const |
Multiplication (*) More... | |
uintb | opSub (uintb a, uintb b) const |
Subtraction (-) More... | |
uintb | opNeg (uintb a) const |
Unary negate. More... | |
uintb | opAbs (uintb a) const |
Absolute value (abs) More... | |
uintb | opSqrt (uintb a) const |
Square root (sqrt) More... | |
uintb | opTrunc (uintb a, int4 sizeout) const |
Convert floating-point to integer. More... | |
uintb | opCeil (uintb a) const |
Ceiling (ceil) More... | |
uintb | opFloor (uintb a) const |
Floor (floor) More... | |
uintb | opRound (uintb a) const |
Round. More... | |
uintb | opInt2Float (uintb a, int4 sizein) const |
Convert integer to floating-point. More... | |
uintb | opFloat2Float (uintb a, const FloatFormat &outformat) const |
Convert between floating-point precisions. More... | |
void | saveXml (ostream &s) const |
Save the format to an XML stream. More... | |
void | restoreXml (const Element *el) |
Restore the format from XML. More... | |
Private Member Functions | |
uintb | setFractionalCode (uintb x, uintb code) const |
Set the fractional part of an encoded value. More... | |
uintb | setSign (uintb x, bool sign) const |
Set the sign bit of an encoded value. More... | |
uintb | setExponentCode (uintb x, uintb code) const |
Set the exponent of an encoded value. More... | |
uintb | getZeroEncoding (bool sgn) const |
Get an encoded zero value. More... | |
uintb | getInfinityEncoding (bool sgn) const |
Get an encoded infinite value. More... | |
uintb | getNaNEncoding (bool sgn) const |
Get an encoded NaN value. More... | |
void | calcPrecision (void) |
Calculate the decimal precision of this format. | |
Static Private Member Functions | |
static double | createFloat (bool sign, uintb signif, int4 exp) |
Create a double given sign, fractional, and exponent. More... | |
static floatclass | extractExpSig (double x, bool *sgn, uintb *signif, int4 *exp) |
Extract the sign, fractional, and exponent from a given floating-point value. More... | |
static bool | roundToNearestEven (uintb &signif, int4 lowbitpos) |
Round a floating point value to the nearest even. More... | |
Private Attributes | |
int4 | size |
Size of float in bytes (this format) | |
int4 | signbit_pos |
Bit position of sign bit. | |
int4 | frac_pos |
(lowest) bit position of fractional part | |
int4 | frac_size |
Number of bits in fractional part. | |
int4 | exp_pos |
(lowest) bit position of exponent | |
int4 | exp_size |
Number of bits in exponent. | |
int4 | bias |
What to add to real exponent to get encoding. | |
int4 | maxexponent |
Maximum possible exponent. | |
int4 | decimal_precision |
Number of decimal digits of precision. | |
bool | jbitimplied |
Set to true if integer bit of 1 is assumed. | |
Encoding information for a single floating-point format.
This class supports manipulation of a single floating-point encoding. An encoding can be converted to and from the host format and convenience methods allow p-code floating-point operations to be performed on natively encoded operands. This follows the IEEE754 standards.
ghidra::FloatFormat::FloatFormat | ( | int4 | sz | ) |
Construct default IEEE 754 standard settings.
Set format for a given encoding size according to IEEE 754 standards
sz | is the size of the encoding in bytes |
References bias, calcPrecision(), exp_pos, exp_size, frac_pos, frac_size, jbitimplied, maxexponent, signbit_pos, and size.
uintb ghidra::FloatFormat::convertEncoding | ( | uintb | encoding, |
const FloatFormat * | formin | ||
) | const |
Convert between two different formats.
encoding | is the value in the other FloatFormat |
formin | is the other FloatFormat |
References bias, extractExponentCode(), extractFractionalCode(), extractSign(), frac_size, getInfinityEncoding(), getNaNEncoding(), getZeroEncoding(), jbitimplied, maxexponent, roundToNearestEven(), setExponentCode(), setFractionalCode(), and setSign().
Referenced by getDecimalPrecision(), and opFloat2Float().
|
staticprivate |
Create a double given sign, fractional, and exponent.
sign | is set to true if the value should be negative |
signif | is the fractional part |
exp | is the exponent |
Referenced by getHostFloat().
int4 ghidra::FloatFormat::extractExponentCode | ( | uintb | x | ) | const |
Extract the exponent from the encoding.
x | is an encoded floating-point value |
References exp_pos, and exp_size.
Referenced by convertEncoding(), getDecimalPrecision(), getHostFloat(), and ghidra::ScoreUnionFields::scoreConstantFit().
|
staticprivate |
Extract the sign, fractional, and exponent from a given floating-point value.
x | is the given value |
sgn | passes back the sign |
signif | passes back the fractional part |
exp | passes back the exponent |
References infinity, nan, normalized, and zero.
Referenced by getEncoding().
uintb ghidra::FloatFormat::extractFractionalCode | ( | uintb | x | ) | const |
Extract the fractional part of the encoding.
x | is an encoded floating-point value |
References frac_pos, and frac_size.
Referenced by convertEncoding(), getDecimalPrecision(), and getHostFloat().
bool ghidra::FloatFormat::extractSign | ( | uintb | x | ) | const |
Extract the sign bit from the encoding.
x | is an encoded floating-point value |
References signbit_pos.
Referenced by convertEncoding(), getDecimalPrecision(), getHostFloat(), and ghidra::PrintC::push_float().
uintb ghidra::FloatFormat::getEncoding | ( | double | host | ) | const |
Convert host's double into this encoding.
host | is the double value to convert |
References bias, extractExpSig(), frac_size, getInfinityEncoding(), getNaNEncoding(), getZeroEncoding(), infinity, jbitimplied, maxexponent, nan, roundToNearestEven(), setExponentCode(), setFractionalCode(), setSign(), and zero.
Referenced by getSize(), opAbs(), opAdd(), opCeil(), opDiv(), opFloor(), opInt2Float(), opMult(), opNeg(), opRound(), opSqrt(), and opSub().
double ghidra::FloatFormat::getHostFloat | ( | uintb | encoding, |
floatclass * | type | ||
) | const |
Convert an encoding into host's double.
encoding | is the encoding value |
type | points to the floating-point class, which is passed back |
References bias, createFloat(), denormalized, extractExponentCode(), extractFractionalCode(), extractSign(), infinity, jbitimplied, maxexponent, nan, normalized, and zero.
Referenced by getSize(), opAbs(), opAdd(), opCeil(), opDiv(), opEqual(), opFloor(), opLess(), opLessEqual(), opMult(), opNan(), opNeg(), opNotEqual(), opRound(), opSqrt(), opSub(), opTrunc(), and ghidra::PrintC::push_float().
|
private |
Get an encoded infinite value.
sgn | is set to true for negative infinity, false for positive |
References maxexponent, setExponentCode(), setFractionalCode(), and setSign().
Referenced by convertEncoding(), and getEncoding().
|
private |
Get an encoded NaN value.
sgn | is set to true for negative NaN, false for positive |
References maxexponent, setExponentCode(), setFractionalCode(), and setSign().
Referenced by convertEncoding(), and getEncoding().
|
private |
Get an encoded zero value.
sgn | is set to true for negative zero, false for positive |
References setExponentCode(), setFractionalCode(), and setSign().
Referenced by convertEncoding(), and getEncoding().
uintb ghidra::FloatFormat::opAbs | ( | uintb | a | ) | const |
Absolute value (abs)
a | is an encoded floating-point value |
References getEncoding(), and getHostFloat().
Referenced by ghidra::OpBehaviorFloatAbs::evaluateUnary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opAdd | ( | uintb | a, |
uintb | b | ||
) | const |
Addition (+)
a | is the first floating-point value |
b | is the second floating-point value |
References getEncoding(), and getHostFloat().
Referenced by ghidra::OpBehaviorFloatAdd::evaluateBinary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opCeil | ( | uintb | a | ) | const |
Ceiling (ceil)
a | is an encoded floating-point value |
References getEncoding(), and getHostFloat().
Referenced by ghidra::OpBehaviorFloatCeil::evaluateUnary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opDiv | ( | uintb | a, |
uintb | b | ||
) | const |
Division (/)
a | is the first floating-point value |
b | is the second floating-point value |
References getEncoding(), and getHostFloat().
Referenced by ghidra::OpBehaviorFloatDiv::evaluateBinary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opEqual | ( | uintb | a, |
uintb | b | ||
) | const |
Equality comparison (==)
a | is the first floating-point value |
b | is the second floating-point value |
References getHostFloat().
Referenced by ghidra::OpBehaviorFloatEqual::evaluateBinary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opFloat2Float | ( | uintb | a, |
const FloatFormat & | outformat | ||
) | const |
Convert between floating-point precisions.
a | is an encoded floating-point value |
outformat | is the desired output FloatFormat |
References convertEncoding().
Referenced by ghidra::OpBehaviorFloatFloat2Float::evaluateUnary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opFloor | ( | uintb | a | ) | const |
Floor (floor)
a | is an encoded floating-point value |
References getEncoding(), and getHostFloat().
Referenced by ghidra::OpBehaviorFloatFloor::evaluateUnary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opInt2Float | ( | uintb | a, |
int4 | sizein | ||
) | const |
Convert integer to floating-point.
a | is a signed integer value |
sizein | is the number of bytes in the integer encoding |
References getEncoding().
Referenced by ghidra::OpBehaviorFloatInt2Float::evaluateUnary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opLess | ( | uintb | a, |
uintb | b | ||
) | const |
Less-than comparison (<)
a | is the first floating-point value |
b | is the second floating-point value |
References getHostFloat().
Referenced by ghidra::OpBehaviorFloatLess::evaluateBinary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opLessEqual | ( | uintb | a, |
uintb | b | ||
) | const |
Less-than-or-equal comparison (<=)
a | is the first floating-point value |
b | is the second floating-point value |
References getHostFloat().
Referenced by ghidra::OpBehaviorFloatLessEqual::evaluateBinary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opMult | ( | uintb | a, |
uintb | b | ||
) | const |
Multiplication (*)
a | is the first floating-point value |
b | is the second floating-point value |
References getEncoding(), and getHostFloat().
Referenced by ghidra::OpBehaviorFloatMult::evaluateBinary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opNan | ( | uintb | a | ) | const |
Test if Not-a-Number (NaN)
a | is an encoded floating-point value |
References getHostFloat(), and nan.
Referenced by ghidra::OpBehaviorFloatNan::evaluateUnary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opNeg | ( | uintb | a | ) | const |
Unary negate.
a | is an encoded floating-point value |
References getEncoding(), and getHostFloat().
Referenced by ghidra::OpBehaviorFloatNeg::evaluateUnary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opNotEqual | ( | uintb | a, |
uintb | b | ||
) | const |
Inequality comparison (!=)
a | is the first floating-point value |
b | is the second floating-point value |
References getHostFloat().
Referenced by ghidra::OpBehaviorFloatNotEqual::evaluateBinary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opRound | ( | uintb | a | ) | const |
Round.
a | is an encoded floating-point value |
References getEncoding(), and getHostFloat().
Referenced by ghidra::OpBehaviorFloatRound::evaluateUnary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opSqrt | ( | uintb | a | ) | const |
Square root (sqrt)
a | is an encoded floating-point value |
References getEncoding(), and getHostFloat().
Referenced by ghidra::OpBehaviorFloatSqrt::evaluateUnary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opSub | ( | uintb | a, |
uintb | b | ||
) | const |
Subtraction (-)
a | is the first floating-point value |
b | is the second floating-point value |
References getEncoding(), and getHostFloat().
Referenced by ghidra::OpBehaviorFloatSub::evaluateBinary(), and getDecimalPrecision().
uintb ghidra::FloatFormat::opTrunc | ( | uintb | a, |
int4 | sizeout | ||
) | const |
Convert floating-point to integer.
a | is an encoded floating-point value |
sizeout | is the desired encoding size of the output |
References ghidra::calc_mask(), and getHostFloat().
Referenced by ghidra::OpBehaviorFloatTrunc::evaluateUnary(), and getDecimalPrecision().
void ghidra::FloatFormat::restoreXml | ( | const Element * | el | ) |
Restore the format from XML.
Restore object from a <floatformat> XML tag
el | is the element |
References bias, calcPrecision(), exp_pos, exp_size, frac_pos, frac_size, ghidra::Element::getAttributeValue(), jbitimplied, maxexponent, signbit_pos, size, and ghidra::xml_readbool().
Referenced by getDecimalPrecision().
|
staticprivate |
Round a floating point value to the nearest even.
signif | the significant bits of a floating point value |
lowbitpos | the position in signif of the floating point |
Referenced by convertEncoding(), and getEncoding().
void ghidra::FloatFormat::saveXml | ( | ostream & | s | ) | const |
Save the format to an XML stream.
Write the format out to a <floatformat> XML tag.
s | is the output stream |
References ghidra::a_v_b(), ghidra::a_v_i(), bias, exp_pos, exp_size, frac_pos, frac_size, jbitimplied, signbit_pos, and size.
Referenced by getDecimalPrecision().
|
private |
Set the exponent of an encoded value.
x | is an encoded value (with exponent set to zero) |
code | is the exponent to set |
References exp_pos.
Referenced by convertEncoding(), getEncoding(), getInfinityEncoding(), getNaNEncoding(), and getZeroEncoding().
|
private |
Set the fractional part of an encoded value.
x | is an encoded value (with fraction part set to zero) |
code | is the new fractional value to set |
References frac_pos, and frac_size.
Referenced by convertEncoding(), getEncoding(), getInfinityEncoding(), getNaNEncoding(), and getZeroEncoding().
|
private |
Set the sign bit of an encoded value.
x | is an encoded value (with sign set to zero) |
sign | is the sign bit to set |
References signbit_pos.
Referenced by convertEncoding(), getEncoding(), getInfinityEncoding(), getNaNEncoding(), and getZeroEncoding().