libFirm
Value Modes

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_modenew_int_mode (const char *name, unsigned bit_size, int sign, unsigned modulo_shift)
 Creates a new mode. More...
 
ir_modenew_reference_mode (const char *name, unsigned bit_size, unsigned modulo_shift)
 Create a new reference mode. More...
 
ir_modenew_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_modenew_non_arithmetic_mode (const char *name, unsigned bit_size)
 Creates a new mode for data values which are not used to perform arithmetic. More...
 
identget_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_tarvalget_mode_min (const ir_mode *mode)
 Returns the smallest representable value of a given mode. More...
 
ir_tarvalget_mode_max (const ir_mode *mode)
 Returns the biggest representable value of a given mode. More...
 
ir_tarvalget_mode_null (const ir_mode *mode)
 Returns the value Zero represented in this mode. More...
 
ir_tarvalget_mode_one (const ir_mode *mode)
 Returns the value One, represented in this mode. More...
 
ir_tarvalget_mode_all_one (const ir_mode *mode)
 Returns the value where all bits are One, represented in this mode. More...
 
ir_tarvalget_mode_infinite (const ir_mode *mode)
 Returns a positive infinite value of a mode. More...
 
ir_modeget_modeF (void)
 Returns float mode. More...
 
ir_modeget_modeD (void)
 Returns double mode. More...
 
ir_modeget_modeBs (void)
 Returns byte signed mode. More...
 
ir_modeget_modeBu (void)
 Returns byte unsigned mode. More...
 
ir_modeget_modeHs (void)
 Returns halfword signed mode. More...
 
ir_modeget_modeHu (void)
 Returns halfword unsigned mode. More...
 
ir_modeget_modeIs (void)
 Returns integer signed mode. More...
 
ir_modeget_modeIu (void)
 Returns integer unsigned mode. More...
 
ir_modeget_modeLs (void)
 Returns long signed mode. More...
 
ir_modeget_modeLu (void)
 Returns long unsigned mode. More...
 
ir_modeget_modeP (void)
 Returns pointer mode. More...
 
ir_modeget_modeb (void)
 Returns internal boolean mode. More...
 
ir_modeget_modeX (void)
 Returns control-flow mode. More...
 
ir_modeget_modeBB (void)
 Returns Basic-Block mode. More...
 
ir_modeget_modeM (void)
 Returns memory mode. More...
 
ir_modeget_modeT (void)
 Returns tuple mode. More...
 
ir_modeget_modeANY (void)
 Returns ANY mode. More...
 
ir_modeget_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_modefind_unsigned_mode (const ir_mode *mode)
 Returns a matching unsigned mode for a given integer signed mode. More...
 
ir_modefind_signed_mode (const ir_mode *mode)
 Returns a matching signed mode for a given integer unsigned mode. More...
 
ir_modefind_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_modeget_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_typeget_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_modeir_get_mode (size_t num)
 Returns known mode number num. More...
 

Variables

ir_modemode_M
 memory More...
 
ir_modemode_F
 ieee754 binary32 float (single precision) More...
 
ir_modemode_D
 ieee754 binary64 float (double precision) More...
 
ir_modemode_Bs
 int8 More...
 
ir_modemode_Bu
 uint8 More...
 
ir_modemode_Hs
 int16 More...
 
ir_modemode_Hu
 uint16 More...
 
ir_modemode_Is
 int32 More...
 
ir_modemode_Iu
 uint32 More...
 
ir_modemode_Ls
 int64 More...
 
ir_modemode_Lu
 uint64 More...
 
ir_modemode_P
 pointer More...
 
ir_modemode_b
 This mode represents (parts of) the processor status flag queried in conditional jumps or predicated code. More...
 
ir_modemode_X
 execution More...
 
ir_modemode_BB
 block More...
 
ir_modemode_T
 tuple (none) More...
 
ir_modemode_ANY
 undefined mode More...
 
ir_modemode_BAD
 bad mode More...
 

Detailed Description

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.

Typedef Documentation

typedef struct ir_mode ir_mode

SSA Value mode.

Definition at line 59 of file firm_types.h.

Enumeration Type Documentation

Specifies what happens when a float value is converted to an integer and overflow happens.

Enumerator
ir_overflow_indefinite 

the integer indefinite value (=INT_MIN) is returned.

(e.g. x86 does this)

ir_overflow_min_max 

INT_MIN/INT_MAX is returned depending on the sign of the floatingpoint number.

(e.g. sparc does this).

Definition at line 53 of file irmode.h.

These values represent the different arithmetic operations possible with a mode.

Enumerator
irma_none 

For modes for which no representation is specified.

irma_twos_complement 

Values of the mode are represented as two's complement.

Only legal for modes of sort int_number and reference.

irma_ieee754 

Values of the mode are represented according to ieee754 floating point standard.

Only legal for modes of sort float_number.

irma_x86_extended_float 

x86 extended floating point values

irma_last 

Definition at line 36 of file irmode.h.

Function Documentation

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.

Returns NULL if no matching mode exists.

ir_mode* find_signed_mode ( const ir_mode mode)

Returns a matching signed mode for a given integer unsigned mode.

Returns NULL if no matching mode exists.

ir_mode* find_unsigned_mode ( const ir_mode mode)

Returns a matching unsigned mode for a given integer signed mode.

Returns NULL if no matching mode exists.

ir_tarval* get_mode_all_one ( const ir_mode mode)

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.

ident* get_mode_ident ( const ir_mode mode)

Returns the ident* of the mode.

ir_tarval* get_mode_infinite ( const ir_mode mode)

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.

ir_tarval* get_mode_max ( const ir_mode mode)

Returns the biggest representable value of a given mode.

For modes of the sort float_number this is the largest value lower than infinite.

ir_tarval* get_mode_min ( const ir_mode mode)

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.

ir_tarval* get_mode_null ( const ir_mode 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.

ir_tarval* get_mode_one ( const ir_mode mode)

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

ir_mode* get_reference_offset_mode ( const ir_mode mode)

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().

ir_type* get_type_for_mode ( const ir_mode mode)

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.

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.

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.

Parameters
namethe name of the mode to be created
arithmeticarithmetic/representation of the mode
exponent_sizesize of exponent in bits
mantissa_sizesize of mantissa in bits (including explicit one in irma_x86_extended_float)
int_conv_overflowSemantic 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.

Parameters
namethe name of the mode to be created
bit_sizenumber of bits this mode allocate
signnon-zero if this is a signed mode
modulo_shiftIs 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.

Returns
The new mode or NULL on error.
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.

void set_reference_offset_mode ( ir_mode ref_mode,
ir_mode int_mode 
)

Sets the (signed) integer equivalent mode for an reference mode.

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.

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.

See also
values_in_mode()
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).

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.

See also
smaller_mode()

Variable Documentation

ir_mode* mode_ANY

undefined mode

Definition at line 221 of file irmode.h.

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_BAD

bad mode

Definition at line 222 of file irmode.h.

ir_mode* mode_BB

block

Definition at line 218 of file irmode.h.

Referenced by new_rd_Block().

ir_mode* mode_Bs

int8

Definition at line 194 of file irmode.h.

ir_mode* mode_Bu

uint8

Definition at line 195 of file irmode.h.

ir_mode* mode_D

ieee754 binary64 float (double precision)

Definition at line 193 of file irmode.h.

ir_mode* mode_F

ieee754 binary32 float (single precision)

Definition at line 192 of file irmode.h.

ir_mode* mode_Hs

int16

Definition at line 196 of file irmode.h.

ir_mode* mode_Hu

uint16

Definition at line 197 of file irmode.h.

ir_mode* mode_Is

int32

Definition at line 198 of file irmode.h.

ir_mode* mode_Iu

uint32

Definition at line 199 of file irmode.h.

ir_mode* mode_Ls

int64

Definition at line 200 of file irmode.h.

ir_mode* mode_Lu

uint64

Definition at line 201 of file irmode.h.

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_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().