1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Martin Trapp, Christian Schaefer
14 # include "irmode_t.h"
41 INLINE ir_mode *get_modeT() { return mode_T; }
42 INLINE ir_mode *get_modef() { return mode_f; }
43 INLINE ir_mode *get_moded() { return mode_d; }
44 INLINE ir_mode *get_modec() { return mode_c; }
45 INLINE ir_mode *get_modeC() { return mode_C; }
46 INLINE ir_mode *get_modeh() { return mode_h; }
47 INLINE ir_mode *get_modeH() { return mode_H; }
48 INLINE ir_mode *get_modei() { return mode_i; }
49 INLINE ir_mode *get_modeI() { return mode_I; }
50 INLINE ir_mode *get_model() { return mode_l; }
51 INLINE ir_mode *get_modeL() { return mode_L; }
52 INLINE ir_mode *get_modeB() { return mode_B; }
53 INLINE ir_mode *get_modep() { return mode_b; }
54 INLINE ir_mode *get_modeb() { return mode_p; }
55 INLINE ir_mode *get_modes() { return mode_s; }
56 INLINE ir_mode *get_modeS() { return mode_S; }
57 INLINE ir_mode *get_modeX() { return mode_X; }
58 INLINE ir_mode *get_modeM() { return mode_M; }
59 INLINE ir_mode *get_modeR() { return mode_R; }
60 INLINE ir_mode *get_modeZ() { return mode_Z; }
65 /* allocate all modes. We need to memset them as tarval_vrfy
66 reads fields before they are initialized: It compares to
67 min/max when tarvals for min/max are allocated! */
68 mode_T = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_T, 0, sizeof(ir_mode));
69 mode_f = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_f, 0, sizeof(ir_mode));
70 mode_d = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_d, 0, sizeof(ir_mode));
71 mode_c = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_c, 0, sizeof(ir_mode));
72 mode_C = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_C, 0, sizeof(ir_mode));
73 mode_h = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_h, 0, sizeof(ir_mode));
74 mode_H = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_H, 0, sizeof(ir_mode));
75 mode_i = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_i, 0, sizeof(ir_mode));
76 mode_I = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_I, 0, sizeof(ir_mode));
77 mode_l = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_l, 0, sizeof(ir_mode));
78 mode_L = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_L, 0, sizeof(ir_mode));
79 mode_B = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_B, 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_s = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_s, 0, sizeof(ir_mode));
83 mode_S = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_S, 0, sizeof(ir_mode));
84 mode_X = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_X, 0, sizeof(ir_mode));
85 mode_M = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_M, 0, sizeof(ir_mode));
86 mode_R = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_R, 0, sizeof(ir_mode));
87 mode_Z = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Z, 0, sizeof(ir_mode));
100 mode_B->code = irm_B;
101 mode_b->code = irm_b;
102 mode_p->code = irm_p;
103 mode_s->code = irm_s;
104 mode_S->code = irm_S;
105 mode_X->code = irm_X;
106 mode_M->code = irm_M;
107 mode_R->code = irm_R;
108 mode_Z->code = irm_Z;
110 /* initialize all modes */
112 mode_T->name = id_from_str ("T", 1);
117 mode_f->name = id_from_str ("f", 1);
120 mode_f->ld_align = 4;
124 mode_d->name = id_from_str ("d", 1);
127 mode_d->ld_align = 4;
131 mode_c->name = id_from_str ("c", 1);
134 mode_c->ld_align = 1;
136 mode_c->min = tarval_from_long (mode_l, 0xffffff80);
137 mode_c->max = tarval_from_long (mode_l, 0x0000007f);
138 mode_c->null = tarval_from_long (mode_c, 0);
141 mode_C->name = id_from_str ("C", 1);
144 mode_C->ld_align = 1;
146 mode_C->min = tarval_from_long (mode_L, 0x00000000);
147 mode_C->max = tarval_from_long (mode_L, 0x000000ff);
148 mode_C->null = tarval_from_long (mode_C, 0);
150 /* signed short integer */
151 mode_h->name = id_from_str ("h", 1);
154 mode_h->ld_align = 2;
156 mode_h->min = tarval_from_long (mode_l, 0xffff8000);
157 mode_h->max = tarval_from_long (mode_l, 0x00007fff);
158 mode_h->null = tarval_from_long (mode_h, 0);
160 /* unsigened short integer */
161 mode_H->name = id_from_str ("H", 1);
164 mode_H->ld_align = 2;
166 mode_H->min = tarval_from_long (mode_L, 0x00000000);
167 mode_H->max = tarval_from_long (mode_L, 0x0000ffff);
168 mode_H->null = tarval_from_long (mode_H, 0);
171 mode_i->name = id_from_str ("i", 1);
174 mode_i->ld_align = 4;
176 mode_i->min = tarval_from_long (mode_l, 0x80000000);
177 mode_i->max = tarval_from_long (mode_l, 0x7fffffff);
178 mode_i->null = tarval_from_long (mode_i, 0);
180 /* unsigned integer */
181 mode_I->name = id_from_str ("I", 1);
184 mode_I->ld_align = 4;
186 mode_I->min = tarval_from_long (mode_L, 0x00000000);
187 mode_I->max = tarval_from_long (mode_L, 0xffffffff);
188 mode_I->null = tarval_from_long (mode_I, 0);
190 /* signed long integer */
191 mode_l->name = id_from_str ("l", 1);
194 mode_l->ld_align = 4;
196 mode_l->min = tarval_from_long (mode_l, 0x80000000);
197 mode_l->max = tarval_from_long (mode_l, 0x7fffffff);
198 mode_I->null = tarval_from_long (mode_l, 0);
200 /* unsigned long integer */
201 mode_L->name = id_from_str ("L", 1);
204 mode_L->ld_align = 4;
206 mode_L->min = tarval_from_long (mode_L, 0x00000000);
207 mode_L->max = tarval_from_long (mode_L, 0xffffffff);
208 mode_L->null = tarval_from_long (mode_L, 0);
211 mode_B->name = id_from_str ("B", 1);
216 mode_b->name = id_from_str ("b", 1);
221 mode_p->name = id_from_str ("p", 1);
224 mode_p->ld_align = 4;
226 mode_p->min = tarval_from_long (mode_L, 0x00000000);
227 mode_p->max = tarval_from_long (mode_L, 0xffffffff);
228 mode_p->null = tarval_from_long (mode_p, 0);
230 mode_s->name = id_from_str ("s", 1);
234 mode_S->name = id_from_str ("S", 1);
239 mode_X->name = id_from_str ("X", 1);
244 mode_M->name = id_from_str ("M", 1);
248 mode_R->name = id_from_str ("R", 1);
252 mode_Z->name = id_from_str ("Z", 1);
257 /* Functions for the direct access to all attributes od a ir_mode */
260 get_mode_modecode (ir_mode *mode)
267 set_mode_modecode (ir_mode *mode, modecode code)
274 get_mode_ident (ir_mode *mode)
281 set_mode_ident (ir_mode *mode, ident *name)
288 get_mode_name (ir_mode *mode) {
290 return id_to_str(mode->name);
292 /* void set_mode_name (ir_mode *mode, char *name); */
295 get_mode_size (ir_mode *mode)
301 set_mode_size (ir_mode *mode, int size)
308 get_mode_ld_align (ir_mode *mode)
310 return mode->ld_align;
315 set_mode_ld_align (ir_mode *mode, int ld_align)
317 mode->ld_align = ld_align;
322 get_mode_min (ir_mode *mode)
329 set_mode_min (ir_mode *mode, tarval *min)
336 get_mode_max (ir_mode *mode)
343 set_mode_max (ir_mode *mode, tarval *max)
350 get_mode_null (ir_mode *mode)
357 set_mode_null (ir_mode *mode, tarval *null)
364 get_mode_fsigned (ir_mode *mode)
366 return mode->fsigned;
371 set_mode_fsigned (ir_mode *mode, unsigned fsigned)
373 mode->fsigned = fsigned;
378 get_mode_ffloat (ir_mode *mode)
385 set_mode_ffloat (ir_mode *mode, unsigned ffloat)
387 mode->ffloat = ffloat;
391 /* Functions to check, whether a modecode is signed, float, int, num, data,
392 datab or dataM. For more exact definitions read the corresponding pages
393 in the firm documentation or the followingenumeration
395 The set of "float" is defined as:
396 ---------------------------------
397 float = {irm_f, irm_d}
399 The set of "int" is defined as:
400 -------------------------------
401 int = {irm_c, irm_C, irm_h, irm_H, irm_i, irm_I, irm_l, irm_L}
403 The set of "num" is defined as:
404 -------------------------------
405 num = {irm_f, irm_d, irm_c, irm_C, irm_h, irm_H,
406 irm_i, irm_I, irm_l, irm_L}
409 The set of "data" is defined as:
410 -------------------------------
411 data = {irm_f, irm_d, irm_c, irm_C, irm_h, irm_H,
412 irm_i, irm_I, irm_l, irm_L, irm_p}
415 The set of "datab" is defined as:
416 ---------------------------------
417 datab = {irm_f, irm_d, irm_c, irm_C, irm_h, irm_H,
418 irm_i, irm_I, irm_l, irm_L, irm_p, irm_b, irm_B}
419 = {data || irm_b || irm_B}
421 The set of "dataM" is defined as:
422 ---------------------------------
423 dataM = {irm_f, irm_d, irm_c, irm_C, irm_h, irm_H, irm_i,
424 irm_I, irm_l, irm_L, irm_p, irm_M}
429 mode_is_signed (ir_mode *mode)
433 fsigned = get_mode_fsigned (mode);
444 mode_is_float (ir_mode *mode)
448 ffloat = get_mode_ffloat (mode);
460 mode_is_int (ir_mode *mode)
464 code = get_mode_modecode (mode);
465 if ((code >= irm_c) && (code <= irm_L)) {
476 mode_is_num (ir_mode *mode)
479 if (mode_is_int (mode) || mode_is_float (mode)) {
489 mode_is_data (ir_mode *mode)
493 code = get_mode_modecode (mode);
494 if (mode_is_num (mode) || code == irm_p) {
504 mode_is_datab (ir_mode *mode)
508 code = get_mode_modecode (mode);
509 if (mode_is_data (mode) || code == irm_b || code == irm_B) {
519 mode_is_dataM (ir_mode *mode)
523 code = get_mode_modecode (mode);
524 if (mode_is_data (mode) || code == irm_M) {
533 /* Returns true if sm can be converted to lm without loss. */
535 smaller_mode(ir_mode *sm, ir_mode *lm) {
536 if ((mode_is_int(sm) && mode_is_int(lm)) &&
537 get_mode_modecode(sm) <= get_mode_modecode(lm))
539 if ((mode_is_float(sm) && mode_is_float(lm)) &&
540 get_mode_modecode(sm) <= get_mode_modecode(lm))