1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
4 * Authors: Martin Trapp, Christian Schaefer
14 # include "irmode_t.h"
40 INLINE ir_mode *get_modeT() { return mode_T; }
41 INLINE ir_mode *get_modeF() { return mode_F; }
42 INLINE ir_mode *get_modeD() { return mode_D; }
43 INLINE ir_mode *get_modeE() { return mode_E; }
44 INLINE ir_mode *get_modeBs() { return mode_Bs; }
45 INLINE ir_mode *get_modeBu() { return mode_Bu; }
46 INLINE ir_mode *get_modeHs() { return mode_Hs; }
47 INLINE ir_mode *get_modeHu() { return mode_Hu; }
48 INLINE ir_mode *get_modeIs() { return mode_Is; }
49 INLINE ir_mode *get_modeIu() { return mode_Iu; }
50 INLINE ir_mode *get_modeLs() { return mode_Ls; }
51 INLINE ir_mode *get_modeLu() { return mode_Lu; }
52 INLINE ir_mode *get_modeC() { return mode_C; }
53 INLINE ir_mode *get_modeU() { return mode_U; }
54 INLINE ir_mode *get_modeb() { return mode_b; }
55 INLINE ir_mode *get_modeP() { return mode_P; }
56 INLINE ir_mode *get_modeX() { return mode_X; }
57 INLINE ir_mode *get_modeM() { return mode_M; }
58 INLINE ir_mode *get_modeBB() { return mode_BB; }
63 /* allocate all modes. We need to memset them as tarval_vrfy
64 reads fields before they are initialized: It compares to
65 min/max when tarvals for min/max are allocated! */
66 mode_T = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_T, 0, sizeof(ir_mode));
67 mode_F = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_F, 0, sizeof(ir_mode));
68 mode_D = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_D, 0, sizeof(ir_mode));
69 mode_E = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_E, 0, sizeof(ir_mode));
70 mode_Bs = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Bs, 0, sizeof(ir_mode));
71 mode_Bu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Bu, 0, sizeof(ir_mode));
72 mode_Hs = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Hs, 0, sizeof(ir_mode));
73 mode_Hu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Hu, 0, sizeof(ir_mode));
74 mode_Is = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Is, 0, sizeof(ir_mode));
75 mode_Iu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Iu, 0, sizeof(ir_mode));
76 mode_Ls = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Ls, 0, sizeof(ir_mode));
77 mode_Lu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Lu, 0, sizeof(ir_mode));
78 mode_C = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_C, 0, sizeof(ir_mode));
79 mode_U = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_U, 0, sizeof(ir_mode));
80 mode_b = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_b, 0, sizeof(ir_mode));
81 mode_P = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_P, 0, sizeof(ir_mode));
82 mode_X = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_X, 0, sizeof(ir_mode));
83 mode_M = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_M, 0, sizeof(ir_mode));
84 mode_BB = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_BB, 0, sizeof(ir_mode));
90 mode_Bs->code = irm_Bs;
91 mode_Bu->code = irm_Bu;
92 mode_Hs->code = irm_Hs;
93 mode_Hu->code = irm_Hu;
94 mode_Is->code = irm_Is;
95 mode_Iu->code = irm_Iu;
96 mode_Ls->code = irm_Ls;
97 mode_Lu->code = irm_Lu;
100 mode_b->code = irm_b;
101 mode_P->code = irm_P;
102 mode_X->code = irm_X;
103 mode_M->code = irm_M;
104 mode_BB->code = irm_BB;
106 /* initialize all modes */
108 mode_T->name = id_from_str ("T", 1);
113 mode_F->name = id_from_str ("F", 1);
116 mode_F->ld_align = 4;
120 mode_D->name = id_from_str ("D", 1);
123 mode_D->ld_align = 4;
127 mode_E->name = id_from_str ("E", 1);
130 mode_E->ld_align = 4;
134 mode_Bs->name = id_from_str ("Bs", 1);
135 mode_Bs->fsigned = 1;
137 mode_Bs->ld_align = 1;
139 mode_Bs->min = tarval_from_long (mode_Ls, 0xffffff80);
140 mode_Bs->max = tarval_from_long (mode_Ls, 0x0000007f);
141 mode_Bs->null = tarval_from_long (mode_Bs, 0);
144 mode_Bu->name = id_from_str ("Bu", 1);
145 mode_Bu->fsigned = 0;
147 mode_Bu->ld_align = 1;
149 mode_Bu->min = tarval_from_long (mode_Lu, 0x00000000);
150 mode_Bu->max = tarval_from_long (mode_Lu, 0x000000ff);
151 mode_Bu->null = tarval_from_long (mode_Bu, 0);
153 /* signed short integer */
154 mode_Hs->name = id_from_str ("Hs", 1);
155 mode_Hs->fsigned = 1;
157 mode_Hs->ld_align = 2;
159 mode_Hs->min = tarval_from_long (mode_Ls, 0xffff8000);
160 mode_Hs->max = tarval_from_long (mode_Ls, 0x00007fff);
161 mode_Hs->null = tarval_from_long (mode_Hs, 0);
163 /* unsigned short integer */
164 mode_Hu->name = id_from_str ("Hu", 1);
165 mode_Hu->fsigned = 0;
167 mode_Hu->ld_align = 2;
169 mode_Hu->min = tarval_from_long (mode_Lu, 0x00000000);
170 mode_Hu->max = tarval_from_long (mode_Lu, 0x0000ffff);
171 mode_Hu->null = tarval_from_long (mode_Hu, 0);
174 mode_Is->name = id_from_str ("Is", 1);
175 mode_Is->fsigned = 1;
177 mode_Is->ld_align = 4;
179 mode_Is->min = tarval_from_long (mode_Ls, 0x80000000);
180 mode_Is->max = tarval_from_long (mode_Ls, 0x7fffffff);
181 mode_Is->null = tarval_from_long (mode_Is, 0);
183 /* unsigned integer */
184 mode_Iu->name = id_from_str ("Iu", 1);
185 mode_Iu->fsigned = 0;
187 mode_Iu->ld_align = 4;
189 mode_Iu->min = tarval_from_long (mode_Lu, 0x00000000);
190 mode_Iu->max = tarval_from_long (mode_Lu, 0xffffffff);
191 mode_Iu->null = tarval_from_long (mode_Iu, 0);
193 /* signed long integer */
194 mode_Ls->name = id_from_str ("Ls", 1);
195 mode_Ls->fsigned = 1;
197 mode_Ls->ld_align = 8;
199 mode_Ls->min = tarval_from_long (mode_Ls, 0x80000000);
200 mode_Ls->max = tarval_from_long (mode_Ls, 0x7fffffff);
201 mode_Ls->null = tarval_from_long (mode_Ls, 0);
203 /* unsigned long integer */
204 mode_Lu->name = id_from_str ("Lu", 1);
205 mode_Lu->fsigned = 0;
207 mode_Lu->ld_align = 8;
209 mode_Lu->min = tarval_from_long (mode_Lu, 0x00000000);
210 mode_Lu->max = tarval_from_long (mode_Lu, 0xffffffff);
211 mode_Lu->null = tarval_from_long (mode_Lu, 0);
214 mode_C->name = id_from_str ("C", 1);
217 mode_C->ld_align = 1;
219 mode_C->min = tarval_from_long (mode_Ls, 0xffffff80);
220 mode_C->max = tarval_from_long (mode_Ls, 0x0000007f);
221 mode_C->null = tarval_from_long (mode_C, 0);
223 /* unicode character */
224 mode_C->name = id_from_str ("U", 1);
227 mode_C->ld_align = 1;
229 mode_C->min = tarval_from_long (mode_Ls, 0xffff8000);
230 mode_C->max = tarval_from_long (mode_Ls, 0x00007fff);
231 mode_C->null = tarval_from_long (mode_U, 0);
234 mode_b->name = id_from_str ("b", 1);
239 mode_P->name = id_from_str ("P", 1);
242 mode_P->ld_align = 4;
244 mode_P->min = tarval_from_long (mode_Lu, 0x00000000);
245 mode_P->max = tarval_from_long (mode_Lu, 0xffffffff);
246 mode_P->null = tarval_from_long (mode_P, 0);
249 mode_X->name = id_from_str ("X", 1);
254 mode_M->name = id_from_str ("M", 1);
258 mode_BB->name = id_from_str ("BB", 1);
259 mode_BB->fsigned = 0;
263 /* Functions for the direct access to all attributes od a ir_mode */
266 get_mode_modecode (ir_mode *mode)
273 set_mode_modecode (ir_mode *mode, modecode code)
280 get_mode_ident (ir_mode *mode)
287 set_mode_ident (ir_mode *mode, ident *name)
294 get_mode_name (ir_mode *mode) {
296 return id_to_str(mode->name);
298 /* void set_mode_name (ir_mode *mode, char *name); */
301 get_mode_size (ir_mode *mode)
307 set_mode_size (ir_mode *mode, int size)
314 get_mode_ld_align (ir_mode *mode)
316 return mode->ld_align;
321 set_mode_ld_align (ir_mode *mode, int ld_align)
323 mode->ld_align = ld_align;
328 get_mode_min (ir_mode *mode)
335 set_mode_min (ir_mode *mode, tarval *min)
342 get_mode_max (ir_mode *mode)
349 set_mode_max (ir_mode *mode, tarval *max)
356 get_mode_null (ir_mode *mode)
363 set_mode_null (ir_mode *mode, tarval *null)
370 get_mode_fsigned (ir_mode *mode)
372 return mode->fsigned;
377 set_mode_fsigned (ir_mode *mode, unsigned fsigned)
379 mode->fsigned = fsigned;
384 get_mode_ffloat (ir_mode *mode)
391 set_mode_ffloat (ir_mode *mode, unsigned ffloat)
393 mode->ffloat = ffloat;
397 /* Functions to check, whether a modecode is signed, float, int, num, data,
398 datab or dataM. For more exact definitions read the corresponding pages
399 in the firm documentation or the followingenumeration
401 The set of "float" is defined as:
402 ---------------------------------
403 float = {irm_F, irm_D, irm_E}
405 The set of "int" is defined as:
406 -------------------------------
407 int = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
409 The set of "num" is defined as:
410 -------------------------------
411 num = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
412 irm_Is, irm_Iu, irm_Ls, irm_Lu}
415 The set of "data" is defined as:
416 -------------------------------
417 data = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
418 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_p}
419 = {num || irm_C || irm_P}
421 The set of "datab" is defined as:
422 ---------------------------------
423 datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
424 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_b}
427 The set of "dataM" is defined as:
428 ---------------------------------
429 dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
430 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_M}
435 mode_is_signed (ir_mode *mode)
439 fsigned = get_mode_fsigned (mode);
450 mode_is_float (ir_mode *mode)
454 ffloat = get_mode_ffloat (mode);
466 mode_is_int (ir_mode *mode)
470 code = get_mode_modecode (mode);
471 if ((code >= irm_Bs) && (code <= irm_Lu)) {
482 mode_is_num (ir_mode *mode)
485 if (mode_is_int (mode) || mode_is_float (mode)) {
495 mode_is_data (ir_mode *mode)
499 code = get_mode_modecode (mode);
500 if (mode_is_num (mode) ||
501 code == irm_C || code == irm_U || code == irm_P) {
511 mode_is_datab (ir_mode *mode)
515 code = get_mode_modecode (mode);
516 if (mode_is_data (mode) || code == irm_b ) {
526 mode_is_dataM (ir_mode *mode)
530 code = get_mode_modecode (mode);
531 if (mode_is_data (mode) || code == irm_M) {
540 /* Returns true if sm can be converted to lm without loss. */
542 smaller_mode(ir_mode *sm, ir_mode *lm) {
543 if ((mode_is_int(sm) && mode_is_int(lm)) &&
544 get_mode_modecode(sm) <= get_mode_modecode(lm))
546 if ((mode_is_float(sm) && mode_is_float(lm)) &&
547 get_mode_modecode(sm) <= get_mode_modecode(lm))