libFirm
|
This module specifies the modes that type the firm nodes. More...
Typedefs | |
typedef struct ir_mode | ir_mode |
SSA Value mode. More... | |
Enumerations | |
enum | ir_mode_arithmetic { irma_none = 1, irma_twos_complement = 2, irma_ieee754 = 256, irma_x86_extended_float, irma_last = irma_x86_extended_float } |
These values represent the different arithmetic operations possible with a mode. More... | |
enum | float_int_conversion_overflow_style_t { ir_overflow_indefinite, ir_overflow_min_max } |
Specifies what happens when a float value is converted to an integer and overflow happens. More... | |
Functions | |
ir_mode * | new_int_mode (const char *name, unsigned bit_size, int sign, unsigned modulo_shift) |
Creates a new mode. More... | |
ir_mode * | new_reference_mode (const char *name, unsigned bit_size, unsigned modulo_shift) |
Create a new reference mode. More... | |
ir_mode * | new_float_mode (const char *name, ir_mode_arithmetic arithmetic, unsigned exponent_size, unsigned mantissa_size, float_int_conversion_overflow_style_t int_conv_overflow) |
Create a new ieee754 float mode. More... | |
ir_mode * | new_non_arithmetic_mode (const char *name, unsigned bit_size) |
Creates a new mode for data values which are not used to perform arithmetic. More... | |
ident * | get_mode_ident (const ir_mode *mode) |
Returns the ident* of the mode. More... | |
const char * | get_mode_name (const ir_mode *mode) |
Returns the null-terminated name of this mode. More... | |
unsigned | get_mode_size_bits (const ir_mode *mode) |
Returns the size of values of the mode in bits. More... | |
unsigned | get_mode_size_bytes (const ir_mode *mode) |
Returns the size of values of the mode in bytes. More... | |
ir_mode_arithmetic | get_mode_arithmetic (const ir_mode *mode) |
Returns the arithmetic of a mode. More... | |
unsigned int | get_mode_modulo_shift (const ir_mode *mode) |
Returns the modulo shift attribute. More... | |
ir_tarval * | get_mode_min (const ir_mode *mode) |
Returns the smallest representable value of a given mode. More... | |
ir_tarval * | get_mode_max (const ir_mode *mode) |
Returns the biggest representable value of a given mode. More... | |
ir_tarval * | get_mode_null (const ir_mode *mode) |
Returns the value Zero represented in this mode. More... | |
ir_tarval * | get_mode_one (const ir_mode *mode) |
Returns the value One, represented in this mode. More... | |
ir_tarval * | get_mode_all_one (const ir_mode *mode) |
Returns the value where all bits are One, represented in this mode. More... | |
ir_tarval * | get_mode_infinite (const ir_mode *mode) |
Returns a positive infinite value of a mode. More... | |
ir_mode * | get_modeF (void) |
Returns float mode. More... | |
ir_mode * | get_modeD (void) |
Returns double mode. More... | |
ir_mode * | get_modeBs (void) |
Returns byte signed mode. More... | |
ir_mode * | get_modeBu (void) |
Returns byte unsigned mode. More... | |
ir_mode * | get_modeHs (void) |
Returns halfword signed mode. More... | |
ir_mode * | get_modeHu (void) |
Returns halfword unsigned mode. More... | |
ir_mode * | get_modeIs (void) |
Returns integer signed mode. More... | |
ir_mode * | get_modeIu (void) |
Returns integer unsigned mode. More... | |
ir_mode * | get_modeLs (void) |
Returns long signed mode. More... | |
ir_mode * | get_modeLu (void) |
Returns long unsigned mode. More... | |
ir_mode * | get_modeP (void) |
Returns pointer mode. More... | |
ir_mode * | get_modeb (void) |
Returns internal boolean mode. More... | |
ir_mode * | get_modeX (void) |
Returns control-flow mode. More... | |
ir_mode * | get_modeBB (void) |
Returns Basic-Block mode. More... | |
ir_mode * | get_modeM (void) |
Returns memory mode. More... | |
ir_mode * | get_modeT (void) |
Returns tuple mode. More... | |
ir_mode * | get_modeANY (void) |
Returns ANY mode. More... | |
ir_mode * | get_modeBAD (void) |
Returns BAD mode. More... | |
void | set_modeP (ir_mode *p) |
Sets the machine specific pointer mode. More... | |
int | mode_is_signed (const ir_mode *mode) |
Returns 1 if mode is signed, 0 otherwise. More... | |
int | mode_is_float (const ir_mode *mode) |
Returns 1 if mode is for floating point numbers, 0 otherwise. More... | |
int | mode_is_int (const ir_mode *mode) |
Returns 1 if mode is for integer numbers, 0 otherwise. More... | |
int | mode_is_reference (const ir_mode *mode) |
Returns 1 if mode is for references/pointers, 0 otherwise. More... | |
int | mode_is_num (const ir_mode *mode) |
Returns 1 if mode is for numeric values, 0 otherwise. More... | |
int | mode_is_data (const ir_mode *mode) |
Returns 1 if mode is for data values, 0 otherwise. More... | |
int | smaller_mode (const ir_mode *sm, const ir_mode *lm) |
Returns true if a value of mode sm can be converted to mode lm without loss. More... | |
int | values_in_mode (const ir_mode *sm, const ir_mode *lm) |
Returns true if no information is lost when converting a value of mode sm into mode lm (and back to mode sm ). More... | |
ir_mode * | find_unsigned_mode (const ir_mode *mode) |
Returns a matching unsigned mode for a given integer signed mode. More... | |
ir_mode * | find_signed_mode (const ir_mode *mode) |
Returns a matching signed mode for a given integer unsigned mode. More... | |
ir_mode * | find_double_bits_int_mode (const ir_mode *mode) |
Returns an integer mode with 2*n bits for a given integer mode with n bits. More... | |
int | mode_has_signed_zero (const ir_mode *mode) |
Returns non-zero if the given mode has negative zeros, i.e. More... | |
int | mode_overflow_on_unary_Minus (const ir_mode *mode) |
Returns non-zero if the given mode might overflow on unary Minus. More... | |
int | mode_wrap_around (const ir_mode *mode) |
Returns non-zero if the mode has a reversed wrap-around logic, especially (a + x) - x == a. More... | |
ir_mode * | get_reference_offset_mode (const ir_mode *mode) |
Returns the integer equivalent mode for an reference mode. More... | |
void | set_reference_offset_mode (ir_mode *ref_mode, ir_mode *int_mode) |
Sets the (signed) integer equivalent mode for an reference mode. More... | |
unsigned | get_mode_mantissa_size (const ir_mode *mode) |
Returns size of bits used for to encode the mantissa (for float modes). More... | |
unsigned | get_mode_exponent_size (const ir_mode *mode) |
Returns size of exponent in bits (for float modes) More... | |
float_int_conversion_overflow_style_t | get_mode_float_int_overflow (const ir_mode *mode) |
Returns semantic on float to integer conversion overflow. More... | |
int | is_reinterpret_cast (const ir_mode *src, const ir_mode *dst) |
Returns non-zero if the cast from mode src to mode dst is a reinterpret cast (i.e. More... | |
ir_type * | get_type_for_mode (const ir_mode *mode) |
Returns the primitive type matching the given mode. More... | |
size_t | ir_get_n_modes (void) |
Returns number of known modes. More... | |
ir_mode * | ir_get_mode (size_t num) |
Returns known mode number num . More... | |
Variables | |
ir_mode * | mode_M |
memory More... | |
ir_mode * | mode_F |
ieee754 binary32 float (single precision) More... | |
ir_mode * | mode_D |
ieee754 binary64 float (double precision) More... | |
ir_mode * | mode_Bs |
int8 More... | |
ir_mode * | mode_Bu |
uint8 More... | |
ir_mode * | mode_Hs |
int16 More... | |
ir_mode * | mode_Hu |
uint16 More... | |
ir_mode * | mode_Is |
int32 More... | |
ir_mode * | mode_Iu |
uint32 More... | |
ir_mode * | mode_Ls |
int64 More... | |
ir_mode * | mode_Lu |
uint64 More... | |
ir_mode * | mode_P |
pointer More... | |
ir_mode * | mode_b |
This mode represents (parts of) the processor status flag queried in conditional jumps or predicated code. More... | |
ir_mode * | mode_X |
execution More... | |
ir_mode * | mode_BB |
block More... | |
ir_mode * | mode_T |
tuple (none) More... | |
ir_mode * | mode_ANY |
undefined mode More... | |
ir_mode * | mode_BAD |
bad mode More... | |
This module specifies the modes that type the firm nodes.
It defines a data structure that describes a mode and implements constructors and access routines to this data structure. Further it defines a set of predefined modes.
SEE ALSO: UKA tech report 1999-44 for more information about modes.
SSA Value mode.
Definition at line 59 of file firm_types.h.
Specifies what happens when a float value is converted to an integer and overflow happens.
enum ir_mode_arithmetic |
These values represent the different arithmetic operations possible with a mode.
Returns an integer mode with 2*n bits for a given integer mode with n bits.
Returns NULL if no matching mode exists.
Returns a matching signed mode for a given integer unsigned mode.
Returns NULL if no matching mode exists.
Returns a matching unsigned mode for a given integer signed mode.
Returns NULL if no matching mode exists.
Returns the value where all bits are One, represented in this mode.
All One is defined only for modes integer, reference and boolean modes This represents the value -1 for signed modes with irma_twos_complement.
ir_mode_arithmetic get_mode_arithmetic | ( | const ir_mode * | mode | ) |
Returns the arithmetic of a mode.
unsigned get_mode_exponent_size | ( | const ir_mode * | mode | ) |
Returns size of exponent in bits (for float modes)
float_int_conversion_overflow_style_t get_mode_float_int_overflow | ( | const ir_mode * | mode | ) |
Returns semantic on float to integer conversion overflow.
Returns a positive infinite value of a mode.
This is only valid for float_numbers, other modes will result in tarval_bad. There are typically multiple possible representations of infinity, don't compare with this value but use tarval_is_plus_inf() instead.
unsigned get_mode_mantissa_size | ( | const ir_mode * | mode | ) |
Returns size of bits used for to encode the mantissa (for float modes).
This includes the leading one for modes with irma_x86_extended_float.
Returns the biggest representable value of a given mode.
For modes of the sort float_number this is the largest value lower than infinite.
Returns the smallest representable value of a given mode.
For modes of the sort float_number this is the most negative value bigger than -infinite.
unsigned int get_mode_modulo_shift | ( | const ir_mode * | mode | ) |
Returns the modulo shift attribute.
Attribute modulo shift specifies for modes of kind irms_int_number whether shift applies modulo to value of bits to shift. Zero for modes that are not integer.
const char* get_mode_name | ( | const ir_mode * | mode | ) |
Returns the null-terminated name of this mode.
Returns the value Zero represented in this mode.
Zero is the additive neutral element and as such is defined only for modes allowing addition, i.e. op_pin_state_floats and ints, and references (NULL-Pointer) else returns tarval_bad.
Returns the value One, represented in this mode.
One, being the multiplicative neutral element, is defined only for modes allowing multiplication, i.e. ints and floats.
unsigned get_mode_size_bits | ( | const ir_mode * | mode | ) |
Returns the size of values of the mode in bits.
unsigned get_mode_size_bytes | ( | const ir_mode * | mode | ) |
Returns the size of values of the mode in bytes.
If the size is not dividable by 8 returns -1.
ir_mode* get_modeANY | ( | void | ) |
Returns ANY mode.
undefined mode
ir_mode* get_modeb | ( | void | ) |
Returns internal boolean mode.
This mode represents (parts of) the processor status flag queried in conditional jumps or predicated code. Do not confuse this with boolean variables found in some languages. mode_b values are used as the inputs to conditional jumps or Mux nodes. As is the case with most hardware flags registers you cannot simply load/store them to memory or convert them to integer/float values with a single operation. You have to use an if-like construct to produce integer numbers based on a mode_b value.
ir_mode* get_modeBAD | ( | void | ) |
Returns BAD mode.
bad mode
ir_mode* get_modeBB | ( | void | ) |
Returns Basic-Block mode.
block
ir_mode* get_modeBs | ( | void | ) |
Returns byte signed mode.
int8
ir_mode* get_modeBu | ( | void | ) |
Returns byte unsigned mode.
uint8
ir_mode* get_modeD | ( | void | ) |
Returns double mode.
ieee754 binary64 float (double precision)
ir_mode* get_modeF | ( | void | ) |
Returns float mode.
ieee754 binary32 float (single precision)
ir_mode* get_modeHs | ( | void | ) |
Returns halfword signed mode.
int16
ir_mode* get_modeHu | ( | void | ) |
Returns halfword unsigned mode.
uint16
ir_mode* get_modeIs | ( | void | ) |
Returns integer signed mode.
int32
ir_mode* get_modeIu | ( | void | ) |
Returns integer unsigned mode.
uint32
ir_mode* get_modeLs | ( | void | ) |
Returns long signed mode.
int64
ir_mode* get_modeLu | ( | void | ) |
Returns long unsigned mode.
uint64
ir_mode* get_modeM | ( | void | ) |
Returns memory mode.
memory
ir_mode* get_modeP | ( | void | ) |
Returns pointer mode.
pointer
ir_mode* get_modeT | ( | void | ) |
Returns tuple mode.
tuple (none)
ir_mode* get_modeX | ( | void | ) |
Returns control-flow mode.
execution
Returns the integer equivalent mode for an reference mode.
This is typically used to add/subtract offsets from reference values.
Referenced by new_rd_Sub().
Returns the primitive type matching the given mode.
ir_mode* ir_get_mode | ( | size_t | num | ) |
Returns known mode number num
.
size_t ir_get_n_modes | ( | void | ) |
Returns number of known modes.
Returns non-zero if the cast from mode src to mode dst is a reinterpret cast (i.e.
only the bit pattern is reinterpreted, no conversion is done)
int mode_has_signed_zero | ( | const ir_mode * | mode | ) |
Returns non-zero if the given mode has negative zeros, i.e.
+0 and -0 exist. Note that for comparisons +0 and -0 are considered equal, the sign only shows in expressions like 1/x which results in +inf/-inf.
int mode_is_data | ( | const ir_mode * | mode | ) |
Returns 1 if mode
is for data values, 0 otherwise.
A data value is made from a fixed size of bits, you can build a tarval for such values.
int mode_is_float | ( | const ir_mode * | mode | ) |
Returns 1 if mode
is for floating point numbers, 0 otherwise.
int mode_is_int | ( | const ir_mode * | mode | ) |
Returns 1 if mode
is for integer numbers, 0 otherwise.
int mode_is_num | ( | const ir_mode * | mode | ) |
Returns 1 if mode
is for numeric values, 0 otherwise.
A numeric mode supports the Add, Sub, Mul, Div and Minus operations.
int mode_is_reference | ( | const ir_mode * | mode | ) |
Returns 1 if mode
is for references/pointers, 0 otherwise.
Referenced by new_rd_Add(), and new_rd_Sub().
int mode_is_signed | ( | const ir_mode * | mode | ) |
Returns 1 if mode
is signed, 0 otherwise.
int mode_overflow_on_unary_Minus | ( | const ir_mode * | mode | ) |
Returns non-zero if the given mode might overflow on unary Minus.
int mode_wrap_around | ( | const ir_mode * | mode | ) |
Returns non-zero if the mode has a reversed wrap-around logic, especially (a + x) - x == a.
This is normally true for integer modes, not for floating point modes.
ir_mode* new_float_mode | ( | const char * | name, |
ir_mode_arithmetic | arithmetic, | ||
unsigned | exponent_size, | ||
unsigned | mantissa_size, | ||
float_int_conversion_overflow_style_t | int_conv_overflow | ||
) |
Create a new ieee754 float mode.
float-modes are always signed and have no modulo shift.
name | the name of the mode to be created |
arithmetic | arithmetic/representation of the mode |
exponent_size | size of exponent in bits |
mantissa_size | size of mantissa in bits (including explicit one in irma_x86_extended_float) |
int_conv_overflow | Semantic on float to integer conversion overflow. |
ir_mode* new_int_mode | ( | const char * | name, |
unsigned | bit_size, | ||
int | sign, | ||
unsigned | modulo_shift | ||
) |
Creates a new mode.
name | the name of the mode to be created |
bit_size | number of bits this mode allocate |
sign | non-zero if this is a signed mode |
modulo_shift | Is ignored for modes other than integer. |
This function constructs a new mode given by the parameters. If the parameters match an already defined mode, this mode is returned (including the default modes). Arithmetic of int modes is irma_twos_complement.
ir_mode* new_non_arithmetic_mode | ( | const char * | name, |
unsigned | bit_size | ||
) |
Creates a new mode for data values which are not used to perform arithmetic.
Arithmetic will be set to irma_none.
ir_mode* new_reference_mode | ( | const char * | name, |
unsigned | bit_size, | ||
unsigned | modulo_shift | ||
) |
Create a new reference mode.
Reference modes are always unsigned. Arithmetic of reference modes is irma_twos_complement.
void set_modeP | ( | ir_mode * | p | ) |
Sets the machine specific pointer mode.
Sets the (signed) integer equivalent mode for an reference mode.
Returns true if a value of mode sm
can be converted to mode lm
without loss.
That is the interpretation of the numbers does not changes, so a signed integer mode is never smaller than an unsigned integer mode since the unsigned mode can't represent negative numbers in a way that they are interpreted as negative numbers.
Returns true if no information is lost when converting a value of mode sm
into mode lm
(and back to mode sm
).
So the interpretation of the values may change in the intermediate mode lm
(for example when converting negative signed integer numbers into unsigned integers) but after a conversion back they are exactly the same value.
ir_mode* mode_b |
This mode represents (parts of) the processor status flag queried in conditional jumps or predicated code.
Do not confuse this with boolean variables found in some languages. mode_b values are used as the inputs to conditional jumps or Mux nodes. As is the case with most hardware flags registers you cannot simply load/store them to memory or convert them to integer/float values with a single operation. You have to use an if-like construct to produce integer numbers based on a mode_b value.
Definition at line 215 of file irmode.h.
Referenced by new_rd_Cmp().
ir_mode* mode_BB |
ir_mode* mode_M |
memory
Definition at line 190 of file irmode.h.
Referenced by new_rd_CopyB(), new_rd_Free(), new_rd_NoMem(), and new_rd_Sync().
ir_mode* mode_P |
pointer
Definition at line 202 of file irmode.h.
Referenced by new_rd_Address(), new_rd_Member(), and new_rd_Sel().
ir_mode* mode_T |
tuple (none)
Definition at line 220 of file irmode.h.
Referenced by new_rd_Alloc(), new_rd_Builtin(), new_rd_Call(), new_rd_Cond(), new_rd_Div(), new_rd_Load(), new_rd_Mod(), new_rd_Raise(), new_rd_Start(), new_rd_Store(), new_rd_Switch(), and new_rd_Tuple().
ir_mode* mode_X |
execution
Definition at line 217 of file irmode.h.
Referenced by new_rd_End(), new_rd_IJmp(), new_rd_Jmp(), and new_rd_Return().