c192350c9a23f6931ae529c7e1d9812928b0d0d0
[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 typedef enum { /* irm is short for `ir mode' */
35   /*  according to tech report 1999-14: */
36   irm_BB, irm_X,                 // basic block, execution
37   irm_F, irm_D, irm_E,           // float(32), double(64), extended(80)
38   irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu,
39                                  // byte(8), short(16), int(32), long(64)
40   irm_C,                         // character
41   irm_P,                         // pointer
42   irm_b,                         // internal boolean
43   irm_M,                         // memory
44   irm_T,                         // tuple
45   irm_U,                         // unicode character
46   irm_max
47 } modecode;
48
49 typedef struct ir_mode ir_mode;
50
51 extern ir_mode *mode_T;  /* tuple (none) */
52 extern ir_mode *mode_F;  /* signed float(32) */
53 extern ir_mode *mode_D;  /* signed double(64) */
54 extern ir_mode *mode_E;  /* signed extended(80) */
55 extern ir_mode *mode_Bs; /* signed byte (former char) */
56 extern ir_mode *mode_Bu;  /* unsigned byte (former char) */
57 extern ir_mode *mode_Hs; /* signed short integer */
58 extern ir_mode *mode_Hu; /* unsigened short integer */
59 extern ir_mode *mode_Is; /* signed integer */
60 extern ir_mode *mode_Iu; /* unsigned integer */
61 extern ir_mode *mode_Ls; /* signed long integer */
62 extern ir_mode *mode_Lu; /* unsigned long integer */
63 extern ir_mode *mode_C;  /* char */
64 extern ir_mode *mode_U;  /* unicode char */
65 extern ir_mode *mode_P;  /* pointer */
66 extern ir_mode *mode_b;  /* internal boolean */
67 extern ir_mode *mode_X;  /* execution */
68 extern ir_mode *mode_M;  /* memory */
69 extern ir_mode *mode_BB; /* block */
70
71 /* Access routines for JNI Interface */
72 ir_mode *get_modeT();
73 ir_mode *get_modeF();
74 ir_mode *get_modeD();
75 ir_mode *get_modeE();
76 ir_mode *get_modeBs();
77 ir_mode *get_modeBu();
78 ir_mode *get_modeHs();
79 ir_mode *get_modeHu();
80 ir_mode *get_modeIs();
81 ir_mode *get_modeIu();
82 ir_mode *get_modeLs();
83 ir_mode *get_modeLu();
84 ir_mode *get_modeC();
85 ir_mode *get_modeU();
86 ir_mode *get_modeP();
87 ir_mode *get_modeb();
88 ir_mode *get_modeX();
89 ir_mode *get_modeM();
90 ir_mode *get_modeBB();
91
92 /* An enum for this mode */
93 modecode get_mode_modecode (ir_mode *mode);
94 /* void  set_mode_modecode (ir_mode *mode, modecode code);  */
95
96 /* The ident of this mode */
97 ident   *get_mode_ident    (ir_mode *mode);
98 /* void  set_mode_ident    (ir_mode *mode, ident *id);    */
99
100 /* The name of this mode */
101 const char *get_mode_name  (ir_mode *mode);
102 /* void  set_mode_name     (ir_mode *mode, char *name);    */
103
104 /* The size of values of the mode in bytes. */
105 int      get_mode_size     (ir_mode *mode);
106 /* void  set_mode_size     (ir_mode *mode, int size);       */
107
108 /* The alignment of values of the mode. */
109 int      get_mode_ld_align (ir_mode *mode);
110 /* void  set_mode_ld_align (ir_mode *mode, int ld_align); */
111
112 /* The smallest representable value */
113 tarval  *get_mode_min      (ir_mode *mode);
114 /* void  set_mode_min      (ir_mode *mode, tarval *min); */
115
116 /* The biggest representable value */
117 tarval  *get_mode_max      (ir_mode *mode);
118 /* void  set_mode_max      (ir_mode *mode, tarval *max); */
119
120 /* The value Zero represented in this mode */
121 tarval  *get_mode_null     (ir_mode *mode);
122 /* void  set_mode_null     (ir_mode *mode, tarval *null); */
123
124 /* Returns 1 if mode is signed, else 0. */
125 unsigned get_mode_fsigned  (ir_mode *mode);
126 /* void  set_mode_fsigned  (ir_mode *mode, unsigned fsigned); */
127
128 /* Returns 1 if mode is float, else 0. */
129 unsigned get_mode_ffloat   (ir_mode *mode);
130 /* void  set_mode_ffloat   (ir_mode *mode, unsigned ffloat); */
131
132 /* Functions to check, whether a modecode is signed, float, int, num, data,
133    datab or dataM. For more exact definitions read the corresponding pages
134    in the firm documentation or the followingenumeration
135
136    The set of "float" is defined as:
137    ---------------------------------
138    float = {irm_F, irm_D, irm_E}
139
140    The set of "int" is defined as:
141    -------------------------------
142    int   = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
143
144    The set of "num" is defined as:
145    -------------------------------
146    num   = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
147             irm_Is, irm_Iu, irm_Ls, irm_Lu}
148             = {float || int}
149
150    The set of "data" is defined as:
151    -------------------------------
152    data  = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
153             irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P}
154             = {num || irm_C || irm_P}
155
156    The set of "datab" is defined as:
157    ---------------------------------
158    datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
159             irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_b}
160             = {data || irm_b }
161
162    The set of "dataM" is defined as:
163    ---------------------------------
164    dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
165             irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_M}
166             = {data || irm_M}
167 */
168
169 /* Test for a certain class of modes. */
170 int mode_is_signed (ir_mode *mode);
171 int mode_is_float (ir_mode *mode);
172 int mode_is_int (ir_mode *mode);
173 int mode_is_num (ir_mode *mode);
174 int mode_is_data (ir_mode *mode);
175 int mode_is_datab (ir_mode *mode);
176 int mode_is_dataM (ir_mode *mode);
177
178 /* Returns true if sm can be converted to lm without loss
179    according to firm definiton */
180 bool smaller_mode(ir_mode *sm, ir_mode *lm);
181
182 # endif /* _IRMODE_H_ */