libFirm
Value Modes

This module specifies the modes that type the firm nodes. More...

Typedefs

typedef struct ir_mode ir_mode
 SSA Value mode.

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

Functions

ir_modenew_int_mode (const char *name, ir_mode_arithmetic arithmetic, unsigned bit_size, int sign, unsigned modulo_shift)
 Creates a new mode.
ir_modenew_reference_mode (const char *name, ir_mode_arithmetic arithmetic, unsigned bit_size, unsigned modulo_shift)
 Create a new reference mode.
ir_modenew_float_mode (const char *name, ir_mode_arithmetic arithmetic, unsigned exponent_size, unsigned mantissa_size)
 Create a new ieee754 float mode.
int is_mode (const void *thing)
 Checks whether a pointer points to a mode.
identget_mode_ident (const ir_mode *mode)
 Returns the ident* of the mode.
const char * get_mode_name (const ir_mode *mode)
 Returns the null-terminated name of this mode.
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.
int get_mode_sign (const ir_mode *mode)
 Returns the signess of a mode.
ir_mode_arithmetic get_mode_arithmetic (const ir_mode *mode)
 Returns the arithmetic of a mode.
unsigned int get_mode_modulo_shift (const ir_mode *mode)
 Returns the modulo shift attribute.
void * get_mode_link (const ir_mode *mode)
 Returns the stored intermediate information.
void set_mode_link (ir_mode *mode, void *l)
 Stores new intermediate information.
ir_tarvalget_mode_min (ir_mode *mode)
 Returns the smallest representable value of a given mode.
ir_tarvalget_mode_max (ir_mode *mode)
 Returns the biggest representable value o f a given mode.
ir_tarvalget_mode_null (ir_mode *mode)
 Returns the value Zero represented in this mode.
ir_tarvalget_mode_one (ir_mode *mode)
 Returns the value One, represented in this mode.
ir_tarvalget_mode_minus_one (ir_mode *mode)
 Returns the value Minus One, represented in this mode.
ir_tarvalget_mode_all_one (ir_mode *mode)
 Returns the value where all bits are One, represented in this mode.
ir_tarvalget_mode_infinite (ir_mode *mode)
 Returns the positive infinite value of a mode.
ir_tarvalget_mode_NAN (ir_mode *mode)
 Returns the NAN value of a given mode.
ir_modeget_modeF (void)
 Returns float mode.
ir_modeget_modeD (void)
 Returns double mode.
ir_modeget_modeQ (void)
 Returns quadruple prevision mode.
ir_modeget_modeBs (void)
 Returns byte signed mode.
ir_modeget_modeBu (void)
 Returns byte unsigned mode.
ir_modeget_modeHs (void)
 Returns halfword signed mode.
ir_modeget_modeHu (void)
 Returns halfword unsigned mode.
ir_modeget_modeIs (void)
 Returns integer signed mode.
ir_modeget_modeIu (void)
 Returns integer unsigned mode.
ir_modeget_modeLs (void)
 Returns long signed mode.
ir_modeget_modeLu (void)
 Returns long unsigned mode.
ir_modeget_modeLLs (void)
 Returns long long signed mode.
ir_modeget_modeLLu (void)
 Returns long long unsigned mode.
ir_modeget_modeP (void)
 Returns pointer mode.
ir_modeget_modeb (void)
 Returns internal boolean mode.
ir_modeget_modeX (void)
 Returns control-flow mode.
ir_modeget_modeBB (void)
 Returns Basic-Block mode.
ir_modeget_modeM (void)
 Returns memory mode.
ir_modeget_modeT (void)
 Returns tuple mode.
ir_modeget_modeANY (void)
 Returns ANY mode.
ir_modeget_modeBAD (void)
 Returns BAD mode.
ir_modeget_modeP_code (void)
 Returns the machine specific pointer mode for code addresses.
ir_modeget_modeP_data (void)
 Returns the machine specific pointer mode for data addresses.
void set_modeP_code (ir_mode *p)
 Sets the machine specific pointer mode for code addresses.
void set_modeP_data (ir_mode *p)
 Sets the machine specific pointer mode for data addresses.
int mode_is_signed (const ir_mode *mode)
 Returns 1 if mode is signed, 0 otherwise.
int mode_is_float (const ir_mode *mode)
 Returns 1 if mode is for floatingpoint numbers, 0 otherwise.
int mode_is_int (const ir_mode *mode)
 Returns 1 if mode is for integer numbers, 0 otherwise.
int mode_is_reference (const ir_mode *mode)
 Returns 1 if mode is for references/pointers, 0 otherwise.
int mode_is_num (const ir_mode *mode)
 Returns 1 if mode is for numeric values, 0 otherwise.
int mode_is_data (const ir_mode *mode)
 Returns 1 if mode is for data values, 0 otherwise.
int mode_is_datab (const ir_mode *mode)
 Returns 1 if mode is for data values or internal booleans, 0 otherwise.
int mode_is_dataM (const ir_mode *mode)
 Returns 1 if mode is for data values or memory, 0 otherwise.
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.
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).
ir_modefind_unsigned_mode (const ir_mode *mode)
 Returns a matching unsigned mode for a given integer signed mode.
ir_modefind_signed_mode (const ir_mode *mode)
 Returns a matching signed mode for a given integer unsigned mode.
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.
int mode_honor_signed_zeros (const ir_mode *mode)
 Returns non-zero if the given mode honors signed zero's, i.e., a +0 and a -0 exists and handled differently.
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.
ir_modeget_reference_mode_signed_eq (ir_mode *mode)
 Returns the signed integer equivalent mode for an reference mode.
void set_reference_mode_signed_eq (ir_mode *ref_mode, ir_mode *int_mode)
 Sets the signed integer equivalent mode for an reference mode.
ir_modeget_reference_mode_unsigned_eq (ir_mode *mode)
 Returns the unsigned integer equivalent mode for an reference mode.
void set_reference_mode_unsigned_eq (ir_mode *ref_mode, ir_mode *int_mode)
 Sets the unsigned integer equivalent mode for an reference mode.
unsigned get_mode_mantissa_size (const ir_mode *mode)
 Returns size of mantissa in bits (for float modes).
unsigned get_mode_exponent_size (const ir_mode *mode)
 Returns size of exponent in bits (for float 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 (ie.
ir_typeget_type_for_mode (const ir_mode *mode)
 Returns the primitive type matching the given mode.
size_t ir_get_n_modes (void)
 Returns number of known modes.
ir_modeir_get_mode (size_t num)
 Returns known mode number num.

Variables

ir_modemode_M
 memory
ir_modemode_F
 ieee754 binary32 float (single precision)
ir_modemode_D
 ieee754 binary64 float (double precision)
ir_modemode_Q
 ieee754 binary128 float (quadruple precision)
ir_modemode_Bs
 int8
ir_modemode_Bu
 uint8
ir_modemode_Hs
 int16
ir_modemode_Hu
 uint16
ir_modemode_Is
 int32
ir_modemode_Iu
 uint32
ir_modemode_Ls
 int64
ir_modemode_Lu
 uint64
ir_modemode_LLs
 int128
ir_modemode_LLu
 uint128
ir_modemode_P
 pointer
ir_modemode_P_code
 A pointer mode that is set by the client of libfirm.
ir_modemode_P_data
 A pointer mode that is set by the client of libfirm.
ir_modemode_b
 internal boolean
ir_modemode_X
 execution
ir_modemode_BB
 block
ir_modemode_T
 tuple (none)
ir_modemode_ANY
 undefined mode
ir_modemode_BAD
 bad mode

Detailed Description

This module specifies the modes that type the firm nodes.

It defines a datasturcture that describes a mode and implements constructors and access routines to this datastructure. 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 69 of file firm_types.h.

Enumeration Type Documentation

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

Enumerator:
irma_none 

For modes for which no representation is specified.

These are modes of sort auxiliary, internal_boolean and character.

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 floatingpoint values

Definition at line 50 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 ( 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

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)

ident* get_mode_ident ( const ir_mode mode)

Returns the ident* of the mode.

ir_tarval* get_mode_infinite ( ir_mode mode)

Returns the positive infinite value of a mode.

This is only valid for float_numbers, other modes will result in tarval_bad.

void* get_mode_link ( const ir_mode mode)

Returns the stored intermediate information.

unsigned get_mode_mantissa_size ( const ir_mode mode)

Returns size of mantissa in bits (for float modes).

Note: This is the number of bits used after the leading one. So the actual accuracy of the significand is get_mode_mantissa_size()+1. The number of bits used in the encoding depends on wether the floatingpoint mode has an implicit (ieee754) or explicit (x86_extended) encoding of the leading one.

ir_tarval* get_mode_max ( ir_mode mode)

Returns the biggest representable value o f a given mode.

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

ir_tarval* get_mode_min ( 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.

ir_tarval* get_mode_minus_one ( ir_mode mode)

Returns the value Minus One, represented in this mode.

Minus One is defined only for modes allowing multiplication with signed values, i.e. signed ints and floats.

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_NAN ( ir_mode mode)

Returns the NAN value of a given mode.

This is only valid for float_numbers, other modes will result in tarval_bad.

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

int get_mode_sign ( const ir_mode mode)

Returns the signess of a mode.

Returns the signess of a mode: 1 if mode is signed.

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.

ir_mode* get_modeb ( void  )

Returns internal boolean mode.

ir_mode* get_modeBAD ( void  )

Returns BAD mode.

ir_mode* get_modeBB ( void  )

Returns Basic-Block mode.

ir_mode* get_modeBs ( void  )

Returns byte signed mode.

ir_mode* get_modeBu ( void  )

Returns byte unsigned mode.

ir_mode* get_modeD ( void  )

Returns double mode.

ir_mode* get_modeF ( void  )

Returns float mode.

ir_mode* get_modeHs ( void  )

Returns halfword signed mode.

ir_mode* get_modeHu ( void  )

Returns halfword unsigned mode.

ir_mode* get_modeIs ( void  )

Returns integer signed mode.

ir_mode* get_modeIu ( void  )

Returns integer unsigned mode.

ir_mode* get_modeLLs ( void  )

Returns long long signed mode.

ir_mode* get_modeLLu ( void  )

Returns long long unsigned mode.

ir_mode* get_modeLs ( void  )

Returns long signed mode.

ir_mode* get_modeLu ( void  )

Returns long unsigned mode.

ir_mode* get_modeM ( void  )

Returns memory mode.

ir_mode* get_modeP ( void  )

Returns pointer mode.

ir_mode* get_modeP_code ( void  )

Returns the machine specific pointer mode for code addresses.

ir_mode* get_modeP_data ( void  )

Returns the machine specific pointer mode for data addresses.

ir_mode* get_modeQ ( void  )

Returns quadruple prevision mode.

ir_mode* get_modeT ( void  )

Returns tuple mode.

ir_mode* get_modeX ( void  )

Returns control-flow mode.

ir_mode* get_reference_mode_signed_eq ( ir_mode mode)

Returns the signed integer equivalent mode for an reference mode.

ir_mode* get_reference_mode_unsigned_eq ( ir_mode mode)

Returns the unsigned integer equivalent mode for an reference mode.

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_mode ( const void *  thing)

Checks whether a pointer points to a mode.

Parameters
thingan arbitrary pointer
Returns
true if the thing is a mode, else false
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 (ie.

only the bit pattern is reinterpreted, no conversion is done)

int mode_honor_signed_zeros ( const ir_mode mode)

Returns non-zero if the given mode honors signed zero's, i.e., a +0 and a -0 exists and handled differently.

int mode_is_data ( const ir_mode mode)

Returns 1 if mode is for data values, 0 otherwise.

int mode_is_datab ( const ir_mode mode)

Returns 1 if mode is for data values or internal booleans, 0 otherwise.

int mode_is_dataM ( const ir_mode mode)

Returns 1 if mode is for data values or memory, 0 otherwise.

int mode_is_float ( const ir_mode mode)

Returns 1 if mode is for floatingpoint 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.

int mode_is_reference ( const ir_mode mode)

Returns 1 if mode is for references/pointers, 0 otherwise.

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 
)

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 (number of bits after the leading one).
ir_mode* new_int_mode ( const char *  name,
ir_mode_arithmetic  arithmetic,
unsigned  bit_size,
int  sign,
unsigned  modulo_shift 
)

Creates a new mode.

Parameters
namethe name of the mode to be created
arithmeticarithmetic operations possible with a mode
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).

Returns
The new mode or NULL on error.
ir_mode* new_reference_mode ( const char *  name,
ir_mode_arithmetic  arithmetic,
unsigned  bit_size,
unsigned  modulo_shift 
)

Create a new reference mode.

Reference modes are always unsigned.

void set_mode_link ( ir_mode mode,
void *  l 
)

Stores new intermediate information.

void set_modeP_code ( ir_mode p)

Sets the machine specific pointer mode for code addresses.

If not set, the predefined mode mode_P will be used.

void set_modeP_data ( ir_mode p)

Sets the machine specific pointer mode for data addresses.

If not set, the predefined mode mode_P will be used.

void set_reference_mode_signed_eq ( ir_mode ref_mode,
ir_mode int_mode 
)

Sets the signed integer equivalent mode for an reference mode.

void set_reference_mode_unsigned_eq ( ir_mode ref_mode,
ir_mode int_mode 
)

Sets the unsigned 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 you 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 sm (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 251 of file irmode.h.

ir_mode* mode_b

internal boolean

Definition at line 245 of file irmode.h.

ir_mode* mode_BAD

bad mode

Definition at line 252 of file irmode.h.

ir_mode* mode_BB

block

Definition at line 248 of file irmode.h.

ir_mode* mode_Bs

int8

Definition at line 226 of file irmode.h.

ir_mode* mode_Bu

uint8

Definition at line 227 of file irmode.h.

ir_mode* mode_D

ieee754 binary64 float (double precision)

Definition at line 224 of file irmode.h.

ir_mode* mode_F

ieee754 binary32 float (single precision)

Definition at line 223 of file irmode.h.

ir_mode* mode_Hs

int16

Definition at line 228 of file irmode.h.

ir_mode* mode_Hu

uint16

Definition at line 229 of file irmode.h.

ir_mode* mode_Is

int32

Definition at line 230 of file irmode.h.

ir_mode* mode_Iu

uint32

Definition at line 231 of file irmode.h.

ir_mode* mode_LLs

int128

Definition at line 234 of file irmode.h.

ir_mode* mode_LLu

uint128

Definition at line 235 of file irmode.h.

ir_mode* mode_Ls

int64

Definition at line 232 of file irmode.h.

ir_mode* mode_Lu

uint64

Definition at line 233 of file irmode.h.

ir_mode* mode_M

memory

Definition at line 221 of file irmode.h.

ir_mode* mode_P

pointer

Definition at line 237 of file irmode.h.

ir_mode* mode_P_code

A pointer mode that is set by the client of libfirm.

This mode represents the pointer size of the target machine code addresses. Is initialized to mode_P.

Definition at line 238 of file irmode.h.

ir_mode* mode_P_data

A pointer mode that is set by the client of libfirm.

This mode represents the pointer size of the target machine data addresses. Is initialized to mode_P.

Definition at line 241 of file irmode.h.

ir_mode* mode_Q

ieee754 binary128 float (quadruple precision)

Definition at line 225 of file irmode.h.

ir_mode* mode_T

tuple (none)

Definition at line 250 of file irmode.h.

ir_mode* mode_X

execution

Definition at line 247 of file irmode.h.