optimize_graph_df():
[libfirm] / ir / ir / irmode.h
index 6ec83aa..f6e3e6e 100644 (file)
 #ifndef _IRMODE_H_
 #define _IRMODE_H_
 
+#include "firm_types.h"
 #include "ident.h"
 
-#ifndef _TARVAL_TYPEDEF_
-#define _TARVAL_TYPEDEF_
-  typedef struct tarval tarval;
-#endif
-
 /**
  * Contains relevant information about a mode.
  *
- * Neccessary information about a mode is stored in this struct
+ * Necessary information about a mode is stored in this struct
  * which is used by the tarval module to perform calculations
  * and comparisons of values of a such described mode.
  *
  * ATTRIBUTES:
- *  -  modecode code:           An unambigous int (enum) for the mode
+ *  -  modecode code:           An unambiguous int (enum) for the mode
  *  -  ident *name:             Name of this mode. Two modes are different if the name is different.
- *  -  mode_sort sort:          sort of mode specifying possible usage kategories
+ *  -  mode_sort sort:          sort of mode specifying possible usage categories
  *  -  int    size:             size of the mode in Bits.
  *  -  unsigned sign:1:         signedness of this mode
  *  -  ... more to come
  *    The tech report 1999-44 describing FIRM and predefined modes
  *    tarval.h
  */
+#ifndef _IR_MODE_TYPEDEF_
+#define _IR_MODE_TYPEDEF_
 typedef struct ir_mode ir_mode;
+#endif
 
 /* ********** Predefined modes ********** */
 
@@ -146,9 +145,9 @@ typedef enum {
  * 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).
- * If the mode is newly allocated, a new unique mode_code is choosen.
+ * If the mode is newly allocated, a new unique mode_code is chosen.
  * Also, special value tarvals will be calculated such as null,
- * min, max and can be retrieved using the get_mode_* fuctions
+ * min, max and can be retrieved using the get_mode_* functions
  *
  * @return
  *     The new mode or NULL on error.
@@ -162,19 +161,19 @@ ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int sign, m
 /**
  * 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 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 sign         non-zero if this is a signed mode
+ * @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.
+ * If the mode is newly allocated, a new unique mode_code is chosen.
  * Also, special value tarvals will be calculated such as null,
- * min, max and can be retrieved using the get_mode_* fuctions
+ * min, max and can be retrieved using the get_mode_* functions
  *
  * @return
  *     The new mode or NULL on error.
@@ -247,7 +246,7 @@ void  set_mode_link(ir_mode *mode, void *l);
  * Returns the smallest representable value of a given mode.
  *
  * For modes of the sort float_number this is the most negative value
- * bigger than -infinit.
+ * bigger than -infinite.
  */
 tarval *get_mode_min(ir_mode *mode);
 
@@ -255,7 +254,7 @@ tarval *get_mode_min(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 infinit.
+ * than infinite.
  */
 tarval *get_mode_max(ir_mode *mode);
 
@@ -274,10 +273,18 @@ tarval *get_mode_null(ir_mode *mode);
  *
  * One, being the multiplicative neutral element,
  * is defined only for modes allowing multiplication,
- * i.e. ints and op_pin_state_floats.
+ * i.e. ints and floats.
  */
 tarval *get_mode_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.
+ */
+tarval *get_mode_minus_one(ir_mode *mode);
+
 /**
  * Returns the positive infinite value of a mode.
  *
@@ -296,14 +303,14 @@ tarval *get_mode_NAN(ir_mode *mode);
 
 extern ir_mode *mode_M;         /**< memory */
 
-/* -- A set of predifined, numerical modes according to Techreport 1999-44 -- */
+/* -- A set of predefined, numerical modes according to Techreport 1999-44 -- */
 extern ir_mode *mode_F;         /**< signed float(32) */
 extern ir_mode *mode_D;  /**< signed double(64) */
 extern ir_mode *mode_E;  /**< signed extended(80) */
 extern ir_mode *mode_Bs; /**< signed byte (former char) */
 extern ir_mode *mode_Bu; /**< unsigned byte (former char) */
 extern ir_mode *mode_Hs; /**< signed short integer */
-extern ir_mode *mode_Hu; /**< unsigened short integer */
+extern ir_mode *mode_Hu; /**< unsigned short integer */
 extern ir_mode *mode_Is; /**< signed integer */
 extern ir_mode *mode_Iu; /**< unsigned integer */
 extern ir_mode *mode_Ls; /**< signed long integer */
@@ -313,8 +320,11 @@ 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_mach; /**< A pointer mode that is set by the client of libfirm.  This mode
-                              represents the pointer size of the target machine. Is initialized
+extern 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. */
+extern 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. */
 
 /* -- Auxiliary modes necessary for the Firm representation -- */
@@ -351,14 +361,23 @@ 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);
+/** Returns the machine specific pointer mode for code addresses. */
+ir_mode *get_modeP_code(void);
+
+/** Returns the machine specific pointer mode for data addresses. */
+ir_mode *get_modeP_data(void);
 
 /**
- * Sets the machine specific pointer mode.
+ * Sets the machine specific pointer mode for code addresses.
  * If not set, the predefined mode mode_P will be used.
  */
-void set_modeP_mach(ir_mode *p);
+void set_modeP_code(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_modeP_data(ir_mode *p);
 
 /**
    Functions to check, whether a modecode is signed, float, int, character,
@@ -433,4 +452,23 @@ ir_mode *find_signed_mode(const ir_mode *mode);
  */
 ir_mode *find_double_bits_int_mode(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_honor_signed_zeros(const ir_mode *mode);
+
+/**
+ * Returns non-zero if the given mode might overflow on unary Minus.
+ */
+int mode_overflow_on_unary_Minus(const ir_mode *mode);
+
+/**
+ * Returns non-zero if the mode has a reversed wrap-aound
+ * logic, especially (a + x) - x == a.
+ * This is normally true for integer modes, not for floating
+ * point modes.
+ */
+int mode_wrap_around(const ir_mode *mode);
+
 #endif /* _IRMODE_H_ */