converted comments to doxygen
[libfirm] / ir / ir / irmode.h
1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 * All rights reserved.
3 *
4 * Authors: Christian Schaefer
5 *
6 irmode.h Modes for ir operators.
7
8 This module specifies the modes that type the firm nodes.  See
9 UKA tech report 1999-14 for more information about modes.
10
11
12 @@@ This file is at the level of the original fiasco.  It needs to be ported
13 to the version of the tech report!!! This will be done with the
14 reimplementation of the tarval module.
15 */
16
17 /* $Id$ */
18
19 # ifndef _IRMODE_H_
20 # define _IRMODE_H_
21
22 #include "ident.h"
23 #include <stdbool.h>
24
25 # define target_bits 8
26
27 # define NUM_MODES 20
28
29 #ifndef _TARVAL_TYPEDEF_
30 #define _TARVAL_TYPEDEF_
31 typedef struct tarval tarval;
32 #endif
33
34 /**
35  * according to tech report 1999-14:
36  */
37 typedef enum { /* irm is short for `ir mode' */
38   irm_BB,                       /**< basic block */
39   irm_X,                        /**< execution */
40   irm_F,                        /**< float(32) */
41   irm_D,                        /**< double(64) */
42   irm_E,                        /**< extended(80) */
43   irm_Bs,                       /**< signed byte(8) */
44   irm_Bu,                       /**< unsigned byte(8) */
45   irm_Hs,                       /**< signed short(16) */
46   irm_Hu,                       /**< unsigned short(16) */
47   irm_Is,                       /**< signed int(32) */
48   irm_Iu,                       /**< unsigned int(32) */
49   irm_Ls,                       /**< signed long(64) */
50   irm_Lu,                       /**< unsigned long(64) */
51   irm_C,                        /**< character */
52   irm_P,                        /**< pointer */
53   irm_b,                        /**< internal boolean */
54   irm_M,                        /**< memory */
55   irm_T,                        /**< tuple */
56   irm_U,                        /**< unicode character */
57   irm_max                       /**< maximum value for modecode */
58 } modecode;
59
60 typedef struct ir_mode ir_mode;
61
62 extern ir_mode *mode_T;  /**< tuple (none) */
63 extern ir_mode *mode_F;  /**< signed float(32) */
64 extern ir_mode *mode_D;  /**< signed double(64) */
65 extern ir_mode *mode_E;  /**< signed extended(80) */
66 extern ir_mode *mode_Bs; /**< signed byte (former char) */
67 extern ir_mode *mode_Bu;  /**< unsigned byte (former char) */
68 extern ir_mode *mode_Hs; /**< signed short integer */
69 extern ir_mode *mode_Hu; /**< unsigened short integer */
70 extern ir_mode *mode_Is; /**< signed integer */
71 extern ir_mode *mode_Iu; /**< unsigned integer */
72 extern ir_mode *mode_Ls; /**< signed long integer */
73 extern ir_mode *mode_Lu; /**< unsigned long integer */
74 extern ir_mode *mode_C;  /**< char */
75 extern ir_mode *mode_U;  /**< unicode char */
76 extern ir_mode *mode_P;  /**< pointer */
77 extern ir_mode *mode_b;  /**< internal boolean */
78 extern ir_mode *mode_X;  /**< execution */
79 extern ir_mode *mode_M;  /**< memory */
80 extern ir_mode *mode_BB; /**< block */
81
82 /* Access routines for JNI Interface */
83 ir_mode *get_modeT();
84 ir_mode *get_modeF();
85 ir_mode *get_modeD();
86 ir_mode *get_modeE();
87 ir_mode *get_modeBs();
88 ir_mode *get_modeBu();
89 ir_mode *get_modeHs();
90 ir_mode *get_modeHu();
91 ir_mode *get_modeIs();
92 ir_mode *get_modeIu();
93 ir_mode *get_modeLs();
94 ir_mode *get_modeLu();
95 ir_mode *get_modeC();
96 ir_mode *get_modeU();
97 ir_mode *get_modeP();
98 ir_mode *get_modeb();
99 ir_mode *get_modeX();
100 ir_mode *get_modeM();
101 ir_mode *get_modeBB();
102
103 /* An enum for this mode */
104 modecode get_mode_modecode (ir_mode *mode);
105 /* void  set_mode_modecode (ir_mode *mode, modecode code);  */
106
107 /* The ident of this mode */
108 ident   *get_mode_ident    (ir_mode *mode);
109 /* void  set_mode_ident    (ir_mode *mode, ident *id);    */
110
111 /* The name of this mode */
112 const char *get_mode_name  (ir_mode *mode);
113 /* void  set_mode_name     (ir_mode *mode, char *name);    */
114
115 /* The size of values of the mode in bytes. */
116 int      get_mode_size     (ir_mode *mode);
117 /* void  set_mode_size     (ir_mode *mode, int size);       */
118
119 /* The alignment of values of the mode. */
120 int      get_mode_ld_align (ir_mode *mode);
121 /* void  set_mode_ld_align (ir_mode *mode, int ld_align); */
122
123 /* The smallest representable value */
124 tarval  *get_mode_min      (ir_mode *mode);
125 /* void  set_mode_min      (ir_mode *mode, tarval *min); */
126
127 /* The biggest representable value */
128 tarval  *get_mode_max      (ir_mode *mode);
129 /* void  set_mode_max      (ir_mode *mode, tarval *max); */
130
131 /* The value Zero represented in this mode */
132 tarval  *get_mode_null     (ir_mode *mode);
133 /* void  set_mode_null     (ir_mode *mode, tarval *null); */
134
135 /* Returns 1 if mode is signed, else 0. */
136 unsigned get_mode_fsigned  (ir_mode *mode);
137 /* void  set_mode_fsigned  (ir_mode *mode, unsigned fsigned); */
138
139 /* Returns 1 if mode is float, else 0. */
140 unsigned get_mode_ffloat   (ir_mode *mode);
141 /* void  set_mode_ffloat   (ir_mode *mode, unsigned ffloat); */
142
143 /* Functions to check, whether a modecode is signed, float, int, num, data,
144    datab or dataM. For more exact definitions read the corresponding pages
145    in the firm documentation or the followingenumeration
146
147    The set of "float" is defined as:
148    ---------------------------------
149    float = {irm_F, irm_D, irm_E}
150
151    The set of "int" is defined as:
152    -------------------------------
153    int   = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
154
155    The set of "num" is defined as:
156    -------------------------------
157    num   = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
158             irm_Is, irm_Iu, irm_Ls, irm_Lu}
159             = {float || int}
160
161    The set of "data" is defined as:
162    -------------------------------
163    data  = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
164             irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P}
165             = {num || irm_C || irm_P}
166
167    The set of "datab" is defined as:
168    ---------------------------------
169    datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
170             irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_b}
171             = {data || irm_b }
172
173    The set of "dataM" is defined as:
174    ---------------------------------
175    dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
176             irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_M}
177             = {data || irm_M}
178 */
179
180 /* Test for a certain class of modes. */
181 int mode_is_signed (ir_mode *mode);
182 int mode_is_float (ir_mode *mode);
183 int mode_is_int (ir_mode *mode);
184 int mode_is_num (ir_mode *mode);
185 int mode_is_data (ir_mode *mode);
186 int mode_is_datab (ir_mode *mode);
187 int mode_is_dataM (ir_mode *mode);
188
189 /* Returns true if sm can be converted to lm without loss
190    according to firm definiton */
191 bool smaller_mode(ir_mode *sm, ir_mode *lm);
192
193 # endif /* _IRMODE_H_ */