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)
268 assert(mode && "no mode given");
274 set_mode_modecode (ir_mode *mode, modecode code)
281 get_mode_ident (ir_mode *mode)
283 assert(mode && "no mode given");
289 set_mode_ident (ir_mode *mode, ident *name)
296 get_mode_name (ir_mode *mode) {
298 return id_to_str(mode->name);
300 /* void set_mode_name (ir_mode *mode, char *name); */
303 get_mode_size (ir_mode *mode)
305 assert(mode && "no mode given");
310 set_mode_size (ir_mode *mode, int size)
317 get_mode_ld_align (ir_mode *mode)
319 assert(mode && "no mode given");
320 return mode->ld_align;
325 set_mode_ld_align (ir_mode *mode, int ld_align)
327 mode->ld_align = ld_align;
332 get_mode_min (ir_mode *mode)
334 assert(mode && "no mode given");
340 set_mode_min (ir_mode *mode, tarval *min)
347 get_mode_max (ir_mode *mode)
349 assert(mode && "no mode given");
355 set_mode_max (ir_mode *mode, tarval *max)
362 get_mode_null (ir_mode *mode)
364 assert(mode && "no mode given");
370 set_mode_null (ir_mode *mode, tarval *null)
377 get_mode_fsigned (ir_mode *mode)
379 assert(mode && "no mode given");
380 return mode->fsigned;
385 set_mode_fsigned (ir_mode *mode, unsigned fsigned)
387 mode->fsigned = fsigned;
392 get_mode_ffloat (ir_mode *mode)
394 assert(mode && "no mode given");
400 set_mode_ffloat (ir_mode *mode, unsigned ffloat)
402 mode->ffloat = ffloat;
406 /* Functions to check, whether a modecode is signed, float, int, num, data,
407 datab or dataM. For more exact definitions read the corresponding pages
408 in the firm documentation or the followingenumeration
410 The set of "float" is defined as:
411 ---------------------------------
412 float = {irm_F, irm_D, irm_E}
414 The set of "int" is defined as:
415 -------------------------------
416 int = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
418 The set of "num" is defined as:
419 -------------------------------
420 num = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
421 irm_Is, irm_Iu, irm_Ls, irm_Lu}
424 The set of "data" is defined as:
425 -------------------------------
426 data = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
427 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_p}
428 = {num || irm_C || irm_P}
430 The set of "datab" is defined as:
431 ---------------------------------
432 datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
433 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_b}
436 The set of "dataM" is defined as:
437 ---------------------------------
438 dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
439 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_M}
444 mode_is_signed (ir_mode *mode)
449 assert(mode && "no mode given");
450 fsigned = get_mode_fsigned (mode);
461 mode_is_float (ir_mode *mode)
466 assert(mode && "no mode given");
467 ffloat = get_mode_ffloat (mode);
479 mode_is_int (ir_mode *mode)
484 assert(mode && "no mode given");
485 code = get_mode_modecode (mode);
486 if ((code >= irm_Bs) && (code <= irm_Lu)) {
497 mode_is_num (ir_mode *mode)
501 assert(mode && "no mode given");
502 if (mode_is_int (mode) || mode_is_float (mode)) {
512 mode_is_data (ir_mode *mode)
517 assert(mode && "no mode given");
518 code = get_mode_modecode (mode);
519 if (mode_is_num (mode) ||
520 code == irm_C || code == irm_U || code == irm_P) {
530 mode_is_datab (ir_mode *mode)
535 assert(mode && "no mode given");
536 code = get_mode_modecode (mode);
537 if (mode_is_data (mode) || code == irm_b ) {
547 mode_is_dataM (ir_mode *mode)
552 assert(mode && "no mode given");
553 code = get_mode_modecode (mode);
554 if (mode_is_data (mode) || code == irm_M) {
563 /* Returns true if sm can be converted to lm without loss. */
565 smaller_mode(ir_mode *sm, ir_mode *lm) {
566 if ((mode_is_int(sm) && mode_is_int(lm)) &&
567 get_mode_modecode(sm) <= get_mode_modecode(lm))
569 if ((mode_is_float(sm) && mode_is_float(lm)) &&
570 get_mode_modecode(sm) <= get_mode_modecode(lm))