bugfixes
[libfirm] / ir / ir / irmode.h
index 33f3dde..f133a62 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
@@ -85,8 +95,8 @@ 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) */
                             /** user-extensible sorts of modes **/
   irms_internal_boolean,  /**< Internal boolean representation.
                               Storing to memory impossible, convert first. (irm_b) */
                             /** user-extensible sorts of modes **/
@@ -133,6 +143,7 @@ typedef enum {
  * @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 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
@@ -146,9 +157,9 @@ 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, 32) will return mode_Is.
  */
  */
-ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align, int sign, mode_arithmetic arithmetic);
+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);
 
 /**
  *   Checks whether a pointer points to a mode.
 
 /**
  *   Checks whether a pointer points to a mode.
@@ -190,6 +201,13 @@ int get_mode_sign (const ir_mode *mode);
 /** Returns the arithmetic of a mode */
 int get_mode_arithmetic (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);
+
+
 /** Returns the stored intermediate information. */
 void* get_mode_link(const ir_mode *mode);
 
 /** Returns the stored intermediate information. */
 void* get_mode_link(const ir_mode *mode);
 
@@ -304,12 +322,18 @@ ir_mode *get_modeT(void);
 ir_mode *get_modeANY(void);
 ir_mode *get_modeBAD(void);
 
 ir_mode *get_modeANY(void);
 ir_mode *get_modeBAD(void);
 
+/** Returns the machine specific pointer mode. */
 ir_mode *get_modeP_mach(void);
 ir_mode *get_modeP_mach(void);
-ir_mode *set_modeP_mach(ir_mode *p);
 
 /**
 
 /**
-   Functions to check, whether a modecode is signed, float, int, num, data,
-   datab or dataM.
+ * 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, 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
@@ -320,25 +344,26 @@ ir_mode *set_modeP_mach(ir_mode *p);
    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}
 */
 /*@}*/
 /* Test for a certain class of modes. */
 */
 /*@}*/
 /* Test for a certain class of modes. */
@@ -348,6 +373,7 @@ 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);