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... | |
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.
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 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(), getInfinityEncoding(), getZeroEncoding(), jbitimplied, maxexponent, setExponentCode(), setFractionalCode(), and setSign().
Referenced by getDecimalPrecision().
|
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 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(), and getHostFloat().
|
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 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 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 PrintC::push_float().
uintb FloatFormat::getEncoding | ( | double | host | ) | const |
Convert host's double into this encoding.
host | is the double value to convert |
References bias, extractExpSig(), getInfinityEncoding(), getNaNEncoding(), getZeroEncoding(), infinity, jbitimplied, maxexponent, nan, setExponentCode(), setFractionalCode(), setSign(), and zero.
Referenced by getSize(), opAbs(), opAdd(), opCeil(), opDiv(), opFloat2Float(), opFloor(), opInt2Float(), opMult(), opNeg(), opRound(), opSqrt(), and opSub().
double 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(), opFloat2Float(), opFloor(), opLess(), opLessEqual(), opMult(), opNan(), opNeg(), opNotEqual(), opRound(), opSqrt(), opSub(), opTrunc(), and 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 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 FloatFormat::opAbs | ( | uintb | a | ) | const |
Absolute value (abs)
a | is an encoded floating-point value |
References getEncoding(), and getHostFloat().
Referenced by OpBehaviorFloatAbs::evaluateUnary(), and getDecimalPrecision().
uintb 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 OpBehaviorFloatAdd::evaluateBinary(), and getDecimalPrecision().
uintb FloatFormat::opCeil | ( | uintb | a | ) | const |
Ceiling (ceil)
a | is an encoded floating-point value |
References getEncoding(), and getHostFloat().
Referenced by OpBehaviorFloatCeil::evaluateUnary(), and getDecimalPrecision().
uintb 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 OpBehaviorFloatDiv::evaluateBinary(), and getDecimalPrecision().
uintb 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 OpBehaviorFloatEqual::evaluateBinary(), and getDecimalPrecision().
uintb 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 getEncoding(), and getHostFloat().
Referenced by OpBehaviorFloatFloat2Float::evaluateUnary(), and getDecimalPrecision().
uintb FloatFormat::opFloor | ( | uintb | a | ) | const |
Floor (floor)
a | is an encoded floating-point value |
References getEncoding(), and getHostFloat().
Referenced by OpBehaviorFloatFloor::evaluateUnary(), and getDecimalPrecision().
uintb 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(), and sign_extend().
Referenced by OpBehaviorFloatInt2Float::evaluateUnary(), and getDecimalPrecision().
uintb 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 OpBehaviorFloatLess::evaluateBinary(), and getDecimalPrecision().
uintb 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 OpBehaviorFloatLessEqual::evaluateBinary(), and getDecimalPrecision().
uintb 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 OpBehaviorFloatMult::evaluateBinary(), and getDecimalPrecision().
uintb FloatFormat::opNan | ( | uintb | a | ) | const |
Test if Not-a-Number (NaN)
a | is an encoded floating-point value |
References getHostFloat(), and nan.
Referenced by OpBehaviorFloatNan::evaluateUnary(), and getDecimalPrecision().
uintb FloatFormat::opNeg | ( | uintb | a | ) | const |
Unary negate.
a | is an encoded floating-point value |
References getEncoding(), and getHostFloat().
Referenced by OpBehaviorFloatNeg::evaluateUnary(), and getDecimalPrecision().
uintb 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 OpBehaviorFloatNotEqual::evaluateBinary(), and getDecimalPrecision().
uintb FloatFormat::opRound | ( | uintb | a | ) | const |
Round.
a | is an encoded floating-point value |
References getEncoding(), and getHostFloat().
Referenced by OpBehaviorFloatRound::evaluateUnary(), and getDecimalPrecision().
uintb FloatFormat::opSqrt | ( | uintb | a | ) | const |
Square root (sqrt)
a | is an encoded floating-point value |
References getEncoding(), and getHostFloat().
Referenced by OpBehaviorFloatSqrt::evaluateUnary(), and getDecimalPrecision().
uintb 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 OpBehaviorFloatSub::evaluateBinary(), and getDecimalPrecision().
uintb 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 calc_mask(), and getHostFloat().
Referenced by OpBehaviorFloatTrunc::evaluateUnary(), and getDecimalPrecision().
void 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, Element::getAttributeValue(), jbitimplied, maxexponent, signbit_pos, size, and xml_readbool().
Referenced by getDecimalPrecision().
void 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 a_v_b(), 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().