added routines to free memory
[libfirm] / ir / ir / irmode.h
index 8dca33d..0a24a05 100644 (file)
@@ -1,7 +1,14 @@
-/* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
- * All rights reserved.
+/*
+ * Project:     libFIRM
+ * File name:   ir/ir/irmode.h
+ * Purpose:     Data modes of operations.
+ * Author:      Martin Trapp, Christian Schaefer
+ * Modified by: Goetz Lindenmaier, Mathias Heil
+ * Created:
+ * CVS-ID:      $Id$
+ * Copyright:   (c) 1998-2003 Universität Karlsruhe
+ * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
  */
  */
-/* $Id$ */
 
 /**
  * @file irmode.h
 
 /**
  * @file irmode.h
@@ -18,6 +25,7 @@
  *    UKA tech report 1999-44 for more information about modes.
  *
  */
  *    UKA tech report 1999-44 for more information about modes.
  *
  */
+
 #ifndef _IRMODE_H_
 #define _IRMODE_H_
 
 #ifndef _IRMODE_H_
 #define _IRMODE_H_
 
@@ -43,6 +51,8 @@
  *  -  int    align:            byte alignment
  *  -  unsigned sign:1:         signedness of this mode
  *  -  ... more to come
  *  -  int    align:            byte alignment
  *  -  unsigned sign:1:         signedness of this mode
  *  -  ... more to come
+ *  -  modulo_shift             specifies for modes of kind irms_int_number
+ *                              whether shift applies modulo to value of bits to shift
  *
  * SEE ALSO:
  *    The tech report 1999-44 describing FIRM and predefined modes
  *
  * SEE ALSO:
  *    The tech report 1999-44 describing FIRM and predefined modes
@@ -75,6 +85,8 @@ typedef enum { /* irm is short for `ir mode' */
   irm_M,                        /**< memory */
   irm_T,                        /**< tuple */
   irm_U,                        /**< unicode character */
   irm_M,                        /**< memory */
   irm_T,                        /**< tuple */
   irm_U,                        /**< unicode character */
+  irm_ANY,                      /**< undefined mode */
+  irm_BAD,                      /**< bad mode */
   irm_max                       /**< maximum value for modecode */
 } modecode;
 
   irm_max                       /**< maximum value for modecode */
 } modecode;
 
@@ -83,11 +95,11 @@ typedef enum { /* irm is short for `ir mode' */
 typedef enum {
   /* Predefined sorts of modes */
   irms_auxiliary,         /**< Only for Firm use. Not extensible. (irm_T) */
 typedef enum {
   /* Predefined sorts of modes */
   irms_auxiliary,         /**< Only for Firm use. Not extensible. (irm_T) */
-  /* irms_control_flow    **< Marks all control flow modes. Not extensible. (irm_BB, irm_X) */
-  /* irms_memory          **< Marks the memory mode.  Not extensible. (irm_M) */
+  irms_control_flow,      /**< Marks all control flow modes. Not extensible. (irm_BB, irm_X) */
+  irms_memory,            /**< Marks the memory mode.  Not extensible. (irm_M) */
   irms_internal_boolean,  /**< Internal boolean representation.
                               Storing to memory impossible, convert first. (irm_b) */
   irms_internal_boolean,  /**< Internal boolean representation.
                               Storing to memory impossible, convert first. (irm_b) */
-  /** user-extensible sorts of modes **/
+                            /** user-extensible sorts of modes **/
   irms_int_number,        /**< A mode to represent int numbers.
                               Integer computations can be performed. */
   irms_float_number,      /**< A mode to represent float numbers.
   irms_int_number,        /**< A mode to represent int numbers.
                               Integer computations can be performed. */
   irms_float_number,      /**< A mode to represent float numbers.
@@ -115,7 +127,7 @@ typedef enum {
   irma_ieee754 = 256,         /**< Values of the mode are represented according to ieee754
                                   floatingpoint standard.  Only legal for modes of sort float_number. */
   irma_float_BCD,             /**< Values of the mode are represented  as binary coded decimals
   irma_ieee754 = 256,         /**< Values of the mode are represented according to ieee754
                                   floatingpoint standard.  Only legal for modes of sort float_number. */
   irma_float_BCD,             /**< Values of the mode are represented  as binary coded decimals
-                                  according to @@@ which standars??? Only legal for modes of
+                                  according to @@@ which standards??? Only legal for modes of
                                   sort float_number. */
   irma_max
 } mode_arithmetic;
                                   sort float_number. */
   irma_max
 } mode_arithmetic;
@@ -130,6 +142,8 @@ typedef enum {
  * @param bit_size     number of bits this mode allocate
  * @param align                the byte alignment for an entity of this mode (in bits)
  * @param sign         non-zero if this is a signed mode
  * @param bit_size     number of bits this mode allocate
  * @param align                the byte alignment for an entity of this mode (in bits)
  * @param sign         non-zero if this is a signed mode
+ * @param arithmetic    arithmetic operations possible with a mode
+ * @param 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
  *
  * This function constructs a new mode given by the parameters.
  * If the parameters match an already defined mode, this mode is returned
@@ -143,9 +157,43 @@ typedef enum {
  *
  * @note
  *     It is allowed to construct the default modes. So, a call
  *
  * @note
  *     It is allowed to construct the default modes. So, a call
- *     new_ir_mode("Is", irms_int_number, 32, 4, 1) will return mode_Is.
+ *     new_ir_mode("Is", irms_int_number, 32, 4, 1, irma_twos_complement, 32) will return mode_Is.
  */
  */
-ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align, int sign);
+ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align, int sign, mode_arithmetic arithmetic, unsigned int modulo_shift);
+
+/**
+ * Creates a new vector mode.
+ *
+ * @param name         the name of the mode to be created
+ * @param sort         the mode_sort of the mode to be created
+ * @param bit_size     number of bits for one element of this mode
+ * @param num_of_elem   number of elements in this vector mode
+ * @param align                the byte alignment for an entity of this mode (in bits)
+ * @param sign         non-zero if this is a signed mode
+ * @param arithmetic    arithmetic operations possible with a mode
+ * @param modulo_shift  Is ignored for modes other than integer.
+ *
+ * This function constructs a new vector mode given by the parameters.
+ * If the parameters match an already defined mode, this mode is returned.
+ * If the mode is newly allocated, a new unique mode_code is choosen.
+ * Also, special value tarvals will be calculated such as null,
+ * min, max and can be retrieved using the get_mode_* fuctions
+ *
+ * @return
+ *     The new mode or NULL on error.
+ */
+ir_mode *new_ir_vector_mode(const char *name, mode_sort sort, int bit_size, unsigned num_of_elem, int align, int sign,
+                    mode_arithmetic arithmetic, unsigned int modulo_shift );
+
+/**
+ *   Checks whether a pointer points to a mode.
+ *
+ *   @param thing     an arbitrary pointer
+ *
+ *   @return
+ *       true if the thing is a mode, else false
+ */
+int is_mode (void *thing);
 
 /* ********** Access methods to read mode information *********** */
 
 
 /* ********** Access methods to read mode information *********** */
 
@@ -171,9 +219,32 @@ int get_mode_size_bytes(const ir_mode *mode);
 /** Returns the alignment of values of the mode in bytes. */
 int get_mode_align(const ir_mode *mode);
 
 /** Returns the alignment of values of the mode in bytes. */
 int get_mode_align(const ir_mode *mode);
 
-/** Returns the signess of a mode */
+/** Returns the signess of a mode.
+ *
+ * Returns the signess of a mode: 1 if mode is signed. */
 int get_mode_sign (const ir_mode *mode);
 
 int get_mode_sign (const ir_mode *mode);
 
+/** Returns the arithmetic of a mode */
+int get_mode_arithmetic (const ir_mode *mode);
+
+/** 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.
+ */
+unsigned int get_mode_modulo_shift(const ir_mode *mode);
+
+/** Attribute vector_elem specifies the number of vector elements of
+ *  a vector mode. For non-vector modes it returns 1 for data and 0
+ *  for all other modes
+ */
+unsigned int get_mode_vector_elems(const ir_mode *mode);
+
+/** Returns the stored intermediate information. */
+void* get_mode_link(const ir_mode *mode);
+
+/** Stores new intermediate information. */
+void set_mode_link(ir_mode *mode, void *l);
+
 /**
  * Returns the smallest representable value of a given mode.
  *
 /**
  * Returns the smallest representable value of a given mode.
  *
@@ -225,11 +296,7 @@ tarval *get_mode_infinite(ir_mode *mode);
  */
 tarval *get_mode_NAN(ir_mode *mode);
 
  */
 tarval *get_mode_NAN(ir_mode *mode);
 
-/* -- Auxiliary modes necessary for the Firm representation -- */
-extern ir_mode *mode_T;  /**< tuple (none) */
-extern ir_mode *mode_X;  /**< execution */
 extern ir_mode *mode_M;         /**< memory */
 extern ir_mode *mode_M;         /**< memory */
-extern ir_mode *mode_BB; /**< block */
 
 /* -- A set of predifined, numerical modes according to Techreport 1999-44 -- */
 extern ir_mode *mode_F;         /**< signed float(32) */
 
 /* -- A set of predifined, numerical modes according to Techreport 1999-44 -- */
 extern ir_mode *mode_F;         /**< signed float(32) */
@@ -244,14 +311,26 @@ extern ir_mode *mode_Iu; /**< unsigned integer */
 extern ir_mode *mode_Ls; /**< signed long integer */
 extern ir_mode *mode_Lu; /**< unsigned long integer */
 
 extern ir_mode *mode_Ls; /**< signed long integer */
 extern ir_mode *mode_Lu; /**< unsigned long integer */
 
-extern ir_mode *mode_b;  /**< internal boolean */
 extern ir_mode *mode_C;  /**< 8 bit char */
 extern ir_mode *mode_U;  /**< 16 bit unicode char */
 extern ir_mode *mode_C;  /**< 8 bit char */
 extern ir_mode *mode_U;  /**< 16 bit unicode char */
+
 extern ir_mode *mode_P;  /**< pointer */
 extern ir_mode *mode_P;  /**< pointer */
+extern ir_mode *mode_P_mach; /**< A pointer mode that is set by the client of libfirm.  This mode
+                              represents the pointer size of the target machine. Is initialized
+                              to mode_P. */
+
+/* -- Auxiliary modes necessary for the Firm representation -- */
+extern ir_mode *mode_b;  /**< internal boolean */
+
+extern ir_mode *mode_X;  /**< execution */
+extern ir_mode *mode_BB; /**< block */
+
+extern ir_mode *mode_T;  /**< tuple (none) */
+extern ir_mode *mode_ANY;/**< undefined mode */
+extern ir_mode *mode_BAD;/**< bad mode */
 
 /*@{*/
 /** Access routines for JNI Interface */
 
 /*@{*/
 /** Access routines for JNI Interface */
-ir_mode *get_modeT(void);
 ir_mode *get_modeF(void);
 ir_mode *get_modeD(void);
 ir_mode *get_modeE(void);
 ir_mode *get_modeF(void);
 ir_mode *get_modeD(void);
 ir_mode *get_modeE(void);
@@ -268,12 +347,24 @@ ir_mode *get_modeU(void);
 ir_mode *get_modeP(void);
 ir_mode *get_modeb(void);
 ir_mode *get_modeX(void);
 ir_mode *get_modeP(void);
 ir_mode *get_modeb(void);
 ir_mode *get_modeX(void);
-ir_mode *get_modeM(void);
 ir_mode *get_modeBB(void);
 ir_mode *get_modeBB(void);
+ir_mode *get_modeM(void);
+ir_mode *get_modeT(void);
+ir_mode *get_modeANY(void);
+ir_mode *get_modeBAD(void);
+
+/** Returns the machine specific pointer mode. */
+ir_mode *get_modeP_mach(void);
+
+/**
+ * Sets the machine specific pointer mode.
+ * If not set, the predefined mode mode_P will be used.
+ */
+void set_modeP_mach(ir_mode *p);
 
 /**
 
 /**
-   Functions to check, whether a modecode is signed, float, int, num, data,
-   datab or dataM.
+   Functions to check, whether a modecode is signed, float, int, character,
+   reference, num, numP, data, datab or dataM.
 
    For more exact definitions read the corresponding pages
    in the firm documentation or the following enumeration
 
    For more exact definitions read the corresponding pages
    in the firm documentation or the following enumeration
@@ -284,25 +375,28 @@ ir_mode *get_modeBB(void);
    The set of "int" is defined as:
    int   = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
 
    The set of "int" is defined as:
    int   = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
 
+   The set of "character" is defined as:
+   character  = {irm_C, irm_U}
+
+   The set of "reference" is defined as:
+   reference  = {irm_P}
+
    The set of "num" is defined as:
    The set of "num" is defined as:
-   num   = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
-            irm_Is, irm_Iu, irm_Ls, irm_Lu}
-            = {float || int}
+   num   = {float || int}
+
+   The set of "numP" is defined as:
+   numP  =  {float || int || reference}
 
    The set of "data" is defined as:
 
    The set of "data" is defined as:
-   data  = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
-            irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P}
-            = {num || irm_C || irm_P}
+   data  =  {num || character || reference}
 
    The set of "datab" is defined as:
 
    The set of "datab" is defined as:
-   datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
-            irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_b}
-            = {data || irm_b }
+   datab =  {data || irm_b }
 
    The set of "dataM" is defined as:
 
    The set of "dataM" is defined as:
-   dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
-            irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_M}
-            = {data || irm_M}
+   dataM =  {data || irm_M}
+
+   Vector "int" and "float" are defined by the arithmetic and vector_elem > 1.
 */
 /*@}*/
 /* Test for a certain class of modes. */
 */
 /*@}*/
 /* Test for a certain class of modes. */
@@ -312,9 +406,13 @@ int mode_is_int (const ir_mode *mode);
 int mode_is_character (const ir_mode *mode);
 int mode_is_reference (const ir_mode *mode);
 int mode_is_num (const ir_mode *mode);
 int mode_is_character (const ir_mode *mode);
 int mode_is_reference (const ir_mode *mode);
 int mode_is_num (const ir_mode *mode);
+int mode_is_numP (const ir_mode *mode);
 int mode_is_data (const ir_mode *mode);
 int mode_is_datab (const ir_mode *mode);
 int mode_is_dataM (const ir_mode *mode);
 int mode_is_data (const ir_mode *mode);
 int mode_is_datab (const ir_mode *mode);
 int mode_is_dataM (const ir_mode *mode);
+int mode_is_float_vector (const ir_mode *mode);
+int mode_is_int_vector (const ir_mode *mode);
+
 /** Returns true if sm can be converted to lm without loss
    according to firm definiton */
 int smaller_mode(const ir_mode *sm, const ir_mode *lm);
 /** Returns true if sm can be converted to lm without loss
    according to firm definiton */
 int smaller_mode(const ir_mode *sm, const ir_mode *lm);
@@ -322,4 +420,7 @@ int smaller_mode(const ir_mode *sm, const ir_mode *lm);
 /** mode module initialization, call once before use of any other function **/
 void init_mode (void);
 
 /** mode module initialization, call once before use of any other function **/
 void init_mode (void);
 
+/** mode module finalization. frees all memory.  */
+void finish_mode(void);
+
 #endif /* _IRMODE_H_ */
 #endif /* _IRMODE_H_ */