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