2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * @brief Data modes of operations -- private header.
23 * @author Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Mathias Heil,
27 #ifndef FIRM_IR_IRMODE_T_H
28 #define FIRM_IR_IRMODE_T_H
34 /* ------------------------------- *
36 * ------------------------------- */
37 extern ir_mode *mode_P_code, *mode_P_data;
39 static inline ir_mode *
40 _get_modeP_code(void) { return mode_P_code; }
42 static inline ir_mode *
43 _get_modeP_data(void) { return mode_P_data; }
45 static inline ir_modecode
46 _get_mode_modecode(const ir_mode *mode) { return mode->code; }
49 _get_mode_ident(const ir_mode *mode) { return mode->name; }
51 static inline ir_mode_sort
52 _get_mode_sort(const ir_mode *mode) { return mode->sort; }
54 static inline unsigned
55 _get_mode_size_bits(const ir_mode *mode) { return mode->size; }
57 static inline unsigned
58 _get_mode_size_bytes(const ir_mode *mode) {
59 unsigned size = _get_mode_size_bits(mode);
60 if ((size & 7) != 0) return (unsigned) -1;
65 _get_mode_sign(const ir_mode *mode) { return mode->sign; }
67 static inline ir_mode_arithmetic
68 _get_mode_arithmetic(const ir_mode *mode) { return mode->arithmetic; }
70 static inline unsigned int
71 _get_mode_modulo_shift(const ir_mode *mode) { return mode->modulo_shift; }
73 static inline unsigned int
74 _get_mode_vector_elems(const ir_mode *mode) { return mode->vector_elem; }
77 _get_mode_link(const ir_mode *mode) { return mode->link; }
80 _set_mode_link(ir_mode *mode, void *l) { mode->link = l; }
82 /* Functions to check, whether a ir_modecode is signed, float, int, num, data,
83 datab or dataM. For more exact definitions read the corresponding pages
84 in the firm documentation or the following enumeration
86 The set of "float" is defined as:
87 ---------------------------------
88 float = {irm_F, irm_D, irm_E}
90 The set of "int" is defined as:
91 -------------------------------
92 int = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
94 The set of "num" is defined as:
95 -------------------------------
96 num = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
97 irm_Is, irm_Iu, irm_Ls, irm_Lu}
100 The set of "data" is defined as:
101 -------------------------------
102 data = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
103 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P}
104 = {num || irm_C || irm_U || irm_P}
106 The set of "datab" is defined as:
107 ---------------------------------
108 datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
109 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_b}
112 The set of "dataM" is defined as:
113 ---------------------------------
114 dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
115 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_M}
120 _mode_is_signed(const ir_mode *mode) {
125 _mode_is_float(const ir_mode *mode) {
126 return (_get_mode_sort(mode) == irms_float_number);
130 _mode_is_int(const ir_mode *mode) {
131 return (_get_mode_sort(mode) == irms_int_number);
135 _mode_is_reference(const ir_mode *mode) {
136 return (_get_mode_sort(mode) == irms_reference);
140 _mode_is_num(const ir_mode *mode) {
141 return (_get_mode_sort(mode) & irmsh_is_num);
145 _mode_is_data(const ir_mode *mode) {
146 return (_get_mode_sort(mode) & irmsh_is_data);
150 _mode_is_datab(const ir_mode *mode) {
151 return (_get_mode_sort(mode) & irmsh_is_datab);
155 _mode_is_dataM(const ir_mode *mode) {
156 return (_get_mode_sort(mode) & irmsh_is_dataM);
160 _mode_is_float_vector(const ir_mode *mode) {
161 return (_get_mode_sort(mode) == irms_float_number) && (_get_mode_vector_elems(mode) > 1);
165 _mode_is_int_vector(const ir_mode *mode) {
166 return (_get_mode_sort(mode) == irms_int_number) && (_get_mode_vector_elems(mode) > 1);
169 /** mode module initialization, call once before use of any other function **/
170 void init_mode(void);
172 /** mode module finalization. frees all memory. */
173 void finish_mode(void);
175 #define get_modeP_code() _get_modeP_code()
176 #define get_modeP_data() _get_modeP_data()
177 #define get_mode_modecode(mode) _get_mode_modecode(mode)
178 #define get_mode_ident(mode) _get_mode_ident(mode)
179 #define get_mode_sort(mode) _get_mode_sort(mode)
180 #define get_mode_size_bits(mode) _get_mode_size_bits(mode)
181 #define get_mode_size_bytes(mode) _get_mode_size_bytes(mode)
182 #define get_mode_sign(mode) _get_mode_sign(mode)
183 #define get_mode_arithmetic(mode) _get_mode_arithmetic(mode)
184 #define get_mode_modulo_shift(mode) _get_mode_modulo_shift(mode)
185 #define get_mode_n_vector_elems(mode) _get_mode_vector_elems(mode)
186 #define get_mode_link(mode) _get_mode_link(mode)
187 #define set_mode_link(mode, l) _set_mode_link(mode, l)
188 #define mode_is_signed(mode) _mode_is_signed(mode)
189 #define mode_is_float(mode) _mode_is_float(mode)
190 #define mode_is_int(mode) _mode_is_int(mode)
191 #define mode_is_reference(mode) _mode_is_reference(mode)
192 #define mode_is_num(mode) _mode_is_num(mode)
193 #define mode_is_data(mode) _mode_is_data(mode)
194 #define mode_is_datab(mode) _mode_is_datab(mode)
195 #define mode_is_dataM(mode) _mode_is_dataM(mode)
196 #define mode_is_float_vector(mode) _mode_is_float_vector(mode)
197 #define mode_is_int_vector(mode) _mode_is_int_vector(mode)